changeset:   2278:f0f54438fdab
tag:         tip
user:        Kris Maglione <jg_AT_suckless.org>
date:        Sun Feb 03 19:10:13 2008 -0500
summary:     Try a bit harder to get the right tags in wmii_hack. Use time in seconds to prevent wraparound; check the tags of the last window.
diff -r d30dd7887635 -r f0f54438fdab cmd/wmii/client.c
--- a/cmd/wmii/client.c	Sun Feb 03 17:45:28 2008 -0500
+++ b/cmd/wmii/client.c	Sun Feb 03 19:10:13 2008 -0500
@@ -173,7 +173,7 @@ client_manage(Client *c) {
         if(trans == nil && c->group)
                 trans = group_leader(c->group);
 
-	if(tags)
+	if(tags && (!trans || starting))
                 utflcpy(c->tags, tags, sizeof c->tags);
         else if(trans)
                 utflcpy(c->tags, trans->tags, sizeof c->tags);
diff -r d30dd7887635 -r f0f54438fdab libwmii_hack/hack.c
--- a/libwmii_hack/hack.c	Sun Feb 03 17:45:28 2008 -0500
+++ b/libwmii_hack/hack.c	Sun Feb 03 19:10:13 2008 -0500
@@ -13,34 +13,27 @@
 #include "x11.c"
 
 enum {
-	Timeout = 10000,
+	Timeout = 10,
 };
 
 static void*	xlib;
 
+static Window	lastwin;
 static long	transient;
 static Atom	types[32];
 static long	ntypes;
-static char*	tags[32];
-static long	ntags;
+static char**	tags;
 static long	pid;
 static long	stime;
 static char	hostname[256];
-static long	nmsec;
+static long	nsec;
 
 typedef Window (*mapfn)(Display*, Window);
 
 static Window (*mapwindow)(Display*, Window);
 static Window (*mapraised)(Display*, Window);
-
-static long
-msec(void) {
-	struct timeval tv;
-
-	if(!gettimeofday(&tv, 0))
-		return 0;
-	return tv.tv_sec*1000 + tv.tv_usec/1000;
-}
+static Window (*unmapwindow)(Display*, Window);
+static Window (*destroywindow)(Display*, Window);
 
 static void
 init(Display *d) { /* Hrm... assumes one display... */
@@ -54,6 +47,8 @@ init(Display *d) { /* Hrm... assumes one
                 return;
         mapwindow = (mapfn)(uintptr_t)dlsym(xlib, "XMapWindow");
         mapraised = (mapfn)(uintptr_t)dlsym(xlib, "XMapRaised");
+	unmapwindow = (mapfn)(uintptr_t)dlsym(xlib, "XUnmapWindow");
+	destroywindow = (mapfn)(uintptr_t)dlsym(xlib, "XDestroyWindow");
 
         unsetenv("LD_PRELOAD");
 
@@ -84,9 +79,8 @@ init(Display *d) { /* Hrm... assumes one
                 unsetenv("WMII_HACK_TAGS");
 
                 n = tokenize(toks, nelem(toks)-1, s, '+');
-		for(i=0; i < n; i++)
-			tags[i] = strdup(toks[i]);
-		ntags = n;
+		toks[n] = 0;
+		tags = strlistdup(toks);
                 free(s);
         }
         if((s = getenv("WMII_HACK_TIME"))) {
@@ -113,16 +107,22 @@ setprops(Display *d, Window w) {
         }
 
         /* Kludge. */
-	if(nmsec == 0)
-		nmsec = msec();
-	if(msec() > nmsec + Timeout)
+	if(nsec == 0)
+		nsec = time(0);
+	else if(time(0) > nsec + Timeout)
                 return;
+
+	if(lastwin) {
+		free(tags);
+		getprop_textlist(d, lastwin, "_WMII_TAGS", &tags);
+	}
+	lastwin = w;
 
         if(transient)
                 changeprop_long(d, w, "WM_TRANSIENT_FOR", "WINDOW", &transient, 1);
         if(ntypes)
                 changeprop_long(d, w, "_NET_WM_WINDOW_TYPE", "ATOM", (long*)types, ntypes);
-	if(ntags)
+	if(tags)
                 changeprop_textlist(d, w, "_WMII_TAGS", "UTF8_STRING", tags);
         if(stime)
                 changeprop_long(d, w, "_WMII_LAUNCH_TIME", "CARDINAL", &stime, 1);
@@ -142,3 +142,20 @@ XMapRaised(Display *d, Window w) {
         return mapraised(d, w);
 }
 
+/* These are not perfect. */
+int
+XUnmapWindow(Display *d, Window w) {
+
+	if(lastwin == w)
+		lastwin = 0;
+	return unmapwindow(d, w);
+}
+
+int
+XDestroyWindow(Display *d, Window w) {
+
+	if(lastwin == w)
+		lastwin = 0;
+	return destroywindow(d, w);
+}
+
diff -r d30dd7887635 -r f0f54438fdab libwmii_hack/x11.c
--- a/libwmii_hack/x11.c	Sun Feb 03 17:45:28 2008 -0500
+++ b/libwmii_hack/x11.c	Sun Feb 03 19:10:13 2008 -0500
@@ -150,25 +150,47 @@ strlistdup(char *list[], int n) {
 }
 #endif
 
-#if 0
+static char**
+strlistdup(char *list[]) {
+	char **p, *q;
+	int i, m, n;
+
+	n = 0;
+	m = 0;
+	for(p=list; *p; p++, n++)
+		m += strlen(*p) + 1;
+
+	p = malloc((n+1) * sizeof(*p) + m);
+	q = (char*)&p[n+1];
+
+	for(i=0; i < n; i++) {
+		p[i] = q;
+		m = strlen(list[i]) + 1;
+		memcpy(q, list[i], m);
+		q += m;
+	}
+	p[n] = nil;
+	return p;
+}
+
 static int
 getprop_textlist(Display *display, Window w, char *name, char **ret[]) {
         XTextProperty prop;
         char **list;
         int n;
 
-	*ret = nil;
         n = 0;
 
         XGetTextProperty(display, w, &prop, xatom(display, name));
         if(prop.nitems > 0) {
-		if(Xutf8TextPropertyToTextList(display, &prop, &list, &n) == Success)
-			*ret = list;
+		if(Xutf8TextPropertyToTextList(display, &prop, &list, &n) == Success) {
+			*ret = strlistdup(list);
+			XFreeStringList(list);
+		}
                 XFree(prop.value);
         }
         return n;
 }
-#endif
 
 #if 0
 static char*
diff -r d30dd7887635 -r f0f54438fdab libwmii_hack/x11.h
--- a/libwmii_hack/x11.h	Sun Feb 03 17:45:28 2008 -0500
+++ b/libwmii_hack/x11.h	Sun Feb 03 19:10:13 2008 -0500
@@ -12,7 +12,7 @@ static void	changeproperty(Display*, Win
 /* static void	freestringlist(char**); */
 static ulong	getprop_long(Display*, Window, char*, char*, ulong, long**, ulong);
 /* static char*	getprop_string(Display*, Window, char*); */
-/* static int	getprop_textlist(Display*, Window, char*, char**[]); */
+static int	getprop_textlist(Display*, Window, char*, char**[]);
 /* static ulong	getproperty(Display*, Window, char*, char*, Atom*, ulong, uchar**, ulong); */
 static Atom	xatom(Display*, char*);
 
Received on Mon Feb 04 2008 - 01:12:04 UTC
This archive was generated by hypermail 2.2.0 : Sun Jul 13 2008 - 15:59:17 UTC