added swap focus patch

This commit is contained in:
Alexander Bocken 2020-07-02 20:40:51 +02:00
parent cfaf290634
commit 2b78825cf1
2 changed files with 83 additions and 1 deletions

17
dwm.c
View File

@ -207,6 +207,7 @@ static void seturgent(Client *c, int urg);
static void showhide(Client *c); static void showhide(Client *c);
static void sigchld(int unused); static void sigchld(int unused);
static void spawn(const Arg *arg); static void spawn(const Arg *arg);
static void swapfocus();
static void tag(const Arg *arg); static void tag(const Arg *arg);
static void tagmon(const Arg *arg); static void tagmon(const Arg *arg);
static void tile(Monitor *); static void tile(Monitor *);
@ -241,6 +242,7 @@ static void bstack(Monitor *m);
static void bstackhoriz(Monitor *m); static void bstackhoriz(Monitor *m);
/* variables */ /* variables */
static Client *prevclient = NULL;
static const char broken[] = "broken"; static const char broken[] = "broken";
static char stext[256]; static char stext[256];
static int screen; static int screen;
@ -1672,6 +1674,17 @@ spawn(const Arg *arg)
} }
} }
void
swapfocus()
{
Client *c;
for(c = selmon->clients; c && c != prevclient; c = c->next) ;
if(c == prevclient) {
focus(prevclient);
restack(prevclient->mon);
}
}
void void
tag(const Arg *arg) tag(const Arg *arg)
{ {
@ -1789,6 +1802,7 @@ unfocus(Client *c, int setfocus)
{ {
if (!c) if (!c)
return; return;
prevclient = c;
grabbuttons(c, 0); grabbuttons(c, 0);
XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColBorder].pixel); XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColBorder].pixel);
if (setfocus) { if (setfocus) {
@ -2177,12 +2191,13 @@ void
zoom(const Arg *arg) zoom(const Arg *arg)
{ {
Client *c = selmon->sel; Client *c = selmon->sel;
prevclient = nexttiled(selmon->clients);
if (!selmon->lt[selmon->sellt]->arrange if (!selmon->lt[selmon->sellt]->arrange
|| (selmon->sel && selmon->sel->isfloating)) || (selmon->sel && selmon->sel->isfloating))
return; return;
if (c == nexttiled(selmon->clients)) if (c == nexttiled(selmon->clients))
if (!c || !(c = nexttiled(c->next))) if (!c || !(c = prevclient = nexttiled(c->next)))
return; return;
pop(c); pop(c);
} }

View File

@ -0,0 +1,67 @@
Author: Jan Christoph Ebersbach <jceb@e-jc.de>
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.
Index: dwm/dwm.c
===================================================================
--- dwm/dwm.c.orig
+++ dwm/dwm.c
@@ -207,6 +207,7 @@ static void setup(void);
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 void tile(Monitor *);
@@ -236,6 +237,7 @@ static int xerrorstart(Display *dpy, XEr
static void zoom(const Arg *arg);
/* variables */
+static Client *prevclient = NULL;
static const char broken[] = "broken";
static char stext[256];
static int screen;
@@ -1645,6 +1647,17 @@ spawn(const Arg *arg)
}
void
+swapfocus()
+{
+ Client *c;
+ for(c = selmon->clients; c && c != prevclient; c = c->next) ;
+ if(c == prevclient) {
+ focus(prevclient);
+ restack(prevclient->mon);
+ }
+}
+
+void
tag(const Arg *arg)
{
if (selmon->sel && arg->ui & TAGMASK) {
@@ -1743,6 +1756,7 @@ unfocus(Client *c, int setfocus)
{
if (!c)
return;
+ prevclient = c;
grabbuttons(c, 0);
XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColBorder].pixel);
if (setfocus) {
@@ -2109,12 +2123,13 @@ void
zoom(const Arg *arg)
{
Client *c = selmon->sel;
+ prevclient = nexttiled(selmon->clients);
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 || !(c = prevclient = nexttiled(c->next)))
return;
pop(c);
}