x11: wait until the window is mapped

This blocks everything, until the window is actually reported as mapped.

This fixes the race condition between VO initialization and mapping the
window, which resulted in possibly different window sizes, leading to an
immediate redraw, visible as flashing.

Note that if the map event never comes for some reason, we're out of
luck and will block forever.
This commit is contained in:
wm4 2014-05-15 23:47:00 +02:00
parent 1eee4d7799
commit 9bfe3f394c
1 changed files with 11 additions and 0 deletions

View File

@ -1336,6 +1336,16 @@ static void vo_x11_highlevel_resize(struct vo *vo, int x, int y, int w, int h)
update_vo_size(vo); update_vo_size(vo);
} }
static void wait_until_mapped(struct vo *vo)
{
struct vo_x11_state *x11 = vo->x11;
while (x11->window_hidden) {
XEvent unused;
XPeekEvent(x11->display, &unused);
vo_x11_check_events(vo);
}
}
/* Create and setup a window suitable for display /* Create and setup a window suitable for display
* vis: Visual to use for creating the window (NULL for default) * vis: Visual to use for creating the window (NULL for default)
* x, y: position of window (might be ignored) * x, y: position of window (might be ignored)
@ -1408,6 +1418,7 @@ void vo_x11_config_vo_window(struct vo *vo, XVisualInfo *vis, int flags,
x11->win_width = width; x11->win_width = width;
x11->win_height = height; x11->win_height = height;
} }
wait_until_mapped(vo);
update_vo_size(vo); update_vo_size(vo);
x11->pending_vo_events &= ~VO_EVENT_RESIZE; // implicitly done by the VO x11->pending_vo_events &= ~VO_EVENT_RESIZE; // implicitly done by the VO
} }