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