Move device list refresh to a separate function
authorMikko Rasa <tdb@tdb.fi>
Thu, 25 Feb 2016 18:36:13 +0000 (20:36 +0200)
committerMikko Rasa <tdb@tdb.fi>
Thu, 25 Feb 2016 18:36:13 +0000 (20:36 +0200)
main.c

diff --git a/main.c b/main.c
index ce9ac69d62ed23540b2cc1271c66ea25e86ea90d..59bf3050d4e12d8f768933fa0415168729aa0bf3 100644 (file)
--- a/main.c
+++ b/main.c
@@ -33,6 +33,7 @@ typedef struct sDevice
 typedef struct sGuiContext
 {
        int manager;
+       Device *devices;
        GtkWidget *list;
        GtkWidget *button;
        char *post_mount_command;
@@ -766,6 +767,60 @@ int toggle_device(Device *device, char *out_buf, int out_size)
        return 0;
 }
 
+/**
+Refreshes both the internal devices array and the GUI list.
+*/
+int refresh_devices(GuiContext *context, int umount)
+{
+       GtkListStore *store;
+       GtkTreeSelection *selection;
+       int n_listed;
+       time_t latest;
+       int i;
+       GtkTreeIter iter;
+
+       store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(context->list)));
+       gtk_list_store_clear(store);
+
+       free_devices(context->devices);
+
+       context->devices = get_devices();
+       if(!context->devices)
+               return 0;
+
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(context->list));
+
+       /* Populate the list with devices in appropriate state. */
+       n_listed = 0;
+       latest = 0;
+       for(i=0; context->devices[i].node; ++i)
+       {
+               Device *dev;
+
+               dev = &context->devices[i];
+               if(umount<0 || !dev->mount_point==!umount)
+               {
+                       gtk_list_store_append(store, &iter);
+                       gtk_list_store_set(store, &iter,
+                               0, dev->description,
+                               1, dev,
+                               2, !!dev->mount_point,
+                               3, dev->mount_point,
+                               -1);
+                       if(dev->time>latest)
+                       {
+                               /* Pre-select the device that appeared on the system most recently. */
+                               latest = dev->time;
+                               gtk_tree_selection_select_iter(selection, &iter);
+                       }
+
+                       ++n_listed;
+               }
+       }
+
+       return n_listed;
+}
+
 /**
 Callback for selection in the device list changing.  Updates the action button
 label according to device status.
@@ -912,15 +967,12 @@ int main(int argc, char **argv)
        GtkListStore *store;
        GtkTreeSelection *selection;
        GtkCellRenderer *mounted_toggle;
-       GtkTreeIter iter;
-       Device *devices;
-       int i;
-       time_t latest;
        int opt;
        int umount = 0;
        int n_listed;
 
        context.manager = 0;
+       context.devices = NULL;
        context.post_mount_command = NULL;
 
        gtk_init(&argc, &argv);
@@ -991,33 +1043,7 @@ int main(int argc, char **argv)
        g_signal_connect(context.button, "clicked", G_CALLBACK(&button_clicked), &context);
        gtk_box_pack_start(GTK_BOX(box), context.button, FALSE, TRUE, 0);
 
-       devices = get_devices();
-       n_listed = 0;
-       if(devices)
-       {
-               /* Populate the list with devices in appropriate state. */
-               latest = 0;
-               for(i=0; devices[i].node; ++i)
-                       if(!devices[i].mount_point==!umount || context.manager)
-                       {
-                               gtk_list_store_append(store, &iter);
-                               gtk_list_store_set(store, &iter,
-                                       0, devices[i].description,
-                                       1, &devices[i],
-                                       2, !!devices[i].mount_point,
-                                       3, devices[i].mount_point,
-                                       -1);
-                               if(devices[i].time>latest)
-                               {
-                                       /* Pre-select the device that appeared on the system most recently. */
-                                       latest = devices[i].time;
-                                       gtk_tree_selection_select_iter(selection, &iter);
-                               }
-
-                               ++n_listed;
-                       }
-
-       }
+       n_listed = refresh_devices(&context, umount);
 
        if(n_listed || context.manager)
                gtk_widget_show_all(window);
@@ -1034,7 +1060,7 @@ int main(int argc, char **argv)
 
        gtk_main();
 
-       free_devices(devices);
+       free_devices(context.devices);
 
        return 0;
 }