summaryrefslogtreecommitdiff
path: root/x11/XFree86/files/patch-u
blob: 80e67c123fdbc379da01e2a23b6fa717edbb3fbe (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
--- programs/Xserver/xkb/xkbActions.c-orig	Wed Jan 10 19:16:53 2001
+++ programs/Xserver/xkb/xkbActions.c	Fri Jan 19 20:05:55 2001
@@ -1318,6 +1318,9 @@
 	}
 	else CoreProcessPointerEvent(xE,dev,count);
     }
+    else if (keyEvent)
+	FixKeyState(xE,dev);
+
     xkbi->prev_state= oldState;
     XkbComputeDerivedState(xkbi);
     keyc->prev_state= keyc->state;
--- programs/Xserver/dix/events.c-orig	Thu Jan 11 16:02:02 2001
+++ programs/Xserver/dix/events.c	Wed Jan 24 19:14:27 2001
@@ -2784,6 +2784,44 @@
         (*keybd->DeactivateGrab)(keybd);
 }
 
+#ifdef XKB
+/* This function is used to set the key pressed or key released state -
+   this is only used when the pressing of keys does not cause 
+   CoreProcessKeyEvent to be called, as in for example Mouse Keys.
+*/
+void
+FixKeyState (xE, keybd)
+    register xEvent *xE;
+    register DeviceIntPtr keybd;
+{
+    int             key, bit;
+    register BYTE   *kptr;
+    register KeyClassPtr keyc = keybd->key;
+
+    key = xE->u.u.detail;
+    kptr = &keyc->down[key >> 3];
+    bit = 1 << (key & 7);
+#ifdef DEBUG
+    if ((xkbDebugFlags&0x4)&&
+	((xE->u.u.type==KeyPress)||(xE->u.u.type==KeyRelease))) {
+	ErrorF("FixKeyState: Key %d %s\n",key,
+			(xE->u.u.type==KeyPress?"down":"up"));
+    }
+#endif
+    switch (xE->u.u.type)
+    {
+	case KeyPress: 
+	    *kptr |= bit;
+	    break;
+	case KeyRelease: 
+	    *kptr &= ~bit;
+	    break;
+	default: 
+	    FatalError("Impossible keyboard event");
+    }
+}
+#endif
+
 void
 #ifdef XKB
 CoreProcessPointerEvent (xE, mouse, count)