diff -Naur dwm-6.1/config.def.h dwm-6.1-patched/config.def.h --- dwm-6.1/config.def.h 2015-12-29 21:11:08.256735537 +0800 +++ dwm-6.1-patched/config.def.h 2015-12-29 21:08:01.453396528 +0800 @@ -15,6 +15,8 @@ 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 char normmarkcolor[] = "#775500"; +static const char selmarkcolor[] = "#775577"; /* tagging */ static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; @@ -59,6 +61,7 @@ static Key keys[] = { /* modifier key function argument */ + { MODKEY, XK_semicolon, setmark, {.i = 1 } }, { MODKEY, XK_p, spawn, {.v = dmenucmd } }, { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, { MODKEY, XK_b, togglebar, {0} }, @@ -68,7 +71,7 @@ { MODKEY, XK_d, incnmaster, {.i = -1 } }, { MODKEY, XK_h, setmfact, {.f = -0.05} }, { MODKEY, XK_l, setmfact, {.f = +0.05} }, - { MODKEY, XK_Return, zoom, {0} }, + { MODKEY, XK_Return, swap, {0} }, { MODKEY, XK_Tab, view, {0} }, { MODKEY|ShiftMask, XK_c, killclient, {0} }, { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, diff -Naur dwm-6.1/drw.h dwm-6.1-patched/drw.h --- dwm-6.1/drw.h 2015-11-09 06:39:37.000000000 +0800 +++ dwm-6.1-patched/drw.h 2015-12-29 20:54:42.326705599 +0800 @@ -23,6 +23,7 @@ Clr *fg; Clr *bg; Clr *border; + Clr *mark; } ClrScheme; typedef struct { diff -Naur dwm-6.1/dwm.c dwm-6.1-patched/dwm.c --- dwm-6.1/dwm.c 2015-11-09 06:39:37.000000000 +0800 +++ dwm-6.1-patched/dwm.c 2015-12-29 21:04:14.223389631 +0800 @@ -233,6 +233,8 @@ static int xerrordummy(Display *dpy, XErrorEvent *ee); static int xerrorstart(Display *dpy, XErrorEvent *ee); static void zoom(const Arg *arg); +static void setmark(const Arg *arg); +static void swap(const Arg *arg); /* variables */ static const char broken[] = "broken"; @@ -266,6 +268,7 @@ static Drw *drw; static Monitor *mons, *selmon; static Window root; +static Client *mark; /* configuration, allows nested code to access above variables */ #include "config.h" @@ -485,6 +488,7 @@ drw_clr_free(scheme[i].border); drw_clr_free(scheme[i].bg); drw_clr_free(scheme[i].fg); + drw_clr_free(scheme[i].mark); } drw_free(drw); XSync(dpy, False); @@ -807,7 +811,10 @@ detachstack(c); attachstack(c); grabbuttons(c, 1); - XSetWindowBorder(dpy, c->win, scheme[SchemeSel].border->pix); + if (c == mark) + XSetWindowBorder(dpy, c->win, scheme[SchemeSel].mark->pix); + else + XSetWindowBorder(dpy, c->win, scheme[SchemeSel].border->pix); setfocus(c); } else { XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); @@ -1018,6 +1025,8 @@ { if (!selmon->sel) return; + if (mark == selmon->sel) + setmark(0); if (!sendevent(selmon->sel, wmatom[WMDelete])) { XGrabServer(dpy); XSetErrorHandler(xerrordummy); @@ -1065,7 +1074,10 @@ wc.border_width = c->bw; XConfigureWindow(dpy, w, CWBorderWidth, &wc); - XSetWindowBorder(dpy, w, scheme[SchemeNorm].border->pix); + if (c == mark) + XSetWindowBorder(dpy, w, scheme[SchemeNorm].mark->pix); + else + XSetWindowBorder(dpy, w, scheme[SchemeNorm].border->pix); configure(c); /* propagates border_width, if size doesn't change */ updatewindowtype(c); updatesizehints(c); @@ -1583,9 +1595,11 @@ scheme[SchemeNorm].border = drw_clr_create(drw, normbordercolor); scheme[SchemeNorm].bg = drw_clr_create(drw, normbgcolor); scheme[SchemeNorm].fg = drw_clr_create(drw, normfgcolor); + scheme[SchemeNorm].mark = drw_clr_create(drw, normmarkcolor); scheme[SchemeSel].border = drw_clr_create(drw, selbordercolor); scheme[SchemeSel].bg = drw_clr_create(drw, selbgcolor); scheme[SchemeSel].fg = drw_clr_create(drw, selfgcolor); + scheme[SchemeSel].mark = drw_clr_create(drw, selmarkcolor); /* init bars */ updatebars(); updatestatus(); @@ -1745,7 +1759,10 @@ if (!c) return; grabbuttons(c, 0); - XSetWindowBorder(dpy, c->win, scheme[SchemeNorm].border->pix); + if (c == mark) + XSetWindowBorder(dpy, c->win, scheme[SchemeNorm].mark->pix); + else + XSetWindowBorder(dpy, c->win, scheme[SchemeNorm].border->pix); if (setfocus) { XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); XDeleteProperty(dpy, root, netatom[NetActiveWindow]); @@ -2120,6 +2137,62 @@ pop(c); } +void +setmark(const Arg *arg) +{ + if (!selmon->sel) { + return; + } + if (selmon->sel == mark) { + XSetWindowBorder(dpy, mark->win, scheme[SchemeSel].border->pix); + mark = 0; + } else { + if (mark) { + XSetWindowBorder(dpy, mark->win, scheme[SchemeNorm].border->pix); + mark = 0; + } + if (arg && arg->i) { + XSetWindowBorder(dpy, selmon->sel->win, scheme[SchemeSel].mark->pix); + mark = selmon->sel; + } + } +} + +void +swap(const Arg *arg) +{ + Client *sel, c; + + if (!mark) { + zoom(0); + return; + } + sel = selmon->sel; + if (!sel || !selmon->lt[selmon->sellt]->arrange) + return; + if (mark == sel) { + setmark(0); + return; + } + c = *sel; + strcpy(sel->name, mark->name); + strcpy(mark->name, c.name); + sel->win = mark->win; + mark->win = c.win; + + XMoveResizeWindow(dpy, sel->win, sel->x + 2 * sw, sel->y, sel->w, sel->h); + arrange(sel->mon); + XMapWindow(dpy, sel->win); + XMoveResizeWindow(dpy, mark->win, mark->x + 2 * sw, mark->y, mark->w, mark->h); + arrange(mark->mon); + XMapWindow(dpy, mark->win); + + selmon->sel = mark; + mark = sel; + focus(sel); + setmark(0); +} + int main(int argc, char *argv[]) {