Files
zoitechat/src/fe-gtk/urlgrab.c
deepend f6b78bd167 Standardized GTK menu-icon fallback mapping so stock names for Save As, Previous, and Next now resolve through the bundled zc-menu-* icon family (and map back correctly on GTK2), ensuring these menu actions use the same icon set path as the rest of your menu icons.
Updated search controls in the main UI to use zc-menu-previous / zc-menu-next and to load through gtkutil_image_new_from_stock(...), so those menu-sized icons are rendered from the same data/icons/menu resources instead of theme-dependent icon names.

    Updated URL Grabber and Raw Log “Save As” icon constants to use zc-menu-save-as for consistency with the menu icon set.

    Added new menu SVGs (save-as, previous, next) in both light and dark variants, and registered all of them in the GResource manifest so they’re available cross-platform from the bundled resource system.
2026-02-18 00:32:42 -07:00

249 lines
6.2 KiB
C

/* X-Chat
* Copyright (C) 1998 Peter Zelezny.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "fe-gtk.h"
#include "../common/zoitechat.h"
#include "../common/zoitechatc.h"
#include "../common/cfgfiles.h"
#include "../common/fe.h"
#include "../common/url.h"
#include "../common/tree.h"
#include "gtkutil.h"
#include "menu.h"
#include "maingui.h"
#include "urlgrab.h"
#if HAVE_GTK3
#define ICON_URLGRAB_CLEAR "zc-menu-clear"
#define ICON_URLGRAB_COPY "zc-menu-copy"
#define ICON_URLGRAB_SAVE_AS "zc-menu-save-as"
#endif
#if !HAVE_GTK3
#define ICON_URLGRAB_CLEAR GTK_STOCK_CLEAR
#define ICON_URLGRAB_COPY GTK_STOCK_COPY
#define ICON_URLGRAB_SAVE_AS GTK_STOCK_SAVE_AS
#endif
/* model for the URL treeview */
enum
{
URL_COLUMN,
N_COLUMNS
};
static GtkWidget *urlgrabberwindow = 0;
static gboolean
url_treeview_url_clicked_cb (GtkWidget *view, GdkEventButton *event,
gpointer data)
{
GtkTreeIter iter;
gchar *url;
GtkTreeSelection *sel;
GtkTreePath *path;
GtkTreeView *tree = GTK_TREE_VIEW (view);
if (!event || !gtk_tree_view_get_path_at_pos (tree, event->x, event->y, &path, 0, 0, 0))
return FALSE;
/* select what they right-clicked on */
sel = gtk_tree_view_get_selection (tree);
gtk_tree_selection_unselect_all (sel);
gtk_tree_selection_select_path (sel, path);
gtk_tree_path_free (path);
if (!gtkutil_treeview_get_selected (GTK_TREE_VIEW (view), &iter,
URL_COLUMN, &url, -1))
return FALSE;
switch (event->button)
{
case 1:
if (event->type == GDK_2BUTTON_PRESS)
fe_open_url (url);
break;
case 3:
menu_urlmenu (event, url);
break;
default:
break;
}
g_free (url);
return FALSE;
}
static GtkWidget *
url_treeview_new (GtkWidget *box)
{
GtkListStore *store;
GtkWidget *scroll, *view;
store = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING);
g_return_val_if_fail (store != NULL, NULL);
view = gtkutil_treeview_new (box, GTK_TREE_MODEL (store), NULL,
URL_COLUMN, _("URL"), -1);
scroll = gtk_widget_get_parent (view);
gtk_widget_set_hexpand (scroll, TRUE);
gtk_widget_set_vexpand (scroll, TRUE);
g_signal_connect (G_OBJECT (view), "button_press_event",
G_CALLBACK (url_treeview_url_clicked_cb), NULL);
/* don't want column headers */
gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (view), FALSE);
gtk_widget_show (view);
return view;
}
static void
url_closegui (GtkWidget *wid, gpointer userdata)
{
urlgrabberwindow = 0;
}
static void
url_button_clear (void)
{
GtkListStore *store;
url_clear ();
store = GTK_LIST_STORE (g_object_get_data (G_OBJECT (urlgrabberwindow),
"model"));
gtk_list_store_clear (store);
}
static void
url_button_copy (GtkWidget *widget, gpointer data)
{
GtkTreeView *view = GTK_TREE_VIEW (data);
GtkTreeIter iter;
gchar *url = NULL;
if (gtkutil_treeview_get_selected (view, &iter, URL_COLUMN, &url, -1))
{
gtkutil_copy_to_clipboard (GTK_WIDGET (view), NULL, url);
g_free (url);
}
}
static void
url_save_callback (void *arg1, char *file)
{
if (file)
{
url_save_tree (file, "w", TRUE);
}
}
static void
url_button_save (void)
{
gtkutil_file_req (NULL, _("Select an output filename"),
url_save_callback, NULL, NULL, NULL, FRF_WRITE);
}
void
fe_url_add (const char *urltext)
{
GtkListStore *store;
GtkTreeIter iter;
gboolean valid;
if (urlgrabberwindow)
{
store = GTK_LIST_STORE (g_object_get_data (G_OBJECT (urlgrabberwindow),
"model"));
gtk_list_store_prepend (store, &iter);
gtk_list_store_set (store, &iter,
URL_COLUMN, urltext,
-1);
/* remove any overflow */
if (prefs.hex_url_grabber_limit > 0)
{
valid = gtk_tree_model_iter_nth_child (
GTK_TREE_MODEL (store), &iter, NULL, prefs.hex_url_grabber_limit);
while (valid)
valid = gtk_list_store_remove (store, &iter);
}
}
}
static int
populate_cb (char *urltext, gpointer userdata)
{
fe_url_add (urltext);
return TRUE;
}
void
url_opengui ()
{
GtkWidget *vbox, *hbox, *view;
char buf[128];
if (urlgrabberwindow)
{
mg_bring_tofront (urlgrabberwindow);
return;
}
g_snprintf(buf, sizeof(buf), _("URL Grabber - %s"), _(DISPLAY_NAME));
urlgrabberwindow =
mg_create_generic_tab ("UrlGrabber", buf, FALSE, TRUE, url_closegui, NULL,
400, 256, &vbox, 0);
gtkutil_destroy_on_esc (urlgrabberwindow);
view = url_treeview_new (vbox);
g_object_set_data (G_OBJECT (urlgrabberwindow), "model",
gtk_tree_view_get_model (GTK_TREE_VIEW (view)));
#if HAVE_GTK3
hbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
gtk_button_box_set_layout (GTK_BUTTON_BOX (hbox), GTK_BUTTONBOX_SPREAD);
#elif !HAVE_GTK3
hbox = gtk_hbutton_box_new ();
gtk_button_box_set_layout (GTK_BUTTON_BOX (hbox), GTK_BUTTONBOX_SPREAD);
#endif
gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
gtk_box_pack_end (GTK_BOX (vbox), hbox, 0, 0, 0);
gtk_widget_show (hbox);
gtkutil_button (hbox, ICON_URLGRAB_CLEAR,
_("Clear list"), url_button_clear, 0, _("Clear"));
gtkutil_button (hbox, ICON_URLGRAB_COPY,
_("Copy selected URL"), url_button_copy, view, _("Copy"));
gtkutil_button (hbox, ICON_URLGRAB_SAVE_AS,
_("Save list to a file"), url_button_save, 0, _("Save As..."));
gtk_widget_show (urlgrabberwindow);
if (prefs.hex_url_grabber)
tree_foreach (url_tree, (tree_traverse_func *)populate_cb, NULL);
else
{
gtk_list_store_clear (GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (view))));
fe_url_add ("URL Grabber is disabled.");
}
}