summaryrefslogtreecommitdiff
path: root/patches/dwl-namedscratchpads.diff
diff options
context:
space:
mode:
Diffstat (limited to 'patches/dwl-namedscratchpads.diff')
-rw-r--r--patches/dwl-namedscratchpads.diff176
1 files changed, 176 insertions, 0 deletions
diff --git a/patches/dwl-namedscratchpads.diff b/patches/dwl-namedscratchpads.diff
new file mode 100644
index 0000000..a83d322
--- /dev/null
+++ b/patches/dwl-namedscratchpads.diff
@@ -0,0 +1,176 @@
+From 13402c1ccead7a6775520bd1ceef31611583c965 Mon Sep 17 00:00:00 2001
+From: Louis-Michel Raynauld <louismichel@pweb.ca>
+Date: Fri, 29 Jul 2022 23:09:10 -0700
+Subject: [PATCH 1/2] port dwm "namedscratchpads" patch to dwl
+
+---
+ config.def.h | 9 +++++++--
+ dwl.c | 42 ++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 49 insertions(+), 2 deletions(-)
+
+diff --git a/config.def.h b/config.def.h
+index 190b0da4..b5f87336 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -10,11 +10,12 @@ static const float focuscolor[] = {1.0, 0.0, 0.0, 1.0};
+ static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
+
+ static const Rule rules[] = {
+- /* app_id title tags mask isfloating monitor */
++ /* app_id title tags mask isfloating monitor scratchkey */
+ /* examples:
+ { "Gimp", NULL, 0, 1, -1 },
+ */
+- { "firefox", NULL, 1 << 8, 0, -1 },
++ { "firefox", NULL, 1 << 8, 0, -1, 0 },
++ { NULL, "scratchpad", 0, 1, -1, 's' },
+ };
+
+ /* layout(s) */
+@@ -66,11 +67,15 @@ static const int natural_scrolling = 0;
+ static const char *termcmd[] = { "alacritty", NULL };
+ static const char *menucmd[] = { "bemenu-run", NULL };
+
++/* named scratchpads - First arg only serves to match against key in rules*/
++static const char *scratchpadcmd[] = { "s", "alacritty", "-t", "scratchpad", NULL };
++
+ static const Key keys[] = {
+ /* Note that Shift changes certain key codes: c -> C, 2 -> at, etc. */
+ /* modifier key function argument */
+ { MODKEY, XKB_KEY_p, spawn, {.v = menucmd} },
+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Return, spawn, {.v = termcmd} },
++ { MODKEY, XKB_KEY_grave, togglescratch, {.v = scratchpadcmd } },
+ { MODKEY, XKB_KEY_j, focusstack, {.i = +1} },
+ { MODKEY, XKB_KEY_k, focusstack, {.i = -1} },
+ { MODKEY, XKB_KEY_i, incnmaster, {.i = +1} },
+diff --git a/dwl.c b/dwl.c
+index b09fc6f9..f21488c0 100644
+--- a/dwl.c
++++ b/dwl.c
+@@ -118,6 +118,7 @@ typedef struct {
+ int isfloating, isurgent;
+ uint32_t resize; /* configure serial of a pending resize */
+ int isfullscreen;
++ char scratchkey;
+ } Client;
+
+ typedef struct {
+@@ -198,6 +199,7 @@ typedef struct {
+ unsigned int tags;
+ int isfloating;
+ int monitor;
++ const char scratchkey;
+ } Rule;
+
+ /* function declarations */
+@@ -273,12 +275,14 @@ static void setsel(struct wl_listener *listener, void *data);
+ static void setup(void);
+ static void sigchld(int unused);
+ static void spawn(const Arg *arg);
++static void spawnscratch(const Arg *arg);
+ static void startdrag(struct wl_listener *listener, void *data);
+ static void tag(const Arg *arg);
+ static void tagmon(const Arg *arg);
+ static void tile(Monitor *m);
+ static void togglefloating(const Arg *arg);
+ static void togglefullscreen(const Arg *arg);
++static void togglescratch(const Arg *arg);
+ static void toggletag(const Arg *arg);
+ static void toggleview(const Arg *arg);
+ static void unmaplayersurface(LayerSurface *layersurface);
+@@ -457,6 +461,7 @@ applyrules(Client *c)
+ Monitor *mon = selmon, *m;
+
+ c->isfloating = client_is_float_type(c);
++ c->scratchkey = 0;
+ if (!(appid = client_get_appid(c)))
+ appid = broken;
+ if (!(title = client_get_title(c)))
+@@ -466,6 +471,7 @@ applyrules(Client *c)
+ if ((!r->title || strstr(title, r->title))
+ && (!r->id || strstr(appid, r->id))) {
+ c->isfloating = r->isfloating;
++ c->scratchkey = r->scratchkey;
+ newtags |= r->tags;
+ i = 0;
+ wl_list_for_each(m, &mons, link)
+@@ -2092,6 +2098,16 @@ spawn(const Arg *arg)
+ }
+ }
+
++void spawnscratch(const Arg *arg)
++{
++ if (fork() == 0) {
++ dup2(STDERR_FILENO, STDOUT_FILENO);
++ setsid();
++ execvp(((char **)arg->v)[1], ((char **)arg->v)+1);
++ die("dwl: execvp %s failed:", ((char **)arg->v)[1]);
++ }
++}
++
+ void
+ startdrag(struct wl_listener *listener, void *data)
+ {
+@@ -2176,6 +2192,32 @@ togglefullscreen(const Arg *arg)
+ setfullscreen(sel, !sel->isfullscreen);
+ }
+
++void
++togglescratch(const Arg *arg)
++{
++ Client *c;
++ unsigned int found = 0;
++
++ /* search for first window that matches the scratchkey */
++ wl_list_for_each(c, &clients, link)
++ if (c->scratchkey == ((char**)arg->v)[0][0]) {
++ found = 1;
++ break;
++ }
++
++ if (found) {
++ c->tags = VISIBLEON(c, selmon) ? 0 : selmon->tagset[selmon->seltags];
++ focusclient(NULL, 0);
++ if (VISIBLEON(c, selmon)) {
++ focusclient(c, 0);
++ }
++ arrange(selmon);
++
++ } else{
++ spawnscratch(arg);
++ }
++}
++
+ void
+ toggletag(const Arg *arg)
+ {
+
+From be5e75b1bad480a7eedd81ef68cc331687fbe7cd Mon Sep 17 00:00:00 2001
+From: Louis-Michel Raynauld <louismichel@pweb.ca>
+Date: Fri, 5 Aug 2022 22:20:59 -0700
+Subject: [PATCH 2/2] Fix focus after hiding and make sure toggle scratchpad
+ appears on top of others scratchpads if any.
+
+---
+ dwl.c | 7 ++-----
+ 1 file changed, 2 insertions(+), 5 deletions(-)
+
+diff --git a/dwl.c b/dwl.c
+index f21488c0..e0ecdb8e 100644
+--- a/dwl.c
++++ b/dwl.c
+@@ -2207,12 +2207,9 @@ togglescratch(const Arg *arg)
+
+ if (found) {
+ c->tags = VISIBLEON(c, selmon) ? 0 : selmon->tagset[selmon->seltags];
+- focusclient(NULL, 0);
+- if (VISIBLEON(c, selmon)) {
+- focusclient(c, 0);
+- }
+- arrange(selmon);
+
++ focusclient(c->tags == 0 ? focustop(selmon) : c, 1);
++ arrange(selmon);
+ } else{
+ spawnscratch(arg);
+ }