|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
From 6022343476982439dfc2e06bf54db78a0c8c6bff Mon Sep 17 00:00:00 2001
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
From: David Herrmann <dh.herrmann@gmail.com>
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
Date: Sat, 20 Sep 2014 12:34:43 +0200
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
Subject: [PATCH] terminal: always call _enable/_disable on evdev devices
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
The current pause/resume logic kinda intertwines the resume/pause and
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
enable/disable functions. Lets avoid that non-obvious behavior and always
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
make resume call into enable, and pause call into disable, if appropriate.
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
---
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
src/libsystemd-terminal/idev-evdev.c | 27 +++++++++++++++++----------
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
1 file changed, 17 insertions(+), 10 deletions(-)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
diff --git a/src/libsystemd-terminal/idev-evdev.c b/src/libsystemd-terminal/idev-evdev.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
index 18c48ee592..25ac849b8d 100644
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
--- a/src/libsystemd-terminal/idev-evdev.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+++ b/src/libsystemd-terminal/idev-evdev.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -49,6 +49,7 @@ struct idev_evdev {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
bool unsync : 1; /* not in-sync with kernel */
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
bool resync : 1; /* re-syncing with kernel */
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ bool running : 1;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
};
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
struct unmanaged_evdev {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -268,6 +269,12 @@ static void idev_evdev_enable(idev_evdev *evdev) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
assert(evdev->fd_src);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
assert(evdev->idle_src);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (evdev->running)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (evdev->fd < 0 || evdev->element.n_open < 1 || !evdev->element.enabled)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ evdev->running = true;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
sd_event_source_set_enabled(evdev->fd_src, SD_EVENT_ON);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
sd_event_source_set_enabled(evdev->idle_src, SD_EVENT_ONESHOT);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -277,6 +284,10 @@ static void idev_evdev_disable(idev_evdev *evdev) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
assert(evdev->fd_src);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
assert(evdev->idle_src);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (!evdev->running)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ evdev->running = false;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
sd_event_source_set_enabled(evdev->fd_src, SD_EVENT_OFF);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
sd_event_source_set_enabled(evdev->idle_src, SD_EVENT_OFF);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -288,9 +299,7 @@ static int idev_evdev_resume(idev_evdev *evdev, int dev_fd) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
if (fd < 0 || evdev->fd == fd) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
fd = -1;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- if (evdev->fd >= 0 && e->n_open > 0 && e->enabled)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- idev_evdev_enable(evdev);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ idev_evdev_enable(evdev);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
return 0;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -351,15 +360,14 @@ static int idev_evdev_resume(idev_evdev *evdev, int dev_fd) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
return r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- if (e->n_open < 1 || !e->enabled) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- sd_event_source_set_enabled(evdev->fd_src, SD_EVENT_OFF);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- sd_event_source_set_enabled(evdev->idle_src, SD_EVENT_OFF);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ sd_event_source_set_enabled(evdev->fd_src, SD_EVENT_OFF);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ sd_event_source_set_enabled(evdev->idle_src, SD_EVENT_OFF);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
evdev->unsync = true;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
evdev->fd = fd;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
fd = -1;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ idev_evdev_enable(evdev);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
return 0;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -371,12 +379,11 @@ static void idev_evdev_pause(idev_evdev *evdev, bool release) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
log_debug("idev-evdev: %s/%s: pause", e->session->name, e->name);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ idev_evdev_disable(evdev);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
if (release) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
evdev->idle_src = sd_event_source_unref(evdev->idle_src);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
evdev->fd_src = sd_event_source_unref(evdev->fd_src);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
evdev->fd = safe_close(evdev->fd);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- } else {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- idev_evdev_disable(evdev);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|