Updated create_icon_menu to build GTK3 icon menu items by packing an image and mnemonic label into a box while keeping GTK2 GtkImageMenuItem handling intact.

Expanded channel list icon menu items to handle GTK3 box-based layout and GTK2 image menu items in one helper, and used that helper for the context menu entries.
Unified sexy spell entry icon menu item creation across GTK versions, using stock IDs for both and centralizing the GTK3 box-based layout with GTK2 image menu items preserved.
This commit is contained in:
2026-01-23 13:58:53 -07:00
parent 905cc2f22e
commit 853c16a9bc
3 changed files with 37 additions and 84 deletions

View File

@@ -107,7 +107,6 @@ chanlist_box_new (void)
#endif
}
#if HAVE_GTK3
static GtkWidget *
chanlist_icon_button (const char *label, const char *icon_name,
GCallback callback, gpointer userdata)
@@ -130,6 +129,7 @@ chanlist_icon_menu_item (const char *label, const char *icon_name,
GCallback callback, gpointer userdata)
{
GtkWidget *item;
#if HAVE_GTK3
GtkWidget *box;
GtkWidget *image;
GtkWidget *label_widget;
@@ -141,12 +141,19 @@ chanlist_icon_menu_item (const char *label, const char *icon_name,
gtk_box_pack_start (GTK_BOX (box), image, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (box), label_widget, FALSE, FALSE, 0);
gtk_container_add (GTK_CONTAINER (item), box);
#endif
#if !HAVE_GTK3
GtkWidget *image;
item = gtk_image_menu_item_new_with_mnemonic (label);
image = gtk_image_new_from_stock (icon_name, GTK_ICON_SIZE_MENU);
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
#endif
g_signal_connect (G_OBJECT (item), "activate", callback, userdata);
gtk_widget_show_all (item);
return item;
}
#endif
static gboolean
@@ -701,7 +708,6 @@ chanlist_button_cb (GtkTreeView *tree, GdkEventButton *event, server *serv)
g_object_unref (menu);
g_signal_connect (G_OBJECT (menu), "selection-done",
G_CALLBACK (chanlist_menu_destroy), NULL);
#if HAVE_GTK3
{
GtkWidget *item;
@@ -717,15 +723,6 @@ chanlist_button_cb (GtkTreeView *tree, GdkEventButton *event, server *serv)
G_CALLBACK (chanlist_copytopic), serv);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
}
#endif
#if !HAVE_GTK3
mg_create_icon_item (_("_Join Channel"), ICON_CHANLIST_JOIN, menu,
chanlist_join, serv);
mg_create_icon_item (_("_Copy Channel Name"), ICON_CHANLIST_COPY, menu,
chanlist_copychannel, serv);
mg_create_icon_item (_("Copy _Topic Text"), ICON_CHANLIST_COPY, menu,
chanlist_copytopic, serv);
#endif
chan = chanlist_get_selected (serv, FALSE);
menu_addfavoritemenu (serv, menu, chan, FALSE);

View File

@@ -353,27 +353,6 @@ menu_quick_item (char *cmd, char *label, GtkWidget * menu, int flags,
return item;
}
#if HAVE_GTK3
static GtkWidget *
menu_icon_name_item_new (const char *label, const char *icon_name)
{
GtkWidget *item;
GtkWidget *box;
GtkWidget *image;
GtkWidget *label_widget;
item = gtk_menu_item_new ();
box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
image = gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_MENU);
label_widget = gtk_label_new_with_mnemonic (label);
gtk_box_pack_start (GTK_BOX (box), image, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (box), label_widget, FALSE, FALSE, 0);
gtk_container_add (GTK_CONTAINER (item), box);
return item;
}
#endif
static void
menu_quick_item_with_callback (void *callback, char *label, GtkWidget * menu,
void *arg)
@@ -2026,13 +2005,17 @@ GtkWidget *
create_icon_menu (char *labeltext, void *stock_name, int is_stock)
{
GtkWidget *item, *img;
#if HAVE_GTK3
GtkWidget *box;
GtkWidget *label_widget;
const char *icon_name;
#endif
if (is_stock)
{
#if HAVE_GTK3
const char *icon_name = gtkutil_icon_name_from_stock (stock_name);
item = menu_icon_name_item_new (labeltext, icon_name);
icon_name = gtkutil_icon_name_from_stock (stock_name);
img = gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_MENU);
#endif
#if !HAVE_GTK3
img = gtk_image_new_from_stock (stock_name, GTK_ICON_SIZE_MENU);
@@ -2041,16 +2024,13 @@ create_icon_menu (char *labeltext, void *stock_name, int is_stock)
else
img = gtk_image_new_from_pixbuf (*((GdkPixbuf **)stock_name));
#if HAVE_GTK3
if (!is_stock)
{
GtkWidget *box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
GtkWidget *label_widget = gtk_label_new_with_mnemonic (labeltext);
item = gtk_menu_item_new ();
item = gtk_menu_item_new ();
box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
label_widget = gtk_label_new_with_mnemonic (labeltext);
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);
}
gtk_box_pack_start (GTK_BOX (box), label_widget, FALSE, FALSE, 0);
gtk_container_add (GTK_CONTAINER (item), box);
#endif
#if !HAVE_GTK3
item = gtk_image_menu_item_new_with_mnemonic (labeltext);

