diff options
Diffstat (limited to 'xc/programs/Xserver/hw/xfree86/common/xf86MiscExt.c')
-rw-r--r-- | xc/programs/Xserver/hw/xfree86/common/xf86MiscExt.c | 56 |
1 files changed, 53 insertions, 3 deletions
diff --git a/xc/programs/Xserver/hw/xfree86/common/xf86MiscExt.c b/xc/programs/Xserver/hw/xfree86/common/xf86MiscExt.c index 799089361..c76a4ebf4 100644 --- a/xc/programs/Xserver/hw/xfree86/common/xf86MiscExt.c +++ b/xc/programs/Xserver/hw/xfree86/common/xf86MiscExt.c @@ -1,7 +1,7 @@ /* * Copyright (c) 1999 by The XFree86 Project, Inc. */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86MiscExt.c,v 1.6 2000/08/04 16:13:25 eich Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86MiscExt.c,v 1.8 2001/08/16 14:33:51 dawes Exp $ */ /* * This file contains the Pointer/Keyboard functions needed by the @@ -25,8 +25,6 @@ #ifdef XINPUT #include "XI.h" #include "XIproto.h" -#include "extnsionst.h" -#include "extinit.h" #include "xf86Xinput.h" #else #include "inputstr.h" @@ -69,6 +67,8 @@ typedef enum { FROM_MISC } MseProtoMapDirection; +static void MiscExtClientStateCallback(pointer, pointer, pointer); + /* Sigh... @@ -202,6 +202,8 @@ MiscExtSetMouseValue(pointer mouse, MiscExtMseValType valtype, int value) return FALSE; } +/* The misc extension doesn't (yet) call this. */ +#if 0 Bool MiscExtSetMouseDevice(pointer mouse, char* device) { @@ -210,6 +212,7 @@ MiscExtSetMouseDevice(pointer mouse, char* device) mse->device = device; return TRUE; } +#endif Bool MiscExtGetKbdSettings(pointer *kbd) @@ -265,6 +268,53 @@ MiscExtSetKbdValue(pointer keyboard, MiscExtKbdValType valtype, int value) return FALSE; } +static void +MiscExtClientStateCallback(pointer callbacks, pointer data, pointer args) +{ + NewClientInfoRec *clientinfo = (NewClientInfoRec*)args; + + if (clientinfo->client == xf86Info.grabInfo.override && + clientinfo->client->clientState == ClientStateGone) { + xf86Info.grabInfo.override = NULL; + xf86Info.grabInfo.disabled = 0; + DeleteCallback(&ClientStateCallback, + (CallbackProcPtr)MiscExtClientStateCallback, NULL); + } +} + +#define MiscExtGrabStateSuccess 0 /* No errors */ +#define MiscExtGrabStateLocked 1 /* A client already requested that + * grabs cannot be removed/killed */ +#define MiscExtGrabStateAlready 2 /* Request for enabling/disabling + * grab removeal/kill already done */ +int +MiscExtSetGrabKeysState(ClientPtr client, int state) +{ + DEBUG_P("MiscExtSetGrabKeysState"); + + if (xf86Info.grabInfo.override == NULL || + xf86Info.grabInfo.override == client) { + if (state == 0 && xf86Info.grabInfo.disabled == 0) { + xf86Info.grabInfo.disabled = 1; + AddCallback(&ClientStateCallback, + (CallbackProcPtr)MiscExtClientStateCallback, NULL); + xf86Info.grabInfo.override = client; + } + else if (state == 1 && xf86Info.grabInfo.disabled == 1) { + xf86Info.grabInfo.disabled = 0; + DeleteCallback(&ClientStateCallback, + (CallbackProcPtr)MiscExtClientStateCallback, NULL); + xf86Info.grabInfo.override = NULL; + } + else + return MiscExtGrabStateAlready; + + return MiscExtGrabStateSuccess; + } + + return MiscExtGrabStateLocked; +} + pointer MiscExtCreateStruct(MiscExtStructType mse_or_kbd) { |