#include "prop.h"
#include "dispatch.h"
#include "focus.h"
-#include "parse.h"
#include "stacking.h"
#include "popup.h"
#include <X11/Xlib.h>
#include <glib.h>
+#include <assert.h>
Client *focus_client = NULL;
GList **focus_order = NULL; /* these lists are created when screen_startup
for (sit = old->group->members; sit; sit = sit->next)
if (sit->data == it->data)
if (sit->data != old && client_normal(sit->data))
- if (client_focus(sit->data))
+ if (client_can_focus(sit->data)) {
+ gboolean r = client_focus(sit->data);
+ assert(r);
return;
+ }
}
}
checks for this is in transient/group fallbacks, so they can
be fallback targets there. */
!((Client*)it->data)->fullscreen &&
- client_focus(it->data))
+ client_can_focus(it->data)) {
+ gboolean r = client_focus(it->data);
+ assert(r);
return;
+ }
- /* nothing to focus */
- focus_set_client(NULL);
+ /* nothing to focus, and already set it to none above */
}
static void popup_cycle(Client *c, gboolean show)
popup_hide(focus_cycle_popup);
} else {
Rect *a;
+ Client *p = c;
+ char *title;
a = screen_area(c->desktop);
popup_position(focus_cycle_popup, CenterGravity,
popup_size(focus_cycle_popup, 320, 48);
/* use the transient's parent's title/icon */
- while (c->transient_for && c->transient_for != TRAN_GROUP)
- c = c->transient_for;
-
- popup_show(focus_cycle_popup, (c->iconic ? c->icon_title : c->title),
- client_icon(c, 48, 48));
+ while (p->transient_for && p->transient_for != TRAN_GROUP)
+ p = p->transient_for;
+
+ if (p == c)
+ title = NULL;
+ else
+ title = g_strconcat((p->iconic ? p->icon_title : p->title),
+ " - ",
+ (c->iconic ? c->icon_title : c->title),
+ NULL);
+
+ popup_show(focus_cycle_popup,
+ (title ? title : (c->iconic ? c->icon_title : c->title)),
+ client_icon(p, 48, 48));
+ g_free(title);
}
}
}
/*ft = client_focus_target(it->data);*/
ft = it->data;
- if (ft->transients == NULL && /*ft == it->data &&*/client_normal(ft) &&
- (ft->can_focus || ft->focus_notify) &&
- (ft->desktop == screen_desktop || ft->desktop == DESKTOP_ALL)) {
+ /* 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 */
+ if (ft->transients == NULL && client_normal(ft) &&
+ ((ft->can_focus || ft->focus_notify) &&
+ (ft->desktop == screen_desktop || ft->desktop == DESKTOP_ALL))) {
if (ft != focus_cycle_target) { /* prevents flicker */
if (focus_cycle_target)
frame_adjust_focus(focus_cycle_target->frame, FALSE);