[Spice-devel] [spice-gtk PATCH v4] Grab keyboard based on session focus

Pavel Grunt pgrunt at redhat.com
Tue Dec 15 00:37:07 PST 2015


Hi Snir,

just some minor comments

On Sun, 2015-12-13 at 10:40 +0200, Snir Sheriber wrote:
> When using multiple monitors moving mouse between monitors releases
> keyboard grab.
> 
> Reproduce bug
> -Open multiple monitors remote-viewer session
> -Click on one of the monitors to get focus & keyboard-grab
> -Move mouse to another monitor and try any keyboard command (do not click)
> At this point all keyboard commands are being executed on the client machine
> instead of the remote machine
> 
> I added keyboard_have_focus and mouse_have_pointer variables at the session
I know that 'keyboard_have_focus' is used in spice-widget, but you can introduce
the new variables and functions with keyboard_has_focus, mouse_has_pointer
> and

The line in a commit message should not be longer than ~72 characters
> now these properties are being tested for the session instead for the current
> widget (works also when using alt-tab).
> 
> Resolves: rhbz#1275231
> ---
> No GObject properties were set
> ---
>  src/spice-gtk-session-priv.h |  4 ++++
>  src/spice-gtk-session.c      | 36 ++++++++++++++++++++++++++++++++++++
>  src/spice-widget.c           |  7 +++++--
>  3 files changed, 45 insertions(+), 2 deletions(-)
> 
> diff --git a/src/spice-gtk-session-priv.h b/src/spice-gtk-session-priv.h
> index 91304b2..bd737d8 100644
> --- a/src/spice-gtk-session-priv.h
> +++ b/src/spice-gtk-session-priv.h
> @@ -28,6 +28,10 @@ gboolean spice_gtk_session_get_read_only(SpiceGtkSession
> *self);
>  void spice_gtk_session_sync_keyboard_modifiers(SpiceGtkSession *self);
>  void spice_gtk_session_set_pointer_grabbed(SpiceGtkSession *self, gboolean
> grabbed);
>  gboolean spice_gtk_session_get_pointer_grabbed(SpiceGtkSession *self);
> +void spice_gtk_session_set_keyboard_have_focus(SpiceGtkSession *self, 
has_focus
> gboolean grabbed);
maybe gboolean has_focus or keyboard_has_focus instead of grabbed?
> +void spice_gtk_session_set_mouse_have_pointer(SpiceGtkSession *self, gboolean
> grabbed);
has_pointer / mouse_has_pointer?
> +gboolean spice_gtk_session_get_keyboard_have_focus(SpiceGtkSession *self);
> +gboolean spice_gtk_session_get_mouse_have_pointer(SpiceGtkSession *self);
have/has
>  
>  G_END_DECLS
>  
> diff --git a/src/spice-gtk-session.c b/src/spice-gtk-session.c
> index 5abb16c..0218bdc 100644
> --- a/src/spice-gtk-session.c
> +++ b/src/spice-gtk-session.c
> @@ -64,6 +64,8 @@ struct _SpiceGtkSessionPrivate {
>      gboolean                auto_usbredir_enable;
>      int                     auto_usbredir_reqs;
>      gboolean                pointer_grabbed;
> +    gboolean                keyboard_have_focus;
> +    gboolean                mouse_have_pointer;

have/has

>  };
>  
>  /**
> @@ -1227,3 +1229,37 @@ gboolean
> spice_gtk_session_get_pointer_grabbed(SpiceGtkSession *self)
>  
>      return self->priv->pointer_grabbed;
>  }
> +
> +G_GNUC_INTERNAL
> +void spice_gtk_session_set_keyboard_have_focus(SpiceGtkSession *self,
> +gboolean grabbed)
Please rename and fix the indentation

void spice_gtk_session_set_keyboard_have_focus(SpiceGtkSession *self,
                                               gboolean have_focus)

> +{
> +    g_return_if_fail(SPICE_IS_GTK_SESSION(self));
> +
> +    self->priv->keyboard_have_focus = grabbed;
> +}
> +
> +G_GNUC_INTERNAL
> +void spice_gtk_session_set_mouse_have_pointer(SpiceGtkSession *self, gboolean
> +grabbed)
same here
> + {
> +    g_return_if_fail(SPICE_IS_GTK_SESSION(self));
> +
> +    self->priv->mouse_have_pointer = grabbed;
> + }
> +
> + G_GNUC_INTERNAL
> +gboolean spice_gtk_session_get_keyboard_have_focus(SpiceGtkSession *self)
> +{
> +    g_return_val_if_fail(SPICE_IS_GTK_SESSION(self), FALSE);
> +
> +    return self->priv->keyboard_have_focus;
> +}
> +
> +G_GNUC_INTERNAL
> +gboolean spice_gtk_session_get_mouse_have_pointer(SpiceGtkSession *self)
> +{
> +    g_return_val_if_fail(SPICE_IS_GTK_SESSION(self), FALSE);
> +
> +    return self->priv->mouse_have_pointer;
> +}
> diff --git a/src/spice-widget.c b/src/spice-widget.c
> index 503f82a..ffb2c00 100644
> --- a/src/spice-widget.c
> +++ b/src/spice-widget.c
> @@ -208,6 +208,7 @@ static void update_keyboard_focus(SpiceDisplay *display,
> gboolean state)
>      SpiceDisplayPrivate *d = display->priv;
>  
>      d->keyboard_have_focus = state;
> +    spice_gtk_session_set_keyboard_have_focus(d->gtk_session, state);
>  
>      /* keyboard grab gets inhibited by usb-device-manager when it is
>         in the process of redirecting a usb-device (as this may show a
> @@ -737,9 +738,9 @@ static void try_keyboard_grab(SpiceDisplay *display)
>          return;
>      if (d->keyboard_grab_active)
>          return;
> -    if (!d->keyboard_have_focus)
> +    if (!spice_gtk_session_get_keyboard_have_focus(d->gtk_session))
>          return;
> -    if (!d->mouse_have_pointer)
> +    if (!spice_gtk_session_get_mouse_have_pointer(d->gtk_session))
>          return;
>      if (d->keyboard_grab_released)
>          return;
> @@ -1465,6 +1466,7 @@ static gboolean enter_event(GtkWidget *widget,
> GdkEventCrossing *crossing G_GNUC
>      SPICE_DEBUG("%s", __FUNCTION__);
>  
>      d->mouse_have_pointer = true;
> +    spice_gtk_session_set_mouse_have_pointer(d->gtk_session, true);
>      try_keyboard_grab(display);
>      update_display(display);
>  
> @@ -1482,6 +1484,7 @@ static gboolean leave_event(GtkWidget *widget,
> GdkEventCrossing *crossing G_GNUC
>          return true;
>  
>      d->mouse_have_pointer = false;
> +    spice_gtk_session_set_mouse_have_pointer(d->gtk_session, false);
>      try_keyboard_ungrab(display);
>  
>      return true;

Ack with the changes,

Pavel



More information about the Spice-devel mailing list