sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | 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