]> git.pld-linux.org Git - packages/tigervnc.git/blob - tigervnc-rh633931.patch
- pl descr
[packages/tigervnc.git] / tigervnc-rh633931.patch
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         
This page took 0.030566 seconds and 3 git commands to generate.