diff -up tigervnc-1.3.0/unix/xserver/hw/vnc/InputXKB.cc.key_is_down tigervnc-1.3.0/unix/xserver/hw/vnc/InputXKB.cc --- tigervnc-1.3.0/unix/xserver/hw/vnc/InputXKB.cc.key_is_down 2013-07-24 12:54:41.461930866 +0100 +++ tigervnc-1.3.0/unix/xserver/hw/vnc/InputXKB.cc 2013-07-24 13:04:39.743663652 +0100 @@ -321,7 +321,11 @@ std::list InputDevice::releaseS XkbAction *act; unsigned char mask; - if (!key_is_down(master, key, KEY_PROCESSED)) + int bit; + BYTE *kptr; + kptr = &master->key->down[key >> 3]; + bit = 1 << (key & 7); + if (*kptr & bit) continue; act = XkbKeyActionPtr(xkb, key, state); @@ -402,7 +406,11 @@ std::list InputDevice::releaseL XkbAction *act; unsigned char key_mask; - if (!key_is_down(master, key, KEY_PROCESSED)) + int bit; + BYTE *kptr; + kptr = &master->key->down[key >> 3]; + bit = 1 << (key & 7); + if (*kptr & bit) continue; act = XkbKeyActionPtr(xkb, key, state); @@ -638,6 +646,8 @@ void InputDevice::vncXkbProcessDeviceEve if (event->device_event.sourceid == self->keyboardDev->id) { XkbControlsPtr ctrls; + int bit; + BYTE *kptr; /* * We need to bypass AccessX since it is timing sensitive and @@ -651,8 +661,10 @@ void InputDevice::vncXkbProcessDeviceEve * This flag needs to be set for key repeats to be properly * respected. */ + kptr = &dev->key->down[event->device_event.detail.key >> 3]; + bit = 1 << (event->device_event.detail.key & 7); if ((event->device_event.type == ET_KeyPress) && - key_is_down(dev, event->device_event.detail.key, KEY_PROCESSED)) + (*kptr & bit)) event->device_event.key_repeat = TRUE; }