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