X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fevent.c;h=6df7098e58e9dac9b21f4ec90aeb793130f053a4;hb=c8678108eb876bbe78649569dabb3b3ee5e595aa;hp=eff9d5907b256fe2c3597931086711cfa1fea60e;hpb=2572f111e011152fb5a844fb0c3577eafef11a09;p=chaz%2Fopenbox diff --git a/openbox/event.c b/openbox/event.c index eff9d590..6df7098e 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -327,6 +327,15 @@ static void event_done(gpointer data) { static ObClient *last = NULL; + /* sometimes focus_hilite can be on an unfocused window, this make sure + it loses its focus hilite when focus moves */ + if (focus_hilite && + (focus_in && focus_hilite != focus_in) && + (focus_out && focus_hilite != focus_out)) + { + frame_adjust_focus(focus_hilite->frame, FALSE); + } + if (focus_in) { if (focus_in != focus_client) { focus_set_client(focus_in); @@ -341,6 +350,8 @@ static void event_done(gpointer data) client_calc_layer(focus_out); } + focus_hilite = focus_in; + if (focus_client != last) { if (!focus_client) focus_fallback(OB_FOCUS_FALLBACK_NOFOCUS); @@ -452,11 +463,9 @@ static void event_process(const XEvent *ec, gpointer data) e->type == MotionNotify) mouse_event(client, e); else if (e->type == KeyPress) - /* when in the middle of a focus cycling action, this - causes the window which appears to be focused to be - the one on which the actions will be executed */ - keyboard_event((focus_cycle_target ? - focus_cycle_target : client), e); + keyboard_event((focus_cycle_target ? focus_cycle_target : + (focus_hilite ? focus_hilite : client)), + e); } } } @@ -597,10 +606,9 @@ static void event_handle_client(ObClient *client, XEvent *e) e->xfocus.window, client->window, e->xfocus.mode, e->xfocus.detail); #endif + focus_out = client; if (focus_in == client) focus_in = NULL; - if (client == focus_client) - focus_out = client; break; case LeaveNotify: con = frame_context(client, e->xcrossing.window); @@ -626,12 +634,10 @@ static void event_handle_client(ObClient *client, XEvent *e) frame_adjust_state(client->frame); break; case OB_FRAME_CONTEXT_FRAME: - /* - if (config_focus_follow && config_focus_delay) - ob_main_loop_timeout_remove_data(ob_main_loop, - focus_delay_func, - client); - */ + if (config_focus_follow && config_focus_delay) + ob_main_loop_timeout_remove_data(ob_main_loop, + focus_delay_func, + client); break; default: break; @@ -1191,6 +1197,11 @@ static void focus_delay_client_dest(ObClient *client, gpointer data) ob_main_loop_timeout_remove_data(ob_main_loop, focus_delay_func, client); } +void event_halt_focus_delay() +{ + ob_main_loop_timeout_remove(ob_main_loop, focus_delay_func); +} + void event_ignore_queued_enters() { GSList *saved = NULL, *it;