[Spice-devel] [PATCH spice] spicec-x11: Fix modifier keys getting stuck (rhbz#655048)

Alon Levy alevy at redhat.com
Mon Nov 22 08:39:19 PST 2010


On Mon, Nov 22, 2010 at 04:36:32PM +0100, Hans de Goede wrote:
> Currently modifier keys (ctrl, alt) can get stuck when using the x11 client.
> To reproduce under gnome:
> -focus the client window without causing it to grab the keyborad (click on
>  the title bar not the window)
> -press crlt + alt + right arrow to switch virtual desktop
> -press crlt + alt + left arrow to switch back
> -notice ctrl + alt are stuck pressed
> 
> What is happening here is:
> -We get a focus out event, caused by the hotkey combi key grab, focus event
>  notify mode == NotifyGrab, and release all keys -> good
> -We get another focus out event, as we really loose the focus.
>  notify mode == NotifyWhileGrabbed, which we ignore as we already lost
>  focus before
> -We get a focus in event, as the focus is returning to us, but we don't
>  really have the focus yet, as the hotkey combi key grab is still active
>  (ie ctrl + alt are still pressed).
>  We now sync the vm's modifier key state with the current X-server state,
>  telling the vm ctrl + alt are pressed. Note we do this by directly reading
>  the X-server keyboard status, we are not getting any key press events from the
>  X-server -> bad
> -We get another focus in event, as we really get the focus back,
>  notify mode == NotifyUngrab. We ignore this one as already have gained the
>  focus before. If we were to sync the vm modifier state here, all would be
>  well we would no longer see the modifier keys pressed, or if we would we
>  would get a release event when they get released (testing has shown both).
> 
> The solution here is to ignore the first focus in event, and do the modifier
> sync on the second focus in event, or more in general to ignore focus events
> where notify mode == NotifyWhileGrabbed.
> ---
>  client/x11/red_window.cpp |   10 ++++++++++
>  1 files changed, 10 insertions(+), 0 deletions(-)
> 
> diff --git a/client/x11/red_window.cpp b/client/x11/red_window.cpp
> index c50e307..6e8cd58 100644
> --- a/client/x11/red_window.cpp
> +++ b/client/x11/red_window.cpp
> @@ -866,6 +866,11 @@ void RedWindow_p::win_proc(XEvent& event)
>          break;
>      }
>      case FocusIn:
> +        /* Ignore focus events caused by grabbed (hotkeys) */
> +        if (event.xfocus.mode == NotifyWhileGrabbed) {
> +            break;
> +        }
> +
>          if (event.xany.serial < focus_serial) {
>              DBG(0, "Ignored FocusIn win=%p (serial=%d, Last foucs serial=%d)",
>                     red_window,  event.xany.serial, focus_serial);
> @@ -886,6 +891,11 @@ void RedWindow_p::win_proc(XEvent& event)
>          }
>          break;
>      case FocusOut:
> +        /* Ignore focus events caused by grabbed (hotkeys) */
> +        if (event.xfocus.mode == NotifyWhileGrabbed) {
> +            break;
> +        }
> +
>          if (event.xany.serial <= focus_serial) {
>              DBG(0, "Ignored FocusOut win=%p (serial=%d, Last foucs serial=%d)",
>                     red_window, event.xany.serial, focus_serial);
> -- 
> 1.7.3.2

Thanks for the explanation. ACK.

> 
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel


More information about the Spice-devel mailing list