[Spice-devel] [spice-gtk PATCH] Ability to release the cursor with a keyboard shortcut
Pavel Grunt
pgrunt at redhat.com
Mon Oct 6 04:22:19 PDT 2014
NACK, it's causing problems on vm shutdown
----- Original Message -----
> From: "Pavel Grunt" <pgrunt at redhat.com>
> To: spice-devel at lists.freedesktop.org
> Cc: "Pavel Grunt" <pgrunt at redhat.com>
> Sent: Thursday, October 2, 2014 8:12:49 AM
> Subject: [Spice-devel][spice-gtk PATCH] Ability to release the cursor with a keyboard shortcut
>
> The cursor is grabbed/ungrabbed automatically by spice-gtk,
> this patch allows releasing the cursor in the client mouse mode
> with a keyboard shortcut.
> ---
> gtk/spice-widget-priv.h | 1 +
> gtk/spice-widget.c | 57
> ++++++++++++++++++++++++++++++-------------------
> 2 files changed, 36 insertions(+), 22 deletions(-)
>
> diff --git a/gtk/spice-widget-priv.h b/gtk/spice-widget-priv.h
> index 597ce10..c5960bd 100644
> --- a/gtk/spice-widget-priv.h
> +++ b/gtk/spice-widget-priv.h
> @@ -92,6 +92,7 @@ struct _SpiceDisplayPrivate {
> enum SpiceMouseMode mouse_mode;
> int mouse_grab_active;
> bool mouse_have_pointer;
> + gboolean cursor_released;
> GdkCursor *mouse_cursor;
> GdkPixbuf *mouse_pixbuf;
> GdkPoint mouse_hotspot;
> diff --git a/gtk/spice-widget.c b/gtk/spice-widget.c
> index 1220030..bbbcdf9 100644
> --- a/gtk/spice-widget.c
> +++ b/gtk/spice-widget.c
> @@ -945,14 +945,20 @@ static void try_mouse_grab(SpiceDisplay
> *display)
>
> if (!d->mouse_grab_enable)
> return;
> - if (d->mouse_mode != SPICE_MOUSE_MODE_SERVER)
> - return;
> if (d->mouse_grab_active)
> return;
>
> - if (do_pointer_grab(display) != GDK_GRAB_SUCCESS)
> - return;
> + g_return_if_fail(gtk_widget_is_focus(GTK_WIDGET(display)));
>
> + if (d->mouse_mode == SPICE_MOUSE_MODE_SERVER) {
> + if (do_pointer_grab(display) != GDK_GRAB_SUCCESS)
> + return;
> + } else {
> + try_keyboard_grab(display);
> + d->mouse_grab_active = true;
> + g_signal_emit(display, signals[SPICE_DISPLAY_MOUSE_GRAB], 0,
> true);
> + }
> + d->cursor_released = false;
> d->mouse_last_x = -1;
> d->mouse_last_y = -1;
> }
> @@ -1001,8 +1007,9 @@ static void try_mouse_ungrab(SpiceDisplay
> *display)
> #ifdef G_OS_WIN32
> ClipCursor(NULL);
> #endif
> - set_mouse_accel(display, TRUE);
> -
> + if (d->mouse_mode == SPICE_MOUSE_MODE_SERVER) {
> + set_mouse_accel(display, TRUE);
> + }
> d->mouse_grab_active = false;
>
> g_signal_emit(display, signals[SPICE_DISPLAY_MOUSE_GRAB], 0,
> false);
> @@ -1307,12 +1314,11 @@ static gboolean key_event(GtkWidget *widget,
> GdkEventKey *key)
>
> if (check_for_grab_key(display, key->type, key->keyval)) {
> g_signal_emit(widget,
> signals[SPICE_DISPLAY_GRAB_KEY_PRESSED], 0);
> -
> - if (d->mouse_mode == SPICE_MOUSE_MODE_SERVER) {
> - if (d->mouse_grab_active)
> - try_mouse_ungrab(display);
> - else
> - try_mouse_grab(display);
> + if (d->mouse_grab_active) {
> + spice_display_mouse_ungrab(display);
> + try_keyboard_ungrab(display);
> + } else {
> + try_mouse_grab(display);
> }
> }
>
> @@ -1402,6 +1408,9 @@ static gboolean enter_event(GtkWidget *widget,
> GdkEventCrossing *crossing G_GNUC
> SPICE_DEBUG("%s", __FUNCTION__);
>
> d->mouse_have_pointer = true;
> + if (d->cursor_released)
> + return true;
> + try_mouse_grab(display);
> try_keyboard_grab(display);
> update_display(display);
>
> @@ -1415,10 +1424,8 @@ static gboolean leave_event(GtkWidget *widget,
> GdkEventCrossing *crossing G_GNUC
>
> SPICE_DEBUG("%s", __FUNCTION__);
>
> - if (d->mouse_grab_active)
> - return true;
> -
> d->mouse_have_pointer = false;
> + try_mouse_ungrab(display);
> try_keyboard_ungrab(display);
>
> return true;
> @@ -1454,6 +1461,7 @@ static gboolean focus_out_event(GtkWidget
> *widget, GdkEventFocus *focus G_GNUC_U
> SpiceDisplayPrivate *d = display->priv;
>
> SPICE_DEBUG("%s", __FUNCTION__);
> +
> update_display(NULL);
>
> /*
> @@ -1550,7 +1558,8 @@ static gboolean motion_event(GtkWidget *widget,
> GdkEventMotion *motion)
>
> switch (d->mouse_mode) {
> case SPICE_MOUSE_MODE_CLIENT:
> - if (x >= 0 && x < d->area.width &&
> + if (d->mouse_grab_active &&
> + x >= 0 && x < d->area.width &&
> y >= 0 && y < d->area.height) {
> spice_inputs_position(d->inputs, x, y,
> get_display_id(display),
> button_mask_gdk_to_spice(motion->state));
> @@ -1628,12 +1637,11 @@ static gboolean button_event(GtkWidget
> *widget, GdkEventButton *button)
> }
>
> gtk_widget_grab_focus(widget);
> - if (d->mouse_mode == SPICE_MOUSE_MODE_SERVER) {
> - if (!d->mouse_grab_active) {
> - try_mouse_grab(display);
> - return true;
> - }
> - } else
> + if (!d->mouse_grab_active) {
> + try_mouse_grab(display);
> + return true;
> + }
> + if (d->mouse_mode == SPICE_MOUSE_MODE_CLIENT)
> /* allow to drag and drop between windows/displays:
>
> By default, X (and other window system) do a pointer grab
> @@ -2491,9 +2499,14 @@ SpiceDisplay*
> spice_display_new_with_monitor(SpiceSession *session, gint channel
> **/
> void spice_display_mouse_ungrab(SpiceDisplay *display)
> {
> + SpiceDisplayPrivate *d;
> +
> g_return_if_fail(SPICE_IS_DISPLAY(display));
>
> + d = display->priv;
> +
> try_mouse_ungrab(display);
> + d->cursor_released = true;
> }
>
> /**
> --
> 1.9.3
>
>
More information about the Spice-devel
mailing list