diff --git a/hw/xwayland/xwayland-input.c b/hw/xwayland/xwayland-input.c index 3c546057d..3b3337869 100644 --- a/hw/xwayland/xwayland-input.c +++ b/hw/xwayland/xwayland-input.c @@ -547,7 +547,7 @@ pointer_handle_enter(void *data, struct wl_pointer *pointer, dy = xwl_seat->focus_window->window->drawable.y; /* We just entered a new xwindow, forget about the old last xwindow */ - xwl_seat->last_xwindow = NullWindow; + xwl_seat->last_focus_window = NULL; master = GetMaster(dev, POINTER_OR_FLOAT); (*pScreen->SetCursorPosition) (dev, pScreen, dx + sx, dy + sy, TRUE); @@ -615,7 +615,7 @@ pointer_handle_leave(void *data, struct wl_pointer *pointer, * in sprite_check_lost_focus() */ if (xwl_seat->focus_window) { - xwl_seat->last_xwindow = xwl_seat->focus_window->window; + xwl_seat->last_focus_window = xwl_seat->focus_window; xwl_seat->focus_window = NULL; focus_lost = TRUE; } @@ -3192,8 +3192,9 @@ sprite_check_lost_focus(SpritePtr sprite, WindowPtr window) return TRUE; if (xwl_seat->focus_window == NULL && - xwl_seat->last_xwindow != NullWindow && - (IsParent(xwl_seat->last_xwindow, window) || xwl_seat->last_xwindow == window)) + xwl_seat->last_focus_window != NULL && + (xwl_seat->last_focus_window->window == window || + IsParent(xwl_seat->last_focus_window->window, window))) return TRUE; return FALSE; @@ -3227,13 +3228,13 @@ xwl_xy_to_window(ScreenPtr screen, SpritePtr sprite, int x, int y) } void -xwl_seat_clear_touch(struct xwl_seat *xwl_seat, WindowPtr window) +xwl_seat_clear_touch(struct xwl_seat *xwl_seat, struct xwl_window *xwl_window) { struct xwl_touch *xwl_touch, *next_xwl_touch; xorg_list_for_each_entry_safe(xwl_touch, next_xwl_touch, &xwl_seat->touches, link_touch) { - if (xwl_touch->window->window == window) { + if (xwl_touch->window == xwl_window) { xorg_list_del(&xwl_touch->link_touch); free(xwl_touch); } diff --git a/hw/xwayland/xwayland-input.h b/hw/xwayland/xwayland-input.h index 2e686f945..d40bca08a 100644 --- a/hw/xwayland/xwayland-input.h +++ b/hw/xwayland/xwayland-input.h @@ -81,7 +81,7 @@ struct xwl_seat { OsTimerPtr x_cursor_timer; CursorPtr pending_x_cursor; struct xwl_cursor cursor; - WindowPtr last_xwindow; + struct xwl_window *last_focus_window; uint32_t pointer_gesture_swipe_fingers; uint32_t pointer_gesture_pinch_fingers; @@ -195,7 +195,7 @@ void xwl_seat_leave_kbd(struct xwl_seat *xwl_seat); void xwl_seat_destroy(struct xwl_seat *xwl_seat); -void xwl_seat_clear_touch(struct xwl_seat *xwl_seat, WindowPtr window); +void xwl_seat_clear_touch(struct xwl_seat *xwl_seat, struct xwl_window *xwl_window); void xwl_seat_emulate_pointer_warp(struct xwl_seat *xwl_seat, struct xwl_window *xwl_window, diff --git a/hw/xwayland/xwayland-window.c b/hw/xwayland/xwayland-window.c index a8731f4dd..2650e5cdd 100644 --- a/hw/xwayland/xwayland-window.c +++ b/hw/xwayland/xwayland-window.c @@ -1452,23 +1452,6 @@ xwl_unrealize_window(WindowPtr window) xwl_screen = xwl_screen_get(screen); - xorg_list_for_each_entry(xwl_seat, &xwl_screen->seat_list, link) { - if (xwl_seat->focus_window && xwl_seat->focus_window->window == window) - xwl_seat->focus_window = NULL; - if (xwl_seat->tablet_focus_window && xwl_seat->tablet_focus_window->window == window) - xwl_seat->tablet_focus_window = NULL; - if (xwl_seat->last_xwindow == window) - xwl_seat->last_xwindow = NullWindow; - if (xwl_seat->cursor_confinement_window && - xwl_seat->cursor_confinement_window->window == window) - xwl_seat_unconfine_pointer(xwl_seat); - if (xwl_seat->pointer_warp_emulator && - xwl_seat->pointer_warp_emulator->locked_window && - xwl_seat->pointer_warp_emulator->locked_window->window == window) - xwl_seat_destroy_pointer_warp_emulator(xwl_seat); - xwl_seat_clear_touch(xwl_seat, window); - } - compUnredirectWindow(serverClient, window, CompositeRedirectManual); screen->UnrealizeWindow = xwl_screen->UnrealizeWindow; @@ -1480,6 +1463,21 @@ xwl_unrealize_window(WindowPtr window) if (!xwl_window) return ret; + xorg_list_for_each_entry(xwl_seat, &xwl_screen->seat_list, link) { + if (xwl_seat->focus_window == xwl_window) + xwl_seat->focus_window = NULL; + if (xwl_seat->tablet_focus_window == xwl_window) + xwl_seat->tablet_focus_window = NULL; + if (xwl_seat->last_focus_window == xwl_window) + xwl_seat->last_focus_window = NULL; + if (xwl_seat->cursor_confinement_window == xwl_window) + xwl_seat_unconfine_pointer(xwl_seat); + if (xwl_seat->pointer_warp_emulator && + xwl_seat->pointer_warp_emulator->locked_window == xwl_window) + xwl_seat_destroy_pointer_warp_emulator(xwl_seat); + xwl_seat_clear_touch(xwl_seat, xwl_window); + } + if (xwl_window_has_viewport_enabled(xwl_window)) xwl_window_disable_viewport(xwl_window); #ifdef XWL_HAS_GLAMOR