From 9beddc685fe2eddfd2a6435e480dc546dd4f70ac Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Thu, 22 Mar 2007 20:25:51 +1030 Subject: + scan the pairings when new devices are connected, remember pairing in keyboard device. + set the device focus when clicking on a titlebar, finally be able to use multiple keyboards properly. --- Changelog | 6 ++++++ src/DockKeyboard.cpp | 1 + src/KeyboardDevice.cpp | 1 + src/KeyboardDevice.h | 5 +++++ src/Makefile | 2 +- src/Manager.cpp | 26 ++++++++++++++++++++++++++ src/Manager.h | 1 + 7 files changed, 41 insertions(+), 1 deletion(-) diff --git a/Changelog b/Changelog index 4e927fe..bde1867 100644 --- a/Changelog +++ b/Changelog @@ -1,3 +1,9 @@ +22.03.2007 ++ scan the pairings when new devices are connected, remember pairing in +keyboard device. ++ set the device focus when clicking on a titlebar, finally be able to use +multiple keyboards properly. + 20.03.2007 o Make dock buttons listen to device button presses. o Pair devices on button press on a keyboard in the dock. diff --git a/src/DockKeyboard.cpp b/src/DockKeyboard.cpp index ac25c54..a9fa5f0 100644 --- a/src/DockKeyboard.cpp +++ b/src/DockKeyboard.cpp @@ -35,4 +35,5 @@ void DockKeyboard::handleButtonEvent(PointerDevice* ptr, { TRACE("Pairing %s with %s\n", ptr->getName().c_str(), kbd->getName().c_str()); XChangePointerKeyboardPairing(x11->dpy, ptr->getDevice(), kbd->getDevice()); + kbd->setPaired(ptr); } diff --git a/src/KeyboardDevice.cpp b/src/KeyboardDevice.cpp index 22248f8..3cfaac3 100644 --- a/src/KeyboardDevice.cpp +++ b/src/KeyboardDevice.cpp @@ -14,5 +14,6 @@ KeyboardDevice::KeyboardDevice(XDeviceInfo* dev, XConn* x11, Manager* manager) this->name = string(dev->name); this->id = dev->id; this->dev = d; + this->paired = NULL; TRACE("Keyboard %d (%s) initialised\n", kbdID, dev->name); } diff --git a/src/KeyboardDevice.h b/src/KeyboardDevice.h index 845a0b6..ed0ded9 100644 --- a/src/KeyboardDevice.h +++ b/src/KeyboardDevice.h @@ -4,6 +4,7 @@ #include #include #include +#include #include "DeviceError.h" #include "logger.h" #include "XConn.h" @@ -11,6 +12,7 @@ using namespace std; class Manager; +class PointerDevice; class KeyboardDevice { @@ -23,12 +25,15 @@ class KeyboardDevice int id; string name; XDevice* dev; + PointerDevice* paired; public: KeyboardDevice(XDeviceInfo* device, XConn* x11, Manager* manager); int getID() { return id; } string getName() { return name; } XDevice* getDevice() { return dev; } + void setPaired(PointerDevice* ptr) { paired = ptr; } + PointerDevice* getPaired() { return paired; } }; #endif diff --git a/src/Makefile b/src/Makefile index 8d868ba..5585bbe 100644 --- a/src/Makefile +++ b/src/Makefile @@ -2,7 +2,7 @@ APPNAME=mpwm PREFIX=/opt/MPX CC=g++ LIBDIR=-L/opt/MPX/lib -LIBS=-lX11 -lXi -lXext -lMagick++ -lXcursor -lcairo +LIBS=-lX11 -lXi -lXext -lXcursor -lcairo INCLUDES=-I/opt/MPX/include/ -I/usr/include/cairo/ OBJ= XConn.o\ Config.o \ diff --git a/src/Manager.cpp b/src/Manager.cpp index 27c697d..474c319 100644 --- a/src/Manager.cpp +++ b/src/Manager.cpp @@ -151,6 +151,8 @@ void Manager::initXi() dock->setPointerEvents(&pointers); XFreeDeviceList(devices); + rescanPairings(); + if (!XGrabAccessControl(x11->dpy)) { ERR("Could not grab access control.This is bad.\n"); @@ -159,6 +161,21 @@ void Manager::initXi() XSelectExtensionEvent(x11->dpy, x11->root, &x11->presence_class, 1); } +void Manager::rescanPairings() +{ + vector::const_iterator it = keyboards.begin(); + int ptr_id; + while(it != keyboards.end()) + { + if (XGetPairedPointer(x11->dpy, (*it)->getDevice(), &ptr_id)) + { + (*it)->setPaired(idToPointerDevice(ptr_id)); + } + it++; + } + +} + /** * Disconnect from X and bring down any allocated memory. */ @@ -620,6 +637,14 @@ void Manager::handleButtonPress(XDeviceButtonEvent* bev) if (wmwindow->isResizeBar(bev->window) || wmwindow->isWindowBar(bev->window)) { XSetClientPointer(x11->dpy, wmwindow->getClientWindow(), (char)bev->deviceid); + vector::const_iterator it = keyboards.begin(); + while(it != keyboards.end()) + { + if ((*it)->getPaired() == dev) + XSetDeviceFocus(x11->dpy, (*it)->getDevice(), + wmwindow->getClientWindow(), PointerRoot, CurrentTime); + it++; + } raiseWindow(wmwindow); } @@ -781,6 +806,7 @@ void Manager::handlePresenceNotify(XDevicePresenceNotifyEvent* ev) keyboards.push_back(k); dock->appendKeyboard(k); dock->setPointerEvents(&pointers); + rescanPairings(); } catch (DeviceError* e) { ERR("%s\n", e->message.c_str()); diff --git a/src/Manager.h b/src/Manager.h index a1e663b..6105847 100644 --- a/src/Manager.h +++ b/src/Manager.h @@ -78,6 +78,7 @@ class Manager WMWindow* windowToWMWindow(Window w); WMWindow* xyToWMWindow(int x, int y); void raiseWindow(WMWindow* wmwindow); + void rescanPairings(); /* event processing routines */ void handleCreateNotify(XCreateWindowEvent* ev); -- cgit v1.2.3