Here is a patch that resolves the issue for me. This patch is WRONG and hence I have not added the patch tag. The fix should be applied somewhere else, but given my limited time and understanding of vino's binding system, it's the best I can do at the moment.
This issue points out to me that something about how vino constructs its binding maps is inherently wrong. It appears that the maps are constructed so that if a keystroke is "no different" whether shift is pressed or not, vino will send a shift-release event, then the actual key event, then a shift-press event. Obviously, the logic it uses to determine if two keystrokes are different based only on their shift states is borked. -- Chris Howie http://www.chrishowie.com http://en.wikipedia.org/wiki/User:Crazycomputers If you correspond with me on a regular basis, please read this document: http://www.chrishowie.com/email-preferences/ PGP fingerprint: 2B7A B280 8B12 21CC 260A DF65 6FCE 505A CF83 38F5 ------------------------------------------------------------------------ IMPORTANT INFORMATION/DISCLAIMER This document should be read only by those persons to whom it is addressed. If you have received this message it was obviously addressed to you and therefore you can read it. Additionally, by sending an email to ANY of my addresses or to ANY mailing lists to which I am subscribed, whether intentionally or accidentally, you are agreeing that I am "the intended recipient," and that I may do whatever I wish with the contents of any message received from you, unless a pre-existing agreement prohibits me from so doing. This overrides any disclaimer or statement of confidentiality that may be included on your message.
diff -rU 3 a/vino-2.28.2/server/vino-input.c b/vino-2.28.2/server/vino-input.c --- a/vino-2.28.2/server/vino-input.c 2009-04-18 09:22:24.000000000 -0400 +++ b/vino-2.28.2/server/vino-input.c 2010-09-07 15:21:48.000000000 -0400 @@ -904,7 +904,7 @@ cur_level = VINO_LEVEL (modifier_state); - if (VINO_LEVEL_IS_SHIFT (cur_level) && !VINO_LEVEL_IS_SHIFT (binding->level)) + if (VINO_LEVEL_IS_SHIFT (cur_level) && !VINO_LEVEL_IS_SHIFT (binding->level) && binding->keycode != 23) { dprintf (INPUT, "Faking Shift %s\n", key_press ? "release" : "press");