X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Ffocus_cycle.c;h=46f5f058daff1bf5424973dec9693807ff5708e2;hb=0c8c23e8fdef2936d2ca425dcbf35e4eb7dd7edf;hp=cb6678d27002128ab5afe407273e77e40b0b6937;hpb=508ce538c04f72b4c0aafe9a66b04f7f2c151a05;p=chaz%2Fopenbox diff --git a/openbox/focus_cycle.c b/openbox/focus_cycle.c index cb6678d2..46f5f058 100644 --- a/openbox/focus_cycle.c +++ b/openbox/focus_cycle.c @@ -31,9 +31,12 @@ #include #include -ObClient *focus_cycle_target = NULL; +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); @@ -49,34 +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(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE); -} - /*! 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, @@ -187,7 +185,15 @@ void focus_cycle(gboolean forward, gboolean all_desktops, goto done_cycle; list = client_list; } - if (!focus_cycle_target) focus_cycle_target = focus_client; + + + if (focus_cycle_target == NULL) { + 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; + } start = it = g_list_find(list, focus_cycle_target); if (!start) /* switched desktops or something? */ @@ -203,9 +209,11 @@ 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, - all_desktops, dock_windows, - desktop_windows)) + if (focus_cycle_target_valid(ft, + focus_cycle_iconic_windows, + focus_cycle_all_desktops, + focus_cycle_dock_windows, + focus_cycle_desktop_windows)) { if (interactive) { if (ft != focus_cycle_target) { /* prevents flicker */ @@ -214,9 +222,11 @@ void focus_cycle(gboolean forward, gboolean all_desktops, } if (dialog) /* same arguments as focus_target_valid */ - focus_cycle_popup_show(ft, TRUE, - all_desktops, dock_windows, - desktop_windows); + focus_cycle_popup_show(ft, + focus_cycle_iconic_windows, + focus_cycle_all_desktops, + focus_cycle_dock_windows, + focus_cycle_desktop_windows); return; } else if (ft != focus_cycle_target) { focus_cycle_target = ft; @@ -357,8 +367,15 @@ void focus_directional_cycle(ObDirection dir, gboolean dock_windows, if (!focus_order) 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; + focus_cycle_target = focus_client; + } + if (!first) first = focus_client; - if (!focus_cycle_target) focus_cycle_target = focus_client; if (focus_cycle_target) ft = focus_find_directional(focus_cycle_target, dir, dock_windows, @@ -367,8 +384,11 @@ 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, dock_windows, - desktop_windows)) + 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; } @@ -381,8 +401,10 @@ 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, dock_windows, - desktop_windows); + focus_cycle_iconic_windows, + focus_cycle_all_desktops, + focus_cycle_dock_windows, + focus_cycle_desktop_windows); return; }