From 88d32bdf8fbbd945ab37e6e04295c635179f690e Mon Sep 17 00:00:00 2001 From: DreamMaoMao <2523610504@qq.com> Date: Wed, 1 Jul 2026 07:45:33 +0800 Subject: [PATCH] opt: simplified group code --- src/action/client.h | 29 ++++++++++++++++++ src/dispatch/bind_define.h | 11 +------ src/mango.c | 61 ++------------------------------------ 3 files changed, 33 insertions(+), 68 deletions(-) diff --git a/src/action/client.h b/src/action/client.h index 00580173..98f986ad 100644 --- a/src/action/client.h +++ b/src/action/client.h @@ -277,4 +277,33 @@ void client_set_group_config(Client *c) { mango_group_bar_apply_config(cur->group_bar, &config.groupbardata); cur = cur->group_next; } +} + +void client_group_detach(Client *c) { + if (c->group_prev) + c->group_prev->group_next = c->group_next; + if (c->group_next) + c->group_next->group_prev = c->group_prev; + c->group_prev = NULL; + c->group_next = NULL; + c->isgroupfocusing = false; +} + +void client_group_replace(Client *old, Client *new) { + client_group_detach(new); + + new->group_prev = old->group_prev; + new->group_next = old->group_next; + if (old->group_prev) + old->group_prev->group_next = new; + if (old->group_next) + old->group_next->group_prev = new; + old->group_prev = NULL; + old->group_next = NULL; + + if (old->is_logic_hide || (!new->group_prev && !new->group_next)) { + new->isgroupfocusing = false; + } else { + new->isgroupfocusing = old->isgroupfocusing; + } } \ No newline at end of file diff --git a/src/dispatch/bind_define.h b/src/dispatch/bind_define.h index bc1cb066..a6da999e 100644 --- a/src/dispatch/bind_define.h +++ b/src/dispatch/bind_define.h @@ -231,17 +231,8 @@ int32_t groupleave(const Arg *arg) { Client *rc = tc->group_next ? tc->group_next : tc->group_prev; client_focus_group_member(rc); + client_group_detach(tc); - if (tc->group_prev) { - tc->group_prev->group_next = tc->group_next; - } - - if (tc->group_next) { - tc->group_next->group_prev = tc->group_prev; - } - - tc->group_prev = NULL; - tc->group_next = NULL; tc->isgroupfocusing = false; tc->is_logic_hide = false; diff --git a/src/mango.c b/src/mango.c index f886365f..efcdd7d9 100644 --- a/src/mango.c +++ b/src/mango.c @@ -1322,54 +1322,8 @@ void client_replace(Client *c, Client *w, bool is_group_change_member, c->stack_proportion = w->stack_proportion; c->is_logic_hide = w->is_logic_hide; - if (is_swallow) { - c->group_prev = w->group_prev; - c->group_next = w->group_next; - if (w->group_prev) { - w->group_prev->group_next = c; - } - if (w->group_next) { - w->group_next->group_prev = c; - } - w->group_next = NULL; - w->group_prev = NULL; - - if (!w->is_logic_hide) { - c->isgroupfocusing = w->isgroupfocusing; - } else { - c->isgroupfocusing = false; - } - - } else { - if (!is_group_change_member) { - if (w->group_prev == c) { - c->group_next = w->group_next; - if (w->group_next) { - w->group_next->group_prev = c; - } - } else if (w->group_next == c) { - c->group_prev = w->group_prev; - if (w->group_prev) { - w->group_prev->group_next = c; - } - } else { - c->group_prev = w->group_prev; - c->group_next = w->group_next; - if (w->group_prev) { - w->group_prev->group_next = c; - } - - if (w->group_next) { - w->group_next->group_prev = c; - } - } - - if (!c->group_prev && !c->group_next) { - c->isgroupfocusing = false; - } else { - c->isgroupfocusing = w->isgroupfocusing; - } - } + if (is_swallow || !is_group_change_member) { + client_group_replace(w, c); } w->is_logic_hide = true; @@ -6766,16 +6720,7 @@ void unmapnotify(struct wl_listener *listener, void *data) { focusclient(focustop(selmon), 1); } else { - if (c->group_next && !c->isgroupfocusing) { - c->group_next->group_prev = c->group_prev; - } - - if (c->group_prev && !c->isgroupfocusing) { - c->group_prev->group_next = c->group_next; - } - - c->group_next = NULL; - c->group_prev = NULL; + client_group_detach(c); wl_list_remove(&c->link); setmon(c, NULL, 0, true);