dwm-sticky-6.5.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