summaryrefslogtreecommitdiff
path: root/openbox/event.c
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2007-05-24 21:50:35 +0000
committerDana Jansens <danakj@orodu.net>2007-05-24 21:50:35 +0000
commitf638c5b8fac29cffb62de1f6cab351b48afda918 (patch)
treeca361c5e42ae3d5260610ad065c64cfddda6c1a0 /openbox/event.c
parent70fc99f90eac59498e603a38cdb583e9f4536cba (diff)
some focus changes...
1) listen for inferiornotify. that way when iconify animating reverts to parent, we see it. 2) set client to null when falling back and update the root window property 3) get rid of the "focus didnt move anywhere" business, and just process the envents in the right order.
Diffstat (limited to 'openbox/event.c')
-rw-r--r--openbox/event.c31
1 files changed, 17 insertions, 14 deletions
diff --git a/openbox/event.c b/openbox/event.c
index c19f7017..6e11f82e 100644
--- a/openbox/event.c
+++ b/openbox/event.c
@@ -319,6 +319,12 @@ static gboolean wanted_focusevent(XEvent *e, gboolean in_client_only)
if (!w || !WINDOW_IS_CLIENT(w))
return FALSE;
}
+ else {
+ /* This means focus reverted to parent from the client (this
+ happens often during iconify animation) */
+ if (detail == NotifyInferior)
+ return TRUE;
+ }
/* This means focus moved from the root window to a client */
if (detail == NotifyVirtual)
@@ -480,7 +486,8 @@ static void event_process(const XEvent *ec, gpointer data)
{
XEvent ce;
- ob_debug_type(OB_DEBUG_FOCUS, "Focus went to pointer root/none\n");
+ ob_debug_type(OB_DEBUG_FOCUS, "Focus went to pointer root/none or"
+ " the frame window\n");
/* If another FocusIn is in the queue then don't fallback yet. This
fixes the fun case of:
@@ -502,7 +509,7 @@ static void event_process(const XEvent *ec, gpointer data)
ob_debug_type(OB_DEBUG_FOCUS,
" but another FocusIn is coming\n");
} else {
- /* Focus has been reverted to the root window or nothing.
+ /* Focus has been reverted.
FocusOut events come after UnmapNotify, so we don't need to
worry about focusing an invalid window
@@ -532,6 +539,13 @@ static void event_process(const XEvent *ec, gpointer data)
gboolean nomove = FALSE;
XEvent ce;
+ if (client) {
+ frame_adjust_focus(client->frame, FALSE);
+ /* focus_set_client(NULL) has already been called in this
+ section or by focus_fallback */
+ client_calc_layer(client);
+ }
+
/* Look for the followup FocusIn */
if (!XCheckIfEvent(ob_display, &ce, event_look_for_focusin, NULL)) {
/* There is no FocusIn, this means focus went to a window that
@@ -554,12 +568,8 @@ static void event_process(const XEvent *ec, gpointer data)
xerror_set_ignore(FALSE);
/* nothing is focused */
focus_set_client(NULL);
- } else if (ce.xany.window == e->xany.window) {
- ob_debug_type(OB_DEBUG_FOCUS, "Focus didn't go anywhere\n");
- /* If focus didn't actually move anywhere, there is nothing to do*/
- nomove = TRUE;
} else {
- /* Focus did move, so process the FocusIn event */
+ /* Focus moved, so process the FocusIn event */
ObEventData ed = { .ignored = FALSE };
event_process(&ce, &ed);
if (ed.ignored) {
@@ -571,13 +581,6 @@ static void event_process(const XEvent *ec, gpointer data)
focus_fallback(TRUE);
}
}
-
- if (client && !nomove) {
- frame_adjust_focus(client->frame, FALSE);
- if (client == focus_client)
- focus_set_client(NULL);
- client_calc_layer(client);
- }
} else if (timewinclients)
event_handle_user_time_window_clients(timewinclients, e);
else if (client)