69
70
/// MENU FROM TREE ///
70
71
//////////////////////
72
/* Not really needed with libgnome-menu-3
73
static void _load_one_icon (GtkWidget *image)
75
// this actually loads the pixbuf of the gicon
76
GtkRequisition requisition;
77
#if (GTK_MAJOR_VERSION < 3)
78
gtk_widget_size_request (image, &requisition);
80
gtk_widget_get_preferred_size (image, &requisition, NULL);
84
73
static void add_image_to_menu_item (GtkWidget *image_menu_item,
86
75
const char *fallback_image_filename)
99
88
gtk_widget_show (image);
102
/**static gchar * menu_escape_underscores_and_prepend (const char *text)
104
GString *escaped_text;
109
return g_strdup (text);
111
escaped_text = g_string_sized_new (strlen (text) + 1);
112
g_string_printf (escaped_text, "_%s", text);
120
c = g_utf8_get_char (src);
122
if (c == (gunichar)-1) {
123
g_warning ("Invalid input string for underscore escaping");
124
return g_strdup (text);
125
} else if (c == '_') {
126
g_string_insert_c (escaped_text,
127
src - text + inserted, '_');
131
src = g_utf8_next_char (src);
134
return g_string_free (escaped_text, FALSE);
137
91
static GtkWidget * add_menu_separator (GtkWidget *menu)
139
93
GtkWidget *menuitem = gtk_separator_menu_item_new ();
156
110
add_image_to_menu_item (menuitem,
158
112
CD_FOLDER_DEFAULT_ICON);
160
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
115
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
164
static void create_submenu (GtkWidget *menu,
119
// return TRUE if the submenu is not empty
120
static gboolean create_submenu (GtkWidget *menu,
165
121
GMenuTreeDirectory *directory,
166
122
GMenuTreeDirectory *alias_directory)
168
124
// create an entry
169
125
GtkWidget *menuitem;
170
126
if (alias_directory)
171
menuitem = create_submenu_entry (menu, alias_directory);
127
menuitem = create_submenu_entry (menu, alias_directory, FALSE);
173
menuitem = create_submenu_entry (menu, directory);
129
menuitem = create_submenu_entry (menu, directory, FALSE);
177
133
// create a sub-menu for it
178
134
GtkWidget *submenu = gldi_submenu_new ();
179
135
gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
181
137
// populate the sub-menu with the directory
182
cd_populate_menu_from_directory (submenu, directory);
138
if (! cd_populate_menu_from_directory (submenu, directory))
140
cd_debug ("Empty submenu: %s",
141
gtk_menu_item_get_label (GTK_MENU_ITEM (menuitem)));
142
gtk_widget_destroy (menuitem);
146
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
185
static void create_header (GtkWidget *menu,
150
// return TRUE if the header is not empty
151
static gboolean create_header (GtkWidget *menu,
186
152
GMenuTreeHeader *header)
188
154
// create an entry
189
155
GMenuTreeDirectory *directory = gmenu_tree_header_get_directory (header);
190
create_submenu_entry (menu, directory);
156
GtkWidget *entry = create_submenu_entry (menu, directory, TRUE);
191
157
gmenu_tree_item_unref (directory);
158
return entry != NULL;
194
static void create_menuitem (GtkWidget *menu,
161
// return TRUE if the entry is added
162
static gboolean create_menuitem (GtkWidget *menu,
195
163
GMenuTreeEntry *entry,
196
164
GMenuTreeDirectory *alias_directory)
258
226
g_object_set_data_full (G_OBJECT (menuitem),
260
228
gmenu_tree_item_ref (entry),
261
(GDestroyNotify) gmenu_tree_item_unref); // stick the entry on the menu-item, which allows us to ref it and be sure to unref when the menu is destroyed.
229
(GDestroyNotify) gmenu_tree_item_unref);
230
// stick the entry on the menu-item, which allows us to ref it and be sure to unref when the menu is destroyed.
264
static void create_menuitem_from_alias (GtkWidget *menu,
234
// return TRUE if the menu is not empty
235
static gboolean create_menuitem_from_alias (GtkWidget *menu,
265
236
GMenuTreeAlias *alias)
267
239
GMenuTreeItemType iType = gmenu_tree_alias_get_aliased_item_type (alias);
268
240
GMenuTreeDirectory *src = gmenu_tree_alias_get_directory (alias);
281
251
case GMENU_TREE_ITEM_ENTRY:
283
253
GMenuTreeEntry *entry = gmenu_tree_alias_get_aliased_entry (alias);
284
create_menuitem (menu,
254
bHasItem = create_menuitem (menu,
285
255
gmenu_tree_alias_get_aliased_entry (alias),
287
257
gmenu_tree_item_unref (entry);
294
265
gmenu_tree_item_unref (src);
297
static void cd_populate_menu_from_directory (GtkWidget *menu, GMenuTreeDirectory *directory)
269
// return TRUE if the menu is not empty
270
static gboolean cd_populate_menu_from_directory (GtkWidget *menu, GMenuTreeDirectory *directory)
299
273
GMenuTreeIter *iter = gmenu_tree_directory_iter (directory);
300
274
GMenuTreeItemType next_type;
301
275
while ((next_type = gmenu_tree_iter_next (iter)) != GMENU_TREE_ITEM_INVALID)
306
280
case GMENU_TREE_ITEM_DIRECTORY: // we suppose that unicity is assured.
307
281
item = gmenu_tree_iter_get_directory (iter);
308
create_submenu (menu, item, NULL);
282
if (create_submenu (menu, item, NULL))
311
286
case GMENU_TREE_ITEM_ENTRY:
312
287
item = gmenu_tree_iter_get_entry (iter);
313
create_menuitem (menu, item, NULL);
288
if (create_menuitem (menu, item, NULL))
316
292
case GMENU_TREE_ITEM_SEPARATOR :
320
296
case GMENU_TREE_ITEM_ALIAS:
321
297
item = gmenu_tree_iter_get_alias (iter);
322
create_menuitem_from_alias (menu, item);
298
if (create_menuitem_from_alias (menu, item))
325
302
case GMENU_TREE_ITEM_HEADER:
326
303
item = gmenu_tree_iter_get_header (iter);
327
create_header (menu, item);
304
if (create_header (menu, item))
437
417
GMenuTree *cd_load_tree_from_file (const gchar *cMenuFile)
439
419
gchar *cMenuFileName = cd_find_menu_file (cMenuFile);
440
GMenuTree *tree = gmenu_tree_new (cMenuFileName, GMENU_TREE_FLAGS_INCLUDE_NODISPLAY | GMENU_TREE_FLAGS_INCLUDE_EXCLUDED); /// GMENU_TREE_FLAGS_INCLUDE_NODISPLAY
441
if (! gmenu_tree_load_sync (tree, NULL)) // this does all the heavy work of parsing the .menu and each desktop files.
420
GMenuTree *tree = gmenu_tree_new (cMenuFileName,
421
GMENU_TREE_FLAGS_INCLUDE_NODISPLAY| GMENU_TREE_FLAGS_INCLUDE_EXCLUDED);
422
// this does all the heavy work of parsing the .menu and each desktop files:
423
if (! gmenu_tree_load_sync (tree, NULL))
443
425
g_object_unref (tree);