--- vino-2.10.0/server/vino-input.c.fix-over-eager-key-repeat 2005-05-20 12:52:40.000000000 -0400 +++ vino-2.10.0/server/vino-input.c 2005-05-20 12:52:58.000000000 -0400 @@ -294,7 +294,15 @@ { #ifdef HAVE_XTEST Display *xdisplay; - + + /* + * We inject a key press/release pair for all key presses + * and ignore key releases. The exception is modifiers. + */ + + if (!key_press && !(keysym >= XK_Shift_L && keysym <= XK_Hyper_R)) + return; + xdisplay = GDK_DISPLAY_XDISPLAY (gdk_screen_get_display (screen)); vino_input_update_modifier_state (&global_input_data, @@ -316,16 +324,17 @@ if (keycode != NoSymbol) { - if (key_press) - vino_input_fake_modifier (screen, &global_input_data, modifier, TRUE); + g_assert (key_press != FALSE); + + vino_input_fake_modifier (screen, &global_input_data, modifier, TRUE); dprintf (INPUT, "Injecting keysym 0x%.2x %s (keycode %d, modifier %d)\n", keysym, key_press ? "press" : "release", keycode, modifier); - XTestFakeKeyEvent (xdisplay, keycode, key_press, CurrentTime); + XTestFakeKeyEvent (xdisplay, keycode, TRUE, CurrentTime); + XTestFakeKeyEvent (xdisplay, keycode, FALSE, CurrentTime); - if (key_press) - vino_input_fake_modifier (screen, &global_input_data, modifier, FALSE); + vino_input_fake_modifier (screen, &global_input_data, modifier, FALSE); } } else if (keysym != XK_Caps_Lock) @@ -338,8 +347,16 @@ keysym, key_press ? "press" : "release", keycode); XTestFakeKeyEvent (xdisplay, keycode, key_press, CurrentTime); + + if (key_press && !(keysym >= XK_Shift_L && keysym <= XK_Hyper_R)) + { + XTestFakeKeyEvent (xdisplay, keycode, FALSE, CurrentTime); + } } } + + XFlush (xdisplay); + #endif /* HAVE_XTEST */ }