summaryrefslogtreecommitdiff
path: root/openbox
diff options
context:
space:
mode:
Diffstat (limited to 'openbox')
-rw-r--r--openbox/client.c6
-rw-r--r--openbox/event.c4
-rw-r--r--openbox/focus.c28
-rw-r--r--openbox/focus.h8
-rw-r--r--openbox/screen.c2
5 files changed, 24 insertions, 24 deletions
diff --git a/openbox/client.c b/openbox/client.c
index 68e1e098..22db6738 100644
--- a/openbox/client.c
+++ b/openbox/client.c
@@ -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)
diff --git a/openbox/event.c b/openbox/event.c
index 3a8f96b6..04174af0 100644
--- a/openbox/event.c
+++ b/openbox/event.c
@@ -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:
diff --git a/openbox/focus.c b/openbox/focus.c
index d0886a50..8afbdcb6 100644
--- a/openbox/focus.c
+++ b/openbox/focus.c
@@ -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;
diff --git a/openbox/focus.h b/openbox/focus.h
index 4c8d4c98..3ad60682 100644
--- a/openbox/focus.h
+++ b/openbox/focus.h
@@ -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. */
diff --git a/openbox/screen.c b/openbox/screen.c
index 3145a63c..4b551b7e 100644
--- a/openbox/screen.c
+++ b/openbox/screen.c
@@ -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);
}