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..
This commit is contained in:
Dana Jansens 2007-03-24 23:19:45 +00:00
parent 4aa8d64f76
commit eb2a0feb01
4 changed files with 24 additions and 22 deletions

View file

@ -220,13 +220,14 @@ void client_manage(Window window)
grab_server(TRUE); 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 */ the grab does a sync so we don't have to here */
if (XCheckTypedWindowEvent(ob_display, window, DestroyNotify, &e) || if (XCheckTypedWindowEvent(ob_display, window, DestroyNotify, &e) ||
XCheckTypedWindowEvent(ob_display, window, UnmapNotify, &e)) XCheckTypedWindowEvent(ob_display, window, UnmapNotify, &e))
{ {
XPutBackEvent(ob_display, &e); XPutBackEvent(ob_display, &e);
ob_debug("Trying to manage unmapped window. Aborting that.\n");
grab_server(FALSE); grab_server(FALSE);
return; /* don't manage it */ return; /* don't manage it */
} }
@ -393,6 +394,8 @@ void client_manage(Window window)
won't be all wacko!! won't be all wacko!!
also, this moves the window to the position where it has been placed 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); client_apply_startup_state(self, newx, newy);
keyboard_grab_for_client(self, TRUE); keyboard_grab_for_client(self, TRUE);

View file

@ -329,7 +329,8 @@ static gboolean wanted_focusevent(XEvent *e)
if (win == RootWindow(ob_display, ob_screen)) { if (win == RootWindow(ob_display, ob_screen)) {
/* This means focus reverted off of a client */ /* This means focus reverted off of a client */
if (detail == NotifyPointerRoot || detail == NotifyDetailNone) if (detail == NotifyPointerRoot || detail == NotifyDetailNone ||
detail == NotifyInferior)
return TRUE; return TRUE;
else else
return FALSE; return FALSE;
@ -688,7 +689,8 @@ static void event_handle_client(ObClient *client, XEvent *e)
} else if (ce.xfocus.detail == NotifyInferior) { } else if (ce.xfocus.detail == NotifyInferior) {
ob_debug("Focus went to parent\n"); ob_debug("Focus went to parent\n");
/* Focus has been reverted to parent, which is our frame window, /* 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); focus_fallback(FALSE);
} else { } else {
/* Focus did move, so process the FocusIn event */ /* Focus did move, so process the FocusIn event */
@ -906,7 +908,10 @@ static void event_handle_client(ObClient *client, XEvent *e)
} }
break; break;
case UnmapNotify: 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) { if (client->ignore_unmaps) {
client->ignore_unmaps--; client->ignore_unmaps--;
break; break;
@ -932,6 +937,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
X server to deal with after we unmanage the window */ X server to deal with after we unmanage the window */
XPutBackEvent(ob_display, e); XPutBackEvent(ob_display, e);
ob_debug("ReparentNotify for window 0x%x\n", client->window);
client_unmanage(client); client_unmanage(client);
break; break;
case MapRequest: case MapRequest:

View file

@ -234,32 +234,26 @@ static void frame_free(ObFrame *self)
void frame_show(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) { if (!self->visible) {
self->visible = TRUE; self->visible = TRUE;
XMapWindow(ob_display, self->client->window); XMapWindow(ob_display, self->client->window);
XMapWindow(ob_display, self->window); XMapWindow(ob_display, self->window);
self->firstmap = TRUE;
} }
} }
void frame_hide(ObFrame *self) void frame_hide(ObFrame *self)
{ {
if (self->visible || self->firstmap == FALSE) { ob_debug("frame_hide for window 0x%x : %d\n", self->client->window,
if (self->visible) { self->visible);
self->visible = FALSE; if (self->visible) {
self->client->ignore_unmaps += 1; self->visible = FALSE;
/* we unmap the client itself so that we can get MapRequest self->client->ignore_unmaps += 1;
events, and because the ICCCM tells us to! */ /* we unmap the client itself so that we can get MapRequest
XUnmapWindow(ob_display, self->window); events, and because the ICCCM tells us to! */
XUnmapWindow(ob_display, self->client->window); XUnmapWindow(ob_display, self->window);
} else { XUnmapWindow(ob_display, self->client->window);
/* 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;
} }
} }

View file

@ -76,7 +76,6 @@ struct _ObFrame
Strut size; Strut size;
Rect area; Rect area;
gboolean visible; gboolean visible;
gboolean firstmap;
/*! Whether the window is obscured at all or fully visible. */ /*! Whether the window is obscured at all or fully visible. */
gboolean obscured; gboolean obscured;