]> sigrok.org Git - sigrok-gtk.git/blobdiff - devselect.c
Update sigrok-gtk to latest APIs.
[sigrok-gtk.git] / devselect.c
index f664df82dc0987d8918d57ef401039677ea4714a..e1bb630f5ecbdc059fa4e41d665de30124086626 100644 (file)
@@ -29,32 +29,31 @@ static void dev_selected(GtkComboBox *devbox, GObject *parent)
        GtkTreeIter iter;
        const gchar *name;
        GtkCheckMenuItem *menuitem;
-       struct sr_dev *dev;
+       struct sr_dev_inst *sdi;
 
        if (!gtk_combo_box_get_active_iter(devbox, &iter)) {
-               g_object_set_data(parent, "dev", NULL);
+               g_object_set_data(parent, "sdi", NULL);
                return;
        }
-       gtk_tree_model_get(devlist, &iter, 0, &name, 1, &dev,
+       gtk_tree_model_get(devlist, &iter, 0, &name, 1, &sdi,
                                2, &menuitem, -1);
 
        gtk_check_menu_item_set_active(menuitem, TRUE);
 
        sr_session_dev_remove_all();
-       if (sr_session_dev_add(dev) != SR_OK) {
+       if (sr_session_dev_add(sdi) != SR_OK) {
                g_critical("Failed to use device.");
                sr_session_destroy();
-               dev = NULL;
+               sdi = NULL;
        }
-       g_object_set_data(parent, "dev", dev);
+       g_object_set_data(parent, "sdi", sdi);
 
        /*
         * Grey out the time unless the device is valid,
         * and it supports sample limiting
         */
-       const gboolean limit_samples = dev &&
-               sr_driver_hwcap_exists(dev->driver,
-               SR_HWCAP_LIMIT_SAMPLES);
+       const gboolean limit_samples = sdi &&
+               sr_driver_hwcap_exists(sdi->driver, SR_HWCAP_LIMIT_SAMPLES);
        gtk_widget_set_sensitive((GtkWidget*)timesamples, limit_samples);
        gtk_widget_set_sensitive((GtkWidget*)timeunit, limit_samples);
 }
@@ -77,24 +76,22 @@ static void dev_menuitem_toggled(GtkMenuItem *item, GtkComboBox *combo)
        } while (gtk_tree_model_iter_next(model, &iter));
 }
 
-#define GET_DEV_INST(dev) \
-       (dev)->driver->dev_info_get((dev)->driver_index, SR_DI_INST);
-
 void dev_select_rescan(GtkAction *action, GtkWindow *parent)
 {
        GtkComboBox *devbox = g_object_get_data(G_OBJECT(parent), "devcombo");
        g_return_if_fail(devbox != NULL);
        GtkListStore *devlist = GTK_LIST_STORE(gtk_combo_box_get_model(devbox));
        GtkTreeIter iter;
-       struct sr_dev *dev;
        const struct sr_dev_inst *sdi;
        gchar *sdevname = NULL;
-       GSList *devs, *l;
        GtkUIManager *ui = g_object_get_data(G_OBJECT(parent), "ui_manager");
        GtkWidget *menuitem = gtk_ui_manager_get_widget(ui,
                                        "/menubar/DevMenu/DevSelectMenu");
        GtkMenuShell *devmenu = GTK_MENU_SHELL(gtk_menu_item_get_submenu(GTK_MENU_ITEM(menuitem)));
        GSList *radiolist = NULL;
+       struct sr_dev_driver **drivers;
+       GSList *l, *tmpdevs, *devices;
+       int num_devs, i;
 
        (void)action;
 
@@ -102,9 +99,9 @@ void dev_select_rescan(GtkAction *action, GtkWindow *parent)
         * We wish to select the same device after the refresh if possible.
         */
        if (gtk_combo_box_get_active_iter(devbox, &iter)) {
-               gtk_tree_model_get(GTK_TREE_MODEL(devlist), &iter, 1, &dev, -1);
-               /* FIXME: Use something other than dev->driver->name */
-               sdevname = g_strdup(dev->driver->name);
+               gtk_tree_model_get(GTK_TREE_MODEL(devlist), &iter, 1, &sdi, -1);
+               /* FIXME: Use something other than sdi->driver->name */
+               sdevname = g_strdup(sdi->driver->name);
        }
 
        /* Destroy the old menu items */
@@ -117,13 +114,28 @@ void dev_select_rescan(GtkAction *action, GtkWindow *parent)
        gtk_list_store_clear(devlist);
 
        /* Scan for new devices and update our list */
-       /* TODO: Fix this in libsigrok first. */
-       /*sr_dev_scan();*/
-       devs = sr_dev_list();
-       for (l = devs; l; l = l->next) {
-               dev = l->data;
-               sdi = GET_DEV_INST(dev);
-               gchar *name = sdi->model ? sdi->model : sdi->vendor;
+#if 0
+       if (devices) {
+               /* TODO: tell drivers to clean up all instances */
+               g_free(devices);
+       }
+#endif
+       devices = NULL;
+
+       /* Scan all drivers for all devices. */
+       drivers = sr_driver_list();
+       for (i = 0; drivers[i]; i++) {
+               tmpdevs = sr_driver_scan(drivers[i], NULL);
+               for (l = tmpdevs; l; l = l->next)
+                       devices = g_slist_append(devices, l->data);
+               g_slist_free(tmpdevs);
+       }
+       num_devs = g_slist_length(devices);
+
+       for (i = 0; i < num_devs; ++i) {
+               sdi = (struct sr_dev_inst *)g_slist_nth_data(devices, i);
+
+               gchar *name = sdi->driver->name;
                if (!name)
                        name = "(unknown)";
 
@@ -139,11 +151,11 @@ void dev_select_rescan(GtkAction *action, GtkWindow *parent)
                gtk_list_store_append(devlist, &iter);
                gtk_list_store_set(devlist, &iter,
                                0, name,
-                               1, dev,
+                               1, sdi,
                                2, menuitem,
                                -1);
 
-               if (sdevname && g_str_equal(sdevname, dev->driver->name))
+               if (sdevname && g_str_equal(sdevname, sdi->driver->name))
                        gtk_combo_box_set_active_iter(devbox, &iter);
        }
        if (sdevname)