X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=sidebyside;f=openbox%2Ffocus.c;h=d18b3a1f428cfef066e9ab0f68fe914cebba5ebd;hb=a9175a8a324deb6d1b7e717fb77fbc96204c7540;hp=02832cea8c7f8ab428490694acbf7b65ce864f7f;hpb=56307d60773d0eaf65b10414cd0e3ec0b2adc156;p=chaz%2Fopenbox diff --git a/openbox/focus.c b/openbox/focus.c index 02832cea..d18b3a1f 100644 --- a/openbox/focus.c +++ b/openbox/focus.c @@ -2,7 +2,7 @@ focus.c for the Openbox window manager Copyright (c) 2006 Mikael Magnusson - Copyright (c) 2003 Ben Jansens + Copyright (c) 2003-2007 Dana Jansens This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -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); } } @@ -215,8 +223,12 @@ static ObClient *find_transient_recursive(ObClient *c, ObClient *top, for (it = c->transients; it; it = g_slist_next(it)) { if (it->data == top) return NULL; ret = find_transient_recursive(it->data, top, skip); - if (ret && ret != skip && client_normal(ret)) return ret; - if (it->data != skip && client_normal(it->data)) return it->data; + if (ret && ret != skip && client_normal(ret) && + client_can_focus(ret) && client_validate(ret)) + return ret; + if (it->data != skip && client_normal(it->data) && + client_can_focus(it->data) && client_validate(it->data)) + return it->data; } return NULL; } @@ -236,62 +248,62 @@ static ObClient* focus_fallback_transient(ObClient *top, ObClient *old) return NULL; } -ObClient* focus_fallback_target(ObFocusFallbackType type) +ObClient* focus_fallback_target(gboolean allow_refocus, 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) { - gboolean trans = FALSE; - - if (!config_focus_follow || config_focus_last) - trans = TRUE; - else { - if ((target = client_under_pointer()) && - client_search_transient - (client_search_top_transient(target), old)) + if (!allow_refocus && old && old->transient_for) { + gboolean trans = FALSE; + + if (!config_focus_follow || config_focus_last) + trans = TRUE; + else if ((target = client_under_pointer()) && + client_search_transient + (client_search_top_parent(target), old)) + trans = TRUE; + + /* try for transient relations */ + if (trans) { + if (old->transient_for == OB_TRAN_GROUP) { + for (it = focus_order[screen_desktop]; it; + it = g_list_next(it)) { - trans = TRUE; - } - } + GSList *sit; - /* try for transient relations */ - if (trans) { - if (old->transient_for == OB_TRAN_GROUP) { - for (it = focus_order[screen_desktop]; it; - it = g_list_next(it)) + for (sit = old->group->members; sit; + sit = g_slist_next(sit)) { - GSList *sit; - - for (sit = old->group->members; sit; - sit = g_slist_next(sit)) - { - if (sit->data == it->data) - if ((target = - focus_fallback_transient(sit->data, old))) - return target; - } + if (sit->data == it->data) + if ((target = + focus_fallback_transient(sit->data, old))) + { + ob_debug("found in transient #1\n"); + return target; + } } - } else { - if ((target = - focus_fallback_transient(old->transient_for, old))) - return target; + } + } else { + if ((target = + focus_fallback_transient(old->transient_for, old))) + { + ob_debug("found in transient #2\n"); + return target; } } } } - if (config_focus_follow && - (type == OB_FOCUS_FALLBACK_UNFOCUSING || !config_focus_last)) + ob_debug("trying pointer stuff\n"); + if (config_focus_follow && !config_focus_last) { if ((target = client_under_pointer())) - if (client_normal(target) && client_can_focus(target)) - return target; + if (allow_refocus || target != old) + if (client_normal(target) && client_can_focus(target) && + client_validate(target)) { + ob_debug("found in pointer stuff\n"); + return target; + } } #if 0 @@ -308,10 +320,15 @@ ObClient* focus_fallback_target(ObFocusFallbackType type) } #endif + ob_debug("trying the focus order\n"); for (it = focus_order[screen_desktop]; it; it = g_list_next(it)) - if (type != OB_FOCUS_FALLBACK_UNFOCUSING || it->data != old) - if (client_normal(it->data) && client_can_focus(it->data)) + if (allow_refocus || it->data != old) + if (client_normal(it->data) && client_can_focus(it->data) && + client_validate(it->data)) + { + ob_debug("found in focus order\n"); return it->data; + } /* XXX fallback to the "desktop window" if one exists ? could store it while going through all the windows in the loop right @@ -321,9 +338,13 @@ ObClient* focus_fallback_target(ObFocusFallbackType type) return NULL; } -void focus_fallback(ObFocusFallbackType type) +void focus_fallback(gboolean allow_refocus) { ObClient *new; + ObClient *old; + + /* save this before moving focus away to nothing */ + 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 +352,7 @@ void focus_fallback(ObFocusFallbackType type) */ focus_set_client(NULL); - if ((new = focus_fallback_target(type))) + if ((new = focus_fallback_target(allow_refocus, old))) client_focus(new); } @@ -521,7 +542,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; @@ -543,7 +564,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; @@ -604,7 +625,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; @@ -621,7 +642,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; @@ -666,7 +688,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;