diff options
Diffstat (limited to 'xorg-server/xkb/ddxDevBtn.c')
-rw-r--r-- | xorg-server/xkb/ddxDevBtn.c | 104 |
1 files changed, 26 insertions, 78 deletions
diff --git a/xorg-server/xkb/ddxDevBtn.c b/xorg-server/xkb/ddxDevBtn.c index 44ee75f5d..94630d1c9 100644 --- a/xorg-server/xkb/ddxDevBtn.c +++ b/xorg-server/xkb/ddxDevBtn.c @@ -29,101 +29,49 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE. #endif #include <stdio.h> -#define NEED_EVENTS 1 #include <X11/X.h> #include <X11/Xproto.h> #include <X11/keysym.h> #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; - - 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; + + events = InitEventList(GetMaximumEventsNum()); + nevents = GetPointerEvents(events, ptr, + press ? ButtonPress : ButtonRelease, button, + 0 /* flags */, 0 /* first */, + 0 /* num_val */, NULL); + - (*dev->public.processInputProc)((xEventPtr)btn, dev, count); + for (i = 0; i < nevents; i++) + mieqProcessDeviceEvent(ptr, (InternalEvent*)events[i].event, NULL); - if (master) { - (*master->public.processInputProc)(masterEvents->event, master, count); - } - return; + FreeEventList(events, GetMaximumEventsNum()); } |