[hackers] [dwm] applied Brendan MacDonell's WM_TAKE_FOCUS patch, thanks Brendan! || Anselm R Garbe

From: <hg_AT_suckless.org>
Date: Tue, 12 Apr 2011 22:19:34 +0200 (CEST)

changeset: 1534:7e2a8fec8d6c
tag: tip
user: Anselm R Garbe <anselm_AT_garbe.us>
date: Tue Apr 12 20:19:32 2011 +0000
files: dwm.c
description:
applied Brendan MacDonell's WM_TAKE_FOCUS patch, thanks Brendan!

diff -r ba7d976f74d3 -r 7e2a8fec8d6c dwm.c
--- a/dwm.c Fri Mar 25 14:06:46 2011 +0000
+++ b/dwm.c Tue Apr 12 20:19:32 2011 +0000
@@ -59,7 +59,7 @@
 enum { ColBorder, ColFG, ColBG, ColLast }; /* color */
 enum { NetSupported, NetWMName, NetWMState,
        NetWMFullscreen, NetLast }; /* EWMH atoms */
-enum { WMProtocols, WMDelete, WMState, WMLast }; /* default atoms */
+enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */
 enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle,
        ClkClientWin, ClkRootWin, ClkLast }; /* clicks */
 
@@ -88,7 +88,7 @@
         int basew, baseh, incw, inch, maxw, maxh, minw, minh;
         int bw, oldbw;
         unsigned int tags;
- Bool isfixed, isfloating, isurgent, oldstate;
+ Bool isfixed, isfloating, isurgent, neverfocus, oldstate;
         Client *next;
         Client *snext;
         Monitor *mon;
@@ -190,7 +190,6 @@
 static void grabbuttons(Client *c, Bool focused);
 static void grabkeys(void);
 static void initfont(const char *fontstr);
-static Bool isprotodel(Client *c);
 static void keypress(XEvent *e);
 static void killclient(const Arg *arg);
 static void manage(Window w, XWindowAttributes *wa);
@@ -208,8 +207,10 @@
 static void restack(Monitor *m);
 static void run(void);
 static void scan(void);
+static Bool sendevent(Client *c, Atom proto);
 static void sendmon(Client *c, Monitor *m);
 static void setclientstate(Client *c, long state);
+static void setfocus(Client *c);
 static void setlayout(const Arg *arg);
 static void setmfact(const Arg *arg);
 static void setup(void);
@@ -821,7 +822,7 @@
                 attachstack(c);
                 grabbuttons(c, True);
                 XSetWindowBorder(dpy, c->win, dc.sel[ColBorder]);
- XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
+ setfocus(c);
         }
         else
                 XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
@@ -834,7 +835,7 @@
         XFocusChangeEvent *ev = &e->xfocus;
 
         if(selmon->sel && ev->window != selmon->sel->win)
- XSetInputFocus(dpy, selmon->sel->win, RevertToPointerRoot, CurrentTime);
+ setfocus(selmon->sel);
 }
 
 void
@@ -1012,20 +1013,6 @@
         dc.font.height = dc.font.ascent + dc.font.descent;
 }
 
-Bool
-isprotodel(Client *c) {
- int n;
- Atom *protocols;
- Bool ret = False;
-
- if(XGetWMProtocols(dpy, c->win, &protocols, &n)) {
- while(!ret && n--)
- ret = protocols[n] == wmatom[WMDelete];
- XFree(protocols);
- }
- return ret;
-}
-
 #ifdef XINERAMA
 static Bool
 isuniquegeom(XineramaScreenInfo *unique, size_t n, XineramaScreenInfo *info) {
@@ -1054,20 +1041,9 @@
 
 void
 killclient(const Arg *arg) {
- XEvent ev;
-
         if(!selmon->sel)
                 return;
- if(isprotodel(selmon->sel)) {
- ev.type = ClientMessage;
- ev.xclient.window = selmon->sel->win;
- ev.xclient.message_type = wmatom[WMProtocols];
- ev.xclient.format = 32;
- ev.xclient.data.l[0] = wmatom[WMDelete];
- ev.xclient.data.l[1] = CurrentTime;
- XSendEvent(dpy, selmon->sel->win, False, NoEventMask, &ev);
- }
- else {
+ if(!sendevent(selmon->sel, wmatom[WMDelete])) {
                 XGrabServer(dpy);
                 XSetErrorHandler(xerrordummy);
                 XSetCloseDownMode(dpy, DestroyAll);
@@ -1124,6 +1100,7 @@
         XSetWindowBorder(dpy, w, dc.norm[ColBorder]);
         configure(c); /* propagates border_width, if size doesn't change */
         updatesizehints(c);
+ updatewmhints(c);
         XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask);
         grabbuttons(c, False);
         if(!c->isfloating)
@@ -1471,6 +1448,37 @@
                         PropModeReplace, (unsigned char *)data, 2);
 }
 
+Bool
+sendevent(Client *c, Atom proto) {
+ int n;
+ Atom *protocols;
+ Bool exists = False;
+ XEvent ev;
+
+ if(XGetWMProtocols(dpy, c->win, &protocols, &n)) {
+ while(!exists && n--)
+ exists = protocols[n] == proto;
+ XFree(protocols);
+ }
+ if (exists) {
+ ev.type = ClientMessage;
+ ev.xclient.window = c->win;
+ ev.xclient.message_type = wmatom[WMProtocols];
+ ev.xclient.format = 32;
+ ev.xclient.data.l[0] = proto;
+ ev.xclient.data.l[1] = CurrentTime;
+ XSendEvent(dpy, c->win, False, NoEventMask, &ev);
+ }
+ return exists;
+}
+
+void
+setfocus(Client *c) {
+ if (!c->neverfocus)
+ XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
+ sendevent(c, wmatom[WMTakeFocus]);
+}
+
 void
 setlayout(const Arg *arg) {
         if(!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
@@ -1517,6 +1525,7 @@
         wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False);
         wmatom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False);
         wmatom[WMState] = XInternAtom(dpy, "WM_STATE", False);
+ wmatom[WMTakeFocus] = XInternAtom(dpy, "WM_TAKE_FOCUS", False);
         netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False);
         netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False);
         netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False);
@@ -1933,6 +1942,8 @@
                 }
                 else
                         c->isurgent = (wmh->flags & XUrgencyHint) ? True : False;
+ if (wmh->flags & InputHint) c->neverfocus = !wmh->input;
+ else c->neverfocus = False;
                 XFree(wmh);
         }
 }
Received on Tue Apr 12 2011 - 22:19:34 CEST

This archive was generated by hypermail 2.2.0 : Tue Apr 12 2011 - 22:24:07 CEST