applied Peter/Andreas NetActiveWindow patch in a slightly modified version - dwm - dynamic window manager HTML git clone https://git.parazyd.org/dwm DIR Log DIR Files DIR Refs DIR README DIR LICENSE --- DIR commit 3c2d303c0e8efc9a08f2e70867794b003b886810 DIR parent 1e20a0f78a580ebf4ad521d0e074125bb0a7d4b8 HTML 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); } }