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