summaryrefslogtreecommitdiff
path: root/hw/xwayland/xwayland-present.c
diff options
context:
space:
mode:
Diffstat (limited to 'hw/xwayland/xwayland-present.c')
-rw-r--r--hw/xwayland/xwayland-present.c16
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,