]>
Commit | Line | Data |
---|---|---|
13a33bd9 JR |
1 | diff -up tigervnc-1.0.90-20100813svn4123/unix/xserver/hw/vnc/Input.cc.rh633931 tigervnc-1.0.90-20100813svn4123/unix/xserver/hw/vnc/Input.cc |
2 | --- tigervnc-1.0.90-20100813svn4123/unix/xserver/hw/vnc/Input.cc.rh633931 2010-09-16 11:29:33.670000097 +0200 | |
3 | +++ tigervnc-1.0.90-20100813svn4123/unix/xserver/hw/vnc/Input.cc 2010-09-16 12:59:31.530002411 +0200 | |
4 | @@ -271,6 +271,19 @@ void InputDevice::initInputDevice(void) | |
5 | #endif | |
6 | } | |
7 | ||
8 | +static inline void pressKey(DeviceIntPtr dev, int kc, bool down, const char *msg) | |
9 | +{ | |
10 | + int action; | |
11 | + unsigned int n; | |
12 | + | |
13 | + if (msg != NULL) | |
14 | + vlog.debug("%s %d %s", msg, kc, down ? "down" : "up"); | |
15 | + | |
16 | + action = down ? KeyPress : KeyRelease; | |
17 | + n = GetKeyboardEvents(eventq, dev, action, kc); | |
18 | + enqueueEvents(dev, n); | |
19 | +} | |
20 | + | |
21 | #define IS_PRESSED(keyc, keycode) \ | |
22 | ((keyc)->down[(keycode) >> 3] & (1 << ((keycode) & 7))) | |
23 | ||
24 | @@ -294,7 +307,7 @@ public: | |
25 | ~ModifierState() | |
26 | { | |
27 | for (int i = 0; i < nKeys; i++) | |
28 | - generateXKeyEvent(keys[i], !pressed); | |
29 | + pressKey(dev, keys[i], !pressed, "fake keycode"); | |
30 | delete [] keys; | |
31 | } | |
32 | ||
33 | @@ -389,22 +402,10 @@ private: | |
34 | if (keycode) { | |
35 | if (!keys) keys = new int[maxKeysPerMod]; | |
36 | keys[nKeys++] = keycode; | |
37 | - generateXKeyEvent(keycode, down); | |
38 | + pressKey(dev, keycode, down, "fake keycode"); | |
39 | } | |
40 | } | |
41 | ||
42 | - void generateXKeyEvent(int keycode, bool down) | |
43 | - { | |
44 | - int n, action; | |
45 | - | |
46 | - action = down ? KeyPress : KeyRelease; | |
47 | - n = GetKeyboardEvents(eventq, dev, action, keycode); | |
48 | - enqueueEvents(dev, n); | |
49 | - | |
50 | - vlog.debug("fake keycode %d %s", keycode, | |
51 | - down ? "down" : "up"); | |
52 | - } | |
53 | - | |
54 | int modIndex; | |
55 | int nKeys; | |
56 | int *keys; | |
57 | @@ -503,8 +504,8 @@ void InputDevice::keyEvent(rdr::U32 keys | |
58 | KeyCode minKeyCode, maxKeyCode; | |
59 | KeyCode *modmap = NULL; | |
60 | int mapWidth; | |
61 | - unsigned int i, n; | |
62 | - int j, k, action, state, maxKeysPerMod; | |
63 | + unsigned int i; | |
64 | + int j, k, state, maxKeysPerMod; | |
65 | ||
66 | initInputDevice(); | |
67 | ||
68 | @@ -691,12 +692,14 @@ ModeSwitchFound: | |
69 | modeSwitch.release(); | |
70 | } | |
71 | } | |
72 | - } | |
73 | + /* | |
74 | + * Ensure ModifierState objects are not destroyed before | |
75 | + * pressKey call, otherwise fake modifier keypress can be lost. | |
76 | + */ | |
77 | + pressKey(keyboardDev, kc, down, "keycode"); | |
78 | + } else | |
79 | + pressKey(keyboardDev, kc, down, "keycode"); | |
80 | ||
81 | - vlog.debug("keycode %d %s", kc, down ? "down" : "up"); | |
82 | - action = down ? KeyPress : KeyRelease; | |
83 | - n = GetKeyboardEvents(eventq, keyboardDev, action, kc); | |
84 | - enqueueEvents(keyboardDev, n); | |
85 | ||
86 | FREE_MAPS; | |
87 |