| dwm-extrabar-6.2-20210930-a786211.diff - sites - public wiki contents of suckle… | |
| git clone git://git.suckless.org/sites | |
| Log | |
| Files | |
| Refs | |
| --- | |
| dwm-extrabar-6.2-20210930-a786211.diff (8817B) | |
| --- | |
| 1 diff --git a/config.def.h b/config.def.h | |
| 2 --- a/config.def.h | |
| 3 +++ b/config.def.h | |
| 4 @@ -3,8 +3,10 @@ | |
| 5 /* appearance */ | |
| 6 static const unsigned int borderpx = 1; /* border pixel of wind… | |
| 7 static const unsigned int snap = 32; /* snap pixel */ | |
| 8 -static const int showbar = 1; /* 0 means no bar */ | |
| 9 -static const int topbar = 1; /* 0 means bottom bar */ | |
| 10 +static const int showbar = 1; /* 0 means no standard … | |
| 11 +static const int topbar = 1; /* 0 means standard bar… | |
| 12 +static const int extrabar = 1; /* 0 means no extra bar… | |
| 13 +static const char statussep = ';'; /* separator between st… | |
| 14 static const char *fonts[] = { "monospace:size=10" }; | |
| 15 static const char dmenufont[] = "monospace:size=10"; | |
| 16 static const char col_gray1[] = "#222222"; | |
| 17 @@ -65,6 +67,7 @@ static Key keys[] = { | |
| 18 { MODKEY, XK_p, spawn, {.v … | |
| 19 { MODKEY|ShiftMask, XK_Return, spawn, {.v … | |
| 20 { MODKEY, XK_b, togglebar, {0} … | |
| 21 + { MODKEY|ShiftMask, XK_b, toggleextrabar, {0} … | |
| 22 { MODKEY, XK_j, focusstack, {.i … | |
| 23 { MODKEY, XK_k, focusstack, {.i … | |
| 24 { MODKEY, XK_i, incnmaster, {.i … | |
| 25 @@ -105,6 +108,9 @@ static Button buttons[] = { | |
| 26 { ClkLtSymbol, 0, Button3, setlayo… | |
| 27 { ClkWinTitle, 0, Button2, zoom, … | |
| 28 { ClkStatusText, 0, Button2, spawn, … | |
| 29 + { ClkExBarLeftStatus, 0, Button2, spawn, … | |
| 30 + { ClkExBarMiddle, 0, Button2, spawn, … | |
| 31 + { ClkExBarRightStatus, 0, Button2, spawn, … | |
| 32 { ClkClientWin, MODKEY, Button1, movemou… | |
| 33 { ClkClientWin, MODKEY, Button2, togglef… | |
| 34 { ClkClientWin, MODKEY, Button3, resizem… | |
| 35 diff --git a/dwm.c b/dwm.c | |
| 36 --- a/dwm.c | |
| 37 +++ b/dwm.c | |
| 38 @@ -65,6 +65,7 @@ enum { NetSupported, NetWMName, NetWMState, NetWMCheck, | |
| 39 NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ | |
| 40 enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* defaul… | |
| 41 enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, | |
| 42 + ClkExBarLeftStatus, ClkExBarMiddle, ClkExBarRightStatus, | |
| 43 ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ | |
| 44 | |
| 45 typedef union { | |
| 46 @@ -117,6 +118,7 @@ struct Monitor { | |
| 47 int nmaster; | |
| 48 int num; | |
| 49 int by; /* bar geometry */ | |
| 50 + int eby; /* extra bar geometry */ | |
| 51 int mx, my, mw, mh; /* screen size */ | |
| 52 int wx, wy, ww, wh; /* window area */ | |
| 53 unsigned int seltags; | |
| 54 @@ -124,11 +126,13 @@ struct Monitor { | |
| 55 unsigned int tagset[2]; | |
| 56 int showbar; | |
| 57 int topbar; | |
| 58 + int extrabar; | |
| 59 Client *clients; | |
| 60 Client *sel; | |
| 61 Client *stack; | |
| 62 Monitor *next; | |
| 63 Window barwin; | |
| 64 + Window extrabarwin; | |
| 65 const Layout *lt[2]; | |
| 66 }; | |
| 67 | |
| 68 @@ -211,6 +215,7 @@ static void tag(const Arg *arg); | |
| 69 static void tagmon(const Arg *arg); | |
| 70 static void tile(Monitor *); | |
| 71 static void togglebar(const Arg *arg); | |
| 72 +static void toggleextrabar(const Arg *arg); | |
| 73 static void togglefloating(const Arg *arg); | |
| 74 static void toggletag(const Arg *arg); | |
| 75 static void toggleview(const Arg *arg); | |
| 76 @@ -238,6 +243,8 @@ static void zoom(const Arg *arg); | |
| 77 /* variables */ | |
| 78 static const char broken[] = "broken"; | |
| 79 static char stext[256]; | |
| 80 +static char estextl[256]; | |
| 81 +static char estextr[256]; | |
| 82 static int screen; | |
| 83 static int sw, sh; /* X display screen geometry width, height… | |
| 84 static int bh, blw = 0; /* bar geometry */ | |
| 85 @@ -444,6 +451,13 @@ buttonpress(XEvent *e) | |
| 86 click = ClkStatusText; | |
| 87 else | |
| 88 click = ClkWinTitle; | |
| 89 + } else if (ev->window == selmon->extrabarwin) { | |
| 90 + if (ev->x < (int)TEXTW(estextl)) | |
| 91 + click = ClkExBarLeftStatus; | |
| 92 + else if (ev->x > selmon->ww - (int)TEXTW(estextr)) | |
| 93 + click = ClkExBarRightStatus; | |
| 94 + else | |
| 95 + click = ClkExBarMiddle; | |
| 96 } else if ((c = wintoclient(ev->window))) { | |
| 97 focus(c); | |
| 98 restack(selmon); | |
| 99 @@ -506,7 +520,9 @@ cleanupmon(Monitor *mon) | |
| 100 m->next = mon->next; | |
| 101 } | |
| 102 XUnmapWindow(dpy, mon->barwin); | |
| 103 + XUnmapWindow(dpy, mon->extrabarwin); | |
| 104 XDestroyWindow(dpy, mon->barwin); | |
| 105 + XDestroyWindow(dpy, mon->extrabarwin); | |
| 106 free(mon); | |
| 107 } | |
| 108 | |
| 109 @@ -569,6 +585,7 @@ configurenotify(XEvent *e) | |
| 110 if (c->isfullscreen) | |
| 111 resizeclient(c, m->mx, … | |
| 112 XMoveResizeWindow(dpy, m->barwin, m->wx… | |
| 113 + XMoveResizeWindow(dpy, m->extrabarwin, … | |
| 114 } | |
| 115 focus(NULL); | |
| 116 arrange(NULL); | |
| 117 @@ -639,6 +656,7 @@ createmon(void) | |
| 118 m->nmaster = nmaster; | |
| 119 m->showbar = showbar; | |
| 120 m->topbar = topbar; | |
| 121 + m->extrabar = extrabar; | |
| 122 m->lt[0] = &layouts[0]; | |
| 123 m->lt[1] = &layouts[1 % LENGTH(layouts)]; | |
| 124 strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); | |
| 125 @@ -696,7 +714,7 @@ dirtomon(int dir) | |
| 126 void | |
| 127 drawbar(Monitor *m) | |
| 128 { | |
| 129 - int x, w, tw = 0; | |
| 130 + int x, w, tw = 0, etwl = 0, etwr = 0; | |
| 131 int boxs = drw->fonts->h / 9; | |
| 132 int boxw = drw->fonts->h / 6 + 2; | |
| 133 unsigned int i, occ = 0, urg = 0; | |
| 134 @@ -741,6 +759,17 @@ drawbar(Monitor *m) | |
| 135 } | |
| 136 } | |
| 137 drw_map(drw, m->barwin, 0, 0, m->ww, bh); | |
| 138 + | |
| 139 + if (m == selmon) { /* extra status is only drawn on selected mo… | |
| 140 + drw_setscheme(drw, scheme[SchemeNorm]); | |
| 141 + /* clear default bar draw buffer by drawing a blank rec… | |
| 142 + drw_rect(drw, 0, 0, m->ww, bh, 1, 1); | |
| 143 + etwr = TEXTW(estextr) - lrpad + 2; /* 2px right padding… | |
| 144 + drw_text(drw, m->ww - etwr, 0, etwr, bh, 0, estextr, 0); | |
| 145 + etwl = TEXTW(estextl); | |
| 146 + drw_text(drw, 0, 0, etwl, bh, 0, estextl, 0); | |
| 147 + drw_map(drw, m->extrabarwin, 0, 0, m->ww, bh); | |
| 148 + } | |
| 149 } | |
| 150 | |
| 151 void | |
| 152 @@ -1708,6 +1737,15 @@ togglebar(const Arg *arg) | |
| 153 arrange(selmon); | |
| 154 } | |
| 155 | |
| 156 +void | |
| 157 +toggleextrabar(const Arg *arg) | |
| 158 +{ | |
| 159 + selmon->extrabar = !selmon->extrabar; | |
| 160 + updatebarpos(selmon); | |
| 161 + XMoveResizeWindow(dpy, selmon->extrabarwin, selmon->wx, selmon-… | |
| 162 + arrange(selmon); | |
| 163 +} | |
| 164 + | |
| 165 void | |
| 166 togglefloating(const Arg *arg) | |
| 167 { | |
| 168 @@ -1812,14 +1850,22 @@ updatebars(void) | |
| 169 }; | |
| 170 XClassHint ch = {"dwm", "dwm"}; | |
| 171 for (m = mons; m; m = m->next) { | |
| 172 - if (m->barwin) | |
| 173 - continue; | |
| 174 - m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->w… | |
| 175 - CopyFromParent, DefaultVisual(dpy, scre… | |
| 176 - CWOverrideRedirect|CWBackPixmap|CWEvent… | |
| 177 - XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor… | |
| 178 - XMapRaised(dpy, m->barwin); | |
| 179 - XSetClassHint(dpy, m->barwin, &ch); | |
| 180 + if (!m->barwin) { | |
| 181 + m->barwin = XCreateWindow(dpy, root, m->wx, m->… | |
| 182 + CopyFromParent, DefaultVisual(d… | |
| 183 + CWOverrideRedirect|CWBackPixmap… | |
| 184 + XDefineCursor(dpy, m->barwin, cursor[CurNormal]… | |
| 185 + XMapRaised(dpy, m->barwin); | |
| 186 + XSetClassHint(dpy, m->barwin, &ch); | |
| 187 + } | |
| 188 + if (!m->extrabarwin) { | |
| 189 + m->extrabarwin = XCreateWindow(dpy, root, m->wx… | |
| 190 + CopyFromParent, DefaultVisual(d… | |
| 191 + CWOverrideRedirect|CWBackPixmap… | |
| 192 + XDefineCursor(dpy, m->extrabarwin, cursor[CurNo… | |
| 193 + XMapRaised(dpy, m->extrabarwin); | |
| 194 + XSetClassHint(dpy, m->extrabarwin, &ch); | |
| 195 + } | |
| 196 } | |
| 197 } | |
| 198 | |
| 199 @@ -1834,6 +1880,12 @@ updatebarpos(Monitor *m) | |
| 200 m->wy = m->topbar ? m->wy + bh : m->wy; | |
| 201 } else | |
| 202 m->by = -bh; | |
| 203 + if (m->extrabar) { | |
| 204 + m->wh -= bh; | |
| 205 + m->eby = !m->topbar ? m->wy : m->wy + m->wh; | |
| 206 + m->wy = !m->topbar ? m->wy + bh : m->wy; | |
| 207 + } else | |
| 208 + m->eby = -bh; | |
| 209 } | |
| 210 | |
| 211 void | |
| 212 @@ -1990,8 +2042,26 @@ updatesizehints(Client *c) | |
| 213 void | |
| 214 updatestatus(void) | |
| 215 { | |
| 216 - if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) | |
| 217 + char text[768]; | |
| 218 + if (!gettextprop(root, XA_WM_NAME, text, sizeof(text))) { | |
| 219 strcpy(stext, "dwm-"VERSION); | |
| 220 + estextl[0] = '\0'; | |
| 221 + estextr[0] = '\0'; | |
| 222 + } else { | |
| 223 + char *l = strchr(text, statussep); | |
| 224 + if (l) { | |
| 225 + *l = '\0'; l++; | |
| 226 + strncpy(estextl, l, sizeof(estextl) - 1); | |
| 227 + } else | |
| 228 + estextl[0] = '\0'; | |
| 229 + char *r = strchr(estextl, statussep); | |
| 230 + if (r) { | |
| 231 + *r = '\0'; r++; | |
| 232 + strncpy(estextr, r, sizeof(estextr) - 1); | |
| 233 + } else | |
| 234 + estextr[0] = '\0'; | |
| 235 + strncpy(stext, text, sizeof(stext) - 1); | |
| 236 + } | |
| 237 drawbar(selmon); | |
| 238 } | |
| 239 | |
| 240 @@ -2070,7 +2140,7 @@ wintomon(Window w) | |
| 241 if (w == root && getrootptr(&x, &y)) | |
| 242 return recttomon(x, y, 1, 1); | |
| 243 for (m = mons; m; m = m->next) | |
| 244 - if (w == m->barwin) | |
| 245 + if (w == m->barwin || w == m->extrabarwin) | |
| 246 return m; | |
| 247 if ((c = wintoclient(w))) | |
| 248 return c->mon; |