sites

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

dwm-ewmhtags-20180101-db22360.diff (5435B)


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