Change a value of the disable-inputs property when the sequence is pressed. --- gtk/spice-widget-priv.h | 2 ++ gtk/spice-widget.c | 66 +++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 55 insertions(+), 13 deletions(-) diff --git a/gtk/spice-widget-priv.h b/gtk/spice-widget-priv.h index 9c38e2e..2ecc910 100644 --- a/gtk/spice-widget-priv.h +++ b/gtk/spice-widget-priv.h @@ -109,6 +109,8 @@ struct _SpiceDisplayPrivate { guint key_delayed_id; SpiceGrabSequence *grabseq; /* the configured key sequence */ gboolean *activeseq; /* the currently pressed keys */ + SpiceGrabSequence *inputs_seq; /* the configured keys for disable inputs sequence */ + gboolean *active_inputs_seq; gint mark; #ifdef WIN32 HHOOK keyboard_hook; diff --git a/gtk/spice-widget.c b/gtk/spice-widget.c index ae11073..2e45657 100644 --- a/gtk/spice-widget.c +++ b/gtk/spice-widget.c @@ -431,6 +431,13 @@ static void spice_display_finalize(GObject *obj) g_free(d->activeseq); d->activeseq = NULL; + if (d->inputs_seq) { + spice_grab_sequence_free(d->inputs_seq); + d->inputs_seq = NULL; + } + g_free(d->active_inputs_seq); + d->active_inputs_seq = NULL; + if (d->show_cursor) { gdk_cursor_unref(d->show_cursor); d->show_cursor = NULL; @@ -525,6 +532,22 @@ static void grab_notify(SpiceDisplay *display, gboolean was_grabbed) release_keys(display); } +static void set_disable_inputs_sequence(SpiceDisplay *display) +{ + SpiceDisplayPrivate *d = display->priv; + + gchar *sequence; + + g_object_get(d->session, "disable-inputs-sequence", &sequence, NULL); + if (sequence != NULL) { + d->inputs_seq = spice_grab_sequence_new_from_string(sequence); + d->active_inputs_seq = g_new0(gboolean, d->inputs_seq->nkeysyms); + } + + g_free(sequence); + +} + static void spice_display_init(SpiceDisplay *display) { GtkWidget *widget = GTK_WIDGET(display); @@ -612,6 +635,8 @@ spice_display_constructor(GType gtype, G_CALLBACK(session_inhibit_keyboard_grab_changed), display, 0); + set_disable_inputs_sequence(display); + return obj; } @@ -1259,31 +1284,30 @@ static void release_keys(SpiceDisplay *display) } } -static gboolean check_for_grab_key(SpiceDisplay *display, int type, int keyval) +static gboolean check_for_sequence(SpiceGrabSequence *sequence, gboolean *activeseq, + int type, int keyval) { - SpiceDisplayPrivate *d = display->priv; int i; - - if (!d->grabseq->nkeysyms) + if (!sequence || !sequence->nkeysyms) return FALSE; if (type == GDK_KEY_PRESS) { /* Record the new key press */ - for (i = 0 ; i < d->grabseq->nkeysyms ; i++) - if (d->grabseq->keysyms[i] == keyval) - d->activeseq[i] = TRUE; + for (i = 0 ; i < sequence->nkeysyms ; i++) + if (sequence->keysyms[i] == keyval) + activeseq[i] = TRUE; /* Return if any key is not pressed */ - for (i = 0 ; i < d->grabseq->nkeysyms ; i++) - if (d->activeseq[i] == FALSE) + for (i = 0 ; i < sequence->nkeysyms ; i++) + if (activeseq[i] == FALSE) return FALSE; - /* resets the whole grab sequence on success */ - memset(d->activeseq, 0, sizeof(gboolean) * d->grabseq->nkeysyms); + /* resets the whole sequence on success */ + memset(activeseq, 0, sizeof(gboolean) * sequence->nkeysyms); return TRUE; } else if (type == GDK_KEY_RELEASE) { - /* Any key release resets the whole grab sequence */ - memset(d->activeseq, 0, sizeof(gboolean) * d->grabseq->nkeysyms); + /* Any key release resets the whole sequence */ + memset(activeseq, 0, sizeof(gboolean) * sequence->nkeysyms); return FALSE; } else g_warn_if_reached(); @@ -1291,6 +1315,18 @@ static gboolean check_for_grab_key(SpiceDisplay *display, int type, int keyval) return FALSE; } +static gboolean check_for_grab_key(SpiceDisplay *display, int type, int keyval) +{ + SpiceDisplayPrivate *d = display->priv; + return check_for_sequence(d->grabseq, d->activeseq, type, keyval); +} + +static gboolean check_for_disable_inputs_sequence(SpiceDisplay *display, int type, int keyval) +{ + SpiceDisplayPrivate *d = display->priv; + return check_for_sequence(d->inputs_seq, d->active_inputs_seq, type, keyval); +} + static void update_display(SpiceDisplay *display) { #ifdef G_OS_WIN32 @@ -1332,6 +1368,10 @@ static gboolean key_event(GtkWidget *widget, GdkEventKey *key) } } + if (check_for_disable_inputs_sequence(display, key->type, key->keyval)) { + g_object_set(display, "disable-inputs", !d->disable_inputs, NULL); + } + if (!d->inputs) return true; -- 1.9.3 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel