diff options
| author | Dana Jansens <danakj@orodu.net> | 2003-03-28 10:44:22 +0000 |
|---|---|---|
| committer | Dana Jansens <danakj@orodu.net> | 2003-03-28 10:44:22 +0000 |
| commit | 5895fa84ac6f66f272be745505e76250c24d3ba1 (patch) | |
| tree | e19278555e2bda6e3e6cf3afec3d755e8cb6c07d | |
| parent | cc813ed698b555757a3df4fbfcc25f0d1e8655be (diff) | |
yet MORE focus events reworkings. mozilla behaves now too. woot
| -rw-r--r-- | openbox/event.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/openbox/event.c b/openbox/event.c index 8445a7f0..b048e7e6 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -224,14 +224,15 @@ void event_process(XEvent *e) 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 @@ void event_process(XEvent *e) 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 @@ void event_process(XEvent *e) 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 @@ static void event_handle_client(Client *client, XEvent *e) /* 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)) { |
