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