From eb2a0feb0154e86a1c6c117fd0f6d1a18959b694 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sat, 24 Mar 2007 23:19:45 +0000 Subject: [PATCH] watch for reverttoparent reverting to the root window, which will create a DetailInferior focusin event on root. adding some debug messages also which I am using.. --- openbox/client.c | 5 ++++- openbox/event.c | 12 +++++++++--- openbox/frame.c | 28 +++++++++++----------------- openbox/frame.h | 1 - 4 files changed, 24 insertions(+), 22 deletions(-) diff --git a/openbox/client.c b/openbox/client.c index f1be6fa4..a51ecfd7 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -220,13 +220,14 @@ void client_manage(Window window) grab_server(TRUE); - /* check if it has already been unmapped by the time we started mapping + /* check if it has already been unmapped by the time we started mapping. the grab does a sync so we don't have to here */ if (XCheckTypedWindowEvent(ob_display, window, DestroyNotify, &e) || XCheckTypedWindowEvent(ob_display, window, UnmapNotify, &e)) { XPutBackEvent(ob_display, &e); + ob_debug("Trying to manage unmapped window. Aborting that.\n"); grab_server(FALSE); return; /* don't manage it */ } @@ -393,6 +394,8 @@ void client_manage(Window window) won't be all wacko!! also, this moves the window to the position where it has been placed */ + ob_debug("placing window 0x%x at %d, %d with size %d x %d\n", + self->window, newx, newy, self->area.width, self->area.height); client_apply_startup_state(self, newx, newy); keyboard_grab_for_client(self, TRUE); diff --git a/openbox/event.c b/openbox/event.c index b5703782..7e66cc28 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -329,7 +329,8 @@ static gboolean wanted_focusevent(XEvent *e) if (win == RootWindow(ob_display, ob_screen)) { /* This means focus reverted off of a client */ - if (detail == NotifyPointerRoot || detail == NotifyDetailNone) + if (detail == NotifyPointerRoot || detail == NotifyDetailNone || + detail == NotifyInferior) return TRUE; else return FALSE; @@ -688,7 +689,8 @@ static void event_handle_client(ObClient *client, XEvent *e) } else if (ce.xfocus.detail == NotifyInferior) { ob_debug("Focus went to parent\n"); /* Focus has been reverted to parent, which is our frame window, - so fall back to something other than the window which had it. */ + or the root window, so fall back to something other than the + window which had it. */ focus_fallback(FALSE); } else { /* Focus did move, so process the FocusIn event */ @@ -906,7 +908,10 @@ static void event_handle_client(ObClient *client, XEvent *e) } break; case UnmapNotify: - ob_debug("UnmapNotify for window 0x%x\n", client->window); + ob_debug("UnmapNotify for window 0x%x eventwin 0x%x sendevent %d " + "ignores left %d\n", + client->window, e->xunmap.event, e->xunmap.from_configure, + client->ignore_unmaps); if (client->ignore_unmaps) { client->ignore_unmaps--; break; @@ -932,6 +937,7 @@ static void event_handle_client(ObClient *client, XEvent *e) X server to deal with after we unmanage the window */ XPutBackEvent(ob_display, e); + ob_debug("ReparentNotify for window 0x%x\n", client->window); client_unmanage(client); break; case MapRequest: diff --git a/openbox/frame.c b/openbox/frame.c index 5383f7a3..880ab1b5 100644 --- a/openbox/frame.c +++ b/openbox/frame.c @@ -234,32 +234,26 @@ static void frame_free(ObFrame *self) void frame_show(ObFrame *self) { + ob_debug("frame_show for window 0x%x : %d\n", self->client->window, + self->visible); if (!self->visible) { self->visible = TRUE; XMapWindow(ob_display, self->client->window); XMapWindow(ob_display, self->window); - self->firstmap = TRUE; } } void frame_hide(ObFrame *self) { - if (self->visible || self->firstmap == FALSE) { - if (self->visible) { - self->visible = FALSE; - self->client->ignore_unmaps += 1; - /* we unmap the client itself so that we can get MapRequest - events, and because the ICCCM tells us to! */ - XUnmapWindow(ob_display, self->window); - XUnmapWindow(ob_display, self->client->window); - } else { - /* the frame wasn't visible, but the frame is being hidden now. - so we don't need to unmap the frame, but we do need to unmap - the client. */ - self->client->ignore_unmaps += 1; - XUnmapWindow(ob_display, self->client->window); - } - self->firstmap = TRUE; + ob_debug("frame_hide for window 0x%x : %d\n", self->client->window, + self->visible); + if (self->visible) { + self->visible = FALSE; + self->client->ignore_unmaps += 1; + /* we unmap the client itself so that we can get MapRequest + events, and because the ICCCM tells us to! */ + XUnmapWindow(ob_display, self->window); + XUnmapWindow(ob_display, self->client->window); } } diff --git a/openbox/frame.h b/openbox/frame.h index 70855b1b..0d044366 100644 --- a/openbox/frame.h +++ b/openbox/frame.h @@ -76,7 +76,6 @@ struct _ObFrame Strut size; Rect area; gboolean visible; - gboolean firstmap; /*! Whether the window is obscured at all or fully visible. */ gboolean obscured; -- 2.44.0