Cygwin/X: Add a workaround for a SWT/Motif bug to internal window manager

SWT/Motif expects all top-level windows to get reparented, and waits until they
do. So workaround that in our internal WM by forcing a reparent event to
occur, even though we don't actually need to reparent the window to
frame it (as the frame is a native window, not an X window)

http://sourceware.org/bugzilla/show_bug.cgi?id=9848
https://bugs.eclipse.org/bugs/show_bug.cgi?id=36806

Signed-off-by: Jon TURNEY <jon.turney@dronecode.org.uk>
Reviewed-by: Colin Harrison <colin.harrison@virgin.net>
This commit is contained in:
Jon TURNEY 2009-11-04 17:36:54 +00:00
parent 71519a572f
commit 062f49a8e0

View File

@ -1061,6 +1061,60 @@ winMultiWindowXMsgProc (void *pArg)
event.xcreatewindow.window,
0);
}
else if (event.type == MapNotify)
{
/* Fake a reparentNotify event as SWT/Motif expects a
Window Manager to reparent a top-level window when
it is mapped and waits until they do.
We don't actually need to reparent, as the frame is
a native window, not an X window
We do this on MapNotify, not MapRequest like a real
Window Manager would, so we don't have do get involved
in actually mapping the window via it's (non-existent)
parent...
See sourceware bugzilla #9848
*/
XWindowAttributes attr;
Window root;
Window parent;
Window *children;
unsigned int nchildren;
if (XGetWindowAttributes(event.xmap.display,
event.xmap.window,
&attr) &&
XQueryTree(event.xmap.display,
event.xmap.window,
&root, &parent, &children, &nchildren))
{
if (children) XFree(children);
/*
It's a top-level window if the parent window is a root window
Only non-override_redirect windows can get reparented
*/
if ((attr.root == parent) && !event.xmap.override_redirect)
{
XEvent event_send;
event_send.type = ReparentNotify;
event_send.xreparent.event = event.xmap.window;
event_send.xreparent.window = event.xmap.window;
event_send.xreparent.parent = parent;
event_send.xreparent.x = attr.x;
event_send.xreparent.y = attr.y;
XSendEvent(event.xmap.display,
event.xmap.window,
True, StructureNotifyMask,
&event_send);
}
}
}
else if (event.type == PropertyNotify
&& event.xproperty.atom == atmWmName)
{