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