28
28
#define CD_FOLDER_DEFAULT_ICON "folder"
30
static void cd_populate_menu_from_directory (GtkWidget *menu, GMenuTreeDirectory *directory);
30
// return TRUE if the menu is not empty
31
static gboolean cd_populate_menu_from_directory (GtkWidget *menu, GMenuTreeDirectory *directory);
147
148
static GtkWidget * create_submenu_entry (GtkWidget *menu,
148
GMenuTreeDirectory *directory)
149
GMenuTreeDirectory *directory, gboolean bAppend)
150
151
if (gmenu_tree_directory_get_is_nodisplay (directory))
156
157
add_image_to_menu_item (menuitem,
158
159
CD_FOLDER_DEFAULT_ICON);
160
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
162
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
164
static void create_submenu (GtkWidget *menu,
166
static gboolean create_submenu (GtkWidget *menu,
165
167
GMenuTreeDirectory *directory,
166
168
GMenuTreeDirectory *alias_directory)
168
170
// create an entry
169
171
GtkWidget *menuitem;
170
172
if (alias_directory)
171
menuitem = create_submenu_entry (menu, alias_directory);
173
menuitem = create_submenu_entry (menu, alias_directory, FALSE);
173
menuitem = create_submenu_entry (menu, directory);
175
menuitem = create_submenu_entry (menu, directory, FALSE);
177
179
// create a sub-menu for it
178
180
GtkWidget *submenu = gldi_submenu_new ();
179
181
gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
181
183
// populate the sub-menu with the directory
182
cd_populate_menu_from_directory (submenu, directory);
184
if (! cd_populate_menu_from_directory (submenu, directory))
186
cd_debug ("Empty submenu: %s",
187
gtk_menu_item_get_label (GTK_MENU_ITEM (menuitem)));
188
gtk_widget_destroy (menuitem);
192
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
185
static void create_header (GtkWidget *menu,
196
static gboolean create_header (GtkWidget *menu,
186
197
GMenuTreeHeader *header)
188
199
// create an entry
189
200
GMenuTreeDirectory *directory = gmenu_tree_header_get_directory (header);
190
create_submenu_entry (menu, directory);
201
GtkWidget *entry = create_submenu_entry (menu, directory, TRUE);
191
202
gmenu_tree_item_unref (directory);
203
return entry != NULL;
194
static void create_menuitem (GtkWidget *menu,
206
static gboolean create_menuitem (GtkWidget *menu,
195
207
GMenuTreeEntry *entry,
196
208
GMenuTreeDirectory *alias_directory)
260
272
gmenu_tree_item_ref (entry),
261
273
(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.
264
static void create_menuitem_from_alias (GtkWidget *menu,
277
static gboolean create_menuitem_from_alias (GtkWidget *menu,
265
278
GMenuTreeAlias *alias)
267
281
GMenuTreeItemType iType = gmenu_tree_alias_get_aliased_item_type (alias);
268
282
GMenuTreeDirectory *src = gmenu_tree_alias_get_directory (alias);
271
285
case GMENU_TREE_ITEM_DIRECTORY:
273
287
GMenuTreeDirectory *directory = gmenu_tree_alias_get_aliased_directory (alias);
274
create_submenu (menu,
288
bHasItem = create_submenu (menu, directory, src);
277
289
gmenu_tree_item_unref (directory);
281
293
case GMENU_TREE_ITEM_ENTRY:
283
295
GMenuTreeEntry *entry = gmenu_tree_alias_get_aliased_entry (alias);
284
create_menuitem (menu,
296
bHasItem = create_menuitem (menu,
285
297
gmenu_tree_alias_get_aliased_entry (alias),
287
299
gmenu_tree_item_unref (entry);
294
307
gmenu_tree_item_unref (src);
297
static void cd_populate_menu_from_directory (GtkWidget *menu, GMenuTreeDirectory *directory)
311
static gboolean cd_populate_menu_from_directory (GtkWidget *menu, GMenuTreeDirectory *directory)
299
314
GMenuTreeIter *iter = gmenu_tree_directory_iter (directory);
300
315
GMenuTreeItemType next_type;
301
316
while ((next_type = gmenu_tree_iter_next (iter)) != GMENU_TREE_ITEM_INVALID)
306
321
case GMENU_TREE_ITEM_DIRECTORY: // we suppose that unicity is assured.
307
322
item = gmenu_tree_iter_get_directory (iter);
308
create_submenu (menu, item, NULL);
323
if (create_submenu (menu, item, NULL))
311
327
case GMENU_TREE_ITEM_ENTRY:
312
328
item = gmenu_tree_iter_get_entry (iter);
313
create_menuitem (menu, item, NULL);
329
if (create_menuitem (menu, item, NULL))
316
333
case GMENU_TREE_ITEM_SEPARATOR :
320
337
case GMENU_TREE_ITEM_ALIAS:
321
338
item = gmenu_tree_iter_get_alias (iter);
322
create_menuitem_from_alias (menu, item);
339
if (create_menuitem_from_alias (menu, item))
325
343
case GMENU_TREE_ITEM_HEADER:
326
344
item = gmenu_tree_iter_get_header (iter);
327
create_header (menu, item);
345
if (create_header (menu, item))