It is useful to have a way to prevent sending commands in read-only sessions (think of multi-client)
No clipboard sharing allowed in this case in gtk-session. --- gtk/spice-gtk-session-priv.h | 1 + gtk/spice-gtk-session.c | 23 +++++++++++++++++++---- gtk/spice-session-priv.h | 2 ++ gtk/spice-session.c | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 4 deletions(-) diff --git a/gtk/spice-gtk-session-priv.h b/gtk/spice-gtk-session-priv.h index 19692af..21a4251 100644 --- a/gtk/spice-gtk-session-priv.h +++ b/gtk/spice-gtk-session-priv.h @@ -24,6 +24,7 @@ G_BEGIN_DECLS void spice_gtk_session_update_keyboard_focus(SpiceGtkSession *self, gboolean state); +gboolean spice_gtk_session_get_read_only(SpiceGtkSession *self); G_END_DECLS diff --git a/gtk/spice-gtk-session.c b/gtk/spice-gtk-session.c index c181c7e..6f50762 100644 --- a/gtk/spice-gtk-session.c +++ b/gtk/spice-gtk-session.c @@ -77,6 +77,7 @@ static void channel_new(SpiceSession *session, SpiceChannel *channel, gpointer user_data); static void channel_destroy(SpiceSession *session, SpiceChannel *channel, gpointer user_data); +static gboolean read_only(SpiceGtkSession *self); /* ------------------------------------------------------------------ */ /* gobject glue */ @@ -479,7 +480,7 @@ static void clipboard_owner_change(GtkClipboard *clipboard, } s->clipboard_by_guest[selection] = FALSE; s->clip_hasdata[selection] = TRUE; - if (s->auto_clipboard_enable) + if (s->auto_clipboard_enable && !read_only(self)) gtk_clipboard_request_targets(clipboard, clipboard_get_targets, self); break; @@ -622,7 +623,9 @@ static gboolean clipboard_grab(SpiceMainChannel *main, guint selection, /* Receiving a grab implies we've released our own grab */ s->clip_grabbed[selection] = FALSE; - if (!s->auto_clipboard_enable || s->nclip_targets[selection] == 0) + if (read_only(self) || + !s->auto_clipboard_enable || + s->nclip_targets[selection] == 0) goto skip_grab_clipboard; if (!gtk_clipboard_set_with_data(cb, targets, i, clipboard_get, @@ -694,6 +697,9 @@ static gboolean clipboard_request(SpiceMainChannel *main, guint selection, GtkClipboard* cb; int m; + if (read_only(self)) + return FALSE; + cb = get_clipboard_from_selection(s, selection); g_return_val_if_fail(cb != NULL, FALSE); @@ -773,6 +779,14 @@ static void channel_destroy(SpiceSession *session, SpiceChannel *channel, } } +static gboolean read_only(SpiceGtkSession *self) { + gboolean read_only; + + g_object_get(self->priv->session, "read-only", &read_only, NULL); + + return read_only; +} + /* ---------------------------------------------------------------- */ /* private functions (usbredir related) */ G_GNUC_INTERNAL @@ -791,9 +805,8 @@ void spice_gtk_session_update_keyboard_focus(SpiceGtkSession *self, auto_connect = TRUE; manager = spice_usb_device_manager_get(s->session, NULL, NULL); - if (manager) { + if (manager) g_object_set(manager, "auto-connect", auto_connect, NULL); - } } /* ------------------------------------------------------------------ */ @@ -843,6 +856,7 @@ SpiceGtkSession *spice_gtk_session_get(SpiceSession *session) void spice_gtk_session_copy_to_guest(SpiceGtkSession *self) { g_return_if_fail(SPICE_IS_GTK_SESSION(self)); + g_return_if_fail(read_only(self) == FALSE); SpiceGtkSessionPrivate *s = self->priv; int selection = VD_AGENT_CLIPBOARD_SELECTION_CLIPBOARD; @@ -864,6 +878,7 @@ void spice_gtk_session_copy_to_guest(SpiceGtkSession *self) void spice_gtk_session_paste_from_guest(SpiceGtkSession *self) { g_return_if_fail(SPICE_IS_GTK_SESSION(self)); + g_return_if_fail(read_only(self) == FALSE); SpiceGtkSessionPrivate *s = self->priv; int selection = VD_AGENT_CLIPBOARD_SELECTION_CLIPBOARD; diff --git a/gtk/spice-session-priv.h b/gtk/spice-session-priv.h index 8f10407..0aafd27 100644 --- a/gtk/spice-session-priv.h +++ b/gtk/spice-session-priv.h @@ -37,6 +37,7 @@ struct _SpiceSessionPrivate { GByteArray *pubkey; char *cert_subject; guint verify; + gboolean read_only; /* whether to enable audio */ gboolean audio; @@ -118,6 +119,7 @@ void spice_session_get_caches(SpiceSession *session, SpiceGlzDecoderWindow **glz_window); void spice_session_palettes_clear(SpiceSession *session); void spice_session_images_clear(SpiceSession *session); +gboolean spice_session_get_read_only(SpiceSession *session); G_END_DECLS diff --git a/gtk/spice-session.c b/gtk/spice-session.c index 9e30c74..e637521 100644 --- a/gtk/spice-session.c +++ b/gtk/spice-session.c @@ -98,6 +98,7 @@ enum { PROP_USBREDIR, PROP_DISABLE_EFFECTS, PROP_COLOR_DEPTH, + PROP_READ_ONLY, }; /* signals */ @@ -369,6 +370,9 @@ static void spice_session_get_property(GObject *gobject, case PROP_AUDIO: g_value_set_boolean(value, s->audio); break; + case PROP_READ_ONLY: + g_value_set_boolean(value, s->read_only); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, pspec); break; @@ -462,6 +466,10 @@ static void spice_session_set_property(GObject *gobject, case PROP_AUDIO: s->audio = g_value_get_boolean(value); break; + case PROP_READ_ONLY: + s->read_only = g_value_get_boolean(value); + g_object_notify(gobject, "read-only"); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, pspec); break; @@ -833,6 +841,22 @@ static void spice_session_class_init(SpiceSessionClass *klass) 1, SPICE_TYPE_CHANNEL); + /** + * SpiceSession:read-only: + * + * Whether this connection is read-only mode. + * + * Since: 0.8 + **/ + g_object_class_install_property + (gobject_class, PROP_READ_ONLY, + g_param_spec_boolean("read-only", "Read-only", + "Whether this connection is read-only mode", + FALSE, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT | + G_PARAM_STATIC_STRINGS)); + g_type_class_add_private(klass, sizeof(SpiceSessionPrivate)); } @@ -1097,6 +1121,14 @@ void spice_session_channel_migrate(SpiceSession *session, SpiceChannel *channel) } } +G_GNUC_INTERNAL +gboolean spice_session_get_read_only(SpiceSession *self) +{ + g_return_val_if_fail(SPICE_IS_SESSION(self), FALSE); + + return self->priv->read_only; +} + /** * spice_session_disconnect: * @session: -- 1.7.7 _______________________________________________ Spice-devel mailing list Spice-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/spice-devel