summaryrefslogtreecommitdiff
path: root/openbox
diff options
context:
space:
mode:
Diffstat (limited to 'openbox')
-rw-r--r--openbox/client.c1
-rw-r--r--openbox/client.h5
-rw-r--r--openbox/focus.c38
3 files changed, 24 insertions, 20 deletions
diff --git a/openbox/client.c b/openbox/client.c
index 40b0836e..beb5c986 100644
--- a/openbox/client.c
+++ b/openbox/client.c
@@ -2254,6 +2254,7 @@ gboolean client_can_focus(Client *self)
self->desktop == DESKTOP_ALL) &&
!self->iconic))
return FALSE;
+
return TRUE;
}
diff --git a/openbox/client.h b/openbox/client.h
index ad8f506b..70fc5a97 100644
--- a/openbox/client.h
+++ b/openbox/client.h
@@ -493,8 +493,9 @@ Client *client_search_focus_tree(Client *self);
*/
Client *client_search_focus_tree_full(Client *self);
-/*! Return a modal child of the client window
- @return A modal child of the client window, or 0 if none was found.
+/*! Return a modal child of the client window that can be focused.
+ @return A modal child of the client window that can be focused, or 0 if
+ none was found.
*/
Client *client_search_modal_child(Client *self);
diff --git a/openbox/focus.c b/openbox/focus.c
index 45b55012..761d4f4e 100644
--- a/openbox/focus.c
+++ b/openbox/focus.c
@@ -245,6 +245,8 @@ 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,
@@ -257,8 +259,22 @@ static void popup_cycle(Client *c, gboolean show)
*/
popup_size(focus_cycle_popup, 320, 48);
- popup_show(focus_cycle_popup, (c->iconic ? c->icon_title : c->title),
- client_icon(c, 48, 48));
+ /* use the transient's parent's title/icon */
+ 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);
}
}
@@ -278,22 +294,8 @@ Client *focus_cycle(gboolean forward, gboolean linear, gboolean done,
frame_adjust_focus(focus_client->frame, TRUE);
goto done_cycle;
} else if (done) {
- if (focus_cycle_target) {
- Client *t;
-
- /* actually focus a transient */
-
- /* fist, try for a modal */
- t = client_focus_target(focus_cycle_target);
- if (t != focus_cycle_target)
- focus_cycle_target = t;
- else
- /* just grab the deepest transient you can find */
- while (focus_cycle_target->transients)
- focus_cycle_target = focus_cycle_target->transients->data;
-
+ if (focus_cycle_target)
client_activate(focus_cycle_target);
- }
goto done_cycle;
}
if (!first)
@@ -320,7 +322,7 @@ Client *focus_cycle(gboolean forward, gboolean linear, gboolean done,
}
/*ft = client_focus_target(it->data);*/
ft = it->data;
- if (ft->transient_for == NULL && client_normal(ft) &&
+ if (ft->transients == NULL && client_normal(ft) &&
client_can_focus(ft)) {
if (ft != focus_cycle_target) { /* prevents flicker */
if (focus_cycle_target)