sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | Refs

dwm-ewmhtags-6.2.diff (5471B)


      1 From e5f0eefa921e6bad1e6f75faced0c3ae519995b3 Mon Sep 17 00:00:00 2001
      2 From: Ryan Kes <alrayyes@gmail.com>
      3 Date: Thu, 28 Mar 2019 14:49:28 +0100
      4 Subject: [PATCH] dwm-ewhmtags-6.2
      5 
      6 ---
      7  dwm.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++++-
      8  1 file changed, 48 insertions(+), 1 deletion(-)
      9 
     10 diff --git a/dwm.c b/dwm.c
     11 index 4465af1..92022a1 100644
     12 --- a/dwm.c
     13 +++ b/dwm.c
     14 @@ -55,6 +55,7 @@
     15  #define WIDTH(X)                ((X)->w + 2 * (X)->bw)
     16  #define HEIGHT(X)               ((X)->h + 2 * (X)->bw)
     17  #define TAGMASK                 ((1 << LENGTH(tags)) - 1)
     18 +#define TAGSLENGTH              (LENGTH(tags))
     19  #define TEXTW(X)                (drw_fontset_getwidth(drw, (X)) + lrpad)
     20  
     21  /* enums */
     22 @@ -62,7 +63,7 @@ enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
     23  enum { SchemeNorm, SchemeSel }; /* color schemes */
     24  enum { NetSupported, NetWMName, NetWMState, NetWMCheck,
     25         NetWMFullscreen, NetActiveWindow, NetWMWindowType,
     26 -       NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */
     27 +       NetWMWindowTypeDialog, NetClientList, NetDesktopNames, NetDesktopViewport, NetNumberOfDesktops, NetCurrentDesktop, NetLast }; /* EWMH atoms */
     28  enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */
     29  enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle,
     30         ClkClientWin, ClkRootWin, ClkLast }; /* clicks */
     31 @@ -197,11 +198,15 @@ static void scan(void);
     32  static int sendevent(Client *c, Atom proto);
     33  static void sendmon(Client *c, Monitor *m);
     34  static void setclientstate(Client *c, long state);
     35 +static void setcurrentdesktop(void);
     36 +static void setdesktopnames(void);
     37  static void setfocus(Client *c);
     38  static void setfullscreen(Client *c, int fullscreen);
     39  static void setlayout(const Arg *arg);
     40  static void setmfact(const Arg *arg);
     41 +static void setnumdesktops(void);
     42  static void setup(void);
     43 +static void setviewport(void);
     44  static void seturgent(Client *c, int urg);
     45  static void showhide(Client *c);
     46  static void sigchld(int unused);
     47 @@ -216,6 +221,7 @@ static void toggleview(const Arg *arg);
     48  static void unfocus(Client *c, int setfocus);
     49  static void unmanage(Client *c, int destroyed);
     50  static void unmapnotify(XEvent *e);
     51 +static void updatecurrentdesktop(void);
     52  static void updatebarpos(Monitor *m);
     53  static void updatebars(void);
     54  static void updateclientlist(void);
     55 @@ -1431,6 +1437,16 @@ setclientstate(Client *c, long state)
     56  	XChangeProperty(dpy, c->win, wmatom[WMState], wmatom[WMState], 32,
     57  		PropModeReplace, (unsigned char *)data, 2);
     58  }
     59 +void
     60 +setcurrentdesktop(void){
     61 +	long data[] = { 0 };
     62 +	XChangeProperty(dpy, root, netatom[NetCurrentDesktop], XA_CARDINAL, 32, PropModeReplace, (unsigned char *)data, 1);
     63 +}
     64 +void setdesktopnames(void){
     65 +	XTextProperty text;
     66 +	Xutf8TextListToTextProperty(dpy, tags, TAGSLENGTH, XUTF8StringStyle, &text);
     67 +	XSetTextProperty(dpy, root, &text, netatom[NetDesktopNames]);
     68 +}
     69  
     70  int
     71  sendevent(Client *c, Atom proto)
     72 @@ -1457,6 +1473,12 @@ sendevent(Client *c, Atom proto)
     73  	return exists;
     74  }
     75  
     76 +void
     77 +setnumdesktops(void){
     78 +	long data[] = { TAGSLENGTH };
     79 +	XChangeProperty(dpy, root, netatom[NetNumberOfDesktops], XA_CARDINAL, 32, PropModeReplace, (unsigned char *)data, 1);
     80 +}
     81 +
     82  void
     83  setfocus(Client *c)
     84  {
     85 @@ -1562,6 +1584,10 @@ setup(void)
     86  	netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False);
     87  	netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False);
     88  	netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False);
     89 +	netatom[NetDesktopViewport] = XInternAtom(dpy, "_NET_DESKTOP_VIEWPORT", False);
     90 +	netatom[NetNumberOfDesktops] = XInternAtom(dpy, "_NET_NUMBER_OF_DESKTOPS", False);
     91 +	netatom[NetCurrentDesktop] = XInternAtom(dpy, "_NET_CURRENT_DESKTOP", False);
     92 +	netatom[NetDesktopNames] = XInternAtom(dpy, "_NET_DESKTOP_NAMES", False);
     93  	/* init cursors */
     94  	cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr);
     95  	cursor[CurResize] = drw_cur_create(drw, XC_sizing);
     96 @@ -1584,6 +1610,10 @@ setup(void)
     97  	/* EWMH support per view */
     98  	XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32,
     99  		PropModeReplace, (unsigned char *) netatom, NetLast);
    100 +	setnumdesktops();
    101 +	setcurrentdesktop();
    102 +	setdesktopnames();
    103 +	setviewport();
    104  	XDeleteProperty(dpy, root, netatom[NetClientList]);
    105  	/* select events */
    106  	wa.cursor = cursor[CurNormal]->cursor;
    107 @@ -1595,6 +1625,11 @@ setup(void)
    108  	grabkeys();
    109  	focus(NULL);
    110  }
    111 +void
    112 +setviewport(void){
    113 +	long data[] = { 0, 0 };
    114 +	XChangeProperty(dpy, root, netatom[NetDesktopViewport], XA_CARDINAL, 32, PropModeReplace, (unsigned char *)data, 2);
    115 +}
    116  
    117  
    118  void
    119 @@ -1732,6 +1767,7 @@ toggletag(const Arg *arg)
    120  		focus(NULL);
    121  		arrange(selmon);
    122  	}
    123 +	updatecurrentdesktop();
    124  }
    125  
    126  void
    127 @@ -1744,6 +1780,7 @@ toggleview(const Arg *arg)
    128  		focus(NULL);
    129  		arrange(selmon);
    130  	}
    131 +	updatecurrentdesktop();
    132  }
    133  
    134  void
    135 @@ -1846,6 +1883,15 @@ updateclientlist()
    136  				XA_WINDOW, 32, PropModeAppend,
    137  				(unsigned char *) &(c->win), 1);
    138  }
    139 +void updatecurrentdesktop(void){
    140 +	long rawdata[] = { selmon->tagset[selmon->seltags] };
    141 +	int i=0;
    142 +	while(*rawdata >> i+1){
    143 +		i++;
    144 +	}
    145 +	long data[] = { i };
    146 +	XChangeProperty(dpy, root, netatom[NetCurrentDesktop], XA_CARDINAL, 32, PropModeReplace, (unsigned char *)data, 1);
    147 +}
    148  
    149  int
    150  updategeom(void)
    151 @@ -2042,6 +2088,7 @@ view(const Arg *arg)
    152  		selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
    153  	focus(NULL);
    154  	arrange(selmon);
    155 +	updatecurrentdesktop();
    156  }
    157  
    158  Client *
    159 -- 
    160 2.21.0
    161