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:
parent
71519a572f
commit
062f49a8e0
|
@ -1061,6 +1061,60 @@ winMultiWindowXMsgProc (void *pArg)
|
||||||
event.xcreatewindow.window,
|
event.xcreatewindow.window,
|
||||||
0);
|
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
|
else if (event.type == PropertyNotify
|
||||||
&& event.xproperty.atom == atmWmName)
|
&& event.xproperty.atom == atmWmName)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue