summaryrefslogtreecommitdiffstats
path: root/src/gdu-utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gdu-utils.c')
-rw-r--r--src/gdu-utils.c128
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)