commit 630e2ffc44a856d1350a608fd8161362a3008f83
Author: speedie <[email protected]>
Date:   Sat May 6 22:52:41 2023 +0200

    This commit adds a allowkillrule patch. The patch allows clients to be
    unkillable using keybinds by setting a rule. This can be toggled using
    a `toggleallowkill` function as well if desired.
    
    The patch may be useful if you find yourself killing your clients
    by accident.

diff --git a/dwm.suckless.org/patches/allowkillrule/dwm-allowkillrule-6.4.diff 
b/dwm.suckless.org/patches/allowkillrule/dwm-allowkillrule-6.4.diff
new file mode 100644
index 00000000..33365d77
--- /dev/null
+++ b/dwm.suckless.org/patches/allowkillrule/dwm-allowkillrule-6.4.diff
@@ -0,0 +1,98 @@
+diff -up a/config.def.h b/config.def.h
+--- a/config.def.h     2022-10-04 19:38:18.000000000 +0200
++++ b/config.def.h     2023-05-06 22:19:27.298742237 +0200
+@@ -5,6 +5,7 @@ static const unsigned int borderpx  = 1;
+ static const unsigned int snap      = 32;       /* snap pixel */
+ static const int showbar            = 1;        /* 0 means no bar */
+ static const int topbar             = 1;        /* 0 means bottom bar */
++static const int allowkill          = 1;        /* allow killing clients by 
default? */
+ static const char *fonts[]          = { "monospace:size=10" };
+ static const char dmenufont[]       = "monospace:size=10";
+ static const char col_gray1[]       = "#222222";
+@@ -26,9 +27,9 @@ static const Rule rules[] = {
+        *      WM_CLASS(STRING) = instance, class
+        *      WM_NAME(STRING) = title
+        */
+-      /* class      instance    title       tags mask     isfloating   
monitor */
+-      { "Gimp",     NULL,       NULL,       0,            1,           -1 },
+-      { "Firefox",  NULL,       NULL,       1 << 8,       0,           -1 },
++      /* class      instance    title       tags mask     allowkill    
isfloating   monitor */
++      { "Gimp",     NULL,       NULL,       0,            1,           1,     
      -1 },
++      { "Firefox",  NULL,       NULL,       1 << 8,       1,           0,     
      -1 },
+ };
+
+ /* layout(s) */
+@@ -78,6 +79,7 @@ static const Key keys[] = {
+       { MODKEY,                       XK_m,      setlayout,      {.v = 
&layouts[2]} },
+       { MODKEY,                       XK_space,  setlayout,      {0} },
+       { MODKEY|ShiftMask,             XK_space,  togglefloating, {0} },
++    { MODKEY,                       XK_q,      toggleallowkill,{0} },
+       { MODKEY,                       XK_0,      view,           {.ui = ~0 } 
},
+       { MODKEY|ShiftMask,             XK_0,      tag,            {.ui = ~0 } 
},
+       { MODKEY,                       XK_comma,  focusmon,       {.i = -1 } },
+diff -up a/dwm.c b/dwm.c
+--- a/dwm.c    2022-10-04 19:38:18.000000000 +0200
++++ b/dwm.c    2023-05-06 22:18:43.239357744 +0200
+@@ -93,6 +93,7 @@ struct Client {
+       int bw, oldbw;
+       unsigned int tags;
+       int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen;
++    int allowkill;
+       Client *next;
+       Client *snext;
+       Monitor *mon;
+@@ -137,6 +138,7 @@ typedef struct {
+       const char *instance;
+       const char *title;
+       unsigned int tags;
++    int allowkill;
+       int isfloating;
+       int monitor;
+ } Rule;
+@@ -212,6 +214,7 @@ static void tagmon(const Arg *arg);
+ static void tile(Monitor *m);
+ static void togglebar(const Arg *arg);
+ static void togglefloating(const Arg *arg);
++static void toggleallowkill(const Arg *arg);
+ static void toggletag(const Arg *arg);
+ static void toggleview(const Arg *arg);
+ static void unfocus(Client *c, int setfocus);
+@@ -288,6 +291,7 @@ applyrules(Client *c)
+       /* rule matching */
+       c->isfloating = 0;
+       c->tags = 0;
++    c->allowkill = allowkill;
+       XGetClassHint(dpy, c->win, &ch);
+       class    = ch.res_class ? ch.res_class : broken;
+       instance = ch.res_name  ? ch.res_name  : broken;
+@@ -300,6 +304,7 @@ applyrules(Client *c)
+               {
+                       c->isfloating = r->isfloating;
+                       c->tags |= r->tags;
++            c->allowkill = r->allowkill;
+                       for (m = mons; m && m->num != r->monitor; m = m->next);
+                       if (m)
+                               c->mon = m;
+@@ -1006,7 +1011,7 @@ keypress(XEvent *e)
+ void
+ killclient(const Arg *arg)
+ {
+-      if (!selmon->sel)
++      if (!selmon->sel || !selmon->sel->allowkill)
+               return;
+       if (!sendevent(selmon->sel, wmatom[WMDelete])) {
+               XGrabServer(dpy);
+@@ -1704,6 +1709,13 @@ togglebar(const Arg *arg)
+ }
+
+ void
++toggleallowkill(const Arg *arg)
++{
++    if (!selmon->sel) return;
++    selmon->sel->allowkill = !selmon->sel->allowkill;
++}
++
++void
+ togglefloating(const Arg *arg)
+ {
+       if (!selmon->sel)
diff --git a/dwm.suckless.org/patches/allowkillrule/index.md 
b/dwm.suckless.org/patches/allowkillrule/index.md
new file mode 100644
index 00000000..a1e21df0
--- /dev/null
+++ b/dwm.suckless.org/patches/allowkillrule/index.md
@@ -0,0 +1,22 @@
+allowkillrule
+=============
+
+Description
+-----------
+
+This patch adds a rule which disables the ability to kill clients through the
+killclient function. You can choose if you want clients to be killable by
+default or not by setting `allowkill` to either `0` or `1`. It also includes
+a `toggleallowkill` keybind (by default MODKEY+q) which toggles it for the
+focused client. This is useful if you find that you kill clients
+often by accident.
+
+Download
+--------
+* [dwm-allowkillrule-6.4.diff](dwm-allowkillrule-6.4.diff)
+
+A mirror is also available [here](https://git.speedie.site/patches).
+
+Author
+------
+* speedie <[email protected]>


Reply via email to