Re: [dev] About DWM Swapfocus patch

From: Tom Schwindl <schwindl_AT_posteo.de>
Date: Fri, 11 Nov 2022 13:41:55 +0000

Hi Andre,

On Wed Nov 2, 2022 at 4:56 PM CET, Dr. André Desgualdo Pereira wrote:
> The swapfocus patch works as intended when we have changed the focus on the same tag. But when coming from another tag, the swapfocus does nothing.
>
> Example: suppose the focus is on a window at tag 2, then I manyally focus another window on another tag (say 3). Now if I try to swapfocus (Mod+S) the focus doesn't change back to the previous window.
>
> Any ideas on how to enable the swapfocus even if the previously focused window is in another tag?
>

To make sure I understand you correctly, does the following example apply to
your situation? (I use dwm-6.4 and default keybindings here)

tag 1: st
tag 2: browser

You currently are on tag 1 and switch to tag 2 (Mod+2), now your browser is
focused. Then you press Mod+s and expect st to somehow show up and obtain
the focus, right?

This is a bit ambiguous, since there are multiple ways this could happen:
  - move st to tag 2
  - view tag 1 alongside with tag 2 (equivalent to Mod+ctrl+1)
  - switch to tag 1 (equivalent to Mod+1)

I think the last one is the most useful solution, so I inlined the updated
patch to match this behaviour. Let me know if that's what you meant.

--
Best Regards,
Tom Schwindl
diff --git a/dwm.c b/dwm.c
index 253aba7b6f7d..c5dd6db5c84c 100644
--- a/dwm.c
+++ b/dwm.c
_AT_@ -207,6 +207,7 @@ static void seturgent(Client *c, int urg);
 static void showhide(Client *c);
 static void sigchld(int unused);
 static void spawn(const Arg *arg);
+static void swapfocus(const Arg *arg);
 static void tag(const Arg *arg);
 static void tagmon(const Arg *arg);
 static void tile(Monitor *m);
_AT_@ -236,6 +237,7 @@ static int xerrorstart(Display *dpy, XErrorEvent *ee);
 static void zoom(const Arg *arg);
 
 /* variables */
+static Client *prevclient;
 static const char broken[] = "broken";
 static char stext[256];
 static int screen;
_AT_@ -1650,6 +1652,22 @@ spawn(const Arg *arg)
 	}
 }
 
+void
+swapfocus(const Arg *arg)
+{
+	Client *c;
+	Arg tmp;
+
+	for (c = selmon->clients; c && c != prevclient; c = c->next)
+		;
+	if (c == prevclient) {
+		tmp.ui = (prevclient->tags & TAGMASK);
+		view(&tmp);
+		focus(prevclient);
+		restack(prevclient->mon);
+	}
+}
+
 void
 tag(const Arg *arg)
 {
_AT_@ -1751,6 +1769,7 @@ unfocus(Client *c, int setfocus)
 {
 	if (!c)
 		return;
+	prevclient = c;
 	grabbuttons(c, 0);
 	XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColBorder].pixel);
 	if (setfocus) {
_AT_@ -2116,10 +2135,11 @@ void
 zoom(const Arg *arg)
 {
 	Client *c = selmon->sel;
+	prevclient = nexttiled(selmon->clients);
 
 	if (!selmon->lt[selmon->sellt]->arrange || !c || c->isfloating)
 		return;
-	if (c == nexttiled(selmon->clients) && !(c = nexttiled(c->next)))
+	if (c == nexttiled(selmon->clients) && !(c = prevclient = nexttiled(c->next)))
 		return;
 	pop(c);
 }
Received on Fri Nov 11 2022 - 14:41:55 CET

This archive was generated by hypermail 2.3.0 : Fri Nov 11 2022 - 14:48:09 CET