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