X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Ffocus.c;h=b81e5632c4dbd68148177e3cfb98ebaa323265c6;hb=de1559a09497ae4ead44a6e70b556123a5bab35c;hp=63d2c97194b2f36fdc0f048f51c34ae538bf67e2;hpb=b2b8ad92bfbc60392737fe9945e719b238d34933;p=chaz%2Fopenbox diff --git a/openbox/focus.c b/openbox/focus.c index 63d2c971..b81e5632 100644 --- a/openbox/focus.c +++ b/openbox/focus.c @@ -58,7 +58,7 @@ static void focus_cycle_destructor(ObClient *client, gpointer data) { /* end cycling if the target disappears */ if (focus_cycle_target == client) - focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE); + focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE); } static Window createWindow(Window parent, gulong mask, @@ -192,7 +192,7 @@ void focus_set_client(ObClient *client) /* in the middle of cycling..? kill it. */ if (focus_cycle_target) - focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE); + focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE); old = focus_client; focus_client = client; @@ -356,14 +356,13 @@ static void popup_cycle(ObClient *c, gboolean show) while (p->transient_for && p->transient_for != OB_TRAN_GROUP) p = p->transient_for; -/* - if (p != c) - title = g_strconcat((c->iconic ? c->icon_title : c->title), + if (p != c && !strcmp("", (c->iconic ? c->icon_title : c->title))) + title = g_strdup(p->iconic ? p->icon_title : p->title); + /*title = g_strconcat((c->iconic ? c->icon_title : c->title), " - ", (p->iconic ? p->icon_title : p->title), NULL); -*/ - + */ icon_popup_show(focus_cycle_popup, (title ? title : (c->iconic ? c->icon_title : c->title)), @@ -539,7 +538,7 @@ static gboolean valid_focus_target(ObClient *ft) return FALSE; } -void focus_cycle(gboolean forward, gboolean linear, +void focus_cycle(gboolean forward, gboolean linear, gboolean interactive, gboolean dialog, gboolean done, gboolean cancel) { static ObClient *first = NULL; @@ -548,20 +547,26 @@ void focus_cycle(gboolean forward, gboolean linear, GList *it, *start, *list; ObClient *ft = NULL; - if (cancel) { - focus_cycle_target = NULL; - goto done_cycle; - } else if (done) - goto done_cycle; + if (interactive) { + if (cancel) { + focus_cycle_target = NULL; + goto done_cycle; + } else if (done) + goto done_cycle; - if (!focus_order[screen_desktop]) - goto done_cycle; + if (!focus_order[screen_desktop]) + goto done_cycle; - if (!first) first = focus_client; - if (!focus_cycle_target) focus_cycle_target = focus_client; + if (!first) first = focus_client; - if (linear) list = client_list; - else list = focus_order[screen_desktop]; + if (linear) list = client_list; + else list = focus_order[screen_desktop]; + } else { + if (!focus_order[screen_desktop]) + goto done_cycle; + list = client_list; + } + if (!focus_cycle_target) focus_cycle_target = focus_client; start = it = g_list_find(list, focus_cycle_target); if (!start) /* switched desktops or something? */ @@ -578,12 +583,18 @@ void focus_cycle(gboolean forward, gboolean linear, } ft = it->data; if (valid_focus_target(ft)) { - if (ft != focus_cycle_target) { /* prevents flicker */ + if (interactive) { + if (ft != focus_cycle_target) { /* prevents flicker */ + focus_cycle_target = ft; + focus_cycle_draw_indicator(); + } + popup_cycle(ft, dialog); + return; + } else if (ft != focus_cycle_target) { focus_cycle_target = ft; - focus_cycle_draw_indicator(); + done = TRUE; + break; } - popup_cycle(ft, dialog); - return; } } while (it != start); @@ -597,18 +608,23 @@ done_cycle: g_list_free(order); order = NULL; - focus_cycle_draw_indicator(); - popup_cycle(ft, FALSE); + if (interactive) { + focus_cycle_draw_indicator(); + popup_cycle(ft, FALSE); + } return; } -void focus_directional_cycle(ObDirection dir, +void focus_directional_cycle(ObDirection dir, gboolean interactive, gboolean dialog, gboolean done, gboolean cancel) { static ObClient *first = NULL; ObClient *ft = NULL; + if (!interactive) + return; + if (cancel) { focus_cycle_target = NULL; goto done_cycle;