Greetings.

On 01.11.2011 11:59, Connor Lane Smith wrote:
> It would also be nice if dwm supported _NET_WM_WINDOW_TYPE hints as
> well, so we can make _NET_WM_WINDOW_TYPE_DIALOG windows float. (We
> could steal the updatewindowtype() function from Christoph Lohmann's
> dock patch.)

Attached is a quick patch to make dwm DIALOG-agnostic. I don't
have a certain test window to try it out, so please test before
applying it.


Sincerely,

Christoph Lohmann
# HG changeset patch
# User Christoph Lohmann <2...@r-36.net>
# Date 1320161309 -3600
# Node ID e5464b692b020c4e87dae05bb1a1a760f168c9a5
# Parent  904e923827cb010abb7a31298264548946616d92
Adding WindowType and initial Dialog type support.

diff -r 904e923827cb -r e5464b692b02 dwm.c
--- a/dwm.c	Mon Oct 31 20:09:27 2011 +0100
+++ b/dwm.c	Tue Nov 01 16:28:29 2011 +0100
@@ -58,7 +58,8 @@
 enum { CurNormal, CurResize, CurMove, CurLast };        /* cursor */
 enum { ColBorder, ColFG, ColBG, ColLast };              /* color */
 enum { NetSupported, NetWMName, NetWMState,
-       NetWMFullscreen, NetActiveWindow, NetLast };     /* EWMH atoms */
+       NetWMFullscreen, NetActiveWindow, NetWMWindowType,
+       NetWMWindowTypeDialog, NetLast };     /* EWMH atoms */
 enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */
 enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle,
        ClkClientWin, ClkRootWin, ClkLast };             /* clicks */
@@ -237,6 +238,7 @@
 static void updatenumlockmask(void);
 static void updatesizehints(Client *c);
 static void updatestatus(void);
+static void updatewindowtype(Client *c);
 static void updatetitle(Client *c);
 static void updatewmhints(Client *c);
 static void view(const Arg *arg);
@@ -1152,6 +1154,7 @@
 	XConfigureWindow(dpy, w, CWBorderWidth, &wc);
 	XSetWindowBorder(dpy, w, dc.norm[ColBorder]);
 	configure(c); /* propagates border_width, if size doesn't change */
+	updatewindowtype(c);
 	updatesizehints(c);
 	updatewmhints(c);
 	XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask);
@@ -1308,6 +1311,8 @@
 			if(c == c->mon->sel)
 				drawbar(c->mon);
 		}
+		if(ev->atom == netatom[NetWMWindowType])
+			updatewindowtype(c);
 	}
 }
 
@@ -1562,6 +1567,8 @@
 	netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False);
 	netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False);
 	netatom[NetWMFullscreen] = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False);
+	netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False);
+	netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False);
 	/* init cursors */
 	cursor[CurNormal] = XCreateFontCursor(dpy, XC_left_ptr);
 	cursor[CurResize] = XCreateFontCursor(dpy, XC_sizing);
@@ -1967,6 +1974,26 @@
 }
 
 void
+updatewindowtype(Client *c)
+{
+	Atom wtype, real;
+	int format;
+	unsigned long n, extra;
+	unsigned char *p = NULL;
+
+	if(XGetWindowProperty(dpy, c->win, netatom[NetWMWindowType], 0L,
+				sizeof(Atom), False, XA_ATOM, &real, &format,
+				&n, &extra, (unsigned char **)&p) == Success
+			&& p) {
+		wtype = *(Atom *)p;
+		XFree(p);
+
+		if(wtype == netatom[NetWMWindowTypeDialog])
+			c->isfloating = True;
+	}
+}
+
+void
 updatewmhints(Client *c) {
 	XWMHints *wmh;
 

Reply via email to