opt: avoid arrange when restore from overview

This commit is contained in:
DreamMaoMao 2026-06-15 13:33:46 +08:00
parent 8a3d065cc1
commit 8ca013e6c3
4 changed files with 36 additions and 31 deletions

View file

@ -1355,9 +1355,9 @@ int32_t togglefullscreen(const Arg *arg) {
sel->isnamedscratchpad = 0; sel->isnamedscratchpad = 0;
if (sel->isfullscreen) if (sel->isfullscreen)
setfullscreen(sel, 0); setfullscreen(sel, 0, true);
else else
setfullscreen(sel, 1); setfullscreen(sel, 1, true);
return 0; return 0;
} }
@ -1401,9 +1401,9 @@ int32_t togglemaximizescreen(const Arg *arg) {
sel->isnamedscratchpad = 0; sel->isnamedscratchpad = 0;
if (sel->ismaximizescreen) if (sel->ismaximizescreen)
setmaximizescreen(sel, 0); setmaximizescreen(sel, 0, true);
else else
setmaximizescreen(sel, 1); setmaximizescreen(sel, 1, true);
setborder_color(sel); setborder_color(sel);
return 0; return 0;

View file

@ -16,12 +16,12 @@ void handle_foreign_maximize_request(struct wl_listener *listener, void *data) {
return; return;
if (c->ismaximizescreen && !event->maximized) { if (c->ismaximizescreen && !event->maximized) {
setmaximizescreen(c, 0); setmaximizescreen(c, 0, true);
return; return;
} }
if (!c->ismaximizescreen && event->maximized) { if (!c->ismaximizescreen && event->maximized) {
setmaximizescreen(c, 1); setmaximizescreen(c, 1, true);
return; return;
} }
} }
@ -59,12 +59,12 @@ void handle_foreign_fullscreen_request(struct wl_listener *listener,
return; return;
if (c->isfullscreen && !event->fullscreen) { if (c->isfullscreen && !event->fullscreen) {
setfullscreen(c, 0); setfullscreen(c, 0, true);
return; return;
} }
if (!c->isfullscreen && event->fullscreen) { if (!c->isfullscreen && event->fullscreen) {
setfullscreen(c, 1); setfullscreen(c, 1, true);
return; return;
} }
} }

View file

