Skip to content

Commit

Permalink
X11: Fix no window position events during resize
Browse files Browse the repository at this point in the history
A window resize action that also resulting in the window being moved did
not emit any window positions events, as the position of real
ConfigureNotify events was ignored.  The real events use parent
coordinates instead of root coordinates so this adds parent tracking and
conditional translation.

Fixes glfw#1613.
  • Loading branch information
elmindreda committed Jan 1, 2020
1 parent 6b01aff commit fe57e3c
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 10 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,7 @@ information on what to include when reporting a bug.
- [X11] Bugfix: Changing `GLFW_FLOATING` on a hidden window could silently fail
- [X11] Bugfix: Disabled cursor mode was interrupted by indicator windows
- [X11] Bugfix: Monitor physical dimensions could be reported as zero mm
- [X11] Bugfix: Window position events were not emitted during resizing (#1613)
- [Wayland] Removed support for `wl_shell` (#1443)
- [Wayland] Bugfix: The `GLFW_HAND_CURSOR` shape used the wrong image (#1432)
- [Wayland] Bugfix: `CLOCK_MONOTONIC` was not correctly enabled
Expand Down
1 change: 1 addition & 0 deletions src/x11_platform.h
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,7 @@ typedef struct _GLFWwindowX11
{
Colormap colormap;
Window handle;
Window parent;
XIC ic;

GLFWbool overrideRedirect;
Expand Down
42 changes: 32 additions & 10 deletions src/x11_window.c
Original file line number Diff line number Diff line change
Expand Up @@ -1258,6 +1258,18 @@ static void processEvent(XEvent *event)

switch (event->type)
{
case CreateNotify:
{
window->x11.parent = event->xcreatewindow.parent;
return;
}

case ReparentNotify:
{
window->x11.parent = event->xreparent.parent;
return;
}

case KeyPress:
{
const int key = translateKey(keycode);
Expand Down Expand Up @@ -1542,18 +1554,28 @@ static void processEvent(XEvent *event)
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;
Expand Down

0 comments on commit fe57e3c

Please sign in to comment.