diff options
Diffstat (limited to 'hw/xwayland/xwayland-present.c')
-rw-r--r-- | hw/xwayland/xwayland-present.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/hw/xwayland/xwayland-present.c b/hw/xwayland/xwayland-present.c index 1a99228a1..7ae13e649 100644 --- a/hw/xwayland/xwayland-present.c +++ b/hw/xwayland/xwayland-present.c @@ -98,14 +98,16 @@ xwl_present_has_pending_events(struct xwl_present_window *xwl_present_window) !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; @@ -359,8 +361,8 @@ xwl_present_queue_vblank(WindowPtr present_window, xorg_list_append(&event->list, &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); @@ -495,9 +497,6 @@ xwl_present_flip(WindowPtr present_window, /* 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); @@ -506,6 +505,9 @@ xwl_present_flip(WindowPtr present_window, /* Realign timer */ xwl_present_reset_timer(xwl_present_window); + 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, |