wmii

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

commit 162d53212ecf00dc7d20db93c6251469bf29b623
parent 07343c21f1a8bc14d626f4664e00afa95ab4308a
Author: Kris Maglione <jg@suckless.org>
Date:   Sat,  3 Mar 2007 01:36:03 -0500

Process any queued focus events before deciding whether to set focus. This fixes several focus bugs.

Diffstat:
client.c | 8+++++++-
event.c | 13++++++++++---
2 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/client.c b/client.c @@ -155,7 +155,7 @@ manage_client(Client *c) { update_views(); XSync(blz.dpy, False); - if(c->sel->area->view == screen->sel) + if(c->sel->view == screen->sel) focus(c, True); flush_masked_events(EnterWindowMask); } @@ -595,6 +595,12 @@ apply_sizehints(Client *c, XRectangle *r, Bool floating, Bool frame, BlitzAlign void focus_client(Client *c) { + XEvent ev; + + while(XCheckMaskEvent(blz.dpy, FocusChangeMask, &ev)) + if(handler[ev.xany.type]) + handler[ev.xany.type](&ev); + if(verbose) fprintf(stderr, "focus_client(%p) => %s\n", c, (c ? c->name : nil)); if(screen->focus != c) { diff --git a/event.c b/event.c @@ -115,13 +115,14 @@ configurerequest(XEvent *e) { if(ev->value_mask & CWBorderWidth) c->border = ev->border_width; gravitate_client(c, False); - + if((c->rect.height == screen->rect.height) &&(c->rect.width == screen->rect.width)) { c->fullscreen = True; if(c->sel) { if(!c->sel->area->floating) send_to_area(c->sel->view->area, c->sel); + focus_client(c); restack_view(c->sel->view); } } @@ -172,13 +173,19 @@ enternotify(XEvent *e) { if(ev->mode != NotifyNormal) return; + if((c = client_of_win(ev->window))) { if(ev->detail != NotifyInferior) { + if(verbose) + fprintf(stderr, "enter_notify(c) => %s\n", c->name); focus(c, False); set_cursor(c, cursor[CurNormal]); - } + }else if(verbose) + fprintf(stderr, "enter_notify(c[NotifyInferior]) => %s\n", c->name); } else if((f = frame_of_win(ev->window))) { + if(verbose) + fprintf(stderr, "enter_notify(f) => %s\n", f->client->name); if(f->area->floating || !f->collapsed) focus(f->client, False); set_frame_cursor(f, ev->x, ev->y); @@ -404,7 +411,7 @@ check_x_event(IXPConn *c) { XEvent ev; while(XPending(blz.dpy)) { XNextEvent(blz.dpy, &ev); - if(verbose) + if(verbose & 0) printevent(&ev); if(handler[ev.type]) handler[ev.type](&ev);