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:
parent
4aa8d64f76
commit
eb2a0feb01
4 changed files with 24 additions and 22 deletions
|
@ -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);
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue