[PATCH xf86-input-synaptics] syndaemon: enable touchpad when pressing a modifier combo
Anton Lindqvist
anton.lindqvist at gmail.com
Thu Aug 4 11:06:37 UTC 2016
Thanks for the feedback. Here's a revised patch trying to resolve the
issues. Should the new patch be re-submitted in a separate thread?
------------------------ >8 ------------------------
When ignoring modifiers, ensure the touchpad is enabled once a modifier
key is pressed disregarding any previous key press that caused the
touchpad to be disabled.
Signed-off-by: Anton Lindqvist <anton.lindqvist at gmail.com>
---
tools/syndaemon.c | 48 +++++++++++++++++++++++++++++++++++-------------
1 file changed, 35 insertions(+), 13 deletions(-)
diff --git a/tools/syndaemon.c b/tools/syndaemon.c
index 29e75f5..1d5ce1d 100644
--- a/tools/syndaemon.c
+++ b/tools/syndaemon.c
@@ -47,6 +47,12 @@
#include "synaptics-properties.h"
+enum KeyboardActivity {
+ ActivityNew,
+ ActivityNone,
+ ActivityReset
+};
+
enum TouchpadState {
TouchpadOn = 0,
TouchpadOff = 1,
@@ -181,29 +187,29 @@ install_signal_handler(void)
}
}
-/**
- * Return non-zero if the keyboard state has changed since the last call.
- */
-static int
+static enum KeyboardActivity
keyboard_activity(Display * display)
{
static unsigned char old_key_state[KEYMAP_SIZE];
unsigned char key_state[KEYMAP_SIZE];
int i;
- int ret = 0;
+ int ret = ActivityNone;
XQueryKeymap(display, (char *) key_state);
for (i = 0; i < KEYMAP_SIZE; i++) {
if ((key_state[i] & ~old_key_state[i]) & keyboard_mask[i]) {
- ret = 1;
+ ret = ActivityNew;
break;
}
}
if (ignore_modifier_combos) {
for (i = 0; i < KEYMAP_SIZE; i++) {
if (key_state[i] & ~keyboard_mask[i]) {
- ret = 0;
+ if (old_key_state[i] & ~keyboard_mask[i])
+ ret = ActivityNone;
+ else
+ ret = ActivityReset;
break;
}
}
@@ -232,8 +238,17 @@ main_loop(Display * display, double idle_time, int poll_delay)
for (;;) {
current_time = get_time();
- if (keyboard_activity(display))
- last_activity = current_time;
+ switch (keyboard_activity(display)) {
+ case ActivityNew:
+ last_activity = current_time;
+ break;
+ case ActivityNone:
+ /* NOP */;
+ break;
+ case ActivityReset:
+ last_activity = 0.0;
+ break;
+ }
/* If system times goes backwards, touchpad can get locked. Make
* sure our last activity wasn't in the future and reset if it was. */
@@ -423,6 +438,7 @@ record_main_loop(Display * display, double idle_time)
fd_set read_fds;
int ret;
int disable_event = 0;
+ int modifier_event = 0;
struct timeval timeout;
FD_ZERO(&read_fds);
@@ -454,9 +470,12 @@ record_main_loop(Display * display, double idle_time)
disable_event = 1;
}
- if (cbres.non_modifier_event &&
- !(ignore_modifier_combos && is_modifier_pressed(&cbres))) {
- disable_event = 1;
+ if (cbres.non_modifier_event) {
+ if (ignore_modifier_combos && is_modifier_pressed(&cbres)) {
+ modifier_event = 1;
+ } else {
+ disable_event = 1;
+ }
}
}
@@ -468,10 +487,13 @@ record_main_loop(Display * display, double idle_time)
toggle_touchpad(False);
}
+ if (modifier_event && pad_disabled) {
+ toggle_touchpad(True);
+ }
+
if (ret == 0 && pad_disabled) { /* timeout => enable event */
toggle_touchpad(True);
}
-
} /* end while(1) */
XFreeModifiermap(cbres.modifiers);
--
2.7.0
More information about the xorg-devel
mailing list