|
@@ -1258,6 +1258,18 @@ static void processEvent(XEvent *event)
|
|
|
|
|
|
switch (event->type)
|
|
switch (event->type)
|
|
{
|
|
{
|
|
|
|
+ case CreateNotify:
|
|
|
|
+ {
|
|
|
|
+ window->x11.parent = event->xcreatewindow.parent;
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ case ReparentNotify:
|
|
|
|
+ {
|
|
|
|
+ window->x11.parent = event->xreparent.parent;
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
case KeyPress:
|
|
case KeyPress:
|
|
{
|
|
{
|
|
const int key = translateKey(keycode);
|
|
const int key = translateKey(keycode);
|
|
@@ -1542,18 +1554,28 @@ static void processEvent(XEvent *event)
|
|
window->x11.height = event->xconfigure.height;
|
|
window->x11.height = event->xconfigure.height;
|
|
}
|
|
}
|
|
|
|
|
|
- if (event->xconfigure.x != window->x11.xpos ||
|
|
|
|
- event->xconfigure.y != window->x11.ypos)
|
|
|
|
|
|
+ int xpos = event->xconfigure.x;
|
|
|
|
+ int ypos = event->xconfigure.y;
|
|
|
|
+
|
|
|
|
+ // NOTE: ConfigureNotify events from the server are in local
|
|
|
|
+ // coordinates, so if we are reparented we need to translate
|
|
|
|
+ // the position into root (screen) coordinates
|
|
|
|
+ if (!event->xany.send_event && window->x11.parent != _glfw.x11.root)
|
|
{
|
|
{
|
|
- if (window->x11.overrideRedirect || event->xany.send_event)
|
|
|
|
- {
|
|
|
|
- _glfwInputWindowPos(window,
|
|
|
|
- event->xconfigure.x,
|
|
|
|
- event->xconfigure.y);
|
|
|
|
|
|
+ Window dummy;
|
|
|
|
+ XTranslateCoordinates(_glfw.x11.display,
|
|
|
|
+ window->x11.parent,
|
|
|
|
+ _glfw.x11.root,
|
|
|
|
+ xpos, ypos,
|
|
|
|
+ &xpos, &ypos,
|
|
|
|
+ &dummy);
|
|
|
|
+ }
|
|
|
|
|
|
- window->x11.xpos = event->xconfigure.x;
|
|
|
|
- window->x11.ypos = event->xconfigure.y;
|
|
|
|
- }
|
|
|
|
|
|
+ if (xpos != window->x11.xpos || ypos != window->x11.ypos)
|
|
|
|
+ {
|
|
|
|
+ _glfwInputWindowPos(window, xpos, ypos);
|
|
|
|
+ window->x11.xpos = xpos;
|
|
|
|
+ window->x11.ypos = ypos;
|
|
}
|
|
}
|
|
|
|
|
|
return;
|
|
return;
|