Skip to content

Instantly share code, notes, and snippets.

@andreldm
Last active April 27, 2022 13:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save andreldm/62ecee0d87cde8ec5f3d0e36e404511c to your computer and use it in GitHub Desktop.
Save andreldm/62ecee0d87cde8ec5f3d0e36e404511c to your computer and use it in GitHub Desktop.
How to avoid GtkImageMenuItem and keep icons on menu items
/*
* Build:
* gcc $(pkg-config --cflags gtk+-3.0) sample.c -o sample $(pkg-config --libs gtk+-3.0)
*/
#include <gtk/gtk.h>
static GtkWidget*
create_menu_item (const gchar *str, const char *icon_name)
{
GtkWidget *mi, *label, *box, *image;
mi = gtk_menu_item_new ();
label = gtk_label_new (str);
image = gtk_image_new_from_icon_name (icon_name ? icon_name : "", GTK_ICON_SIZE_BUTTON);
box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4);
gtk_widget_set_halign (label, GTK_ALIGN_START);
gtk_box_pack_start (GTK_BOX (box), image, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 6);
gtk_container_add (GTK_CONTAINER (mi), box);
return mi;
}
gboolean
on_button_pressed (GtkWidget *treeview, GdkEventButton *event, gpointer data)
{
if (event->type == GDK_BUTTON_PRESS && event->button == 3)
{
GtkWidget *menu = gtk_menu_new ();
gtk_menu_shell_append (GTK_MENU_SHELL (menu),
create_menu_item ("Copy", "edit-copy"));
gtk_menu_shell_append (GTK_MENU_SHELL (menu),
create_menu_item ("Paste", "edit-paste"));
gtk_menu_shell_append (GTK_MENU_SHELL (menu),
create_menu_item ("Another option", NULL));
gtk_menu_set_reserve_toggle_size (GTK_MENU (menu), FALSE);
gtk_widget_show_all (menu);
gtk_menu_popup_at_pointer(GTK_MENU (menu), NULL);
return TRUE;
}
return FALSE;
}
int
main (int argc, char *argv[])
{
GtkWidget *window;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER);
gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);
g_signal_connect (G_OBJECT (window), "button-press-event", G_CALLBACK (on_button_pressed), NULL);
gtk_widget_show_all (window);
gtk_main ();
return 0;
}
@aullidolunar
Copy link

Hi. Where can I find the possible names for icon_names to use gtk_image_new_from_icon_name? I'm trying to port my gtk2 app to gtk3. Thanks.

@andreldm
Copy link
Author

@aullidolunar gtk3-icon-browser or you can browse /usr/share/icons/<theme>/<size>/<category>.

@aullidolunar
Copy link

@andreldm Thanks, man. I also found useful the complete list from freedesktop.org. I have another one: How can I change/update the menu image? Something like a toggle play and pause buttons.

@andreldm
Copy link
Author

@aullidolunar you need to keep the references for image instances around and call gtk_image_set_from_icon_name using them.

@aullidolunar
Copy link

@andreldm OK, OK, I understand: for example in my struct that I pass as user_data for each function as needed. Got it! Thanks.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment