diff -Nru xwayland-22.1.0/debian/changelog xwayland-22.1.1/debian/changelog --- xwayland-22.1.0/debian/changelog 2022-02-16 18:20:06.000000000 +0000 +++ xwayland-22.1.1/debian/changelog 2022-04-01 06:40:47.000000000 +0000 @@ -1,3 +1,9 @@ +xwayland (2:22.1.1-1) unstable; urgency=medium + + * New upstream release. + + -- Timo Aaltonen Fri, 01 Apr 2022 09:40:47 +0300 + xwayland (2:22.1.0-1) unstable; urgency=medium * New upstream release. diff -Nru xwayland-22.1.0/hw/xwayland/xwayland-present.c xwayland-22.1.1/hw/xwayland/xwayland-present.c --- xwayland-22.1.0/hw/xwayland/xwayland-present.c 2022-02-16 13:18:05.153603300 +0000 +++ xwayland-22.1.1/hw/xwayland/xwayland-present.c 2022-03-31 07:57:25.658587000 +0000 @@ -66,6 +66,7 @@ if (!xwl_present_window) return NULL; + xwl_present_window->window = window; xwl_present_window->msc = 1; xwl_present_window->ust = GetTimeInMicros(); @@ -127,14 +128,16 @@ !xorg_list_is_empty(&xwl_present_window->wait_list); } -static void +void xwl_present_reset_timer(struct xwl_present_window *xwl_present_window) { if (xwl_present_has_pending_events(xwl_present_window)) { + struct xwl_window *xwl_window = xwl_window_from_window(xwl_present_window->window); CARD32 now = GetTimeInMillis(); CARD32 timeout; - if (!xorg_list_is_empty(&xwl_present_window->frame_callback_list)) + if (xwl_window && xwl_window->frame_callback && + !xorg_list_is_empty(&xwl_present_window->frame_callback_list)) timeout = TIMER_LEN_FLIP; else timeout = TIMER_LEN_COPY; @@ -505,8 +508,8 @@ xorg_list_del(&event->vblank.event_queue); xorg_list_append(&event->vblank.event_queue, &xwl_present_window->wait_list); - /* If there's a pending frame callback, use that */ - if (xwl_window && xwl_window->frame_callback && + /* Hook up to frame callback */ + if (xwl_window && xorg_list_is_empty(&xwl_present_window->frame_callback_list)) { xorg_list_add(&xwl_present_window->frame_callback_list, &xwl_window->frame_callback_list); @@ -700,14 +703,14 @@ /* We can flip directly to the main surface (full screen window without clips) */ wl_surface_attach(xwl_window->surface, buffer, 0, 0); - if (!xwl_window->frame_callback) - xwl_window_create_frame_callback(xwl_window); - if (xorg_list_is_empty(&xwl_present_window->frame_callback_list)) { xorg_list_add(&xwl_present_window->frame_callback_list, &xwl_window->frame_callback_list); } + if (!xwl_window->frame_callback) + xwl_window_create_frame_callback(xwl_window); + xwl_surface_damage(xwl_window->xwl_screen, xwl_window->surface, damage_box->x1 - present_window->drawable.x, damage_box->y1 - present_window->drawable.y, @@ -942,6 +945,9 @@ * the frame timer interval. */ xorg_list_del(&xwl_present_window->frame_callback_list); + + /* Make sure the timer callback doesn't get called */ + xwl_present_window->timer_armed = 0; xwl_present_reset_timer(xwl_present_window); } diff -Nru xwayland-22.1.0/hw/xwayland/xwayland-present.h xwayland-22.1.1/hw/xwayland/xwayland-present.h --- xwayland-22.1.0/hw/xwayland/xwayland-present.h 2022-02-16 13:18:05.153603300 +0000 +++ xwayland-22.1.1/hw/xwayland/xwayland-present.h 2022-03-31 07:57:25.658587000 +0000 @@ -35,6 +35,8 @@ #ifdef GLAMOR_HAS_GBM struct xwl_present_window { + WindowPtr window; + struct xorg_list frame_callback_list; uint64_t msc; @@ -59,6 +61,7 @@ PixmapPtr pixmap; }; +void xwl_present_reset_timer(struct xwl_present_window *xwl_present_window); void xwl_present_frame_callback(struct xwl_present_window *xwl_present_window); Bool xwl_present_init(ScreenPtr screen); void xwl_present_cleanup(WindowPtr window); diff -Nru xwayland-22.1.0/hw/xwayland/xwayland-window.c xwayland-22.1.1/hw/xwayland/xwayland-window.c --- xwayland-22.1.0/hw/xwayland/xwayland-window.c 2022-02-16 13:18:05.153603300 +0000 +++ xwayland-22.1.1/hw/xwayland/xwayland-window.c 2022-03-31 07:57:25.659587000 +0000 @@ -522,6 +522,7 @@ xwl_realize_window(WindowPtr window) { ScreenPtr screen = window->drawable.pScreen; + CompScreenPtr comp_screen = GetCompScreen(screen); struct xwl_screen *xwl_screen; Bool ret; @@ -535,12 +536,20 @@ if (!ret) return FALSE; - if (xwl_screen->rootless && !window->parent) { - BoxRec box = { 0, 0, xwl_screen->width, xwl_screen->height }; + if (xwl_screen->rootless) { + /* We do not want the COW to be mapped when rootless in Xwayland */ + if (window == comp_screen->pOverlayWin) { + window->mapped = FALSE; + return TRUE; + } + + if (!window->parent) { + BoxRec box = { 0, 0, xwl_screen->width, xwl_screen->height }; - RegionReset(&window->winSize, &box); - RegionNull(&window->clipList); - RegionNull(&window->borderClip); + RegionReset(&window->winSize, &box); + RegionNull(&window->clipList); + RegionNull(&window->borderClip); + } } if (xwl_screen->rootless ? @@ -596,16 +605,6 @@ if (xwl_window_has_viewport_enabled(xwl_window)) xwl_window_disable_viewport(xwl_window); - wl_surface_destroy(xwl_window->surface); - xorg_list_del(&xwl_window->link_damage); - xorg_list_del(&xwl_window->link_window); - unregister_damage(window); - - xwl_window_buffers_dispose(xwl_window); - - if (xwl_window->frame_callback) - wl_callback_destroy(xwl_window->frame_callback); - #ifdef GLAMOR_HAS_GBM if (xwl_screen->present) { struct xwl_present_window *xwl_present_window, *tmp; @@ -618,6 +617,16 @@ } #endif + wl_surface_destroy(xwl_window->surface); + xorg_list_del(&xwl_window->link_damage); + xorg_list_del(&xwl_window->link_window); + unregister_damage(window); + + xwl_window_buffers_dispose(xwl_window); + + if (xwl_window->frame_callback) + wl_callback_destroy(xwl_window->frame_callback); + free(xwl_window); dixSetPrivate(&window->devPrivates, &xwl_window_private_key, NULL); @@ -756,6 +765,18 @@ xwl_window->frame_callback = wl_surface_frame(xwl_window->surface); wl_callback_add_listener(xwl_window->frame_callback, &frame_listener, xwl_window); + +#ifdef GLAMOR_HAS_GBM + if (xwl_window->xwl_screen->present) { + struct xwl_present_window *xwl_present_window, *tmp; + + xorg_list_for_each_entry_safe(xwl_present_window, tmp, + &xwl_window->frame_callback_list, + frame_callback_list) { + xwl_present_reset_timer(xwl_present_window); + } + } +#endif } Bool diff -Nru xwayland-22.1.0/meson.build xwayland-22.1.1/meson.build --- xwayland-22.1.0/meson.build 2022-02-16 13:18:05.160603500 +0000 +++ xwayland-22.1.1/meson.build 2022-03-31 07:57:25.668587000 +0000 @@ -3,7 +3,7 @@ 'buildtype=debugoptimized', 'c_std=gnu99', ], - version: '22.1.0', + version: '22.1.1', meson_version: '>= 0.47.0', ) release_date = '2021-07-05'