From 2d466821072b6b3630169a784a10b0fe40666790 Mon Sep 17 00:00:00 2001 From: Guido Cella Date: Mon, 30 Sep 2024 08:40:25 +0200 Subject: [PATCH] allow switching to the configured tag when a window opens Add a rule option to switch to the configured tag when a window opens, then switch back when it closes. --- config.def.h | 6 +++--- dwl.c | 21 +++++++++++++++++---- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/config.def.h b/config.def.h index 13c5322..1e52d05 100644 --- a/config.def.h +++ b/config.def.h @@ -22,9 +22,9 @@ static const float fullscreen_bg[] = {0.0f, 0.0f, 0.0f, 1.0f}; /* You ca static int log_level = WLR_ERROR; static const Rule rules[] = { - /* app_id title tags mask isfloating monitor */ - { "Gimp_EXAMPLE", NULL, 0, 1, -1 }, /* Start on currently visible tags floating, not tiled */ - { "firefox_EXAMPLE", NULL, 1 << 8, 0, -1 }, /* Start on ONLY tag "9" */ + /* app_id title tags mask switchtotag isfloating monitor */ + { "Gimp_EXAMPLE", NULL, 0, 0 1, -1 }, /* Start on currently visible tags floating, not tiled */ + { "firefox_EXAMPLE", NULL, 1 << 8, 1 0, -1 }, /* Start on ONLY tag "9" */ /* default/example rule: can be changed but cannot be eliminated; at least one rule must exist */ }; diff --git a/dwl.c b/dwl.c index f7bda0b..a58bd9a 100644 --- a/dwl.c +++ b/dwl.c @@ -158,6 +158,7 @@ typedef struct { unsigned int bw; uint32_t tags; int isfloating, isurgent, isfullscreen; + int switchtotag; } Client; typedef struct { @@ -245,6 +246,7 @@ typedef struct { const char *id; const char *title; uint32_t tags; + bool switchtotag; int isfloating; int monitor; } Rule; @@ -260,7 +262,7 @@ typedef struct { /* function declarations */ static void applybounds(Client *c, struct wlr_box *bbox); -static void applyrules(Client *c); +static void applyrules(Client *c, bool map); static void arrange(Monitor *m); static void arrangelayer(Monitor *m, struct wl_list *list, struct wlr_box *usable_area, int exclusive); @@ -509,7 +511,7 @@ applybounds(Client *c, struct wlr_box *bbox) } void -applyrules(Client *c) +applyrules(Client *c, bool map) { /* rule matching */ const char *appid, *title; @@ -531,6 +533,11 @@ applyrules(Client *c) if (r->monitor == i++) mon = m; } + if (r->switchtotag && map) { + c->switchtotag = selmon->tagset[selmon->seltags]; + mon->seltags ^= 1; + mon->tagset[selmon->seltags] = r->tags & TAGMASK; + } } } @@ -952,7 +959,7 @@ commitnotify(struct wl_listener *listener, void *data) * a different monitor based on its title, this will likely select * a wrong monitor. */ - applyrules(c); + applyrules(c, false); if (c->mon) { client_set_scale(client_surface(c), c->mon->wlr_output->scale); } @@ -1914,7 +1921,7 @@ mapnotify(struct wl_listener *listener, void *data) c->isfloating = 1; setmon(c, p->mon, p->tags); } else { - applyrules(c); + applyrules(c, true); } printstatus(); @@ -3000,6 +3007,12 @@ unmapnotify(struct wl_listener *listener, void *data) wlr_scene_node_destroy(&c->image_capture_scene->tree.node); wlr_scene_node_destroy(&c->scene->node); client_surface(c)->data = NULL; + + if (c->switchtotag) { + Arg a = { .ui = c->switchtotag }; + view(&a); + } + printstatus(); motionnotify(0, NULL, 0, 0, 0, 0); } -- 2.55.0