|
@@ -39,72 +39,6 @@
|
|
|
#include <poll.h>
|
|
|
|
|
|
|
|
|
-static void shellSurfaceHandlePing(void* data,
|
|
|
- struct wl_shell_surface* shellSurface,
|
|
|
- uint32_t serial)
|
|
|
-{
|
|
|
- wl_shell_surface_pong(shellSurface, serial);
|
|
|
-}
|
|
|
-
|
|
|
-static void shellSurfaceHandleConfigure(void* data,
|
|
|
- struct wl_shell_surface* shellSurface,
|
|
|
- uint32_t edges,
|
|
|
- int32_t width,
|
|
|
- int32_t height)
|
|
|
-{
|
|
|
- _GLFWwindow* window = data;
|
|
|
- float aspectRatio;
|
|
|
- float targetRatio;
|
|
|
-
|
|
|
- if (!window->monitor)
|
|
|
- {
|
|
|
- if (_glfw.wl.viewporter && window->decorated)
|
|
|
- {
|
|
|
- width -= _GLFW_DECORATION_HORIZONTAL;
|
|
|
- height -= _GLFW_DECORATION_VERTICAL;
|
|
|
- }
|
|
|
- if (width < 1)
|
|
|
- width = 1;
|
|
|
- if (height < 1)
|
|
|
- height = 1;
|
|
|
-
|
|
|
- if (window->numer != GLFW_DONT_CARE && window->denom != GLFW_DONT_CARE)
|
|
|
- {
|
|
|
- aspectRatio = (float)width / (float)height;
|
|
|
- targetRatio = (float)window->numer / (float)window->denom;
|
|
|
- if (aspectRatio < targetRatio)
|
|
|
- height = width / targetRatio;
|
|
|
- else if (aspectRatio > targetRatio)
|
|
|
- width = height * targetRatio;
|
|
|
- }
|
|
|
-
|
|
|
- if (window->minwidth != GLFW_DONT_CARE && width < window->minwidth)
|
|
|
- width = window->minwidth;
|
|
|
- else if (window->maxwidth != GLFW_DONT_CARE && width > window->maxwidth)
|
|
|
- width = window->maxwidth;
|
|
|
-
|
|
|
- if (window->minheight != GLFW_DONT_CARE && height < window->minheight)
|
|
|
- height = window->minheight;
|
|
|
- else if (window->maxheight != GLFW_DONT_CARE && height > window->maxheight)
|
|
|
- height = window->maxheight;
|
|
|
- }
|
|
|
-
|
|
|
- _glfwInputWindowSize(window, width, height);
|
|
|
- _glfwPlatformSetWindowSize(window, width, height);
|
|
|
- _glfwInputWindowDamage(window);
|
|
|
-}
|
|
|
-
|
|
|
-static void shellSurfaceHandlePopupDone(void* data,
|
|
|
- struct wl_shell_surface* shellSurface)
|
|
|
-{
|
|
|
-}
|
|
|
-
|
|
|
-static const struct wl_shell_surface_listener shellSurfaceListener = {
|
|
|
- shellSurfaceHandlePing,
|
|
|
- shellSurfaceHandleConfigure,
|
|
|
- shellSurfaceHandlePopupDone
|
|
|
-};
|
|
|
-
|
|
|
static int createTmpfileCloexec(char* tmpname)
|
|
|
{
|
|
|
int fd;
|
|
@@ -529,66 +463,11 @@ static void setFullscreen(_GLFWwindow* window, _GLFWmonitor* monitor,
|
|
|
window->wl.xdg.toplevel,
|
|
|
monitor->wl.output);
|
|
|
}
|
|
|
- else if (window->wl.shellSurface)
|
|
|
- {
|
|
|
- wl_shell_surface_set_fullscreen(
|
|
|
- window->wl.shellSurface,
|
|
|
- WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT,
|
|
|
- refreshRate * 1000, // Convert Hz to mHz.
|
|
|
- monitor->wl.output);
|
|
|
- }
|
|
|
setIdleInhibitor(window, GLFW_TRUE);
|
|
|
if (!window->wl.decorations.serverSide)
|
|
|
destroyDecorations(window);
|
|
|
}
|
|
|
|
|
|
-static GLFWbool createShellSurface(_GLFWwindow* window)
|
|
|
-{
|
|
|
- if (!_glfw.wl.shell)
|
|
|
- {
|
|
|
- _glfwInputError(GLFW_PLATFORM_ERROR,
|
|
|
- "Wayland: wl_shell protocol not available");
|
|
|
- return GLFW_FALSE;
|
|
|
- }
|
|
|
-
|
|
|
- window->wl.shellSurface = wl_shell_get_shell_surface(_glfw.wl.shell,
|
|
|
- window->wl.surface);
|
|
|
- if (!window->wl.shellSurface)
|
|
|
- {
|
|
|
- _glfwInputError(GLFW_PLATFORM_ERROR,
|
|
|
- "Wayland: Shell surface creation failed");
|
|
|
- return GLFW_FALSE;
|
|
|
- }
|
|
|
-
|
|
|
- wl_shell_surface_add_listener(window->wl.shellSurface,
|
|
|
- &shellSurfaceListener,
|
|
|
- window);
|
|
|
-
|
|
|
- if (window->wl.title)
|
|
|
- wl_shell_surface_set_title(window->wl.shellSurface, window->wl.title);
|
|
|
-
|
|
|
- if (window->monitor)
|
|
|
- {
|
|
|
- setFullscreen(window, window->monitor, 0);
|
|
|
- }
|
|
|
- else if (window->wl.maximized)
|
|
|
- {
|
|
|
- wl_shell_surface_set_maximized(window->wl.shellSurface, NULL);
|
|
|
- setIdleInhibitor(window, GLFW_FALSE);
|
|
|
- createDecorations(window);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- wl_shell_surface_set_toplevel(window->wl.shellSurface);
|
|
|
- setIdleInhibitor(window, GLFW_FALSE);
|
|
|
- createDecorations(window);
|
|
|
- }
|
|
|
-
|
|
|
- wl_surface_commit(window->wl.surface);
|
|
|
-
|
|
|
- return GLFW_TRUE;
|
|
|
-}
|
|
|
-
|
|
|
static void xdgToplevelHandleConfigure(void* data,
|
|
|
struct xdg_toplevel* toplevel,
|
|
|
int32_t width,
|
|
@@ -949,16 +828,8 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window,
|
|
|
|
|
|
if (wndconfig->visible)
|
|
|
{
|
|
|
- if (_glfw.wl.wmBase)
|
|
|
- {
|
|
|
- if (!createXdgSurface(window))
|
|
|
- return GLFW_FALSE;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if (!createShellSurface(window))
|
|
|
- return GLFW_FALSE;
|
|
|
- }
|
|
|
+ if (!createXdgSurface(window))
|
|
|
+ return GLFW_FALSE;
|
|
|
|
|
|
window->wl.visible = GLFW_TRUE;
|
|
|
}
|
|
@@ -966,7 +837,6 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window,
|
|
|
{
|
|
|
window->wl.xdg.surface = NULL;
|
|
|
window->wl.xdg.toplevel = NULL;
|
|
|
- window->wl.shellSurface = NULL;
|
|
|
window->wl.visible = GLFW_FALSE;
|
|
|
}
|
|
|
|
|
@@ -1008,9 +878,6 @@ void _glfwPlatformDestroyWindow(_GLFWwindow* window)
|
|
|
if (window->wl.native)
|
|
|
wl_egl_window_destroy(window->wl.native);
|
|
|
|
|
|
- if (window->wl.shellSurface)
|
|
|
- wl_shell_surface_destroy(window->wl.shellSurface);
|
|
|
-
|
|
|
if (window->wl.xdg.toplevel)
|
|
|
xdg_toplevel_destroy(window->wl.xdg.toplevel);
|
|
|
|
|
@@ -1031,8 +898,6 @@ void _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char* title)
|
|
|
window->wl.title = _glfw_strdup(title);
|
|
|
if (window->wl.xdg.toplevel)
|
|
|
xdg_toplevel_set_title(window->wl.xdg.toplevel, title);
|
|
|
- else if (window->wl.shellSurface)
|
|
|
- wl_shell_surface_set_title(window->wl.shellSurface, title);
|
|
|
}
|
|
|
|
|
|
void _glfwPlatformSetWindowIcon(_GLFWwindow* window,
|
|
@@ -1078,23 +943,15 @@ void _glfwPlatformSetWindowSizeLimits(_GLFWwindow* window,
|
|
|
int minwidth, int minheight,
|
|
|
int maxwidth, int maxheight)
|
|
|
{
|
|
|
- if (_glfw.wl.wmBase)
|
|
|
- {
|
|
|
- if (window->wl.xdg.toplevel)
|
|
|
- {
|
|
|
- if (minwidth == GLFW_DONT_CARE || minheight == GLFW_DONT_CARE)
|
|
|
- minwidth = minheight = 0;
|
|
|
- if (maxwidth == GLFW_DONT_CARE || maxheight == GLFW_DONT_CARE)
|
|
|
- maxwidth = maxheight = 0;
|
|
|
- xdg_toplevel_set_min_size(window->wl.xdg.toplevel, minwidth, minheight);
|
|
|
- xdg_toplevel_set_max_size(window->wl.xdg.toplevel, maxwidth, maxheight);
|
|
|
- wl_surface_commit(window->wl.surface);
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
+ if (window->wl.xdg.toplevel)
|
|
|
{
|
|
|
- // TODO: find out how to trigger a resize.
|
|
|
- // The actual limits are checked in the wl_shell_surface::configure handler.
|
|
|
+ if (minwidth == GLFW_DONT_CARE || minheight == GLFW_DONT_CARE)
|
|
|
+ minwidth = minheight = 0;
|
|
|
+ if (maxwidth == GLFW_DONT_CARE || maxheight == GLFW_DONT_CARE)
|
|
|
+ maxwidth = maxheight = 0;
|
|
|
+ xdg_toplevel_set_min_size(window->wl.xdg.toplevel, minwidth, minheight);
|
|
|
+ xdg_toplevel_set_max_size(window->wl.xdg.toplevel, maxwidth, maxheight);
|
|
|
+ wl_surface_commit(window->wl.surface);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1102,7 +959,7 @@ void _glfwPlatformSetWindowAspectRatio(_GLFWwindow* window,
|
|
|
int numer, int denom)
|
|
|
{
|
|
|
// TODO: find out how to trigger a resize.
|
|
|
- // The actual limits are checked in the wl_shell_surface::configure handler.
|
|
|
+ // The actual limits are checked in the xdg_toplevel::configure handler.
|
|
|
}
|
|
|
|
|
|
void _glfwPlatformGetFramebufferSize(_GLFWwindow* window,
|
|
@@ -1141,16 +998,8 @@ void _glfwPlatformGetWindowContentScale(_GLFWwindow* window,
|
|
|
|
|
|
void _glfwPlatformIconifyWindow(_GLFWwindow* window)
|
|
|
{
|
|
|
- if (_glfw.wl.wmBase)
|
|
|
- {
|
|
|
- if (window->wl.xdg.toplevel)
|
|
|
- xdg_toplevel_set_minimized(window->wl.xdg.toplevel);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- _glfwInputError(GLFW_PLATFORM_ERROR,
|
|
|
- "Wayland: Iconify window not supported on wl_shell");
|
|
|
- }
|
|
|
+ if (window->wl.xdg.toplevel)
|
|
|
+ xdg_toplevel_set_minimized(window->wl.xdg.toplevel);
|
|
|
}
|
|
|
|
|
|
void _glfwPlatformRestoreWindow(_GLFWwindow* window)
|
|
@@ -1162,12 +1011,7 @@ void _glfwPlatformRestoreWindow(_GLFWwindow* window)
|
|
|
if (window->wl.maximized)
|
|
|
xdg_toplevel_unset_maximized(window->wl.xdg.toplevel);
|
|
|
// There is no way to unset minimized, or even to know if we are
|
|
|
- // minimized, so there is nothing to do here.
|
|
|
- }
|
|
|
- else if (window->wl.shellSurface)
|
|
|
- {
|
|
|
- if (window->monitor || window->wl.maximized)
|
|
|
- wl_shell_surface_set_toplevel(window->wl.shellSurface);
|
|
|
+ // minimized, so there is nothing to do in this case.
|
|
|
}
|
|
|
_glfwInputWindowMonitor(window, NULL);
|
|
|
window->wl.maximized = GLFW_FALSE;
|
|
@@ -1179,11 +1023,6 @@ void _glfwPlatformMaximizeWindow(_GLFWwindow* window)
|
|
|
{
|
|
|
xdg_toplevel_set_maximized(window->wl.xdg.toplevel);
|
|
|
}
|
|
|
- else if (window->wl.shellSurface)
|
|
|
- {
|
|
|
- // Let the compositor select the best output.
|
|
|
- wl_shell_surface_set_maximized(window->wl.shellSurface, NULL);
|
|
|
- }
|
|
|
window->wl.maximized = GLFW_TRUE;
|
|
|
}
|
|
|
|
|
@@ -1191,10 +1030,7 @@ void _glfwPlatformShowWindow(_GLFWwindow* window)
|
|
|
{
|
|
|
if (!window->wl.visible)
|
|
|
{
|
|
|
- if (_glfw.wl.wmBase)
|
|
|
- createXdgSurface(window);
|
|
|
- else if (!window->wl.shellSurface)
|
|
|
- createShellSurface(window);
|
|
|
+ createXdgSurface(window);
|
|
|
window->wl.visible = GLFW_TRUE;
|
|
|
}
|
|
|
}
|
|
@@ -1208,11 +1044,6 @@ void _glfwPlatformHideWindow(_GLFWwindow* window)
|
|
|
window->wl.xdg.toplevel = NULL;
|
|
|
window->wl.xdg.surface = NULL;
|
|
|
}
|
|
|
- else if (window->wl.shellSurface)
|
|
|
- {
|
|
|
- wl_shell_surface_destroy(window->wl.shellSurface);
|
|
|
- window->wl.shellSurface = NULL;
|
|
|
- }
|
|
|
window->wl.visible = GLFW_FALSE;
|
|
|
}
|
|
|
|
|
@@ -1243,8 +1074,6 @@ void _glfwPlatformSetWindowMonitor(_GLFWwindow* window,
|
|
|
{
|
|
|
if (window->wl.xdg.toplevel)
|
|
|
xdg_toplevel_unset_fullscreen(window->wl.xdg.toplevel);
|
|
|
- else if (window->wl.shellSurface)
|
|
|
- wl_shell_surface_set_toplevel(window->wl.shellSurface);
|
|
|
setIdleInhibitor(window, GLFW_FALSE);
|
|
|
if (!_glfw.wl.decorationManager)
|
|
|
createDecorations(window);
|
|
@@ -1259,8 +1088,8 @@ int _glfwPlatformWindowFocused(_GLFWwindow* window)
|
|
|
|
|
|
int _glfwPlatformWindowIconified(_GLFWwindow* window)
|
|
|
{
|
|
|
- // wl_shell doesn't have any iconified concept, and xdg-shell doesn’t give
|
|
|
- // any way to request whether a surface is iconified.
|
|
|
+ // xdg-shell doesn’t give any way to request whether a surface is
|
|
|
+ // iconified.
|
|
|
return GLFW_FALSE;
|
|
|
}
|
|
|
|