Remove commented out code.
[geeqie.git] / src / ui_menu.c
1 /*
2  * (SLIK) SimpLIstic sKin functions
3  * (C) 2004 John Ellis
4  * Copyright (C) 2008 - 2012 The Geeqie Team
5  *
6  * Author: John Ellis
7  *
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!
11  */
12
13 #ifdef HAVE_CONFIG_H
14 #  include "config.h"
15 #endif
16 #include "intl.h"
17
18 #include <stdio.h>
19 #include <stdlib.h>
20 #include <string.h>
21
22 #include <gtk/gtk.h>
23
24 #include "ui_menu.h"
25
26
27 /*
28  *-----------------------------------------------------------------------------
29  * menu items
30  *-----------------------------------------------------------------------------
31  */
32
33 static void menu_item_finish(GtkWidget *menu, GtkWidget *item, GCallback func, gpointer data)
34 {
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);
38 }
39
40 GtkWidget *menu_item_add(GtkWidget *menu, const gchar *label,
41                          GCallback func, gpointer data)
42 {
43         GtkWidget *item;
44
45         item = gtk_menu_item_new_with_mnemonic(label);
46         menu_item_finish(menu, item, func, data);
47
48         return item;
49 }
50
51 GtkWidget *menu_item_add_stock(GtkWidget *menu, const gchar *label, const gchar *stock_id,
52                                GCallback func, gpointer data)
53 {
54         GtkWidget *item;
55         GtkWidget *image;
56
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);
62
63         return item;
64 }
65
66 GtkWidget *menu_item_add_sensitive(GtkWidget *menu, const gchar *label, gboolean sensitive,
67                                    GCallback func, gpointer data)
68 {
69         GtkWidget *item;
70
71         item = menu_item_add(menu, label, func, data);
72         gtk_widget_set_sensitive(item, sensitive);
73
74         return item;
75 }
76
77 GtkWidget *menu_item_add_stock_sensitive(GtkWidget *menu, const gchar *label, const gchar *stock_id, gboolean sensitive,
78                                          GCallback func, gpointer data)
79 {
80         GtkWidget *item;
81
82         item = menu_item_add_stock(menu, label, stock_id, func, data);
83         gtk_widget_set_sensitive(item, sensitive);
84
85         return item;
86 }
87
88 GtkWidget *menu_item_add_check(GtkWidget *menu, const gchar *label, gboolean active,
89                                GCallback func, gpointer data)
90 {
91         GtkWidget *item;
92
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);
96
97         return item;
98 }
99
100 GtkWidget *menu_item_add_radio(GtkWidget *menu, const gchar *label, gpointer item_data, gboolean active,
101                                GCallback func, gpointer data)
102 {
103         GtkWidget *item = menu_item_add_check(menu, label, active, func, data);
104         g_object_set_data(G_OBJECT(item), "menu_item_radio_data", item_data);
105         g_object_set(G_OBJECT(item), "draw-as-radio", TRUE, NULL);
106
107         return item;
108 }
109
110 void menu_item_add_divider(GtkWidget *menu)
111 {
112         GtkWidget *item = gtk_menu_item_new();
113         gtk_widget_set_sensitive(item, FALSE);
114         gtk_menu_shell_append(GTK_MENU_SHELL(menu),item);
115         gtk_widget_show(item);
116 }
117
118 GtkWidget *menu_item_add_simple(GtkWidget *menu, const gchar *label,
119                                 GCallback func, gpointer data)
120 {
121         GtkWidget *item = gtk_menu_item_new_with_label(label);
122         menu_item_finish(menu, item, func, data);
123
124         return item;
125 }
126
127 /*
128  *-----------------------------------------------------------------------------
129  * popup menus
130  *-----------------------------------------------------------------------------
131  */
132
133 static void popup_menu_short_lived_cb(GtkWidget *widget, gpointer data)
134 {
135         /* destroy the menu */
136         g_object_unref(G_OBJECT(data));
137 }
138
139 GtkWidget *popup_menu_short_lived(void)
140 {
141         GtkWidget *menu;
142
143         menu = gtk_menu_new();
144
145         /* take ownership of menu */
146 #ifdef GTK_OBJECT_FLOATING
147         /* GTK+ < 2.10 */
148         g_object_ref(G_OBJECT(menu));
149         gtk_object_sink(GTK_OBJECT(menu));
150 #else
151         /* GTK+ >= 2.10 */
152         g_object_ref_sink(G_OBJECT(menu));
153 #endif
154
155         g_signal_connect(G_OBJECT(menu), "selection_done",
156                          G_CALLBACK(popup_menu_short_lived_cb), menu);
157         return menu;
158 }
159
160 gboolean popup_menu_position_clamp(GtkMenu *menu, gint *x, gint *y, gint height)
161 {
162         gboolean adjusted = FALSE;
163         gint w, h;
164         gint xw, xh;
165         GtkRequisition requisition;
166
167         gtk_widget_get_requisition(GTK_WIDGET(menu), &requisition);
168         w = requisition.width;
169         h = requisition.height;
170         xw = gdk_screen_width();
171         xh = gdk_screen_height();
172
173         if (*x + w > xw)
174                 {
175                 *x = xw - w;
176                 adjusted = TRUE;
177                 }
178         if (*y + h > xh)
179                 {
180                 if (height)
181                         {
182                         *y = MAX(0, *y - h - height);
183                         }
184                 else
185                         {
186                         *y = xh - h;
187                         }
188                 adjusted = TRUE;
189                 };
190
191         if (*x < 0)
192                 {
193                 *x = 0;
194                 adjusted = TRUE;
195                 }
196         if (*y < 0)
197                 {
198                 *y = 0;
199                 adjusted = TRUE;
200                 }
201
202         return adjusted;
203 }
204 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */