diff options
Diffstat (limited to 'hw/xwayland/xwayland.c')
-rw-r--r-- | hw/xwayland/xwayland.c | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c index 031c8f18b..9190f6536 100644 --- a/hw/xwayland/xwayland.c +++ b/hw/xwayland/xwayland.c @@ -329,7 +329,9 @@ xwl_realize_window(WindowPtr window) xwl_window = calloc(sizeof *xwl_window, 1); xwl_window->xwl_screen = xwl_screen; xwl_window->window = window; - xwl_window->surface = xwl_create_surface(xwl_screen, xwl_window); + xorg_list_init(&xwl_window->link_realize); + xorg_list_append(&xwl_window->link_realize, + &xwl_screen->realize_window_list); dixSetPrivate(&window->devPrivates, &xwl_window_private_key, xwl_window); @@ -372,7 +374,10 @@ xwl_unrealize_window(WindowPtr window) if (!xwl_window) return ret; - wl_surface_destroy(xwl_window->surface); + if (!xorg_list_is_empty(&xwl_window->link_realize)) + xorg_list_del(&xwl_window->link_realize); + if (xwl_window->surface) + wl_surface_destroy(xwl_window->surface); if (RegionNotEmpty(DamageRegion(xwl_window->damage))) xorg_list_del(&xwl_window->link_damage); DamageUnregister(xwl_window->damage); @@ -390,6 +395,20 @@ xwl_save_screen(ScreenPtr pScreen, int on) } static void +xwl_screen_realize_windows(struct xwl_screen *xwl_screen) +{ + struct xwl_window *xwl_window, *cur; + + xorg_list_for_each_entry_safe(xwl_window, cur, + &xwl_screen->realize_window_list, + link_realize) { + xwl_window->surface = xwl_create_surface(xwl_screen, xwl_window); + if (xwl_window->surface) + xorg_list_del(&xwl_window->link_realize); + } +} + +static void xwl_screen_post_damage(struct xwl_screen *xwl_screen) { struct xwl_window *xwl_window; @@ -401,7 +420,6 @@ xwl_screen_post_damage(struct xwl_screen *xwl_screen) xorg_list_for_each_entry(xwl_window, &xwl_screen->damage_window_list, link_damage) { region = DamageRegion(xwl_window->damage); - pixmap = (*xwl_screen->screen->GetWindowPixmap) (xwl_window->window); #if GLAMOR_HAS_GBM @@ -411,6 +429,9 @@ xwl_screen_post_damage(struct xwl_screen *xwl_screen) if (!xwl_screen->glamor) buffer = xwl_shm_pixmap_get_wl_buffer(pixmap); + if (!xwl_window->surface) + continue; + wl_surface_attach(xwl_window->surface, buffer, 0, 0); box = RegionExtents(DamageRegion(xwl_window->damage); wl_surface_damage(xwl_window->surface, box->x1, box->y1, @@ -491,6 +512,7 @@ block_handler(void *data, struct timeval **tv, void *read_mask) struct xwl_screen *xwl_screen = data; int ret; + xwl_screen_realize_windows(xwl_screen); xwl_screen_post_damage(xwl_screen); while (xwl_screen->prepare_read == 0 && @@ -609,6 +631,7 @@ xwl_screen_init(ScreenPtr pScreen, int argc, char **argv) xorg_list_init(&xwl_screen->output_list); xorg_list_init(&xwl_screen->seat_list); xorg_list_init(&xwl_screen->damage_window_list); + xorg_list_init(&xwl_screen->realize_window_list); xwl_screen->depth = 24; xwl_screen->display = wl_display_connect(NULL); |