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.

This commit is contained in:
Kris Maglione 2008-02-03 19:10:13 -05:00
parent d8831b84fc
commit 870c340225
4 changed files with 66 additions and 27 deletions

View File

@ -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);

View File

@ -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 display... */
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 display... */
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);
}

View File

@ -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*

View File

@ -12,7 +12,7 @@ static void changeproperty(Display*, Window, char*, char*, int width, uchar*, in
/* 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*);