[Spice-devel] [PATCH spice-gtk 6/8] Add read-only property on sessions
Hans de Goede
hdegoede at redhat.com
Wed Nov 23 08:04:55 PST 2011
Ack,
Note that after our discussion I also acked the old version where
spice_session_get_read_only was kept private and g_object_get
was used. So feel free to push which ever version you prefer.
Regards,
Hans
On 11/23/2011 04:43 PM, Marc-André Lureau wrote:
> 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/map-file | 1 +
> gtk/spice-gtk-session-priv.h | 1 +
> gtk/spice-gtk-session.c | 17 +++++++++++++++--
> gtk/spice-session-priv.h | 1 +
> gtk/spice-session.c | 37 +++++++++++++++++++++++++++++++++++++
> gtk/spice-session.h | 1 +
> 6 files changed, 56 insertions(+), 2 deletions(-)
>
> diff --git a/gtk/map-file b/gtk/map-file
> index 1d7a934..4b470bb 100644
> --- a/gtk/map-file
> +++ b/gtk/map-file
> @@ -67,6 +67,7 @@ spice_record_send_data;
> spice_session_connect;
> spice_session_disconnect;
> spice_session_get_channels;
> +spice_session_get_read_only;
> spice_session_get_type;
> spice_session_has_channel_type;
> spice_session_migration_get_type;
> 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 116eead..afabe8e 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 */
> @@ -477,7 +478,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;
> @@ -620,7 +621,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,
> @@ -692,6 +695,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);
>
> @@ -771,6 +777,11 @@ static void channel_destroy(SpiceSession *session, SpiceChannel *channel,
> }
> }
>
> +static gboolean read_only(SpiceGtkSession *self)
> +{
> + return spice_session_get_read_only(self->priv->session);
> +}
> +
> /* ---------------------------------------------------------------- */
> /* private functions (usbredir related) */
> G_GNUC_INTERNAL
> @@ -841,6 +852,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;
> @@ -862,6 +874,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 963735b..0851c39 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;
> diff --git a/gtk/spice-session.c b/gtk/spice-session.c
> index 3366b58..4405fd2 100644
> --- a/gtk/spice-session.c
> +++ b/gtk/spice-session.c
> @@ -99,6 +99,7 @@ enum {
> PROP_INHIBIT_KEYBOARD_GRAB,
> PROP_DISABLE_EFFECTS,
> PROP_COLOR_DEPTH,
> + PROP_READ_ONLY,
> };
>
> /* signals */
> @@ -373,6 +374,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;
> @@ -469,6 +473,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;
> @@ -858,6 +866,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));
> }
>
> @@ -1123,6 +1147,19 @@ void spice_session_channel_migrate(SpiceSession *session, SpiceChannel *channel)
> }
>
> /**
> + * spice_session_get_read_only:
> + * @session: a #SpiceSession
> + *
> + * Returns: wether the @session is in read-only mode.
> + **/
> +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:
> *
> diff --git a/gtk/spice-session.h b/gtk/spice-session.h
> index 72effce..4895288 100644
> --- a/gtk/spice-session.h
> +++ b/gtk/spice-session.h
> @@ -93,6 +93,7 @@ gboolean spice_session_open_fd(SpiceSession *session, int fd);
> void spice_session_disconnect(SpiceSession *session);
> GList *spice_session_get_channels(SpiceSession *session);
> gboolean spice_session_has_channel_type(SpiceSession *session, gint type);
> +gboolean spice_session_get_read_only(SpiceSession *session);
>
> G_END_DECLS
>
More information about the Spice-devel
mailing list