X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=openbox%2Ffocus.c;h=cf65ff25a9b16cbeb8c6a87a09a060b292dbd67f;hb=857245960e4a35f9307f1b6124a4b7b4e726298b;hp=788e168359276ea05881f27ab1fb1bbf02e04f2e;hpb=b4eecc51b55509a0b9c8b5f8cdd536f6b668af58;p=chaz%2Fopenbox diff --git a/openbox/focus.c b/openbox/focus.c index 788e1683..cf65ff25 100644 --- a/openbox/focus.c +++ b/openbox/focus.c @@ -37,6 +37,8 @@ #include #include +#define FOCUS_INDICATOR_WIDTH 5 + ObClient *focus_client = NULL; GList *focus_order = NULL; ObClient *focus_cycle_target = NULL; @@ -232,24 +234,19 @@ ObClient* focus_fallback_target(gboolean allow_refocus, ObClient *old) ObClient *c = it->data; /* fallback focus to a window if: 1. it is actually focusable, cuz if it's not then we're sending - focus off to nothing - 2. it is validated. if the window is about to disappear, then - don't try focus it. - 3. it is visible on the current desktop. this ignores - omnipresent windows, which are problematic in their own rite. - 4. it's not iconic - 5. it is a normal type window, don't fall back onto a dock or + focus off to nothing. this includes if it is visible right now + 2. it is on the current desktop. this ignores omnipresent + windows, which are problematic in their own rite. + 3. it is a normal type window, don't fall back onto a dock or a splashscreen or a desktop window (save the desktop as a backup fallback though) */ - if (client_can_focus(c) && !c->iconic) + if (client_can_focus(c)) { if (c->desktop == screen_desktop && client_normal(c)) { ob_debug_type(OB_DEBUG_FOCUS, "found in focus order\n"); return it->data; - } else if ((c->desktop == screen_desktop || - c->desktop == DESKTOP_ALL) && - c->type == OB_CLIENT_TYPE_DESKTOP && + } else if (c->type == OB_CLIENT_TYPE_DESKTOP && desktop == NULL) desktop = c; } @@ -304,13 +301,8 @@ static void popup_cycle(ObClient *c, gboolean show) 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); + icon_popup_width(focus_cycle_popup, MAX(a->width/3, POPUP_WIDTH)); + icon_popup_height(focus_cycle_popup, POPUP_HEIGHT); /* use the transient's parent's title/icon */ while (p->transient_for && p->transient_for != OB_TRAN_GROUP) @@ -350,10 +342,7 @@ void focus_cycle_draw_indicator() gint x, y, w, h; gint wt, wl, wr, wb; - wt = wl = wr = wb = MAX(3, - MAX(1, MAX(ob_rr_theme->paddingx, - ob_rr_theme->paddingy)) * 2 + - ob_rr_theme->fbwidth * 2); + wt = wl = wr = wb = FOCUS_INDICATOR_WIDTH; x = focus_cycle_target->frame->area.x; y = focus_cycle_target->frame->area.y; @@ -480,12 +469,20 @@ static gboolean valid_focus_target(ObClient *ft, gboolean dock_windows) else ok = (ft->type == OB_CLIENT_TYPE_NORMAL || ft->type == OB_CLIENT_TYPE_DIALOG || - (!client_has_group_siblings(ft) && - (ft->type == OB_CLIENT_TYPE_TOOLBAR || + ((ft->type == OB_CLIENT_TYPE_TOOLBAR || ft->type == OB_CLIENT_TYPE_MENU || - ft->type == OB_CLIENT_TYPE_UTILITY))); + ft->type == OB_CLIENT_TYPE_UTILITY) && + /* let alt-tab go to these windows when a window in its group + already has focus ... */ + ((focus_client && ft->group == focus_client->group) || + /* ... or if there are no application windows in its group */ + !client_has_application_group_siblings(ft)))); ok = ok && (ft->can_focus || ft->focus_notify); - ok = ok && !ft->skip_pager; + if (!dock_windows && /* use dock windows that skip taskbar too */ + !(ft->type == OB_CLIENT_TYPE_TOOLBAR || /* also, if we actually are */ + ft->type == OB_CLIENT_TYPE_MENU || /* being allowed to target */ + ft->type == OB_CLIENT_TYPE_UTILITY)) /* one of these, don't let */ + ok = ok && !ft->skip_taskbar; /* skip taskbar stop us */ ok = ok && (ft->desktop == screen_desktop || ft->desktop == DESKTOP_ALL); ok = ok && ft == client_focus_target(ft); return ok; @@ -496,7 +493,7 @@ static gboolean valid_focus_target(ObClient *ft, gboolean dock_windows) for (it = ft->transients; it; it = g_slist_next(it)) { ObClient *c = it->data; - if (c->frame->visible) + if (frame_visible(c->frame)) return FALSE; } return TRUE; @@ -763,8 +760,6 @@ void focus_order_add_new(ObClient *c) void focus_order_remove(ObClient *c) { focus_order = g_list_remove(focus_order, c); - if (c == focus_client) - focus_client = NULL; } void focus_order_to_top(ObClient *c)