gnome-panel r10813 - trunk/gnome-panel
- From: vuntz svn gnome org
- To: svn-commits-list gnome org
- Subject: gnome-panel r10813 - trunk/gnome-panel
- Date: Mon, 11 Feb 2008 11:44:39 +0000 (GMT)
Author: vuntz
Date: Mon Feb 11 11:44:38 2008
New Revision: 10813
URL: http://svn.gnome.org/viewvc/gnome-panel?rev=10813&view=rev
Log:
2008-02-11 Vincent Untz <vuntz gnome org>
* panel-menu-items.c: (panel_place_menu_item_append_local_gio): put
items in a submenu if there are too many items. Fix a regression.
Modified:
trunk/gnome-panel/ChangeLog
trunk/gnome-panel/panel-menu-items.c
Modified: trunk/gnome-panel/panel-menu-items.c
==============================================================================
--- trunk/gnome-panel/panel-menu-items.c (original)
+++ trunk/gnome-panel/panel-menu-items.c Mon Feb 11 11:44:38 2008
@@ -692,6 +692,21 @@
g_free (activation_uri);
}
+typedef enum {
+ PANEL_GIO_DRIVE,
+ PANEL_GIO_VOLUME,
+ PANEL_GIO_MOUNT
+} PanelGioItemType;
+
+typedef struct {
+ PanelGioItemType type;
+ union {
+ GDrive *drive;
+ GVolume *volume;
+ GMount *mount;
+ } u;
+} PanelGioItem;
+
/* this is loosely based on update_places() from nautilus-places-sidebar.c */
static void
panel_place_menu_item_append_local_gio (PanelPlaceMenuItem *place_item,
@@ -705,9 +720,12 @@
GVolume *volume;
GList *mounts;
GMount *mount;
+ GSList *items;
+ GSList *sl;
+ PanelGioItem *item;
+ GtkWidget *add_menu;
- /* FIXME: use it for a submenu */
- char *submenu_title = _("Removable Media");
+ items = NULL;
/* first go through all connected drives */
drives = g_volume_monitor_get_connected_drives (place_item->priv->volume_monitor);
@@ -719,10 +737,10 @@
for (ll = volumes; ll != NULL; ll = ll->next) {
volume = ll->data;
mount = g_volume_get_mount (volume);
+ item = g_slice_new (PanelGioItem);
if (mount != NULL) {
- panel_menu_item_append_mount (menu,
- mount);
- g_object_unref (mount);
+ item->type = PANEL_GIO_MOUNT;
+ item->u.mount = mount;
} else {
/* Do show the unmounted volumes; this
* is so the user can mount it (in case
@@ -734,9 +752,10 @@
* yank out the media if he just
* unmounted it.
*/
- panel_menu_item_append_volume (menu,
- volume);
+ item->type = PANEL_GIO_VOLUME;
+ item->u.volume = g_object_ref (volume);
}
+ items = g_slist_prepend (items, item);
g_object_unref (volume);
}
g_list_free (volumes);
@@ -754,7 +773,10 @@
* off media detection in the OS to save
* battery juice.
*/
- panel_menu_item_append_drive (menu, drive);
+ item = g_slice_new (PanelGioItem);
+ item->type = PANEL_GIO_DRIVE;
+ item->u.drive = g_object_ref (drive);
+ items = g_slist_prepend (items, item);
}
}
g_object_unref (drive);
@@ -772,14 +794,17 @@
continue;
}
mount = g_volume_get_mount (volume);
+ item = g_slice_new (PanelGioItem);
if (mount != NULL) {
- panel_menu_item_append_mount (menu, mount);
- g_object_unref (mount);
+ item->type = PANEL_GIO_MOUNT;
+ item->u.mount = mount;
} else {
/* see comment above in why we add an icon for an
* unmounted mountable volume */
- panel_menu_item_append_volume (menu, volume);
+ item->type = PANEL_GIO_VOLUME;
+ item->u.volume = g_object_ref (volume);
}
+ items = g_slist_prepend (items, item);
g_object_unref (volume);
}
g_list_free (volumes);
@@ -806,10 +831,55 @@
}
g_object_unref (root);
- panel_menu_item_append_mount (menu, mount);
- g_object_unref (mount);
+ item = g_slice_new (PanelGioItem);
+ item->type = PANEL_GIO_MOUNT;
+ item->u.mount = mount;
+ items = g_slist_prepend (items, item);
}
g_list_free (mounts);
+
+ /* now that we have everything, add the items inline or in a submenu */
+ items = g_slist_reverse (items);
+
+ if (g_slist_length (items) <= MAX_ITEMS_OR_SUBMENU) {
+ add_menu = menu;
+ } else {
+ GtkWidget *item;
+
+ item = gtk_image_menu_item_new ();
+ setup_menu_item_with_icon (item, panel_menu_icon_get_size (),
+ PANEL_ICON_REMOVABLE_MEDIA, NULL,
+ _("Removable Media"));
+
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+ gtk_widget_show (item);
+
+ add_menu = create_empty_menu ();
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), add_menu);
+ }
+
+ for (sl = items; sl; sl = sl->next) {
+ item = sl->data;
+ switch (item->type) {
+ case PANEL_GIO_DRIVE:
+ panel_menu_item_append_drive (add_menu, item->u.drive);
+ g_object_unref (item->u.drive);
+ break;
+ case PANEL_GIO_VOLUME:
+ panel_menu_item_append_volume (add_menu, item->u.volume);
+ g_object_unref (item->u.volume);
+ break;
+ case PANEL_GIO_MOUNT:
+ panel_menu_item_append_mount (add_menu, item->u.mount);
+ g_object_unref (item->u.mount);
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+ g_slice_free (PanelGioItem, item);
+ }
+
+ g_slist_free (items);
}
/* this is loosely based on update_places() from nautilus-places-sidebar.c */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]