diff --git a/Xi/Makefile.am b/Xi/Makefile.am index 16d0e8d3f..9b1253e0b 100644 --- a/Xi/Makefile.am +++ b/Xi/Makefile.am @@ -32,6 +32,8 @@ libXi_la_SOURCES = \ extinit.c \ getbmap.c \ getbmap.h \ + getcptr.c \ + getcptr.h \ getdctl.c \ getdctl.h \ getfctl.c \ @@ -42,6 +44,8 @@ libXi_la_SOURCES = \ getkmap.h \ getmmap.c \ getmmap.h \ + getpairp.c \ + getpairp.h \ getprop.c \ getprop.h \ getselev.c \ diff --git a/Xi/extinit.c b/Xi/extinit.c index 672d333e1..3766a9516 100644 --- a/Xi/extinit.c +++ b/Xi/extinit.c @@ -86,11 +86,13 @@ SOFTWARE. #include "devbell.h" #include "getbmap.h" #include "getbmap.h" +#include "getcptr.h" #include "getdctl.h" #include "getfctl.h" #include "getfocus.h" #include "getkmap.h" #include "getmmap.h" +#include "getpairp.h" #include "getprop.h" #include "getselev.h" #include "getvers.h" @@ -370,6 +372,10 @@ ProcIDispatch(register ClientPtr client) return ProcXQueryWindowAccess(client); else if (stuff->data == X_SetClientPointer) return ProcXSetClientPointer(client); + else if (stuff->data == X_GetClientPointer) + return ProcXGetClientPointer(client); + else if (stuff->data == X_GetPairedPointer) + return ProcXGetPairedPointer(client); else { SendErrorToClient(client, IReqCode, stuff->data, 0, BadRequest); } @@ -477,6 +483,10 @@ SProcIDispatch(register ClientPtr client) return SProcXQueryWindowAccess(client); else if (stuff->data == X_SetClientPointer) return SProcXSetClientPointer(client); + else if (stuff->data == X_GetClientPointer) + return SProcXGetClientPointer(client); + else if (stuff->data == X_GetPairedPointer) + return SProcXGetPairedPointer(client); else { SendErrorToClient(client, IReqCode, stuff->data, 0, BadRequest); } @@ -561,6 +571,10 @@ SReplyIDispatch(ClientPtr client, int len, xGrabDeviceReply * rep) else if (rep->RepType == X_QueryWindowAccess) SRepXQueryWindowAccess(client, len, (xQueryWindowAccessReply*) rep); + else if (rep->RepType == X_GetClientPointer) + SRepXGetClientPointer(client, len, (xGetClientPointerReply*) rep); + else if (rep->RepType == X_GetPairedPointer) + SRepXGetPairedPointer(client, len, (xGetPairedPointerReply*) rep); else { FatalError("XINPUT confused sending swapped reply"); } diff --git a/Xi/getcptr.c b/Xi/getcptr.c new file mode 100644 index 000000000..d9ca4d360 --- /dev/null +++ b/Xi/getcptr.c @@ -0,0 +1,111 @@ +/* + +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. + +*/ + +#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 "getcptr.h" + +/*********************************************************************** + * This procedure allows a client to query another client's client pointer + * setting. + */ + +int +SProcXGetClientPointer(ClientPtr client) +{ + char n; + REQUEST(xGetClientPointerReq); + + swaps(&stuff->length, n); + swapl(&stuff->win, n); + return ProcXGetClientPointer(client); +} + +int ProcXGetClientPointer(ClientPtr client) +{ + int err; + WindowPtr win; + ClientPtr winclient; + xGetClientPointerReply rep; + REQUEST(xGetClientPointerReq); + REQUEST_SIZE_MATCH(xGetClientPointerReq); + + err = dixLookupWindow(&win, stuff->win, client, DixReadAccess); + if (err != Success) + { + SendErrorToClient(client, IReqCode, X_GetClientPointer, + stuff->win, err); + return Success; + } + + winclient = wClient(win); + + rep.repType = X_Reply; + rep.RepType = X_GetClientPointer; + rep.length = 0; + rep.sequenceNumber = client->sequence; + rep.set = (winclient->clientPtr != NULL); + rep.deviceid = (winclient->clientPtr) ? winclient->clientPtr->id : 0; + + WriteReplyToClient(client, sizeof(xGetClientPointerReply), &rep); + return Success; +} + +/*********************************************************************** + * + * This procedure writes the reply for the XGetClientPointer function, + * if the client and server have a different byte ordering. + * + */ + +void +SRepXGetClientPointer(ClientPtr client, int size, + xGetClientPointerReply* rep) +{ + char n; + swaps(&rep->sequenceNumber, n); + swapl(&rep->length, n); + WriteToClient(client, size, (char *)rep); +} + diff --git a/Xi/getcptr.h b/Xi/getcptr.h new file mode 100644 index 000000000..456d1bac2 --- /dev/null +++ b/Xi/getcptr.h @@ -0,0 +1,43 @@ +/************************************************************ + +Copyright 2007 by Peter Hutterer + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of the above listed +copyright holder(s) not be used in advertising or publicity pertaining +to distribution of the software without specific, written prior +permission. + +THE ABOVE LISTED COPYRIGHT HOLDER(S) DISCLAIM ALL WARRANTIES WITH REGARD +TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS, IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE +LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +********************************************************/ + +#ifdef HAVE_DIX_CONFIG_H +#include +#endif + +#ifndef GETCPTR_H +#define GETCPTR_H 1 +int SProcXGetClientPointer(ClientPtr /* client */ + ); + +int ProcXGetClientPointer(ClientPtr /* client */ + ); + +void SRepXGetClientPointer(ClientPtr /* client */, + int /* size */, + xGetClientPointerReply* /* rep */ + ); + +#endif /* GETCPTR_H */ diff --git a/Xi/getpairp.c b/Xi/getpairp.c new file mode 100644 index 000000000..4f1ff0316 --- /dev/null +++ b/Xi/getpairp.c @@ -0,0 +1,110 @@ +/* + +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 + +#include /* for inputstr.h */ +#include /* Request macro */ +#include "inputstr.h" /* DeviceIntPtr */ +#include "windowstr.h" /* window structure */ +#include +#include +#include "extnsionst.h" +#include "extinit.h" /* LookupDeviceIntRec */ +#include "exevents.h" +#include "exglobals.h" + +#ifdef PANORAMIX +#include "panoramiXsrv.h" +#endif + +#include "getpairp.h" + +/*********************************************************************** + * + * This procedure allows a client to query the paired pointer for a keyboard + * device. + * + */ + +int +SProcXGetPairedPointer(ClientPtr client) +{ + char n; + REQUEST(xGetPairedPointerReq); + swaps(&stuff->length, n); + return (ProcXGetPairedPointer(client)); +} + +int +ProcXGetPairedPointer(ClientPtr client) +{ + xGetPairedPointerReply rep; + DeviceIntPtr kbd, ptr; + + REQUEST(xGetPairedPointerReq); + REQUEST_SIZE_MATCH(xGetPairedPointerReq); + + kbd = LookupDeviceIntRec(stuff->deviceid); + if (!kbd || !kbd->key) { + SendErrorToClient(client, IReqCode, X_GetPairedPointer, + stuff->deviceid, BadDevice); + return Success; + } + + ptr = GetPairedPointer(kbd); + + rep.repType = X_Reply; + rep.RepType = X_GetPairedPointer; + rep.length = 0; + rep.sequenceNumber = client->sequence; + if (ptr == inputInfo.pointer) + { + rep.paired = FALSE; + rep.deviceid = 0; + } else + { + rep.paired = TRUE; + rep.deviceid = ptr->id; + } + WriteReplyToClient(client, sizeof(xGetPairedPointerReply), &rep); + return Success; +} + +void +SRepXGetPairedPointer(ClientPtr client, int size, + xGetPairedPointerReply* rep) +{ + char n; + + swaps(&rep->sequenceNumber, n); + swapl(&rep->length, n); + WriteToClient(client, size, (char *)rep); +} diff --git a/Xi/getpairp.h b/Xi/getpairp.h new file mode 100644 index 000000000..9b4759e71 --- /dev/null +++ b/Xi/getpairp.h @@ -0,0 +1,45 @@ +/* + +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 GETPAIRP_H +#define GETPAIRP_H 1 + +int SProcXGetPairedPointer(ClientPtr /* client */ + ); +int ProcXGetPairedPointer(ClientPtr /* client */ + ); +void SRepXGetPairedPointer(ClientPtr /* client */, + int /* size */, + xGetPairedPointerReply* /* rep */ + ); + +#endif /* GETPAIRP_H */ diff --git a/Xi/querydp.c b/Xi/querydp.c index c1ba2ee3b..a24dad0a5 100644 --- a/Xi/querydp.c +++ b/Xi/querydp.c @@ -164,3 +164,4 @@ SRepXQueryDevicePointer(ClientPtr client, int size, swapl(&rep->length, n); WriteToClient(client, size, (char *)rep); } + diff --git a/dix/cursor.c b/dix/cursor.c index 5b5c498b0..c58e2fa16 100644 --- a/dix/cursor.c +++ b/dix/cursor.c @@ -131,7 +131,6 @@ FreeCursor(pointer value, XID cid) } FreeCursorBits(pCurs->bits); xfree( pCurs); - MPXDBG("freeing memory for cursor\n"); return(Success); } diff --git a/dix/events.c b/dix/events.c index c9b5a4f32..65d6eaed6 100644 --- a/dix/events.c +++ b/dix/events.c @@ -3897,6 +3897,7 @@ int ProcSetInputFocus(client) ClientPtr client; { + DeviceIntPtr kbd = PickKeyboard(client); REQUEST(xSetInputFocusReq); REQUEST_SIZE_MATCH(xSetInputFocusReq); @@ -3904,16 +3905,17 @@ ProcSetInputFocus(client) if (!XaceHook(XACE_DEVICE_ACCESS, client, inputInfo.keyboard, TRUE)) return Success; - return SetInputFocus(client, inputInfo.keyboard, stuff->focus, + return SetInputFocus(client, kbd, stuff->focus, stuff->revertTo, stuff->time, FALSE); } int ProcGetInputFocus(ClientPtr client) { + DeviceIntPtr kbd = PickKeyboard(client); xGetInputFocusReply rep; /* REQUEST(xReq); */ - FocusClassPtr focus = inputInfo.keyboard->focus; + FocusClassPtr focus = kbd->focus; REQUEST_SIZE_MATCH(xReq); rep.type = X_Reply;