[Spice-devel] [PATCH spice-gtk 3/3] clipboard: invalidate targets request when needed
Marc-André Lureau
marcandre.lureau at gmail.com
Wed Mar 6 18:11:00 UTC 2019
Hi
On Thu, Feb 28, 2019 at 8:12 PM Jakub Janků <jjanku at redhat.com> wrote:
>
> Targets request is no longer relevant when
> clipboard owner changes since the retrieved targets
> will be outdated.
>
> When the request is no longer relevant,
> invalidate it by pointing its weak ref to NULL.
> As a consequence, free_weak_ref() call returns NULL
> and clipboard_get_targets() exits.
Why not simply check if user_data == last_targets_request?
What does nullify_weak_ref() really helps with?
>
> Signed-off-by: Jakub Janků <jjanku at redhat.com>
> ---
>
> This addresses the same issue that
> was present in spice-vdagent and is already fixed.
>
> ---
> src/spice-gtk-session.c | 39 +++++++++++++++++++++++++++++----------
> 1 file changed, 29 insertions(+), 10 deletions(-)
>
> diff --git a/src/spice-gtk-session.c b/src/spice-gtk-session.c
> index 018cb4b..037547a 100644
> --- a/src/spice-gtk-session.c
> +++ b/src/spice-gtk-session.c
> @@ -59,6 +59,7 @@ struct _SpiceGtkSessionPrivate {
> gboolean clip_hasdata[CLIPBOARD_LAST];
> gboolean clip_grabbed[CLIPBOARD_LAST];
> gboolean clipboard_by_guest[CLIPBOARD_LAST];
> + GWeakRef *last_targets_request[CLIPBOARD_LAST];
> /* auto-usbredir related */
> gboolean auto_usbredir_enable;
> int auto_usbredir_reqs;
> @@ -537,6 +538,16 @@ static gpointer free_weak_ref(gpointer data)
> return object;
> }
>
> +static void nullify_weak_ref(GWeakRef **weak_ref_p)
> +{
> + gpointer null_object = NULL;
> +
> + if (*weak_ref_p) {
> + g_weak_ref_set(*weak_ref_p, null_object);
> + *weak_ref_p = NULL;
> + }
> +}
> +
> static void clipboard_get_targets(GtkClipboard *clipboard,
> GdkAtom *atoms,
> gint n_atoms,
> @@ -551,23 +562,25 @@ static void clipboard_get_targets(GtkClipboard *clipboard,
>
> g_return_if_fail(SPICE_IS_GTK_SESSION(self));
>
> - if (atoms == NULL) {
> - SPICE_DEBUG("Retrieving the clipboard data has failed");
> - return;
> - }
> -
> SpiceGtkSessionPrivate *s = self->priv;
> guint32 types[SPICE_N_ELEMENTS(atom2agent)] = { 0 };
> gint num_types;
> int a;
> int selection;
>
> - if (s->main == NULL)
> - return;
> -
> selection = get_selection_from_clipboard(s, clipboard);
> g_return_if_fail(selection != -1);
>
> + s->last_targets_request[selection] = NULL;
> +
> + if (atoms == NULL) {
> + SPICE_DEBUG("Retrieving the clipboard data has failed");
> + return;
> + }
> +
> + if (s->main == NULL)
> + return;
> +
> if (s->clip_grabbed[selection]) {
> SPICE_DEBUG("Clipboard is already grabbed, ignoring %d atoms", n_atoms);
> return;
> @@ -652,6 +665,8 @@ static void clipboard_owner_change(GtkClipboard *clipboard,
> return;
> }
>
> + nullify_weak_ref(&s->last_targets_request[selection]);
> +
> /* In case we sent a grab to the agent, we need to release it now as
> * previous clipboard data should not be reachable anymore */
> if (s->clip_grabbed[selection]) {
> @@ -690,9 +705,11 @@ static void clipboard_owner_change(GtkClipboard *clipboard,
> #endif
>
> s->clip_hasdata[selection] = TRUE;
> - if (s->auto_clipboard_enable && !read_only(self))
> + if (s->auto_clipboard_enable && !read_only(self)) {
> + s->last_targets_request[selection] = get_weak_ref(self);
> gtk_clipboard_request_targets(clipboard, clipboard_get_targets,
> - get_weak_ref(self));
> + s->last_targets_request[selection]);
> + }
> }
>
> typedef struct
> @@ -866,6 +883,8 @@ static gboolean clipboard_grab(SpiceMainChannel *main, guint selection,
> return TRUE;
> }
>
> + nullify_weak_ref(&s->last_targets_request[selection]);
> +
> if (!gtk_clipboard_set_with_owner(cb,
> targets,
> num_targets,
> --
> 2.20.1
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/spice-devel
--
Marc-André Lureau
More information about the Spice-devel
mailing list