dwm-sticky-6.4.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
dwm-sticky-6.4.diff (5321B)
---
1 From d47ba0b8aab26ffb2569c0d05df24fdd61b3f4b0 Mon Sep 17 00:00:00 2001
2 From: aymey <fabianpaci@gmail.com>
3 Date: Mon, 5 Dec 2022 22:57:41 +1100
4 Subject: [PATCH] Sticky windows respect EWMH
5
6 ---
7 dwm.c | 51 ++++++++++++++++++++++++++++++++++++++++++++-------
8 1 file changed, 44 insertions(+), 7 deletions(-)
9
10 diff --git a/dwm.c b/dwm.c
11 index 253aba7..a9157bf 100644
12 --- a/dwm.c
13 +++ b/dwm.c
14 @@ -49,7 +49,7 @@
15 #define CLEANMASK(mask) (mask & ~(numlockmask|LockMask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask))
16 #define INTERSECT(x,y,w,h,m) (MAX(0, MIN((x)+(w),(m)->wx+(m)->ww) - MAX((x),(m)->wx)) \
17 * MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy)))
18 -#define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags]))
19 +#define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags]) || C->issticky)
20 #define LENGTH(X) (sizeof X / sizeof X[0])
21 #define MOUSEMASK (BUTTONMASK|PointerMotionMask)
22 #define WIDTH(X) ((X)->w + 2 * (X)->bw)
23 @@ -61,7 +61,7 @@
24 enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
25 enum { SchemeNorm, SchemeSel }; /* color schemes */
26 enum { NetSupported, NetWMName, NetWMState, NetWMCheck,
27 - NetWMFullscreen, NetActiveWindow, NetWMWindowType,
28 + NetWMFullscreen, NetWMSticky, NetActiveWindow, NetWMWindowType,
29 NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */
30 enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */
31 enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle,
32 @@ -92,7 +92,7 @@ struct Client {
33 int basew, baseh, incw, inch, maxw, maxh, minw, minh, hintsvalid;
34 int bw, oldbw;
35 unsigned int tags;
36 - int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen;
37 + int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen, issticky;
38 Client *next;
39 Client *snext;
40 Monitor *mon;
41 @@ -200,6 +200,7 @@ static void sendmon(Client *c, Monitor *m);
42 static void setclientstate(Client *c, long state);
43 static void setfocus(Client *c);
44 static void setfullscreen(Client *c, int fullscreen);
45 +static void setsticky(Client *c, int sticky);
46 static void setlayout(const Arg *arg);
47 static void setmfact(const Arg *arg);
48 static void setup(void);
49 @@ -212,6 +213,7 @@ static void tagmon(const Arg *arg);
50 static void tile(Monitor *m);
51 static void togglebar(const Arg *arg);
52 static void togglefloating(const Arg *arg);
53 +static void togglesticky(const Arg *arg);
54 static void toggletag(const Arg *arg);
55 static void toggleview(const Arg *arg);
56 static void unfocus(Client *c, int setfocus);
57 @@ -526,6 +528,10 @@ clientmessage(XEvent *e)
58 || cme->data.l[2] == netatom[NetWMFullscreen])
59 setfullscreen(c, (cme->data.l[0] == 1 /* _NET_WM_STATE_ADD */
60 || (cme->data.l[0] == 2 /* _NET_WM_STATE_TOGGLE */ && !c->isfullscreen)));
61 +
62 + if (cme->data.l[1] == netatom[NetWMSticky]
63 + || cme->data.l[2] == netatom[NetWMSticky])
64 + setsticky(c, (cme->data.l[0] == 1 || (cme->data.l[0] == 2 && !c->issticky)));
65 } else if (cme->message_type == netatom[NetActiveWindow]) {
66 if (c != selmon->sel && !c->isurgent)
67 seturgent(c, 1);
68 @@ -1498,6 +1504,23 @@ setfullscreen(Client *c, int fullscreen)
69 }
70 }
71
72 +void
73 +setsticky(Client *c, int sticky)
74 +{
75 +
76 + if(sticky && !c->issticky) {
77 + XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32,
78 + PropModeReplace, (unsigned char *) &netatom[NetWMSticky], 1);
79 + c->issticky = 1;
80 + } else if(!sticky && c->issticky){
81 + XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32,
82 + PropModeReplace, (unsigned char *)0, 0);
83 + c->issticky = 0;
84 + arrange(c->mon);
85 + }
86 +}
87 +
88 +
89 void
90 setlayout(const Arg *arg)
91 {
92 @@ -1560,6 +1583,7 @@ setup(void)
93 netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False);
94 netatom[NetWMCheck] = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", False);
95 netatom[NetWMFullscreen] = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False);
96 + netatom[NetWMSticky] = XInternAtom(dpy, "_NET_WM_STATE_STICKY", False);
97 netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False);
98 netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False);
99 netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False);
100 @@ -1719,6 +1743,15 @@ togglefloating(const Arg *arg)
101 arrange(selmon);
102 }
103
104 +void
105 +togglesticky(const Arg *arg)
106 +{
107 + if (!selmon->sel)
108 + return;
109 + setsticky(selmon->sel, !selmon->sel->issticky);
110 + arrange(selmon);
111 +}
112 +
113 void
114 toggletag(const Arg *arg)
115 {
116 @@ -2009,10 +2042,13 @@ updatewindowtype(Client *c)
117 Atom state = getatomprop(c, netatom[NetWMState]);
118 Atom wtype = getatomprop(c, netatom[NetWMWindowType]);
119
120 - if (state == netatom[NetWMFullscreen])
121 - setfullscreen(c, 1);
122 - if (wtype == netatom[NetWMWindowTypeDialog])
123 - c->isfloating = 1;
124 + if (state == netatom[NetWMFullscreen])
125 + setfullscreen(c, 1);
126 + if (state == netatom[NetWMSticky]) {
127 + setsticky(c, 1);
128 + }
129 + if (wtype == netatom[NetWMWindowTypeDialog])
130 + c->isfloating = 1;
131 }
132
133 void
134 @@ -2147,3 +2183,4 @@ main(int argc, char *argv[])
135 XCloseDisplay(dpy);
136 return EXIT_SUCCESS;
137 }
138 +
139 --
140 2.38.1
141