summaryrefslogtreecommitdiff
path: root/xc/programs/Xserver/hw/xfree86/common/xf86MiscExt.c
diff options
context:
space:
mode:
Diffstat (limited to 'xc/programs/Xserver/hw/xfree86/common/xf86MiscExt.c')
-rw-r--r--xc/programs/Xserver/hw/xfree86/common/xf86MiscExt.c56
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)
{