[Spice-devel] [PATCH spice-gtk 3/3] clipboard: invalidate targets request when needed
Jakub Janku
jjanku at redhat.com
Thu Mar 7 21:37:47 UTC 2019
Hi,
On Wed, Mar 6, 2019 at 7:11 PM Marc-André Lureau
<marcandre.lureau at gmail.com> wrote:
>
> 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?
This surely looks simpler,
thanks :)
Jakub
>
> 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