X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=sidebyside;f=openbox%2Ffocus.c;h=c95111fbe93a00e471b3265400a0f56f6747d9be;hb=6f5292c87ece138a2b80d102ba0919b105b1839a;hp=302c4fc425fc7eca4c82b6937341c57863c325c4;hpb=49b848a2bbb4c9c72888da94cd069e3562f9640b;p=chaz%2Fopenbox diff --git a/openbox/focus.c b/openbox/focus.c index 302c4fc4..c95111fb 100644 --- a/openbox/focus.c +++ b/openbox/focus.c @@ -42,10 +42,10 @@ ObClient *focus_cycle_target; static ObIconPopup *focus_cycle_popup; -static void focus_cycle_destructor(ObClient *c) +static void focus_cycle_destructor(ObClient *client, gpointer data) { /* end cycling if the target disappears */ - if (focus_cycle_target == c) + if (focus_cycle_target == client) focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE); } @@ -54,7 +54,7 @@ void focus_startup(gboolean reconfig) focus_cycle_popup = icon_popup_new(TRUE); if (!reconfig) { - client_add_destructor((GDestroyNotify) focus_cycle_destructor); + client_add_destructor(focus_cycle_destructor, NULL); /* start with nothing focused */ focus_set_client(NULL); @@ -68,15 +68,14 @@ void focus_shutdown(gboolean reconfig) icon_popup_free(focus_cycle_popup); if (!reconfig) { - client_remove_destructor((GDestroyNotify) focus_cycle_destructor); + client_remove_destructor(focus_cycle_destructor); for (i = 0; i < screen_num_desktops; ++i) g_list_free(focus_order[i]); g_free(focus_order); /* reset focus to root */ - XSetInputFocus(ob_display, PointerRoot, RevertToPointerRoot, - event_lasttime); + XSetInputFocus(ob_display, PointerRoot, RevertToNone, event_lasttime); } } @@ -104,8 +103,11 @@ void focus_set_client(ObClient *client) screen_install_colormap(client, TRUE); if (client == NULL) { - /* when nothing will be focused, send focus to the backup target */ - XSetInputFocus(ob_display, screen_support_win, RevertToPointerRoot, +#ifdef DEBUG_FOCUS + ob_debug("actively focusing NONWINDOW\n"); +#endif + /* when nothing will be focused, send focus to the backup target */ + XSetInputFocus(ob_display, screen_support_win, RevertToNone, event_lasttime); XSync(ob_display, FALSE); } @@ -180,24 +182,40 @@ void focus_fallback(ObFocusFallbackType type) focus_set_client(NULL); if (type == OB_FOCUS_FALLBACK_UNFOCUSING && old) { - /* try for transient relations */ if (old->transient_for) { - if (old->transient_for == OB_TRAN_GROUP) { - for (it = focus_order[screen_desktop]; it; it = it->next) { - GSList *sit; + gboolean trans = FALSE; - for (sit = old->group->members; sit; sit = sit->next) - if (sit->data == it->data) - if (focus_fallback_transient(sit->data, old)) - return; + if (!config_focus_follow) + trans = TRUE; + else { + ObClient *c; + + if ((c = client_under_pointer()) && + client_search_transient(client_search_top_transient(c), + old)) + trans = TRUE; + } + + /* try for transient relations */ + if (trans) { + if (old->transient_for == OB_TRAN_GROUP) { + for (it = focus_order[screen_desktop]; it; it = it->next) { + GSList *sit; + + for (sit = old->group->members; sit; sit = sit->next) + if (sit->data == it->data) + if (focus_fallback_transient(sit->data, old)) + return; + } + } else { + if (focus_fallback_transient(old->transient_for, old)) + return; } - } else { - if (focus_fallback_transient(old->transient_for, old)) - return; } } + } - if (!config_focus_last && config_focus_follow) + if (config_focus_follow) if (focus_under_pointer()) return; @@ -217,7 +235,6 @@ void focus_fallback(ObFocusFallbackType type) } } #endif - } for (it = focus_order[screen_desktop]; it != NULL; it = it->next) if (type != OB_FOCUS_FALLBACK_UNFOCUSING || it->data != old) @@ -232,7 +249,7 @@ void focus_fallback(ObFocusFallbackType type) static void popup_cycle(ObClient *c, gboolean show) { - if (!show || !config_dialog_focus) { + if (!show) { icon_popup_hide(focus_cycle_popup); } else { Rect *a; @@ -276,7 +293,7 @@ static gboolean valid_focus_target(ObClient *ft) focus an iconic window, but we want to be able to, so we just check if the focus flags on the window allow it, and its on the current desktop */ - return (ft == client_focus_target(ft) && client_normal(ft) && + return (!ft->transients && client_normal(ft) && ((ft->can_focus || ft->focus_notify) && !ft->skip_taskbar && (ft->desktop == screen_desktop || ft->desktop == DESKTOP_ALL)));