wl: deactivate 'viewporter' decorations

This commit is contained in:
Christian Rauch 2020-02-09 14:56:27 +00:00
parent b2ecb88f3f
commit 7ec585b8eb
3 changed files with 74 additions and 6 deletions

View File

@ -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,
// Dont pass the button to the user if it was related to a decoration. // Dont 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)

View File

@ -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;

View File

@ -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))