wmii

git clone git://oldgit.suckless.org/wmii/
Log | Files | Refs | README | LICENSE

commit b5ed1df3a104b9a72aee423e716a7c283aadddb2
parent 7b50a929c417f1f30c0f2c674d1013b498b61ff5
Author: Kris Maglione <kris@suckless.org>
Date:   Thu,  3 Jun 2010 17:08:50 -0400

Show indication when clients are wedged.

Diffstat:
cmd/wmii/ewmh.c | 28+++++++++++++++++++---------
cmd/wmii/fns.h | 1+
cmd/wmii/frame.c | 9++++-----
3 files changed, 24 insertions(+), 14 deletions(-)

diff --git a/cmd/wmii/ewmh.c b/cmd/wmii/ewmh.c @@ -76,13 +76,19 @@ ewmh_init(void) { changeprop_long(&scr.root, Net("SUPPORTED"), "ATOM", supported, nelem(supported)); } +inline bool +ewmh_responsive_p(Client *c) { + return c->w.ewmh.ping == 0 || nsec() / 1000000 - c->w.ewmh.ping < PingTime; +} + void ewmh_checkresponsive(Client *c) { - if(c->w.ewmh.ping > 0 && nsec() / 1000000 - c->w.ewmh.ping > PingTime) { - event("Unresponsive %#C\n", c); - c->dead++; - } + if(!ewmh_responsive_p(c)) + if(!c->dead) + frame_draw(c->sel); + else if(c->dead++ == 1) + event("Unresponsive %#C\n", c); } static void @@ -97,7 +103,7 @@ tick(long id, void *v) { mod = count % PingPartition; for(i=0, c=client; c; c=c->next, i++) if(c->proto & ProtoPing) { - if(c->dead == 1) + if(!ewmh_responsive_p(c)) ewmh_checkresponsive(c); if(i % PingPartition == mod) sendmessage(&c->w, "WM_PROTOCOLS", NET("WM_PING"), time, c->w.xid, 0, 0); @@ -407,6 +413,7 @@ ewmh_setstate(Client *c, Atom state, int action) { static bool event_root_clientmessage(Window *w, void *aux, XClientMessageEvent *e) { + Client *c; View *v; ulong *l; ulong msg; @@ -433,11 +440,14 @@ event_root_clientmessage(Window *w, void *aux, XClientMessageEvent *e) { if(l[0] == NET("WM_PING")) { if(e->window != scr.root.xid) return false; - if(!(w = findwin(l[2]))) + if(!(c = win2client(l[2]))) return false; - w->ewmh.ping = nsec() / 1000000; - w->ewmh.lag = (w->ewmh.ping & 0xffffffff) - (l[1] & 0xffffffff); - Dprint(DEwmh, "\twindow=%W lag=%,uld\n", w, w->ewmh.lag); + i = ewmh_responsive_p(c); + c->w.ewmh.ping = nsec() / 1000000; + c->w.ewmh.lag = (c->w.ewmh.ping & 0xffffffff) - (l[1] & 0xffffffff); + if(i == false) + frame_draw(c->sel); + Dprint(DEwmh, "\twindow=%W lag=%,uld\n", &c->w, c->w.ewmh.lag); return false; } return false; diff --git a/cmd/wmii/fns.h b/cmd/wmii/fns.h @@ -145,6 +145,7 @@ void ewmh_init(void); void ewmh_initclient(Client*); bool ewmh_prop(Client*, Atom); long ewmh_protocols(Window*); +bool ewmh_responsive_p(Client*); void ewmh_updateclient(Client*); void ewmh_updateclientlist(void); void ewmh_updateclients(void); diff --git a/cmd/wmii/frame.c b/cmd/wmii/frame.c @@ -428,9 +428,7 @@ frame_draw(Frame *f) { uint w; int n, m; - if(f->view != selview) - return; - if(f->area == nil) /* Blech. */ + if(f == nil || f->view != selview || f->area == nil) return; c = f->client; @@ -503,8 +501,9 @@ frame_draw(Frame *f) { }else /* Make sure floating clients have room for their indicators. */ if(c->floating) r.max.x -= Dx(f->grabbox); - w = drawstring(img, def.font, r, West, - c->name, col->fg); + if(!ewmh_responsive_p(c)) + r.min.x += drawstring(img, def.font, r, West, "(wedged) ", col->fg); + w = drawstring(img, def.font, r, West, c->name, col->fg); /* Draw inner border on floating clients. */ if(f->area->floating) {