diff options
Diffstat (limited to 'src/gdu-utils.c')
-rw-r--r-- | src/gdu-utils.c | 128 |
1 files changed, 93 insertions, 35 deletions
diff --git a/src/gdu-utils.c b/src/gdu-utils.c index e85eee3..0d01aef 100644 --- a/src/gdu-utils.c +++ b/src/gdu-utils.c @@ -147,6 +147,66 @@ find_presentable_from_device_path (char *device_path) /* ---------------------------------------------------------------------------------------------------- */ /* Volume selector widget */ +static void +gdu_util_presentable_combo_box_add_item (GtkListStore *store, GduPresentable *presentable) +{ + char *name = NULL; + char *display_name = NULL; + GdkPixbuf *pixbuf = NULL; + GtkTreeIter iter; + GduDevice *device = NULL; + GduPresentable *toplevel_presentable = NULL; + GduDevice *toplevel_device = NULL; + + device = gdu_presentable_get_device (presentable); + toplevel_presentable = gdu_presentable_get_toplevel (presentable); + if (toplevel_presentable) + toplevel_device = gdu_presentable_get_device (toplevel_presentable); + + /* Make display name */ + if (device) { + name = g_strdup (gdu_device_id_get_label (device)); + if (name && strlen (name) > 0) + display_name = g_strdup (name); + g_free (name); + name = NULL; + } + if (! display_name) { + name = gdu_presentable_get_name (presentable); + if (name && strlen (name) > 0) + display_name = g_strdup_printf ("(%s)", name); + g_free (name); + name = NULL; + } + if (! display_name && device) + display_name = g_strdup_printf ("(%s)", gdu_device_get_device_file (device)); + + /* Get an icon */ + pixbuf = gdu_util_get_pixbuf_for_presentable (presentable, GTK_ICON_SIZE_DIALOG); + + if (device || toplevel_device) { + gtk_list_store_append (store, &iter); + /* gtk_list_store_set() refs objects itself */ + gtk_list_store_set (store, &iter, + 0, presentable, + 1, display_name, + 2, device ? gdu_device_get_device_file (device) : gdu_device_get_device_file (toplevel_device), + 3, pixbuf, + -1); + } + + g_free (display_name); + if (device) + g_object_unref (device); + if (toplevel_presentable) + g_object_unref (toplevel_presentable); + if (toplevel_device) + g_object_unref (toplevel_device); + if (name) + g_free (name); + if (pixbuf) + g_object_unref (pixbuf); +} static GtkListStore * gdu_util_presentable_combo_box_create_store (GduPool *pool) @@ -173,55 +233,53 @@ gdu_util_presentable_combo_box_create_store (GduPool *pool) GduPresentable *toplevel_presentable; GduDevice *toplevel_device = NULL; GduDevice *device; - GdkPixbuf *pixbuf = NULL; GList *enclosed_presentables = NULL; - char *name = NULL; - char *display_name = NULL; - device = gdu_presentable_get_device (presentable); toplevel_presentable = gdu_presentable_get_toplevel (presentable); - if (device != NULL && toplevel_presentable != NULL) { + if (toplevel_presentable) toplevel_device = gdu_presentable_get_device (toplevel_presentable); - pixbuf = gdu_util_get_pixbuf_for_presentable (presentable, GTK_ICON_SIZE_DIALOG); + /* First eliminate all non-toplevel presentables */ + if (/* device != NULL && */ + toplevel_device != NULL && + toplevel_presentable == presentable && + gdu_device_is_removable (toplevel_device) + /* && ! gdu_device_is_system_internal (device) */) { /* determine parent presentables (in case of toplevel drive) */ enclosed_presentables = gdu_pool_get_enclosed_presentables (pool, presentable); - if (toplevel_device != NULL && gdu_device_is_removable (toplevel_device) && g_list_length (enclosed_presentables) == 0) { - name = g_strdup (gdu_device_id_get_label (device)); - if (name && strlen (name) > 0) - display_name = g_strdup (name); - g_free (name); - name = NULL; - if (! display_name) { - name = gdu_presentable_get_name (presentable); - if (name && strlen (name) > 0) - display_name = g_strdup_printf ("(%s)", name); - g_free (name); - name = NULL; - } - if (! display_name) - display_name = g_strdup_printf ("(%s)", gdu_device_get_device_file (device)); - - gtk_list_store_append (store, &iter); - /* gtk_list_store_set() refs objects itself */ - gtk_list_store_set (store, &iter, - 0, presentable, - 1, display_name, - 2, gdu_device_get_device_file (device), - 3, pixbuf, - -1); - g_free (display_name); - if (name) - g_free (name); + g_print ("presentable %s [%s], enclosed_presentables = %d, toplevel_presentable = %p vs. %p, gdu_device_is_partition_table = %d, gdu_device_is_optical_disc = %d, gdu_device_drive_get_media = '%s'\n", + gdu_presentable_get_name (presentable), device ? gdu_device_get_device_file (device) : "no device.", g_list_length (enclosed_presentables), toplevel_presentable, presentable, gdu_device_is_partition_table (device), gdu_device_is_optical_disc (device), gdu_device_drive_get_media (device)); +#if 0 + char **media_compat = gdu_device_drive_get_media_compatibility (device); + for (; *media_compat; media_compat++) { + g_print (" compat '%s'\n", *media_compat); + } +#endif + + + GList *enclosed_presentables_l; + for (enclosed_presentables_l = enclosed_presentables; enclosed_presentables_l != NULL; enclosed_presentables_l = enclosed_presentables_l->next) { + GduPresentable *presentable_e = enclosed_presentables_l->data; + GduDevice *device_e = gdu_presentable_get_device (presentable_e); + g_print (" +--- %s, GDU_IS_DRIVE = %d, GDU_IS_VOLUME = %d, GDU_IS_VOLUME_HOLE = %d, device = %p [%s]\n", + gdu_presentable_get_name (presentable_e), GDU_IS_DRIVE (presentable_e), GDU_IS_VOLUME (presentable_e), GDU_IS_VOLUME_HOLE (presentable_e), device_e, device_e ? gdu_device_get_device_file (device_e) : "no device."); + gdu_util_presentable_combo_box_add_item (store, presentable_e); + if (device_e) + g_object_unref (device_e); + } + +#if 0 + if (/* toplevel_device != NULL && gdu_device_is_removable (toplevel_device) && */ g_list_length (enclosed_presentables) == 0) { + gdu_util_presentable_combo_box_add_item (store, presentable); } +#endif + g_list_foreach (enclosed_presentables, (GFunc) g_object_unref, NULL); g_list_free (enclosed_presentables); } - if (pixbuf) - g_object_unref (pixbuf); if (toplevel_presentable) g_object_unref (toplevel_presentable); if (device) |