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)
8 +static inline void pressKey(DeviceIntPtr dev, int kc, bool down, const char *msg)
14 + vlog.debug("%s %d %s", msg, kc, down ? "down" : "up");
16 + action = down ? KeyPress : KeyRelease;
17 + n = GetKeyboardEvents(eventq, dev, action, kc);
18 + enqueueEvents(dev, n);
21 #define IS_PRESSED(keyc, keycode) \
22 ((keyc)->down[(keycode) >> 3] & (1 << ((keycode) & 7)))
24 @@ -294,7 +307,7 @@ public:
27 for (int i = 0; i < nKeys; i++)
28 - generateXKeyEvent(keys[i], !pressed);
29 + pressKey(dev, keys[i], !pressed, "fake keycode");
33 @@ -389,22 +402,10 @@ private:
35 if (!keys) keys = new int[maxKeysPerMod];
36 keys[nKeys++] = keycode;
37 - generateXKeyEvent(keycode, down);
38 + pressKey(dev, keycode, down, "fake keycode");
42 - void generateXKeyEvent(int keycode, bool down)
46 - action = down ? KeyPress : KeyRelease;
47 - n = GetKeyboardEvents(eventq, dev, action, keycode);
48 - enqueueEvents(dev, n);
50 - vlog.debug("fake keycode %d %s", keycode,
51 - down ? "down" : "up");
57 @@ -503,8 +504,8 @@ void InputDevice::keyEvent(rdr::U32 keys
58 KeyCode minKeyCode, maxKeyCode;
59 KeyCode *modmap = NULL;
62 - int j, k, action, state, maxKeysPerMod;
64 + int j, k, state, maxKeysPerMod;
68 @@ -691,12 +692,14 @@ ModeSwitchFound:
74 + * Ensure ModifierState objects are not destroyed before
75 + * pressKey call, otherwise fake modifier keypress can be lost.
77 + pressKey(keyboardDev, kc, down, "keycode");
79 + pressKey(keyboardDev, kc, down, "keycode");
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);