mirror of
https://github.com/glfw/glfw.git
synced 2025-06-15 20:22:15 +00:00
wl: deactivate 'viewporter' decorations
This commit is contained in:
parent
b2ecb88f3f
commit
7ec585b8eb
@ -56,6 +56,7 @@ static _GLFWwindow* findWindowFromDecorationSurface(struct wl_surface* surface,
|
|||||||
_GLFWwindow* window = _glfw.windowListHead;
|
_GLFWwindow* window = _glfw.windowListHead;
|
||||||
if (!which)
|
if (!which)
|
||||||
which = &focus;
|
which = &focus;
|
||||||
|
#ifndef WITH_DECORATION
|
||||||
while (window)
|
while (window)
|
||||||
{
|
{
|
||||||
if (surface == window->wl.decorations.top.surface)
|
if (surface == window->wl.decorations.top.surface)
|
||||||
@ -80,6 +81,7 @@ static _GLFWwindow* findWindowFromDecorationSurface(struct wl_surface* surface,
|
|||||||
}
|
}
|
||||||
window = window->next;
|
window = window->next;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -103,7 +105,10 @@ static void pointerHandleEnter(void* data,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef WITH_DECORATION
|
||||||
window->wl.decorations.focus = focus;
|
window->wl.decorations.focus = focus;
|
||||||
|
#endif
|
||||||
|
|
||||||
_glfw.wl.serial = serial;
|
_glfw.wl.serial = serial;
|
||||||
_glfw.wl.pointerFocus = window;
|
_glfw.wl.pointerFocus = window;
|
||||||
|
|
||||||
@ -194,6 +199,7 @@ static void pointerHandleMotion(void* data,
|
|||||||
x = wl_fixed_to_double(sx);
|
x = wl_fixed_to_double(sx);
|
||||||
y = wl_fixed_to_double(sy);
|
y = wl_fixed_to_double(sy);
|
||||||
|
|
||||||
|
#ifndef WITH_DECORATION
|
||||||
switch (window->wl.decorations.focus)
|
switch (window->wl.decorations.focus)
|
||||||
{
|
{
|
||||||
case mainWindow:
|
case mainWindow:
|
||||||
@ -231,6 +237,7 @@ static void pointerHandleMotion(void* data,
|
|||||||
default:
|
default:
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
if (_glfw.wl.cursorPreviousName != cursorName)
|
if (_glfw.wl.cursorPreviousName != cursorName)
|
||||||
setCursor(window, cursorName);
|
setCursor(window, cursorName);
|
||||||
}
|
}
|
||||||
@ -248,6 +255,7 @@ static void pointerHandleButton(void* data,
|
|||||||
|
|
||||||
if (!window)
|
if (!window)
|
||||||
return;
|
return;
|
||||||
|
#ifndef WITH_DECORATION
|
||||||
if (button == BTN_LEFT)
|
if (button == BTN_LEFT)
|
||||||
{
|
{
|
||||||
switch (window->wl.decorations.focus)
|
switch (window->wl.decorations.focus)
|
||||||
@ -306,6 +314,7 @@ static void pointerHandleButton(void* data,
|
|||||||
// Don’t pass the button to the user if it was related to a decoration.
|
// Don’t pass the button to the user if it was related to a decoration.
|
||||||
if (window->wl.decorations.focus != mainWindow)
|
if (window->wl.decorations.focus != mainWindow)
|
||||||
return;
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
_glfw.wl.serial = serial;
|
_glfw.wl.serial = serial;
|
||||||
|
|
||||||
@ -840,11 +849,13 @@ static void registryHandleGlobal(void* data,
|
|||||||
&zxdg_decoration_manager_v1_interface,
|
&zxdg_decoration_manager_v1_interface,
|
||||||
1);
|
1);
|
||||||
}
|
}
|
||||||
|
#ifndef WITH_DECORATION
|
||||||
else if (strcmp(interface, "wp_viewporter") == 0)
|
else if (strcmp(interface, "wp_viewporter") == 0)
|
||||||
{
|
{
|
||||||
_glfw.wl.viewporter =
|
_glfw.wl.viewporter =
|
||||||
wl_registry_bind(registry, name, &wp_viewporter_interface, 1);
|
wl_registry_bind(registry, name, &wp_viewporter_interface, 1);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
else if (strcmp(interface, "zwp_relative_pointer_manager_v1") == 0)
|
else if (strcmp(interface, "zwp_relative_pointer_manager_v1") == 0)
|
||||||
{
|
{
|
||||||
_glfw.wl.relativePointerManager =
|
_glfw.wl.relativePointerManager =
|
||||||
@ -1249,8 +1260,10 @@ void _glfwPlatformTerminate(void)
|
|||||||
wl_compositor_destroy(_glfw.wl.compositor);
|
wl_compositor_destroy(_glfw.wl.compositor);
|
||||||
if (_glfw.wl.shm)
|
if (_glfw.wl.shm)
|
||||||
wl_shm_destroy(_glfw.wl.shm);
|
wl_shm_destroy(_glfw.wl.shm);
|
||||||
|
#ifndef WITH_DECORATION
|
||||||
if (_glfw.wl.viewporter)
|
if (_glfw.wl.viewporter)
|
||||||
wp_viewporter_destroy(_glfw.wl.viewporter);
|
wp_viewporter_destroy(_glfw.wl.viewporter);
|
||||||
|
#endif
|
||||||
if (_glfw.wl.decorationManager)
|
if (_glfw.wl.decorationManager)
|
||||||
zxdg_decoration_manager_v1_destroy(_glfw.wl.decorationManager);
|
zxdg_decoration_manager_v1_destroy(_glfw.wl.decorationManager);
|
||||||
if (_glfw.wl.wmBase)
|
if (_glfw.wl.wmBase)
|
||||||
|
@ -56,7 +56,9 @@ typedef VkBool32 (APIENTRY *PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR
|
|||||||
|
|
||||||
#include "wayland-xdg-shell-client-protocol.h"
|
#include "wayland-xdg-shell-client-protocol.h"
|
||||||
#include "wayland-xdg-decoration-client-protocol.h"
|
#include "wayland-xdg-decoration-client-protocol.h"
|
||||||
|
#ifndef WITH_DECORATION
|
||||||
#include "wayland-viewporter-client-protocol.h"
|
#include "wayland-viewporter-client-protocol.h"
|
||||||
|
#endif
|
||||||
#include "wayland-relative-pointer-unstable-v1-client-protocol.h"
|
#include "wayland-relative-pointer-unstable-v1-client-protocol.h"
|
||||||
#include "wayland-pointer-constraints-unstable-v1-client-protocol.h"
|
#include "wayland-pointer-constraints-unstable-v1-client-protocol.h"
|
||||||
#include "wayland-idle-inhibit-unstable-v1-client-protocol.h"
|
#include "wayland-idle-inhibit-unstable-v1-client-protocol.h"
|
||||||
@ -146,6 +148,7 @@ typedef xkb_keysym_t (* PFN_xkb_compose_state_get_one_sym)(struct xkb_compose_st
|
|||||||
#define _GLFW_DECORATION_VERTICAL (_GLFW_DECORATION_TOP + _GLFW_DECORATION_WIDTH)
|
#define _GLFW_DECORATION_VERTICAL (_GLFW_DECORATION_TOP + _GLFW_DECORATION_WIDTH)
|
||||||
#define _GLFW_DECORATION_HORIZONTAL (2 * _GLFW_DECORATION_WIDTH)
|
#define _GLFW_DECORATION_HORIZONTAL (2 * _GLFW_DECORATION_WIDTH)
|
||||||
|
|
||||||
|
#ifndef WITH_DECORATION
|
||||||
typedef enum _GLFWdecorationSideWayland
|
typedef enum _GLFWdecorationSideWayland
|
||||||
{
|
{
|
||||||
mainWindow,
|
mainWindow,
|
||||||
@ -163,6 +166,7 @@ typedef struct _GLFWdecorationWayland
|
|||||||
struct wp_viewport* viewport;
|
struct wp_viewport* viewport;
|
||||||
|
|
||||||
} _GLFWdecorationWayland;
|
} _GLFWdecorationWayland;
|
||||||
|
#endif
|
||||||
|
|
||||||
// Wayland-specific per-window data
|
// Wayland-specific per-window data
|
||||||
//
|
//
|
||||||
@ -204,12 +208,16 @@ typedef struct _GLFWwindowWayland
|
|||||||
|
|
||||||
GLFWbool wasFullscreen;
|
GLFWbool wasFullscreen;
|
||||||
|
|
||||||
|
#ifndef WITH_DECORATION
|
||||||
struct {
|
struct {
|
||||||
GLFWbool serverSide;
|
GLFWbool serverSide;
|
||||||
struct wl_buffer* buffer;
|
struct wl_buffer* buffer;
|
||||||
_GLFWdecorationWayland top, left, right, bottom;
|
_GLFWdecorationWayland top, left, right, bottom;
|
||||||
int focus;
|
int focus;
|
||||||
} decorations;
|
} decorations;
|
||||||
|
#else
|
||||||
|
GLFWbool ssd;
|
||||||
|
#endif
|
||||||
|
|
||||||
} _GLFWwindowWayland;
|
} _GLFWwindowWayland;
|
||||||
|
|
||||||
@ -231,7 +239,9 @@ typedef struct _GLFWlibraryWayland
|
|||||||
struct wl_data_source* dataSource;
|
struct wl_data_source* dataSource;
|
||||||
struct xdg_wm_base* wmBase;
|
struct xdg_wm_base* wmBase;
|
||||||
struct zxdg_decoration_manager_v1* decorationManager;
|
struct zxdg_decoration_manager_v1* decorationManager;
|
||||||
|
#ifndef WITH_DECORATION
|
||||||
struct wp_viewporter* viewporter;
|
struct wp_viewporter* viewporter;
|
||||||
|
#endif
|
||||||
struct zwp_relative_pointer_manager_v1* relativePointerManager;
|
struct zwp_relative_pointer_manager_v1* relativePointerManager;
|
||||||
struct zwp_pointer_constraints_v1* pointerConstraints;
|
struct zwp_pointer_constraints_v1* pointerConstraints;
|
||||||
struct zwp_idle_inhibit_manager_v1* idleInhibitManager;
|
struct zwp_idle_inhibit_manager_v1* idleInhibitManager;
|
||||||
|
@ -40,6 +40,10 @@
|
|||||||
#include <sys/timerfd.h>
|
#include <sys/timerfd.h>
|
||||||
#include <poll.h>
|
#include <poll.h>
|
||||||
|
|
||||||
|
#ifdef WITH_DECORATION
|
||||||
|
#include <libdecoration.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static int createTmpfileCloexec(char* tmpname)
|
static int createTmpfileCloexec(char* tmpname)
|
||||||
{
|
{
|
||||||
@ -182,6 +186,7 @@ static struct wl_buffer* createShmBuffer(const GLFWimage* image)
|
|||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef WITH_DECORATION
|
||||||
static void createDecoration(_GLFWdecorationWayland* decoration,
|
static void createDecoration(_GLFWdecorationWayland* decoration,
|
||||||
struct wl_surface* parent,
|
struct wl_surface* parent,
|
||||||
struct wl_buffer* buffer, GLFWbool opaque,
|
struct wl_buffer* buffer, GLFWbool opaque,
|
||||||
@ -211,7 +216,14 @@ static void createDecoration(_GLFWdecorationWayland* decoration,
|
|||||||
else
|
else
|
||||||
wl_surface_commit(decoration->surface);
|
wl_surface_commit(decoration->surface);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef WITH_DECORATION
|
||||||
|
static void createDecorations(_GLFWwindow* window)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
#else
|
||||||
static void createDecorations(_GLFWwindow* window)
|
static void createDecorations(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
unsigned char data[] = { 224, 224, 224, 255 };
|
unsigned char data[] = { 224, 224, 224, 255 };
|
||||||
@ -243,7 +255,9 @@ static void createDecorations(_GLFWwindow* window)
|
|||||||
-_GLFW_DECORATION_WIDTH, window->wl.height,
|
-_GLFW_DECORATION_WIDTH, window->wl.height,
|
||||||
window->wl.width + _GLFW_DECORATION_HORIZONTAL, _GLFW_DECORATION_WIDTH);
|
window->wl.width + _GLFW_DECORATION_HORIZONTAL, _GLFW_DECORATION_WIDTH);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef WITH_DECORATION
|
||||||
static void destroyDecoration(_GLFWdecorationWayland* decoration)
|
static void destroyDecoration(_GLFWdecorationWayland* decoration)
|
||||||
{
|
{
|
||||||
if (decoration->subsurface)
|
if (decoration->subsurface)
|
||||||
@ -256,7 +270,14 @@ static void destroyDecoration(_GLFWdecorationWayland* decoration)
|
|||||||
decoration->subsurface = NULL;
|
decoration->subsurface = NULL;
|
||||||
decoration->viewport = NULL;
|
decoration->viewport = NULL;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef WITH_DECORATION
|
||||||
|
static void destroyDecorations(_GLFWwindow* window)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
#else
|
||||||
static void destroyDecorations(_GLFWwindow* window)
|
static void destroyDecorations(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
destroyDecoration(&window->wl.decorations.top);
|
destroyDecoration(&window->wl.decorations.top);
|
||||||
@ -264,6 +285,7 @@ static void destroyDecorations(_GLFWwindow* window)
|
|||||||
destroyDecoration(&window->wl.decorations.right);
|
destroyDecoration(&window->wl.decorations.right);
|
||||||
destroyDecoration(&window->wl.decorations.bottom);
|
destroyDecoration(&window->wl.decorations.bottom);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void xdgDecorationHandleConfigure(void* data,
|
static void xdgDecorationHandleConfigure(void* data,
|
||||||
struct zxdg_toplevel_decoration_v1* decoration,
|
struct zxdg_toplevel_decoration_v1* decoration,
|
||||||
@ -271,9 +293,11 @@ static void xdgDecorationHandleConfigure(void* data,
|
|||||||
{
|
{
|
||||||
_GLFWwindow* window = data;
|
_GLFWwindow* window = data;
|
||||||
|
|
||||||
window->wl.decorations.serverSide = (mode == ZXDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE);
|
#ifdef WITH_DECORATION
|
||||||
|
if (!(window->wl.ssd = (mode == ZXDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE)))
|
||||||
if (!window->wl.decorations.serverSide)
|
#else
|
||||||
|
if (!(window->wl.decorations.serverSide = (mode == ZXDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE)))
|
||||||
|
#endif
|
||||||
createDecorations(window);
|
createDecorations(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -307,6 +331,7 @@ static void resizeWindow(_GLFWwindow* window)
|
|||||||
_glfwInputFramebufferSize(window, scaledWidth, scaledHeight);
|
_glfwInputFramebufferSize(window, scaledWidth, scaledHeight);
|
||||||
_glfwInputWindowContentScale(window, scale, scale);
|
_glfwInputWindowContentScale(window, scale, scale);
|
||||||
|
|
||||||
|
#ifndef WITH_DECORATION
|
||||||
if (!window->wl.decorations.top.surface)
|
if (!window->wl.decorations.top.surface)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -333,6 +358,7 @@ static void resizeWindow(_GLFWwindow* window)
|
|||||||
wp_viewport_set_destination(window->wl.decorations.bottom.viewport,
|
wp_viewport_set_destination(window->wl.decorations.bottom.viewport,
|
||||||
window->wl.width + _GLFW_DECORATION_HORIZONTAL, _GLFW_DECORATION_WIDTH);
|
window->wl.width + _GLFW_DECORATION_HORIZONTAL, _GLFW_DECORATION_WIDTH);
|
||||||
wl_surface_commit(window->wl.decorations.bottom.surface);
|
wl_surface_commit(window->wl.decorations.bottom.surface);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void checkScaleChange(_GLFWwindow* window)
|
static void checkScaleChange(_GLFWwindow* window)
|
||||||
@ -465,7 +491,11 @@ static void setFullscreen(_GLFWwindow* window, _GLFWmonitor* monitor,
|
|||||||
monitor->wl.output);
|
monitor->wl.output);
|
||||||
}
|
}
|
||||||
setIdleInhibitor(window, GLFW_TRUE);
|
setIdleInhibitor(window, GLFW_TRUE);
|
||||||
|
#ifdef WITH_DECORATION
|
||||||
|
if (!window->wl.ssd)
|
||||||
|
#else
|
||||||
if (!window->wl.decorations.serverSide)
|
if (!window->wl.decorations.serverSide)
|
||||||
|
#endif
|
||||||
destroyDecorations(window);
|
destroyDecorations(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -573,7 +603,11 @@ static void setXdgDecorations(_GLFWwindow* window)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
#ifdef WITH_DECORATION
|
||||||
|
window->wl.ssd = GLFW_FALSE;
|
||||||
|
#else
|
||||||
window->wl.decorations.serverSide = GLFW_FALSE;
|
window->wl.decorations.serverSide = GLFW_FALSE;
|
||||||
|
#endif
|
||||||
createDecorations(window);
|
createDecorations(window);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -689,8 +723,12 @@ static void incrementCursorImage(_GLFWwindow* window)
|
|||||||
{
|
{
|
||||||
_GLFWcursor* cursor;
|
_GLFWcursor* cursor;
|
||||||
|
|
||||||
if (!window || window->wl.decorations.focus != mainWindow)
|
if (!window) return;
|
||||||
|
|
||||||
|
#ifndef WITH_DECORATION
|
||||||
|
if (window->wl.decorations.focus != mainWindow)
|
||||||
return;
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
cursor = window->wl.currentCursor;
|
cursor = window->wl.currentCursor;
|
||||||
if (cursor && cursor->wl.cursor)
|
if (cursor && cursor->wl.cursor)
|
||||||
@ -860,9 +898,10 @@ void _glfwPlatformDestroyWindow(_GLFWwindow* window)
|
|||||||
destroyDecorations(window);
|
destroyDecorations(window);
|
||||||
if (window->wl.xdg.decoration)
|
if (window->wl.xdg.decoration)
|
||||||
zxdg_toplevel_decoration_v1_destroy(window->wl.xdg.decoration);
|
zxdg_toplevel_decoration_v1_destroy(window->wl.xdg.decoration);
|
||||||
|
#ifndef WITH_DECORATION
|
||||||
if (window->wl.decorations.buffer)
|
if (window->wl.decorations.buffer)
|
||||||
wl_buffer_destroy(window->wl.decorations.buffer);
|
wl_buffer_destroy(window->wl.decorations.buffer);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (window->wl.native)
|
if (window->wl.native)
|
||||||
wl_egl_window_destroy(window->wl.native);
|
wl_egl_window_destroy(window->wl.native);
|
||||||
@ -967,6 +1006,7 @@ void _glfwPlatformGetWindowFrameSize(_GLFWwindow* window,
|
|||||||
int* left, int* top,
|
int* left, int* top,
|
||||||
int* right, int* bottom)
|
int* right, int* bottom)
|
||||||
{
|
{
|
||||||
|
#ifndef WITH_DECORATION
|
||||||
if (window->decorated && !window->monitor && !window->wl.decorations.serverSide)
|
if (window->decorated && !window->monitor && !window->wl.decorations.serverSide)
|
||||||
{
|
{
|
||||||
if (top)
|
if (top)
|
||||||
@ -978,6 +1018,7 @@ void _glfwPlatformGetWindowFrameSize(_GLFWwindow* window,
|
|||||||
if (bottom)
|
if (bottom)
|
||||||
*bottom = _GLFW_DECORATION_WIDTH;
|
*bottom = _GLFW_DECORATION_WIDTH;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformGetWindowContentScale(_GLFWwindow* window,
|
void _glfwPlatformGetWindowContentScale(_GLFWwindow* window,
|
||||||
@ -1461,10 +1502,14 @@ void _glfwPlatformSetCursor(_GLFWwindow* window, _GLFWcursor* cursor)
|
|||||||
|
|
||||||
window->wl.currentCursor = cursor;
|
window->wl.currentCursor = cursor;
|
||||||
|
|
||||||
|
if (window != _glfw.wl.pointerFocus) return;
|
||||||
|
|
||||||
|
#ifndef WITH_DECORATION
|
||||||
// If we're not in the correct window just save the cursor
|
// If we're not in the correct window just save the cursor
|
||||||
// the next time the pointer enters the window the cursor will change
|
// the next time the pointer enters the window the cursor will change
|
||||||
if (window != _glfw.wl.pointerFocus || window->wl.decorations.focus != mainWindow)
|
if (window->wl.decorations.focus != mainWindow)
|
||||||
return;
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
// Unlock possible pointer lock if no longer disabled.
|
// Unlock possible pointer lock if no longer disabled.
|
||||||
if (window->cursorMode != GLFW_CURSOR_DISABLED && isPointerLocked(window))
|
if (window->cursorMode != GLFW_CURSOR_DISABLED && isPointerLocked(window))
|
||||||
|
Loading…
Reference in New Issue
Block a user