- and such, and then when I try focus them, I won't get a FocusIn event
- at all for them.
- */
- focus_set_client(NULL);
-
- if ((new = focus_fallback_target(type)))
- client_focus(new);
-}
-
-static void popup_cycle(ObClient *c, gboolean show)
-{
- if (!show) {
- icon_popup_hide(focus_cycle_popup);
- } else {
- Rect *a;
- ObClient *p = c;
- char *title;
-
- a = screen_physical_area_monitor(0);
- icon_popup_position(focus_cycle_popup, CenterGravity,
- a->x + a->width / 2, a->y + a->height / 2);
-/* icon_popup_size(focus_cycle_popup, a->height/2, a->height/16);
- icon_popup_show(focus_cycle_popup, c->title,
- client_icon(c, a->height/16, a->height/16));
-*/
- /* XXX the size and the font extents need to be related on some level
- */
- icon_popup_size(focus_cycle_popup, POPUP_WIDTH, POPUP_HEIGHT);
-
- /* use the transient's parent's title/icon */
- while (p->transient_for && p->transient_for != OB_TRAN_GROUP)
- p = p->transient_for;
-
- if (p == c)
- title = NULL;
- else
- 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)),
- client_icon(p, 48, 48));
- g_free(title);
- }
-}
-
-static gboolean valid_focus_target(ObClient *ft)
-{
- /* we don't use client_can_focus here, because that doesn't let you
- 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->transients && client_normal(ft) &&
- ((ft->can_focus || ft->focus_notify) &&
- !ft->skip_taskbar &&
- (ft->desktop == screen_desktop || ft->desktop == DESKTOP_ALL)));
-}
-
-void focus_cycle(gboolean forward, gboolean linear,
- gboolean dialog, gboolean done, gboolean cancel)
-{
- static ObClient *first = NULL;
- static ObClient *t = NULL;
- static GList *order = NULL;
- GList *it, *start, *list;
- ObClient *ft = NULL;
-
- if (cancel) {
- if (focus_cycle_target)
- frame_adjust_focus(focus_cycle_target->frame, FALSE);
- if (focus_client)
- frame_adjust_focus(focus_client->frame, TRUE);
- focus_cycle_target = NULL;
- goto done_cycle;
- } else if (done && dialog) {
- 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 (linear) list = client_list;
- else list = focus_order[screen_desktop];
-
- start = it = g_list_find(list, focus_cycle_target);
- if (!start) /* switched desktops or something? */
- start = it = forward ? g_list_last(list) : g_list_first(list);
- if (!start) goto done_cycle;
-
- do {
- if (forward) {
- it = it->next;
- if (it == NULL) it = g_list_first(list);
- } else {
- it = it->prev;
- if (it == NULL) it = g_list_last(list);
- }
- ft = it->data;
- if (valid_focus_target(ft)) {
- if (ft != focus_cycle_target) { /* prevents flicker */
- if (focus_cycle_target)
- frame_adjust_focus(focus_cycle_target->frame, FALSE);
- focus_cycle_target = ft;
- frame_adjust_focus(focus_cycle_target->frame, TRUE);
- }
- popup_cycle(ft, dialog);
- return;
- }
- } while (it != start);