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:
parent
9f3d3f2fba
commit
39a609acb0
|
@ -1272,6 +1272,9 @@ static void handle_new_windows(session_t *ps) {
|
|||
}
|
||||
auto mw = (struct managed_win *)new_w;
|
||||
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);
|
||||
|
||||
// This window might be damaged before we called fill_win
|
||||
|
|
|
@ -285,7 +285,7 @@ static inline void ev_map_notify(session_t *ps, xcb_map_notify_event_t *ev) {
|
|||
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
|
||||
// recheck focus here
|
||||
|
|
|
@ -1976,6 +1976,7 @@ void win_update_screen(session_t *ps, struct managed_win *w) {
|
|||
|
||||
/// Map an already registered window
|
||||
void map_win_start(session_t *ps, struct managed_win *w) {
|
||||
assert(ps->server_grabbed);
|
||||
assert(w);
|
||||
|
||||
// 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->state == WSTATE_UNMAPPED);
|
||||
assert((w->flags & WIN_FLAGS_IMAGES_NONE) == WIN_FLAGS_IMAGES_NONE ||
|
||||
!ps->o.experimental_backends);
|
||||
|
||||
|
|
Loading…
Reference in New Issue