commit 00af56627f4d48ae2bfef9e2976878cea404adda parent 11bf45793294a7bc62555cb9a10f82287873378b Author: Hiltjo Posthuma <hiltjo@codemadness.org> Date: Thu, 7 Feb 2019 20:44:33 +0100 fix some patches and revisions in filenames - some patches were duplicate with wrong revision (remove them). - fix some filenames to include the proper revisions. fixes about 20 patches. Diffstat:
44 files changed, 333 insertions(+), 1625 deletions(-)
diff --git a/dwm.suckless.org/patches/centeredwindowname/dwm-centeredwindowname-20180909-bd6efd8.diff b/dwm.suckless.org/patches/centeredwindowname/dwm-centeredwindowname-20180909-6.2.diff diff --git a/dwm.suckless.org/patches/centeredwindowname/index.md b/dwm.suckless.org/patches/centeredwindowname/index.md @@ -8,10 +8,9 @@ Description A little patch to center the WM\_NAME of the currently selected window on the status bar. - Download -------- -* [dwm-centeredwindowname-20180909-bd6efd8.diff](dwm-centeredwindowname-20180909-bd6efd8.diff) +* [dwm-centeredwindowname-20180909-6.2.diff](dwm-centeredwindowname-20180909-6.2.diff) Authors ------- diff --git a/dwm.suckless.org/patches/cyclelayouts/dwm-cyclelayouts-20180524-a09e766.diff b/dwm.suckless.org/patches/cyclelayouts/dwm-cyclelayouts-20180524-6.2.diff diff --git a/dwm.suckless.org/patches/cyclelayouts/index.md b/dwm.suckless.org/patches/cyclelayouts/index.md @@ -16,7 +16,7 @@ Hopefully whoever wanted this sees it and no longer has to duplicate functions. Download -------- -* [dwm-cyclelayouts-20180524-a09e766.diff](dwm-cyclelayouts-20180524-a09e766.diff) (24.05.2018) +* [dwm-cyclelayouts-20180524-6.2.diff](dwm-cyclelayouts-20180524-6.2.diff) (2018-05-24) Author ------ diff --git a/dwm.suckless.org/patches/focusonclick/dwm-focusonclick-bb3bd6f.diff b/dwm.suckless.org/patches/focusonclick/dwm-focusonclick-20170104-bb3bd6f.diff diff --git a/dwm.suckless.org/patches/focusonclick/dwm-focusonclick-git-20100321.diff b/dwm.suckless.org/patches/focusonclick/dwm-focusonclick-5.8.diff diff --git a/dwm.suckless.org/patches/focusonclick/index.md b/dwm.suckless.org/patches/focusonclick/index.md @@ -8,9 +8,9 @@ Description Download -------- * [dwm-focusonclick-20171030-6aa8e37.diff](dwm-focusonclick-20171030-6aa8e37.diff) (2017-10-17) -* [dwm-focusonclick-bb3bd6f.diff](dwm-focusonclick-bb3bd6f.diff) (2017-01-04) +* [dwm-focusonclick-20170104-bb3bd6f.diff](dwm-focusonclick-20170104-bb3bd6f.diff) (2017-01-04) * [dwm-focusonclick-6.0.diff](dwm-focusonclick-6.0.diff) (2012-11-24) -* [dwm-focusonclick-git-20100321.diff](dwm-focusonclick-git-20100321.diff) +* [dwm-focusonclick-5.8.diff](dwm-focusonclick-5.8.diff) (2010-03-21) Author ------ diff --git a/dwm.suckless.org/patches/moveresize/dwm-10e232f9ace7-moveresize.diff b/dwm.suckless.org/patches/moveresize/dwm-10e232f9ace7-moveresize.diff @@ -1,73 +0,0 @@ -Author: Jan Christoph Ebersbach <jceb@e-jc.de> -URL: http://dwm.suckless.org/patches/historical/moveresize -These patches provide helper functions for moving and resizing floating windows -using keybindings. - -diff -r 10e232f9ace7 moveresize.c ---- /dev/null Thu Jan 01 00:00:00 1970 +0000 -+++ b/moveresize.c Fri Apr 06 08:16:18 2012 +0200 -@@ -0,0 +1,64 @@ -+void -+moveresize(const Arg *arg) { -+ /* only floating windows can be moved */ -+ Client *c; -+ c = selmon->sel; -+ int x, y, w, h, nx, ny, nw, nh, ox, oy, ow, oh; -+ char xAbs, yAbs, wAbs, hAbs; -+ int msx, msy, dx, dy, nmx, nmy; -+ unsigned int dui; -+ Window dummy; -+ -+ if (!c || !arg) -+ return; -+ if (selmon->lt[selmon->sellt]->arrange && !c->isfloating) -+ return; -+ if(sscanf((char *)arg->v, "%d%c %d%c %d%c %d%c", &x, &xAbs, &y, &yAbs, &w, &wAbs, &h, &hAbs) != 8) -+ return; -+ /* compute new window position; prevent window from be positioned outside the current monitor */ -+ nw = c->w + w; -+ if(wAbs == 'W') -+ nw = w < selmon->mw - 2 * c->bw ? w : selmon->mw - 2 * c->bw; -+ -+ nh = c->h + h; -+ if(hAbs == 'H') -+ nh = h < selmon->mh - 2 * c->bw ? h : selmon->mh - 2 * c->bw; -+ -+ nx = c->x + x; -+ if(xAbs == 'X') { -+ if(x < selmon->mx) -+ nx = selmon->mx; -+ else if(x > selmon->mx + selmon->mw) -+ nx = selmon->mx + selmon->mw - nw - 2 * c->bw; -+ else -+ nx = x; -+ } -+ -+ ny = c->y + y; -+ if(yAbs == 'Y') { -+ if(y < selmon->my) -+ ny = selmon->my; -+ else if(y > selmon->my + selmon->mh) -+ ny = selmon->my + selmon->mh - nh - 2 * c->bw; -+ else -+ ny = y; -+ } -+ -+ ox = c->x; -+ oy = c->y; -+ ow = c->w; -+ oh = c->h; -+ -+ XRaiseWindow(dpy, c->win); -+ Bool xqp = XQueryPointer(dpy, root, &dummy, &dummy, &msx, &msy, &dx, &dy, &dui); -+ resize(c, nx, ny, nw, nh, True); -+ -+ /* move cursor along with the window to avoid problems caused by the sloppy focus */ -+ if (xqp && ox <= msx && (ox + ow) >= msx && oy <= msy && (oy + oh) >= msy) -+ { -+ nmx = c->x - ox + c->w - ow; -+ nmy = c->y - oy + c->h - oh; -+ XWarpPointer(dpy, None, None, 0, 0, 0, 0, nmx, nmy); -+ } -+} -+ diff --git a/dwm.suckless.org/patches/moveresize/index.md b/dwm.suckless.org/patches/moveresize/index.md @@ -64,7 +64,6 @@ Download -------- * [dwm-moveresize-20160731-56a31dc.diff](dwm-moveresize-20160731-56a31dc.diff) * [dwm-moveresize-6.1.diff](dwm-moveresize-6.1.diff) (2095b) (20140209) -* [dwm-10e232f9ace7-moveresize.diff](dwm-10e232f9ace7-moveresize.diff) (2025b) (20120406) * [dwm-moveresize-6.0.diff](dwm-moveresize-6.0.diff) (2025b) (20120406) Authors diff --git a/dwm.suckless.org/patches/onlyquitonempty/dwm-onlyquitonempty-20180428-ba1a2cb.diff b/dwm.suckless.org/patches/onlyquitonempty/dwm-onlyquitonempty-20180428-6.2.diff diff --git a/dwm.suckless.org/patches/onlyquitonempty/index.md b/dwm.suckless.org/patches/onlyquitonempty/index.md @@ -12,7 +12,7 @@ count considered to be 'empty' via `EMPTY_WINDOW_COUNT`. Download -------- -* [dwm-onlyquitonempty-20180428-ba1a2cb.diff](dwm-onlyquitonempty-20180428-ba1a2cb.diff) +* [dwm-onlyquitonempty-20180428-6.2.diff](dwm-onlyquitonempty-20180428-6.2.diff) Author ------ diff --git a/dwm.suckless.org/patches/restartsig/dwm-restartsig-20180523-2991f37.diff b/dwm.suckless.org/patches/restartsig/dwm-restartsig-20180523-6.2.diff diff --git a/dwm.suckless.org/patches/restartsig/index.md b/dwm.suckless.org/patches/restartsig/index.md @@ -20,7 +20,7 @@ And then just quit/kill `dwm`. Download -------- -* [dwm-restartsig-20180523-2991f37.diff](dwm-restartsig-20180523-2991f37.diff) (23.05.2018) +* [dwm-restartsig-20180523-6.2.diff](dwm-restartsig-20180523-6.2.diff) (2018-05-23) Author ------ diff --git a/dwm.suckless.org/patches/save_floats/dwm-savefloats-20120406-10e232f.diff b/dwm.suckless.org/patches/save_floats/dwm-savefloats-20120406-10e232f.diff @@ -1,48 +0,0 @@ -URL: http://dwm.suckless.org/patches/historical/save_floats -This patch saves size and position of every floating window before it is forced -into tiled mode. If the window is made floating again, the old dimensions will -be restored. - -diff -r 10e232f9ace7 dwm.c ---- a/dwm.c Sun Mar 25 17:49:35 2012 +0200 -+++ b/dwm.c Fri Apr 06 08:16:21 2012 +0200 -@@ -86,6 +86,7 @@ - char name[256]; - float mina, maxa; - int x, y, w, h; -+ int sfx, sfy, sfw, sfh; /* stored float geometry, used on mode revert */ - int oldx, oldy, oldw, oldh; - int basew, baseh, incw, inch, maxw, maxh, minw, minh; - int bw, oldbw; -@@ -1153,6 +1154,10 @@ - updatewindowtype(c); - updatesizehints(c); - updatewmhints(c); -+ c->sfx = c->x; -+ c->sfy = c->y; -+ c->sfw = c->w; -+ c->sfh = c->h; - XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask); - grabbuttons(c, False); - if(!c->isfloating) -@@ -1760,10 +1765,18 @@ - return; - selmon->sel->isfloating = !selmon->sel->isfloating || selmon->sel->isfixed; - if(selmon->sel->isfloating) -- resize(selmon->sel, selmon->sel->x, selmon->sel->y, -- selmon->sel->w, selmon->sel->h, False); -+ /*restore last known float dimensions*/ -+ resize(selmon->sel, selmon->sel->sfx, selmon->sel->sfy, -+ selmon->sel->sfw, selmon->sel->sfh, False); - else if(selmon->sel->isfullscreen) - setfullscreen(selmon->sel, False); -+ else { -+ /*save last known float dimensions*/ -+ selmon->sel->sfx = selmon->sel->x; -+ selmon->sel->sfy = selmon->sel->y; -+ selmon->sel->sfw = selmon->sel->w; -+ selmon->sel->sfh = selmon->sel->h; -+ } - arrange(selmon); - } - diff --git a/dwm.suckless.org/patches/save_floats/index.md b/dwm.suckless.org/patches/save_floats/index.md @@ -11,7 +11,6 @@ Download -------- * [dwm-savefloats-20181212-b69c870.diff](dwm-savefloats-20181212-b69c870.diff) * [dwm-savefloats-20160723-56a31dc.diff](dwm-savefloats-20160723-56a31dc.diff) -* [dwm-savefloats-20120406-10e232f.diff](dwm-savefloats-20120406-10e232f.diff) * [dwm-savefloats-6.1.diff](dwm-savefloats-6.1.diff) * [dwm-savefloats-6.0.diff](dwm-savefloats-6.0.diff) diff --git a/dwm.suckless.org/patches/single_tagset/dwm-10e232f9ace7-single_tagset.diff b/dwm.suckless.org/patches/single_tagset/dwm-10e232f9ace7-single_tagset.diff @@ -1,513 +0,0 @@ -Author: Jan Christoph Ebersbach <jceb@e-jc.de> -URL: http://dwm.suckless.org/patches/single_tagset -This patch addresses the multi-monitor setup. Instead of having separate tags -for every monitor there is just one list of tags for all monitors. Instead of -moving windows from one monitor to the other, the desired tag from the -other monitor can just be selected and all windows will be drawn on the -current monitor. - -Several deep changes needed to be made: -1. Macro ISVISIBLE expects a second parameter, the monitor -2. Monitor->clients and Monitor->stack were moved to the global variable - Clientlist cl. All monitors refer to this one list. -3. A new method attachclients was added. When changing between tags this - function ensures that all clients are pointing to the right monitor. - -Please be aware that this patch probably breaks any other patch! - -diff -r 10e232f9ace7 dwm.c ---- a/dwm.c Sun Mar 25 17:49:35 2012 +0200 -+++ b/dwm.c Fri Apr 06 08:16:16 2012 +0200 -@@ -45,7 +45,7 @@ - #define CLEANMASK(mask) (mask & ~(numlockmask|LockMask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask)) - #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 ISVISIBLE(C, M) ((C->tags & M->tagset[M->seltags])) - #define LENGTH(X) (sizeof X / sizeof X[0]) - #define MAX(A, B) ((A) > (B) ? (A) : (B)) - #define MIN(A, B) ((A) < (B) ? (A) : (B)) -@@ -124,6 +124,7 @@ - void (*arrange)(Monitor *); - } Layout; - -+typedef struct Clientlist Clientlist; - struct Monitor { - char ltsymbol[16]; - float mfact; -@@ -137,9 +138,8 @@ - unsigned int tagset[2]; - Bool showbar; - Bool topbar; -- Client *clients; -+ Clientlist *cl; - Client *sel; -- Client *stack; - Monitor *next; - Window barwin; - const Layout *lt[2]; -@@ -154,12 +154,18 @@ - int monitor; - } Rule; - -+struct Clientlist { -+ Client *clients; -+ Client *stack; -+}; -+ - /* function declarations */ - static void applyrules(Client *c); - static Bool applysizehints(Client *c, int *x, int *y, int *w, int *h, Bool interact); - static void arrange(Monitor *m); - static void arrangemon(Monitor *m); - static void attach(Client *c); -+static void attachclients(Monitor *m); - static void attachstack(Client *c); - static void buttonpress(XEvent *e); - static void checkotherwm(void); -@@ -202,7 +208,7 @@ - static void monocle(Monitor *m); - static void motionnotify(XEvent *e); - static void movemouse(const Arg *arg); --static Client *nexttiled(Client *c); -+static Client *nexttiled(Client *c, Monitor *m); - static void pop(Client *); - static void propertynotify(XEvent *e); - static void quit(const Arg *arg); -@@ -284,6 +290,7 @@ - static DC dc; - static Monitor *mons = NULL, *selmon = NULL; - static Window root; -+static Clientlist *cl; - - /* configuration, allows nested code to access above variables */ - #include "config.h" -@@ -314,7 +321,7 @@ - { - c->isfloating = r->isfloating; - c->tags |= r->tags; -- for(m = mons; m && m->num != r->monitor; m = m->next); -+ for(m = mons; m && (m->tagset[m->seltags] & c->tags) == 0; m = m->next) ; - if(m) - c->mon = m; - } -@@ -395,9 +402,9 @@ - void - arrange(Monitor *m) { - if(m) -- showhide(m->stack); -+ showhide(m->cl->stack); - else for(m = mons; m; m = m->next) -- showhide(m->stack); -+ showhide(m->cl->stack); - if(m) { - arrangemon(m); - restack(m); -@@ -414,14 +421,47 @@ - - void - attach(Client *c) { -- c->next = c->mon->clients; -- c->mon->clients = c; -+ c->next = c->mon->cl->clients; -+ c->mon->cl->clients = c; -+} -+ -+void -+attachclients(Monitor *m) { -+ /* attach clients to the specified monitor */ -+ Monitor *tm; -+ Client *c; -+ unsigned int utags = 0; -+ Bool rmons = False; -+ if(!m) -+ return; -+ -+ /* collect information about the tags in use */ -+ for(tm = mons; tm; tm = tm->next) -+ if(tm != m) -+ utags |= m->tagset[m->seltags]; -+ -+ for(c = m->cl->clients; c; c = c->next) -+ if(ISVISIBLE(c, m)) { -+ /* if client is also visible on other tags that are displayed on -+ * other monitors, remove these tags */ -+ if(c->tags & utags) { -+ c->tags = c->tags & m->tagset[m->seltags]; -+ rmons = True; -+ } -+ unfocus(c, True); -+ c->mon = m; -+ } -+ -+ if(rmons) -+ for(tm = mons; tm; tm = tm->next) -+ if(tm != m) -+ arrange(tm); - } - - void - attachstack(Client *c) { -- c->snext = c->mon->stack; -- c->mon->stack = c; -+ c->snext = c->mon->cl->stack; -+ c->mon->cl->stack = c; - } - - void -@@ -484,8 +524,8 @@ - view(&a); - selmon->lt[selmon->sellt] = &foo; - for(m = mons; m; m = m->next) -- while(m->stack) -- unmanage(m->stack, False); -+ while(m->cl->stack) -+ unmanage(m->cl->stack, False); - if(dc.font.set) - XFreeFontSet(dpy, dc.font.set); - else -@@ -543,7 +583,7 @@ - || (cme->data.l[0] == 2 /* _NET_WM_STATE_TOGGLE */ && !c->isfullscreen))); - } - else if(cme->message_type == netatom[NetActiveWindow]) { -- if(!ISVISIBLE(c)) { -+ if(!ISVISIBLE(c, c->mon)) { - c->mon->seltags ^= 1; - c->mon->tagset[c->mon->seltags] = c->tags; - } -@@ -626,7 +666,7 @@ - c->y = m->my + (m->mh / 2 - HEIGHT(c) / 2); /* center in y direction */ - if((ev->value_mask & (CWX|CWY)) && !(ev->value_mask & (CWWidth|CWHeight))) - configure(c); -- if(ISVISIBLE(c)) -+ if(ISVISIBLE(c, m)) - XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); - } - else -@@ -647,11 +687,18 @@ - - Monitor * - createmon(void) { -- Monitor *m; -+ Monitor *m, *tm; -+ unsigned int i; - - if(!(m = (Monitor *)calloc(1, sizeof(Monitor)))) - die("fatal: could not malloc() %u bytes\n", sizeof(Monitor)); -- m->tagset[0] = m->tagset[1] = 1; -+ m->cl = cl; -+ /* reassing tags when creating a new monitor */ -+ for(i=1, tm = mons; tm; tm = tm->next, i++) { -+ tm->seltags ^= 1; -+ tm->tagset[tm->seltags] = i; -+ } -+ m->tagset[0] = m->tagset[1] = i; - m->mfact = mfact; - m->nmaster = nmaster; - m->showbar = showbar; -@@ -675,7 +722,7 @@ - detach(Client *c) { - Client **tc; - -- for(tc = &c->mon->clients; *tc && *tc != c; tc = &(*tc)->next); -+ for(tc = &c->mon->cl->clients; *tc && *tc != c; tc = &(*tc)->next); - *tc = c->next; - } - -@@ -683,11 +730,11 @@ - detachstack(Client *c) { - Client **tc, *t; - -- for(tc = &c->mon->stack; *tc && *tc != c; tc = &(*tc)->snext); -+ for(tc = &c->mon->cl->stack; *tc && *tc != c; tc = &(*tc)->snext); - *tc = c->snext; - - if(c == c->mon->sel) { -- for(t = c->mon->stack; t && !ISVISIBLE(t); t = t->snext); -+ for(t = c->mon->cl->stack; t && !ISVISIBLE(t, c->mon); t = t->snext); - c->mon->sel = t; - } - } -@@ -724,7 +771,7 @@ - unsigned long *col; - Client *c; - -- for(c = m->clients; c; c = c->next) { -+ for(c = m->cl->clients; c; c = c->next) { - occ |= c->tags; - if(c->isurgent) - urg |= c->tags; -@@ -844,8 +891,8 @@ - - void - focus(Client *c) { -- if(!c || !ISVISIBLE(c)) -- for(c = selmon->stack; c && !ISVISIBLE(c); c = c->snext); -+ if(!c || !ISVISIBLE(c, selmon)) -+ for(c = selmon->cl->stack; c && !ISVISIBLE(c, selmon); c = c->snext); - /* was if(selmon->sel) */ - if(selmon->sel && selmon->sel != c) - unfocus(selmon->sel, False); -@@ -896,17 +943,17 @@ - if(!selmon->sel) - return; - if(arg->i > 0) { -- for(c = selmon->sel->next; c && !ISVISIBLE(c); c = c->next); -+ for(c = selmon->sel->next; c && !ISVISIBLE(c, selmon); c = c->next); - if(!c) -- for(c = selmon->clients; c && !ISVISIBLE(c); c = c->next); -+ for(c = selmon->cl->clients; c && !ISVISIBLE(c, selmon); c = c->next); - } - else { -- for(i = selmon->clients; i != selmon->sel; i = i->next) -- if(ISVISIBLE(i)) -+ for(i = selmon->cl->clients; i != selmon->sel; i = i->next) -+ if(ISVISIBLE(i, selmon)) - c = i; - if(!c) - for(; i; i = i->next) -- if(ISVISIBLE(i)) -+ if(ISVISIBLE(i, selmon)) - c = i; - } - if(c) { -@@ -1200,12 +1247,12 @@ - unsigned int n = 0; - Client *c; - -- for(c = m->clients; c; c = c->next) -- if(ISVISIBLE(c)) -+ for(c = m->cl->clients; c; c = c->next) -+ if(ISVISIBLE(c, m)) - n++; - if(n > 0) /* override layout symbol */ - snprintf(m->ltsymbol, sizeof m->ltsymbol, "[%d]", n); -- for(c = nexttiled(m->clients); c; c = nexttiled(c->next)) -+ for(c = nexttiled(m->cl->clients, m); c; c = nexttiled(c->next, m)) - resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, False); - } - -@@ -1284,8 +1331,8 @@ - } - - Client * --nexttiled(Client *c) { -- for(; c && (c->isfloating || !ISVISIBLE(c)); c = c->next); -+nexttiled(Client *c, Monitor *m) { -+ for(; c && (c->isfloating || !ISVISIBLE(c, m)); c = c->next); - return c; - } - -@@ -1438,8 +1485,8 @@ - if(m->lt[m->sellt]->arrange) { - wc.stack_mode = Below; - wc.sibling = m->barwin; -- for(c = m->stack; c; c = c->snext) -- if(!c->isfloating && ISVISIBLE(c)) { -+ for(c = m->cl->stack; c; c = c->snext) -+ if(!c->isfloating && ISVISIBLE(c, m)) { - XConfigureWindow(dpy, c->win, CWSibling|CWStackMode, &wc); - wc.sibling = c->win; - } -@@ -1489,11 +1536,9 @@ - if(c->mon == m) - return; - unfocus(c, True); -- detach(c); - detachstack(c); - c->mon = m; - c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */ -- attach(c); - attachstack(c); - focus(NULL); - arrange(NULL); -@@ -1611,6 +1656,8 @@ - sw = DisplayWidth(dpy, screen); - sh = DisplayHeight(dpy, screen); - bh = dc.h = dc.font.height + 2; -+ if(!(cl = (Clientlist *)calloc(1, sizeof(Clientlist)))) -+ die("fatal: could not malloc() %u bytes\n", sizeof(Clientlist)); - updategeom(); - /* init atoms */ - wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False); -@@ -1661,7 +1708,7 @@ - showhide(Client *c) { - if(!c) - return; -- if(ISVISIBLE(c)) { /* show clients top down */ -+ if(ISVISIBLE(c, c->mon)) { /* show clients top down */ - XMoveWindow(dpy, c->win, c->x, c->y); - if((!c->mon->lt[c->mon->sellt]->arrange || c->isfloating) && !c->isfullscreen) - resize(c, c->x, c->y, c->w, c->h, False); -@@ -1695,7 +1742,22 @@ - - void - tag(const Arg *arg) { -+ Monitor *m; -+ unsigned int newtags; - if(selmon->sel && arg->ui & TAGMASK) { -+ newtags = arg->ui & TAGMASK; -+ for(m = mons; m; m = m->next) -+ /* if tag is visible on another monitor, move client to the new monitor */ -+ if(m != selmon && m->tagset[m->seltags] & newtags) { -+ /* prevent moving client to all tags (MODKEY-Shift-0) when multiple monitors are connected */ -+ if(newtags & selmon->tagset[selmon->seltags]) -+ return; -+ selmon->sel->tags = newtags; -+ selmon->sel->mon = m; -+ arrange(m); -+ break; -+ } -+ /* workaround in case just one monitor is connected */ - selmon->sel->tags = arg->ui & TAGMASK; - focus(NULL); - arrange(selmon); -@@ -1725,7 +1787,7 @@ - unsigned int i, n, h, mw, my, ty; - Client *c; - -- for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); -+ for(n = 0, c = nexttiled(m->cl->clients, m); c; c = nexttiled(c->next, m), n++); - if(n == 0) - return; - -@@ -1733,7 +1795,7 @@ - mw = m->nmaster ? m->ww * m->mfact : 0; - else - mw = m->ww; -- for(i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) -+ for(i = my = ty = 0, c = nexttiled(m->cl->clients, m); c; c = nexttiled(c->next, m), i++) - if(i < m->nmaster) { - h = (m->wh - my) / (MIN(n, m->nmaster) - i); - resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), False); -@@ -1769,12 +1831,17 @@ - - void - toggletag(const Arg *arg) { -+ Monitor *m; - unsigned int newtags; - - if(!selmon->sel) - return; - newtags = selmon->sel->tags ^ (arg->ui & TAGMASK); - if(newtags) { -+ /* prevent adding tags that are in use on other monitors */ -+ for(m = mons; m; m = m->next) -+ if(m != selmon && newtags & m->tagset[m->seltags]) -+ return; - selmon->sel->tags = newtags; - focus(NULL); - arrange(selmon); -@@ -1783,10 +1850,16 @@ - - void - toggleview(const Arg *arg) { -+ Monitor *m; - unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK); - - if(newtagset) { -+ /* prevent displaying the same tags on multiple monitors */ -+ for(m = mons; m; m = m->next) -+ if(m != selmon && newtagset & m->tagset[m->seltags]) -+ return; - selmon->tagset[selmon->seltags] = newtagset; -+ attachclients(selmon); - focus(NULL); - arrange(selmon); - } -@@ -1881,7 +1954,7 @@ - - XDeleteProperty(dpy, root, netatom[NetClientList]); - for(m = mons; m; m = m->next) -- for(c = m->clients; c; c = c->next) -+ for(c = m->cl->clients; c; c = c->next) - XChangeProperty(dpy, root, netatom[NetClientList], - XA_WINDOW, 32, PropModeAppend, - (unsigned char *) &(c->win), 1); -@@ -1911,8 +1984,10 @@ - if(n <= nn) { - for(i = 0; i < (nn - n); i++) { /* new monitors available */ - for(m = mons; m && m->next; m = m->next); -- if(m) -+ if(m) { - m->next = createmon(); -+ attachclients(m->next); -+ } - else - mons = createmon(); - } -@@ -1933,17 +2008,13 @@ - else { /* less monitors available nn < n */ - for(i = nn; i < n; i++) { - for(m = mons; m && m->next; m = m->next); -- while(m->clients) { -- dirty = True; -- c = m->clients; -- m->clients = c->next; -- detachstack(c); -- c->mon = mons; -- attach(c); -- attachstack(c); -- } - if(m == selmon) - selmon = mons; -+ for(c = m->cl->clients; c; c = c->next) { -+ dirty = True; -+ if(c->mon == m) -+ c->mon = selmon; -+ } - cleanupmon(m); - } - } -@@ -2081,11 +2152,31 @@ - - void - view(const Arg *arg) { -+ Monitor *m; -+ unsigned int newtagset = selmon->tagset[selmon->seltags ^ 1]; - if((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) - return; -+ -+ /* swap tags when trying to display a tag from another monitor */ -+ if(arg->ui & TAGMASK) -+ newtagset = arg->ui & TAGMASK; -+ for(m = mons; m; m = m->next) -+ if(m != selmon && newtagset & m->tagset[m->seltags]) { -+ /* prevent displaying all tags (MODKEY-0) when multiple monitors -+ * are connected */ -+ if(newtagset & selmon->tagset[selmon->seltags]) -+ return; -+ m->seltags ^= 1; -+ m->tagset[m->seltags] = selmon->tagset[selmon->seltags]; -+ attachclients(m); -+ arrange(m); -+ break; -+ } -+ - selmon->seltags ^= 1; /* toggle sel tagset */ - if(arg->ui & TAGMASK) - selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; -+ attachclients(selmon); - focus(NULL); - arrange(selmon); - } -@@ -2096,7 +2187,7 @@ - Monitor *m; - - for(m = mons; m; m = m->next) -- for(c = m->clients; c; c = c->next) -+ for(c = m->cl->clients; c; c = c->next) - if(c->win == w) - return c; - return NULL; -@@ -2158,8 +2249,8 @@ - if(!selmon->lt[selmon->sellt]->arrange - || (selmon->sel && selmon->sel->isfloating)) - return; -- if(c == nexttiled(selmon->clients)) -- if(!c || !(c = nexttiled(c->next))) -+ if(c == nexttiled(selmon->cl->clients, selmon)) -+ if(!c || !(c = nexttiled(c->next, selmon))) - return; - pop(c); - } diff --git a/dwm.suckless.org/patches/single_tagset/index.md b/dwm.suckless.org/patches/single_tagset/index.md @@ -20,7 +20,6 @@ Download -------- * [dwm-single\_tagset-20160731-56a31dc.diff](dwm-single_tagset-20160731-56a31dc.diff) * [dwm-6.1-single\_tagset.diff](dwm-6.1-single_tagset.diff) (16634b) (20140209) -* [dwm-10e232f9ace7-single\_tagset.diff](dwm-10e232f9ace7-single_tagset.diff) (14748b) (20120406) * [dwm-single\_tagset-6.0.diff](dwm-single_tagset-6.0.diff) (14417b) (20120406) Authors diff --git a/dwm.suckless.org/patches/statusallmons/dwm-10e232f9ace7-statusallmons.diff b/dwm.suckless.org/patches/statusallmons/dwm-10e232f9ace7-statusallmons.diff @@ -1,43 +0,0 @@ -URL: http://dwm.suckless.org/patches/statusallmons -This patch draws and updates the statusbar on all monitors. - -diff -r 10e232f9ace7 dwm.c ---- a/dwm.c Sun Mar 25 17:49:35 2012 +0200 -+++ b/dwm.c Fri Apr 06 08:16:42 2012 +0200 -@@ -742,17 +742,13 @@ - drawtext(m->ltsymbol, dc.norm, False); - dc.x += dc.w; - x = dc.x; -- if(m == selmon) { /* status is only drawn on selected monitor */ -- dc.w = TEXTW(stext); -- dc.x = m->ww - dc.w; -- if(dc.x < x) { -- dc.x = x; -- dc.w = m->ww - x; -- } -- drawtext(stext, dc.norm, False); -+ dc.w = TEXTW(stext); -+ dc.x = m->ww - dc.w; -+ if(dc.x < x) { -+ dc.x = x; -+ dc.w = m->ww - x; - } -- else -- dc.x = m->ww; -+ drawtext(stext, dc.norm, False); - if((dc.w = dc.x - x) > bh) { - dc.x = x; - if(m->sel) { -@@ -2044,9 +2040,11 @@ - - void - updatestatus(void) { -+ Monitor* m; - if(!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) - strcpy(stext, "dwm-"VERSION); -- drawbar(selmon); -+ for(m = mons; m; m = m->next) -+ drawbar(m); - } - - void diff --git a/dwm.suckless.org/patches/statusallmons/index.md b/dwm.suckless.org/patches/statusallmons/index.md @@ -9,7 +9,6 @@ Download -------- * [dwm-statusallmons-20160731-56a31dc.diff](dwm-statusallmons-20160731-56a31dc.diff) * [dwm-6.1-statusallmons.diff](dwm-6.1-statusallmons.diff) (1026b) (20140209) -* [dwm-10e232f9ace7-statusallmons.diff](dwm-10e232f9ace7-statusallmons.diff) (982b) (20120406) * [dwm-statusallmons-6.0.diff](dwm-statusallmons-6.0.diff) (982b) (20120406) * [dwm-statusallmons-5.8.2.diff](dwm-statusallmons-5.8.2.diff) (4.0K) (20110318) diff --git a/dwm.suckless.org/patches/swapfocus/dwm-10e232f9ace7-swapfocus.diff b/dwm.suckless.org/patches/swapfocus/dwm-10e232f9ace7-swapfocus.diff @@ -1,55 +0,0 @@ -URL: http://dwm.suckless.org/patches/swapfocus -This patch makes it possible to switch focus with one single shortcut (alt-s) -instead of having to think if you should use alt-j or alt-k for reaching the -last used window. - -diff -r 10e232f9ace7 dwm.c ---- a/dwm.c Sun Mar 25 17:49:35 2012 +0200 -+++ b/dwm.c Fri Apr 06 08:16:45 2012 +0200 -@@ -224,6 +224,7 @@ - static void showhide(Client *c); - static void sigchld(int unused); - static void spawn(const Arg *arg); -+static void swapfocus(); - static void tag(const Arg *arg); - static void tagmon(const Arg *arg); - static int textnw(const char *text, unsigned int len); -@@ -254,6 +255,7 @@ - static void zoom(const Arg *arg); - - /* variables */ -+static Client *prevclient = NULL; - static const char broken[] = "broken"; - static char stext[256]; - static int screen; -@@ -1694,6 +1696,14 @@ - } - - void -+swapfocus(){ -+ Client *c; -+ for(c = selmon->clients; c && c != prevclient; c = c->next) ; -+ if(c == prevclient) -+ focus(prevclient); -+} -+ -+void - tag(const Arg *arg) { - if(selmon->sel && arg->ui & TAGMASK) { - selmon->sel->tags = arg->ui & TAGMASK; -@@ -1796,6 +1806,7 @@ - unfocus(Client *c, Bool setfocus) { - if(!c) - return; -+ prevclient = c; - grabbuttons(c, False); - XSetWindowBorder(dpy, c->win, dc.norm[ColBorder]); - if(setfocus) { -@@ -2154,6 +2165,7 @@ - void - zoom(const Arg *arg) { - Client *c = selmon->sel; -+ prevclient = selmon->clients; - - if(!selmon->lt[selmon->sellt]->arrange - || (selmon->sel && selmon->sel->isfloating)) diff --git a/dwm.suckless.org/patches/swapfocus/index.md b/dwm.suckless.org/patches/swapfocus/index.md @@ -11,7 +11,6 @@ Download -------- * [dwm-swapfocus-20160731-56a31dc.diff](dwm-swapfocus-20160731-56a31dc.diff) * [dwm-6.1-swapfocus.diff](dwm-6.1-swapfocus.diff) (1807b) (20140209) -* [dwm-10e232f9ace7-swapfocus.diff](dwm-10e232f9ace7-swapfocus.diff) (1484b) (20120406) * [dwm-swapfocus-6.0.diff](dwm-swapfocus-6.0.diff) (1482b) (20120406) * [dwm-5.8.2-swap.diff](dwm-5.8.2-swap.diff) (dwm 5.8.2) diff --git a/dwm.suckless.org/patches/tagall/dwm-10e232f9ace7-tagall.diff b/dwm.suckless.org/patches/tagall/dwm-10e232f9ace7-tagall.diff @@ -1,32 +0,0 @@ -Author: Jan Christoph Ebersbach <jceb@e-jc.de> -URL: http://dwm.suckless.org/patches/historical/tagall -Shortcut to move all (floating) windows from one tag to another. - -diff -r 10e232f9ace7 tagall.c ---- /dev/null Thu Jan 01 00:00:00 1970 +0000 -+++ b/tagall.c Fri Apr 06 08:16:23 2012 +0200 -@@ -0,0 +1,24 @@ -+void -+tagall(const Arg *arg) { -+ if (!selmon->clients) -+ return; -+ /* if parameter starts with F, just move floating windows */ -+ int floating_only = (char *)arg->v && ((char *)arg->v)[0] == 'F' ? 1 : 0; -+ int tag = (char *)arg->v ? atoi(((char *)arg->v) + floating_only) : 0; -+ int j; -+ Client* c; -+ if(tag >= 0 && tag < LENGTH(tags)) -+ for(c = selmon->clients; c; c = c->next) -+ { -+ if(!floating_only || c->isfloating) -+ for(j = 0; j < LENGTH(tags); j++) -+ { -+ if(c->tags & 1 << j && selmon->tagset[selmon->seltags] & 1 << j) -+ { -+ c->tags = c->tags ^ (1 << j & TAGMASK); -+ c->tags = c->tags | 1 << (tag-1); -+ } -+ } -+ } -+ arrange(selmon); -+} diff --git a/dwm.suckless.org/patches/tagall/index.md b/dwm.suckless.org/patches/tagall/index.md @@ -9,7 +9,6 @@ Download -------- * [dwm-tagall-20160731-56a31dc.diff](dwm-tagall-20160731-56a31dc.diff) * [dwm-tagall-6.1.diff](dwm-tagall-6.1.diff) (1058b) (20140209) -* [dwm-10e232f9ace7-tagall.diff](dwm-10e232f9ace7-tagall.diff) (988b) (20120406) * [dwm-tagall-6.0.diff](dwm-tagall-6.0.diff) (988b) (20120406) Configuration diff --git a/dwm.suckless.org/patches/titlecolor/dwm-titlecolor-20190206-b15016b.diff b/dwm.suckless.org/patches/titlecolor/dwm-titlecolor-20190206-6.2.diff diff --git a/dwm.suckless.org/patches/titlecolor/index.md b/dwm.suckless.org/patches/titlecolor/index.md @@ -8,8 +8,8 @@ Adds a new color scheme used by the window title in the bar, so that its colors Download -------- +* [dwm-titlecolor-20190206-6.2.diff](dwm-titlecolor-20190206-6.2.diff) (2019-02-06) * [dwm-titlecolor-6.1.diff](dwm-titlecolor-6.1.diff) (31.12.2018) -* [dwm-titlecolor-20190206-b15016b.diff](dwm-titlecolor-20190206-b15016b.diff) (06.02.2019) Author ------ diff --git a/st.suckless.org/patches/externalpipe/index.md b/st.suckless.org/patches/externalpipe/index.md @@ -36,7 +36,7 @@ Download * [st-externalpipe-20170608-b331da5.diff](st-externalpipe-20170608-b331da5.diff) * [st-externalpipe-0.8.diff](st-externalpipe-0.8.diff) * [st-externalpipe-0.8.1.diff](st-externalpipe-0.8.1.diff) -* [st-externalpipe-20181016-c19e14b.diff](st-externalpipe-20181016-c19e14b.diff) +* [st-externalpipe-20181016-3be4cf1.diff](st-externalpipe-20181016-3be4cf1.diff) Authors ------- diff --git a/st.suckless.org/patches/externalpipe/st-externalpipe-20181016-c19e14b.diff b/st.suckless.org/patches/externalpipe/st-externalpipe-20181016-3be4cf1.diff diff --git a/st.suckless.org/patches/keyboard_select/git-st-keyboard_select-20180619-937e367.diff b/st.suckless.org/patches/keyboard_select/git-st-keyboard_select-20180619-937e367.diff @@ -1,319 +0,0 @@ -diff --git a/a/config.def.h b/b/config.def.h -index 82b1b09..cdfbdc9 100644 ---- a/a/config.def.h -+++ b/b/config.def.h -@@ -178,6 +178,7 @@ static Shortcut shortcuts[] = { - { TERMMOD, XK_Y, selpaste, {.i = 0} }, - { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, - { TERMMOD, XK_I, iso14755, {.i = 0} }, -+ { TERMMOD, XK_Escape, keyboard_select,{ 0 } }, - }; - - /* -diff --git a/a/st.c b/b/st.c -index 76bb3ea..8a0d448 100644 ---- a/a/st.c -+++ b/b/st.c -@@ -16,6 +16,8 @@ - #include <termios.h> - #include <unistd.h> - #include <wchar.h> -+#include <X11/keysym.h> -+#include <X11/X.h> - - #include "st.h" - #include "win.h" -@@ -2504,6 +2506,9 @@ tresize(int col, int row) - int *bp; - TCursor c; - -+ if ( row < term.row || col < term.col ) -+ toggle_winmode(trt_kbdselect(XK_Escape, NULL, 0)); -+ - if (col < 1 || row < 1) { - fprintf(stderr, - "tresize: error resizing to %dx%d\n", col, row); -@@ -2625,3 +2630,220 @@ redraw(void) - tfulldirt(); - draw(); - } -+ -+void set_notifmode(int type, KeySym ksym) { -+ static char *lib[] = { " MOVE ", " SEL "}; -+ static Glyph *g, *deb, *fin; -+ static int col, bot; -+ -+ if ( ksym == -1 ) { -+ free(g); -+ col = term.col, bot = term.bot; -+ g = xmalloc(col * sizeof(Glyph)); -+ memcpy(g, term.line[bot], col * sizeof(Glyph)); -+ -+ } -+ else if ( ksym == -2 ) -+ memcpy(term.line[bot], g, col * sizeof(Glyph)); -+ -+ if ( type < 2 ) { -+ char *z = lib[type]; -+ for (deb = &term.line[bot][col - 6], fin = &term.line[bot][col]; deb < fin; z++, deb++) -+ deb->mode = ATTR_REVERSE, -+ deb->u = *z, -+ deb->fg = defaultfg, deb->bg = defaultbg; -+ } -+ else if ( type < 5 ) -+ memcpy(term.line[bot], g, col * sizeof(Glyph)); -+ else { -+ for (deb = &term.line[bot][0], fin = &term.line[bot][col]; deb < fin; deb++) -+ deb->mode = ATTR_REVERSE, -+ deb->u = ' ', -+ deb->fg = defaultfg, deb->bg = defaultbg; -+ term.line[bot][0].u = ksym; -+ } -+ -+ term.dirty[bot] = 1; -+ drawregion(0, bot, col, bot + 1); -+} -+ -+void select_or_drawcursor(int selectsearch_mode, int type) { -+ int done = 0; -+ -+ if ( selectsearch_mode & 1 ) { -+ selextend(term.c.x, term.c.y, type, done); -+ xsetsel(getsel()); -+ } -+ else -+ xdrawcursor(term.c.x, term.c.y, term.line[term.c.y][term.c.x], -+ term.ocx, term.ocy, term.line[term.ocy][term.ocx]); -+} -+ -+void search(int selectsearch_mode, Rune *target, int ptarget, int incr, int type, TCursor *cu) { -+ Rune *r; -+ int i, bound = (term.col * cu->y + cu->x) * (incr > 0) + incr; -+ -+ for (i = term.col * term.c.y + term.c.x + incr; i != bound; i += incr) { -+ for (r = target; r - target < ptarget; r++) { -+ if ( *r == term.line[(i + r - target) / term.col][(i + r - target) % term.col].u ) { -+ if ( r - target == ptarget - 1 ) break; -+ } else { -+ r = NULL; -+ break; -+ } -+ } -+ if ( r != NULL ) break; -+ } -+ -+ if ( i != bound ) { -+ term.c.y = i / term.col, term.c.x = i % term.col; -+ select_or_drawcursor(selectsearch_mode, type); -+ } -+} -+ -+int trt_kbdselect(KeySym ksym, char *buf, int len) { -+ static TCursor cu; -+ static Rune target[64]; -+ static int type = 1, ptarget, in_use; -+ static int sens, quant; -+ static char selectsearch_mode; -+ int i, bound, *xy; -+ -+ -+ if ( selectsearch_mode & 2 ) { -+ if ( ksym == XK_Return ) { -+ selectsearch_mode ^= 2; -+ set_notifmode(selectsearch_mode, -2); -+ if ( ksym == XK_Escape ) ptarget = 0; -+ return 0; -+ } -+ else if ( ksym == XK_BackSpace ) { -+ if ( !ptarget ) return 0; -+ term.line[term.bot][ptarget--].u = ' '; -+ } -+ else if ( len < 1 ) { -+ return 0; -+ } -+ else if ( ptarget == term.col || ksym == XK_Escape ) { -+ return 0; -+ } -+ else { -+ utf8decode(buf, &target[ptarget++], len); -+ term.line[term.bot][ptarget].u = target[ptarget - 1]; -+ } -+ -+ if ( ksym != XK_BackSpace ) -+ search(selectsearch_mode, &target[0], ptarget, sens, type, &cu); -+ -+ term.dirty[term.bot] = 1; -+ drawregion(0, term.bot, term.col, term.bot + 1); -+ return 0; -+ } -+ -+ switch ( ksym ) { -+ case -1 : -+ in_use = 1; -+ cu.x = term.c.x, cu.y = term.c.y; -+ set_notifmode(0, ksym); -+ return MODE_KBDSELECT; -+ case XK_s : -+ if ( selectsearch_mode & 1 ) -+ selclear(); -+ else -+ selstart(term.c.x, term.c.y, 0); -+ set_notifmode(selectsearch_mode ^= 1, ksym); -+ break; -+ case XK_t : -+ selextend(term.c.x, term.c.y, type ^= 3, i = 0); /* 2 fois */ -+ selextend(term.c.x, term.c.y, type, i = 0); -+ break; -+ case XK_slash : -+ case XK_KP_Divide : -+ case XK_question : -+ ksym &= XK_question; /* Divide to slash */ -+ sens = (ksym == XK_slash) ? -1 : 1; -+ ptarget = 0; -+ set_notifmode(15, ksym); -+ selectsearch_mode ^= 2; -+ break; -+ case XK_Escape : -+ if ( !in_use ) break; -+ selclear(); -+ case XK_Return : -+ set_notifmode(4, ksym); -+ term.c.x = cu.x, term.c.y = cu.y; -+ select_or_drawcursor(selectsearch_mode = 0, type); -+ in_use = quant = 0; -+ return MODE_KBDSELECT; -+ case XK_n : -+ case XK_N : -+ if ( ptarget ) -+ search(selectsearch_mode, &target[0], ptarget, (ksym == XK_n) ? -1 : 1, type, &cu); -+ break; -+ case XK_BackSpace : -+ term.c.x = 0; -+ select_or_drawcursor(selectsearch_mode, type); -+ break; -+ case XK_dollar : -+ term.c.x = term.col - 1; -+ select_or_drawcursor(selectsearch_mode, type); -+ break; -+ case XK_Home : -+ term.c.x = 0, term.c.y = 0; -+ select_or_drawcursor(selectsearch_mode, type); -+ break; -+ case XK_End : -+ term.c.x = cu.x, term.c.y = cu.y; -+ select_or_drawcursor(selectsearch_mode, type); -+ break; -+ case XK_Page_Up : -+ case XK_Page_Down : -+ term.c.y = (ksym == XK_Prior ) ? 0 : cu.y; -+ select_or_drawcursor(selectsearch_mode, type); -+ break; -+ case XK_exclam : -+ term.c.x = term.col >> 1; -+ select_or_drawcursor(selectsearch_mode, type); -+ break; -+ case XK_asterisk : -+ case XK_KP_Multiply : -+ term.c.x = term.col >> 1; -+ case XK_underscore : -+ term.c.y = cu.y >> 1; -+ select_or_drawcursor(selectsearch_mode, type); -+ break; -+ default : -+ if ( ksym >= XK_0 && ksym <= XK_9 ) { /* 0-9 keyboard */ -+ quant = (quant * 10) + (ksym ^ XK_0); -+ return 0; -+ } -+ else if ( ksym >= XK_KP_0 && ksym <= XK_KP_9 ) { /* 0-9 numpad */ -+ quant = (quant * 10) + (ksym ^ XK_KP_0); -+ return 0; -+ } -+ else if ( ksym == XK_k || ksym == XK_h ) -+ i = ksym & 1; -+ else if ( ksym == XK_l || ksym == XK_j ) -+ i = ((ksym & 6) | 4) >> 1; -+ else if ( (XK_Home & ksym) != XK_Home || (i = (ksym ^ XK_Home) - 1) > 3 ) -+ break; -+ -+ xy = (i & 1) ? &term.c.y : &term.c.x; -+ sens = (i & 2) ? 1 : -1; -+ bound = (i >> 1 ^ 1) ? 0 : (i ^ 3) ? term.col - 1 : term.bot; -+ -+ if ( quant == 0 ) -+ quant++; -+ -+ if ( *xy == bound && ((sens < 0 && bound == 0) || (sens > 0 && bound > 0)) ) -+ break; -+ -+ *xy += quant * sens; -+ if ( *xy < 0 || ( bound > 0 && *xy > bound) ) -+ *xy = bound; -+ -+ select_or_drawcursor(selectsearch_mode, type); -+ } -+ quant = 0; -+ return 0; -+} -diff --git a/a/st.h b/b/st.h -index dac64d8..d6693bf 100644 ---- a/a/st.h -+++ b/b/st.h -@@ -110,6 +110,7 @@ size_t utf8encode(Rune, char *); - void *xmalloc(size_t); - void *xrealloc(void *, size_t); - char *xstrdup(char *); -+int trt_kbdselect(KeySym, char *, int); - - /* config.h globals */ - extern char *utmp; -diff --git a/a/win.h b/b/win.h -index 31f327d..75a2756 100644 ---- a/a/win.h -+++ b/b/win.h -@@ -21,6 +21,7 @@ enum win_mode { - MODE_NUMLOCK = 1 << 17, - MODE_MOUSE = MODE_MOUSEBTN|MODE_MOUSEMOTION|MODE_MOUSEX10\ - |MODE_MOUSEMANY, -+ MODE_KBDSELECT = 1 << 18, - }; - - void xbell(void); -@@ -36,3 +37,5 @@ void xsetmode(int, unsigned int); - void xsetpointermotion(int); - void xsetsel(char *); - int xstartdraw(void); -+void toggle_winmode(int); -+void keyboard_select(const Arg *); -diff --git a/a/x.c b/b/x.c -index c0bd890..39e2984 100644 ---- a/a/x.c -+++ b/b/x.c -@@ -1695,6 +1695,13 @@ kpress(XEvent *ev) - return; - - len = XmbLookupString(xw.xic, e, buf, sizeof buf, &ksym, &status); -+ if ( IS_SET(MODE_KBDSELECT) ) { -+ if ( match(XK_NO_MOD, e->state) || -+ (XK_Shift_L | XK_Shift_R) & e->state ) -+ win.mode ^= trt_kbdselect(ksym, buf, len); -+ return; -+ } -+ - /* 1. shortcuts */ - for (bp = shortcuts; bp < shortcuts + LEN(shortcuts); bp++) { - if (ksym == bp->keysym && match(bp->mod, e->state)) { -@@ -1879,6 +1886,14 @@ usage(void) - " [stty_args ...]\n", argv0, argv0); - } - -+void toggle_winmode(int flag) { -+ win.mode ^= flag; -+} -+ -+void keyboard_select(const Arg *dummy) { -+ win.mode ^= trt_kbdselect(-1, NULL, 0); -+} -+ - int - main(int argc, char *argv[]) - { diff --git a/st.suckless.org/patches/keyboard_select/index.md b/st.suckless.org/patches/keyboard_select/index.md @@ -47,7 +47,7 @@ Shortcuts for input mode : Download -------- -* [git-st-keyboard\_select-20180619-937e367.diff](git-st-keyboard_select-20180619-937e367.diff) +* [st-keyboard\_select-20190207-3be4cf1.diff](st-keyboard_select-20190207-3be4cf1.diff) * [st-keyboard\_select-0.8.1.diff](st-keyboard_select-0.8.1.diff) Authors diff --git a/st.suckless.org/patches/keyboard_select/st-keyboard_select-20190207-3be4cf1.diff b/st.suckless.org/patches/keyboard_select/st-keyboard_select-20190207-3be4cf1.diff @@ -0,0 +1,319 @@ +diff --git a/config.def.h b/config.def.h +index 0e01717..021bcdd 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -178,6 +178,7 @@ static Shortcut shortcuts[] = { + { TERMMOD, XK_Y, selpaste, {.i = 0} }, + { ShiftMask, XK_Insert, selpaste, {.i = 0} }, + { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, ++ { TERMMOD, XK_Escape, keyboard_select,{ 0 } }, + }; + + /* +diff --git a/st.c b/st.c +index b8e6077..1ad0f22 100644 +--- a/st.c ++++ b/st.c +@@ -16,6 +16,8 @@ + #include <termios.h> + #include <unistd.h> + #include <wchar.h> ++#include <X11/keysym.h> ++#include <X11/X.h> + + #include "st.h" + #include "win.h" +@@ -2481,6 +2483,9 @@ tresize(int col, int row) + int *bp; + TCursor c; + ++ if ( row < term.row || col < term.col ) ++ toggle_winmode(trt_kbdselect(XK_Escape, NULL, 0)); ++ + if (col < 1 || row < 1) { + fprintf(stderr, + "tresize: error resizing to %dx%d\n", col, row); +@@ -2602,3 +2607,220 @@ redraw(void) + tfulldirt(); + draw(); + } ++ ++void set_notifmode(int type, KeySym ksym) { ++ static char *lib[] = { " MOVE ", " SEL "}; ++ static Glyph *g, *deb, *fin; ++ static int col, bot; ++ ++ if ( ksym == -1 ) { ++ free(g); ++ col = term.col, bot = term.bot; ++ g = xmalloc(col * sizeof(Glyph)); ++ memcpy(g, term.line[bot], col * sizeof(Glyph)); ++ ++ } ++ else if ( ksym == -2 ) ++ memcpy(term.line[bot], g, col * sizeof(Glyph)); ++ ++ if ( type < 2 ) { ++ char *z = lib[type]; ++ for (deb = &term.line[bot][col - 6], fin = &term.line[bot][col]; deb < fin; z++, deb++) ++ deb->mode = ATTR_REVERSE, ++ deb->u = *z, ++ deb->fg = defaultfg, deb->bg = defaultbg; ++ } ++ else if ( type < 5 ) ++ memcpy(term.line[bot], g, col * sizeof(Glyph)); ++ else { ++ for (deb = &term.line[bot][0], fin = &term.line[bot][col]; deb < fin; deb++) ++ deb->mode = ATTR_REVERSE, ++ deb->u = ' ', ++ deb->fg = defaultfg, deb->bg = defaultbg; ++ term.line[bot][0].u = ksym; ++ } ++ ++ term.dirty[bot] = 1; ++ drawregion(0, bot, col, bot + 1); ++} ++ ++void select_or_drawcursor(int selectsearch_mode, int type) { ++ int done = 0; ++ ++ if ( selectsearch_mode & 1 ) { ++ selextend(term.c.x, term.c.y, type, done); ++ xsetsel(getsel()); ++ } ++ else ++ xdrawcursor(term.c.x, term.c.y, term.line[term.c.y][term.c.x], ++ term.ocx, term.ocy, term.line[term.ocy][term.ocx]); ++} ++ ++void search(int selectsearch_mode, Rune *target, int ptarget, int incr, int type, TCursor *cu) { ++ Rune *r; ++ int i, bound = (term.col * cu->y + cu->x) * (incr > 0) + incr; ++ ++ for (i = term.col * term.c.y + term.c.x + incr; i != bound; i += incr) { ++ for (r = target; r - target < ptarget; r++) { ++ if ( *r == term.line[(i + r - target) / term.col][(i + r - target) % term.col].u ) { ++ if ( r - target == ptarget - 1 ) break; ++ } else { ++ r = NULL; ++ break; ++ } ++ } ++ if ( r != NULL ) break; ++ } ++ ++ if ( i != bound ) { ++ term.c.y = i / term.col, term.c.x = i % term.col; ++ select_or_drawcursor(selectsearch_mode, type); ++ } ++} ++ ++int trt_kbdselect(KeySym ksym, char *buf, int len) { ++ static TCursor cu; ++ static Rune target[64]; ++ static int type = 1, ptarget, in_use; ++ static int sens, quant; ++ static char selectsearch_mode; ++ int i, bound, *xy; ++ ++ ++ if ( selectsearch_mode & 2 ) { ++ if ( ksym == XK_Return ) { ++ selectsearch_mode ^= 2; ++ set_notifmode(selectsearch_mode, -2); ++ if ( ksym == XK_Escape ) ptarget = 0; ++ return 0; ++ } ++ else if ( ksym == XK_BackSpace ) { ++ if ( !ptarget ) return 0; ++ term.line[term.bot][ptarget--].u = ' '; ++ } ++ else if ( len < 1 ) { ++ return 0; ++ } ++ else if ( ptarget == term.col || ksym == XK_Escape ) { ++ return 0; ++ } ++ else { ++ utf8decode(buf, &target[ptarget++], len); ++ term.line[term.bot][ptarget].u = target[ptarget - 1]; ++ } ++ ++ if ( ksym != XK_BackSpace ) ++ search(selectsearch_mode, &target[0], ptarget, sens, type, &cu); ++ ++ term.dirty[term.bot] = 1; ++ drawregion(0, term.bot, term.col, term.bot + 1); ++ return 0; ++ } ++ ++ switch ( ksym ) { ++ case -1 : ++ in_use = 1; ++ cu.x = term.c.x, cu.y = term.c.y; ++ set_notifmode(0, ksym); ++ return MODE_KBDSELECT; ++ case XK_s : ++ if ( selectsearch_mode & 1 ) ++ selclear(); ++ else ++ selstart(term.c.x, term.c.y, 0); ++ set_notifmode(selectsearch_mode ^= 1, ksym); ++ break; ++ case XK_t : ++ selextend(term.c.x, term.c.y, type ^= 3, i = 0); /* 2 fois */ ++ selextend(term.c.x, term.c.y, type, i = 0); ++ break; ++ case XK_slash : ++ case XK_KP_Divide : ++ case XK_question : ++ ksym &= XK_question; /* Divide to slash */ ++ sens = (ksym == XK_slash) ? -1 : 1; ++ ptarget = 0; ++ set_notifmode(15, ksym); ++ selectsearch_mode ^= 2; ++ break; ++ case XK_Escape : ++ if ( !in_use ) break; ++ selclear(); ++ case XK_Return : ++ set_notifmode(4, ksym); ++ term.c.x = cu.x, term.c.y = cu.y; ++ select_or_drawcursor(selectsearch_mode = 0, type); ++ in_use = quant = 0; ++ return MODE_KBDSELECT; ++ case XK_n : ++ case XK_N : ++ if ( ptarget ) ++ search(selectsearch_mode, &target[0], ptarget, (ksym == XK_n) ? -1 : 1, type, &cu); ++ break; ++ case XK_BackSpace : ++ term.c.x = 0; ++ select_or_drawcursor(selectsearch_mode, type); ++ break; ++ case XK_dollar : ++ term.c.x = term.col - 1; ++ select_or_drawcursor(selectsearch_mode, type); ++ break; ++ case XK_Home : ++ term.c.x = 0, term.c.y = 0; ++ select_or_drawcursor(selectsearch_mode, type); ++ break; ++ case XK_End : ++ term.c.x = cu.x, term.c.y = cu.y; ++ select_or_drawcursor(selectsearch_mode, type); ++ break; ++ case XK_Page_Up : ++ case XK_Page_Down : ++ term.c.y = (ksym == XK_Prior ) ? 0 : cu.y; ++ select_or_drawcursor(selectsearch_mode, type); ++ break; ++ case XK_exclam : ++ term.c.x = term.col >> 1; ++ select_or_drawcursor(selectsearch_mode, type); ++ break; ++ case XK_asterisk : ++ case XK_KP_Multiply : ++ term.c.x = term.col >> 1; ++ case XK_underscore : ++ term.c.y = cu.y >> 1; ++ select_or_drawcursor(selectsearch_mode, type); ++ break; ++ default : ++ if ( ksym >= XK_0 && ksym <= XK_9 ) { /* 0-9 keyboard */ ++ quant = (quant * 10) + (ksym ^ XK_0); ++ return 0; ++ } ++ else if ( ksym >= XK_KP_0 && ksym <= XK_KP_9 ) { /* 0-9 numpad */ ++ quant = (quant * 10) + (ksym ^ XK_KP_0); ++ return 0; ++ } ++ else if ( ksym == XK_k || ksym == XK_h ) ++ i = ksym & 1; ++ else if ( ksym == XK_l || ksym == XK_j ) ++ i = ((ksym & 6) | 4) >> 1; ++ else if ( (XK_Home & ksym) != XK_Home || (i = (ksym ^ XK_Home) - 1) > 3 ) ++ break; ++ ++ xy = (i & 1) ? &term.c.y : &term.c.x; ++ sens = (i & 2) ? 1 : -1; ++ bound = (i >> 1 ^ 1) ? 0 : (i ^ 3) ? term.col - 1 : term.bot; ++ ++ if ( quant == 0 ) ++ quant++; ++ ++ if ( *xy == bound && ((sens < 0 && bound == 0) || (sens > 0 && bound > 0)) ) ++ break; ++ ++ *xy += quant * sens; ++ if ( *xy < 0 || ( bound > 0 && *xy > bound) ) ++ *xy = bound; ++ ++ select_or_drawcursor(selectsearch_mode, type); ++ } ++ quant = 0; ++ return 0; ++} +diff --git a/st.h b/st.h +index 38c61c4..a76419e 100644 +--- a/st.h ++++ b/st.h +@@ -109,6 +109,7 @@ size_t utf8encode(Rune, char *); + void *xmalloc(size_t); + void *xrealloc(void *, size_t); + char *xstrdup(char *); ++int trt_kbdselect(KeySym, char *, int); + + /* config.h globals */ + extern char *utmp; +diff --git a/win.h b/win.h +index 31f327d..75a2756 100644 +--- a/win.h ++++ b/win.h +@@ -21,6 +21,7 @@ enum win_mode { + MODE_NUMLOCK = 1 << 17, + MODE_MOUSE = MODE_MOUSEBTN|MODE_MOUSEMOTION|MODE_MOUSEX10\ + |MODE_MOUSEMANY, ++ MODE_KBDSELECT = 1 << 18, + }; + + void xbell(void); +@@ -36,3 +37,5 @@ void xsetmode(int, unsigned int); + void xsetpointermotion(int); + void xsetsel(char *); + int xstartdraw(void); ++void toggle_winmode(int); ++void keyboard_select(const Arg *); +diff --git a/x.c b/x.c +index 0422421..f5fa3e2 100644 +--- a/x.c ++++ b/x.c +@@ -1699,6 +1699,13 @@ kpress(XEvent *ev) + return; + + len = XmbLookupString(xw.xic, e, buf, sizeof buf, &ksym, &status); ++ if ( IS_SET(MODE_KBDSELECT) ) { ++ if ( match(XK_NO_MOD, e->state) || ++ (XK_Shift_L | XK_Shift_R) & e->state ) ++ win.mode ^= trt_kbdselect(ksym, buf, len); ++ return; ++ } ++ + /* 1. shortcuts */ + for (bp = shortcuts; bp < shortcuts + LEN(shortcuts); bp++) { + if (ksym == bp->keysym && match(bp->mod, e->state)) { +@@ -1883,6 +1890,14 @@ usage(void) + " [stty_args ...]\n", argv0, argv0); + } + ++void toggle_winmode(int flag) { ++ win.mode ^= flag; ++} ++ ++void keyboard_select(const Arg *dummy) { ++ win.mode ^= trt_kbdselect(-1, NULL, 0); ++} ++ + int + main(int argc, char *argv[]) + { diff --git a/st.suckless.org/patches/solarized/index.md b/st.suckless.org/patches/solarized/index.md @@ -54,7 +54,7 @@ or the dark color scheme: * [st-solarized-both-0.8.1.diff](st-solarized-both-0.8.1.diff) * [st-solarized-both-20170626-b331da5.diff](st-solarized-both-20170626-b331da5.diff) -* [st-solarized-both-20190128-f506464.diff](st-solarized-both-20190128-f506464.diff) +* [st-solarized-both-20190128-3be4cf1.diff](st-solarized-both-20190128-3be4cf1.diff) Authors ------- diff --git a/st.suckless.org/patches/solarized/st-solarized-both-20190128-f506464.diff b/st.suckless.org/patches/solarized/st-solarized-both-20190128-3be4cf1.diff diff --git a/st.suckless.org/patches/xresources/index.md b/st.suckless.org/patches/xresources/index.md @@ -10,7 +10,7 @@ Download -------- * [st-xresources-20180309-c5ba9c0.diff](st-xresources-20180309-c5ba9c0.diff) * [st-xresources-20181018-g30ec9a3.diff](st-xresources-20181018-g30ec9a3.diff) -* [st-xresources-20190105-9f80f67.diff](st-xresources-20190105-9f80f67.diff) +* [st-xresources-20190105-3be4cf1.diff](st-xresources-20190105-3be4cf1.diff) Authors ------- diff --git a/st.suckless.org/patches/xresources/st-xresources-20190105-9f80f67.diff b/st.suckless.org/patches/xresources/st-xresources-20190105-3be4cf1.diff diff --git a/tools.suckless.org/ii/patches/solarisbuild/ii-1.8-solarisbuild.diff b/tools.suckless.org/ii/patches/solarisbuild/ii-1.8-solarisbuild.diff @@ -1,50 +0,0 @@ -diff --git a/config.mk b/config.mk -index 957bae0..206a08c 100644 ---- a/config.mk -+++ b/config.mk -@@ -6,9 +6,13 @@ PREFIX = /usr/local - MANPREFIX = ${PREFIX}/share/man - DOCPREFIX = ${PREFIX}/share/doc - -+# On Solaris systems we still need to include some extra librarys namely "sockets" -+# Uncomment the next line if compiling on Solaris -+SOL_LIBS = -lsocket -+ - # on systems which provide strlcpy(3), - # remove NEED_STRLCPY from CFLAGS and - # remove strlcpy.o from LIBS - CFLAGS = -DNEED_STRLCPY -Os - LDFLAGS = -s --LIBS = strlcpy.o -+LIBS = strlcpy.o ${SOL_LIBS} -diff --git a/ii.c b/ii.c -index 6c87314..b174088 100644 ---- a/ii.c -+++ b/ii.c -@@ -338,7 +338,7 @@ loginuser(int ircfd, const char *host, const char *fullname) - static int - udsopen(const char *uds) - { -- struct sockaddr_un sun; -+ struct sockaddr_un sunn; - size_t len; - int fd; - -@@ -347,13 +347,13 @@ udsopen(const char *uds) - exit(1); - } - -- sun.sun_family = AF_UNIX; -- if (strlcpy(sun.sun_path, uds, sizeof(sun.sun_path)) >= sizeof(sun.sun_path)) { -+ sunn.sun_family = AF_UNIX; -+ if (strlcpy(sunn.sun_path, uds, sizeof(sunn.sun_path)) >= sizeof(sunn.sun_path)) { - fprintf(stderr, "%s: UNIX domain socket path truncation\n", argv0); - exit(1); - } -- len = strlen(sun.sun_path) + 1 + sizeof(sun.sun_family); -- if (connect(fd, (struct sockaddr *)&sun, len) == -1) { -+ len = strlen(sunn.sun_path) + 1 + sizeof(sunn.sun_family); -+ if (connect(fd, (struct sockaddr *)&sunn, len) == -1) { - fprintf(stderr, "%s: connect: %s\n", argv0, strerror(errno)); - exit(1); - } diff --git a/tools.suckless.org/ii/patches/solarisbuild/ii-solarisbuild-20180912-b25423f.diff b/tools.suckless.org/ii/patches/solarisbuild/ii-solarisbuild-20180912-b25423f.diff @@ -1,18 +1,7 @@ From d5b8f78857f62247f6efbccfb9382549d56ccf3e Mon Sep 17 00:00:00 2001 From: drowl <mail@catsnest.co.uk> Date: Wed, 12 Sep 2018 16:56:16 +0100 -Subject: [PATCH] =?UTF-8?q?Compiling=20ii.c=20on=20Solaris=20generated=20a?= - =?UTF-8?q?n=20error=20as=20per=20http://paste.debian.net/1041906/=20"ii.c?= - =?UTF-8?q?:341:21:=20error:=20expected=20identifier=20or=20=E2=80=98(?= - =?UTF-8?q?=E2=80=99=20before=20numeric=20constant"=20=20This=20seems=20to?= - =?UTF-8?q?=20be=20as=20"sun"=20is=20used=20else=20where,=20a=20simple=20f?= - =?UTF-8?q?ix=20was=20to=20rename=20it=20to=20"sunn"=20Also=20On=20Solaris?= - =?UTF-8?q?=20systems=20we=20still=20need=20to=20include=20some=20extra=20?= - =?UTF-8?q?librarys=20namely=20"sockets"=20so=20i=20added=20this=20to=20co?= - =?UTF-8?q?nfig.mk?= -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit +Subject: [PATCH] Compiling on solaris --- config.mk | 6 +++++- diff --git a/tools.suckless.org/ii/patches/solarisbuild/index.md b/tools.suckless.org/ii/patches/solarisbuild/index.md @@ -8,7 +8,6 @@ error. This simple patch fixed the issue for me on ii version 1.8. Download -------- -* [ii-1.8-solarisbuild.diff](ii-1.8-solarisbuild.diff) * [ii-solarisbuild-20180912-b25423f.diff](ii-solarisbuild-20180912-b25423f.diff) Author diff --git a/tools.suckless.org/slock/patches/message/index.md b/tools.suckless.org/slock/patches/message/index.md @@ -26,7 +26,7 @@ This adds three items to `config.h`: Download -------- -* [slock-message-20180626-8384a86.diff](slock-message-20180626-8384a86.diff) +* [slock-message-20180626-35633d4.diff](slock-message-20180626-35633d4.diff) Authors ------- diff --git a/tools.suckless.org/slock/patches/message/slock-message-20180626-8384a86.diff b/tools.suckless.org/slock/patches/message/slock-message-20180626-35633d4.diff diff --git a/tools.suckless.org/slock/patches/pam_auth/index.md b/tools.suckless.org/slock/patches/pam_auth/index.md @@ -10,10 +10,7 @@ service. The default configuration is for ArchLinux's `login` service. Download -------- -* [slock-pam\_auth-20161126-9909280.diff](slock-pam_auth-20161126-9909280.diff) -* [slock-pam\_auth-20161026-5974695.diff](slock-pam_auth-20161026-5974695.diff) -* [slock-pam\_auth-20160909-a7619f7.diff](slock-pam_auth-20160909-a7619f7.diff) -* [slock-pam\_auth.diff](slock-pam_auth.diff) +* [slock-pam\_auth-20190207-35633d4.diff](slock-pam_auth-20190207-35633d4.diff) Authors ------- diff --git a/tools.suckless.org/slock/patches/pam_auth/slock-pam_auth-20160909-a7619f7.diff b/tools.suckless.org/slock/patches/pam_auth/slock-pam_auth-20160909-a7619f7.diff @@ -1,158 +0,0 @@ -Author: Jan Christoph Ebersbach <jceb@e-jc.de> -URL: http://tools.suckless.org/slock/patches/pam_auth -Replaces shadow support with PAM authentication support. - -Change variable `pam_service` in `config.def.h` to the corresponding PAM -service. The default configuration is for ArchLinux's `login` service. - -Index: slock-patches/slock/config.def.h -=================================================================== ---- slock-patches.orig/slock/config.def.h -+++ slock-patches/slock/config.def.h -@@ -6,7 +6,11 @@ static const char *colorname[NUMCOLS] = - "black", /* after initialization */ - "#005577", /* during input */ - "#CC3333", /* wrong password */ -+ "#9400D3", /* waiting for PAM */ - }; - - /* treat a cleared input like a wrong password */ - static const int failonclear = 1; -+ -+/* PAM service that's used for authentication */ -+static const char* pam_service = "login"; -Index: slock-patches/slock/config.mk -=================================================================== ---- slock-patches.orig/slock/config.mk -+++ slock-patches/slock/config.mk -@@ -12,7 +12,7 @@ X11LIB = /usr/X11R6/lib - - # includes and libs - INCS = -I. -I/usr/include -I${X11INC} --LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr -+LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr -lpam - - # flags - CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -DHAVE_SHADOW_H -Index: slock-patches/slock/slock.c -=================================================================== ---- slock-patches.orig/slock/slock.c -+++ slock-patches/slock/slock.c -@@ -18,6 +18,8 @@ - #include <X11/keysym.h> - #include <X11/Xlib.h> - #include <X11/Xutil.h> -+#include <security/pam_appl.h> -+#include <security/pam_misc.h> - - #include "arg.h" - #include "util.h" -@@ -28,6 +30,7 @@ enum { - INIT, - INPUT, - FAILED, -+ PAM, - NUMCOLS - }; - -@@ -40,6 +43,9 @@ typedef struct { - unsigned long colors[NUMCOLS]; - } Lock; - -+static int pam_conv(int num_msg, const struct pam_message **msg, struct pam_response **resp, void *appdata_ptr); -+struct pam_conv pamc = {pam_conv, NULL}; -+char passwd[256]; - static Lock **locks; - static int nscreens; - static Bool rr; -@@ -119,18 +125,46 @@ getpw(void) - } - #endif /* HAVE_SHADOW_H */ - -+ /* pam, store user name */ -+ rval = pw->pw_name; - return rval; - } - -+static int -+pam_conv(int num_msg, const struct pam_message **msg, -+ struct pam_response **resp, void *appdata_ptr) -+{ -+ int retval = PAM_CONV_ERR; -+ for(int i=0; i<num_msg; i++) { -+ if (msg[i]->msg_style == PAM_PROMPT_ECHO_OFF && -+ strncmp(msg[i]->msg, "Password: ", 10) == 0) { -+ struct pam_response *resp_msg = malloc(sizeof(struct pam_response)); -+ if (!resp_msg) -+ die("malloc failed"); -+ char *password = malloc(strlen(passwd) + 1); -+ if (!password) -+ die("malloc failed"); -+ memset(password, 0, strlen(passwd) + 1); -+ strcpy(password, passwd); -+ resp_msg->resp_retcode = 0; -+ resp_msg->resp = password; -+ resp[i] = resp_msg; -+ retval = PAM_SUCCESS; -+ } -+ } -+ return retval; -+} -+ - static void - readpw(Display *dpy, const char *pws) - { -- char buf[32], passwd[256], *encrypted; -- int num, screen, running, failure; -+ char buf[32]; -+ int num, screen, running, failure, retval; - unsigned int len, color; - KeySym ksym; - XEvent ev; - static int oldc = INIT; -+ pam_handle_t *pamh; - - len = 0; - running = 1; -@@ -159,11 +193,26 @@ readpw(Display *dpy, const char *pws) - switch (ksym) { - case XK_Return: - passwd[len] = 0; -- errno = 0; -- if (!(encrypted = crypt(passwd, pws))) -- fprintf(stderr, "slock: crypt: %s\n", strerror(errno)); -+ retval = pam_start(pam_service, pws, &pamc, &pamh); -+ color = PAM; -+ for (screen = 0; screen < nscreens; screen++) { -+ XSetWindowBackground(dpy, locks[screen]->win, locks[screen]->colors[color]); -+ XClearWindow(dpy, locks[screen]->win); -+ XRaiseWindow(dpy, locks[screen]->win); -+ } -+ XSync(dpy, False); -+ -+ if (retval == PAM_SUCCESS) -+ retval = pam_authenticate(pamh, 0); -+ if (retval == PAM_SUCCESS) -+ retval = pam_acct_mgmt(pamh, 0); -+ -+ running = 1; -+ if (retval == PAM_SUCCESS) -+ running = 0; - else -- running = !!strcmp(encrypted, pws); -+ fprintf(stderr, "slock: %s\n", pam_strerror(pamh, retval)); -+ pam_end(pamh, retval); - if (running) { - XBell(dpy, 100); - failure = True; -@@ -344,9 +393,8 @@ main(int argc, char **argv) { - dontkillme(); - #endif - -+ /* the contents of pws are used to transport the current user name */ - pws = getpw(); -- if (strlen(pws) < 2) -- die("slock: failed to get user password hash.\n"); - - if (!(dpy = XOpenDisplay(NULL))) - die("slock: cannot open display\n"); diff --git a/tools.suckless.org/slock/patches/pam_auth/slock-pam_auth-20161026-5974695.diff b/tools.suckless.org/slock/patches/pam_auth/slock-pam_auth-20161026-5974695.diff @@ -1,161 +0,0 @@ -Author: Jan Christoph Ebersbach <jceb@e-jc.de> -URL: http://tools.suckless.org/slock/patches/pam_auth -Replaces shadow support with PAM authentication support. - -Change variable `pam_service` in `config.def.h` to the corresponding PAM -service. The default configuration is for ArchLinux's `login` service. - -Index: slock-patches/slock/config.def.h -=================================================================== ---- slock-patches.orig/slock/config.def.h -+++ slock-patches/slock/config.def.h -@@ -6,7 +6,11 @@ static const char *colorname[NUMCOLS] = - "black", /* after initialization */ - "#005577", /* during input */ - "#CC3333", /* wrong password */ -+ "#9400D3", /* waiting for PAM */ - }; - - /* treat a cleared input like a wrong password */ - static const int failonclear = 1; -+ -+/* PAM service that's used for authentication */ -+static const char* pam_service = "login"; -Index: slock-patches/slock/config.mk -=================================================================== ---- slock-patches.orig/slock/config.mk -+++ slock-patches/slock/config.mk -@@ -12,7 +12,7 @@ X11LIB = /usr/X11R6/lib - - # includes and libs - INCS = -I. -I/usr/include -I${X11INC} --LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr -+LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr -lpam - - # flags - CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -DHAVE_SHADOW_H -Index: slock-patches/slock/slock.c -=================================================================== ---- slock-patches.orig/slock/slock.c -+++ slock-patches/slock/slock.c -@@ -18,16 +18,22 @@ - #include <X11/keysym.h> - #include <X11/Xlib.h> - #include <X11/Xutil.h> -+#include <security/pam_appl.h> -+#include <security/pam_misc.h> - - #include "arg.h" - #include "util.h" - - char *argv0; -+static int pam_conv(int num_msg, const struct pam_message **msg, struct pam_response **resp, void *appdata_ptr); -+struct pam_conv pamc = {pam_conv, NULL}; -+char passwd[256]; - - enum { - INIT, - INPUT, - FAILED, -+ PAM, - NUMCOLS - }; - -@@ -57,6 +63,31 @@ die(const char *errstr, ...) - exit(1); - } - -+static int -+pam_conv(int num_msg, const struct pam_message **msg, -+ struct pam_response **resp, void *appdata_ptr) -+{ -+ int retval = PAM_CONV_ERR; -+ for(int i=0; i<num_msg; i++) { -+ if (msg[i]->msg_style == PAM_PROMPT_ECHO_OFF && -+ strncmp(msg[i]->msg, "Password: ", 10) == 0) { -+ struct pam_response *resp_msg = malloc(sizeof(struct pam_response)); -+ if (!resp_msg) -+ die("malloc failed\n"); -+ char *password = malloc(strlen(passwd) + 1); -+ if (!password) -+ die("malloc failed\n"); -+ memset(password, 0, strlen(passwd) + 1); -+ strcpy(password, passwd); -+ resp_msg->resp_retcode = 0; -+ resp_msg->resp = password; -+ resp[i] = resp_msg; -+ retval = PAM_SUCCESS; -+ } -+ } -+ return retval; -+} -+ - #ifdef __linux__ - #include <fcntl.h> - #include <linux/oom.h> -@@ -121,6 +152,8 @@ gethash(void) - } - #endif /* HAVE_SHADOW_H */ - -+ /* pam, store user name */ -+ hash = pw->pw_name; - return hash; - } - -@@ -129,11 +162,12 @@ readpw(Display *dpy, struct xrandr *rr, - const char *hash) - { - XRRScreenChangeNotifyEvent *rre; -- char buf[32], passwd[256], *inputhash; -- int num, screen, running, failure, oldc; -+ char buf[32]; -+ int num, screen, running, failure, oldc, retval; - unsigned int len, color; - KeySym ksym; - XEvent ev; -+ pam_handle_t *pamh; - - len = 0; - running = 1; -@@ -160,10 +194,26 @@ readpw(Display *dpy, struct xrandr *rr, - case XK_Return: - passwd[len] = '\0'; - errno = 0; -- if (!(inputhash = crypt(passwd, hash))) -- fprintf(stderr, "slock: crypt: %s\n", strerror(errno)); -+ retval = pam_start(pam_service, hash, &pamc, &pamh); -+ color = PAM; -+ for (screen = 0; screen < nscreens; screen++) { -+ XSetWindowBackground(dpy, locks[screen]->win, locks[screen]->colors[color]); -+ XClearWindow(dpy, locks[screen]->win); -+ XRaiseWindow(dpy, locks[screen]->win); -+ } -+ XSync(dpy, False); -+ -+ if (retval == PAM_SUCCESS) -+ retval = pam_authenticate(pamh, 0); -+ if (retval == PAM_SUCCESS) -+ retval = pam_acct_mgmt(pamh, 0); -+ -+ running = 1; -+ if (retval == PAM_SUCCESS) -+ running = 0; - else -- running = !!strcmp(inputhash, hash); -+ fprintf(stderr, "slock: %s\n", pam_strerror(pamh, retval)); -+ pam_end(pamh, retval); - if (running) { - XBell(dpy, 100); - failure = 1; -@@ -331,10 +381,9 @@ main(int argc, char **argv) { - dontkillme(); - #endif - -+ /* the contents of hash are used to transport the current user name */ - hash = gethash(); - errno = 0; -- if (!crypt("", hash)) -- die("slock: crypt: %s\n", strerror(errno)); - - if (!(dpy = XOpenDisplay(NULL))) - die("slock: cannot open display\n"); diff --git a/tools.suckless.org/slock/patches/pam_auth/slock-pam_auth-20161126-9909280.diff b/tools.suckless.org/slock/patches/pam_auth/slock-pam_auth-20190207-35633d4.diff diff --git a/tools.suckless.org/slock/patches/pam_auth/slock-pam_auth.diff b/tools.suckless.org/slock/patches/pam_auth/slock-pam_auth.diff @@ -1,137 +0,0 @@ -Author: Jan Christoph Ebersbach <jceb@e-jc.de> -URL: http://tools.suckless.org/slock/patches/pam_auth -Replaces shadow support with PAM authentication support. - -Change variable `pam_service` in `config.def.h` to the corresponding PAM -service. The default configuration is for ArchLinux's `login` service. - -diff --git a/config.def.h b/config.def.h -index eae2d9a..085968d 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -6,3 +6,6 @@ static const char *colorname[NUMCOLS] = { - - /* treat a cleared input like a wrong password */ - static const int failonclear = 1; -+ -+/* PAM service that's used for authentication */ -+static const char* pam_service = "login"; -diff --git a/config.mk b/config.mk -index f93879e..e054879 100644 ---- a/config.mk -+++ b/config.mk -@@ -12,7 +12,7 @@ X11LIB = /usr/X11R6/lib - - # includes and libs - INCS = -I. -I/usr/include -I${X11INC} --LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr -+LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr -lpam - - # flags - CPPFLAGS = -DVERSION=\"${VERSION}\" -DHAVE_SHADOW_H -diff --git a/slock.c b/slock.c -index c9cdee2..6fdfe2f 100644 ---- a/slock.c -+++ b/slock.c -@@ -17,6 +17,8 @@ - #include <X11/keysym.h> - #include <X11/Xlib.h> - #include <X11/Xutil.h> -+#include <security/pam_appl.h> -+#include <security/pam_misc.h> - - #if HAVE_BSD_AUTH - #include <login_cap.h> -@@ -39,6 +41,9 @@ typedef struct { - unsigned long colors[NUMCOLS]; - } Lock; - -+static int pam_conv(int num_msg, const struct pam_message **msg, struct pam_response **resp, void *appdata_ptr); -+struct pam_conv pamc = {pam_conv, NULL}; -+char passwd[256]; - static Lock **locks; - static int nscreens; - static Bool running = True; -@@ -112,6 +117,31 @@ getpw(void) - } - #endif - -+static int -+pam_conv(int num_msg, const struct pam_message **msg, -+ struct pam_response **resp, void *appdata_ptr) -+{ -+ int retval = PAM_CONV_ERR; -+ for(int i=0; i<num_msg; i++) { -+ if (msg[i]->msg_style == PAM_PROMPT_ECHO_OFF && -+ strncmp(msg[i]->msg, "Password: ", 10) == 0) { -+ struct pam_response *resp_msg = malloc(sizeof(struct pam_response)); -+ if (!resp_msg) -+ die("malloc failed"); -+ char *password = malloc(strlen(passwd) + 1); -+ if (!password) -+ die("malloc failed"); -+ memset(password, 0, strlen(passwd) + 1); -+ strcpy(password, passwd); -+ resp_msg->resp_retcode = 0; -+ resp_msg->resp = password; -+ resp[i] = resp_msg; -+ retval = PAM_SUCCESS; -+ } -+ } -+ return retval; -+} -+ - static void - #ifdef HAVE_BSD_AUTH - readpw(Display *dpy) -@@ -119,12 +149,15 @@ readpw(Display *dpy) - readpw(Display *dpy, const char *pws) - #endif - { -- char buf[32], passwd[256]; -- int num, screen; -+ char buf[32]; -+ struct passwd* pw; -+ int num, screen, retval; - unsigned int len, color; - KeySym ksym; - XEvent ev; - static int oldc = INIT; -+ pam_handle_t *pamh; -+ - - len = 0; - running = True; -@@ -155,7 +188,19 @@ readpw(Display *dpy, const char *pws) - #ifdef HAVE_BSD_AUTH - running = !auth_userokay(getlogin(), NULL, "auth-xlock", passwd); - #else -- running = !!strcmp(crypt(passwd, pws), pws); -+ pw = getpwuid(getuid()); -+ retval = pam_start(pam_service, pw->pw_name, &pamc, &pamh); -+ if (retval == PAM_SUCCESS) -+ retval = pam_authenticate(pamh, 0); -+ if (retval == PAM_SUCCESS) -+ retval = pam_acct_mgmt(pamh, 0); -+ -+ running = 1; -+ if (retval == PAM_SUCCESS) -+ running = 0; -+ else -+ fprintf(stderr, "slock: %s\n", pam_strerror(pamh, retval)); -+ pam_end(pamh, retval); - #endif - if (running) { - XBell(dpy, 100); -@@ -299,10 +344,10 @@ main(int argc, char **argv) { - dontkillme(); - #endif - -+#ifndef HAVE_BSD_AUTH - if (!getpwuid(getuid())) - die("no passwd entry for you\n"); - --#ifndef HAVE_BSD_AUTH - pws = getpw(); - #endif -