From cf9a8fc2e03fab05f7c182c1344f45084c379253 Mon Sep 17 00:00:00 2001 From: DreamMaoMao <2523610504@qq.com> Date: Sat, 13 Sep 2025 20:05:18 +0800 Subject: [PATCH] fix: error tag animation direction in some scroller layout case --- src/layout/horizontal.h | 8 ++++---- src/layout/vertical.h | 8 ++++---- src/mango.c | 19 +++++++++++-------- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/layout/horizontal.h b/src/layout/horizontal.h index 963ac01..01a0af2 100644 --- a/src/layout/horizontal.h +++ b/src/layout/horizontal.h @@ -347,8 +347,8 @@ void scroller(Monitor *m) { if (m->sel && !client_is_unmanaged(m->sel) && !m->sel->isfloating && !m->sel->ismaxmizescreen && !m->sel->isfullscreen) { root_client = m->sel; - } else if (m->prevtilesel && !client_is_unmanaged(m->prevtilesel)) { - root_client = m->prevtilesel; + } else if (m->prevsel && !client_is_unmanaged(m->prevsel)) { + root_client = m->prevsel; } else { root_client = center_select(m); } @@ -380,8 +380,8 @@ void scroller(Monitor *m) { if (need_scroller) { if (scroller_focus_center || - ((!m->prevtilesel || - (m->prevtilesel->scroller_proportion * max_client_width) + + ((!m->prevsel || + (m->prevsel->scroller_proportion * max_client_width) + (root_client->scroller_proportion * max_client_width) > m->w.width - 2 * scroller_structs - cur_gappih) && scroller_prefer_center)) { diff --git a/src/layout/vertical.h b/src/layout/vertical.h index b9ee8c2..ca23df4 100644 --- a/src/layout/vertical.h +++ b/src/layout/vertical.h @@ -333,8 +333,8 @@ void vertical_scroller(Monitor *m) { if (m->sel && !client_is_unmanaged(m->sel) && !m->sel->isfloating && !m->sel->ismaxmizescreen && !m->sel->isfullscreen) { root_client = m->sel; - } else if (m->prevtilesel && !client_is_unmanaged(m->prevtilesel)) { - root_client = m->prevtilesel; + } else if (m->prevsel && !client_is_unmanaged(m->prevsel)) { + root_client = m->prevsel; } else { root_client = center_select(m); } @@ -366,8 +366,8 @@ void vertical_scroller(Monitor *m) { if (need_scroller) { if (scroller_focus_center || - ((!m->prevtilesel || - (m->prevtilesel->scroller_proportion * max_client_height) + + ((!m->prevsel || + (m->prevsel->scroller_proportion * max_client_height) + (root_client->scroller_proportion * max_client_height) > m->w.height - 2 * scroller_structs - cur_gappiv) && scroller_prefer_center)) { diff --git a/src/mango.c b/src/mango.c index 9f14778..1dfab96 100644 --- a/src/mango.c +++ b/src/mango.c @@ -430,7 +430,7 @@ struct Monitor { int gappoh; /* horizontal outer gaps */ int gappov; /* vertical outer gaps */ Pertag *pertag; - Client *sel, *prevtilesel; + Client *sel, *prevsel; int isoverview; int is_in_hotarea; int gamma_lut_changed; @@ -1908,7 +1908,7 @@ buttonpress(struct wl_listener *listener, void *data) { client_update_oldmonname_record(grabc, selmon); setmon(grabc, selmon, 0, true); reset_foreign_tolevel(grabc); - selmon->prevtilesel = ISTILED(selmon->sel) ? selmon->sel : NULL; + selmon->prevsel = ISTILED(selmon->sel) ? selmon->sel : NULL; selmon->sel = grabc; tmpc = grabc; grabc = NULL; @@ -3008,12 +3008,15 @@ void focusclient(Client *c, int lift) { if (c && !c->iskilling && !client_is_unmanaged(c) && c->mon) { selmon = c->mon; - selmon->prevtilesel = ISTILED(selmon->sel) ? selmon->sel : NULL; + selmon->prevsel = selmon->sel; selmon->sel = c; // decide whether need to re-arrange - if (c && ISTILED(c) && VISIBLEON(c, selmon) && !INSIDEMON(c) && + if (c && selmon->prevsel && + (selmon->prevsel->tags & selmon->tagset[selmon->seltags]) && + (c->tags & selmon->tagset[selmon->seltags]) && !c->isfloating && + !c->isfullscreen && !c->ismaxmizescreen && is_scroller_layout(selmon)) { arrange(selmon, false); } @@ -4462,8 +4465,8 @@ void setmon(Client *c, Monitor *m, unsigned int newtags, bool focus) { oldmon->sel = NULL; } - if (oldmon && oldmon->prevtilesel == c) { - oldmon->prevtilesel = NULL; + if (oldmon && oldmon->prevsel == c) { + oldmon->prevsel = NULL; } c->mon = m; @@ -5073,8 +5076,8 @@ void unmapnotify(struct wl_listener *listener, void *data) { if (c == m->sel) { m->sel = NULL; } - if (c == m->prevtilesel) { - m->prevtilesel = NULL; + if (c == m->prevsel) { + m->prevsel = NULL; } }