dwm-canfocusfloating-20210724-b914109.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
dwm-canfocusfloating-20210724-b914109.diff (4256B)
---
1 From b9141091994ba657af534453ab913663a8258f9a Mon Sep 17 00:00:00 2001
2 From: oxinosg <georgios.oxinos.extern@elinvar.de>
3 Date: Sat, 24 Jul 2021 23:31:30 +0200
4 Subject: [PATCH] [dwm][cantogglefloating] patch that allows disabling focus on
5 floating clients
6
7 ---
8 config.def.h | 1 +
9 dwm.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++----
10 2 files changed, 63 insertions(+), 5 deletions(-)
11
12 diff --git a/config.def.h b/config.def.h
13 index 1c0b587..005fb5d 100644
14 --- a/config.def.h
15 +++ b/config.def.h
16 @@ -70,6 +70,7 @@ static Key keys[] = {
17 { MODKEY, XK_d, incnmaster, {.i = -1 } },
18 { MODKEY, XK_h, setmfact, {.f = -0.05} },
19 { MODKEY, XK_l, setmfact, {.f = +0.05} },
20 + { MODKEY, XK_s, togglecanfocusfloating, {0} },
21 { MODKEY, XK_Return, zoom, {0} },
22 { MODKEY, XK_Tab, view, {0} },
23 { MODKEY|ShiftMask, XK_c, killclient, {0} },
24 diff --git a/dwm.c b/dwm.c
25 index 4465af1..ae0a0ea 100644
26 --- a/dwm.c
27 +++ b/dwm.c
28 @@ -92,7 +92,7 @@ struct Client {
29 int basew, baseh, incw, inch, maxw, maxh, minw, minh;
30 int bw, oldbw;
31 unsigned int tags;
32 - int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen;
33 + int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen, cantfocus;
34 Client *next;
35 Client *snext;
36 Monitor *mon;
37 @@ -191,6 +191,7 @@ static Monitor *recttomon(int x, int y, int w, int h);
38 static void resize(Client *c, int x, int y, int w, int h, int interact);
39 static void resizeclient(Client *c, int x, int y, int w, int h);
40 static void resizemouse(const Arg *arg);
41 +static void resetcanfocusfloating();
42 static void restack(Monitor *m);
43 static void run(void);
44 static void scan(void);
45 @@ -211,6 +212,7 @@ static void tagmon(const Arg *arg);
46 static void tile(Monitor *);
47 static void togglebar(const Arg *arg);
48 static void togglefloating(const Arg *arg);
49 +static void togglecanfocusfloating(const Arg *arg);
50 static void toggletag(const Arg *arg);
51 static void toggleview(const Arg *arg);
52 static void unfocus(Client *c, int setfocus);
53 @@ -788,6 +790,8 @@ focus(Client *c)
54 if (selmon->sel && selmon->sel != c)
55 unfocus(selmon->sel, 0);
56 if (c) {
57 + if (c->cantfocus)
58 + return;
59 if (c->mon != selmon)
60 selmon = c->mon;
61 if (c->isurgent)
62 @@ -837,16 +841,16 @@ focusstack(const Arg *arg)
63 if (!selmon->sel)
64 return;
65 if (arg->i > 0) {
66 - for (c = selmon->sel->next; c && !ISVISIBLE(c); c = c->next);
67 + for (c = selmon->sel->next; c && (!ISVISIBLE(c) || c->cantfocus); c = c->next);
68 if (!c)
69 - for (c = selmon->clients; c && !ISVISIBLE(c); c = c->next);
70 + for (c = selmon->clients; c && (!ISVISIBLE(c) || c->cantfocus); c = c->next);
71 } else {
72 for (i = selmon->clients; i != selmon->sel; i = i->next)
73 - if (ISVISIBLE(i))
74 + if (ISVISIBLE(i) && !i->cantfocus)
75 c = i;
76 if (!c)
77 for (; i; i = i->next)
78 - if (ISVISIBLE(i))
79 + if (ISVISIBLE(i) && !i->cantfocus)
80 c = i;
81 }
82 if (c) {
83 @@ -1716,6 +1720,59 @@ togglefloating(const Arg *arg)
84 if (selmon->sel->isfloating)
85 resize(selmon->sel, selmon->sel->x, selmon->sel->y,
86 selmon->sel->w, selmon->sel->h, 0);
87 +
88 + resetcanfocusfloating();
89 +
90 + arrange(selmon);
91 +}
92 +
93 +void
94 +resetcanfocusfloating()
95 +{
96 + unsigned int i, n;
97 + Client *c;
98 +
99 + for (n = 0, c = selmon->clients; c; c = c->next, n++);
100 + if (n == 0)
101 + return;
102 +
103 + for (i = 0, c = selmon->clients; c; c = c->next, i++)
104 + if (c->isfloating)
105 + c->cantfocus = 0;
106 +
107 + arrange(selmon);
108 +}
109 +
110 +void
111 +togglecanfocusfloating(const Arg *arg)
112 +{
113 + unsigned int n;
114 + Client *c, *cf = NULL;
115 +
116 + if (!selmon->sel)
117 + return;
118 +
119 + for (c = selmon->clients; c; c = c->next)
120 + if (c->cantfocus == 1) {
121 + cf = c;
122 + }
123 +
124 + if (cf) {
125 + resetcanfocusfloating();
126 + focus(cf);
127 + } else {
128 + for (n = 0, c = selmon->clients; c; c = c->next)
129 + if (c->isfloating)
130 + c->cantfocus = !c->cantfocus;
131 + else
132 + n++;
133 +
134 + if (n && selmon->sel->isfloating) {
135 + c = nexttiled(selmon->clients);
136 + focus(c);
137 + }
138 + }
139 +
140 arrange(selmon);
141 }
142
143 --
144 2.27.0
145