[Spice-devel] [PATCH spice-gtk] Clipboard clean-up and fixes for Windows client
Hans de Goede
hdegoede at redhat.com
Sat May 26 01:45:45 PDT 2012
Hans,
Oh, nice cleanup! ACK!
Regards,
Hans
On 05/26/2012 03:00 AM, Marc-André Lureau wrote:
> The Windows client was getting in the way of guest copy-paste,
> because when the guest was taking the clipboard grab, the agent
> notifies the client, it takes the grab too, and in return
> receives clipboard notification of new ownership from the client
> clipboard.
>
> Though we had a hack to check if this new client clipboard event
> is caused by us, the Windows Gtk clipboard is giving 2 notifications
> for some reasons.
>
> It turned out there is a much better way than the "selfgrab" hack,
> by setting ownership of the clipboard. Problem solved, and cleaner
> code!
>
> https://bugzilla.redhat.com/show_bug.cgi?id=822688
> ---
> gtk/spice-gtk-session.c | 18 ++++++------------
> 1 file changed, 6 insertions(+), 12 deletions(-)
>
> diff --git a/gtk/spice-gtk-session.c b/gtk/spice-gtk-session.c
> index f77296d..3d2483d 100644
> --- a/gtk/spice-gtk-session.c
> +++ b/gtk/spice-gtk-session.c
> @@ -37,7 +37,6 @@ struct _SpiceGtkSessionPrivate {
> gboolean clip_hasdata[CLIPBOARD_LAST];
> gboolean clip_grabbed[CLIPBOARD_LAST];
> gboolean clipboard_by_guest[CLIPBOARD_LAST];
> - gboolean clipboard_selfgrab_pending[CLIPBOARD_LAST];
> /* auto-usbredir related */
> gboolean auto_usbredir_enable;
> gboolean keyboard_focus;
> @@ -510,10 +509,9 @@ static void clipboard_owner_change(GtkClipboard *clipboard,
>
> switch (event->reason) {
> case GDK_OWNER_CHANGE_NEW_OWNER:
> - if (s->clipboard_selfgrab_pending[selection]) {
> - s->clipboard_selfgrab_pending[selection] = FALSE;
> + if (gtk_clipboard_get_owner(clipboard) == G_OBJECT(self))
> break;
> - }
> +
> s->clipboard_by_guest[selection] = FALSE;
> s->clip_hasdata[selection] = TRUE;
> if (s->auto_clipboard_enable&& !read_only(self))
> @@ -664,12 +662,11 @@ static gboolean clipboard_grab(SpiceMainChannel *main, guint selection,
> s->nclip_targets[selection] == 0)
> goto skip_grab_clipboard;
>
> - if (!gtk_clipboard_set_with_data(cb, targets, i, clipboard_get,
> - clipboard_clear, self)) {
> + if (!gtk_clipboard_set_with_owner(cb, targets, i,
> + clipboard_get, clipboard_clear, G_OBJECT(self))) {
> g_warning("clipboard grab failed");
> return FALSE;
> }
> - s->clipboard_selfgrab_pending[selection] = TRUE;
> s->clipboard_by_guest[selection] = TRUE;
> s->clip_hasdata[selection] = FALSE;
>
> @@ -930,14 +927,11 @@ void spice_gtk_session_paste_from_guest(SpiceGtkSession *self)
> return;
> }
>
> - if (!gtk_clipboard_set_with_data(s->clipboard,
> - s->clip_targets[selection],
> - s->nclip_targets[selection],
> - clipboard_get, clipboard_clear, self)) {
> + if (!gtk_clipboard_set_with_owner(s->clipboard, s->clip_targets[selection], s->nclip_targets[selection],
> + clipboard_get, clipboard_clear, G_OBJECT(self))) {
> g_warning("Clipboard grab failed");
> return;
> }
> - s->clipboard_selfgrab_pending[selection] = TRUE;
> s->clipboard_by_guest[selection] = TRUE;
> s->clip_hasdata[selection] = FALSE;
> }
More information about the Spice-devel
mailing list