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..9a54a741 100644 --- a/handler.cc +++ b/handler.cc @@ -281,6 +281,17 @@ 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 = 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)); break; case XI_Motion: @@ -968,6 +979,13 @@ 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 + 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); else