diff options
author | Marc-André Lureau <marcandre.lureau@redhat.com> | 2012-01-31 23:03:22 +0100 |
---|---|---|
committer | Marc-André Lureau <marcandre.lureau@redhat.com> | 2012-01-31 23:23:22 +0100 |
commit | 5f39af6b88407752984dbf6f8943408e790d2f21 (patch) | |
tree | 934d87666b326244e9d4bbfc469f6e468899689c | |
parent | aaed1f583fe8e502f63869cfc0b801823de90878 (diff) |
Do not grab/release the clipboard on guest without clipboard support
Add an agent capability check before calling those functions from
gtk-session. Avoid extra warnings.
-rw-r--r-- | doc/reference/spice-gtk-sections.txt | 1 | ||||
-rw-r--r-- | gtk/channel-main.c | 22 | ||||
-rw-r--r-- | gtk/channel-main.h | 2 | ||||
-rw-r--r-- | gtk/map-file | 1 | ||||
-rw-r--r-- | gtk/spice-gtk-session.c | 7 |
5 files changed, 31 insertions, 2 deletions
diff --git a/doc/reference/spice-gtk-sections.txt b/doc/reference/spice-gtk-sections.txt index 5e3af99..3e5ce0b 100644 --- a/doc/reference/spice-gtk-sections.txt +++ b/doc/reference/spice-gtk-sections.txt @@ -50,6 +50,7 @@ SpiceMainChannelClass <SUBSECTION> spice_main_channel spice_main_set_display +spice_main_agent_test_capability spice_main_clipboard_selection_grab spice_main_clipboard_selection_notify spice_main_clipboard_selection_release diff --git a/gtk/channel-main.c b/gtk/channel-main.c index b2df547..0689368 100644 --- a/gtk/channel-main.c +++ b/gtk/channel-main.c @@ -736,6 +736,7 @@ static void do_emit_main_context(GObject *object, int signum, gpointer params) /* ------------------------------------------------------------------ */ + static void agent_free_msg_queue(SpiceMainChannel *channel) { SpiceMainChannelPrivate *c = channel->priv; @@ -1716,6 +1717,27 @@ static gboolean timer_set_display(gpointer data) } /** + * spice_main_agent_test_capability: + * @channel: + * @cap: an agent capability identifier + * + * Test capability of a remote agent. + * + * Returns: %TRUE if @cap (channel kind capability) is available. + **/ +gboolean spice_main_agent_test_capability(SpiceMainChannel *channel, guint32 cap) +{ + g_return_val_if_fail(SPICE_IS_MAIN_CHANNEL(channel), FALSE); + + SpiceMainChannelPrivate *c = channel->priv; + + if (!c->agent_caps_received) + return FALSE; + + return VD_AGENT_HAS_CAPABILITY(c->agent_caps, sizeof(c->agent_caps), cap); +} + +/** * spice_main_set_display: * @channel: * @id: display channel ID diff --git a/gtk/channel-main.h b/gtk/channel-main.h index f1ab6ae..ae3f241 100644 --- a/gtk/channel-main.h +++ b/gtk/channel-main.h @@ -83,6 +83,8 @@ void spice_main_clipboard_selection_release(SpiceMainChannel *channel, guint sel void spice_main_clipboard_selection_notify(SpiceMainChannel *channel, guint selection, guint32 type, const guchar *data, size_t size); void spice_main_clipboard_selection_request(SpiceMainChannel *channel, guint selection, guint32 type); +gboolean spice_main_agent_test_capability(SpiceMainChannel *channel, guint32 cap); + G_END_DECLS #endif /* __SPICE_CLIENT_MAIN_CHANNEL_H__ */ diff --git a/gtk/map-file b/gtk/map-file index 38f7c26..320dae3 100644 --- a/gtk/map-file +++ b/gtk/map-file @@ -48,6 +48,7 @@ spice_inputs_lock_get_type; spice_inputs_motion; spice_inputs_position; spice_inputs_set_key_locks; +spice_main_agent_test_capability; spice_main_channel_get_type; spice_main_clipboard_grab; spice_main_clipboard_notify; diff --git a/gtk/spice-gtk-session.c b/gtk/spice-gtk-session.c index e4a36d1..f77296d 100644 --- a/gtk/spice-gtk-session.c +++ b/gtk/spice-gtk-session.c @@ -478,7 +478,9 @@ static void clipboard_get_targets(GtkClipboard *clipboard, } if (!s->clip_grabbed[selection] && t > 0) { s->clip_grabbed[selection] = TRUE; - spice_main_clipboard_selection_grab(s->main, selection, types, t); + + if (spice_main_agent_test_capability(s->main, VD_AGENT_CAP_CLIPBOARD_BY_DEMAND)) + spice_main_clipboard_selection_grab(s->main, selection, types, t); /* Sending a grab causes the agent to do an impicit release */ s->nclip_targets[selection] = 0; } @@ -502,7 +504,8 @@ static void clipboard_owner_change(GtkClipboard *clipboard, if (s->clip_grabbed[selection]) { s->clip_grabbed[selection] = FALSE; - spice_main_clipboard_selection_release(s->main, selection); + if (spice_main_agent_test_capability(s->main, VD_AGENT_CAP_CLIPBOARD_BY_DEMAND)) + spice_main_clipboard_selection_release(s->main, selection); } switch (event->reason) { |