summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter@cs.unisa.edu.au>2007-03-22 20:25:51 +1030
committerPeter Hutterer <peter@cs.unisa.edu.au>2007-03-22 20:25:51 +1030
commit9beddc685fe2eddfd2a6435e480dc546dd4f70ac (patch)
treebadb3f7d566a68d508de11c7f0e5b81173300b33
parentfb6506f02550fd5255c19d3c2215f23eca1423c3 (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--Changelog6
-rw-r--r--src/DockKeyboard.cpp1
-rw-r--r--src/KeyboardDevice.cpp1
-rw-r--r--src/KeyboardDevice.h5
-rw-r--r--src/Makefile2
-rw-r--r--src/Manager.cpp26
-rw-r--r--src/Manager.h1
7 files changed, 41 insertions, 1 deletions
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<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);