[PATCH weston] xwm: Don't clear the selection if it has no text type available

Carlos Garnacho carlosg at gnome.org
Thu Feb 4 22:37:36 UTC 2016


Hi!,

On Mon, Feb 1, 2016 at 9:36 PM, Derek Foreman <derekf at osg.samsung.com> wrote:
> weston maintains a copy of the most recently selected "thing" - it picks
> the first available type when it copies, and saves that one only.
>
> When an application quits weston will make the saved selection active.
>
> When xwm sees the selection set it will check if any of the offered types
> are text.  If no text type is offered it will clear the selection.
>
> weston then interprets this in the same way as an application exiting and
> causing the selection to be unset, and we get caught in a live lock with
> both weston and xwayland consuming as much cpu as they can.
>
> The simple fix is to just remove the test for text presence.
>
> Signed-off-by: Derek Foreman <derekf at osg.samsung.com>
> ---
>
> This is kind of an alternate solution to the problem fixed in
> http://patchwork.freedesktop.org/patch/70435
>
> I don't understand why offers with no text type are cleared here,
> and couldn't find why with git blame either.  Anyone know why
> we've been doing this?

No idea myself, seems a rather arbitrary check. there shouldn't be any
reason this shouldn't work for other mimetypes offered.

>
> With this patch we can get somewhat odd behaviour - if terminology
> exits with a selection it can only be pasted into another terminology
> not a weston-terminal, because text wasn't the first offer and weston
> only saves the first offer.
>
> That seems better than a livelock though.  Maybe we can grab all available
> offers when cloning the selection instead of just the first (but that should
> be done in addition to this patch, I think, because we could have an app that
> doesn't offer text at all exit with a selection set and cause the same lock)

Reviewed-by: Carlos Garnacho <carlosg at gnome.org>

I agree with the conclusion and the approach in this patch. As you say
the next step is storing all offers, but I guess it depends on how
deep we want weston to get into the clipboard manager role. AFAICS
that'd be most similar to how toolkits/apps used to behave wrt
SAVE_TARGETS as defined in the clipboard manager spec [1], where
simply all mimetypes would be stored (see eg. gtk_clipboard_store())

Cheers,
  Carlos

[1] http://www.freedesktop.org/wiki/ClipboardManager/

>
>
>  xwayland/selection.c | 28 ++++------------------------
>  1 file changed, 4 insertions(+), 24 deletions(-)
>
> diff --git a/xwayland/selection.c b/xwayland/selection.c
> index 25ec848..24aa324 100644
> --- a/xwayland/selection.c
> +++ b/xwayland/selection.c
> @@ -655,8 +655,6 @@ weston_wm_set_selection(struct wl_listener *listener, void *data)
>         struct weston_wm *wm =
>                 container_of(listener, struct weston_wm, selection_listener);
>         struct weston_data_source *source = seat->selection_data_source;
> -       const char **p, **end;
> -       int has_text_plain = 0;
>
>         if (source == NULL) {
>                 if (wm->selection_owner == wm->selection_window)
> @@ -670,28 +668,10 @@ weston_wm_set_selection(struct wl_listener *listener, void *data)
>         if (source->send == data_source_send)
>                 return;
>
> -       p = source->mime_types.data;
> -       end = (const char **)
> -               ((char *) source->mime_types.data + source->mime_types.size);
> -       while (p < end) {
> -               weston_log("  %s\n", *p);
> -               if (strcmp(*p, "text/plain") == 0 ||
> -                   strcmp(*p, "text/plain;charset=utf-8") == 0)
> -                       has_text_plain = 1;
> -               p++;
> -       }
> -
> -       if (has_text_plain) {
> -               xcb_set_selection_owner(wm->conn,
> -                                       wm->selection_window,
> -                                       wm->atom.clipboard,
> -                                       XCB_TIME_CURRENT_TIME);
> -       } else {
> -               xcb_set_selection_owner(wm->conn,
> -                                       XCB_ATOM_NONE,
> -                                       wm->atom.clipboard,
> -                                       XCB_TIME_CURRENT_TIME);
> -       }
> +       xcb_set_selection_owner(wm->conn,
> +                               wm->selection_window,
> +                               wm->atom.clipboard,
> +                               XCB_TIME_CURRENT_TIME);
>  }
>
>  void
> --
> 2.7.0
>
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel


More information about the wayland-devel mailing list