commit 9b58165

Michael Forney  ·  2013-12-04 05:49:42 +0000 UTC
parent 80e62f6
evdev_device: Add reopen function
4 files changed,  +43, -0
+31, -0
 1@@ -160,6 +160,9 @@ struct swc_evdev_device * swc_evdev_device_new
 2         goto error1;
 3     }
 4 
 5+    if (!(device->path = strdup(path)))
 6+        goto error2;
 7+
 8     DEBUG("Adding device %s\n", libevdev_get_name(device->dev));
 9 
10     device->handler = handler;
11@@ -184,6 +187,8 @@ struct swc_evdev_device * swc_evdev_device_new
12 
13     return device;
14 
15+  error2:
16+    libevdev_free(device->dev);
17   error1:
18     close(device->fd);
19   error0:
20@@ -195,6 +200,7 @@ void swc_evdev_device_destroy(struct swc_evdev_device * device)
21     wl_event_source_remove(device->source);
22     libevdev_free(device->dev);
23     close(device->fd);
24+    free(device->path);
25     free(device);
26 }
27 
28@@ -207,3 +213,28 @@ void swc_evdev_device_add_event_sources(struct swc_evdev_device * device,
29                                handle_data, device);
30 }
31 
32+bool swc_evdev_device_reopen(struct swc_evdev_device * device)
33+{
34+    close(device->fd);
35+
36+    device->fd = swc_launch_open_device(device->path,
37+                                        O_RDWR | O_NONBLOCK | O_CLOEXEC);
38+
39+    if (device->fd == -1)
40+    {
41+        ERROR("Failed to open input device at %s\n", device->path);
42+        goto error0;
43+    }
44+
45+    if (libevdev_change_fd(device->dev, device->fd) == -1)
46+    {
47+        ERROR("Failed to update libevdev fd\n");
48+        goto error1;
49+    }
50+
51+  error1:
52+    close(device->fd);
53+  error0:
54+    return false;
55+}
56+
+3, -0
 1@@ -18,6 +18,7 @@ struct swc_evdev_device_handler
 2 
 3 struct swc_evdev_device
 4 {
 5+    char * path;
 6     int fd;
 7     struct libevdev * dev;
 8 
 9@@ -57,5 +58,7 @@ void swc_evdev_device_destroy(struct swc_evdev_device * device);
10 void swc_evdev_device_add_event_sources(struct swc_evdev_device * device,
11                                         struct wl_event_loop * event_loop);
12 
13+bool swc_evdev_device_reopen(struct swc_evdev_device * device);
14+
15 #endif
16 
+8, -0
 1@@ -274,3 +274,11 @@ void swc_seat_finalize()
 2     wl_global_destroy(seat.global);
 3 }
 4 
 5+void swc_seat_reopen_devices()
 6+{
 7+    struct swc_evdev_device * device;
 8+
 9+    wl_list_for_each(device, &seat.devices, link)
10+        swc_evdev_device_reopen(device);
11+}
12+
+1, -0
1@@ -35,6 +35,7 @@ struct swc_seat_global
2 
3 bool swc_seat_initialize();
4 void swc_seat_finalize();
5+void swc_seat_reopen_devices();
6 
7 #endif
8