From e6fd4a24ebd205013b41e44aacbbfb847709d2fd Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Wed, 2 May 2007 17:49:20 +0930 Subject: [PATCH] Add handling for FakeDeviceEvent request. Fix a stupid bug from last commit, mask names were wrong. --- Xi/Makefile.am | 2 + Xi/extinit.c | 9 +++- Xi/fakedevdata.c | 128 +++++++++++++++++++++++++++++++++++++++++++++++ Xi/fakedevdata.h | 42 ++++++++++++++++ 4 files changed, 179 insertions(+), 2 deletions(-) create mode 100644 Xi/fakedevdata.c create mode 100644 Xi/fakedevdata.h diff --git a/Xi/Makefile.am b/Xi/Makefile.am index 346453cb6..d020210df 100644 --- a/Xi/Makefile.am +++ b/Xi/Makefile.am @@ -30,6 +30,8 @@ libXi_la_SOURCES = \ exevents.c \ exglobals.h \ extinit.c \ + fakedevdata.c \ + fakedevdata.h \ getbmap.c \ getbmap.h \ getcptr.c \ diff --git a/Xi/extinit.c b/Xi/extinit.c index beac426ee..6d8c96141 100644 --- a/Xi/extinit.c +++ b/Xi/extinit.c @@ -86,6 +86,7 @@ SOFTWARE. #include "chpkpair.h" #include "closedev.h" #include "devbell.h" +#include "fakedevdata.h" #include "getbmap.h" #include "getbmap.h" #include "getcptr.h" @@ -133,8 +134,8 @@ Mask ExtExclusiveMasks[EMASKSIZE]; static Mask xi_filters[3] = { - XI_PointerKeyboardPairingChangedNotifyMask, - XI_RandomStringEventMask, + XI_PointerKeyboardPairingChangedMask, + XI_RandomStringMask, XI_RawDeviceEventMask, }; @@ -362,6 +363,8 @@ ProcIDispatch(ClientPtr client) return ProcXGetClientPointer(client); else if (stuff->data == X_GetPairedPointer) return ProcXGetPairedPointer(client); + else if (stuff->data == X_FakeDeviceData) + return ProcXFakeDeviceData(client); else { SendErrorToClient(client, IReqCode, stuff->data, 0, BadRequest); } @@ -475,6 +478,8 @@ SProcIDispatch(ClientPtr client) return SProcXGetClientPointer(client); else if (stuff->data == X_GetPairedPointer) return SProcXGetPairedPointer(client); + else if (stuff->data == X_FakeDeviceData) + return SProcXFakeDeviceData(client); else { SendErrorToClient(client, IReqCode, stuff->data, 0, BadRequest); } diff --git a/Xi/fakedevdata.c b/Xi/fakedevdata.c new file mode 100644 index 000000000..64f2ea62c --- /dev/null +++ b/Xi/fakedevdata.c @@ -0,0 +1,128 @@ +/* + +Copyright 2007 Peter Hutterer + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the author shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the author. + +*/ + +/*********************************************************************** + * + * Request to fake data for a given device. + * + */ + +#define NEED_EVENTS +#define NEED_REPLIES +#ifdef HAVE_DIX_CONFIG_H +#include +#endif + +#include /* for inputstr.h */ +#include /* Request macro */ +#include "inputstr.h" /* DeviceIntPtr */ +#include "windowstr.h" /* window structure */ +#include "scrnintstr.h" /* screen structure */ +#include +#include +#include "extnsionst.h" +#include "extinit.h" /* LookupDeviceIntRec */ +#include "exevents.h" +#include "exglobals.h" +#include "mi.h" + +#include "fakedevdata.h" + +static EventListPtr fake_events = NULL; + +int +SProcXFakeDeviceData(ClientPtr client) +{ + char n; + int i; + ValuatorData* p; + + REQUEST(xFakeDeviceDataReq); + + swaps(&stuff->length, n); + REQUEST_AT_LEAST_SIZE(xFakeDeviceDataReq); + + p = (ValuatorData*)&stuff[1]; + for (i = 0; i < stuff->num_valuators; i++, p++) + swapl(p, n); + + return ProcXFakeDeviceData(client);; +} + +int +ProcXFakeDeviceData(ClientPtr client) +{ + DeviceIntPtr dev; + int nevents, i; + int* valuators = NULL; + + REQUEST(xFakeDeviceDataReq); + REQUEST_AT_LEAST_SIZE(xFakeDeviceDataReq); + + if (stuff->length != (sizeof(xFakeDeviceDataReq) >> 2) + stuff->num_valuators) + { + SendErrorToClient(client, IReqCode, X_FakeDeviceData, 0, BadLength); + return Success; + } + + dev = LookupDeviceIntRec(stuff->deviceid); + if (dev == NULL) { + SendErrorToClient(client, IReqCode, X_FakeDeviceData, 0, BadDevice); + return Success; + } + + if (!fake_events && !(fake_events = InitEventList(GetMaximumEventsNum()))) + { + SendErrorToClient(client, IReqCode, X_FakeDeviceData, 0, BadAlloc); + return Success; + } + if (stuff->num_valuators) + { + CARD32* valptr = (CARD32*)&stuff[1]; + + valuators = xcalloc(stuff->num_valuators, sizeof(int)); + if (!valuators) + { + SendErrorToClient(client, IReqCode, X_FakeDeviceData, 0, BadAlloc); + return Success; + } + for (i = 0; i < stuff->num_valuators; i++, valptr++) + valuators[i] = (int)(*valptr); + } + + nevents = GetPointerEvents(fake_events, dev, stuff->type, stuff->buttons, + POINTER_RELATIVE, stuff->first_valuator, stuff->num_valuators, + valuators); + + OsBlockSignals(); + for (i = 0; i < nevents; i++) + mieqEnqueue(dev, (fake_events+ i)->event); + OsReleaseSignals(); + xfree(valuators); + return Success; +} diff --git a/Xi/fakedevdata.h b/Xi/fakedevdata.h new file mode 100644 index 000000000..28dd72985 --- /dev/null +++ b/Xi/fakedevdata.h @@ -0,0 +1,42 @@ +/* + +Copyright 2007 Peter Hutterer + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the author shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the author. + +*/ + +#ifdef HAVE_DIX_CONFIG_H +#include +#endif + +#ifndef FAKEDEVDATA_H +#define FAKEDEVDATA_H 1 + +int SProcXFakeDeviceData(ClientPtr /* client */ + ); + +int ProcXFakeDeviceData(ClientPtr /* client */ + ); + +#endif /* FAKEDEVDATA_H */