From 7b69293d39d724ef2cc1d4130b0b3fb984da3f6e Mon Sep 17 00:00:00 2001 From: nouser Date: Sat, 16 Feb 2019 15:47:24 +0200 Subject: [PATCH 1/3] added experimental support for grabbing the extra buttons on disabled devices, and faking the last extra button of a disabled device as the default button. The basic idea is to allow using button 1 for touch screens but still allow disabling mouse gestures for button 1, but still allow default gestures with another mouse button. --- allow_disabled_extra_buttons.patch | 56 ++++++++++++++++++++++++++++++ grabber.cc | 16 ++++++--- handler.cc | 13 +++++++ 3 files changed, 81 insertions(+), 4 deletions(-) create mode 100644 allow_disabled_extra_buttons.patch diff --git a/allow_disabled_extra_buttons.patch b/allow_disabled_extra_buttons.patch new file mode 100644 index 00000000..328e2936 --- /dev/null +++ b/allow_disabled_extra_buttons.patch @@ -0,0 +1,56 @@ +diff -Naru src-orig/grabber.cc src-mod/grabber.cc +--- src-orig/grabber.cc 2013-03-27 17:52:38.000000000 +0200 ++++ src-mod/grabber.cc 2019-02-16 15:28:14.733994066 +0200 +@@ -424,10 +424,18 @@ + if (!xi_grabbed == !grab) + return; + xi_grabbed = grab; +- for (DeviceMap::iterator i = xi_devs.begin(); i != xi_devs.end(); ++i) +- if (i->second->active) +- for (std::vector::iterator j = buttons.begin(); j != buttons.end(); j++) +- i->second->grab_button(*j, grab); ++ if (! experimental) { //standard behaviour; only grab enabled devices ++ for (DeviceMap::iterator i = xi_devs.begin(); i != xi_devs.end(); ++i) ++ if (i->second->active) ++ for (std::vector::iterator j = buttons.begin(); j != buttons.end(); j++) ++ i->second->grab_button(*j, grab ); ++ } ++ else { //modified behaviour; also grab additional buttons of disabled devices ++ for (DeviceMap::iterator i = xi_devs.begin(); i != xi_devs.end(); ++i) ++ for (std::vector::iterator j = buttons.begin(); j != buttons.end(); j++) ++ if (i->second->active || j!=buttons.begin() ) ++ i->second->grab_button(*j, grab ); ++ } + } + + void Grabber::XiDevice::grab_device(GrabState grab) { +diff -Naru src-orig/handler.cc src-mod/handler.cc +--- src-orig/handler.cc 2019-02-16 02:15:45.324375909 +0200 ++++ src-mod/handler.cc 2019-02-16 15:33:46.584957312 +0200 +@@ -283,6 +283,16 @@ + break; + xinput_pressed.erase(event->detail); + in_proximity = get_axis(event->valuators, current_dev->proximity_axis); ++ ++ if (experimental) //if device is disabled, but extra buttons followed, treat last extra button as the default button ++ for (std::set::iterator i = prefs.excluded_devices.ref().begin(); i != prefs.excluded_devices.ref().end(); i++) ++ if (! i->compare(grabber->get_xi_dev(event->deviceid)->name) ) //check if the grabbed device name is in disabled device list ++ { ++ ++ if ( prefs.extra_buttons.ref().size() && (guint) event->detail == prefs.extra_buttons.ref().rbegin()->button) //check if the button is same as last extra button ++ event->detail = prefs.button.ref().button; //fake the default button ++ } ++ + H->release(event->detail, create_triple(event->root_x, event->root_y, event->time)); + break; + case XI_Motion: +@@ -969,6 +979,9 @@ + virtual void release(guint b, RTriple e) { + RStroke s = finish(0); + ++ if (experimental) //button 1 should be treated as trigger 0, other trigger buttons copied from the event button b itself ++ s->trigger = b>1 ? b : 0 ; ++ + if (prefs.move_back.get() && !xstate->current_dev->absolute) + XTestFakeMotionEvent(dpy, DefaultScreen(dpy), orig->x, orig->y, 0); + else diff --git a/grabber.cc b/grabber.cc index 3e8512f0..229286c0 100644 --- a/grabber.cc +++ b/grabber.cc @@ -424,10 +424,18 @@ void Grabber::grab_xi(bool grab) { if (!xi_grabbed == !grab) return; xi_grabbed = grab; - for (DeviceMap::iterator i = xi_devs.begin(); i != xi_devs.end(); ++i) - if (i->second->active) - for (std::vector::iterator j = buttons.begin(); j != buttons.end(); j++) - i->second->grab_button(*j, grab); + if (! experimental) { //standard behaviour; only grab enabled devices + for (DeviceMap::iterator i = xi_devs.begin(); i != xi_devs.end(); ++i) + if (i->second->active) + for (std::vector::iterator j = buttons.begin(); j != buttons.end(); j++) + i->second->grab_button(*j, grab ); + } + else { //modified behaviour; also grab additional buttons of disabled devices + for (DeviceMap::iterator i = xi_devs.begin(); i != xi_devs.end(); ++i) + for (std::vector::iterator j = buttons.begin(); j != buttons.end(); j++) + if (i->second->active || j!=buttons.begin() ) + i->second->grab_button(*j, grab ); + } } void Grabber::XiDevice::grab_device(GrabState grab) { diff --git a/handler.cc b/handler.cc index 8830ea28..75fa1cba 100644 --- a/handler.cc +++ b/handler.cc @@ -281,6 +281,16 @@ void XState::handle_xi2_event(XIDeviceEvent *event) { break; xinput_pressed.erase(event->detail); in_proximity = get_axis(event->valuators, current_dev->proximity_axis); + + if (experimental) //if device is disabled, but extra buttons followed, treat last extra button as the default button + for (std::set::iterator i = prefs.excluded_devices.ref().begin(); i != prefs.excluded_devices.ref().end(); i++) + if (! i->compare(grabber->get_xi_dev(event->deviceid)->name) ) //check if the grabbed device name is in disabled device list + { + + if ( prefs.extra_buttons.ref().size() && (guint) event->detail == prefs.extra_buttons.ref().rbegin()->button) //check if the button is same as last extra button + event->detail = prefs.button.ref().button; //fake the default button + } + H->release(event->detail, create_triple(event->root_x, event->root_y, event->time)); break; case XI_Motion: @@ -968,6 +978,9 @@ class StrokeHandler : public Handler, public sigc::trackable { virtual void release(guint b, RTriple e) { RStroke s = finish(0); + if (experimental) //button 1 should be treated as trigger 0, other trigger buttons copied from the event button b itself + s->trigger = b>1 ? b : 0 ; + if (prefs.move_back.get() && !xstate->current_dev->absolute) XTestFakeMotionEvent(dpy, DefaultScreen(dpy), orig->x, orig->y, 0); else From 453796c3efc811a2bffb31fc21f18d735aaea47c Mon Sep 17 00:00:00 2001 From: nouser Date: Sat, 16 Feb 2019 16:43:37 +0200 Subject: [PATCH 2/3] fixed button press not passing through if gesture was not detected --- allow_disabled_extra_buttons.patch | 86 +++++++++++++++--------------- handler.cc | 9 +++- 2 files changed, 50 insertions(+), 45 deletions(-) diff --git a/allow_disabled_extra_buttons.patch b/allow_disabled_extra_buttons.patch index 328e2936..af15dd47 100644 --- a/allow_disabled_extra_buttons.patch +++ b/allow_disabled_extra_buttons.patch @@ -1,56 +1,56 @@ -diff -Naru src-orig/grabber.cc src-mod/grabber.cc ---- src-orig/grabber.cc 2013-03-27 17:52:38.000000000 +0200 -+++ src-mod/grabber.cc 2019-02-16 15:28:14.733994066 +0200 -@@ -424,10 +424,18 @@ - if (!xi_grabbed == !grab) - return; - xi_grabbed = grab; -- for (DeviceMap::iterator i = xi_devs.begin(); i != xi_devs.end(); ++i) -- if (i->second->active) -- for (std::vector::iterator j = buttons.begin(); j != buttons.end(); j++) -- i->second->grab_button(*j, grab); -+ if (! experimental) { //standard behaviour; only grab enabled devices -+ for (DeviceMap::iterator i = xi_devs.begin(); i != xi_devs.end(); ++i) -+ if (i->second->active) -+ for (std::vector::iterator j = buttons.begin(); j != buttons.end(); j++) -+ i->second->grab_button(*j, grab ); -+ } -+ else { //modified behaviour; also grab additional buttons of disabled devices -+ for (DeviceMap::iterator i = xi_devs.begin(); i != xi_devs.end(); ++i) -+ for (std::vector::iterator j = buttons.begin(); j != buttons.end(); j++) -+ if (i->second->active || j!=buttons.begin() ) -+ i->second->grab_button(*j, grab ); -+ } - } - - void Grabber::XiDevice::grab_device(GrabState grab) { diff -Naru src-orig/handler.cc src-mod/handler.cc ---- src-orig/handler.cc 2019-02-16 02:15:45.324375909 +0200 -+++ src-mod/handler.cc 2019-02-16 15:33:46.584957312 +0200 -@@ -283,6 +283,16 @@ +--- src-orig/handler.cc 2019-02-16 16:10:30.158007582 +0200 ++++ src-mod/handler.cc 2019-02-16 16:32:26.005219510 +0200 +@@ -290,7 +290,8 @@ + { + + if ( prefs.extra_buttons.ref().size() && (guint) event->detail == prefs.extra_buttons.ref().rbegin()->button) //check if the button is same as last extra button +- event->detail = prefs.button.ref().button; //fake the default button ++ event->detail = 100+event->detail; //fake the default button ++ //event->detail = prefs.button.ref().button; //fake the default button + } + + H->release(event->detail, create_triple(event->root_x, event->root_y, event->time)); +@@ -980,7 +981,11 @@ + RStroke s = finish(0); + + if (experimental) //button 1 should be treated as trigger 0, other trigger buttons copied from the event button b itself +- s->trigger = b>1 ? b : 0 ; ++ if (b>100) ++ { ++ b=b-100; ++ s->trigger = prefs.button.ref().button-1; ++ } + + if (prefs.move_back.get() && !xstate->current_dev->absolute) + XTestFakeMotionEvent(dpy, DefaultScreen(dpy), orig->x, orig->y, 0); +diff -Naru src-orig/handler.cc.orig src-mod/handler.cc.orig +--- src-orig/handler.cc.orig 2019-02-16 16:10:30.158007582 +0200 ++++ src-mod/handler.cc.orig 2013-03-27 17:52:38.000000000 +0200 +@@ -281,16 +281,6 @@ break; xinput_pressed.erase(event->detail); in_proximity = get_axis(event->valuators, current_dev->proximity_axis); -+ -+ if (experimental) //if device is disabled, but extra buttons followed, treat last extra button as the default button -+ for (std::set::iterator i = prefs.excluded_devices.ref().begin(); i != prefs.excluded_devices.ref().end(); i++) -+ if (! i->compare(grabber->get_xi_dev(event->deviceid)->name) ) //check if the grabbed device name is in disabled device list -+ { -+ -+ if ( prefs.extra_buttons.ref().size() && (guint) event->detail == prefs.extra_buttons.ref().rbegin()->button) //check if the button is same as last extra button -+ event->detail = prefs.button.ref().button; //fake the default button -+ } -+ +- +- if (experimental) //if device is disabled, but extra buttons followed, treat last extra button as the default button +- for (std::set::iterator i = prefs.excluded_devices.ref().begin(); i != prefs.excluded_devices.ref().end(); i++) +- if (! i->compare(grabber->get_xi_dev(event->deviceid)->name) ) //check if the grabbed device name is in disabled device list +- { +- +- if ( prefs.extra_buttons.ref().size() && (guint) event->detail == prefs.extra_buttons.ref().rbegin()->button) //check if the button is same as last extra button +- event->detail = prefs.button.ref().button; //fake the default button +- } +- H->release(event->detail, create_triple(event->root_x, event->root_y, event->time)); break; case XI_Motion: -@@ -969,6 +979,9 @@ +@@ -979,9 +969,6 @@ virtual void release(guint b, RTriple e) { RStroke s = finish(0); -+ if (experimental) //button 1 should be treated as trigger 0, other trigger buttons copied from the event button b itself -+ s->trigger = b>1 ? b : 0 ; -+ +- if (experimental) //button 1 should be treated as trigger 0, other trigger buttons copied from the event button b itself +- s->trigger = b>1 ? b : 0 ; +- if (prefs.move_back.get() && !xstate->current_dev->absolute) XTestFakeMotionEvent(dpy, DefaultScreen(dpy), orig->x, orig->y, 0); else diff --git a/handler.cc b/handler.cc index 75fa1cba..9a54a741 100644 --- a/handler.cc +++ b/handler.cc @@ -288,7 +288,8 @@ void XState::handle_xi2_event(XIDeviceEvent *event) { { if ( prefs.extra_buttons.ref().size() && (guint) event->detail == prefs.extra_buttons.ref().rbegin()->button) //check if the button is same as last extra button - event->detail = prefs.button.ref().button; //fake the default button + event->detail = 100+event->detail; //fake the default button + //event->detail = prefs.button.ref().button; //fake the default button } H->release(event->detail, create_triple(event->root_x, event->root_y, event->time)); @@ -979,7 +980,11 @@ class StrokeHandler : public Handler, public sigc::trackable { RStroke s = finish(0); if (experimental) //button 1 should be treated as trigger 0, other trigger buttons copied from the event button b itself - s->trigger = b>1 ? b : 0 ; + if (b>100) + { + b=b-100; + s->trigger = prefs.button.ref().button-1; + } if (prefs.move_back.get() && !xstate->current_dev->absolute) XTestFakeMotionEvent(dpy, DefaultScreen(dpy), orig->x, orig->y, 0); From ece68e05aa31335f0b8bb7fde14a594e93bc5684 Mon Sep 17 00:00:00 2001 From: nouser Date: Sat, 16 Feb 2019 17:00:09 +0200 Subject: [PATCH 3/3] deleted the unnecessary patch --- allow_disabled_extra_buttons.patch | 56 ------------------------------ 1 file changed, 56 deletions(-) delete mode 100644 allow_disabled_extra_buttons.patch diff --git a/allow_disabled_extra_buttons.patch b/allow_disabled_extra_buttons.patch deleted file mode 100644 index af15dd47..00000000 --- a/allow_disabled_extra_buttons.patch +++ /dev/null @@ -1,56 +0,0 @@ -diff -Naru src-orig/handler.cc src-mod/handler.cc ---- src-orig/handler.cc 2019-02-16 16:10:30.158007582 +0200 -+++ src-mod/handler.cc 2019-02-16 16:32:26.005219510 +0200 -@@ -290,7 +290,8 @@ - { - - if ( prefs.extra_buttons.ref().size() && (guint) event->detail == prefs.extra_buttons.ref().rbegin()->button) //check if the button is same as last extra button -- event->detail = prefs.button.ref().button; //fake the default button -+ event->detail = 100+event->detail; //fake the default button -+ //event->detail = prefs.button.ref().button; //fake the default button - } - - H->release(event->detail, create_triple(event->root_x, event->root_y, event->time)); -@@ -980,7 +981,11 @@ - RStroke s = finish(0); - - if (experimental) //button 1 should be treated as trigger 0, other trigger buttons copied from the event button b itself -- s->trigger = b>1 ? b : 0 ; -+ if (b>100) -+ { -+ b=b-100; -+ s->trigger = prefs.button.ref().button-1; -+ } - - if (prefs.move_back.get() && !xstate->current_dev->absolute) - XTestFakeMotionEvent(dpy, DefaultScreen(dpy), orig->x, orig->y, 0); -diff -Naru src-orig/handler.cc.orig src-mod/handler.cc.orig ---- src-orig/handler.cc.orig 2019-02-16 16:10:30.158007582 +0200 -+++ src-mod/handler.cc.orig 2013-03-27 17:52:38.000000000 +0200 -@@ -281,16 +281,6 @@ - break; - xinput_pressed.erase(event->detail); - in_proximity = get_axis(event->valuators, current_dev->proximity_axis); -- -- if (experimental) //if device is disabled, but extra buttons followed, treat last extra button as the default button -- for (std::set::iterator i = prefs.excluded_devices.ref().begin(); i != prefs.excluded_devices.ref().end(); i++) -- if (! i->compare(grabber->get_xi_dev(event->deviceid)->name) ) //check if the grabbed device name is in disabled device list -- { -- -- if ( prefs.extra_buttons.ref().size() && (guint) event->detail == prefs.extra_buttons.ref().rbegin()->button) //check if the button is same as last extra button -- event->detail = prefs.button.ref().button; //fake the default button -- } -- - H->release(event->detail, create_triple(event->root_x, event->root_y, event->time)); - break; - case XI_Motion: -@@ -979,9 +969,6 @@ - virtual void release(guint b, RTriple e) { - RStroke s = finish(0); - -- if (experimental) //button 1 should be treated as trigger 0, other trigger buttons copied from the event button b itself -- s->trigger = b>1 ? b : 0 ; -- - if (prefs.move_back.get() && !xstate->current_dev->absolute) - XTestFakeMotionEvent(dpy, DefaultScreen(dpy), orig->x, orig->y, 0); - else