From 9fd814d97219d1d84f5c47e0eaf8861997992d9c Mon Sep 17 00:00:00 2001 From: DreamMaoMao <2523610504@qq.com> Date: Tue, 26 Aug 2025 09:36:59 +0800 Subject: [PATCH] feat: add istagsilent option to windowrule --- src/config/parse_config.h | 4 ++++ src/mango.c | 16 ++++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/config/parse_config.h b/src/config/parse_config.h index 7d161c5..e645a43 100644 --- a/src/config/parse_config.h +++ b/src/config/parse_config.h @@ -46,6 +46,7 @@ typedef struct { const char *layer_animation_type_close; int isnoborder; int isopensilent; + int istagsilent; int isnamedscratchpad; int isunglobal; int isglobal; @@ -1346,6 +1347,7 @@ void parse_config_line(Config *config, const char *line) { rule->isfullscreen = -1; rule->isnoborder = -1; rule->isopensilent = -1; + rule->istagsilent = -1; rule->isnamedscratchpad = -1; rule->isunglobal = -1; rule->isglobal = -1; @@ -1422,6 +1424,8 @@ void parse_config_line(Config *config, const char *line) { rule->isnoborder = atoi(val); } else if (strcmp(key, "isopensilent") == 0) { rule->isopensilent = atoi(val); + } else if (strcmp(key, "istagsilent") == 0) { + rule->istagsilent = atoi(val); } else if (strcmp(key, "isnamedscratchpad") == 0) { rule->isnamedscratchpad = atoi(val); } else if (strcmp(key, "isunglobal") == 0) { diff --git a/src/mango.c b/src/mango.c index 876f89c..f11f643 100644 --- a/src/mango.c +++ b/src/mango.c @@ -289,6 +289,7 @@ struct Client { int isglobal; int isnoborder; int isopensilent; + int istagsilent; int iskilling; int isnamedscratchpad; bool is_pending_open_animation; @@ -1053,6 +1054,7 @@ static void apply_rule_properties(Client *c, const ConfigWinRule *r) { APPLY_INT_PROP(c, r, isfullscreen); APPLY_INT_PROP(c, r, isnoborder); APPLY_INT_PROP(c, r, isopensilent); + APPLY_INT_PROP(c, r, istagsilent); APPLY_INT_PROP(c, r, isnamedscratchpad); APPLY_INT_PROP(c, r, isglobal); APPLY_INT_PROP(c, r, isoverlay); @@ -1205,7 +1207,9 @@ void applyrules(Client *c) { int fullscreen_state_backup = c->isfullscreen || client_wants_fullscreen(c); setmon(c, mon, newtags, !c->isopensilent); - if (!c->isopensilent && c->mon && + if (!c->isopensilent && + (!c->istagsilent || c->tags & c->mon->tagset[c->mon->seltags]) && + c->mon && ((c->mon && c->mon != selmon) || !(c->tags & (1 << (c->mon->pertag->curtag - 1))))) { c->animation.tag_from_rule = true; @@ -4265,14 +4269,14 @@ void setmon(Client *c, Monitor *m, unsigned int newtags, bool focus) { setfloating(c, c->isfloating); setfullscreen(c, c->isfullscreen); /* This will call arrange(c->mon) */ } - if (focus) - focusclient(focustop(selmon), 1); + if (m && focus && (!c->istagsilent || c->tags & m->tagset[m->seltags])) + focusclient(focustop(m), 1); - if (!c->foreign_toplevel && c->mon) { + if (!c->foreign_toplevel && m) { add_foreign_toplevel(c); - if (selmon->sel && selmon->sel->foreign_toplevel) + if (m->sel && m->sel->foreign_toplevel) wlr_foreign_toplevel_handle_v1_set_activated( - selmon->sel->foreign_toplevel, false); + m->sel->foreign_toplevel, false); if (c->foreign_toplevel) wlr_foreign_toplevel_handle_v1_set_activated(c->foreign_toplevel, true);