[Spice-devel] [PATCH spice-gtk] RFC: release pointer grab on grab-broken
Hans de Goede
hdegoede at redhat.com
Wed Mar 27 05:52:36 PDT 2013
Hi,
On 03/27/2013 01:41 PM, Marc-André Lureau wrote:
> On Wed, Mar 27, 2013 at 11:54 AM, Hans de Goede <hdegoede at redhat.com> wrote:
>> I would like to see the above block changed to:
>>
>> if (event->keyboard) {
>> try_keyboard_ungrab(self);
>> try_mouse_ungrab(self);
>> } else {
>>
>> This should also fix the issue you're trying to fix. With the added
>> advantage that it will release the mouse even if for some reason
>> d->keyboard_grab_active is false when we get the grab_broken.
>
> That's what I did first (minus the fact that we don't need the else block)
>
>
>>> - d->mouse_grab_active = false;
>>> - g_signal_emit(self, signals[SPICE_DISPLAY_MOUSE_GRAB], 0, false);
>>> + try_mouse_ungrab(self);
>>> }
>>>
>>> return false;
>>> @@ -751,6 +749,9 @@ static void try_keyboard_ungrab(SpiceDisplay *display)
>>> #endif
>>> d->keyboard_grab_active = false;
>>> g_signal_emit(widget, signals[SPICE_DISPLAY_KEYBOARD_GRAB], 0,
>>> false);
>>> +
>>> + /* for consistency, there should not be only a mouse grab */
>>> + try_mouse_ungrab(display);
>>> }
>
> But here was my reasoning: there should never be only a mouse grab.
This is not true, in applications which disable the keyboard-grab property,
such as spicy potentially does, we can have a mouse grab without a keyboard
grab. And this is a fine example of how this violates the principle of
least surprise / makes try_keyboard_ungrab have potentially undesirable
side-effects.
Really a function named try_keyboard_ungrab, should not touch the
mouse_grab, it is as simple as that.
Regards,
Hans
More information about the Spice-devel
mailing list