From 0243a59c57350a3dbd3154fa929ee165dcf0b68a Mon Sep 17 00:00:00 2001 From: Max Schillinger Date: Sun, 27 Dec 2020 15:04:08 +0100 Subject: [PATCH] add patch/function 'goback' --- config.def.h | 1 + dwm.c | 31 +++++++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/config.def.h b/config.def.h index 36d57e9..ed3e76c 100644 --- a/config.def.h +++ b/config.def.h @@ -85,6 +85,7 @@ static const Key keys[] = { { MODKEY, XK_l, setmfact, {.f = +0.05} }, { MODKEY, XK_Return, zoom, {0} }, { MODKEY, XK_Tab, view, {0} }, + { MODKEY, XK_g, goback, {0} }, { MODKEY|ShiftMask, XK_c, killclient, {0} }, { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, diff --git a/dwm.c b/dwm.c index 3930eee..f7a031b 100644 --- a/dwm.c +++ b/dwm.c @@ -180,6 +180,7 @@ 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 goback(const Arg *arg); static void grabbuttons(Client *c, int focused); static void grabkeys(void); static void hide(const Arg *arg); @@ -287,7 +288,7 @@ static Cur *cursor[CurLast]; static Clr **scheme, **schemedark, **schemelight; static Display *dpy; static Drw *drw; -static Monitor *mons, *selmon; +static Monitor *mons, *selmon, *prevmon; static Window root, wmcheckwin; static const char **dmenucmd; static int colormodechanged; @@ -452,6 +453,7 @@ buttonpress(XEvent *e) /* focus monitor if necessary */ if ((m = wintomon(ev->window)) && m != selmon) { unfocus(selmon->sel, 1); + prevmon = selmon; selmon = m; focus(NULL); } @@ -840,6 +842,7 @@ enternotify(XEvent *e) m = c ? c->mon : wintomon(ev->window); if (m != selmon) { unfocus(selmon->sel, 1); + prevmon = selmon; selmon = m; } else if (!c || c == selmon->sel) return; @@ -872,8 +875,10 @@ focus(Client *c) } } if (c) { - if (c->mon != selmon) + if (c->mon != selmon) { + prevmon = selmon; selmon = c->mon; + } if (c->isurgent) seturgent(c, 0); detachstack(c); @@ -909,6 +914,7 @@ focusmon(const Arg *arg) if ((m = dirtomon(arg->i)) == selmon) return; unfocus(selmon->sel, 0); + prevmon = selmon; selmon = m; focus(NULL); warp(selmon->sel); @@ -1031,6 +1037,21 @@ gettextprop(Window w, Atom atom, char *text, unsigned int size) return 1; } +void +goback(const Arg *arg) +{ + if (prevmon == NULL) { + Arg a = {0}; + view(&a); + } else if (prevmon != selmon) { + unfocus(selmon->sel, 0); + Monitor *p = selmon; + selmon = prevmon; + focus(NULL); + prevmon = p; + } +} + void grabbuttons(Client *c, int focused) { @@ -1291,6 +1312,8 @@ motionnotify(XEvent *e) return; if ((m = recttomon(ev->x_root, ev->y_root, 1, 1)) != mon && mon) { unfocus(selmon->sel, 1); + if (m != selmon) + prevmon = selmon; selmon = m; focus(NULL); } @@ -1352,6 +1375,7 @@ movemouse(const Arg *arg) XUngrabPointer(dpy, CurrentTime); if ((m = recttomon(c->x, c->y, c->w, c->h)) != selmon) { sendmon(c, m); + prevmon = selmon; selmon = m; focus(NULL); } @@ -1543,6 +1567,7 @@ resizemouse(const Arg *arg) while (XCheckMaskEvent(dpy, EnterWindowMask, &ev)); if ((m = recttomon(c->x, c->y, c->w, c->h)) != selmon) { sendmon(c, m); + prevmon = selmon; selmon = m; focus(NULL); } @@ -2081,6 +2106,7 @@ toggleview(const Arg *arg) unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK); if (newtagset) { + prevmon = NULL; selmon->tagset[selmon->seltags] = newtagset; focus(NULL); arrange(selmon); @@ -2409,6 +2435,7 @@ view(const Arg *arg) { if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) return; + prevmon = NULL; selmon->seltags ^= 1; /* toggle sel tagset */ if (arg->ui & TAGMASK) selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;