diff options
author | Peter Hutterer <peter@cs.unisa.edu.au> | 2007-03-22 20:25:51 +1030 |
---|---|---|
committer | Peter Hutterer <peter@cs.unisa.edu.au> | 2007-03-22 20:25:51 +1030 |
commit | 9beddc685fe2eddfd2a6435e480dc546dd4f70ac (patch) | |
tree | badb3f7d566a68d508de11c7f0e5b81173300b33 | |
parent | fb6506f02550fd5255c19d3c2215f23eca1423c3 (diff) |
+ 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.
-rw-r--r-- | Changelog | 6 | ||||
-rw-r--r-- | src/DockKeyboard.cpp | 1 | ||||
-rw-r--r-- | src/KeyboardDevice.cpp | 1 | ||||
-rw-r--r-- | src/KeyboardDevice.h | 5 | ||||
-rw-r--r-- | src/Makefile | 2 | ||||
-rw-r--r-- | src/Manager.cpp | 26 | ||||
-rw-r--r-- | src/Manager.h | 1 |
7 files changed, 41 insertions, 1 deletions
@@ -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<X11/Xlib.h> #include<X11/extensions/XInput.h> #include<string> +#include<vector> #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<KeyboardDevice*>::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<KeyboardDevice*>::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); |