2 * (SLIK) SimpLIstic sKin functions
4 * Copyright (C) 2008 The Geeqie Team
8 * This software is released under the GNU General Public License (GNU GPL).
9 * Please read the included file COPYING for more information.
10 * This software comes with no warranty of any kind, use at your own risk!
28 *-----------------------------------------------------------------------------
30 *-----------------------------------------------------------------------------
33 static void menu_item_finish(GtkWidget *menu, GtkWidget *item, GCallback func, gpointer data)
35 if (func) g_signal_connect(G_OBJECT(item), "activate", func, data);
36 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
37 gtk_widget_show(item);
40 GtkWidget *menu_item_add(GtkWidget *menu, const gchar *label,
41 GCallback func, gpointer data)
45 item = gtk_menu_item_new_with_mnemonic(label);
46 menu_item_finish(menu, item, func, data);
51 GtkWidget *menu_item_add_stock(GtkWidget *menu, const gchar *label, const gchar *stock_id,
52 GCallback func, gpointer data)
57 item = gtk_image_menu_item_new_with_mnemonic(label);
58 image = gtk_image_new_from_stock(stock_id, GTK_ICON_SIZE_MENU);
59 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image);
60 gtk_widget_show(image);
61 menu_item_finish(menu, item, func, data);
66 GtkWidget *menu_item_add_sensitive(GtkWidget *menu, const gchar *label, gint sensitive,
67 GCallback func, gpointer data)
71 item = menu_item_add(menu, label, func, data);
72 gtk_widget_set_sensitive(item, sensitive);
77 GtkWidget *menu_item_add_stock_sensitive(GtkWidget *menu, const gchar *label, const gchar *stock_id, gint sensitive,
78 GCallback func, gpointer data)
82 item = menu_item_add_stock(menu, label, stock_id, func, data);
83 gtk_widget_set_sensitive(item, sensitive);
88 GtkWidget *menu_item_add_check(GtkWidget *menu, const gchar *label, gint active,
89 GCallback func, gpointer data)
93 item = gtk_check_menu_item_new_with_mnemonic(label);
94 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), active);
95 menu_item_finish(menu, item, func, data);
100 GtkWidget *menu_item_add_radio(GtkWidget *menu, GtkWidget *parent,
101 const gchar *label, gint active,
102 GCallback func, gpointer data)
105 GSList *group = NULL;
107 if (parent) group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(parent));
109 item = gtk_radio_menu_item_new_with_mnemonic(group, label);
110 if (active) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), active);
111 menu_item_finish(menu, item, func, data);
116 void menu_item_add_divider(GtkWidget *menu)
118 GtkWidget *item = gtk_menu_item_new();
119 gtk_widget_set_sensitive(item, FALSE);
120 gtk_menu_shell_append(GTK_MENU_SHELL(menu),item);
121 gtk_widget_show(item);
124 GtkWidget *menu_item_add_simple(GtkWidget *menu, const gchar *label,
125 GCallback func, gpointer data)
127 GtkWidget *item = gtk_menu_item_new_with_label(label);
128 menu_item_finish(menu, item, func, data);
134 *-----------------------------------------------------------------------------
136 *-----------------------------------------------------------------------------
139 static void popup_menu_short_lived_cb(GtkWidget *widget, gpointer data)
141 /* destroy the menu */
142 g_object_unref(G_OBJECT(data));
145 GtkWidget *popup_menu_short_lived(void)
149 menu = gtk_menu_new();
151 /* take ownership of menu */
152 #ifdef GTK_OBJECT_FLOATING
154 g_object_ref(G_OBJECT(menu));
155 gtk_object_sink(GTK_OBJECT(menu));
158 g_object_ref_sink(G_OBJECT(menu));
161 g_signal_connect(G_OBJECT(menu), "selection_done",
162 G_CALLBACK(popup_menu_short_lived_cb), menu);
166 gint popup_menu_position_clamp(GtkMenu *menu, gint *x, gint *y, gint height)
168 gint adjusted = FALSE;
172 w = GTK_WIDGET(menu)->requisition.width;
173 h = GTK_WIDGET(menu)->requisition.height;
174 xw = gdk_screen_width();
175 xh = gdk_screen_height();
186 *y = MAX(0, *y - h - height);