~cairo-dock-team/cairo-dock-plug-ins/plug-ins

« back to all changes in this revision

Viewing changes to GMenu/src/applet-tree.c

  • Committer: Matthieu Baerts
  • Date: 2013-12-26 23:31:58 UTC
  • Revision ID: matttbe@gmail.com-20131226233158-tzt6igih2kkr2fh9
GMenu: do not add empty submenus when creating them

It's possible that a section contains items which are not in the menu
(e.g. if the application is not show: OnlyShowIn and NoDisplay=true)

We can check if a submenu is empty when creating it, no need to list all items

Show diffs side-by-side

added added

removed removed

Lines of Context:
27
27
 
28
28
#define CD_FOLDER_DEFAULT_ICON "folder"
29
29
 
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);
31
32
 
32
33
 
33
34
  /////////////////
145
146
}
146
147
 
147
148
static GtkWidget * create_submenu_entry (GtkWidget *menu,
148
 
        GMenuTreeDirectory *directory)
 
149
        GMenuTreeDirectory *directory, gboolean bAppend)
149
150
{
150
151
        if (gmenu_tree_directory_get_is_nodisplay (directory))
151
152
                return NULL;
156
157
        add_image_to_menu_item (menuitem,
157
158
                pIcon,
158
159
                CD_FOLDER_DEFAULT_ICON);
159
 
        
160
 
        gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
 
160
 
 
161
        if (bAppend)
 
162
                gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
161
163
        return menuitem;
162
164
}
163
165
 
164
 
static void create_submenu (GtkWidget *menu,
 
166
static gboolean create_submenu (GtkWidget *menu,
165
167
        GMenuTreeDirectory *directory,
166
168
        GMenuTreeDirectory *alias_directory)
167
169
{
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);
172
174
        else
173
 
                menuitem = create_submenu_entry (menu, directory);
 
175
                menuitem = create_submenu_entry (menu, directory, FALSE);
174
176
        if (!menuitem)
175
 
                return;
 
177
                return FALSE;
176
178
        
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);
180
 
        
 
182
 
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))
 
185
        {
 
186
                cd_debug ("Empty submenu: %s",
 
187
                        gtk_menu_item_get_label (GTK_MENU_ITEM (menuitem)));
 
188
                gtk_widget_destroy (menuitem);
 
189
                return FALSE;
 
190
        }
 
191
 
 
192
        gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
 
193
        return TRUE;
183
194
}
184
195
 
185
 
static void create_header (GtkWidget *menu,
 
196
static gboolean create_header (GtkWidget *menu,
186
197
        GMenuTreeHeader *header)
187
198
{
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;
192
204
}
193
205
 
194
 
static void create_menuitem (GtkWidget *menu,
 
206
static gboolean create_menuitem (GtkWidget *menu,
195
207
        GMenuTreeEntry *entry,
196
208
        GMenuTreeDirectory *alias_directory)
197
209
{
201
213
        
202
214
        // ignore entry that are not shown in the menu
203
215
        if (gmenu_tree_entry_get_is_excluded (entry))
204
 
                return;
 
216
                return FALSE;
205
217
        if (! cd_menu_app_should_show (pAppInfo))
206
 
                return;
 
218
                return FALSE;
207
219
        
208
220
        // create an entry
209
221
        const gchar *cName = NULL;
259
271
                "cd-entry",
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.
 
274
        return TRUE;
262
275
}
263
276
 
264
 
static void create_menuitem_from_alias (GtkWidget *menu,
 
277
static gboolean create_menuitem_from_alias (GtkWidget *menu,
265
278
        GMenuTreeAlias *alias)
266
279
{
 
280
        gboolean bHasItem;
267
281
        GMenuTreeItemType iType = gmenu_tree_alias_get_aliased_item_type (alias);
268
282
        GMenuTreeDirectory *src = gmenu_tree_alias_get_directory (alias);
269
283
        switch (iType)
271
285
                case GMENU_TREE_ITEM_DIRECTORY:
272
286
                {
273
287
                        GMenuTreeDirectory *directory = gmenu_tree_alias_get_aliased_directory (alias);
274
 
                        create_submenu (menu,
275
 
                                directory,
276
 
                                src);
 
288
                        bHasItem = create_submenu (menu, directory, src);
277
289
                        gmenu_tree_item_unref (directory);
278
290
                }
279
291
                break;
281
293
                case GMENU_TREE_ITEM_ENTRY:
282
294
                {
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),
286
298
                                src);
287
299
                        gmenu_tree_item_unref (entry);
289
301
                break;
290
302
 
291
303
                default:
 
304
                        bHasItem = FALSE;
292
305
                break;
293
306
        }
294
307
        gmenu_tree_item_unref (src);
 
308
        return bHasItem;
295
309
}
296
310
 
297
 
static void cd_populate_menu_from_directory (GtkWidget *menu, GMenuTreeDirectory *directory)
 
311
static gboolean cd_populate_menu_from_directory (GtkWidget *menu, GMenuTreeDirectory *directory)
298
312
{
 
313
        gint i = 0;
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)
305
320
                {
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))
 
324
                                        i++;
309
325
                                break;
310
326
 
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))
 
330
                                        i++;
314
331
                                break;
315
332
 
316
333
                        case GMENU_TREE_ITEM_SEPARATOR :
319
336
 
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))
 
340
                                        i++;
323
341
                                break;
324
342
 
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))
 
346
                                        i++;
328
347
                                break;
329
348
 
330
349
                        default:
334
353
                        gmenu_tree_item_unref (item);
335
354
        }
336
355
        gmenu_tree_iter_unref (iter);
 
356
 
 
357
        return i > 0;
337
358
}
338
359
 
339
360
void cd_append_tree_in_menu (GMenuTree *tree, GtkWidget *pMenu)