add more options for focus fallback, use an enum for all the types of fallbacks.

This commit is contained in:
Dana Jansens 2003-04-08 06:14:53 +00:00
parent 40bfb2b6e5
commit c99bb4a049
5 changed files with 24 additions and 24 deletions

View file

@ -139,7 +139,7 @@ void client_manage_all()
client_startup_stack_size = 0;
if (focus_new)
focus_fallback(FALSE);
focus_fallback(Fallback_NoFocus);
}
void client_manage(Window window)
@ -312,7 +312,7 @@ void client_unmanage(Client *self)
}
}
focus_fallback(FALSE);
client_unfocus(self);
/* remove from its group */
if (self->group) {
@ -2080,7 +2080,7 @@ void client_unfocus(Client *self)
{
g_assert(focus_client == self);
g_message("client_unfocus");
focus_fallback(FALSE);
focus_fallback(Fallback_Unfocusing);
}
gboolean client_focused(Client *self)

View file

@ -277,11 +277,11 @@ void event_process(XEvent *e)
/* secret magic way of event_process telling us that no client
was found for the FocusIn event. ^_^ */
if (!isfo && fi.xfocus.window == None)
focus_fallback(FALSE);
focus_fallback(Fallback_NoFocus);
if (fi.xfocus.window == e->xfocus.window)
return;
} else
focus_fallback(FALSE);
focus_fallback(Fallback_NoFocus);
}
break;
case EnterNotify:

View file

@ -163,7 +163,7 @@ static gboolean focus_under_pointer()
return FALSE;
}
void focus_fallback(gboolean switching_desks)
void focus_fallback(FallbackType type)
{
GList *it;
Client *old = NULL;
@ -176,17 +176,12 @@ void focus_fallback(gboolean switching_desks)
*/
focus_set_client(NULL);
if (switching_desks) {
/* don't skip any windows when switching desktops */
old = NULL;
}
if (!(switching_desks ? focus_last_on_desktop : focus_last)) {
if (!(type == Fallback_Desktop ? focus_last_on_desktop : focus_last)) {
if (focus_follow) focus_under_pointer();
return;
}
if (old && old->transient_for) {
if (type == Fallback_Unfocusing && old && old->transient_for) {
if (old->transient_for == TRAN_GROUP) {
for (it = focus_order[screen_desktop]; it != NULL; it = it->next) {
GSList *sit;
@ -196,14 +191,15 @@ void focus_fallback(gboolean switching_desks)
return;
}
} else {
if (client_focus(old->transient_for))
return;
if (client_normal(old->transient_for))
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))
if (type != Fallback_Unfocusing || it->data != old)
if (client_normal(it->data) && client_focus(it->data))
return;
/* nothing to focus */
@ -249,11 +245,9 @@ Client *focus_cycle(gboolean forward, gboolean linear, gboolean done,
}
ft = client_focus_target(it->data);
if (ft == it->data && focus_client != ft && client_normal(ft) &&
client_focusable(ft)) {
if (client_focus(ft)) {
noreorder++; /* avoid reordering the focus_order */
return ft;
}
client_focus(ft)) {
noreorder++; /* avoid reordering the focus_order */
return ft;
}
} while (it != start);
return NULL;

View file

@ -27,8 +27,14 @@ void focus_shutdown();
send focus anywhere, its called by the Focus event handlers */
void focus_set_client(struct Client *client);
typedef enum {
Fallback_Desktop, /* switching desktops */
Fallback_Unfocusing, /* forcefully remove focus from the curernt window */
Fallback_NoFocus /* nothing has focus for some reason */
} FallbackType;
/*! Call this when you need to focus something! */
void focus_fallback(gboolean switching_desks);
void focus_fallback(FallbackType type);
/*! Cycle focus amongst windows
Returns the Client to which focus has been cycled, or NULL if none. */

View file

@ -290,7 +290,7 @@ void screen_set_desktop(guint num)
from the switch so it doesnt mess with the focus */
XSync(ob_display, FALSE);
while (XCheckTypedEvent(ob_display, EnterNotify, &e));
focus_fallback(TRUE);
focus_fallback(Fallback_Desktop);
dispatch_ob(Event_Ob_Desktop, num, old);
}