diff --git a/include/client.h b/include/client.h index 2ad616c..af1827f 100644 --- a/include/client.h +++ b/include/client.h @@ -67,6 +67,10 @@ typedef struct Client { bool can_fullscreen; ClientRuleEffects rule_effects; + /* Deferred monitor/tags — set by applyrules, used by setmon in mapnotify */ + Monitor *pending_mon; + uint32_t pending_tags; + /* COLD — wl_listeners (set up once, rarely touched after) */ struct wl_listener commit; struct wl_listener map; diff --git a/src/peachwm.c b/src/peachwm.c index 7c64e62..1ddfbb3 100644 --- a/src/peachwm.c +++ b/src/peachwm.c @@ -492,7 +492,8 @@ static void applyrules(Client *c) { } c->isfloating |= client_is_float_type(c); - setmon(c, mon, newtags); + c->pending_mon = mon; + c->pending_tags = newtags; } static void client_arr_add(Client *c) { @@ -956,10 +957,9 @@ static void commitnotify(struct wl_listener *listener, void *data) { * a wrong monitor. */ applyrules(c); - if (c->mon) { - client_set_scale(client_surface(c), c->mon->wlr_output->scale); + if (c->pending_mon) { + client_set_scale(client_surface(c), c->pending_mon->wlr_output->scale); } - setmon(c, nullptr, 0); /* Make sure to reapply rules in mapnotify() */ wlr_xdg_toplevel_set_wm_capabilities( c->surface.xdg->toplevel, WLR_XDG_TOPLEVEL_WM_CAPABILITIES_FULLSCREEN); @@ -2289,6 +2289,9 @@ static void mapnotify(struct wl_listener *listener, void *data) { } } + /* Deferred setmon — scene nodes now exist */ + setmon(c, c->pending_mon, c->pending_tags); + if (c->isfullscreen) setfullscreen(c, 1); if (c->border_bg)