sites

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

commit 28b5ab1e925fed72f6d31e4a16921f5a7cd69216
parent 6ff183aafe203a4d60fa4fcbdee0ea02be5fe609
Author: xac <jiangfengxi.c@gmail.com>
Date:   Wed, 28 Sep 2022 11:50:37 +0800

[dwm][awesombar]diff bug fixup

Diffstat:
Ddwm.suckless.org/patches/awesomebar/dwm-awesomebar-20220829-6.3.diff | 446-------------------------------------------------------------------------------
Mdwm.suckless.org/patches/awesomebar/index.md | 2+-
2 files changed, 1 insertion(+), 447 deletions(-)

diff --git a/dwm.suckless.org/patches/awesomebar/dwm-awesomebar-20220829-6.3.diff b/dwm.suckless.org/patches/awesomebar/dwm-awesomebar-20220829-6.3.diff @@ -1,446 +0,0 @@ -diff --git a/config.def.h b/config.def.h -index a2ac963..6dad2f1 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -16,6 +16,7 @@ static const char *colors[][3] = { - /* fg bg border */ - [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, - [SchemeSel] = { col_gray4, col_cyan, col_cyan }, -+ [SchemeHid] = { col_cyan, col_gray1, col_cyan }, - }; - - /* tagging */ -@@ -65,8 +66,10 @@ static Key keys[] = { - { MODKEY, XK_p, spawn, {.v = dmenucmd } }, - { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, - { MODKEY, XK_b, togglebar, {0} }, -- { MODKEY, XK_j, focusstack, {.i = +1 } }, -- { MODKEY, XK_k, focusstack, {.i = -1 } }, -+ { MODKEY, XK_j, focusstackvis, {.i = +1 } }, -+ { MODKEY, XK_k, focusstackvis, {.i = -1 } }, -+ { MODKEY|ShiftMask, XK_j, focusstackhid, {.i = +1 } }, -+ { MODKEY|ShiftMask, XK_k, focusstackhid, {.i = -1 } }, - { MODKEY, XK_i, incnmaster, {.i = +1 } }, - { MODKEY, XK_d, incnmaster, {.i = -1 } }, - { MODKEY, XK_h, setmfact, {.f = -0.05} }, -@@ -85,6 +88,9 @@ 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_s, show, {0} }, -+ { MODKEY|ShiftMask, XK_s, showall, {0} }, -+ { MODKEY, XK_h, hide, {0} }, - TAGKEYS( XK_1, 0) - TAGKEYS( XK_2, 1) - TAGKEYS( XK_3, 2) -@@ -103,6 +109,7 @@ static Button buttons[] = { - /* click event mask button function argument */ - { ClkLtSymbol, 0, Button1, setlayout, {0} }, - { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, -+ { ClkWinTitle, 0, Button1, togglewin, {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 a96f33c..c375ba3 100644 ---- a/dwm.c -+++ b/dwm.c -@@ -50,6 +50,7 @@ - #define INTERSECT(x,y,w,h,m) (MAX(0, MIN((x)+(w),(m)->wx+(m)->ww) - MAX((x),(m)->wx)) \ - * MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy))) - #define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags])) -+#define HIDDEN(C) ((getstate(C->win) == IconicState)) - #define LENGTH(X) (sizeof X / sizeof X[0]) - #define MOUSEMASK (BUTTONMASK|PointerMotionMask) - #define WIDTH(X) ((X)->w + 2 * (X)->bw) -@@ -59,7 +60,7 @@ - - /* enums */ - enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ --enum { SchemeNorm, SchemeSel }; /* color schemes */ -+enum { SchemeNorm, SchemeSel, SchemeHid }; /* color schemes */ - enum { NetSupported, NetWMName, NetWMState, NetWMCheck, - NetWMFullscreen, NetActiveWindow, NetWMWindowType, - NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ -@@ -117,6 +118,8 @@ struct Monitor { - int nmaster; - int num; - int by; /* bar geometry */ -+ int btw; /* width of tasks portion of bar */ -+ int bt; /* number of tasks */ - int mx, my, mw, mh; /* screen size */ - int wx, wy, ww, wh; /* window area */ - unsigned int seltags; -@@ -124,6 +127,7 @@ struct Monitor { - unsigned int tagset[2]; - int showbar; - int topbar; -+ int hidsel; - Client *clients; - Client *sel; - Client *stack; -@@ -168,13 +172,17 @@ static void expose(XEvent *e); - static void focus(Client *c); - static void focusin(XEvent *e); - static void focusmon(const Arg *arg); --static void focusstack(const Arg *arg); -+static void focusstackvis(const Arg *arg); -+static void focusstackhid(const Arg *arg); -+static void focusstack(int inc, int vis); - static Atom getatomprop(Client *c, Atom prop); - static int getrootptr(int *x, int *y); - static long getstate(Window w); - static int gettextprop(Window w, Atom atom, char *text, unsigned int size); - static void grabbuttons(Client *c, int focused); - static void grabkeys(void); -+static void hide(const Arg *arg); -+static void hidewin(Client *c); - static void incnmaster(const Arg *arg); - static void keypress(XEvent *e); - static void killclient(const Arg *arg); -@@ -204,6 +212,9 @@ static void setlayout(const Arg *arg); - static void setmfact(const Arg *arg); - static void setup(void); - static void seturgent(Client *c, int urg); -+static void show(const Arg *arg); -+static void showall(const Arg *arg); -+static void showwin(Client *c); - static void showhide(Client *c); - static void sigchld(int unused); - static void spawn(const Arg *arg); -@@ -214,6 +225,7 @@ static void togglebar(const Arg *arg); - static void togglefloating(const Arg *arg); - static void toggletag(const Arg *arg); - static void toggleview(const Arg *arg); -+static void togglewin(const Arg *arg); - static void unfocus(Client *c, int setfocus); - static void unmanage(Client *c, int destroyed); - static void unmapnotify(XEvent *e); -@@ -440,10 +452,25 @@ buttonpress(XEvent *e) - arg.ui = 1 << i; - } else if (ev->x < x + blw) - click = ClkLtSymbol; -- else if (ev->x > selmon->ww - (int)TEXTW(stext)) -+ /* 2px right padding */ -+ else if (ev->x > selmon->ww - TEXTW(stext) + lrpad - 2) - click = ClkStatusText; -- else -- click = ClkWinTitle; -+ else { -+ x += blw; -+ c = m->clients; -+ -+ if (c) { -+ do { -+ if (!ISVISIBLE(c)) -+ continue; -+ else -+ x +=(1.0 / (double)m->bt) * m->btw; -+ } while (ev->x > x && (c = c->next)); -+ -+ click = ClkWinTitle; -+ arg.v = c; -+ } -+ } - } else if ((c = wintoclient(ev->window))) { - focus(c); - restack(selmon); -@@ -453,7 +480,7 @@ buttonpress(XEvent *e) - for (i = 0; i < LENGTH(buttons); i++) - if (click == buttons[i].click && buttons[i].func && buttons[i].button == ev->button - && CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state)) -- buttons[i].func(click == ClkTagBar && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg); -+ buttons[i].func((click == ClkTagBar || click == ClkWinTitle) && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg); - } - - void -@@ -696,7 +723,7 @@ dirtomon(int dir) - void - drawbar(Monitor *m) - { -- int x, w, tw = 0; -+ int x, w, tw = 0, n = 0, scm; - int boxs = drw->fonts->h / 9; - int boxw = drw->fonts->h / 6 + 2; - unsigned int i, occ = 0, urg = 0; -@@ -713,6 +740,8 @@ drawbar(Monitor *m) - } - - for (c = m->clients; c; c = c->next) { -+ if (ISVISIBLE(c)) -+ n++; - occ |= c->tags; - if (c->isurgent) - urg |= c->tags; -@@ -733,16 +762,36 @@ drawbar(Monitor *m) - x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); - - if ((w = m->ww - tw - x) > bh) { -- if (m->sel) { -- drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); -- drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); -- if (m->sel->isfloating) -- drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0); -+ if (n > 0) { -+ int remainder = w % n; -+ int tabw = (1.0 / (double)n) * w + 1; -+ for (c = m->clients; c; c = c->next) { -+ if (!ISVISIBLE(c)) -+ continue; -+ if (m->sel == c) -+ scm = SchemeHid; -+ else if (HIDDEN(c)) -+ scm = SchemeHid; -+ else -+ scm = SchemeNorm; -+ drw_setscheme(drw, scheme[scm]); -+ -+ if (remainder >= 0) { -+ if (remainder == 0) { -+ tabw--; -+ } -+ remainder--; -+ } -+ drw_text(drw, x, 0, tabw, bh, lrpad / 2, c->name, 0); -+ x += tabw; -+ } - } else { - drw_setscheme(drw, scheme[SchemeNorm]); - drw_rect(drw, x, 0, w, bh, 1, 1); - } - } -+ m->bt = n; -+ m->btw = w; - drw_map(drw, m->barwin, 0, 0, m->ww, bh); - } - -@@ -788,9 +837,17 @@ void - focus(Client *c) - { - if (!c || !ISVISIBLE(c)) -- for (c = selmon->stack; c && !ISVISIBLE(c); c = c->snext); -- if (selmon->sel && selmon->sel != c) -+ for (c = selmon->stack; c && (!ISVISIBLE(c) || HIDDEN(c)); c = c->snext); -+ if (selmon->sel && selmon->sel != c) { - unfocus(selmon->sel, 0); -+ -+ if (selmon->hidsel) { -+ hidewin(selmon->sel); -+ if (c) -+ arrange(c->mon); -+ selmon->hidsel = 0; -+ } -+ } - if (c) { - if (c->mon != selmon) - selmon = c->mon; -@@ -834,28 +891,52 @@ focusmon(const Arg *arg) - } - - void --focusstack(const Arg *arg) -+focusstackvis(const Arg *arg) { -+ focusstack(arg->i, 0); -+} -+ -+void -+focusstackhid(const Arg *arg) { -+ focusstack(arg->i, 1); -+} -+ -+void -+focusstack(int inc, int hid) - { - Client *c = NULL, *i; -- -- if (!selmon->sel || (selmon->sel->isfullscreen && lockfullscreen)) -+ // if no client selected AND exclude hidden client; if client selected but fullscreened -+ if ((!selmon->sel && !hid) || (selmon->sel && selmon->sel->isfullscreen && lockfullscreen)) - return; -- if (arg->i > 0) { -- for (c = selmon->sel->next; c && !ISVISIBLE(c); c = c->next); -+ if (!selmon->clients) -+ return; -+ if (inc > 0) { -+ if (selmon->sel) -+ for (c = selmon->sel->next; -+ c && (!ISVISIBLE(c) || (!hid && HIDDEN(c))); -+ c = c->next); - if (!c) -- for (c = selmon->clients; c && !ISVISIBLE(c); c = c->next); -+ for (c = selmon->clients; -+ c && (!ISVISIBLE(c) || (!hid && HIDDEN(c))); -+ c = c->next); - } else { -- for (i = selmon->clients; i != selmon->sel; i = i->next) -- if (ISVISIBLE(i)) -- c = i; -+ if (selmon->sel) { -+ for (i = selmon->clients; i != selmon->sel; i = i->next) -+ if (ISVISIBLE(i) && !(!hid && HIDDEN(i))) -+ c = i; -+ } else -+ c = selmon->clients; - if (!c) - for (; i; i = i->next) -- if (ISVISIBLE(i)) -+ if (ISVISIBLE(i) && !(!hid && HIDDEN(i))) - c = i; - } - if (c) { - focus(c); - restack(selmon); -+ if (HIDDEN(c)) { -+ showwin(c); -+ c->mon->hidsel = 1; -+ } - } - } - -@@ -967,6 +1048,36 @@ grabkeys(void) - } - } - -+void -+hide(const Arg *arg) -+{ -+ hidewin(selmon->sel); -+ focus(NULL); -+ arrange(selmon); -+} -+ -+void -+hidewin(Client *c) { -+ if (!c || HIDDEN(c)) -+ return; -+ -+ Window w = c->win; -+ static XWindowAttributes ra, ca; -+ -+ // more or less taken directly from blackbox's hide() function -+ XGrabServer(dpy); -+ XGetWindowAttributes(dpy, root, &ra); -+ XGetWindowAttributes(dpy, w, &ca); -+ // prevent UnmapNotify events -+ XSelectInput(dpy, root, ra.your_event_mask & ~SubstructureNotifyMask); -+ XSelectInput(dpy, w, ca.your_event_mask & ~StructureNotifyMask); -+ XUnmapWindow(dpy, w); -+ setclientstate(c, IconicState); -+ XSelectInput(dpy, root, ra.your_event_mask); -+ XSelectInput(dpy, w, ca.your_event_mask); -+ XUngrabServer(dpy); -+} -+ - void - incnmaster(const Arg *arg) - { -@@ -1071,12 +1182,14 @@ manage(Window w, XWindowAttributes *wa) - XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend, - (unsigned char *) &(c->win), 1); - XMoveResizeWindow(dpy, c->win, c->x + 2 * sw, c->y, c->w, c->h); /* some windows require this */ -- setclientstate(c, NormalState); -+ if (!HIDDEN(c)) -+ setclientstate(c, NormalState); - if (c->mon == selmon) - unfocus(selmon->sel, 0); - c->mon->sel = c; - arrange(c->mon); -- XMapWindow(dpy, c->win); -+ if (!HIDDEN(c)) -+ XMapWindow(dpy, c->win); - focus(NULL); - } - -@@ -1199,7 +1312,7 @@ movemouse(const Arg *arg) - Client * - nexttiled(Client *c) - { -- for (; c && (c->isfloating || !ISVISIBLE(c)); c = c->next); -+ for (; c && (c->isfloating || !ISVISIBLE(c) || HIDDEN(c)); c = c->next); - return c; - } - -@@ -1252,6 +1365,16 @@ propertynotify(XEvent *e) - void - quit(const Arg *arg) - { -+ // fix: reloading dwm keeps all the hidden clients hidden -+ Monitor *m; -+ Client *c; -+ for (m = mons; m; m = m->next) { -+ if (m) { -+ for (c = m->stack; c; c = c->next) -+ if (c && HIDDEN(c)) showwin(c); -+ } -+ } -+ - running = 0; - } - -@@ -1614,6 +1737,42 @@ seturgent(Client *c, int urg) - XFree(wmh); - } - -+void -+show(const Arg *arg) -+{ -+ if (selmon->hidsel) -+ selmon->hidsel = 0; -+ showwin(selmon->sel); -+} -+ -+void -+showall(const Arg *arg) -+{ -+ Client *c = NULL; -+ selmon->hidsel = 0; -+ for (c = selmon->clients; c; c = c->next) { -+ if (ISVISIBLE(c)) -+ showwin(c); -+ } -+ if (!selmon->sel) { -+ for (c = selmon->clients; c && !ISVISIBLE(c); c = c->next); -+ if (c) -+ focus(c); -+ } -+ restack(selmon); -+} -+ -+void -+showwin(Client *c) -+{ -+ if (!c || !HIDDEN(c)) -+ return; -+ -+ XMapWindow(dpy, c->win); -+ setclientstate(c, NormalState); -+ arrange(c->mon); -+} -+ - void - showhide(Client *c) - { -@@ -1752,6 +1911,23 @@ toggleview(const Arg *arg) - } - } - -+void -+togglewin(const Arg *arg) -+{ -+ Client *c = (Client*)arg->v; -+ -+ if (c == selmon->sel) { -+ hidewin(c); -+ focus(NULL); -+ arrange(c->mon); -+ } else { -+ if (HIDDEN(c)) -+ showwin(c); -+ focus(c); -+ restack(selmon); -+ } -+} -+ - void - unfocus(Client *c, int setfocus) - { diff --git a/dwm.suckless.org/patches/awesomebar/index.md b/dwm.suckless.org/patches/awesomebar/index.md @@ -41,7 +41,7 @@ Changelog Download -------- Updated version from Xac: -* [dwm-awesomebar-20220829-6.3.diff](dwm-awesomebar-20220829-6.3.diff) (2022-08-29) +* [dwm-awesomebar-20220925-6.3.diff](dwm-awesomebar-20220925-6.3.diff) (2022-09-25) 2020-09-07 version: * [dwm-awesomebar-20200907-6.2.diff](dwm-awesomebar-20200907-6.2.diff) (2020-09-07)