tools: keep a list of devices around for run-time changes
authorPeter Hutterer <peter.hutterer@who-t.net>
Thu, 3 Jul 2014 22:56:44 +0000 (08:56 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Tue, 23 Sep 2014 00:46:40 +0000 (10:46 +1000)
Hard-coded to 50 devices, because for a debugging tool that's plenty.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
tools/event-gui.c

index 3ef3005..fcae236 100644 (file)
@@ -67,6 +67,8 @@ struct window {
 
        /* l/m/r mouse buttons */
        int l, m, r;
+
+       struct libinput_device *devices[50];
 };
 
 static int
@@ -212,10 +214,23 @@ window_init(struct window *w)
 }
 
 static void
+window_cleanup(struct window *w)
+{
+       struct libinput_device **dev;
+       ARRAY_FOR_EACH(w->devices, dev) {
+               if (*dev)
+                       libinput_device_unref(*dev);
+       }
+}
+
+static void
 handle_event_device_notify(struct libinput_event *ev)
 {
        struct libinput_device *dev = libinput_event_get_device(ev);
+       struct libinput *li;
+       struct window *w;
        const char *type;
+       int i;
 
        if (libinput_event_get_type(ev) == LIBINPUT_EVENT_DEVICE_ADDED)
                type = "added";
@@ -232,6 +247,26 @@ handle_event_device_notify(struct libinput_event *ev)
                        error("%s: Failed to enable tapping\n",
                              libinput_device_get_sysname(dev));
        }
+
+       li = libinput_event_get_context(ev);
+       w = libinput_get_user_data(li);
+
+       if (libinput_event_get_type(ev) == LIBINPUT_EVENT_DEVICE_ADDED) {
+               for (i = 0; i < ARRAY_LENGTH(w->devices); i++) {
+                       if (w->devices[i] == NULL) {
+                               w->devices[i] = libinput_device_ref(dev);
+                               break;
+                       }
+               }
+       } else  {
+               for (i = 0; i < ARRAY_LENGTH(w->devices); i++) {
+                       if (w->devices[i] == dev) {
+                               libinput_device_unref(w->devices[i]);
+                               w->devices[i] = NULL;
+                               break;
+                       }
+               }
+       }
 }
 
 static void
@@ -474,6 +509,7 @@ main(int argc, char *argv[])
 
        gtk_main();
 
+       window_cleanup(&w);
        libinput_unref(li);
        udev_unref(udev);