[et-mgmt-tools] [PATCH]: Make virt-viewer ungrab the mouse and keyboard on un-focus

Pat Campbell plc at novell.com
Tue May 20 19:39:49 UTC 2008


Chris Lalancette wrote:
> Daniel P. Berrange wrote:
>   
>> I struggle to understand how/what you managed todo here. If the keyboard
>> grab is active nothing should be able to steal keyboard input focus, since
>> this is the whole point of keyboard grab. If something did manage to steal
>> keyboard input while grab was active, then this is a bug in the window
>> manager and not something we should hack in virt-viewer - inded if this
>> is possible, then every single app which uses grabs needs your patch which
>> is clearly non-scalable
>>     
>
> This arguably is some sort of window manager bug, or possibly a bug in the way
> keyboard grab is currently working.  In any case, it is very easy to reproduce.
>  Just do something like:
>
> # virt-viewer guest1 & sleep 10 ; virt-viewer guest2
>
> And make sure to click inside the guest1 virt-viewer window right after it pops
> up.  Assuming your keyboard is grabbed there, and that your window manager
> placed the guest2 window on top of the guest1 window, you will be unable to
> escape (with Ctrl-Alt) from the guest1 window.
>
> Chris Lalancette
>
>   
It is not a Window Manager bug, it is a virt-viewer bug.  The Window
Manager is not responsible for releasing keyboard or pointer grabs when
a window looses focus.  It is the applications job.

Take a look at xorg/xc/Xserver/dix/event.c: ProcUngrabPointer(ClientPtr
client)   This function checks that the releasing client is the client
that owns the grab.  This behavior makes sense, would be a huge security
hole otherwise.

Not sure this will apply cleanly but I would suggest something like
below to gtk-vnc/vncdisplay.c:

--- vncdisplay.c.orig   2008-05-20 13:32:24.000000000 -0600
+++ vncdisplay.c        2008-05-20 13:33:22.000000000 -0600
@@ -492,6 +492,9 @@ static gboolean leave_event(GtkWidget *w
         if (priv->grab_keyboard)
                 do_keyboard_ungrab(VNC_DISPLAY(widget), FALSE);

+        if (priv->grab_pointer)
+                do_pointer_ungrab(VNC_DISPLAY(widget), FALSE);
+
         return TRUE;
 }


 





More information about the et-mgmt-tools mailing list