[PATCH 3/3] xwayland: Fix override redirect window positioning

Scott Moreau oreaus at gmail.com
Fri Jun 30 16:49:41 UTC 2017


On Sat, Jun 24, 2017 at 1:18 AM, Scott Moreau <oreaus at gmail.com> wrote:

> When override redirect windows are created, the x/y offsets
> provided at map time may be incorrect. The correct offsets are
> sent in a configure event from the xserver some time later.
> Here we fix the positions by delaying the call to set_xwayland()
> from map time to the needed configure event in the case where x/y
> are both 0 for override redirect windows.
> ---
>  xwayland/window-manager.c | 23 ++++++++++++++++++++---
>  xwayland/xwayland.h       |  1 +
>  2 files changed, 21 insertions(+), 3 deletions(-)
>
> diff --git a/xwayland/window-manager.c b/xwayland/window-manager.c
> index 951a7cf..2e61ea4 100644
> --- a/xwayland/window-manager.c
> +++ b/xwayland/window-manager.c
> @@ -169,6 +169,7 @@ struct weston_wm_window {
>         int maximized_horz;
>         struct wm_size_hints size_hints;
>         struct motif_wm_hints motif_hints;
> +       struct wl_list or_link;
>         struct wl_list link;
>  };
>
> @@ -737,9 +738,11 @@ our_resource(struct weston_wm *wm, uint32_t id)
>  static void
>  weston_wm_handle_configure_notify(struct weston_wm *wm,
> xcb_generic_event_t *event)
>  {
> +       const struct weston_desktop_xwayland_interface *xi =
> +               wm->server->compositor->xwayland_interface;
>         xcb_configure_notify_event_t *configure_notify =
>                 (xcb_configure_notify_event_t *) event;
> -       struct weston_wm_window *window;
> +       struct weston_wm_window *window, *w, *next;
>
>         wm_log("XCB_CONFIGURE_NOTIFY (window %d) %d,%d @ %dx%d%s\n",
>                configure_notify->window,
> @@ -760,6 +763,16 @@ weston_wm_handle_configure_notify(struct weston_wm
> *wm, xcb_generic_event_t *eve
>                 if (window->frame)
>                         frame_resize_inside(window->frame,
>                                             window->width, window->height);
> +               if (window->x != 0 || window->y != 0) {
> +                       wl_list_for_each_safe(w, next,
> &wm->or_window_list, or_link) {
> +                               if (w == window) {
> +                                       if (w->shsurf)
> +
>  xi->set_xwayland(w->shsurf, w->x, w->y);
> +                                       wl_list_remove(&w->or_link);
> +                                       break;
> +                               }
> +                       }
> +               }
>         }
>  }
>
> @@ -2478,6 +2491,7 @@ weston_wm_create(struct weston_xserver *wxs, int fd)
>         wl_signal_add(&wxs->compositor->kill_signal,
>                       &wm->kill_listener);
>         wl_list_init(&wm->unpaired_window_list);
> +       wl_list_init(&wm->or_window_list);
>
>         weston_wm_create_cursors(wm);
>         weston_wm_window_set_cursor(wm, wm->screen->root,
> XWM_CURSOR_LEFT_PTR);
> @@ -2761,8 +2775,11 @@ xserver_map_shell_surface(struct weston_wm_window
> *window,
>
>  window->legacy_fullscreen_output.output);
>                 return;
>         } else if (window->override_redirect) {
> -               xwayland_interface->set_xwayland(window->shsurf,
> -                                                window->x, window->y);
> +               if (window->x == 0 && window->y == 0)
> +                       wl_list_insert(&wm->or_window_list,
> &window->or_link);
> +               else
> +                       xwayland_interface->set_xwayland(window->shsurf,
> +
>              window->x, window->y);
>         } else if (window->transient_for && window->transient_for->surface)
> {
>                 parent = window->transient_for;
>                 if (weston_wm_window_type_inactive(window)) {
> diff --git a/xwayland/xwayland.h b/xwayland/xwayland.h
> index ca75f5b..54e8908 100644
> --- a/xwayland/xwayland.h
> +++ b/xwayland/xwayland.h
> @@ -72,6 +72,7 @@ struct weston_wm {
>         struct wl_listener activate_listener;
>         struct wl_listener kill_listener;
>         struct wl_list unpaired_window_list;
> +       struct wl_list or_window_list;
>
>         xcb_window_t selection_window;
>         xcb_window_t selection_owner;
> --
> 2.7.4
>
>

The problem fixed by this patch is also fixed with
https://lists.freedesktop.org/archives/wayland-devel/2017-June/034357.html
which is a much cleaner solution.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/wayland-devel/attachments/20170630/fdc5b9e4/attachment.html>


More information about the wayland-devel mailing list