2 * (SLIK) SimpLIstic sKin functions
7 * This software is released under the GNU General Public License (GNU GPL).
8 * Please read the included file COPYING for more information.
9 * This software comes with no warranty of any kind, use at your own risk!
27 *-----------------------------------------------------------------------------
29 *-----------------------------------------------------------------------------
32 static void menu_item_finish(GtkWidget *menu, GtkWidget *item, GCallback func, gpointer data)
34 if (func) g_signal_connect(G_OBJECT(item), "activate", func, data);
35 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
36 gtk_widget_show(item);
39 GtkWidget *menu_item_add(GtkWidget *menu, const gchar *label,
40 GCallback func, gpointer data)
44 item = gtk_menu_item_new_with_mnemonic(label);
45 menu_item_finish(menu, item, func, data);
50 GtkWidget *menu_item_add_stock(GtkWidget *menu, const gchar *label, const gchar *stock_id,
51 GCallback func, gpointer data)
56 item = gtk_image_menu_item_new_with_mnemonic(label);
57 image = gtk_image_new_from_stock (stock_id, GTK_ICON_SIZE_MENU);
58 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image);
59 gtk_widget_show(image);
60 menu_item_finish(menu, item, func, data);
65 GtkWidget *menu_item_add_sensitive(GtkWidget *menu, const gchar *label, gint sensitive,
66 GCallback func, gpointer data)
70 item = menu_item_add(menu, label, func, data);
71 gtk_widget_set_sensitive(item, sensitive);
76 GtkWidget *menu_item_add_stock_sensitive(GtkWidget *menu, const gchar *label, const gchar *stock_id, gint sensitive,
77 GCallback func, gpointer data)
81 item = menu_item_add_stock(menu, label, stock_id, func, data);
82 gtk_widget_set_sensitive(item, sensitive);
87 GtkWidget *menu_item_add_check(GtkWidget *menu, const gchar *label, gint active,
88 GCallback func, gpointer data)
92 item = gtk_check_menu_item_new_with_mnemonic(label);
93 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), active);
94 menu_item_finish(menu, item, func, data);
99 void menu_item_add_divider(GtkWidget *menu)
101 GtkWidget *item = gtk_menu_item_new();
102 gtk_widget_set_sensitive(item, FALSE);
103 gtk_menu_shell_append(GTK_MENU_SHELL(menu),item);
104 gtk_widget_show(item);
107 GtkWidget *menu_item_add_simple(GtkWidget *menu, const gchar *label,
108 GCallback func, gpointer data)
110 GtkWidget *item = gtk_menu_item_new_with_label(label);
111 menu_item_finish(menu, item, func, data);
117 *-----------------------------------------------------------------------------
119 *-----------------------------------------------------------------------------
122 static void popup_menu_short_lived_cb(GtkWidget *widget, gpointer data)
124 /* destroy the menu */
125 g_object_unref(G_OBJECT(data));
128 GtkWidget *popup_menu_short_lived(void)
132 menu = gtk_menu_new();
134 /* take ownership of menu */
135 #ifdef GTK_OBJECT_FLOATING
137 g_object_ref(G_OBJECT(menu));
138 gtk_object_sink(GTK_OBJECT(menu));
141 g_object_ref_sink(G_OBJECT(menu));
144 g_signal_connect(G_OBJECT(menu), "selection_done",
145 G_CALLBACK(popup_menu_short_lived_cb), menu);
149 gint popup_menu_position_clamp(GtkMenu *menu, gint *x, gint *y, gint height)
151 gint adjusted = FALSE;
155 w = GTK_WIDGET(menu)->requisition.width;
156 h = GTK_WIDGET(menu)->requisition.height;
157 xw = gdk_screen_width();
158 xh = gdk_screen_height();
169 *y = MAX(0, *y - h - height);