summary refs log tree commit diff
diff options
context:
space:
mode:
authorokan <okan>2009-12-07 21:20:52 +0000
committerokan <okan>2009-12-07 21:20:52 +0000
commit3e309894c1d0f6ff9302109d72a0ffb25612d537 (patch)
treee4827ad0cdacb639b43d5262e88a896fa4087fb5
parent46630531f876c8043756e6622ca8be9e578bb2fa (diff)
downloadcwm-3e309894c1d0f6ff9302109d72a0ffb25612d537.tar.gz
cwm-3e309894c1d0f6ff9302109d72a0ffb25612d537.tar.xz
cwm-3e309894c1d0f6ff9302109d72a0ffb25612d537.zip
introduce the beginnings of netwm support, minimally and correctly;
allows java to be happy, but additionally stops others from whinning
about a non-netwm complaint wm.  more to come.

written a few times; this one includes a clever hack from oga@ to
populate _NET_SUPPORTED.

ok oga@
-rw-r--r--calmwm.c2
-rw-r--r--calmwm.h14
-rw-r--r--xutil.c29
3 files changed, 44 insertions, 1 deletions
diff --git a/calmwm.c b/calmwm.c
index 4ece6e2..a41c772 100644
--- a/calmwm.c
+++ b/calmwm.c
@@ -166,6 +166,8 @@ x_setupscreen(struct screen_ctx *sc, u_int which)
 	/* Initialize menu window. */
 	menu_init(sc);
 
+	xu_setwmname(sc);
+
 	/* Deal with existing clients. */
 	XQueryTree(X_Dpy, sc->rootwin, &w0, &w1, &wins, &nwins);
 
diff --git a/calmwm.h b/calmwm.h
index d152f81..ca4eefb 100644
--- a/calmwm.h
+++ b/calmwm.h
@@ -29,6 +29,7 @@
 #define MAX(x, y) ((x) > (y) ? (x) : (y))
 
 #define	CONFFILE	".cwmrc"
+#define	WMNAME	 	"CWM"
 
 #define ChildMask	(SubstructureRedirectMask|SubstructureNotifyMask)
 #define ButtonMask	(ButtonPressMask|ButtonReleaseMask)
@@ -384,6 +385,7 @@ void			 xu_setstate(struct client_ctx *, int);
 int			 xu_getstate(struct client_ctx *, int *);
 unsigned long		 xu_getcolor(struct screen_ctx *, char *);
 void			 xu_freecolor(struct screen_ctx *, unsigned long);
+void			 xu_setwmname(struct screen_ctx *);
 
 int			 u_spawn(char *);
 void			 u_exec(char *);
@@ -515,7 +517,17 @@ extern struct conf			 Conf;
 #define WM_PROTOCOLS			 cwm_atoms[3]
 #define _MOTIF_WM_HINTS			 cwm_atoms[4]
 #define	_CWM_GRP			 cwm_atoms[5]
-#define CWM_NO_ATOMS			 6
+#define	UTF8_STRING			 cwm_atoms[6]
+/*
+ * please make all hints below this point netwm hints, starting with
+ * _NET_SUPPORTED. If you change other hints make sure you update
+ * CWM_NETWM_START
+ */
+#define	_NET_SUPPORTED			 cwm_atoms[7]
+#define	_NET_SUPPORTING_WM_CHECK	 cwm_atoms[8]
+#define	_NET_WM_NAME			 cwm_atoms[9]
+#define CWM_NO_ATOMS			 10
+#define CWM_NETWM_START			 7
 
 extern Atom				 cwm_atoms[CWM_NO_ATOMS];
 
diff --git a/xutil.c b/xutil.c
index a6caed4..06b7d0d 100644
--- a/xutil.c
+++ b/xutil.c
@@ -177,6 +177,10 @@ char 		*atoms[CWM_NO_ATOMS] = {
 	"WM_PROTOCOLS",
 	"_MOTIF_WM_HINTS",
 	"_CWM_GRP",
+	"UTF8_STRING",
+	"_NET_SUPPORTED",
+	"_NET_SUPPORTING_WM_CHECK",
+	"_NET_WM_NAME",
 };
 
 void
@@ -185,6 +189,31 @@ xu_getatoms(void)
 	XInternAtoms(X_Dpy, atoms, CWM_NO_ATOMS, False, cwm_atoms);
 }
 
+void
+xu_setwmname(struct screen_ctx *sc)
+{
+	/*
+	 * set up the _NET_SUPPORTED hint with all netwm atoms that we
+	 * know about.
+	 */
+	XChangeProperty(X_Dpy, sc->rootwin, _NET_SUPPORTED, XA_ATOM, 32,
+	    PropModeReplace,  (unsigned char *)&_NET_SUPPORTED,
+	    CWM_NO_ATOMS - CWM_NETWM_START);
+	/*
+	 * netwm spec says that to prove that the hint is not stale you must
+	 * provide _NET_SUPPORTING_WM_CHECK containing a window (we use the
+	 * menu window). The property must be set on the root window and the
+	 * window itself, the window also must have _NET_WM_NAME set with the
+	 * window manager name.
+	 */
+	XChangeProperty(X_Dpy, sc->rootwin, _NET_SUPPORTING_WM_CHECK,
+	    XA_WINDOW, 32, PropModeReplace, (unsigned char *)&sc->menuwin, 1);
+	XChangeProperty(X_Dpy, sc->menuwin, _NET_SUPPORTING_WM_CHECK,
+	    XA_WINDOW, 32, PropModeReplace, (unsigned char *)&sc->menuwin, 1);
+	XChangeProperty(X_Dpy, sc->menuwin, _NET_WM_NAME, UTF8_STRING,
+	    8, PropModeReplace, WMNAME, strlen(WMNAME));
+}
+
 unsigned long
 xu_getcolor(struct screen_ctx *sc, char *name)
 {