X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=openbox%2Fevent.c;h=ab0f8d8b3945563b5e2e0dd73c64b182a94b2b0a;hb=2bdccde5c266ad00e7f50c209397f83bcec74e59;hp=6548d83e993b4c983f5ee4e26667ccb0ce6e08c2;hpb=e7e2a69fd0ed5073a57ce2974892ad5cf97f7faa;p=chaz%2Fopenbox diff --git a/openbox/event.c b/openbox/event.c index 6548d83e..ab0f8d8b 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -219,26 +219,37 @@ void event_process(XEvent *e) event_lasttime = e->xproperty.time; break; case FocusIn: + if (e->xfocus.mode == NotifyGrab) return; +/* if (e->type == FocusIn && window == focus_backup && focus_client != NULL) { +*/ + /* Something's focused but we got a focus event for the backup + window. this means that something unfocused before we received + the new FocusIn. Just ignore it, and refocus what should be + focused! */ +/* client_focus(focus_client); + return; + } +*/ + break; case FocusOut: - if (e->xfocus.mode == NotifyGrab) + if (e->xfocus.mode == NotifyGrab) return; /*|| e.xfocus.mode == NotifyUngrab ||*/ - /* From Metacity, from WindowMaker, ignore all funky pointer root events. Its commented out cuz I don't think we need this at all. If problems arise we can look into it */ /*e.xfocus.detail > NotifyNonlinearVirtual) */ - return; /* skip me! */ - if (e->type == FocusOut) { - /* FocusOut events just make us look for FocusIn events. They - are mostly ignored otherwise. */ - XEvent fi; - if (XCheckTypedEvent(ob_display, FocusIn, &fi)) { + + /* FocusOut events just make us look for FocusIn events. They + are mostly ignored otherwise. */ + { + XEvent fi; + if (XCheckTypedEvent(ob_display, FocusIn, &fi)) { event_process(&fi); /* dont unfocus the window we just focused! */ if (fi.xfocus.window == e->xfocus.window) return; } - } + } break; case EnterNotify: case LeaveNotify: @@ -251,7 +262,6 @@ void event_process(XEvent *e) } client = g_hash_table_lookup(client_map, (gpointer)window); - g_message("EVENT: 0x%lx -> 0x%lx", window, client); /* deal with it in the kernel */ if (client) @@ -324,10 +334,22 @@ static void event_handle_client(Client *client, XEvent *e) switch (e->type) { case FocusIn: - client_set_focused(client, TRUE); + if (focus_client != client) + focus_set_client(client); + + /* focus state can affect the stacking layer */ + client_calc_layer(client); + + engine_frame_adjust_focus(client->frame); break; case FocusOut: - client_set_focused(client, FALSE); + if (focus_client == client) + focus_set_client(NULL); + + /* focus state can affect the stacking layer */ + client_calc_layer(client); + + engine_frame_adjust_focus(client->frame); break; case ConfigureRequest: g_message("ConfigureRequest for window %lx", client->window);