diff --git a/_suckless/dwm/config.def.h b/_suckless/dwm/config.def.h index 0f966b6..82c8292 100644 --- a/_suckless/dwm/config.def.h +++ b/_suckless/dwm/config.def.h @@ -11,9 +11,8 @@ static const unsigned int systrayonleft = 0; /* 0: systray in the right corne static const unsigned int systrayspacing = 2; /* systray spacing */ static const int systraypinningfailfirst = 1; /* 1: if pinning fails, display systray on the first monitor, False: display systray on the last monitor*/ static const int showsystray = 1; /* 0 means no systray */ -static const int showbar = 1; /* 0 means no bar */ -static const int topbar = 1; /* 0 means bottom bar */ -static const int user_bh = 0; /* 0 means that dwm will calculate bar height, >= 1 means dwm will user_bh as bar height */ +static const int showbar = 1; /* 0 means no bar */ +static const int topbar = 1; /* 0 means bottom bar */ static const char *fonts[] = { "monospace:size=10" }; static const char dmenufont[] = "monospace:size=10"; static const char col_gray1[] = "#222222"; @@ -43,17 +42,21 @@ static Sp scratchpads[] = { /* tagging */ static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; +static const char *alttags[] = { "<01>", "<02>", "<03>", "<04>", "<05>" }; static const Rule rules[] = { /* xprop(1): * WM_CLASS(STRING) = instance, class * WM_NAME(STRING) = title */ - /* class instance title tags mask isfloating isterminal noswallow monitor */ - { "Gimp", NULL, NULL, 0, 1, 0, 0, -1 }, - { "Firefox", NULL, NULL, 1 << 8, 0, 0, -1, -1 }, - { "St", NULL, NULL, 0, 0, 1, 0, -1 }, - { NULL, NULL, "Event Tester", 0, 0, 0, 1, -1 }, /* xev */ + /* class instance title tags mask isfloating isterminal noswallow monitor */ + { "Gimp", NULL, NULL, 0, 1, 0, 0, -1 }, + { "Firefox", NULL, NULL, 1 << 8, 0, 0, -1, -1 }, + { "St", NULL, NULL, 0, 0, 1, 0, -1 }, + { NULL, NULL, "Event Tester", 0, 0, 0, 1, -1 }, /* xev */ + { NULL, "spterm", NULL, SPTAG(0), 1, 0, 0, -1 }, + { NULL, "spfm", NULL, SPTAG(1), 1, 0, 0, -1 }, + { NULL, "keepassxc", NULL, SPTAG(2), 0, 0, 0, -1 }, }; /* layout(s) */ @@ -112,13 +115,13 @@ static Key keys[] = { { MODKEY, XK_period, focusmon, {.i = +1 } }, { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, - { MODKEY, XK_y, togglescratch, {.ui = 0 } }, - { MODKEY, XK_u, togglescratch, {.ui = 1 } }, - { MODKEY, XK_x, togglescratch, {.ui = 2 } }, { MODKEY, XK_minus, setgaps, {.i = -5 } }, { MODKEY, XK_equal, setgaps, {.i = +5 } }, { MODKEY|ShiftMask, XK_minus, setgaps, {.i = GAP_RESET } }, { MODKEY|ShiftMask, XK_equal, setgaps, {.i = GAP_TOGGLE} }, + { MODKEY, XK_y, togglescratch, {.ui = 0 } }, + { MODKEY, XK_u, togglescratch, {.ui = 1 } }, + { MODKEY, XK_x, togglescratch, {.ui = 2 } }, TAGKEYS( XK_1, 0) TAGKEYS( XK_2, 1) TAGKEYS( XK_3, 2) @@ -136,8 +139,8 @@ static Key keys[] = { /* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */ static Button buttons[] = { /* click event mask button function argument */ - { ClkLtSymbol, 0, Button1, setlayout, {0} }, - { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, + { ClkTagBar, MODKEY, Button1, tag, {0} }, + { ClkTagBar, MODKEY, Button3, toggletag, {0} }, { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, { ClkClientWin, MODKEY, Button1, movemouse, {0} }, { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, @@ -147,3 +150,4 @@ static Button buttons[] = { { ClkTagBar, MODKEY, Button1, tag, {0} }, { ClkTagBar, MODKEY, Button3, toggletag, {0} }, }; + diff --git a/_suckless/dwm/config.h b/_suckless/dwm/config.h index fe0ec3e..870931a 100644 --- a/_suckless/dwm/config.h +++ b/_suckless/dwm/config.h @@ -7,10 +7,10 @@ static const unsigned int gappx = 15; /* default gap between windows i static const unsigned int snap = 32; /* snap pixel */ static const int swallowfloating = 1; /* 1 means swallow floating windows by default */ static const unsigned int systraypinning = 0; /* 0: sloppy systray follows selected monitor, >0: pin systray to monitor X */ -static const unsigned int systrayonleft = 0; /* 0: systray in the right corner, >0: systray on left of status text */ +static const unsigned int systrayonleft = 0; /* 0: systray in the right corner, >0: systray on left of status text */ static const unsigned int systrayspacing = 2; /* systray spacing */ static const int systraypinningfailfirst = 1; /* 1: if pinning fails, display systray on the first monitor, False: display systray on the last monitor*/ -static const int showsystray = 1; /* 0 means no systray */ +static const int showsystray = 1; /* 0 means no systray */ static const int showbar = 1; /* 0 means no bar */ static const int topbar = 1; /* 0 means bottom bar */ static const int user_bh = 0; /* 0 means that dwm will calculate bar height, >= 1 means dwm will user_bh as bar height */ @@ -29,8 +29,8 @@ static const char *colors[][3] = { }; typedef struct { - const char *name; - const void *cmd; + const char *name; + const void *cmd; } Sp; const char *spcmd1[] = {"st", "-n", "spterm", "-g", "120x34", NULL }; const char *spcmd2[] = {"st", "-n", "spwork", "-g", "120x34", NULL }; @@ -42,6 +42,7 @@ static Sp scratchpads[] = { /* tagging */ static const char *tags[] = {"\uf292", "\uf738", "\uf70d", "\uf7aa", "\ue795", "\uf120", "\ufc58", "\uf9b0", "\uf296", "\uf2bb"}; +static const char *alttags[] = {"\uf292", "\uf738", "\uf70d", "\uf7aa", "\ue795", "\uf120", "\ufc58", "\uf9b0", "\uf296", "\uf2bb"}; static const Rule rules[] = { /* xprop(1): @@ -64,15 +65,15 @@ static const Rule rules[] = { /* layout(s) */ static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ static const int nmaster = 1; /* number of clients in master area */ -static const int resizehints = 0; /* 1 means respect size hints in tiled resizals */ +static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */ static const int attachbelow = 1; /* 1 means attach after the currently active window */ static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */ static const Layout layouts[] = { - /* symbol arrange function */ - { "\ue9b0", tile }, /* first entry is default */ - { "><>", NULL }, /* no layout function means floating behavior */ - { "[M]", monocle }, + /* symbol arrange function */ + { "| \ufc56", tile }, /* first entry is default */ + { "><>", NULL }, /* no layout function means floating behavior */ + { "[M]", monocle }, }; /* key definitions */ @@ -160,3 +161,4 @@ static Button buttons[] = { { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, { ClkClientWin, MODKEY, Button3, resizemouse, {0} }, }; + diff --git a/_suckless/dwm/dwm.c b/_suckless/dwm/dwm.c index 8504943..fb3048a 100644 --- a/_suckless/dwm/dwm.c +++ b/_suckless/dwm/dwm.c @@ -67,17 +67,14 @@ #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) #define SYSTEM_TRAY_REQUEST_DOCK 0 - /* XEMBED messages */ #define XEMBED_EMBEDDED_NOTIFY 0 #define XEMBED_WINDOW_ACTIVATE 1 #define XEMBED_FOCUS_IN 4 #define XEMBED_MODALITY_ON 10 - #define XEMBED_MAPPED (1 << 0) #define XEMBED_WINDOW_ACTIVATE 1 #define XEMBED_WINDOW_DEACTIVATE 2 - #define VERSION_MAJOR 0 #define VERSION_MINOR 0 #define XEMBED_EMBEDDED_VERSION (VERSION_MAJOR << 16) | VERSION_MINOR @@ -299,7 +296,7 @@ static Client *termforwin(const Client *c); static pid_t winpid(Window w); /* variables */ -static Systray *systray = NULL; +static Systray *systray = NULL; static const char broken[] = "broken"; static char stext[1024]; static int screen; @@ -322,7 +319,7 @@ static void (*handler[LASTEvent]) (XEvent *) = { [MapRequest] = maprequest, [MotionNotify] = motionnotify, [PropertyNotify] = propertynotify, - [ResizeRequest] = resizerequest, + [ResizeRequest] = resizerequest, [UnmapNotify] = unmapnotify }; static Atom wmatom[WMLast], netatom[NetLast], xatom[XLast]; @@ -554,7 +551,7 @@ unswallow(Client *c) void buttonpress(XEvent *e) { - unsigned int i, x, click, occ = 0; + unsigned int i, x, click, occ; Arg arg = {0}; Client *c; Monitor *m; @@ -568,15 +565,14 @@ buttonpress(XEvent *e) focus(NULL); } if (ev->window == selmon->barwin) { - i = x = 0; + i = x = occ = 0; + /* Bitmask of occupied tags */ for (c = m->clients; c; c = c->next) - occ |= c->tags == 255 ? 0 : c->tags; - do { - /* do not reserve space for vacant tags */ - if (!(occ & 1 << i || m->tagset[m->seltags] & 1 << i)) - continue; - x += TEXTW(tags[i]); - } while (ev->x >= x && ++i < LENGTH(tags)); + occ |= c->tags; + + do + x += TEXTW(occ & 1 << i ? alttags[i] : tags[i]); + while (ev->x >= x && ++i < LENGTH(tags)); if (i < LENGTH(tags)) { click = ClkTagBar; arg.ui = 1 << i; @@ -623,15 +619,18 @@ cleanup(void) XUngrabKey(dpy, AnyKey, AnyModifier, root); while (mons) cleanupmon(mons); + if (showsystray) { XUnmapWindow(dpy, systray->win); XDestroyWindow(dpy, systray->win); free(systray); } - for (i = 0; i < CurLast; i++) + + for (i = 0; i < CurLast; i++) drw_cur_free(drw, cursor[i]); for (i = 0; i < LENGTH(colors) + 1; i++) free(scheme[i]); + free(scheme); XDestroyWindow(dpy, wmcheckwin); drw_free(drw); XSync(dpy, False); @@ -709,6 +708,7 @@ clientmessage(XEvent *e) } return; } + if (!c) return; if (cme->message_type == netatom[NetWMState]) { @@ -933,10 +933,9 @@ drawstatusbar(Monitor *m, int bh, char* stext) { isCode = 0; text = p; - w += 2; /* 1px padding on both sides */ - ret = x = m->ww - w; - x = m->ww - w - getsystraywidth(); - drw_setscheme(drw, scheme[LENGTH(colors)]); + w += 2; /* 1px padding on both sides */ + ret = m->ww - w; + x = m->ww - w - getsystraywidth(); drw_setscheme(drw, scheme[LENGTH(colors)]); drw->scheme[ColFg] = scheme[SchemeNorm][ColFg]; @@ -1008,33 +1007,36 @@ drawstatusbar(Monitor *m, int bh, char* stext) { void drawbar(Monitor *m) { - int x, w, tw = 0, stw = 0; - unsigned int i, occ = 0, urg = 0; - Client *c; + int x, w, tw = 0, stw = 0; + int boxs = drw->fonts->h / 9; + int boxw = drw->fonts->h / 6 + 2; + unsigned int i, occ = 0, urg = 0; + const char *tagtext; + Client *c; + + if (!m->showbar) + return; if(showsystray && m == systraytomon(m) && !systrayonleft) stw = getsystraywidth(); - /* draw status first so it can be overdrawn by tags later */ - if (m == selmon) { /* status is only drawn on selected monitor */ - tw = m->ww - drawstatusbar(m, bh, stext); - } + /* draw status first so it can be overdrawn by tags later */ + if (m == selmon) { /* status is only drawn on selected monitor */ + tw = m->ww - drawstatusbar(m, bh, stext); + } resizebarwin(m); for (c = m->clients; c; c = c->next) { - occ |= c->tags == 255 ? 0 : c->tags; + occ |= c->tags; if (c->isurgent) urg |= c->tags; } x = 0; for (i = 0; i < LENGTH(tags); i++) { - /* do not draw vacant tags */ - if (!(occ & 1 << i || m->tagset[m->seltags] & 1 << i)) - continue; - - w = TEXTW(tags[i]); - drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); - drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i); + tagtext = occ & 1 << i ? alttags[i] : tags[i]; + w = TEXTW(tagtext); + drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); + drw_text(drw, x, 0, w, bh, lrpad / 2, tagtext, urg & 1 << i); x += w; } w = blw = TEXTW(m->ltsymbol); @@ -1042,7 +1044,7 @@ drawbar(Monitor *m) x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); if ((w = m->ww - tw - stw - x) > bh) { - drw_setscheme(drw, scheme[SchemeNorm]); + drw_setscheme(drw, scheme[SchemeNorm]); drw_rect(drw, x, 0, w, bh, 1, 1); } drw_map(drw, m->barwin, 0, 0, m->ww - stw, bh); @@ -1177,6 +1179,7 @@ getatomprop(Client *c, Atom prop) unsigned long dl; unsigned char *p = NULL; Atom da, atom = None; + /* FIXME getatomprop should return the number of items and a pointer to * the stored data instead of this workaround */ Atom req = XA_ATOM; @@ -1335,6 +1338,7 @@ killclient(const Arg *arg) { if (!selmon->sel) return; + if (!sendevent(selmon->sel->win, wmatom[WMDelete], NoEventMask, wmatom[WMDelete], CurrentTime, 0 , 0, 0)) { XGrabServer(dpy); XSetErrorHandler(xerrordummy); @@ -1393,7 +1397,7 @@ manage(Window w, XWindowAttributes *wa) XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask); grabbuttons(c, 0); if (!c->isfloating) - c->isfloating = c->oldstate = trans != None || c->isfixed; + c->isfloating = c->oldstate = t || c->isfixed; if (c->isfloating) XRaiseWindow(dpy, c->win); if( attachbelow ) @@ -1430,6 +1434,7 @@ maprequest(XEvent *e) { static XWindowAttributes wa; XMapRequestEvent *ev = &e->xmaprequest; + Client *i; if ((i = wintosystrayicon(ev->window))) { sendevent(i->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_WINDOW_ACTIVATE, 0, systray->win, XEMBED_EMBEDDED_VERSION); @@ -1573,7 +1578,8 @@ propertynotify(XEvent *e) resizebarwin(selmon); updatesystray(); } - if ((ev->window == root) && (ev->atom == XA_WM_NAME)) + + if ((ev->window == root) && (ev->atom == XA_WM_NAME)) updatestatus(); else if (ev->state == PropertyDelete) return; /* ignore */ @@ -1634,7 +1640,6 @@ removesystrayicon(Client *i) free(i); } - void resize(Client *c, int x, int y, int w, int h, int interact) { @@ -1854,7 +1859,8 @@ sendevent(Window w, Atom proto, int mask, long d0, long d1, long d2, long d3, lo else { exists = True; mt = proto; - } + } + if (exists) { ev.type = ClientMessage; ev.xclient.window = w; @@ -1981,7 +1987,7 @@ setup(void) if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) die("no fonts could be loaded."); lrpad = drw->fonts->h; - bh = user_bh ? user_bh : drw->fonts->h + 2; + bh = drw->fonts->h + 2; updategeom(); /* init atoms */ utf8string = XInternAtom(dpy, "UTF8_STRING", False); @@ -1990,12 +1996,12 @@ setup(void) wmatom[WMState] = XInternAtom(dpy, "WM_STATE", False); wmatom[WMTakeFocus] = XInternAtom(dpy, "WM_TAKE_FOCUS", False); netatom[NetActiveWindow] = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False); - netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); + netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); netatom[NetSystemTray] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_S0", False); netatom[NetSystemTrayOP] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_OPCODE", False); netatom[NetSystemTrayOrientation] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_ORIENTATION", False); netatom[NetSystemTrayOrientationHorz] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_ORIENTATION_HORZ", False); - netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); + netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False); netatom[NetWMCheck] = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", False); netatom[NetWMFullscreen] = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False); @@ -2005,7 +2011,7 @@ setup(void) xatom[Manager] = XInternAtom(dpy, "MANAGER", False); xatom[Xembed] = XInternAtom(dpy, "_XEMBED", False); xatom[XembedInfo] = XInternAtom(dpy, "_XEMBED_INFO", False); - /* init cursors */ + /* init cursors */ cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr); cursor[CurResize] = drw_cur_create(drw, XC_sizing); cursor[CurMove] = drw_cur_create(drw, XC_fleur); @@ -2314,11 +2320,11 @@ unmanage(Client *c, int destroyed) } free(c); - if (!s) { - arrange(m); - focus(NULL); - updateclientlist(); - } + if (!s) { + arrange(m); + focus(NULL); + updateclientlist(); + } } void @@ -2545,6 +2551,7 @@ updatestatus(void) updatesystray(); } + void updatesystrayicongeom(Client *i, int w, int h) { @@ -2610,7 +2617,7 @@ updatesystray(void) if (!showsystray) return; if (systrayonleft) - x -= sw; + x -= sw + lrpad / 2; if (!systray) { /* init systray */ if (!(systray = (Systray *)calloc(1, sizeof(Systray)))) diff --git a/_suckless/dwm/patches/00-dwm-systray-20210217-61bb8b2.diff b/_suckless/dwm/patches/00-dwm-status2d-systray-6.3.diff similarity index 74% rename from _suckless/dwm/patches/00-dwm-systray-20210217-61bb8b2.diff rename to _suckless/dwm/patches/00-dwm-status2d-systray-6.3.diff index 02604e5..c79ef49 100644 --- a/_suckless/dwm/patches/00-dwm-systray-20210217-61bb8b2.diff +++ b/_suckless/dwm/patches/00-dwm-status2d-systray-6.3.diff @@ -1,59 +1,51 @@ -From 54948f3b69824de6eba41d281ff72c08131451a8 Mon Sep 17 00:00:00 2001 -From: Hritik Vijay -Date: Wed, 17 Feb 2021 19:30:25 +0530 -Subject: [PATCH] [Patch] Systray for dwm - -This patch adds an option for systray placement via `systrayleft`. - -Original author: Jan Christoph Ebersbach , inspired by http://code.google.com/p/dwm-plus -URL: http://dwm.suckless.org/patches/systray -dwm 6.2 port by Igor Gevka ---- - config.def.h | 6 +- - dwm.c | 406 +++++++++++++++++++++++++++++++++++++++++++++++---- - 2 files changed, 385 insertions(+), 27 deletions(-) - diff --git a/config.def.h b/config.def.h -index 1c0b587..9e74de2 100644 +index a2ac963..86fcc84 100644 --- a/config.def.h +++ b/config.def.h -@@ -3,6 +3,11 @@ +@@ -3,8 +3,13 @@ /* appearance */ static const unsigned int borderpx = 1; /* border pixel of windows */ static const unsigned int snap = 32; /* snap pixel */ +-static const int showbar = 1; /* 0 means no bar */ +-static const int topbar = 1; /* 0 means bottom bar */ +static const unsigned int systraypinning = 0; /* 0: sloppy systray follows selected monitor, >0: pin systray to monitor X */ +static const unsigned int systrayonleft = 0; /* 0: systray in the right corner, >0: systray on left of status text */ +static const unsigned int systrayspacing = 2; /* systray spacing */ +static const int systraypinningfailfirst = 1; /* 1: if pinning fails, display systray on the first monitor, False: display systray on the last monitor*/ +static const int showsystray = 1; /* 0 means no systray */ - static const int showbar = 1; /* 0 means no bar */ - static const int topbar = 1; /* 0 means bottom bar */ ++static const int showbar = 1; /* 0 means no bar */ ++static const int topbar = 1; /* 0 means bottom bar */ static const char *fonts[] = { "monospace:size=10" }; -@@ -112,4 +117,3 @@ static Button buttons[] = { - { ClkTagBar, MODKEY, Button1, tag, {0} }, - { ClkTagBar, MODKEY, Button3, toggletag, {0} }, - }; -- + static const char dmenufont[] = "monospace:size=10"; + static const char col_gray1[] = "#222222"; +@@ -101,8 +106,8 @@ static Key keys[] = { + /* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */ + static Button buttons[] = { + /* click event mask button function argument */ +- { ClkLtSymbol, 0, Button1, setlayout, {0} }, +- { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, ++ { ClkTagBar, MODKEY, Button1, tag, {0} }, ++ { ClkTagBar, MODKEY, Button3, toggletag, {0} }, + { ClkWinTitle, 0, Button2, zoom, {0} }, + { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, + { ClkClientWin, MODKEY, Button1, movemouse, {0} }, diff --git a/dwm.c b/dwm.c -index 664c527..f0d50ee 100644 +index a96f33c..8153bfe 100644 --- a/dwm.c +++ b/dwm.c -@@ -57,12 +57,30 @@ +@@ -57,12 +57,27 @@ #define TAGMASK ((1 << LENGTH(tags)) - 1) #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) +#define SYSTEM_TRAY_REQUEST_DOCK 0 -+ +/* XEMBED messages */ +#define XEMBED_EMBEDDED_NOTIFY 0 +#define XEMBED_WINDOW_ACTIVATE 1 +#define XEMBED_FOCUS_IN 4 +#define XEMBED_MODALITY_ON 10 -+ +#define XEMBED_MAPPED (1 << 0) +#define XEMBED_WINDOW_ACTIVATE 1 +#define XEMBED_WINDOW_DEACTIVATE 2 -+ +#define VERSION_MAJOR 0 +#define VERSION_MINOR 0 +#define XEMBED_EMBEDDED_VERSION (VERSION_MAJOR << 16) | VERSION_MINOR @@ -69,7 +61,7 @@ index 664c527..f0d50ee 100644 enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ -@@ -141,6 +159,12 @@ typedef struct { +@@ -141,6 +156,12 @@ typedef struct { int monitor; } Rule; @@ -82,7 +74,15 @@ index 664c527..f0d50ee 100644 /* function declarations */ static void applyrules(Client *c); static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact); -@@ -172,6 +196,7 @@ static void focusstack(const Arg *arg); +@@ -163,6 +184,7 @@ static void detachstack(Client *c); + static Monitor *dirtomon(int dir); + static void drawbar(Monitor *m); + static void drawbars(void); ++static int drawstatusbar(Monitor *m, int bh, char* text); + static void enternotify(XEvent *e); + static void expose(XEvent *e); + static void focus(Client *c); +@@ -172,6 +194,7 @@ static void focusstack(const Arg *arg); static Atom getatomprop(Client *c, Atom prop); static int getrootptr(int *x, int *y); static long getstate(Window w); @@ -90,7 +90,7 @@ index 664c527..f0d50ee 100644 static int gettextprop(Window w, Atom atom, char *text, unsigned int size); static void grabbuttons(Client *c, int focused); static void grabkeys(void); -@@ -189,13 +214,16 @@ static void pop(Client *); +@@ -189,13 +212,16 @@ static void pop(Client *); static void propertynotify(XEvent *e); static void quit(const Arg *arg); static Monitor *recttomon(int x, int y, int w, int h); @@ -108,7 +108,7 @@ index 664c527..f0d50ee 100644 static void sendmon(Client *c, Monitor *m); static void setclientstate(Client *c, long state); static void setfocus(Client *c); -@@ -207,6 +235,7 @@ static void seturgent(Client *c, int urg); +@@ -207,6 +233,7 @@ static void seturgent(Client *c, int urg); static void showhide(Client *c); static void sigchld(int unused); static void spawn(const Arg *arg); @@ -116,7 +116,7 @@ index 664c527..f0d50ee 100644 static void tag(const Arg *arg); static void tagmon(const Arg *arg); static void tile(Monitor *); -@@ -224,18 +253,23 @@ static int updategeom(void); +@@ -224,20 +251,25 @@ static int updategeom(void); static void updatenumlockmask(void); static void updatesizehints(Client *c); static void updatestatus(void); @@ -136,15 +136,18 @@ index 664c527..f0d50ee 100644 static void zoom(const Arg *arg); /* variables */ -+static Systray *systray = NULL; ++static Systray *systray = NULL; static const char broken[] = "broken"; - static char stext[256]; +-static char stext[256]; ++static char stext[1024]; static int screen; -@@ -258,9 +292,10 @@ static void (*handler[LASTEvent]) (XEvent *) = { + static int sw, sh; /* X display screen geometry width, height */ + static int bh, blw = 0; /* bar geometry */ +@@ -258,9 +290,10 @@ static void (*handler[LASTEvent]) (XEvent *) = { [MapRequest] = maprequest, [MotionNotify] = motionnotify, [PropertyNotify] = propertynotify, -+ [ResizeRequest] = resizerequest, ++ [ResizeRequest] = resizerequest, [UnmapNotify] = unmapnotify }; -static Atom wmatom[WMLast], netatom[NetLast]; @@ -152,7 +155,7 @@ index 664c527..f0d50ee 100644 static int running = 1; static Cur *cursor[CurLast]; static Clr **scheme; -@@ -440,7 +475,7 @@ buttonpress(XEvent *e) +@@ -440,7 +473,7 @@ buttonpress(XEvent *e) arg.ui = 1 << i; } else if (ev->x < x + blw) click = ClkLtSymbol; @@ -161,19 +164,26 @@ index 664c527..f0d50ee 100644 click = ClkStatusText; else click = ClkWinTitle; -@@ -483,6 +518,11 @@ cleanup(void) +@@ -483,9 +516,16 @@ cleanup(void) XUngrabKey(dpy, AnyKey, AnyModifier, root); while (mons) cleanupmon(mons); +- for (i = 0; i < CurLast; i++) ++ + if (showsystray) { + XUnmapWindow(dpy, systray->win); + XDestroyWindow(dpy, systray->win); + free(systray); + } - for (i = 0; i < CurLast; i++) ++ ++ for (i = 0; i < CurLast; i++) drw_cur_free(drw, cursor[i]); - for (i = 0; i < LENGTH(colors); i++) -@@ -513,9 +553,57 @@ cleanupmon(Monitor *mon) +- for (i = 0; i < LENGTH(colors); i++) ++ for (i = 0; i < LENGTH(colors) + 1; i++) + free(scheme[i]); + XDestroyWindow(dpy, wmcheckwin); + drw_free(drw); +@@ -513,9 +553,58 @@ cleanupmon(Monitor *mon) void clientmessage(XEvent *e) { @@ -228,10 +238,11 @@ index 664c527..f0d50ee 100644 + } + return; + } ++ if (!c) return; if (cme->message_type == netatom[NetWMState]) { -@@ -568,7 +656,7 @@ configurenotify(XEvent *e) +@@ -568,7 +657,7 @@ configurenotify(XEvent *e) for (c = m->clients; c; c = c->next) if (c->isfullscreen) resizeclient(c, m->mx, m->my, m->mw, m->mh); @@ -240,7 +251,7 @@ index 664c527..f0d50ee 100644 } focus(NULL); arrange(NULL); -@@ -653,6 +741,11 @@ destroynotify(XEvent *e) +@@ -653,6 +742,11 @@ destroynotify(XEvent *e) if ((c = wintoclient(ev->window))) unmanage(c, 1); @@ -252,7 +263,119 @@ index 664c527..f0d50ee 100644 } void -@@ -696,19 +789,23 @@ dirtomon(int dir) +@@ -693,10 +787,119 @@ dirtomon(int dir) + return m; + } + ++int ++drawstatusbar(Monitor *m, int bh, char* stext) { ++ int ret, i, w, x, len; ++ short isCode = 0; ++ char *text; ++ char *p; ++ ++ len = strlen(stext) + 1 ; ++ if (!(text = (char*) malloc(sizeof(char)*len))) ++ die("malloc"); ++ p = text; ++ memcpy(text, stext, len); ++ ++ /* compute width of the status text */ ++ w = 0; ++ i = -1; ++ while (text[++i]) { ++ if (text[i] == '^') { ++ if (!isCode) { ++ isCode = 1; ++ text[i] = '\0'; ++ w += TEXTW(text) - lrpad; ++ text[i] = '^'; ++ if (text[++i] == 'f') ++ w += atoi(text + ++i); ++ } else { ++ isCode = 0; ++ text = text + i + 1; ++ i = -1; ++ } ++ } ++ } ++ if (!isCode) ++ w += TEXTW(text) - lrpad; ++ else ++ isCode = 0; ++ text = p; ++ ++ w += 2; /* 1px padding on both sides */ ++ ret = m->ww - w; ++ x = m->ww - w - getsystraywidth(); ++ ++ drw_setscheme(drw, scheme[LENGTH(colors)]); ++ drw->scheme[ColFg] = scheme[SchemeNorm][ColFg]; ++ drw->scheme[ColBg] = scheme[SchemeNorm][ColBg]; ++ drw_rect(drw, x, 0, w, bh, 1, 1); ++ x++; ++ ++ /* process status text */ ++ i = -1; ++ while (text[++i]) { ++ if (text[i] == '^' && !isCode) { ++ isCode = 1; ++ ++ text[i] = '\0'; ++ w = TEXTW(text) - lrpad; ++ drw_text(drw, x, 0, w, bh, 0, text, 0); ++ ++ x += w; ++ ++ /* process code */ ++ while (text[++i] != '^') { ++ if (text[i] == 'c') { ++ char buf[8]; ++ memcpy(buf, (char*)text+i+1, 7); ++ buf[7] = '\0'; ++ drw_clr_create(drw, &drw->scheme[ColFg], buf); ++ i += 7; ++ } else if (text[i] == 'b') { ++ char buf[8]; ++ memcpy(buf, (char*)text+i+1, 7); ++ buf[7] = '\0'; ++ drw_clr_create(drw, &drw->scheme[ColBg], buf); ++ i += 7; ++ } else if (text[i] == 'd') { ++ drw->scheme[ColFg] = scheme[SchemeNorm][ColFg]; ++ drw->scheme[ColBg] = scheme[SchemeNorm][ColBg]; ++ } else if (text[i] == 'r') { ++ int rx = atoi(text + ++i); ++ while (text[++i] != ','); ++ int ry = atoi(text + ++i); ++ while (text[++i] != ','); ++ int rw = atoi(text + ++i); ++ while (text[++i] != ','); ++ int rh = atoi(text + ++i); ++ ++ drw_rect(drw, rx + x, ry, rw, rh, 1, 0); ++ } else if (text[i] == 'f') { ++ x += atoi(text + ++i); ++ } ++ } ++ ++ text = text + i + 1; ++ i=-1; ++ isCode = 0; ++ } ++ } ++ ++ if (!isCode) { ++ w = TEXTW(text) - lrpad; ++ drw_text(drw, x, 0, w, bh, 0, text, 0); ++ } ++ ++ drw_setscheme(drw, scheme[SchemeNorm]); ++ free(p); ++ ++ return ret; ++} ++ void drawbar(Monitor *m) { @@ -261,25 +384,26 @@ index 664c527..f0d50ee 100644 int boxs = drw->fonts->h / 9; int boxw = drw->fonts->h / 6 + 2; unsigned int i, occ = 0, urg = 0; - Client *c; +@@ -705,13 +908,15 @@ drawbar(Monitor *m) + if (!m->showbar) + return; + if(showsystray && m == systraytomon(m) && !systrayonleft) + stw = getsystraywidth(); + /* draw status first so it can be overdrawn by tags later */ if (m == selmon) { /* status is only drawn on selected monitor */ - drw_setscheme(drw, scheme[SchemeNorm]); +- drw_setscheme(drw, scheme[SchemeNorm]); - tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */ - drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0); -+ tw = TEXTW(stext) - lrpad + 2; /* 2px padding */ -+ drw_text(drw, m->ww - tw - stw, 0, tw, bh, lrpad / 2 - 2, stext, 0); ++ tw = m->ww - drawstatusbar(m, bh, stext); } + resizebarwin(m); for (c = m->clients; c; c = c->next) { occ |= c->tags; if (c->isurgent) -@@ -729,7 +826,7 @@ drawbar(Monitor *m) +@@ -732,7 +937,7 @@ drawbar(Monitor *m) drw_setscheme(drw, scheme[SchemeNorm]); x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); @@ -288,7 +412,7 @@ index 664c527..f0d50ee 100644 if (m->sel) { drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); -@@ -740,7 +837,7 @@ drawbar(Monitor *m) +@@ -743,7 +948,7 @@ drawbar(Monitor *m) drw_rect(drw, x, 0, w, bh, 1, 1); } } @@ -297,7 +421,7 @@ index 664c527..f0d50ee 100644 } void -@@ -777,8 +874,11 @@ expose(XEvent *e) +@@ -780,8 +985,11 @@ expose(XEvent *e) Monitor *m; XExposeEvent *ev = &e->xexpose; @@ -310,17 +434,17 @@ index 664c527..f0d50ee 100644 } void -@@ -863,10 +963,17 @@ getatomprop(Client *c, Atom prop) - unsigned long dl; +@@ -867,9 +1075,17 @@ getatomprop(Client *c, Atom prop) unsigned char *p = NULL; Atom da, atom = None; + +- if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, XA_ATOM, + /* FIXME getatomprop should return the number of items and a pointer to + * the stored data instead of this workaround */ + Atom req = XA_ATOM; + if (prop == xatom[XembedInfo]) + req = xatom[XembedInfo]; - -- if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, XA_ATOM, ++ + if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, req, &da, &di, &dl, &dl, &p) == Success && p) { atom = *(Atom *)p; @@ -329,7 +453,7 @@ index 664c527..f0d50ee 100644 XFree(p); } return atom; -@@ -900,6 +1007,16 @@ getstate(Window w) +@@ -903,6 +1119,16 @@ getstate(Window w) return result; } @@ -346,32 +470,35 @@ index 664c527..f0d50ee 100644 int gettextprop(Window w, Atom atom, char *text, unsigned int size) { -@@ -1004,7 +1121,7 @@ killclient(const Arg *arg) +@@ -1007,7 +1233,8 @@ killclient(const Arg *arg) { if (!selmon->sel) return; - if (!sendevent(selmon->sel, wmatom[WMDelete])) { ++ + if (!sendevent(selmon->sel->win, wmatom[WMDelete], NoEventMask, wmatom[WMDelete], CurrentTime, 0 , 0, 0)) { XGrabServer(dpy); XSetErrorHandler(xerrordummy); XSetCloseDownMode(dpy, DestroyAll); -@@ -1092,6 +1209,12 @@ maprequest(XEvent *e) - { +@@ -1096,6 +1323,13 @@ maprequest(XEvent *e) static XWindowAttributes wa; XMapRequestEvent *ev = &e->xmaprequest; + + Client *i; + if ((i = wintosystrayicon(ev->window))) { + sendevent(i->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_WINDOW_ACTIVATE, 0, systray->win, XEMBED_EMBEDDED_VERSION); + resizebarwin(selmon); + updatesystray(); + } - ++ if (!XGetWindowAttributes(dpy, ev->window, &wa)) return; -@@ -1216,6 +1339,16 @@ propertynotify(XEvent *e) + if (wa.override_redirect) +@@ -1219,7 +1453,18 @@ propertynotify(XEvent *e) Window trans; XPropertyEvent *ev = &e->xproperty; +- if ((ev->window == root) && (ev->atom == XA_WM_NAME)) + if ((c = wintosystrayicon(ev->window))) { + if (ev->atom == XA_WM_NORMAL_HINTS) { + updatesizehints(c); @@ -382,10 +509,12 @@ index 664c527..f0d50ee 100644 + resizebarwin(selmon); + updatesystray(); + } - if ((ev->window == root) && (ev->atom == XA_WM_NAME)) ++ ++ if ((ev->window == root) && (ev->atom == XA_WM_NAME)) updatestatus(); else if (ev->state == PropertyDelete) -@@ -1266,6 +1399,20 @@ recttomon(int x, int y, int w, int h) + return; /* ignore */ +@@ -1269,6 +1514,19 @@ recttomon(int x, int y, int w, int h) return r; } @@ -401,12 +530,11 @@ index 664c527..f0d50ee 100644 + *ii = i->next; + free(i); +} -+ + void resize(Client *c, int x, int y, int w, int h, int interact) { -@@ -1273,6 +1420,14 @@ resize(Client *c, int x, int y, int w, int h, int interact) +@@ -1276,6 +1534,14 @@ resize(Client *c, int x, int y, int w, int h, int interact) resizeclient(c, x, y, w, h); } @@ -421,7 +549,7 @@ index 664c527..f0d50ee 100644 void resizeclient(Client *c, int x, int y, int w, int h) { -@@ -1345,6 +1500,19 @@ resizemouse(const Arg *arg) +@@ -1348,6 +1614,19 @@ resizemouse(const Arg *arg) } } @@ -441,7 +569,7 @@ index 664c527..f0d50ee 100644 void restack(Monitor *m) { -@@ -1434,26 +1602,36 @@ setclientstate(Client *c, long state) +@@ -1437,26 +1716,37 @@ setclientstate(Client *c, long state) } int @@ -465,11 +593,12 @@ index 664c527..f0d50ee 100644 + exists = protocols[n] == proto; + XFree(protocols); + } -+ } + } + else { + exists = True; + mt = proto; - } ++ } ++ if (exists) { ev.type = ClientMessage; - ev.xclient.window = c->win; @@ -489,7 +618,7 @@ index 664c527..f0d50ee 100644 } return exists; } -@@ -1467,7 +1645,7 @@ setfocus(Client *c) +@@ -1470,7 +1760,7 @@ setfocus(Client *c) XA_WINDOW, 32, PropModeReplace, (unsigned char *) &(c->win), 1); } @@ -498,29 +627,36 @@ index 664c527..f0d50ee 100644 } void -@@ -1556,6 +1734,10 @@ setup(void) +@@ -1558,22 +1848,32 @@ setup(void) + wmatom[WMState] = XInternAtom(dpy, "WM_STATE", False); wmatom[WMTakeFocus] = XInternAtom(dpy, "WM_TAKE_FOCUS", False); netatom[NetActiveWindow] = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False); - netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); +- netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); +- netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); ++ netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); + netatom[NetSystemTray] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_S0", False); + netatom[NetSystemTrayOP] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_OPCODE", False); + netatom[NetSystemTrayOrientation] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_ORIENTATION", False); + netatom[NetSystemTrayOrientationHorz] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_ORIENTATION_HORZ", False); - netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); ++ netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False); netatom[NetWMCheck] = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", False); -@@ -1563,6 +1745,9 @@ setup(void) + netatom[NetWMFullscreen] = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False); netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False); netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False); netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False); +- /* init cursors */ + xatom[Manager] = XInternAtom(dpy, "MANAGER", False); + xatom[Xembed] = XInternAtom(dpy, "_XEMBED", False); + xatom[XembedInfo] = XInternAtom(dpy, "_XEMBED_INFO", False); - /* init cursors */ ++ /* init cursors */ cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr); cursor[CurResize] = drw_cur_create(drw, XC_sizing); -@@ -1571,6 +1756,8 @@ setup(void) - scheme = ecalloc(LENGTH(colors), sizeof(Clr *)); + cursor[CurMove] = drw_cur_create(drw, XC_fleur); + /* init appearance */ +- scheme = ecalloc(LENGTH(colors), sizeof(Clr *)); ++ scheme = ecalloc(LENGTH(colors) + 1, sizeof(Clr *)); ++ scheme[LENGTH(colors)] = drw_scm_create(drw, colors[0], 3); for (i = 0; i < LENGTH(colors); i++) scheme[i] = drw_scm_create(drw, colors[i], 3); + /* init system tray */ @@ -528,7 +664,7 @@ index 664c527..f0d50ee 100644 /* init bars */ updatebars(); updatestatus(); -@@ -1704,7 +1891,18 @@ togglebar(const Arg *arg) +@@ -1707,7 +2007,18 @@ togglebar(const Arg *arg) { selmon->showbar = !selmon->showbar; updatebarpos(selmon); @@ -548,7 +684,7 @@ index 664c527..f0d50ee 100644 arrange(selmon); } -@@ -1799,11 +1997,18 @@ unmapnotify(XEvent *e) +@@ -1802,11 +2113,18 @@ unmapnotify(XEvent *e) else unmanage(c, 0); } @@ -567,7 +703,7 @@ index 664c527..f0d50ee 100644 Monitor *m; XSetWindowAttributes wa = { .override_redirect = True, -@@ -1814,10 +2019,15 @@ updatebars(void) +@@ -1817,10 +2135,15 @@ updatebars(void) for (m = mons; m; m = m->next) { if (m->barwin) continue; @@ -584,13 +720,14 @@ index 664c527..f0d50ee 100644 XMapRaised(dpy, m->barwin); XSetClassHint(dpy, m->barwin, &ch); } -@@ -1993,6 +2203,124 @@ updatestatus(void) +@@ -1996,6 +2319,125 @@ updatestatus(void) if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) strcpy(stext, "dwm-"VERSION); drawbar(selmon); + updatesystray(); +} + ++ +void +updatesystrayicongeom(Client *i, int w, int h) +{ @@ -656,7 +793,7 @@ index 664c527..f0d50ee 100644 + if (!showsystray) + return; + if (systrayonleft) -+ x -= sw; ++ x -= sw + lrpad / 2; + if (!systray) { + /* init systray */ + if (!(systray = (Systray *)calloc(1, sizeof(Systray)))) @@ -709,7 +846,7 @@ index 664c527..f0d50ee 100644 } void -@@ -2060,6 +2388,16 @@ wintoclient(Window w) +@@ -2063,6 +2505,16 @@ wintoclient(Window w) return NULL; } @@ -726,7 +863,7 @@ index 664c527..f0d50ee 100644 Monitor * wintomon(Window w) { -@@ -2113,6 +2451,22 @@ xerrorstart(Display *dpy, XErrorEvent *ee) +@@ -2116,6 +2568,22 @@ xerrorstart(Display *dpy, XErrorEvent *ee) return -1; } @@ -749,6 +886,3 @@ index 664c527..f0d50ee 100644 void zoom(const Arg *arg) { --- -2.30.1 - diff --git a/_suckless/dwm/patches/03-dwm-restartsig-20180523-6.2.diff b/_suckless/dwm/patches/01-dwm-restartsig-20180523-6.2.diff similarity index 100% rename from _suckless/dwm/patches/03-dwm-restartsig-20180523-6.2.diff rename to _suckless/dwm/patches/01-dwm-restartsig-20180523-6.2.diff diff --git a/_suckless/dwm/patches/01-dwm-status2d-20200508-60bb3df.diff b/_suckless/dwm/patches/01-dwm-status2d-20200508-60bb3df.diff deleted file mode 100644 index 6f353fd..0000000 --- a/_suckless/dwm/patches/01-dwm-status2d-20200508-60bb3df.diff +++ /dev/null @@ -1,180 +0,0 @@ -From 60bb3dfaf91227eb02e828d74e6f4758b2c56542 Mon Sep 17 00:00:00 2001 -From: cultab -Date: Fri, 8 May 2020 13:56:08 +0300 -Subject: [PATCH] fix status2d to work after ed3ab6 - -ed3ab6 changed the name of the variable sw to tw, now the patch won't apply nor work. -This patch updates the variable name to the new one. ---- - dwm.c | 120 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--- - 1 file changed, 114 insertions(+), 6 deletions(-) - -diff --git a/dwm.c b/dwm.c -index 9fd0286..71e18be 100644 ---- a/dwm.c -+++ b/dwm.c -@@ -163,6 +163,7 @@ static void detachstack(Client *c); - static Monitor *dirtomon(int dir); - static void drawbar(Monitor *m); - static void drawbars(void); -+static int drawstatusbar(Monitor *m, int bh, char* text); - static void enternotify(XEvent *e); - static void expose(XEvent *e); - static void focus(Client *c); -@@ -237,7 +238,7 @@ static void zoom(const Arg *arg); - - /* variables */ - static const char broken[] = "broken"; --static char stext[256]; -+static char stext[1024]; - static int screen; - static int sw, sh; /* X display screen geometry width, height */ - static int bh, blw = 0; /* bar geometry */ -@@ -485,7 +486,7 @@ cleanup(void) - cleanupmon(mons); - for (i = 0; i < CurLast; i++) - drw_cur_free(drw, cursor[i]); -- for (i = 0; i < LENGTH(colors); i++) -+ for (i = 0; i < LENGTH(colors) + 1; i++) - free(scheme[i]); - XDestroyWindow(dpy, wmcheckwin); - drw_free(drw); -@@ -693,6 +694,114 @@ dirtomon(int dir) - return m; - } - -+int -+drawstatusbar(Monitor *m, int bh, char* stext) { -+ int ret, i, w, x, len; -+ short isCode = 0; -+ char *text; -+ char *p; -+ -+ len = strlen(stext) + 1 ; -+ if (!(text = (char*) malloc(sizeof(char)*len))) -+ die("malloc"); -+ p = text; -+ memcpy(text, stext, len); -+ -+ /* compute width of the status text */ -+ w = 0; -+ i = -1; -+ while (text[++i]) { -+ if (text[i] == '^') { -+ if (!isCode) { -+ isCode = 1; -+ text[i] = '\0'; -+ w += TEXTW(text) - lrpad; -+ text[i] = '^'; -+ if (text[++i] == 'f') -+ w += atoi(text + ++i); -+ } else { -+ isCode = 0; -+ text = text + i + 1; -+ i = -1; -+ } -+ } -+ } -+ if (!isCode) -+ w += TEXTW(text) - lrpad; -+ else -+ isCode = 0; -+ text = p; -+ -+ w += 2; /* 1px padding on both sides */ -+ ret = x = m->ww - w; -+ -+ drw_setscheme(drw, scheme[LENGTH(colors)]); -+ drw->scheme[ColFg] = scheme[SchemeNorm][ColFg]; -+ drw->scheme[ColBg] = scheme[SchemeNorm][ColBg]; -+ drw_rect(drw, x, 0, w, bh, 1, 1); -+ x++; -+ -+ /* process status text */ -+ i = -1; -+ while (text[++i]) { -+ if (text[i] == '^' && !isCode) { -+ isCode = 1; -+ -+ text[i] = '\0'; -+ w = TEXTW(text) - lrpad; -+ drw_text(drw, x, 0, w, bh, 0, text, 0); -+ -+ x += w; -+ -+ /* process code */ -+ while (text[++i] != '^') { -+ if (text[i] == 'c') { -+ char buf[8]; -+ memcpy(buf, (char*)text+i+1, 7); -+ buf[7] = '\0'; -+ drw_clr_create(drw, &drw->scheme[ColFg], buf); -+ i += 7; -+ } else if (text[i] == 'b') { -+ char buf[8]; -+ memcpy(buf, (char*)text+i+1, 7); -+ buf[7] = '\0'; -+ drw_clr_create(drw, &drw->scheme[ColBg], buf); -+ i += 7; -+ } else if (text[i] == 'd') { -+ drw->scheme[ColFg] = scheme[SchemeNorm][ColFg]; -+ drw->scheme[ColBg] = scheme[SchemeNorm][ColBg]; -+ } else if (text[i] == 'r') { -+ int rx = atoi(text + ++i); -+ while (text[++i] != ','); -+ int ry = atoi(text + ++i); -+ while (text[++i] != ','); -+ int rw = atoi(text + ++i); -+ while (text[++i] != ','); -+ int rh = atoi(text + ++i); -+ -+ drw_rect(drw, rx + x, ry, rw, rh, 1, 0); -+ } else if (text[i] == 'f') { -+ x += atoi(text + ++i); -+ } -+ } -+ -+ text = text + i + 1; -+ i=-1; -+ isCode = 0; -+ } -+ } -+ -+ if (!isCode) { -+ w = TEXTW(text) - lrpad; -+ drw_text(drw, x, 0, w, bh, 0, text, 0); -+ } -+ -+ drw_setscheme(drw, scheme[SchemeNorm]); -+ free(p); -+ -+ return ret; -+} -+ - void - drawbar(Monitor *m) - { -@@ -704,9 +813,7 @@ drawbar(Monitor *m) - - /* draw status first so it can be overdrawn by tags later */ - if (m == selmon) { /* status is only drawn on selected monitor */ -- drw_setscheme(drw, scheme[SchemeNorm]); -- tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */ -- drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0); -+ tw = m->ww - drawstatusbar(m, bh, stext); - } - - for (c = m->clients; c; c = c->next) { -@@ -1568,7 +1675,8 @@ setup(void) - cursor[CurResize] = drw_cur_create(drw, XC_sizing); - cursor[CurMove] = drw_cur_create(drw, XC_fleur); - /* init appearance */ -- scheme = ecalloc(LENGTH(colors), sizeof(Clr *)); -+ scheme = ecalloc(LENGTH(colors) + 1, sizeof(Clr *)); -+ scheme[LENGTH(colors)] = drw_scm_create(drw, colors[0], 3); - for (i = 0; i < LENGTH(colors); i++) - scheme[i] = drw_scm_create(drw, colors[i], 3); - /* init bars */ --- -2.26.2 - diff --git a/_suckless/dwm/patches/04-dwm-swallow-20201211-61bb8b2.diff b/_suckless/dwm/patches/02-dwm-swallow-20201211-61bb8b2.diff similarity index 100% rename from _suckless/dwm/patches/04-dwm-swallow-20201211-61bb8b2.diff rename to _suckless/dwm/patches/02-dwm-swallow-20201211-61bb8b2.diff diff --git a/_suckless/dwm/patches/02-reddit-fix b/_suckless/dwm/patches/02-reddit-fix deleted file mode 100644 index 087c723..0000000 --- a/_suckless/dwm/patches/02-reddit-fix +++ /dev/null @@ -1,10 +0,0 @@ -/* draw status first so it can be overdrawn by tags later */ -if (m == selmon) { /* status is only drawn on selected monitor */ - sw = m->ww - drawstatusbar(m, bh, stext); - } -And in drawstatusbar(): - -w += 2; /* 1px padding on both sides */ -ret = m->ww - w; -x = m->ww - w - getsystraywidth(); -drw_setscheme(drw, scheme[LENGTH(colors)]); diff --git a/_suckless/dwm/patches/05-dwm-functionalgaps-6.2.diff b/_suckless/dwm/patches/03-dwm-functionalgaps-6.2.diff similarity index 100% rename from _suckless/dwm/patches/05-dwm-functionalgaps-6.2.diff rename to _suckless/dwm/patches/03-dwm-functionalgaps-6.2.diff diff --git a/_suckless/dwm/patches/06-dwm-scratchpads-20200414-728d397b.diff b/_suckless/dwm/patches/04-dwm-scratchpads-20200414-728d397b.diff similarity index 100% rename from _suckless/dwm/patches/06-dwm-scratchpads-20200414-728d397b.diff rename to _suckless/dwm/patches/04-dwm-scratchpads-20200414-728d397b.diff diff --git a/_suckless/dwm/patches/07-dwm-attachbelow-6.2.diff b/_suckless/dwm/patches/05-dwm-attachbelow-6.2.diff similarity index 100% rename from _suckless/dwm/patches/07-dwm-attachbelow-6.2.diff rename to _suckless/dwm/patches/05-dwm-attachbelow-6.2.diff diff --git a/_suckless/dwm/patches/08-dwm-notitle-6.2.diff b/_suckless/dwm/patches/06-dwm-notitle-6.2.diff similarity index 100% rename from _suckless/dwm/patches/08-dwm-notitle-6.2.diff rename to _suckless/dwm/patches/06-dwm-notitle-6.2.diff diff --git a/_suckless/dwm/patches/07-dwm-alttagsdecoration-2020010304-cb3f58a.diff b/_suckless/dwm/patches/07-dwm-alttagsdecoration-2020010304-cb3f58a.diff new file mode 100644 index 0000000..fcbc1ef --- /dev/null +++ b/_suckless/dwm/patches/07-dwm-alttagsdecoration-2020010304-cb3f58a.diff @@ -0,0 +1,67 @@ +diff --git a/config.def.h b/config.def.h +index 1c0b587..d4b11fc 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -20,6 +20,7 @@ static const char *colors[][3] = { + + /* tagging */ + static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; ++static const char *alttags[] = { "<01>", "<02>", "<03>", "<04>", "<05>" }; + + static const Rule rules[] = { + /* xprop(1): +diff --git a/dwm.c b/dwm.c +index 4465af1..a394159 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -416,7 +416,7 @@ attachstack(Client *c) + void + buttonpress(XEvent *e) + { +- unsigned int i, x, click; ++ unsigned int i, x, click, occ; + Arg arg = {0}; + Client *c; + Monitor *m; +@@ -430,9 +430,13 @@ buttonpress(XEvent *e) + focus(NULL); + } + if (ev->window == selmon->barwin) { +- i = x = 0; ++ i = x = occ = 0; ++ /* Bitmask of occupied tags */ ++ for (c = m->clients; c; c = c->next) ++ occ |= c->tags; ++ + do +- x += TEXTW(tags[i]); ++ x += TEXTW(occ & 1 << i ? alttags[i] : tags[i]); + while (ev->x >= x && ++i < LENGTH(tags)); + if (i < LENGTH(tags)) { + click = ClkTagBar; +@@ -699,6 +703,7 @@ drawbar(Monitor *m) + int boxs = drw->fonts->h / 9; + int boxw = drw->fonts->h / 6 + 2; + unsigned int i, occ = 0, urg = 0; ++ const char *tagtext; + Client *c; + + /* draw status first so it can be overdrawn by tags later */ +@@ -715,13 +720,10 @@ drawbar(Monitor *m) + } + x = 0; + for (i = 0; i < LENGTH(tags); i++) { +- w = TEXTW(tags[i]); +- drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); +- drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i); +- if (occ & 1 << i) +- drw_rect(drw, x + boxs, boxs, boxw, boxw, +- m == selmon && selmon->sel && selmon->sel->tags & 1 << i, +- urg & 1 << i); ++ tagtext = occ & 1 << i ? alttags[i] : tags[i]; ++ w = TEXTW(tagtext); ++ drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); ++ drw_text(drw, x, 0, w, bh, lrpad / 2, tagtext, urg & 1 << i); + x += w; + } + w = blw = TEXTW(m->ltsymbol); diff --git a/_suckless/dwm/patches/09-dwm-hide_vacant_tags-6.2.diff b/_suckless/dwm/patches/09-dwm-hide_vacant_tags-6.2.diff deleted file mode 100644 index a981b23..0000000 --- a/_suckless/dwm/patches/09-dwm-hide_vacant_tags-6.2.diff +++ /dev/null @@ -1,55 +0,0 @@ -diff --git a/dwm.c b/dwm.c -index 4465af1..c4aa3de 100644 ---- a/dwm.c -+++ b/dwm.c -@@ -416,7 +416,7 @@ attachstack(Client *c) - void - buttonpress(XEvent *e) - { -- unsigned int i, x, click; -+ unsigned int i, x, click, occ = 0; - Arg arg = {0}; - Client *c; - Monitor *m; -@@ -431,9 +431,14 @@ buttonpress(XEvent *e) - } - if (ev->window == selmon->barwin) { - i = x = 0; -- do -+ for (c = m->clients; c; c = c->next) -+ occ |= c->tags == 255 ? 0 : c->tags; -+ do { -+ /* do not reserve space for vacant tags */ -+ if (!(occ & 1 << i || m->tagset[m->seltags] & 1 << i)) -+ continue; - x += TEXTW(tags[i]); -- while (ev->x >= x && ++i < LENGTH(tags)); -+ } while (ev->x >= x && ++i < LENGTH(tags)); - if (i < LENGTH(tags)) { - click = ClkTagBar; - arg.ui = 1 << i; -@@ -709,19 +714,19 @@ drawbar(Monitor *m) - } - - for (c = m->clients; c; c = c->next) { -- occ |= c->tags; -+ occ |= c->tags == 255 ? 0 : c->tags; - if (c->isurgent) - urg |= c->tags; - } - x = 0; - for (i = 0; i < LENGTH(tags); i++) { -+ /* do not draw vacant tags */ -+ if (!(occ & 1 << i || m->tagset[m->seltags] & 1 << i)) -+ continue; -+ - w = TEXTW(tags[i]); - drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); - drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i); -- if (occ & 1 << i) -- drw_rect(drw, x + boxs, boxs, boxw, boxw, -- m == selmon && selmon->sel && selmon->sel->tags & 1 << i, -- urg & 1 << i); - x += w; - } - w = blw = TEXTW(m->ltsymbol); diff --git a/_suckless/dwm/patches/10-dwm-bar-height-6.2.diff b/_suckless/dwm/patches/10-dwm-bar-height-6.2.diff deleted file mode 100644 index a576111..0000000 --- a/_suckless/dwm/patches/10-dwm-bar-height-6.2.diff +++ /dev/null @@ -1,25 +0,0 @@ -diff --git a/config.def.h b/config.def.h -index 1c0b587..9814500 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -5,6 +5,7 @@ static const unsigned int borderpx = 1; /* border pixel of windows */ - static const unsigned int snap = 32; /* snap pixel */ - static const int showbar = 1; /* 0 means no bar */ - static const int topbar = 1; /* 0 means bottom bar */ -+static const int user_bh = 0; /* 0 means that dwm will calculate bar height, >= 1 means dwm will user_bh as bar height */ - static const char *fonts[] = { "monospace:size=10" }; - static const char dmenufont[] = "monospace:size=10"; - static const char col_gray1[] = "#222222"; -diff --git a/dwm.c b/dwm.c -index 4465af1..2c27cb3 100644 ---- a/dwm.c -+++ b/dwm.c -@@ -1545,7 +1545,7 @@ setup(void) - if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) - die("no fonts could be loaded."); - lrpad = drw->fonts->h; -- bh = drw->fonts->h + 2; -+ bh = user_bh ? user_bh : drw->fonts->h + 2; - updategeom(); - /* init atoms */ - utf8string = XInternAtom(dpy, "UTF8_STRING", False);