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
@@ -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);
@@ -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;
@@ -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)
 {
@@ -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) {
@@ -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);
 }


Reply via email to