X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=sidebyside;f=openbox%2Ffocus_cycle.c;h=46f5f058daff1bf5424973dec9693807ff5708e2;hb=a38012f2fff30aa48913c5020e72f537c742542f;hp=4e231b03f33ff01122ee320eda3d67735ba57d9e;hpb=5d9b0596016f2b72cc8851a20c6e21b331f91a2a;p=chaz%2Fopenbox diff --git a/openbox/focus_cycle.c b/openbox/focus_cycle.c index 4e231b03..46f5f058 100644 --- a/openbox/focus_cycle.c +++ b/openbox/focus_cycle.c @@ -32,11 +32,11 @@ #include ObClient *focus_cycle_target = NULL; +static gboolean focus_cycle_iconic_windows; static gboolean focus_cycle_all_desktops; static gboolean focus_cycle_dock_windows; static gboolean focus_cycle_desktop_windows; -static void focus_cycle_destroy_notify (ObClient *client, gpointer data); static gboolean focus_target_has_siblings (ObClient *ft, gboolean iconic_windows, gboolean all_desktops); @@ -52,33 +52,29 @@ static ObClient *focus_find_directional (ObClient *c, void focus_cycle_startup(gboolean reconfig) { if (reconfig) return; - - client_add_destroy_notify(focus_cycle_destroy_notify, NULL); } void focus_cycle_shutdown(gboolean reconfig) { if (reconfig) return; - - client_remove_destroy_notify(focus_cycle_destroy_notify); } -void focus_cycle_stop() +void focus_cycle_stop(ObClient *ifclient) { - if (focus_cycle_target) { + /* stop focus cycling if the given client is a valid focus target, + and so the cycling is being disrupted */ + if (focus_cycle_target && ifclient && + focus_cycle_target_valid(ifclient, + focus_cycle_iconic_windows, + focus_cycle_all_desktops, + focus_cycle_dock_windows, + focus_cycle_desktop_windows)) + { focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE); focus_directional_cycle(0, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE); } } -static void focus_cycle_destroy_notify(ObClient *client, gpointer data) -{ - /* end cycling if the target disappears. CurrentTime is fine, time won't - be used */ - if (focus_cycle_target == client) - focus_cycle_stop(); -} - /*! Returns if a focus target has valid group siblings that can be cycled to in its place */ static gboolean focus_target_has_siblings(ObClient *ft, @@ -192,7 +188,8 @@ void focus_cycle(gboolean forward, gboolean all_desktops, if (focus_cycle_target == NULL) { - focus_cycle_all_desktops = FALSE; + focus_cycle_iconic_windows = TRUE; + focus_cycle_all_desktops = all_desktops; focus_cycle_dock_windows = dock_windows; focus_cycle_desktop_windows = desktop_windows; focus_cycle_target = focus_client; @@ -212,7 +209,8 @@ void focus_cycle(gboolean forward, gboolean all_desktops, if (it == NULL) it = g_list_last(list); } ft = it->data; - if (focus_cycle_target_valid(ft, TRUE, + if (focus_cycle_target_valid(ft, + focus_cycle_iconic_windows, focus_cycle_all_desktops, focus_cycle_dock_windows, focus_cycle_desktop_windows)) @@ -224,7 +222,8 @@ void focus_cycle(gboolean forward, gboolean all_desktops, } if (dialog) /* same arguments as focus_target_valid */ - focus_cycle_popup_show(ft, TRUE, + focus_cycle_popup_show(ft, + focus_cycle_iconic_windows, focus_cycle_all_desktops, focus_cycle_dock_windows, focus_cycle_desktop_windows); @@ -369,6 +368,7 @@ void focus_directional_cycle(ObDirection dir, gboolean dock_windows, goto done_cycle; if (focus_cycle_target == NULL) { + focus_cycle_iconic_windows = FALSE; focus_cycle_all_desktops = FALSE; focus_cycle_dock_windows = dock_windows; focus_cycle_desktop_windows = desktop_windows; @@ -384,7 +384,9 @@ void focus_directional_cycle(ObDirection dir, gboolean dock_windows, GList *it; for (it = focus_order; it; it = g_list_next(it)) - if (focus_cycle_target_valid(it->data, FALSE, FALSE, + if (focus_cycle_target_valid(it->data, + focus_cycle_iconic_windows, + focus_cycle_all_desktops, focus_cycle_dock_windows, focus_cycle_desktop_windows)) ft = it->data; @@ -399,7 +401,8 @@ void focus_directional_cycle(ObDirection dir, gboolean dock_windows, if (focus_cycle_target && dialog) { /* same arguments as focus_target_valid */ focus_cycle_popup_single_show(focus_cycle_target, - FALSE, FALSE, + focus_cycle_iconic_windows, + focus_cycle_all_desktops, focus_cycle_dock_windows, focus_cycle_desktop_windows); return;