Fix resizing and moving under xdg-shell

master
Emmanuel Gil Peyrot ago%!(EXTRA string=7 years) committed by linkmauve
parent a0dbffb8f2
commit a8e551cffa
  1. 99
      src/wl_init.c

@ -224,50 +224,77 @@ static void pointerHandleButton(void* data,
_GLFWwindow* window = _glfw.wl.pointerFocus;
int glfwButton;
// Both xdg-shell and wl_shell use the same values.
uint32_t edges = WL_SHELL_SURFACE_RESIZE_NONE;
if (!window)
return;
switch (window->wl.decorations.focus)
if (button == BTN_LEFT)
{
case mainWindow:
break;
case topDecoration:
if (window->wl.cursorPosY < _GLFW_DECORATION_WIDTH)
wl_shell_surface_resize(window->wl.shellSurface, _glfw.wl.seat,
serial, WL_SHELL_SURFACE_RESIZE_TOP);
else
wl_shell_surface_move(window->wl.shellSurface, _glfw.wl.seat, serial);
return;
case leftDecoration:
if (window->wl.cursorPosY < _GLFW_DECORATION_WIDTH)
wl_shell_surface_resize(window->wl.shellSurface, _glfw.wl.seat,
serial, WL_SHELL_SURFACE_RESIZE_TOP_LEFT);
else
wl_shell_surface_resize(window->wl.shellSurface, _glfw.wl.seat,
serial, WL_SHELL_SURFACE_RESIZE_LEFT);
return;
case rightDecoration:
if (window->wl.cursorPosY < _GLFW_DECORATION_WIDTH)
wl_shell_surface_resize(window->wl.shellSurface, _glfw.wl.seat,
serial, WL_SHELL_SURFACE_RESIZE_TOP_RIGHT);
else
wl_shell_surface_resize(window->wl.shellSurface, _glfw.wl.seat,
serial, WL_SHELL_SURFACE_RESIZE_RIGHT);
return;
case bottomDecoration:
if (window->wl.cursorPosX < _GLFW_DECORATION_WIDTH)
wl_shell_surface_resize(window->wl.shellSurface, _glfw.wl.seat,
serial, WL_SHELL_SURFACE_RESIZE_BOTTOM_LEFT);
else if (window->wl.cursorPosX > window->wl.width + _GLFW_DECORATION_WIDTH)
wl_shell_surface_resize(window->wl.shellSurface, _glfw.wl.seat,
serial, WL_SHELL_SURFACE_RESIZE_BOTTOM_RIGHT);
switch (window->wl.decorations.focus)
{
case mainWindow:
break;
case topDecoration:
if (window->wl.cursorPosY < _GLFW_DECORATION_WIDTH)
edges = WL_SHELL_SURFACE_RESIZE_TOP;
else
{
if (window->wl.xdg.toplevel)
xdg_toplevel_move(window->wl.xdg.toplevel, _glfw.wl.seat, serial);
else
wl_shell_surface_move(window->wl.shellSurface, _glfw.wl.seat, serial);
}
break;
case leftDecoration:
if (window->wl.cursorPosY < _GLFW_DECORATION_WIDTH)
edges = WL_SHELL_SURFACE_RESIZE_TOP_LEFT;
else
edges = WL_SHELL_SURFACE_RESIZE_LEFT;
break;
case rightDecoration:
if (window->wl.cursorPosY < _GLFW_DECORATION_WIDTH)
edges = WL_SHELL_SURFACE_RESIZE_TOP_RIGHT;
else
edges = WL_SHELL_SURFACE_RESIZE_RIGHT;
break;
case bottomDecoration:
if (window->wl.cursorPosX < _GLFW_DECORATION_WIDTH)
edges = WL_SHELL_SURFACE_RESIZE_BOTTOM_LEFT;
else if (window->wl.cursorPosX > window->wl.width + _GLFW_DECORATION_WIDTH)
edges = WL_SHELL_SURFACE_RESIZE_BOTTOM_RIGHT;
else
edges = WL_SHELL_SURFACE_RESIZE_BOTTOM;
break;
default:
assert(0);
}
if (edges != WL_SHELL_SURFACE_RESIZE_NONE)
{
if (window->wl.xdg.toplevel)
xdg_toplevel_resize(window->wl.xdg.toplevel, _glfw.wl.seat,
serial, edges);
else
wl_shell_surface_resize(window->wl.shellSurface, _glfw.wl.seat,
serial, WL_SHELL_SURFACE_RESIZE_BOTTOM);
serial, edges);
}
}
else if (button == BTN_RIGHT)
{
if (window->wl.decorations.focus != mainWindow && window->wl.xdg.toplevel)
{
xdg_toplevel_show_window_menu(window->wl.xdg.toplevel,
_glfw.wl.seat, serial,
window->wl.cursorPosX,
window->wl.cursorPosY);
return;
default:
assert(0);
}
}
// Don’t pass the button to the user if it was related to a decoration.
if (window->wl.decorations.focus != mainWindow)
return;
_glfw.wl.pointerSerial = serial;
/* Makes left, right and middle 0, 1 and 2. Overall order follows evdev

Loading…
Cancel
Save