2 * Copyright (C) 2004 John Ellis
3 * Copyright (C) 2008 - 2016 The Geeqie Team
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License along
18 * with this program; if not, write to the Free Software Foundation, Inc.,
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
37 *-----------------------------------------------------------------------------
39 *-----------------------------------------------------------------------------
42 static void menu_item_finish(GtkWidget *menu, GtkWidget *item, GCallback func, gpointer data)
44 if (func) g_signal_connect(G_OBJECT(item), "activate", func, data);
45 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
46 gtk_widget_show(item);
49 GtkWidget *menu_item_add(GtkWidget *menu, const gchar *label,
50 GCallback func, gpointer data)
54 item = gtk_menu_item_new_with_mnemonic(label);
55 menu_item_finish(menu, item, func, data);
60 GtkWidget *menu_item_add_stock(GtkWidget *menu, const gchar *label, const gchar *stock_id,
61 GCallback func, gpointer data)
66 item = gtk_image_menu_item_new_with_mnemonic(label);
67 image = gtk_image_new_from_stock(stock_id, GTK_ICON_SIZE_MENU);
68 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image);
69 gtk_widget_show(image);
70 menu_item_finish(menu, item, func, data);
75 GtkWidget *menu_item_add_sensitive(GtkWidget *menu, const gchar *label, gboolean sensitive,
76 GCallback func, gpointer data)
80 item = menu_item_add(menu, label, func, data);
81 gtk_widget_set_sensitive(item, sensitive);
86 GtkWidget *menu_item_add_stock_sensitive(GtkWidget *menu, const gchar *label, const gchar *stock_id, gboolean sensitive,
87 GCallback func, gpointer data)
91 item = menu_item_add_stock(menu, label, stock_id, func, data);
92 gtk_widget_set_sensitive(item, sensitive);
97 GtkWidget *menu_item_add_check(GtkWidget *menu, const gchar *label, gboolean active,
98 GCallback func, gpointer data)
102 item = gtk_check_menu_item_new_with_mnemonic(label);
103 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), active);
104 menu_item_finish(menu, item, func, data);
109 GtkWidget *menu_item_add_radio(GtkWidget *menu, const gchar *label, gpointer item_data, gboolean active,
110 GCallback func, gpointer data)
112 GtkWidget *item = menu_item_add_check(menu, label, active, func, data);
113 g_object_set_data(G_OBJECT(item), "menu_item_radio_data", item_data);
114 g_object_set(G_OBJECT(item), "draw-as-radio", TRUE, NULL);
119 void menu_item_add_divider(GtkWidget *menu)
121 GtkWidget *item = gtk_separator_menu_item_new();
122 gtk_widget_set_sensitive(item, FALSE);
123 gtk_menu_shell_append(GTK_MENU_SHELL(menu),item);
124 gtk_widget_show(item);
127 GtkWidget *menu_item_add_simple(GtkWidget *menu, const gchar *label,
128 GCallback func, gpointer data)
130 GtkWidget *item = gtk_menu_item_new_with_label(label);
131 menu_item_finish(menu, item, func, data);
137 *-----------------------------------------------------------------------------
139 *-----------------------------------------------------------------------------
142 static void popup_menu_short_lived_cb(GtkWidget *widget, gpointer data)
144 /* destroy the menu */
145 g_object_unref(G_OBJECT(data));
148 GtkWidget *popup_menu_short_lived(void)
152 menu = gtk_menu_new();
154 /* take ownership of menu */
155 #ifdef GTK_OBJECT_FLOATING
157 g_object_ref(G_OBJECT(menu));
158 gtk_object_sink(GTK_OBJECT(menu));
161 g_object_ref_sink(G_OBJECT(menu));
164 g_signal_connect(G_OBJECT(menu), "selection_done",
165 G_CALLBACK(popup_menu_short_lived_cb), menu);
169 gboolean popup_menu_position_clamp(GtkMenu *menu, gint *x, gint *y, gint height)
171 gboolean adjusted = FALSE;
174 GtkRequisition requisition;
176 gtk_widget_get_requisition(GTK_WIDGET(menu), &requisition);
177 w = requisition.width;
178 h = requisition.height;
179 xw = gdk_screen_width();
180 xh = gdk_screen_height();
191 *y = MAX(0, *y - h - height);
213 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */