[PATCH xf86-input-synaptics] syndaemon: enable touchpad when pressing a modifier combo
Peter Hutterer
peter.hutterer at who-t.net
Thu Aug 4 22:17:17 UTC 2016
On Thu, Aug 04, 2016 at 01:06:37PM +0200, Anton Lindqvist wrote:
> 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?
sticking it in the same thread makes them easier to associate, but for next
time please add a v2, v3, etc. right after PATCH
>
> ------------------------ >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>
> ---
fwiw, if you write the general comments here, after the --- then git am will
automatically remove it and there's no need to get the scissors out.
> 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;
all the record bits have tabs instead of spaces. I fixed that up locally,
but...
> 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;
this doesn't work the same way. in poll mode, any modifier will re-enable
the touchpad immediately. but this path is only hit for the non-modifier
keys while a modifer is down.
- press a
- touchpad is disabled
- press shift
poll mode: touchpad re-enables
record mode: no change
- press s
poll mode: no change
record mode: touchpad re-enables
- release keys, touchpad remains enabled
I can't quite decide which one is the more sensible behaviour but I think
more compatible with normal -k mode would be the your poll mode one so let's
stick with that. Please make sure both behave the same.
Cheers,
Peter
> + } 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