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 GtkWidget *menu_item_add_radio(GtkWidget *menu, GtkWidget *parent,
100 const gchar *label, gint active,
101 GCallback func, gpointer data)
104 GSList *group = NULL;
106 if (parent) group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(parent));
108 item = gtk_radio_menu_item_new_with_mnemonic(group, label);
109 if (active) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), active);
110 menu_item_finish(menu, item, func, data);
115 void menu_item_add_divider(GtkWidget *menu)
117 GtkWidget *item = gtk_menu_item_new();
118 gtk_widget_set_sensitive(item, FALSE);
119 gtk_menu_shell_append(GTK_MENU_SHELL(menu),item);
120 gtk_widget_show(item);
123 GtkWidget *menu_item_add_simple(GtkWidget *menu, const gchar *label,
124 GCallback func, gpointer data)
126 GtkWidget *item = gtk_menu_item_new_with_label(label);
127 menu_item_finish(menu, item, func, data);
133 *-----------------------------------------------------------------------------
135 *-----------------------------------------------------------------------------
138 static void popup_menu_short_lived_cb(GtkWidget *widget, gpointer data)
140 /* destroy the menu */
141 g_object_unref(G_OBJECT(data));
144 GtkWidget *popup_menu_short_lived(void)
148 menu = gtk_menu_new();
150 /* take ownership of menu */
151 #ifdef GTK_OBJECT_FLOATING
153 g_object_ref(G_OBJECT(menu));
154 gtk_object_sink(GTK_OBJECT(menu));
157 g_object_ref_sink(G_OBJECT(menu));
160 g_signal_connect(G_OBJECT(menu), "selection_done",
161 G_CALLBACK(popup_menu_short_lived_cb), menu);
165 gint popup_menu_position_clamp(GtkMenu *menu, gint *x, gint *y, gint height)
167 gint adjusted = FALSE;
171 w = GTK_WIDGET(menu)->requisition.width;
172 h = GTK_WIDGET(menu)->requisition.height;
173 xw = gdk_screen_width();
174 xh = gdk_screen_height();
185 *y = MAX(0, *y - h - height);