[hackers] [wmii] Process any queued focus events before deciding whether to set focus. This fixes several focus bugs.

From: Kris Maglione <jg_AT_suckless.org>
Date: Sat Mar 03 07:38:33 2007

changeset: 1986:60312c132bea
tag: tip
user: Kris Maglione <jg_AT_suckless.org>
date: Sat Mar 03 01:36:03 2007 -0500
summary: Process any queued focus events before deciding whether to set focus. This fixes several focus bugs.

diff -r b8fe0f1230f3 -r 60312c132bea client.c
--- a/client.c Fri Mar 02 23:40:24 2007 -0500
+++ b/client.c Sat Mar 03 01:36:03 2007 -0500
@@ -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
 
 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 -r b8fe0f1230f3 -r 60312c132bea event.c
--- a/event.c Fri Mar 02 23:40:24 2007 -0500
+++ b/event.c Sat Mar 03 01:36:03 2007 -0500
@@ -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);
Received on Sat Mar 03 2007 - 07:38:33 UTC

This archive was generated by hypermail 2.2.0 : Sun Jul 13 2008 - 15:56:06 UTC