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