From fcf00ebd8fc1c78a09fe53ac31ebe80b16d6903a Mon Sep 17 00:00:00 2001 From: deepend Date: Wed, 18 Feb 2026 00:16:04 -0700 Subject: [PATCH] Updated menu-item icon resolution in menu_quick_item() to always go through gtkutil_image_new_from_stock(..., GTK_ICON_SIZE_MENU) when not loading from a file path, so icon-bearing menu items consistently use the same icon pipeline. Standardized the main menu icon identifiers to the zc-menu-* set (the icon set backed by data/icons/menu) across builds, instead of splitting between custom IDs and GTK stock IDs. Updated create_icon_menu() to use the same stock-to-image helper for stock-backed menu entries, so all menu icons follow the same resolution logic. Added a non-GTK3 compatibility mapper that converts zc-menu-* icon IDs to GTK stock names before calling gtk_image_new_from_stock, keeping behavior consistent on older GTK platforms while still using the unified zc-menu-* identifiers in menu definitions. --- src/fe-gtk/gtkutil.c | 50 +++++++++++++++++++++++++++++++++++++++++ src/fe-gtk/menu.c | 53 +++++--------------------------------------- 2 files changed, 56 insertions(+), 47 deletions(-) diff --git a/src/fe-gtk/gtkutil.c b/src/fe-gtk/gtkutil.c index 7794b050..1a005c66 100644 --- a/src/fe-gtk/gtkutil.c +++ b/src/fe-gtk/gtkutil.c @@ -109,6 +109,54 @@ gtkutil_menu_custom_icon_from_stock (const char *stock_name) } #endif +#if !HAVE_GTK3 +static const char * +gtkutil_stock_from_menu_custom_icon (const char *custom_icon) +{ + static const struct + { + const char *custom_icon; + const char *stock; + } icon_map[] = { + { "zc-menu-new", GTK_STOCK_NEW }, + { "zc-menu-network-list", GTK_STOCK_INDEX }, + { "zc-menu-load-plugin", GTK_STOCK_REVERT_TO_SAVED }, + { "zc-menu-detach", GTK_STOCK_REDO }, + { "zc-menu-close", GTK_STOCK_CLOSE }, + { "zc-menu-quit", GTK_STOCK_QUIT }, + { "zc-menu-disconnect", GTK_STOCK_DISCONNECT }, + { "zc-menu-connect", GTK_STOCK_CONNECT }, + { "zc-menu-join", GTK_STOCK_JUMP_TO }, + { "zc-menu-chanlist", GTK_STOCK_INDEX }, + { "zc-menu-preferences", GTK_STOCK_PREFERENCES }, + { "zc-menu-clear", GTK_STOCK_CLEAR }, + { "zc-menu-copy", GTK_STOCK_COPY }, + { "zc-menu-delete", GTK_STOCK_DELETE }, + { "zc-menu-add", GTK_STOCK_ADD }, + { "zc-menu-remove", GTK_STOCK_REMOVE }, + { "zc-menu-spell-check", GTK_STOCK_SPELL_CHECK }, + { "zc-menu-save", GTK_STOCK_SAVE }, + { "zc-menu-refresh", GTK_STOCK_REFRESH }, + { "zc-menu-search", GTK_STOCK_JUSTIFY_LEFT }, + { "zc-menu-find", GTK_STOCK_FIND }, + { "zc-menu-help", GTK_STOCK_HELP }, + { "zc-menu-about", GTK_STOCK_ABOUT }, + }; + size_t i; + + if (!custom_icon) + return NULL; + + for (i = 0; i < G_N_ELEMENTS (icon_map); i++) + { + if (strcmp (custom_icon, icon_map[i].custom_icon) == 0) + return icon_map[i].stock; + } + + return custom_icon; +} +#endif + #if HAVE_GTK3 const char * gtkutil_icon_name_from_stock (const char *stock_name) @@ -263,6 +311,8 @@ gtkutil_image_new_from_stock (const char *stock, GtkIconSize size) return gtk_image_new_from_icon_name (icon_name, size); #elif !HAVE_GTK3 + if (stock && g_str_has_prefix (stock, "zc-menu-")) + stock = gtkutil_stock_from_menu_custom_icon (stock); return gtk_image_new_from_stock (stock, size); #endif } diff --git a/src/fe-gtk/menu.c b/src/fe-gtk/menu.c index 8882e553..d2e7cc08 100644 --- a/src/fe-gtk/menu.c +++ b/src/fe-gtk/menu.c @@ -304,14 +304,7 @@ menu_quick_item (char *cmd, char *label, GtkWidget * menu, int flags, if (access (path, R_OK) == 0) img = gtk_image_new_from_file (path); else - { -#if HAVE_GTK3 img = gtkutil_image_new_from_stock (icon, GTK_ICON_SIZE_MENU); -#endif -#if !HAVE_GTK3 - img = gtk_image_new_from_stock (icon, GTK_ICON_SIZE_MENU); -#endif - } g_free (path); } @@ -1957,7 +1950,6 @@ menu_about (GtkWidget *wid, gpointer sess) gtk_widget_show_all (GTK_WIDGET(dialog)); } -#if HAVE_GTK3 #define ICON_NEW "zc-menu-new" #define ICON_NETWORK_LIST "zc-menu-network-list" #define ICON_LOAD_PLUGIN "zc-menu-load-plugin" @@ -1975,26 +1967,6 @@ menu_about (GtkWidget *wid, gpointer sess) #define ICON_FIND "zc-menu-find" #define ICON_HELP "zc-menu-help" #define ICON_ABOUT "zc-menu-about" -#endif -#if !HAVE_GTK3 -#define ICON_NEW GTK_STOCK_NEW -#define ICON_NETWORK_LIST GTK_STOCK_INDEX -#define ICON_LOAD_PLUGIN GTK_STOCK_REVERT_TO_SAVED -#define ICON_DETACH GTK_STOCK_REDO -#define ICON_CLOSE GTK_STOCK_CLOSE -#define ICON_QUIT GTK_STOCK_QUIT -#define ICON_DISCONNECT GTK_STOCK_DISCONNECT -#define ICON_CONNECT GTK_STOCK_CONNECT -#define ICON_JOIN GTK_STOCK_JUMP_TO -#define ICON_CHANLIST GTK_STOCK_INDEX -#define ICON_PREFERENCES GTK_STOCK_PREFERENCES -#define ICON_CLEAR GTK_STOCK_CLEAR -#define ICON_SAVE GTK_STOCK_SAVE -#define ICON_SEARCH GTK_STOCK_JUSTIFY_LEFT -#define ICON_FIND GTK_STOCK_FIND -#define ICON_HELP GTK_STOCK_HELP -#define ICON_ABOUT GTK_STOCK_ABOUT -#endif static struct mymenu mymenu[] = { {N_("_ZoiteChat"), 0, 0, M_NEWMENU, MENU_ID_ZOITECHAT, 0, 1}, @@ -2119,43 +2091,30 @@ GtkWidget * create_icon_menu (char *labeltext, void *stock_name, int is_stock) { GtkWidget *item; + GtkWidget *img = NULL; #if HAVE_GTK3 GtkWidget *box; GtkWidget *label_widget; - GtkWidget *image = NULL; -#endif -#if !HAVE_GTK3 - GtkWidget *img; #endif if (is_stock) { -#if HAVE_GTK3 - image = gtkutil_image_new_from_stock (stock_name, GTK_ICON_SIZE_MENU); -#endif -#if !HAVE_GTK3 - img = gtk_image_new_from_stock (stock_name, GTK_ICON_SIZE_MENU); -#endif + img = gtkutil_image_new_from_stock (stock_name, GTK_ICON_SIZE_MENU); } else { -#if HAVE_GTK3 - image = gtk_image_new_from_pixbuf (*((GdkPixbuf **)stock_name)); -#endif -#if !HAVE_GTK3 img = gtk_image_new_from_pixbuf (*((GdkPixbuf **)stock_name)); -#endif } #if HAVE_GTK3 item = gtk_menu_item_new (); box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); label_widget = gtk_label_new_with_mnemonic (labeltext); - if (image) - gtk_box_pack_start (GTK_BOX (box), image, FALSE, FALSE, 0); + if (img) + gtk_box_pack_start (GTK_BOX (box), img, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (box), label_widget, FALSE, FALSE, 0); gtk_container_add (GTK_CONTAINER (item), box); - if (image) - gtk_widget_show (image); + if (img) + gtk_widget_show (img); gtk_widget_show (label_widget); gtk_widget_show (box); #else