X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Ffocus.c;h=a84d253a2bbb5e88b766c283699555d0776f7446;hb=bf247215bb015dbb4dfa39c38bf020aa815cd306;hp=ad7252b8db81668bf26629094f1c08f971e7d8b9;hpb=88204502a800f57b582e829d25cfeb899d444802;p=chaz%2Fopenbox diff --git a/openbox/focus.c b/openbox/focus.c index ad7252b8..a84d253a 100644 --- a/openbox/focus.c +++ b/openbox/focus.c @@ -56,9 +56,11 @@ static ObIconPopup *focus_cycle_popup; static void focus_cycle_destructor(ObClient *client, gpointer data) { - /* end cycling if the target disappears */ + /* end cycling if the target disappears. CurrentTime is fine, time won't + be used + */ if (focus_cycle_target == client) - focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE); + focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, CurrentTime); } static Window createWindow(Window parent, gulong mask, @@ -185,9 +187,11 @@ void focus_set_client(ObClient *client) XSync(ob_display, FALSE); } - /* in the middle of cycling..? kill it. */ + /* in the middle of cycling..? kill it. CurrentTime is fine, time won't + be used. + */ if (focus_cycle_target) - focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE); + focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, CurrentTime); old = focus_client; focus_client = client; @@ -201,6 +205,10 @@ void focus_set_client(ObClient *client) active = client ? client->window : None; PROP_SET32(RootWindow(ob_display, ob_screen), net_active_window, window, active); + + /* remove hiliting from the window when it gets focused */ + if (client != NULL) + client_hilite(client, FALSE); } } @@ -236,14 +244,11 @@ static ObClient* focus_fallback_transient(ObClient *top, ObClient *old) return NULL; } -ObClient* focus_fallback_target(ObFocusFallbackType type) +ObClient* focus_fallback_target(ObFocusFallbackType type, ObClient *old) { GList *it; - ObClient *old = NULL; ObClient *target = NULL; - old = focus_client; - if ((type == OB_FOCUS_FALLBACK_UNFOCUSING || type == OB_FOCUS_FALLBACK_CLOSED) && old) { if (old->transient_for) { @@ -252,11 +257,15 @@ ObClient* focus_fallback_target(ObFocusFallbackType type) if (!config_focus_follow || config_focus_last) trans = TRUE; else { - if ((target = client_under_pointer()) && - client_search_transient - (client_search_top_transient(target), old)) - { - trans = TRUE; + if ((target = client_under_pointer())) { + GSList *sit; + + sit = client_search_top_transients(target); + for (; sit; sit = g_slist_next(sit)) + if (client_search_transient(sit->data, old)) { + trans = TRUE; + break; + } } } @@ -324,6 +333,7 @@ ObClient* focus_fallback_target(ObFocusFallbackType type) void focus_fallback(ObFocusFallbackType type) { ObClient *new; + ObClient *old = focus_client; /* unfocus any focused clients.. they can be focused by Pointer events and such, and then when I try focus them, I won't get a FocusIn event @@ -331,7 +341,7 @@ void focus_fallback(ObFocusFallbackType type) */ focus_set_client(NULL); - if ((new = focus_fallback_target(type))) + if ((new = focus_fallback_target(type, old))) client_focus(new); } @@ -391,7 +401,8 @@ void focus_cycle_draw_indicator() gint wt, wl, wr, wb; wt = wl = wr = wb = MAX(3, - ob_rr_theme->top_grip_height + + MAX(1, MAX(ob_rr_theme->paddingx, + ob_rr_theme->paddingy)) * 2 + ob_rr_theme->fbwidth * 2); x = focus_cycle_target->frame->area.x; @@ -520,7 +531,7 @@ static gboolean valid_focus_target(ObClient *ft) ft->type == OB_CLIENT_TYPE_MENU || ft->type == OB_CLIENT_TYPE_UTILITY))) && ((ft->can_focus || ft->focus_notify) && - !ft->skip_taskbar && + !ft->skip_pager && (ft->desktop == screen_desktop || ft->desktop == DESKTOP_ALL)) && ft == client_focus_target(ft)) return TRUE; @@ -542,7 +553,7 @@ static gboolean valid_focus_target(ObClient *ft) } void focus_cycle(gboolean forward, gboolean linear, gboolean interactive, - gboolean dialog, gboolean done, gboolean cancel) + gboolean dialog, gboolean done, gboolean cancel, Time time) { static ObClient *first = NULL; static ObClient *t = NULL; @@ -603,7 +614,7 @@ void focus_cycle(gboolean forward, gboolean linear, gboolean interactive, done_cycle: if (done && focus_cycle_target) - client_activate(focus_cycle_target, FALSE, TRUE); + client_activate(focus_cycle_target, FALSE, TRUE, time); t = NULL; first = NULL; @@ -620,7 +631,8 @@ done_cycle: } void focus_directional_cycle(ObDirection dir, gboolean interactive, - gboolean dialog, gboolean done, gboolean cancel) + gboolean dialog, gboolean done, gboolean cancel, + Time time) { static ObClient *first = NULL; ObClient *ft = NULL; @@ -665,7 +677,7 @@ void focus_directional_cycle(ObDirection dir, gboolean interactive, done_cycle: if (done && focus_cycle_target) - client_activate(focus_cycle_target, FALSE, TRUE); + client_activate(focus_cycle_target, FALSE, TRUE, time); first = NULL; focus_cycle_target = NULL;