applied Peter/Andreas NetActiveWindow patch in a slightly modified version - dwm - dynamic window manager
 (HTM) git clone https://git.parazyd.org/dwm
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 3c2d303c0e8efc9a08f2e70867794b003b886810
 (DIR) parent 1e20a0f78a580ebf4ad521d0e074125bb0a7d4b8
 (HTM) Author: Anselm R Garbe <anselm@garbe.us>
       Date:   Thu, 14 Apr 2011 13:46:25 +0000
       
       applied Peter/Andreas NetActiveWindow patch in a slightly modified version
       Diffstat:
         M dwm.c                               |      31 ++++++++++++++++++++++---------
       
       1 file changed, 22 insertions(+), 9 deletions(-)
       ---
 (DIR) diff --git a/dwm.c b/dwm.c
       @@ -58,7 +58,7 @@
        enum { CurNormal, CurResize, CurMove, CurLast };        /* cursor */
        enum { ColBorder, ColFG, ColBG, ColLast };              /* color */
        enum { NetSupported, NetWMName, NetWMState,
       -       NetWMFullscreen, NetLast };                      /* EWMH atoms */
       +       NetWMFullscreen, NetActiveWindow, NetLast };     /* EWMH atoms */
        enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */
        enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle,
               ClkClientWin, ClkRootWin, ClkLast };             /* clicks */
       @@ -1259,11 +1259,11 @@ propertynotify(XEvent *e) {
        void
        clientmessage(XEvent *e) {
                XClientMessageEvent *cme = &e->xclient;
       -        Client *c;
       +        Client *c = wintoclient(cme->window);
        
       -        if((c = wintoclient(cme->window))
       -        && (cme->message_type == netatom[NetWMState] && cme->data.l[1] == netatom[NetWMFullscreen]))
       -        {
       +        if(!c)
       +                return;
       +        if(cme->message_type == netatom[NetWMState] && cme->data.l[1] == netatom[NetWMFullscreen]) {
                        if(cme->data.l[0]) {
                                XChangeProperty(dpy, cme->window, netatom[NetWMState], XA_ATOM, 32,
                                                PropModeReplace, (unsigned char*)&netatom[NetWMFullscreen], 1);
       @@ -1287,6 +1287,16 @@ clientmessage(XEvent *e) {
                                arrange(c->mon);
                        }
                }
       +        else if(cme->message_type == netatom[NetActiveWindow]) {
       +                if(!ISVISIBLE(c)) {
       +                        Arg a = { .ui = c->tags };
       +                        view(&a); 
       +                }
       +                detach(c);
       +                attach(c);
       +                focus(c);
       +                arrange(c->mon);
       +        }
        }
        
        void
       @@ -1460,7 +1470,7 @@ sendevent(Client *c, Atom proto) {
                                exists = protocols[n] == proto;
                        XFree(protocols);
                }
       -        if (exists) {
       +        if(exists) {
                        ev.type = ClientMessage;
                        ev.xclient.window = c->win;
                        ev.xclient.message_type = wmatom[WMProtocols];
       @@ -1474,7 +1484,7 @@ sendevent(Client *c, Atom proto) {
        
        void
        setfocus(Client *c) {
       -        if (!c->neverfocus)
       +        if(!c->neverfocus)
                        XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
                sendevent(c, wmatom[WMTakeFocus]);
        }
       @@ -1525,6 +1535,7 @@ setup(void) {
                wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False);
                wmatom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False);
                wmatom[WMState] = XInternAtom(dpy, "WM_STATE", False);
       +        netatom[NetActiveWindow] = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False);
                wmatom[WMTakeFocus] = XInternAtom(dpy, "WM_TAKE_FOCUS", False);
                netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False);
                netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False);
       @@ -1942,8 +1953,10 @@ updatewmhints(Client *c) {
                        }
                        else
                                c->isurgent = (wmh->flags & XUrgencyHint) ? True : False;
       -                if (wmh->flags & InputHint) c->neverfocus = !wmh->input;
       -                else                        c->neverfocus = False;
       +                if(wmh->flags & InputHint)
       +                        c->neverfocus = !wmh->input;
       +                else
       +                        c->neverfocus = False;
                        XFree(wmh);
                }
        }