X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Ffocus.c;h=eac0dce1ce6435cf7bc41cb53977446fc08db950;hb=896098c961a9a37e10541680637eb582805a9523;hp=6ca589b1efe0d1391b0a3a34d1bb934c3c1eee9e;hpb=c4e4760c41f10aae6af19a4363cb247c71edee4b;p=chaz%2Fopenbox diff --git a/openbox/focus.c b/openbox/focus.c index 6ca589b1..eac0dce1 100644 --- a/openbox/focus.c +++ b/openbox/focus.c @@ -1,4 +1,4 @@ -/* -*- indent-tabs-mode: t; tab-width: 4; c-basic-offset: 4; -*- +/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*- focus.c for the Openbox window manager Copyright (c) 2003 Ben Jansens @@ -42,13 +42,23 @@ ObClient *focus_cycle_target; static ObIconPopup *focus_cycle_popup; +static void focus_cycle_destructor(ObClient *c) +{ + /* end cycling if the target disappears */ + if (focus_cycle_target == c) + focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE); +} + void focus_startup(gboolean reconfig) { focus_cycle_popup = icon_popup_new(TRUE); - if (!reconfig) + if (!reconfig) { + client_add_destructor((GDestroyNotify) focus_cycle_destructor); + /* start with nothing focused */ focus_set_client(NULL); + } } void focus_shutdown(gboolean reconfig) @@ -58,6 +68,8 @@ void focus_shutdown(gboolean reconfig) icon_popup_free(focus_cycle_popup); if (!reconfig) { + client_remove_destructor((GDestroyNotify) focus_cycle_destructor); + for (i = 0; i < screen_num_desktops; ++i) g_list_free(focus_order[i]); g_free(focus_order); @@ -119,23 +131,10 @@ void focus_set_client(ObClient *client) static gboolean focus_under_pointer() { - int x, y; - GList *it; + ObClient *c; - if (screen_pointer_pos(&x, &y)) { - for (it = stacking_list; it != NULL; it = it->next) { - if (WINDOW_IS_CLIENT(it->data)) { - ObClient *c = WINDOW_AS_CLIENT(it->data); - if (c->desktop == screen_desktop && - RECT_CONTAINS(c->frame->area, x, y)) - break; - } - } - if (it != NULL) { - g_assert(WINDOW_IS_CLIENT(it->data)); - return client_normal(it->data) && client_focus(it->data); - } - } + if ((c = client_under_pointer())) + return client_normal(c) && client_focus(c); return FALSE; } @@ -180,8 +179,9 @@ void focus_fallback(ObFocusFallbackType type) */ focus_set_client(NULL); - if (config_focus_follow && focus_under_pointer()) - return; + if (!config_focus_last && config_focus_follow) + if (focus_under_pointer()) + return; if (type == OB_FOCUS_FALLBACK_UNFOCUSING && old) { /* try for transient relations */ @@ -237,7 +237,7 @@ void focus_fallback(ObFocusFallbackType type) static void popup_cycle(ObClient *c, gboolean show) { - if (!show) { + if (!show || !config_dialog_focus) { icon_popup_hide(focus_cycle_popup); } else { Rect *a; @@ -294,7 +294,7 @@ void focus_cycle(gboolean forward, gboolean linear, static ObClient *t = NULL; static GList *order = NULL; GList *it, *start, *list; - ObClient *ft; + ObClient *ft = NULL; if (cancel) { if (focus_cycle_target) @@ -398,11 +398,14 @@ void focus_directional_cycle(ObDirection dir, focus_cycle_target = ft; frame_adjust_focus(focus_cycle_target->frame, TRUE); } - popup_cycle(ft, dialog); + } + if (focus_cycle_target) { + popup_cycle(focus_cycle_target, dialog); if (dialog) return; } + done_cycle: if (done && focus_cycle_target) client_activate(focus_cycle_target, FALSE);