View File

@@ -629,15 +629,17 @@ build_suggestion_menu(SexySpellEntry *entry, GtkWidget *menu, struct EnchantDict
enchant_dict_free_suggestions(dict, suggestions);
}
#if HAVE_GTK3
static GtkWidget *
sexy_spell_entry_icon_menu_item (const char *label, const char *icon_name)
sexy_spell_entry_icon_menu_item (const char *label, const char *stock_name)
{
GtkWidget *item;
#if HAVE_GTK3
GtkWidget *box;
GtkWidget *image;
GtkWidget *label_widget;
const char *icon_name;
icon_name = gtkutil_icon_name_from_stock (stock_name);
item = gtk_menu_item_new ();
box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
image = gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_MENU);
@@ -645,10 +647,17 @@ sexy_spell_entry_icon_menu_item (const char *label, const char *icon_name)
gtk_box_pack_start (GTK_BOX (box), image, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (box), label_widget, FALSE, FALSE, 0);
gtk_container_add (GTK_CONTAINER (item), box);
#endif
#if !HAVE_GTK3
GtkWidget *image;
item = gtk_image_menu_item_new_with_label (label);
image = gtk_image_new_from_stock (stock_name, GTK_ICON_SIZE_MENU);
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
#endif
return item;
}
#endif
static GtkWidget *
build_spelling_menu(SexySpellEntry *entry, const gchar *word)
@@ -704,17 +713,7 @@ build_spelling_menu(SexySpellEntry *entry, const gchar *word)
/* + Add to Dictionary */
label = g_strdup_printf(_("Add \"%s\" to Dictionary"), word);
#if HAVE_GTK3
{
const char *icon_name = gtkutil_icon_name_from_stock (GTK_STOCK_ADD);
mi = sexy_spell_entry_icon_menu_item (label, icon_name);
}
#endif
#if !HAVE_GTK3
mi = gtk_image_menu_item_new_with_label(label);
gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi), gtk_image_new_from_stock(GTK_STOCK_ADD, GTK_ICON_SIZE_MENU));
#endif
mi = sexy_spell_entry_icon_menu_item (label, GTK_STOCK_ADD);
g_free(label);
if (g_slist_length(entry->priv->dict_list) == 1) {
@@ -756,17 +755,7 @@ build_spelling_menu(SexySpellEntry *entry, const gchar *word)
gtk_menu_shell_append(GTK_MENU_SHELL(topmenu), mi);
/* - Ignore All */
#if HAVE_GTK3
{
const char *icon_name = gtkutil_icon_name_from_stock (GTK_STOCK_REMOVE);
mi = sexy_spell_entry_icon_menu_item (_("Ignore All"), icon_name);
}
#endif
#if !HAVE_GTK3
mi = gtk_image_menu_item_new_with_label(_("Ignore All"));
gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi), gtk_image_new_from_stock(GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU));
#endif
mi = sexy_spell_entry_icon_menu_item (_("Ignore All"), GTK_STOCK_REMOVE);
g_signal_connect(G_OBJECT(mi), "activate", G_CALLBACK(ignore_all), entry);
gtk_widget_show_all(mi);
gtk_menu_shell_append(GTK_MENU_SHELL(topmenu), mi);
@@ -799,20 +788,7 @@ sexy_spell_entry_populate_popup(SexySpellEntry *entry, GtkMenu *menu, gpointer d
gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), mi);
/* Above the separator, show the suggestions menu */
#if HAVE_GTK3
{
const char *icon_name = gtkutil_icon_name_from_stock (GTK_STOCK_SPELL_CHECK);
mi = sexy_spell_entry_icon_menu_item (_("Spelling Suggestions"), icon_name);
}
#endif
#if !HAVE_GTK3
GtkWidget *icon;
icon = gtk_image_new_from_stock(GTK_STOCK_SPELL_CHECK, GTK_ICON_SIZE_MENU);
mi = gtk_image_menu_item_new_with_label(_("Spelling Suggestions"));
gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi), icon);
#endif
mi = sexy_spell_entry_icon_menu_item (_("Spelling Suggestions"), GTK_STOCK_SPELL_CHECK);
word = gtk_editable_get_chars(GTK_EDITABLE(entry), start, end);
g_assert(word != NULL);