event: do delayed window mapping

This remove the only case where map_win_start is called outside of the
X critical section.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
This commit is contained in:
Yuxuan Shui 2019-09-20 02:15:41 +01:00
parent 9f3d3f2fba
commit 39a609acb0
No known key found for this signature in database
GPG Key ID: 37C999F617EA1A47
3 changed files with 6 additions and 1 deletions

View File

@ -1272,6 +1272,9 @@ static void handle_new_windows(session_t *ps) {
} }
auto mw = (struct managed_win *)new_w; auto mw = (struct managed_win *)new_w;
if (mw->a.map_state == XCB_MAP_STATE_VIEWABLE) { if (mw->a.map_state == XCB_MAP_STATE_VIEWABLE) {
// Have to map immediately instead of queue window update
// because we need the window's extent right now.
// We can do this because we are in the critical section.
map_win_start(ps, mw); map_win_start(ps, mw);
// This window might be damaged before we called fill_win // This window might be damaged before we called fill_win

View File

@ -285,7 +285,7 @@ static inline void ev_map_notify(session_t *ps, xcb_map_notify_event_t *ev) {
return; return;
} }
map_win_start(ps, w); win_queue_update(w, WIN_UPDATE_MAP);
// FocusIn/Out may be ignored when the window is unmapped, so we must // FocusIn/Out may be ignored when the window is unmapped, so we must
// recheck focus here // recheck focus here

View File

@ -1976,6 +1976,7 @@ void win_update_screen(session_t *ps, struct managed_win *w) {
/// Map an already registered window /// Map an already registered window
void map_win_start(session_t *ps, struct managed_win *w) { void map_win_start(session_t *ps, struct managed_win *w) {
assert(ps->server_grabbed);
assert(w); assert(w);
// Don't care about window mapping if it's an InputOnly window // Don't care about window mapping if it's an InputOnly window
@ -2003,6 +2004,7 @@ void map_win_start(session_t *ps, struct managed_win *w) {
assert(w); assert(w);
} }
assert(w->state == WSTATE_UNMAPPED);
assert((w->flags & WIN_FLAGS_IMAGES_NONE) == WIN_FLAGS_IMAGES_NONE || assert((w->flags & WIN_FLAGS_IMAGES_NONE) == WIN_FLAGS_IMAGES_NONE ||
!ps->o.experimental_backends); !ps->o.experimental_backends);