all repos — openbox @ 5895fa84ac6f66f272be745505e76250c24d3ba1

openbox fork - make it a bit more like ryudo

yet MORE focus events reworkings. mozilla behaves now too. woot
Dana Jansens danakj@orodu.net
commit

5895fa84ac6f66f272be745505e76250c24d3ba1

parent

cc813ed698b555757a3df4fbfcc25f0d1e8655be

1 files changed, 16 insertions(+), 6 deletions(-)

jump to
M openbox/event.copenbox/event.c

@@ -224,14 +224,15 @@ case FocusIn:

g_message("FocusIn on %lx mode %d detail %d", window, e->xfocus.mode, e->xfocus.detail); if (e->xfocus.detail == NotifyInferior || - e->xfocus.detail == NotifyAncestor || + /*e->xfocus.detail == NotifyAncestor ||*/ e->xfocus.detail > NotifyNonlinearVirtual) return; g_message("FocusIn on %lx", window); break; case FocusOut: g_message("FocusOut on %lx mode %d detail %d", window, e->xfocus.mode, e->xfocus.detail); - if (e->xfocus.detail == NotifyInferior || + if (e->xfocus.mode == NotifyGrab || + e->xfocus.detail == NotifyInferior || e->xfocus.detail == NotifyAncestor || e->xfocus.detail > NotifyNonlinearVirtual) return;

@@ -244,8 +245,17 @@ if (XCheckTypedEvent(ob_display, FocusIn, &fi)) {

event_process(&fi); /* secret magic way of event_process telling us that no client - was found for the FocusIn event */ - if (fi.xfocus.window != None) + was found for the FocusIn event. + + it should be noted!! that focus events of invalud types + (the ones that cause a return in the FocusIn case above) + will not cause this focus_fallback to be called. it will + be assumed that focus is going someplace sane still, or + there are more focus events coming to fix up the situation. + this may not be perfect.. but its working! and focus events + are too much headache to take that for granted. ktnx. ^_^ + */ + if (fi.xfocus.window == None) focus_fallback(FALSE); if (fi.xfocus.window == e->xfocus.window) return;

@@ -274,6 +284,8 @@ else if (window == ob_root)

event_handle_root(e); else if (e->type == MapRequest) client_manage(window); + else if (e->type == FocusIn) + e->xfocus.window = None; /* says a client was found for the event! */ else if (e->type == ConfigureRequest) { /* unhandled configure requests must be used to configure the window directly */

@@ -345,8 +357,6 @@ client->window);

/* focus state can affect the stacking layer */ client_calc_layer(client); engine_frame_adjust_focus(client->frame); - - e->xfocus.window = None; /* says a client was found for the event! */ break; case EnterNotify: if (client_normal(client)) {