dwm-foreground-20240220-9f88553.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
dwm-foreground-20240220-9f88553.diff (5117B)
---
1 From 507895940574e77386d53f81df541e3903bf1ba3 Mon Sep 17 00:00:00 2001
2 From: espro1 <ericspero@icloud.com>
3 Date: Tue, 20 Feb 2024 16:11:05 -0500
4 Subject: [PATCH] Essentially a layout for a special class of floating windows.
5 When a window is foregrounded, it is floated, resized, and moved to a
6 predictable location
7
8 ---
9 config.def.h | 3 ++
10 dwm.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++-
11 2 files changed, 84 insertions(+), 1 deletion(-)
12
13 diff --git a/config.def.h b/config.def.h
14 index 9efa774..718e7c3 100644
15 --- a/config.def.h
16 +++ b/config.def.h
17 @@ -37,6 +37,8 @@ static const int nmaster = 1; /* number of clients in master area */
18 static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */
19 static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */
20
21 +static const float fgw = .6,fgh = .6;
22 +
23 static const Layout layouts[] = {
24 /* symbol arrange function */
25 { "[]=", tile }, /* first entry is default */
26 @@ -78,6 +80,7 @@ static const Key keys[] = {
27 { MODKEY, XK_f, setlayout, {.v = &layouts[1]} },
28 { MODKEY, XK_m, setlayout, {.v = &layouts[2]} },
29 { MODKEY, XK_space, setlayout, {0} },
30 + { MODKEY|Mod4Mask, XK_space, toggleforegrounded, {0} },
31 { MODKEY|ShiftMask, XK_space, togglefloating, {0} },
32 { MODKEY, XK_0, view, {.ui = ~0 } },
33 { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } },
34 diff --git a/dwm.c b/dwm.c
35 index f1d86b2..12b037d 100644
36 --- a/dwm.c
37 +++ b/dwm.c
38 @@ -92,9 +92,10 @@ struct Client {
39 int basew, baseh, incw, inch, maxw, maxh, minw, minh, hintsvalid;
40 int bw, oldbw;
41 unsigned int tags;
42 - int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen;
43 + int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen, isforegrounded;
44 Client *next;
45 Client *snext;
46 + Client *tnext;
47 Monitor *mon;
48 Window win;
49 };
50 @@ -127,6 +128,7 @@ struct Monitor {
51 Client *clients;
52 Client *sel;
53 Client *stack;
54 + Client *foregrounded;
55 Monitor *next;
56 Window barwin;
57 const Layout *lt[2];
58 @@ -210,6 +212,7 @@ static void tag(const Arg *arg);
59 static void tagmon(const Arg *arg);
60 static void tile(Monitor *m);
61 static void togglebar(const Arg *arg);
62 +static void toggleforegrounded(const Arg *arg);
63 static void togglefloating(const Arg *arg);
64 static void toggletag(const Arg *arg);
65 static void toggleview(const Arg *arg);
66 @@ -415,6 +418,21 @@ attachstack(Client *c)
67 c->mon->stack = c;
68 }
69
70 +void
71 +attachforegrounded (Client *c)
72 +{
73 + c->tnext = c->mon->foregrounded;
74 + c->mon->foregrounded = c;
75 +}
76 +
77 +void
78 +detachforegrounded (Client *c)
79 +{
80 + Client **tc;
81 + for (tc = &c->mon->foregrounded; *tc && *tc != c; tc = &(*tc)->tnext);
82 + *tc = c->tnext;
83 +}
84 +
85 void
86 buttonpress(XEvent *e)
87 {
88 @@ -1209,6 +1227,39 @@ nexttiled(Client *c)
89 return c;
90 }
91
92 +Client *
93 +nextforegrounded(Client *c)
94 +{
95 + for (; c && (!c->isforegrounded || !ISVISIBLE(c)); c = c->tnext);
96 + return c;
97 +}
98 +
99 +void
100 +arrangeforegrounded (Monitor *m)
101 +{
102 + unsigned int n,i,x,y,w,h;
103 + Client *c;
104 +
105 + for (n = 0, c = nextforegrounded(m->foregrounded); c; c = nextforegrounded(c->tnext), n++);
106 + if (n == 0)
107 + return;
108 +
109 + for (i = 0, c = nextforegrounded(m->foregrounded); c; c = nextforegrounded(c->tnext), i++){
110 + if (n == 1) {
111 + x = m->mx + (m->mw - m->mw * fgw) / 2;
112 + y = m->my + (m->mh - m->mh * fgh) / 2;
113 + w = (m->mw * fgw) - (2 * (m->foregrounded->bw));
114 + h = (m->mh * fgh) - (2 * (m->foregrounded->bw));
115 + } else {
116 + x = (n - 1 - i) * (m->mw / n);
117 + y = m->my + (m->mh - m->mh * fgh) / 2;
118 + w = (m->mw * (1 / (float)n)) - (2 * (m->foregrounded->bw));
119 + h = (m->mh * fgh) - (2 * (m->foregrounded->bw));
120 + }
121 + resize(c,x,y,w,h,0);
122 + }
123 +}
124 +
125 void
126 pop(Client *c)
127 {
128 @@ -1721,6 +1772,24 @@ togglebar(const Arg *arg)
129 arrange(selmon);
130 }
131
132 +void
133 +toggleforegrounded(const Arg *arg)
134 +{
135 + if (!selmon->sel)
136 + return;
137 + if (selmon->sel->isfullscreen) /* no support for fullscreen windows */
138 + return;
139 +
140 + selmon->sel->isforegrounded || selmon->sel->isfloating ?
141 + detachforegrounded(selmon->sel) : attachforegrounded(selmon->sel);
142 +
143 + selmon->sel->isforegrounded = selmon->sel->isfloating =
144 + !selmon->sel->isfloating && !selmon->sel->isforegrounded;
145 +
146 + arrangeforegrounded(selmon);
147 + arrange(selmon);
148 +}
149 +
150 void
151 togglefloating(const Arg *arg)
152 {
153 @@ -1732,6 +1801,11 @@ togglefloating(const Arg *arg)
154 if (selmon->sel->isfloating)
155 resize(selmon->sel, selmon->sel->x, selmon->sel->y,
156 selmon->sel->w, selmon->sel->h, 0);
157 + if (selmon->sel->isforegrounded) {
158 + selmon->sel->isforegrounded = 0;
159 + detachforegrounded(selmon->sel);
160 + arrangeforegrounded(selmon);
161 + }
162 arrange(selmon);
163 }
164
165 @@ -1783,6 +1857,12 @@ unmanage(Client *c, int destroyed)
166
167 detach(c);
168 detachstack(c);
169 +
170 + if (c->isforegrounded){
171 + detachforegrounded(c);
172 + arrangeforegrounded(m);
173 + }
174 +
175 if (!destroyed) {
176 wc.border_width = c->oldbw;
177 XGrabServer(dpy); /* avoid race conditions */
178 --
179 2.43.0
180