fallback to transients' parents when possible.

return the Client* which was focused from focus_cycle
This commit is contained in:
Dana Jansens 2003-04-08 01:03:26 +00:00
parent fc32577766
commit f278ec41e4
2 changed files with 24 additions and 6 deletions

View file

@ -3,6 +3,7 @@
#include "client.h"
#include "frame.h"
#include "screen.h"
#include "group.h"
#include "prop.h"
#include "dispatch.h"
#include "focus.h"
@ -185,6 +186,21 @@ void focus_fallback(gboolean switching_desks)
return;
}
if (old && old->transient_for) {
if (old->transient_for == TRAN_GROUP) {
for (it = focus_order[screen_desktop]; it != NULL; it = it->next) {
GSList *sit;
for (sit = old->group->members; sit; sit = sit->next)
if (sit->data == it->data && client_focus(sit->data))
return;
}
} else {
if (client_focus(old->transient_for))
return;
}
}
for (it = focus_order[screen_desktop]; it != NULL; it = it->next)
if (it->data != old && client_normal(it->data))
if (client_focus(it->data))
@ -194,7 +210,7 @@ void focus_fallback(gboolean switching_desks)
focus_set_client(NULL);
}
void focus_cycle(gboolean forward, gboolean linear, gboolean done,
Client *focus_cycle(gboolean forward, gboolean linear, gboolean done,
gboolean cancel)
{
static Client *first = NULL;
@ -235,15 +251,16 @@ void focus_cycle(gboolean forward, gboolean linear, gboolean done,
if (ft == it->data && focus_client != ft && client_focusable(ft)) {
if (client_focus(ft)) {
noreorder++; /* avoid reordering the focus_order */
break;
return ft;
}
}
} while (it != start);
return;
return NULL;
done_cycle:
t = NULL;
first = NULL;
g_list_free(order);
order = NULL;
return NULL;
}

View file

@ -30,8 +30,9 @@ void focus_set_client(struct Client *client);
/*! Call this when you need to focus something! */
void focus_fallback(gboolean switching_desks);
/*! Cycle focus amongst windows */
void focus_cycle(gboolean forward, gboolean linear, gboolean done,
gboolean cancel);
/*! Cycle focus amongst windows
Returns the Client to which focus has been cycled, or NULL if none. */
struct Client *focus_cycle(gboolean forward, gboolean linear, gboolean done,
gboolean cancel);
#endif