wmii

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

commit 185fdef6f38e046e396da27cdf1aa99237a3b614
parent 072abd44e4bc9601ed19235b10aae73b3301e6a8
Author: Kris Maglione <kris@suckless.org>
Date:   Fri, 28 May 2010 15:51:00 -0400

Send synthetic unmap events to affected windows, whatever their destination. This needs testing. (Fixes issue #184)

Diffstat:
cmd/wmii/client.c | 5++---
cmd/wmii/dat.h | 1-
cmd/wmii/event.c | 31++++++++++++++-----------------
lib/libstuff/event/mapnotify.c | 2++
lib/libstuff/event/reparentnotify.c | 2++
lib/libstuff/event/unmapnotify.c | 11++++++++---
lib/libstuff/x11/windows/reparentwindow.c | 1+
7 files changed, 29 insertions(+), 24 deletions(-)

diff --git a/cmd/wmii/client.c b/cmd/wmii/client.c @@ -944,9 +944,8 @@ unmap_event(Window *w, void *aux, XUnmapEvent *e) { Client *c; c = aux; - if(!e->send_event) - c->unmapped--; - client_destroy(c); + if(e->send_event || c->w.unmapped < 0) + client_destroy(c); return false; } diff --git a/cmd/wmii/dat.h b/cmd/wmii/dat.h @@ -161,7 +161,6 @@ struct Client { long proto; uint border; int fullscreen; - int unmapped; bool floating; bool fixedsize; bool urgent; diff --git a/cmd/wmii/event.c b/cmd/wmii/event.c @@ -11,16 +11,6 @@ debug_event(XEvent *e) { } void -event_buttonpress(XButtonPressedEvent *ev) { - Window *w; - - if((w = findwin(ev->window))) - event_handle(w, bdown, ev); - else - XAllowEvents(display, ReplayPointer, ev->time); -} - -void event_configurenotify(XConfigureEvent *ev) { Window *w; @@ -110,11 +100,13 @@ event_focusout(XFocusChangeEvent *ev) { void event_mapnotify(XMapEvent *ev) { - Window *w; + Window *w; - ignoreenter = ev->serial; - if((w = findwin(ev->window))) - event_handle(w, map, ev); + ignoreenter = ev->serial; + if((w = findwin(ev->event))) + event_handle(w, map, ev); + if(ev->send_event && (w = findwin(ev->event))) + event_handle(w, map, ev); } void @@ -122,10 +114,15 @@ event_unmapnotify(XUnmapEvent *ev) { Window *w; ignoreenter = ev->serial; - if((w = findwin(ev->window)) && (ev->event == w->parent->xid)) { - w->mapped = false; - if(ev->send_event || w->unmapped-- == 0) + if((w = findwin(ev->window))) { + if(!ev->send_event) + w->mapped = false; + if(!ev->send_event && ev->event == ev->window) + w->unmapped--; + if(ev->send_event && ev->event != ev->window) event_handle(w, unmap, ev); } + if((w = findwin(ev->event))) + event_handle(w, unmap, ev); } diff --git a/lib/libstuff/event/mapnotify.c b/lib/libstuff/event/mapnotify.c @@ -9,4 +9,6 @@ event_mapnotify(XMapEvent *ev) { if((w = findwin(ev->event))) event_handle(w, map, ev); + if(ev->send_event && (w = findwin(ev->event))) + event_handle(w, map, ev); } diff --git a/lib/libstuff/event/reparentnotify.c b/lib/libstuff/event/reparentnotify.c @@ -9,4 +9,6 @@ event_reparentnotify(XReparentEvent *ev) { if((w = findwin(ev->event))) event_handle(w, reparent, ev); + if(ev->send_event && (w = findwin(ev->window))) + event_handle(w, reparent, ev); } diff --git a/lib/libstuff/event/unmapnotify.c b/lib/libstuff/event/unmapnotify.c @@ -7,9 +7,14 @@ void event_unmapnotify(XUnmapEvent *ev) { Window *w; - if((w = findwin(ev->window)) && (ev->event == w->parent->xid)) { - w->mapped = false; - if(w->parent && (ev->send_event || w->unmapped-- == 0)) + if((w = findwin(ev->window))) { + if(!ev->send_event) + w->mapped = false; + if(!ev->send_event && ev->event == ev->window) + w->unmapped--; + if(ev->send_event && ev->event != ev->window) event_handle(w, unmap, ev); } + if((w = findwin(ev->event))) + event_handle(w, unmap, ev); } diff --git a/lib/libstuff/x11/windows/reparentwindow.c b/lib/libstuff/x11/windows/reparentwindow.c @@ -7,6 +7,7 @@ void reparentwindow(Window *w, Window *par, Point p) { assert(w->type == WWindow); XReparentWindow(display, w->xid, par->xid, p.x, p.y); + w->unmapped++; w->parent = par; w->r = rectsubpt(w->r, w->r.min); w->r = rectaddpt(w->r, p);