On Sat, Jun 24, 2017 at 1:18 AM, Scott Moreau <ore...@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.
_______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/wayland-devel