summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2009-07-28 16:53:51 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2009-07-30 08:43:13 +1000
commita148d407429c7d13136b3fcafd2d279c5438df73 (patch)
tree067e82d7d3d08496a4c70d7a832fdf8b6d53bc79
parent3d3b8babd1a5407082f1a40875ed69f62ba2153f (diff)
xkb: restore XKB PtrBtn actions.
Ifdef'd out since the switch to internal events. PtrBtn actions now work again. Instead of generating the event directly, GPE generates the event and it is then posted through the usual event processing routines (mieqProcessDeviceEvent). Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r--xkb/ddxDevBtn.c107
1 files changed, 26 insertions, 81 deletions
diff --git a/xkb/ddxDevBtn.c b/xkb/ddxDevBtn.c
index e735fdec8..94630d1c9 100644
--- a/xkb/ddxDevBtn.c
+++ b/xkb/ddxDevBtn.c
@@ -35,98 +35,43 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include "inputstr.h"
#include "scrnintstr.h"
#include "windowstr.h"
+#include "eventstr.h"
#include <xkbsrv.h>
+#include "mi.h"
#include <X11/extensions/XI.h>
#include <X11/extensions/XIproto.h>
-extern int DeviceValuator;
-
-static EventListPtr masterEvents = NULL;
-
void
XkbDDXFakeDeviceButton(DeviceIntPtr dev,Bool press,int button)
{
-int * devVal;
-INT32 * evVal;
-xEvent events[2];
-deviceKeyButtonPointer *btn;
-deviceValuator * val;
-int x,y;
-int nAxes, i, count;
-DeviceIntPtr master = NULL;
-
- if (dev == inputInfo.pointer || !dev->public.on)
- return;
-
- ErrorF("[xkb] XkbDDXFakeDeviceButton. If you read this message in your "
- "log file, Please file a bug on bugs.freedesktop.org.\n");
-#if 0
- nAxes = (dev->valuator?dev->valuator->numAxes:0);
- if (nAxes > 6)
- nAxes = 6;
-
- GetSpritePosition(dev, &x,&y);
- btn= (deviceKeyButtonPointer *) &events[0];
- val= (deviceValuator *) &events[1];
- if (press) btn->type= DeviceButtonPress;
- else btn->type= DeviceButtonRelease;
- btn->detail= button;
- btn->time= GetTimeInMillis();
- btn->root_x= x;
- btn->root_y= y;
- btn->deviceid= dev->id;
- count= 1;
- if (nAxes>0) {
- btn->deviceid|= 0x80;
- val->type = DeviceValuator;
- val->deviceid = dev->id;
- val->first_valuator = 0;
+ EventListPtr events;
+ int nevents, i;
+ DeviceIntPtr ptr;
- evVal= &val->valuator0;
- devVal= dev->valuator->axisVal;
- for (i=nAxes;i>0;i--) {
- *evVal++ = *devVal++;
- if (evVal > &val->valuator5) {
- int tmp = val->first_valuator+6;
- val->num_valuators = 6;
- val++;
- evVal= &val->valuator0;
- val->first_valuator= tmp;
- }
- }
- if ((nAxes % 6) != 0) {
- val->num_valuators = (nAxes % 6);
- }
- count= 1+((nAxes+5)/6);
- }
-
- /* XXX: This is obnoxious. ProcessOtherEvent updates the DIX device state,
- * but may not do anything if the device state is invalid. This happens if
- * we post a mouse event from a pure keyboard device. So we need to hack
- * around that by getting the master, then posting the event for the
- * pointer paired with the master.
+ /* If dev is a slave device, and the SD is attached, do nothing. If we'd
+ * post through the attached master pointer we'd get duplicate events.
+ *
+ * if dev is a master keyboard, post through the master pointer.
*
- * Note:the DeviceButtonEvent on the SD itself will do nothing in most
- * cases, unless dev is both a keyboard and a mouse.
+ * if dev is a floating slave, post through the device itself.
*/
- if (!dev->isMaster && dev->u.master) {
- if (!masterEvents)
- {
- masterEvents = InitEventList(1);
- SetMinimumEventSize(masterEvents, 1, (1 + MAX_VALUATOR_EVENTS) * sizeof(xEvent));
- }
- master = dev->u.master;
- if (!IsPointerDevice(master))
- master = GetPairedDevice(dev->u.master);
- CopyGetMasterEvent(master, dev, events, masterEvents, count);
- }
+ if (IsMaster(dev))
+ ptr = GetMaster(dev, MASTER_POINTER);
+ else if (!dev->u.master)
+ ptr = dev;
+ else
+ return;
- (*dev->public.processInputProc)((xEventPtr)btn, dev, count);
+ events = InitEventList(GetMaximumEventsNum());
+ nevents = GetPointerEvents(events, ptr,
+ press ? ButtonPress : ButtonRelease, button,
+ 0 /* flags */, 0 /* first */,
+ 0 /* num_val */, NULL);
- if (master) {
- (*master->public.processInputProc)(masterEvents->event, master, count);
- }
- return;
-#endif
+
+ for (i = 0; i < nevents; i++)
+ mieqProcessDeviceEvent(ptr, (InternalEvent*)events[i].event, NULL);
+
+ FreeEventList(events, GetMaximumEventsNum());
}