@ -743,9 +743,9 @@ void scroller_insert_stack(Client *c, Client *target_client,
return; return;
if (c->isfullscreen) if (c->isfullscreen)
setfullscreen(c, 0); setfullscreen(c, 0, true);
if (c->ismaximizescreen) if (c->ismaximizescreen)
setmaximizescreen(c, 0); setmaximizescreen(c, 0, true);
Monitor *m = c->mon; Monitor *m = c->mon;
uint32_t tag = m->pertag->curtag; uint32_t tag = m->pertag->curtag;
@ -785,9 +785,9 @@ void scroller_insert_stack(Client *c, Client *target_client,
head = head->prev_in_stack; head = head->prev_in_stack;
Client *stack_head = head->client; Client *stack_head = head->client;
if (stack_head->ismaximizescreen) if (stack_head->ismaximizescreen)
setmaximizescreen(stack_head, 0); setmaximizescreen(stack_head, 0, true);
if (stack_head->isfullscreen) if (stack_head->isfullscreen)
setfullscreen(stack_head, 0); setfullscreen(stack_head, 0, true);
/* 同步到 Client 字段 */ /* 同步到 Client 字段 */
sync_scroller_state_to_clients(m, tag); sync_scroller_state_to_clients(m, tag);

View file

@ -735,8 +735,9 @@ static void run(char *startup_cmd);
static void setcursor(struct wl_listener *listener, void *data); static void setcursor(struct wl_listener *listener, void *data);
static void setfloating(Client *c, int32_t floating); static void setfloating(Client *c, int32_t floating);
static void setfakefullscreen(Client *c, int32_t fakefullscreen); static void setfakefullscreen(Client *c, int32_t fakefullscreen);
static void setfullscreen(Client *c, int32_t fullscreen); static void setfullscreen(Client *c, int32_t fullscreen, bool rearrange);
static void setmaximizescreen(Client *c, int32_t maximizescreen); static void setmaximizescreen(Client *c, int32_t maximizescreen,
bool rearrange);
static void reset_maximizescreen_size(Client *c); static void reset_maximizescreen_size(Client *c);
static void setgaps(int32_t oh, int32_t ov, int32_t ih, int32_t iv); static void setgaps(int32_t oh, int32_t ov, int32_t ih, int32_t iv);
@ -1150,11 +1151,11 @@ void clear_fullscreen_flag(Client *c) {
} }
if (c->isfullscreen) { if (c->isfullscreen) {
setfullscreen(c, false); setfullscreen(c, false, true);
} }
if (c->ismaximizescreen) { if (c->ismaximizescreen) {
setmaximizescreen(c, 0); setmaximizescreen(c, 0, true);
} }
} }
@ -1748,7 +1749,7 @@ void applyrules(Client *c) {
view_in_mon(&(Arg){.ui = c->tags}, true, c->mon, true); view_in_mon(&(Arg){.ui = c->tags}, true, c->mon, true);
} }
setfullscreen(c, fullscreen_state_backup); setfullscreen(c, fullscreen_state_backup, true);
if (c->isfakefullscreen) { if (c->isfakefullscreen) {
setfakefullscreen(c, 1); setfakefullscreen(c, 1);
@ -3943,7 +3944,7 @@ fullscreennotify(struct wl_listener *listener, void *data) {
if (!c || c->iskilling) if (!c || c->iskilling)
return; return;
setfullscreen(c, client_wants_fullscreen(c)); setfullscreen(c, client_wants_fullscreen(c), true);
} }
void requestmonstate(struct wl_listener *listener, void *data) { void requestmonstate(struct wl_listener *listener, void *data) {
@ -4586,9 +4587,9 @@ void maximizenotify(struct wl_listener *listener, void *data) {
} }
if (client_request_maximize(c, data)) { if (client_request_maximize(c, data)) {
setmaximizescreen(c, 1); setmaximizescreen(c, 1, true);
} else { } else {
setmaximizescreen(c, 0); setmaximizescreen(c, 0, true);
} }
} }
@ -5453,7 +5454,7 @@ void exit_scroller_stack(Client *c) {
} }
} }
void setmaximizescreen(Client *c, int32_t maximizescreen) { void setmaximizescreen(Client *c, int32_t maximizescreen, bool rearrange) {
struct wlr_box maximizescreen_box; struct wlr_box maximizescreen_box;
if (!c || !c->mon || !client_surface(c)->mapped || c->iskilling) if (!c || !c->mon || !client_surface(c)->mapped || c->iskilling)
return; return;
@ -5494,7 +5495,8 @@ void setmaximizescreen(Client *c, int32_t maximizescreen) {
client_set_maximized(c, true); client_set_maximized(c, true);
} }
arrange(c->mon, false, false); if (rearrange)
arrange(c->mon, false, false);
} }
void setfakefullscreen(Client *c, int32_t fakefullscreen) { void setfakefullscreen(Client *c, int32_t fakefullscreen) {
@ -5503,12 +5505,13 @@ void setfakefullscreen(Client *c, int32_t fakefullscreen) {
return; return;
if (c->isfullscreen) if (c->isfullscreen)
setfullscreen(c, 0); setfullscreen(c, 0, true);
client_set_fullscreen(c, fakefullscreen); client_set_fullscreen(c, fakefullscreen);
} }
void setfullscreen(Client *c, int32_t fullscreen) // 用自定义全屏代理自带全屏 void setfullscreen(Client *c, int32_t fullscreen,
bool rearrange) // 用自定义全屏代理自带全屏
{ {
if (!c || !c->mon || !client_surface(c)->mapped || c->iskilling) if (!c || !c->mon || !client_surface(c)->mapped || c->iskilling)
@ -5554,7 +5557,8 @@ void setfullscreen(Client *c, int32_t fullscreen) // 用自定义全屏代理自
layers[fullscreen || c->isfloating ? LyrTop : LyrTile]); layers[fullscreen || c->isfloating ? LyrTop : LyrTile]);
} }
arrange(c->mon, false, false); if (rearrange)
arrange(c->mon, false, false);
} }
void setgaps(int32_t oh, int32_t ov, int32_t ih, int32_t iv) { void setgaps(int32_t oh, int32_t ov, int32_t ih, int32_t iv) {
@ -5683,7 +5687,8 @@ void setmon(Client *c, Monitor *m, uint32_t newtags, bool focus) {
client_reset_mon_tags(c, m, newtags); client_reset_mon_tags(c, m, newtags);
check_match_tag_floating_rule(c, m); check_match_tag_floating_rule(c, m);
setfloating(c, c->isfloating); setfloating(c, c->isfloating);
setfullscreen(c, c->isfullscreen); /* This will call arrange(c->mon) */ setfullscreen(c, c->isfullscreen,
true); /* This will call arrange(c->mon) */
} }
if (focus && !client_is_x11_popup(c)) { if (focus && !client_is_x11_popup(c)) {
@ -6275,13 +6280,13 @@ void overview_restore(Client *c, const Arg *arg) {
resize(c, c->overview_backup_geom, 0); resize(c, c->overview_backup_geom, 0);
} else if (c->isfullscreen || c->ismaximizescreen) { } else if (c->isfullscreen || c->ismaximizescreen) {
if (want_restore_fullscreen(c) && c->ismaximizescreen) { if (want_restore_fullscreen(c) && c->ismaximizescreen) {
setmaximizescreen(c, 1); setmaximizescreen(c, 1, false);
} else if (want_restore_fullscreen(c) && c->isfullscreen) { } else if (want_restore_fullscreen(c) && c->isfullscreen) {
setfullscreen(c, 1); setfullscreen(c, 1, false);
} else { } else {
client_pending_fullscreen_state(c, 0); client_pending_fullscreen_state(c, 0);
client_pending_maximized_state(c, 0); client_pending_maximized_state(c, 0);
setfullscreen(c, false); setfullscreen(c, false, false);
} }
} else { } else {
if (c->is_restoring_from_ov) { if (c->is_restoring_from_ov) {
@ -6477,8 +6482,8 @@ void unmapnotify(struct wl_listener *listener, void *data) {
} }
if (c->swallowedby) { if (c->swallowedby) {
setmaximizescreen(c->swallowedby, c->ismaximizescreen); setmaximizescreen(c->swallowedby, c->ismaximizescreen, true);
setfullscreen(c->swallowedby, c->isfullscreen); setfullscreen(c->swallowedby, c->isfullscreen, true);
c->swallowedby->swallowing = NULL; c->swallowedby->swallowing = NULL;
c->swallowedby = NULL; c->swallowedby = NULL;
} }