forked from sascha/godot
Merge pull request #86180 from Riteo/wayland-squashed
Add Wayland support (squashed review edition)master
commit
6a126b0934
@ -0,0 +1,197 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
Import("env")
|
||||
|
||||
# TODO: Add warning to headers and code about their autogenerated status.
|
||||
if env["use_sowrap"]:
|
||||
# We have to implement separate builders for so wrappers as the
|
||||
# autogenerated Wayland protocol wrapper must include them instead of the
|
||||
# native libraries.
|
||||
|
||||
WAYLAND_BUILDERS_SOWRAP = {
|
||||
"WAYLAND_API_HEADER": Builder(
|
||||
action=Action(
|
||||
"wayland-scanner -c client-header < ${SOURCE} | sed 's:wayland-client-core\.h:../dynwrappers/wayland-client-core-so_wrap\.h:' > ${TARGET}",
|
||||
'Generating Wayland client header: "${TARGET}"',
|
||||
),
|
||||
single_source=True,
|
||||
),
|
||||
"WAYLAND_API_CODE": Builder(
|
||||
action=Action(
|
||||
"wayland-scanner -c private-code < ${SOURCE} | sed 's:wayland-util\.h:../dynwrappers/wayland-client-core-so_wrap\.h:' > ${TARGET}",
|
||||
'Generating Wayland protocol marshalling code: "${TARGET}"',
|
||||
),
|
||||
single_source=True,
|
||||
),
|
||||
}
|
||||
env.Append(BUILDERS=WAYLAND_BUILDERS_SOWRAP)
|
||||
else:
|
||||
WAYLAND_BUILDERS = {
|
||||
"WAYLAND_API_HEADER": Builder(
|
||||
action=Action(
|
||||
"wayland-scanner -c client-header < ${SOURCE} > ${TARGET}",
|
||||
'Generating Wayland client header: "${TARGET}"',
|
||||
),
|
||||
single_source=True,
|
||||
),
|
||||
"WAYLAND_API_CODE": Builder(
|
||||
action=Action(
|
||||
"wayland-scanner -c private-code < ${SOURCE} > ${TARGET}",
|
||||
'Generating Wayland protocol marshalling code: "${TARGET}"',
|
||||
),
|
||||
single_source=True,
|
||||
),
|
||||
}
|
||||
env.Append(BUILDERS=WAYLAND_BUILDERS)
|
||||
|
||||
env.WAYLAND_API_HEADER(target="protocol/wayland.gen.h", source="#thirdparty/wayland/protocol/wayland.xml")
|
||||
env.WAYLAND_API_CODE(target="protocol/wayland.gen.c", source="#thirdparty/wayland/protocol/wayland.xml")
|
||||
|
||||
env.WAYLAND_API_HEADER(
|
||||
target="protocol/viewporter.gen.h", source="#thirdparty/wayland-protocols/stable/viewporter/viewporter.xml"
|
||||
)
|
||||
env.WAYLAND_API_CODE(
|
||||
target="protocol/viewporter.gen.c", source="#thirdparty/wayland-protocols/stable/viewporter/viewporter.xml"
|
||||
)
|
||||
|
||||
env.WAYLAND_API_HEADER(
|
||||
target="protocol/fractional_scale.gen.h",
|
||||
source="#thirdparty/wayland-protocols/staging/fractional-scale/fractional-scale-v1.xml",
|
||||
)
|
||||
env.WAYLAND_API_CODE(
|
||||
target="protocol/fractional_scale.gen.c",
|
||||
source="#thirdparty/wayland-protocols/staging/fractional-scale/fractional-scale-v1.xml",
|
||||
)
|
||||
|
||||
env.WAYLAND_API_HEADER(
|
||||
target="protocol/xdg_shell.gen.h", source="#thirdparty/wayland-protocols/stable/xdg-shell/xdg-shell.xml"
|
||||
)
|
||||
|
||||
env.WAYLAND_API_CODE(
|
||||
target="protocol/xdg_shell.gen.c", source="#thirdparty/wayland-protocols/stable/xdg-shell/xdg-shell.xml"
|
||||
)
|
||||
|
||||
env.WAYLAND_API_HEADER(
|
||||
target="protocol/xdg_decoration.gen.h",
|
||||
source="#thirdparty/wayland-protocols/unstable/xdg-decoration/xdg-decoration-unstable-v1.xml",
|
||||
)
|
||||
|
||||
env.WAYLAND_API_CODE(
|
||||
target="protocol/xdg_decoration.gen.c",
|
||||
source="#thirdparty/wayland-protocols/unstable/xdg-decoration/xdg-decoration-unstable-v1.xml",
|
||||
)
|
||||
|
||||
env.WAYLAND_API_HEADER(
|
||||
target="protocol/xdg_activation.gen.h",
|
||||
source="#thirdparty/wayland-protocols/staging/xdg-activation/xdg-activation-v1.xml",
|
||||
)
|
||||
|
||||
env.WAYLAND_API_CODE(
|
||||
target="protocol/xdg_activation.gen.c",
|
||||
source="#thirdparty/wayland-protocols/staging/xdg-activation/xdg-activation-v1.xml",
|
||||
)
|
||||
|
||||
env.WAYLAND_API_HEADER(
|
||||
target="protocol/relative_pointer.gen.h",
|
||||
source="#thirdparty/wayland-protocols/unstable/relative-pointer/relative-pointer-unstable-v1.xml",
|
||||
)
|
||||
|
||||
env.WAYLAND_API_CODE(
|
||||
target="protocol/relative_pointer.gen.c",
|
||||
source="#thirdparty/wayland-protocols/unstable/relative-pointer/relative-pointer-unstable-v1.xml",
|
||||
)
|
||||
|
||||
env.WAYLAND_API_HEADER(
|
||||
target="protocol/pointer_constraints.gen.h",
|
||||
source="#thirdparty/wayland-protocols/unstable/pointer-constraints/pointer-constraints-unstable-v1.xml",
|
||||
)
|
||||
|
||||
env.WAYLAND_API_CODE(
|
||||
target="protocol/pointer_constraints.gen.c",
|
||||
source="#thirdparty/wayland-protocols/unstable/pointer-constraints/pointer-constraints-unstable-v1.xml",
|
||||
)
|
||||
|
||||
env.WAYLAND_API_HEADER(
|
||||
target="protocol/pointer_gestures.gen.h",
|
||||
source="#thirdparty/wayland-protocols/unstable/pointer-gestures/pointer-gestures-unstable-v1.xml",
|
||||
)
|
||||
|
||||
env.WAYLAND_API_CODE(
|
||||
target="protocol/pointer_gestures.gen.c",
|
||||
source="#thirdparty/wayland-protocols/unstable/pointer-gestures/pointer-gestures-unstable-v1.xml",
|
||||
)
|
||||
|
||||
env.WAYLAND_API_HEADER(
|
||||
target="protocol/primary_selection.gen.h",
|
||||
source="#thirdparty/wayland-protocols/unstable/primary-selection/primary-selection-unstable-v1.xml",
|
||||
)
|
||||
|
||||
env.WAYLAND_API_CODE(
|
||||
target="protocol/primary_selection.gen.c",
|
||||
source="#thirdparty/wayland-protocols/unstable/primary-selection/primary-selection-unstable-v1.xml",
|
||||
)
|
||||
|
||||
env.WAYLAND_API_HEADER(
|
||||
target="protocol/idle_inhibit.gen.h",
|
||||
source="#thirdparty/wayland-protocols/unstable/idle-inhibit/idle-inhibit-unstable-v1.xml",
|
||||
)
|
||||
|
||||
env.WAYLAND_API_CODE(
|
||||
target="protocol/idle_inhibit.gen.c",
|
||||
source="#thirdparty/wayland-protocols/unstable/idle-inhibit/idle-inhibit-unstable-v1.xml",
|
||||
)
|
||||
|
||||
env.WAYLAND_API_HEADER(
|
||||
target="protocol/tablet.gen.h",
|
||||
source="#thirdparty/wayland-protocols/unstable/tablet/tablet-unstable-v2.xml",
|
||||
)
|
||||
|
||||
env.WAYLAND_API_CODE(
|
||||
target="protocol/tablet.gen.c",
|
||||
source="#thirdparty/wayland-protocols/unstable/tablet/tablet-unstable-v2.xml",
|
||||
)
|
||||
|
||||
source_files = [
|
||||
"protocol/wayland.gen.c",
|
||||
"protocol/viewporter.gen.c",
|
||||
"protocol/fractional_scale.gen.c",
|
||||
"protocol/xdg_shell.gen.c",
|
||||
"protocol/xdg_decoration.gen.c",
|
||||
"protocol/xdg_activation.gen.c",
|
||||
"protocol/relative_pointer.gen.c",
|
||||
"protocol/pointer_constraints.gen.c",
|
||||
"protocol/pointer_gestures.gen.c",
|
||||
"protocol/primary_selection.gen.c",
|
||||
"protocol/idle_inhibit.gen.c",
|
||||
"protocol/tablet.gen.c",
|
||||
"display_server_wayland.cpp",
|
||||
"wayland_thread.cpp",
|
||||
"key_mapping_xkb.cpp",
|
||||
"detect_prime_egl.cpp",
|
||||
]
|
||||
|
||||
if env["use_sowrap"]:
|
||||
source_files.append(
|
||||
[
|
||||
"dynwrappers/wayland-cursor-so_wrap.c",
|
||||
"dynwrappers/wayland-client-core-so_wrap.c",
|
||||
"dynwrappers/wayland-egl-core-so_wrap.c",
|
||||
]
|
||||
)
|
||||
|
||||
if env["libdecor"]:
|
||||
source_files.append("dynwrappers/libdecor-so_wrap.c")
|
||||
|
||||
|
||||
if env["vulkan"]:
|
||||
source_files.append("vulkan_context_wayland.cpp")
|
||||
|
||||
if env["opengl3"]:
|
||||
source_files.append("egl_manager_wayland.cpp")
|
||||
|
||||
objects = []
|
||||
|
||||
for source_file in source_files:
|
||||
objects.append(env.Object(source_file))
|
||||
|
||||
Return("objects")
|
||||
@ -0,0 +1,231 @@
|
||||
/**************************************************************************/
|
||||
/* detect_prime_egl.cpp */
|
||||
/**************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/**************************************************************************/
|
||||
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
|
||||
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/**************************************************************************/
|
||||
|
||||
#ifdef GLES3_ENABLED
|
||||
#ifdef EGL_ENABLED
|
||||
|
||||
#include "detect_prime_egl.h"
|
||||
|
||||
#include "core/string/print_string.h"
|
||||
#include "core/string/ustring.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef GLAD_ENABLED
|
||||
#include "thirdparty/glad/glad/egl.h"
|
||||
#include "thirdparty/glad/glad/gl.h"
|
||||
#else
|
||||
#include <EGL/egl.h>
|
||||
#include <EGL/eglext.h>
|
||||
#include <GL/glcorearb.h>
|
||||
#endif // GLAD_ENABLED
|
||||
|
||||
#include <cstring>
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
#include <unistd.h>
|
||||
|
||||
// To prevent shadowing warnings.
|
||||
#undef glGetString
|
||||
|
||||
// Runs inside a child. Exiting will not quit the engine.
|
||||
void DetectPrimeEGL::create_context() {
|
||||
#if defined(GLAD_ENABLED)
|
||||
if (!gladLoaderLoadEGL(nullptr)) {
|
||||
print_verbose("Unable to load EGL, GPU detection skipped.");
|
||||
quick_exit(1);
|
||||
}
|
||||
#endif
|
||||
|
||||
EGLDisplay egl_display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
|
||||
EGLConfig egl_config;
|
||||
EGLContext egl_context = EGL_NO_CONTEXT;
|
||||
|
||||
eglInitialize(egl_display, NULL, NULL);
|
||||
|
||||
#if defined(GLAD_ENABLED)
|
||||
if (!gladLoaderLoadEGL(egl_display)) {
|
||||
print_verbose("Unable to load EGL, GPU detection skipped.");
|
||||
quick_exit(1);
|
||||
}
|
||||
#endif
|
||||
|
||||
eglBindAPI(EGL_OPENGL_API);
|
||||
|
||||
EGLint attribs[] = {
|
||||
EGL_RED_SIZE,
|
||||
1,
|
||||
EGL_BLUE_SIZE,
|
||||
1,
|
||||
EGL_GREEN_SIZE,
|
||||
1,
|
||||
EGL_DEPTH_SIZE,
|
||||
24,
|
||||
EGL_NONE,
|
||||
};
|
||||
|
||||
EGLint config_count = 0;
|
||||
eglChooseConfig(egl_display, attribs, &egl_config, 1, &config_count);
|
||||
|
||||
EGLint context_attribs[] = {
|
||||
EGL_CONTEXT_MAJOR_VERSION, 3,
|
||||
EGL_CONTEXT_MINOR_VERSION, 3,
|
||||
EGL_NONE
|
||||
};
|
||||
|
||||
egl_context = eglCreateContext(egl_display, egl_config, EGL_NO_CONTEXT, context_attribs);
|
||||
if (egl_context == EGL_NO_CONTEXT) {
|
||||
print_verbose("Unable to create an EGL context, GPU detection skipped.");
|
||||
quick_exit(1);
|
||||
}
|
||||
|
||||
eglMakeCurrent(egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, egl_context);
|
||||
}
|
||||
|
||||
int DetectPrimeEGL::detect_prime() {
|
||||
pid_t p;
|
||||
int priorities[4] = {};
|
||||
String vendors[4];
|
||||
String renderers[4];
|
||||
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
vendors[i] = "Unknown";
|
||||
renderers[i] = "Unknown";
|
||||
}
|
||||
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
int fdset[2];
|
||||
|
||||
if (pipe(fdset) == -1) {
|
||||
print_verbose("Failed to pipe(), using default GPU");
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Fork so the driver initialization can crash without taking down the engine.
|
||||
p = fork();
|
||||
|
||||
if (p > 0) {
|
||||
// Main thread
|
||||
|
||||
int stat_loc = 0;
|
||||
char string[201];
|
||||
string[200] = '\0';
|
||||
|
||||
close(fdset[1]);
|
||||
|
||||
waitpid(p, &stat_loc, 0);
|
||||
|
||||
if (!stat_loc) {
|
||||
// No need to do anything complicated here. Anything less than
|
||||
// PIPE_BUF will be delivered in one read() call.
|
||||
// Leave it 'Unknown' otherwise.
|
||||
if (read(fdset[0], string, sizeof(string) - 1) > 0) {
|
||||
vendors[i] = string;
|
||||
renderers[i] = string + strlen(string) + 1;
|
||||
}
|
||||
}
|
||||
|
||||
close(fdset[0]);
|
||||
} else {
|
||||
// In child, exit() here will not quit the engine.
|
||||
|
||||
// Prevent false leak reports as we will not be properly
|
||||
// cleaning up these processes, and fork() makes a copy
|
||||
// of all globals.
|
||||
CoreGlobals::leak_reporting_enabled = false;
|
||||
|
||||
char string[201];
|
||||
|
||||
close(fdset[0]);
|
||||
|
||||
setenv("DRI_PRIME", itos(i).utf8().ptr(), 1);
|
||||
|
||||
create_context();
|
||||
|
||||
PFNGLGETSTRINGPROC glGetString = (PFNGLGETSTRINGPROC)eglGetProcAddress("glGetString");
|
||||
const char *vendor = (const char *)glGetString(GL_VENDOR);
|
||||
const char *renderer = (const char *)glGetString(GL_RENDERER);
|
||||
|
||||
unsigned int vendor_len = strlen(vendor) + 1;
|
||||
unsigned int renderer_len = strlen(renderer) + 1;
|
||||
|
||||
if (vendor_len + renderer_len >= sizeof(string)) {
|
||||
renderer_len = 200 - vendor_len;
|
||||
}
|
||||
|
||||
memcpy(&string, vendor, vendor_len);
|
||||
memcpy(&string[vendor_len], renderer, renderer_len);
|
||||
|
||||
if (write(fdset[1], string, vendor_len + renderer_len) == -1) {
|
||||
print_verbose("Couldn't write vendor/renderer string.");
|
||||
}
|
||||
close(fdset[1]);
|
||||
|
||||
// The function quick_exit() is used because exit() will call destructors on static objects copied by fork().
|
||||
// These objects will be freed anyway when the process finishes execution.
|
||||
quick_exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
int preferred = 0;
|
||||
int priority = 0;
|
||||
|
||||
if (vendors[0] == vendors[1]) {
|
||||
print_verbose("Only one GPU found, using default.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (int i = 3; i >= 0; --i) {
|
||||
const Vendor *v = vendor_map;
|
||||
while (v->glxvendor) {
|
||||
if (v->glxvendor == vendors[i]) {
|
||||
priorities[i] = v->priority;
|
||||
|
||||
if (v->priority >= priority) {
|
||||
priority = v->priority;
|
||||
preferred = i;
|
||||
}
|
||||
}
|
||||
++v;
|
||||
}
|
||||
}
|
||||
|
||||
print_verbose("Found renderers:");
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
print_verbose("Renderer " + itos(i) + ": " + renderers[i] + " with priority: " + itos(priorities[i]));
|
||||
}
|
||||
|
||||
print_verbose("Using renderer: " + renderers[preferred]);
|
||||
return preferred;
|
||||
}
|
||||
|
||||
#endif // EGL_ENABLED
|
||||
#endif // GLES3_ENABLED
|
||||
@ -0,0 +1,65 @@
|
||||
/**************************************************************************/
|
||||
/* detect_prime_egl.h */
|
||||
/**************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/**************************************************************************/
|
||||
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
|
||||
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/**************************************************************************/
|
||||
|
||||
#ifndef DETECT_PRIME_EGL_H
|
||||
#define DETECT_PRIME_EGL_H
|
||||
|
||||
#ifdef GLES3_ENABLED
|
||||
#ifdef EGL_ENABLED
|
||||
|
||||
class DetectPrimeEGL {
|
||||
private:
|
||||
struct Vendor {
|
||||
const char *glxvendor = nullptr;
|
||||
int priority = 0;
|
||||
};
|
||||
|
||||
static constexpr Vendor vendor_map[] = {
|
||||
{ "Advanced Micro Devices, Inc.", 30 },
|
||||
{ "AMD", 30 },
|
||||
{ "NVIDIA Corporation", 30 },
|
||||
{ "X.Org", 30 },
|
||||
{ "Intel Open Source Technology Center", 20 },
|
||||
{ "Intel", 20 },
|
||||
{ "nouveau", 10 },
|
||||
{ "Mesa Project", 0 },
|
||||
{ nullptr, 0 }
|
||||
};
|
||||
|
||||
static void create_context();
|
||||
|
||||
public:
|
||||
static int detect_prime();
|
||||
};
|
||||
|
||||
#endif // GLES3_ENABLED
|
||||
#endif // EGL_ENABLED
|
||||
|
||||
#endif // DETECT_PRIME_EGL_H
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,290 @@
|
||||
/**************************************************************************/
|
||||
/* display_server_wayland.h */
|
||||
/**************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/**************************************************************************/
|
||||
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
|
||||
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/**************************************************************************/
|
||||
|
||||
#ifndef DISPLAY_SERVER_WAYLAND_H
|
||||
#define DISPLAY_SERVER_WAYLAND_H
|
||||
|
||||
#ifdef WAYLAND_ENABLED
|
||||
|
||||
#include "wayland/wayland_thread.h"
|
||||
|
||||
#ifdef RD_ENABLED
|
||||
#include "servers/rendering/rendering_device.h"
|
||||
|
||||
#ifdef VULKAN_ENABLED
|
||||
#include "wayland/vulkan_context_wayland.h"
|
||||
#endif
|
||||
|
||||
#endif //RD_ENABLED
|
||||
|
||||
#ifdef GLES3_ENABLED
|
||||
#include "wayland/egl_manager_wayland.h"
|
||||
#endif
|
||||
|
||||
#if defined(SPEECHD_ENABLED)
|
||||
#include "tts_linux.h"
|
||||
#endif
|
||||
|
||||
#ifdef DBUS_ENABLED
|
||||
#include "freedesktop_portal_desktop.h"
|
||||
#include "freedesktop_screensaver.h"
|
||||
#endif
|
||||
|
||||
#include "core/config/project_settings.h"
|
||||
#include "core/input/input.h"
|
||||
#include "scene/resources/atlas_texture.h"
|
||||
#include "scene/resources/texture.h"
|
||||
#include "servers/display_server.h"
|
||||
|
||||
#include <limits.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#undef CursorShape
|
||||
|
||||
class DisplayServerWayland : public DisplayServer {
|
||||
// No need to register with GDCLASS, it's platform-specific and nothing is added.
|
||||
struct WindowData {
|
||||
WindowID id;
|
||||
|
||||
Rect2i rect;
|
||||
Size2i max_size;
|
||||
Size2i min_size;
|
||||
|
||||
Rect2i safe_rect;
|
||||
|
||||
#ifdef GLES3_ENABLED
|
||||
struct wl_egl_window *wl_egl_window = nullptr;
|
||||
#endif
|
||||
|
||||
// Flags whether we have allocated a buffer through the video drivers.
|
||||
bool visible = false;
|
||||
|
||||
DisplayServer::VSyncMode vsync_mode = VSYNC_ENABLED;
|
||||
|
||||
uint32_t flags = 0;
|
||||
|
||||
DisplayServer::WindowMode mode = WINDOW_MODE_WINDOWED;
|
||||
|
||||
Callable rect_changed_callback;
|
||||
Callable window_event_callback;
|
||||
Callable input_event_callback;
|
||||
Callable drop_files_callback;
|
||||
Callable input_text_callback;
|
||||
|
||||
String title;
|
||||
ObjectID instance_id;
|
||||
};
|
||||
|
||||
struct CustomCursor {
|
||||
RID rid;
|
||||
Point2i hotspot;
|
||||
};
|
||||
|
||||
CursorShape cursor_shape = CURSOR_ARROW;
|
||||
DisplayServer::MouseMode mouse_mode = DisplayServer::MOUSE_MODE_VISIBLE;
|
||||
|
||||
HashMap<CursorShape, CustomCursor> custom_cursors;
|
||||
|
||||
WindowData main_window;
|
||||
WaylandThread wayland_thread;
|
||||
|
||||
Context context;
|
||||
|
||||
bool frame = false;
|
||||
bool emulate_vsync = false;
|
||||
|
||||
String rendering_driver;
|
||||
|
||||
#ifdef RD_ENABLED
|
||||
ApiContextRD *context_rd = nullptr;
|
||||
RenderingDevice *rendering_device = nullptr;
|
||||
#endif
|
||||
|
||||
#ifdef GLES3_ENABLED
|
||||
EGLManagerWayland *egl_manager = nullptr;
|
||||
#endif
|
||||
|
||||
#ifdef SPEECHD_ENABLED
|
||||
TTS_Linux *tts = nullptr;
|
||||
#endif
|
||||
|
||||
#if DBUS_ENABLED
|
||||
FreeDesktopPortalDesktop *portal_desktop = nullptr;
|
||||
|
||||
FreeDesktopScreenSaver *screensaver = nullptr;
|
||||
bool screensaver_inhibited = false;
|
||||
#endif
|
||||
static String _get_app_id_from_context(Context p_context);
|
||||
|
||||
void _send_window_event(WindowEvent p_event);
|
||||
|
||||
static void dispatch_input_events(const Ref<InputEvent> &p_event);
|
||||
void _dispatch_input_event(const Ref<InputEvent> &p_event);
|
||||
|
||||
void _resize_window(const Size2i &p_size);
|
||||
|
||||
virtual void _show_window();
|
||||
|
||||
public:
|
||||
virtual bool has_feature(Feature p_feature) const override;
|
||||
|
||||
virtual String get_name() const override;
|
||||
|
||||
#ifdef SPEECHD_ENABLED
|
||||
virtual bool tts_is_speaking() const override;
|
||||
virtual bool tts_is_paused() const override;
|
||||
virtual TypedArray<Dictionary> tts_get_voices() const override;
|
||||
|
||||
virtual void tts_speak(const String &p_text, const String &p_voice, int p_volume = 50, float p_pitch = 1.f, float p_rate = 1.f, int p_utterance_id = 0, bool p_interrupt = false) override;
|
||||
virtual void tts_pause() override;
|
||||
virtual void tts_resume() override;
|
||||
virtual void tts_stop() override;
|
||||
#endif
|
||||
|
||||
#ifdef DBUS_ENABLED
|
||||
virtual bool is_dark_mode_supported() const override;
|
||||
virtual bool is_dark_mode() const override;
|
||||
#endif
|
||||
|
||||
virtual void mouse_set_mode(MouseMode p_mode) override;
|
||||
virtual MouseMode mouse_get_mode() const override;
|
||||
|
||||
virtual void warp_mouse(const Point2i &p_to) override;
|
||||
virtual Point2i mouse_get_position() const override;
|
||||
virtual BitField<MouseButtonMask> mouse_get_button_state() const override;
|
||||
|
||||
virtual void clipboard_set(const String &p_text) override;
|
||||
virtual String clipboard_get() const override;
|
||||
virtual Ref<Image> clipboard_get_image() const override;
|
||||
virtual void clipboard_set_primary(const String &p_text) override;
|
||||
virtual String clipboard_get_primary() const override;
|
||||
|
||||
virtual int get_screen_count() const override;
|
||||
virtual int get_primary_screen() const override;
|
||||
virtual Point2i screen_get_position(int p_screen = SCREEN_OF_MAIN_WINDOW) const override;
|
||||
virtual Size2i screen_get_size(int p_screen = SCREEN_OF_MAIN_WINDOW) const override;
|
||||
virtual Rect2i screen_get_usable_rect(int p_screen = SCREEN_OF_MAIN_WINDOW) const override;
|
||||
virtual int screen_get_dpi(int p_screen = SCREEN_OF_MAIN_WINDOW) const override;
|
||||
virtual float screen_get_scale(int p_screen = SCREEN_OF_MAIN_WINDOW) const override;
|
||||
virtual float screen_get_refresh_rate(int p_screen = SCREEN_OF_MAIN_WINDOW) const override;
|
||||
|
||||
virtual void screen_set_keep_on(bool p_enable) override;
|
||||
virtual bool screen_is_kept_on() const override;
|
||||
|
||||
virtual Vector<DisplayServer::WindowID> get_window_list() const override;
|
||||
|
||||
virtual WindowID get_window_at_screen_position(const Point2i &p_position) const override;
|
||||
|
||||
virtual void window_attach_instance_id(ObjectID p_instance, WindowID p_window_id = MAIN_WINDOW_ID) override;
|
||||
virtual ObjectID window_get_attached_instance_id(WindowID p_window_id = MAIN_WINDOW_ID) const override;
|
||||
|
||||
virtual void window_set_title(const String &p_title, WindowID p_window_id = MAIN_WINDOW_ID) override;
|
||||
virtual void window_set_mouse_passthrough(const Vector<Vector2> &p_region, WindowID p_window_id = MAIN_WINDOW_ID) override;
|
||||
|
||||
virtual void window_set_rect_changed_callback(const Callable &p_callable, WindowID p_window_id = MAIN_WINDOW_ID) override;
|
||||
virtual void window_set_window_event_callback(const Callable &p_callable, WindowID p_window_id = MAIN_WINDOW_ID) override;
|
||||
virtual void window_set_input_event_callback(const Callable &p_callable, WindowID p_window_id = MAIN_WINDOW_ID) override;
|
||||
virtual void window_set_input_text_callback(const Callable &p_callable, WindowID p_window_id = MAIN_WINDOW_ID) override;
|
||||
virtual void window_set_drop_files_callback(const Callable &p_callable, WindowID p_window_id = MAIN_WINDOW_ID) override;
|
||||
|
||||
virtual int window_get_current_screen(WindowID p_window_id = MAIN_WINDOW_ID) const override;
|
||||
virtual void window_set_current_screen(int p_screen, WindowID p_window_id = MAIN_WINDOW_ID) override;
|
||||
|
||||
virtual Point2i window_get_position(WindowID p_window_id = MAIN_WINDOW_ID) const override;
|
||||
virtual Point2i window_get_position_with_decorations(WindowID p_window_id = MAIN_WINDOW_ID) const override;
|
||||
virtual void window_set_position(const Point2i &p_position, WindowID p_window_id = MAIN_WINDOW_ID) override;
|
||||
|
||||
virtual void window_set_max_size(const Size2i p_size, WindowID p_window_id = MAIN_WINDOW_ID) override;
|
||||
virtual Size2i window_get_max_size(WindowID p_window_id = MAIN_WINDOW_ID) const override;
|
||||
virtual void gl_window_make_current(DisplayServer::WindowID p_window_id) override;
|
||||
|
||||
virtual void window_set_transient(WindowID p_window_id, WindowID p_parent) override;
|
||||
|
||||
virtual void window_set_min_size(const Size2i p_size, WindowID p_window_id = MAIN_WINDOW_ID) override;
|
||||
virtual Size2i window_get_min_size(WindowID p_window_id = MAIN_WINDOW_ID) const override;
|
||||
|
||||
virtual void window_set_size(const Size2i p_size, WindowID p_window_id = MAIN_WINDOW_ID) override;
|
||||
virtual Size2i window_get_size(WindowID p_window_id = MAIN_WINDOW_ID) const override;
|
||||
virtual Size2i window_get_size_with_decorations(WindowID p_window_id = MAIN_WINDOW_ID) const override;
|
||||
|
||||
virtual void window_set_mode(WindowMode p_mode, WindowID p_window_id = MAIN_WINDOW_ID) override;
|
||||
virtual WindowMode window_get_mode(WindowID p_window_id = MAIN_WINDOW_ID) const override;
|
||||
|
||||
virtual bool window_is_maximize_allowed(WindowID p_window_id = MAIN_WINDOW_ID) const override;
|
||||
|
||||
virtual void window_set_flag(WindowFlags p_flag, bool p_enabled, WindowID p_window_id = MAIN_WINDOW_ID) override;
|
||||
virtual bool window_get_flag(WindowFlags p_flag, WindowID p_window_id = MAIN_WINDOW_ID) const override;
|
||||
|
||||
virtual void window_request_attention(WindowID p_window_id = MAIN_WINDOW_ID) override;
|
||||
|
||||
virtual void window_move_to_foreground(WindowID p_window_id = MAIN_WINDOW_ID) override;
|
||||
virtual bool window_is_focused(WindowID p_window = MAIN_WINDOW_ID) const override;
|
||||
|
||||
virtual bool window_can_draw(WindowID p_window_id = MAIN_WINDOW_ID) const override;
|
||||
|
||||
virtual bool can_any_window_draw() const override;
|
||||
|
||||
virtual void window_set_ime_active(const bool p_active, WindowID p_window_id = MAIN_WINDOW_ID) override;
|
||||
virtual void window_set_ime_position(const Point2i &p_pos, WindowID p_window_id = MAIN_WINDOW_ID) override;
|
||||
|
||||
virtual void window_set_vsync_mode(DisplayServer::VSyncMode p_vsync_mode, WindowID p_window_id = MAIN_WINDOW_ID) override;
|
||||
virtual DisplayServer::VSyncMode window_get_vsync_mode(WindowID p_window_id) const override;
|
||||
|
||||
virtual void cursor_set_shape(CursorShape p_shape) override;
|
||||
virtual CursorShape cursor_get_shape() const override;
|
||||
virtual void cursor_set_custom_image(const Ref<Resource> &p_cursor, CursorShape p_shape, const Vector2 &p_hotspot) override;
|
||||
|
||||
virtual int keyboard_get_layout_count() const override;
|
||||
virtual int keyboard_get_current_layout() const override;
|
||||
virtual void keyboard_set_current_layout(int p_index) override;
|
||||
virtual String keyboard_get_layout_language(int p_index) const override;
|
||||
virtual String keyboard_get_layout_name(int p_index) const override;
|
||||
virtual Key keyboard_get_keycode_from_physical(Key p_keycode) const override;
|
||||
|
||||
virtual void process_events() override;
|
||||
|
||||
virtual void release_rendering_thread() override;
|
||||
virtual void make_rendering_thread() override;
|
||||
virtual void swap_buffers() override;
|
||||
|
||||
virtual void set_context(Context p_context) override;
|
||||
|
||||
static DisplayServer *create_func(const String &p_rendering_driver, WindowMode p_mode, VSyncMode p_vsync_mode, uint32_t p_flags, const Point2i *p_position, const Size2i &p_resolution, int p_screen, Error &r_error);
|
||||
static Vector<String> get_rendering_drivers_func();
|
||||
|
||||
static void register_wayland_driver();
|
||||
|
||||
DisplayServerWayland(const String &p_rendering_driver, WindowMode p_mode, VSyncMode p_vsync_mode, uint32_t p_flags, const Vector2i &p_resolution, Error &r_error);
|
||||
~DisplayServerWayland();
|
||||
};
|
||||
|
||||
#endif // WAYLAND_ENABLED
|
||||
|
||||
#endif // DISPLAY_SERVER_WAYLAND_H
|
||||
@ -0,0 +1,453 @@
|
||||
// This file is generated. Do not edit!
|
||||
// see https://github.com/hpvb/dynload-wrapper for details
|
||||
// generated by ./generate-wrapper.py 0.3 on 2022-12-12 10:55:19
|
||||
// flags: ./generate-wrapper.py --include /usr/include/libdecor-0/libdecor.h --sys-include <libdecor-0/libdecor.h> --soname libdecor-0.so.0 --init-name libdecor --output-header libdecor-so_wrap.h --output-implementation libdecor-so_wrap.c --omit-prefix wl_
|
||||
//
|
||||
// EDIT: This has been handpatched to properly report the pointer type of the window_state argument of libdecor_configuration_get_window_state.
|
||||
#include <stdint.h>
|
||||
|
||||
#define libdecor_unref libdecor_unref_dylibloader_orig_libdecor
|
||||
#define libdecor_new libdecor_new_dylibloader_orig_libdecor
|
||||
#define libdecor_get_fd libdecor_get_fd_dylibloader_orig_libdecor
|
||||
#define libdecor_dispatch libdecor_dispatch_dylibloader_orig_libdecor
|
||||
#define libdecor_decorate libdecor_decorate_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_ref libdecor_frame_ref_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_unref libdecor_frame_unref_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_set_visibility libdecor_frame_set_visibility_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_is_visible libdecor_frame_is_visible_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_set_parent libdecor_frame_set_parent_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_set_title libdecor_frame_set_title_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_get_title libdecor_frame_get_title_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_set_app_id libdecor_frame_set_app_id_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_set_capabilities libdecor_frame_set_capabilities_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_unset_capabilities libdecor_frame_unset_capabilities_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_has_capability libdecor_frame_has_capability_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_show_window_menu libdecor_frame_show_window_menu_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_popup_grab libdecor_frame_popup_grab_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_popup_ungrab libdecor_frame_popup_ungrab_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_translate_coordinate libdecor_frame_translate_coordinate_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_set_min_content_size libdecor_frame_set_min_content_size_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_set_max_content_size libdecor_frame_set_max_content_size_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_resize libdecor_frame_resize_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_move libdecor_frame_move_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_commit libdecor_frame_commit_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_set_minimized libdecor_frame_set_minimized_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_set_maximized libdecor_frame_set_maximized_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_unset_maximized libdecor_frame_unset_maximized_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_set_fullscreen libdecor_frame_set_fullscreen_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_unset_fullscreen libdecor_frame_unset_fullscreen_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_is_floating libdecor_frame_is_floating_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_close libdecor_frame_close_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_map libdecor_frame_map_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_get_xdg_surface libdecor_frame_get_xdg_surface_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_get_xdg_toplevel libdecor_frame_get_xdg_toplevel_dylibloader_orig_libdecor
|
||||
#define libdecor_state_new libdecor_state_new_dylibloader_orig_libdecor
|
||||
#define libdecor_state_free libdecor_state_free_dylibloader_orig_libdecor
|
||||
#define libdecor_configuration_get_content_size libdecor_configuration_get_content_size_dylibloader_orig_libdecor
|
||||
#define libdecor_configuration_get_window_state libdecor_configuration_get_window_state_dylibloader_orig_libdecor
|
||||
#include <libdecor-0/libdecor.h>
|
||||
#undef libdecor_unref
|
||||
#undef libdecor_new
|
||||
#undef libdecor_get_fd
|
||||
#undef libdecor_dispatch
|
||||
#undef libdecor_decorate
|
||||
#undef libdecor_frame_ref
|
||||
#undef libdecor_frame_unref
|
||||
#undef libdecor_frame_set_visibility
|
||||
#undef libdecor_frame_is_visible
|
||||
#undef libdecor_frame_set_parent
|
||||
#undef libdecor_frame_set_title
|
||||
#undef libdecor_frame_get_title
|
||||
#undef libdecor_frame_set_app_id
|
||||
#undef libdecor_frame_set_capabilities
|
||||
#undef libdecor_frame_unset_capabilities
|
||||
#undef libdecor_frame_has_capability
|
||||
#undef libdecor_frame_show_window_menu
|
||||
#undef libdecor_frame_popup_grab
|
||||
#undef libdecor_frame_popup_ungrab
|
||||
#undef libdecor_frame_translate_coordinate
|
||||
#undef libdecor_frame_set_min_content_size
|
||||
#undef libdecor_frame_set_max_content_size
|
||||
#undef libdecor_frame_resize
|
||||
#undef libdecor_frame_move
|
||||
#undef libdecor_frame_commit
|
||||
#undef libdecor_frame_set_minimized
|
||||
#undef libdecor_frame_set_maximized
|
||||
#undef libdecor_frame_unset_maximized
|
||||
#undef libdecor_frame_set_fullscreen
|
||||
#undef libdecor_frame_unset_fullscreen
|
||||
#undef libdecor_frame_is_floating
|
||||
#undef libdecor_frame_close
|
||||
#undef libdecor_frame_map
|
||||
#undef libdecor_frame_get_xdg_surface
|
||||
#undef libdecor_frame_get_xdg_toplevel
|
||||
#undef libdecor_state_new
|
||||
#undef libdecor_state_free
|
||||
#undef libdecor_configuration_get_content_size
|
||||
#undef libdecor_configuration_get_window_state
|
||||
#include <dlfcn.h>
|
||||
#include <stdio.h>
|
||||
void (*libdecor_unref_dylibloader_wrapper_libdecor)(struct libdecor*);
|
||||
struct libdecor* (*libdecor_new_dylibloader_wrapper_libdecor)(struct wl_display*,struct libdecor_interface*);
|
||||
int (*libdecor_get_fd_dylibloader_wrapper_libdecor)(struct libdecor*);
|
||||
int (*libdecor_dispatch_dylibloader_wrapper_libdecor)(struct libdecor*, int);
|
||||
struct libdecor_frame* (*libdecor_decorate_dylibloader_wrapper_libdecor)(struct libdecor*,struct wl_surface*,struct libdecor_frame_interface*, void*);
|
||||
void (*libdecor_frame_ref_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
|
||||
void (*libdecor_frame_unref_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
|
||||
void (*libdecor_frame_set_visibility_dylibloader_wrapper_libdecor)(struct libdecor_frame*, bool);
|
||||
bool (*libdecor_frame_is_visible_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
|
||||
void (*libdecor_frame_set_parent_dylibloader_wrapper_libdecor)(struct libdecor_frame*,struct libdecor_frame*);
|
||||
void (*libdecor_frame_set_title_dylibloader_wrapper_libdecor)(struct libdecor_frame*,const char*);
|
||||
const char* (*libdecor_frame_get_title_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
|
||||
void (*libdecor_frame_set_app_id_dylibloader_wrapper_libdecor)(struct libdecor_frame*,const char*);
|
||||
void (*libdecor_frame_set_capabilities_dylibloader_wrapper_libdecor)(struct libdecor_frame*,enum libdecor_capabilities);
|
||||
void (*libdecor_frame_unset_capabilities_dylibloader_wrapper_libdecor)(struct libdecor_frame*,enum libdecor_capabilities);
|
||||
bool (*libdecor_frame_has_capability_dylibloader_wrapper_libdecor)(struct libdecor_frame*,enum libdecor_capabilities);
|
||||
void (*libdecor_frame_show_window_menu_dylibloader_wrapper_libdecor)(struct libdecor_frame*,struct wl_seat*, uint32_t, int, int);
|
||||
void (*libdecor_frame_popup_grab_dylibloader_wrapper_libdecor)(struct libdecor_frame*,const char*);
|
||||
void (*libdecor_frame_popup_ungrab_dylibloader_wrapper_libdecor)(struct libdecor_frame*,const char*);
|
||||
void (*libdecor_frame_translate_coordinate_dylibloader_wrapper_libdecor)(struct libdecor_frame*, int, int, int*, int*);
|
||||
void (*libdecor_frame_set_min_content_size_dylibloader_wrapper_libdecor)(struct libdecor_frame*, int, int);
|
||||
void (*libdecor_frame_set_max_content_size_dylibloader_wrapper_libdecor)(struct libdecor_frame*, int, int);
|
||||
void (*libdecor_frame_resize_dylibloader_wrapper_libdecor)(struct libdecor_frame*,struct wl_seat*, uint32_t,enum libdecor_resize_edge);
|
||||
void (*libdecor_frame_move_dylibloader_wrapper_libdecor)(struct libdecor_frame*,struct wl_seat*, uint32_t);
|
||||
void (*libdecor_frame_commit_dylibloader_wrapper_libdecor)(struct libdecor_frame*,struct libdecor_state*,struct libdecor_configuration*);
|
||||
void (*libdecor_frame_set_minimized_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
|
||||
void (*libdecor_frame_set_maximized_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
|
||||
void (*libdecor_frame_unset_maximized_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
|
||||
void (*libdecor_frame_set_fullscreen_dylibloader_wrapper_libdecor)(struct libdecor_frame*,struct wl_output*);
|
||||
void (*libdecor_frame_unset_fullscreen_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
|
||||
bool (*libdecor_frame_is_floating_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
|
||||
void (*libdecor_frame_close_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
|
||||
void (*libdecor_frame_map_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
|
||||
struct xdg_surface* (*libdecor_frame_get_xdg_surface_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
|
||||
struct xdg_toplevel* (*libdecor_frame_get_xdg_toplevel_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
|
||||
struct libdecor_state* (*libdecor_state_new_dylibloader_wrapper_libdecor)( int, int);
|
||||
void (*libdecor_state_free_dylibloader_wrapper_libdecor)(struct libdecor_state*);
|
||||
bool (*libdecor_configuration_get_content_size_dylibloader_wrapper_libdecor)(struct libdecor_configuration*,struct libdecor_frame*, int*, int*);
|
||||
bool (*libdecor_configuration_get_window_state_dylibloader_wrapper_libdecor)(struct libdecor_configuration*,enum libdecor_window_state*);
|
||||
int initialize_libdecor(int verbose) {
|
||||
void *handle;
|
||||
char *error;
|
||||
handle = dlopen("libdecor-0.so.0", RTLD_LAZY);
|
||||
if (!handle) {
|
||||
if (verbose) {
|
||||
fprintf(stderr, "%s\n", dlerror());
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
dlerror();
|
||||
// libdecor_unref
|
||||
*(void **) (&libdecor_unref_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_unref");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_new
|
||||
*(void **) (&libdecor_new_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_new");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_get_fd
|
||||
*(void **) (&libdecor_get_fd_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_get_fd");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_dispatch
|
||||
*(void **) (&libdecor_dispatch_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_dispatch");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_decorate
|
||||
*(void **) (&libdecor_decorate_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_decorate");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_frame_ref
|
||||
*(void **) (&libdecor_frame_ref_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_ref");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_frame_unref
|
||||
*(void **) (&libdecor_frame_unref_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_unref");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_frame_set_visibility
|
||||
*(void **) (&libdecor_frame_set_visibility_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_set_visibility");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_frame_is_visible
|
||||
*(void **) (&libdecor_frame_is_visible_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_is_visible");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_frame_set_parent
|
||||
*(void **) (&libdecor_frame_set_parent_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_set_parent");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_frame_set_title
|
||||
*(void **) (&libdecor_frame_set_title_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_set_title");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_frame_get_title
|
||||
*(void **) (&libdecor_frame_get_title_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_get_title");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_frame_set_app_id
|
||||
*(void **) (&libdecor_frame_set_app_id_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_set_app_id");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_frame_set_capabilities
|
||||
*(void **) (&libdecor_frame_set_capabilities_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_set_capabilities");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_frame_unset_capabilities
|
||||
*(void **) (&libdecor_frame_unset_capabilities_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_unset_capabilities");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_frame_has_capability
|
||||
*(void **) (&libdecor_frame_has_capability_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_has_capability");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_frame_show_window_menu
|
||||
*(void **) (&libdecor_frame_show_window_menu_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_show_window_menu");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_frame_popup_grab
|
||||
*(void **) (&libdecor_frame_popup_grab_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_popup_grab");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_frame_popup_ungrab
|
||||
*(void **) (&libdecor_frame_popup_ungrab_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_popup_ungrab");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_frame_translate_coordinate
|
||||
*(void **) (&libdecor_frame_translate_coordinate_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_translate_coordinate");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_frame_set_min_content_size
|
||||
*(void **) (&libdecor_frame_set_min_content_size_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_set_min_content_size");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_frame_set_max_content_size
|
||||
*(void **) (&libdecor_frame_set_max_content_size_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_set_max_content_size");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_frame_resize
|
||||
*(void **) (&libdecor_frame_resize_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_resize");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_frame_move
|
||||
*(void **) (&libdecor_frame_move_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_move");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_frame_commit
|
||||
*(void **) (&libdecor_frame_commit_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_commit");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_frame_set_minimized
|
||||
*(void **) (&libdecor_frame_set_minimized_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_set_minimized");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_frame_set_maximized
|
||||
*(void **) (&libdecor_frame_set_maximized_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_set_maximized");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_frame_unset_maximized
|
||||
*(void **) (&libdecor_frame_unset_maximized_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_unset_maximized");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_frame_set_fullscreen
|
||||
*(void **) (&libdecor_frame_set_fullscreen_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_set_fullscreen");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_frame_unset_fullscreen
|
||||
*(void **) (&libdecor_frame_unset_fullscreen_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_unset_fullscreen");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_frame_is_floating
|
||||
*(void **) (&libdecor_frame_is_floating_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_is_floating");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_frame_close
|
||||
*(void **) (&libdecor_frame_close_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_close");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_frame_map
|
||||
*(void **) (&libdecor_frame_map_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_map");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_frame_get_xdg_surface
|
||||
*(void **) (&libdecor_frame_get_xdg_surface_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_get_xdg_surface");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_frame_get_xdg_toplevel
|
||||
*(void **) (&libdecor_frame_get_xdg_toplevel_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_get_xdg_toplevel");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_state_new
|
||||
*(void **) (&libdecor_state_new_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_state_new");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_state_free
|
||||
*(void **) (&libdecor_state_free_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_state_free");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_configuration_get_content_size
|
||||
*(void **) (&libdecor_configuration_get_content_size_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_configuration_get_content_size");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// libdecor_configuration_get_window_state
|
||||
*(void **) (&libdecor_configuration_get_window_state_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_configuration_get_window_state");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -0,0 +1,175 @@
|
||||
#ifndef DYLIBLOAD_WRAPPER_LIBDECOR
|
||||
#define DYLIBLOAD_WRAPPER_LIBDECOR
|
||||
// This file is generated. Do not edit!
|
||||
// see https://github.com/hpvb/dynload-wrapper for details
|
||||
// generated by ./generate-wrapper.py 0.3 on 2022-12-12 10:55:19
|
||||
// flags: ./generate-wrapper.py --include /usr/include/libdecor-0/libdecor.h --sys-include <libdecor-0/libdecor.h> --soname libdecor-0.so.0 --init-name libdecor --output-header libdecor-so_wrap.h --output-implementation libdecor-so_wrap.c --omit-prefix wl_
|
||||
//
|
||||
// EDIT: This has been handpatched to properly report the pointer type of the window_state argument of libdecor_configuration_get_window_state.
|
||||
#include <stdint.h>
|
||||
|
||||
#define libdecor_unref libdecor_unref_dylibloader_orig_libdecor
|
||||
#define libdecor_new libdecor_new_dylibloader_orig_libdecor
|
||||
#define libdecor_get_fd libdecor_get_fd_dylibloader_orig_libdecor
|
||||
#define libdecor_dispatch libdecor_dispatch_dylibloader_orig_libdecor
|
||||
#define libdecor_decorate libdecor_decorate_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_ref libdecor_frame_ref_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_unref libdecor_frame_unref_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_set_visibility libdecor_frame_set_visibility_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_is_visible libdecor_frame_is_visible_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_set_parent libdecor_frame_set_parent_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_set_title libdecor_frame_set_title_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_get_title libdecor_frame_get_title_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_set_app_id libdecor_frame_set_app_id_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_set_capabilities libdecor_frame_set_capabilities_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_unset_capabilities libdecor_frame_unset_capabilities_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_has_capability libdecor_frame_has_capability_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_show_window_menu libdecor_frame_show_window_menu_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_popup_grab libdecor_frame_popup_grab_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_popup_ungrab libdecor_frame_popup_ungrab_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_translate_coordinate libdecor_frame_translate_coordinate_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_set_min_content_size libdecor_frame_set_min_content_size_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_set_max_content_size libdecor_frame_set_max_content_size_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_resize libdecor_frame_resize_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_move libdecor_frame_move_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_commit libdecor_frame_commit_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_set_minimized libdecor_frame_set_minimized_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_set_maximized libdecor_frame_set_maximized_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_unset_maximized libdecor_frame_unset_maximized_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_set_fullscreen libdecor_frame_set_fullscreen_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_unset_fullscreen libdecor_frame_unset_fullscreen_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_is_floating libdecor_frame_is_floating_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_close libdecor_frame_close_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_map libdecor_frame_map_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_get_xdg_surface libdecor_frame_get_xdg_surface_dylibloader_orig_libdecor
|
||||
#define libdecor_frame_get_xdg_toplevel libdecor_frame_get_xdg_toplevel_dylibloader_orig_libdecor
|
||||
#define libdecor_state_new libdecor_state_new_dylibloader_orig_libdecor
|
||||
#define libdecor_state_free libdecor_state_free_dylibloader_orig_libdecor
|
||||
#define libdecor_configuration_get_content_size libdecor_configuration_get_content_size_dylibloader_orig_libdecor
|
||||
#define libdecor_configuration_get_window_state libdecor_configuration_get_window_state_dylibloader_orig_libdecor
|
||||
#include <libdecor-0/libdecor.h>
|
||||
#undef libdecor_unref
|
||||
#undef libdecor_new
|
||||
#undef libdecor_get_fd
|
||||
#undef libdecor_dispatch
|
||||
#undef libdecor_decorate
|
||||
#undef libdecor_frame_ref
|
||||
#undef libdecor_frame_unref
|
||||
#undef libdecor_frame_set_visibility
|
||||
#undef libdecor_frame_is_visible
|
||||
#undef libdecor_frame_set_parent
|
||||
#undef libdecor_frame_set_title
|
||||
#undef libdecor_frame_get_title
|
||||
#undef libdecor_frame_set_app_id
|
||||
#undef libdecor_frame_set_capabilities
|
||||
#undef libdecor_frame_unset_capabilities
|
||||
#undef libdecor_frame_has_capability
|
||||
#undef libdecor_frame_show_window_menu
|
||||
#undef libdecor_frame_popup_grab
|
||||
#undef libdecor_frame_popup_ungrab
|
||||
#undef libdecor_frame_translate_coordinate
|
||||
#undef libdecor_frame_set_min_content_size
|
||||
#undef libdecor_frame_set_max_content_size
|
||||
#undef libdecor_frame_resize
|
||||
#undef libdecor_frame_move
|
||||
#undef libdecor_frame_commit
|
||||
#undef libdecor_frame_set_minimized
|
||||
#undef libdecor_frame_set_maximized
|
||||
#undef libdecor_frame_unset_maximized
|
||||
#undef libdecor_frame_set_fullscreen
|
||||
#undef libdecor_frame_unset_fullscreen
|
||||
#undef libdecor_frame_is_floating
|
||||
#undef libdecor_frame_close
|
||||
#undef libdecor_frame_map
|
||||
#undef libdecor_frame_get_xdg_surface
|
||||
#undef libdecor_frame_get_xdg_toplevel
|
||||
#undef libdecor_state_new
|
||||
#undef libdecor_state_free
|
||||
#undef libdecor_configuration_get_content_size
|
||||
#undef libdecor_configuration_get_window_state
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#define libdecor_unref libdecor_unref_dylibloader_wrapper_libdecor
|
||||
#define libdecor_new libdecor_new_dylibloader_wrapper_libdecor
|
||||
#define libdecor_get_fd libdecor_get_fd_dylibloader_wrapper_libdecor
|
||||
#define libdecor_dispatch libdecor_dispatch_dylibloader_wrapper_libdecor
|
||||
#define libdecor_decorate libdecor_decorate_dylibloader_wrapper_libdecor
|
||||
#define libdecor_frame_ref libdecor_frame_ref_dylibloader_wrapper_libdecor
|
||||
#define libdecor_frame_unref libdecor_frame_unref_dylibloader_wrapper_libdecor
|
||||
#define libdecor_frame_set_visibility libdecor_frame_set_visibility_dylibloader_wrapper_libdecor
|
||||
#define libdecor_frame_is_visible libdecor_frame_is_visible_dylibloader_wrapper_libdecor
|
||||
#define libdecor_frame_set_parent libdecor_frame_set_parent_dylibloader_wrapper_libdecor
|
||||
#define libdecor_frame_set_title libdecor_frame_set_title_dylibloader_wrapper_libdecor
|
||||
#define libdecor_frame_get_title libdecor_frame_get_title_dylibloader_wrapper_libdecor
|
||||
#define libdecor_frame_set_app_id libdecor_frame_set_app_id_dylibloader_wrapper_libdecor
|
||||
#define libdecor_frame_set_capabilities libdecor_frame_set_capabilities_dylibloader_wrapper_libdecor
|
||||
#define libdecor_frame_unset_capabilities libdecor_frame_unset_capabilities_dylibloader_wrapper_libdecor
|
||||
#define libdecor_frame_has_capability libdecor_frame_has_capability_dylibloader_wrapper_libdecor
|
||||
#define libdecor_frame_show_window_menu libdecor_frame_show_window_menu_dylibloader_wrapper_libdecor
|
||||
#define libdecor_frame_popup_grab libdecor_frame_popup_grab_dylibloader_wrapper_libdecor
|
||||
#define libdecor_frame_popup_ungrab libdecor_frame_popup_ungrab_dylibloader_wrapper_libdecor
|
||||
#define libdecor_frame_translate_coordinate libdecor_frame_translate_coordinate_dylibloader_wrapper_libdecor
|
||||
#define libdecor_frame_set_min_content_size libdecor_frame_set_min_content_size_dylibloader_wrapper_libdecor
|
||||
#define libdecor_frame_set_max_content_size libdecor_frame_set_max_content_size_dylibloader_wrapper_libdecor
|
||||
#define libdecor_frame_resize libdecor_frame_resize_dylibloader_wrapper_libdecor
|
||||
#define libdecor_frame_move libdecor_frame_move_dylibloader_wrapper_libdecor
|
||||
#define libdecor_frame_commit libdecor_frame_commit_dylibloader_wrapper_libdecor
|
||||
#define libdecor_frame_set_minimized libdecor_frame_set_minimized_dylibloader_wrapper_libdecor
|
||||
#define libdecor_frame_set_maximized libdecor_frame_set_maximized_dylibloader_wrapper_libdecor
|
||||
#define libdecor_frame_unset_maximized libdecor_frame_unset_maximized_dylibloader_wrapper_libdecor
|
||||
#define libdecor_frame_set_fullscreen libdecor_frame_set_fullscreen_dylibloader_wrapper_libdecor
|
||||
#define libdecor_frame_unset_fullscreen libdecor_frame_unset_fullscreen_dylibloader_wrapper_libdecor
|
||||
#define libdecor_frame_is_floating libdecor_frame_is_floating_dylibloader_wrapper_libdecor
|
||||
#define libdecor_frame_close libdecor_frame_close_dylibloader_wrapper_libdecor
|
||||
#define libdecor_frame_map libdecor_frame_map_dylibloader_wrapper_libdecor
|
||||
#define libdecor_frame_get_xdg_surface libdecor_frame_get_xdg_surface_dylibloader_wrapper_libdecor
|
||||
#define libdecor_frame_get_xdg_toplevel libdecor_frame_get_xdg_toplevel_dylibloader_wrapper_libdecor
|
||||
#define libdecor_state_new libdecor_state_new_dylibloader_wrapper_libdecor
|
||||
#define libdecor_state_free libdecor_state_free_dylibloader_wrapper_libdecor
|
||||
#define libdecor_configuration_get_content_size libdecor_configuration_get_content_size_dylibloader_wrapper_libdecor
|
||||
#define libdecor_configuration_get_window_state libdecor_configuration_get_window_state_dylibloader_wrapper_libdecor
|
||||
extern void (*libdecor_unref_dylibloader_wrapper_libdecor)(struct libdecor*);
|
||||
extern struct libdecor* (*libdecor_new_dylibloader_wrapper_libdecor)(struct wl_display*,struct libdecor_interface*);
|
||||
extern int (*libdecor_get_fd_dylibloader_wrapper_libdecor)(struct libdecor*);
|
||||
extern int (*libdecor_dispatch_dylibloader_wrapper_libdecor)(struct libdecor*, int);
|
||||
extern struct libdecor_frame* (*libdecor_decorate_dylibloader_wrapper_libdecor)(struct libdecor*,struct wl_surface*,struct libdecor_frame_interface*, void*);
|
||||
extern void (*libdecor_frame_ref_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
|
||||
extern void (*libdecor_frame_unref_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
|
||||
extern void (*libdecor_frame_set_visibility_dylibloader_wrapper_libdecor)(struct libdecor_frame*, bool);
|
||||
extern bool (*libdecor_frame_is_visible_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
|
||||
extern void (*libdecor_frame_set_parent_dylibloader_wrapper_libdecor)(struct libdecor_frame*,struct libdecor_frame*);
|
||||
extern void (*libdecor_frame_set_title_dylibloader_wrapper_libdecor)(struct libdecor_frame*,const char*);
|
||||
extern const char* (*libdecor_frame_get_title_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
|
||||
extern void (*libdecor_frame_set_app_id_dylibloader_wrapper_libdecor)(struct libdecor_frame*,const char*);
|
||||
extern void (*libdecor_frame_set_capabilities_dylibloader_wrapper_libdecor)(struct libdecor_frame*,enum libdecor_capabilities);
|
||||
extern void (*libdecor_frame_unset_capabilities_dylibloader_wrapper_libdecor)(struct libdecor_frame*,enum libdecor_capabilities);
|
||||
extern bool (*libdecor_frame_has_capability_dylibloader_wrapper_libdecor)(struct libdecor_frame*,enum libdecor_capabilities);
|
||||
extern void (*libdecor_frame_show_window_menu_dylibloader_wrapper_libdecor)(struct libdecor_frame*,struct wl_seat*, uint32_t, int, int);
|
||||
extern void (*libdecor_frame_popup_grab_dylibloader_wrapper_libdecor)(struct libdecor_frame*,const char*);
|
||||
extern void (*libdecor_frame_popup_ungrab_dylibloader_wrapper_libdecor)(struct libdecor_frame*,const char*);
|
||||
extern void (*libdecor_frame_translate_coordinate_dylibloader_wrapper_libdecor)(struct libdecor_frame*, int, int, int*, int*);
|
||||
extern void (*libdecor_frame_set_min_content_size_dylibloader_wrapper_libdecor)(struct libdecor_frame*, int, int);
|
||||
extern void (*libdecor_frame_set_max_content_size_dylibloader_wrapper_libdecor)(struct libdecor_frame*, int, int);
|
||||
extern void (*libdecor_frame_resize_dylibloader_wrapper_libdecor)(struct libdecor_frame*,struct wl_seat*, uint32_t,enum libdecor_resize_edge);
|
||||
extern void (*libdecor_frame_move_dylibloader_wrapper_libdecor)(struct libdecor_frame*,struct wl_seat*, uint32_t);
|
||||
extern void (*libdecor_frame_commit_dylibloader_wrapper_libdecor)(struct libdecor_frame*,struct libdecor_state*,struct libdecor_configuration*);
|
||||
extern void (*libdecor_frame_set_minimized_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
|
||||
extern void (*libdecor_frame_set_maximized_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
|
||||
extern void (*libdecor_frame_unset_maximized_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
|
||||
extern void (*libdecor_frame_set_fullscreen_dylibloader_wrapper_libdecor)(struct libdecor_frame*,struct wl_output*);
|
||||
extern void (*libdecor_frame_unset_fullscreen_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
|
||||
extern bool (*libdecor_frame_is_floating_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
|
||||
extern void (*libdecor_frame_close_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
|
||||
extern void (*libdecor_frame_map_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
|
||||
extern struct xdg_surface* (*libdecor_frame_get_xdg_surface_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
|
||||
extern struct xdg_toplevel* (*libdecor_frame_get_xdg_toplevel_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
|
||||
extern struct libdecor_state* (*libdecor_state_new_dylibloader_wrapper_libdecor)( int, int);
|
||||
extern void (*libdecor_state_free_dylibloader_wrapper_libdecor)(struct libdecor_state*);
|
||||
extern bool (*libdecor_configuration_get_content_size_dylibloader_wrapper_libdecor)(struct libdecor_configuration*,struct libdecor_frame*, int*, int*);
|
||||
extern bool (*libdecor_configuration_get_window_state_dylibloader_wrapper_libdecor)(struct libdecor_configuration*,enum libdecor_window_state*);
|
||||
int initialize_libdecor(int verbose);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
@ -0,0 +1,607 @@
|
||||
// This file is generated. Do not edit!
|
||||
// see https://github.com/hpvb/dynload-wrapper for details
|
||||
// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-25 17:36:12
|
||||
// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/wayland/wayland-client-core.h --sys-include "./thirdparty/linuxbsd_headers/wayland/wayland-client-core.h" --soname libwayland-client.so.0 --init-name wayland_client --output-header platform/linuxbsd/wayland/dynwrappers/wayland-client-core-so_wrap.h --output-implementation platform/linuxbsd/wayland/dynwrappers/wayland-client-core-so_wrap.c
|
||||
//
|
||||
// NOTE: This has been hand-patched to workaround some issues.
|
||||
#include <stdint.h>
|
||||
|
||||
#define wl_list_init wl_list_init_dylibloader_orig_wayland_client
|
||||
#define wl_list_insert wl_list_insert_dylibloader_orig_wayland_client
|
||||
#define wl_list_remove wl_list_remove_dylibloader_orig_wayland_client
|
||||
#define wl_list_length wl_list_length_dylibloader_orig_wayland_client
|
||||
#define wl_list_empty wl_list_empty_dylibloader_orig_wayland_client
|
||||
#define wl_list_insert_list wl_list_insert_list_dylibloader_orig_wayland_client
|
||||
#define wl_array_init wl_array_init_dylibloader_orig_wayland_client
|
||||
#define wl_array_release wl_array_release_dylibloader_orig_wayland_client
|
||||
#define wl_array_add wl_array_add_dylibloader_orig_wayland_client
|
||||
#define wl_array_copy wl_array_copy_dylibloader_orig_wayland_client
|
||||
#define wl_event_queue_destroy wl_event_queue_destroy_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_marshal_flags wl_proxy_marshal_flags_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_marshal_array_flags wl_proxy_marshal_array_flags_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_marshal wl_proxy_marshal_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_marshal_array wl_proxy_marshal_array_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_create wl_proxy_create_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_create_wrapper wl_proxy_create_wrapper_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_wrapper_destroy wl_proxy_wrapper_destroy_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_marshal_constructor wl_proxy_marshal_constructor_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_marshal_constructor_versioned wl_proxy_marshal_constructor_versioned_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_marshal_array_constructor wl_proxy_marshal_array_constructor_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_marshal_array_constructor_versioned wl_proxy_marshal_array_constructor_versioned_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_destroy wl_proxy_destroy_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_add_listener wl_proxy_add_listener_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_get_listener wl_proxy_get_listener_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_add_dispatcher wl_proxy_add_dispatcher_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_set_user_data wl_proxy_set_user_data_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_get_user_data wl_proxy_get_user_data_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_get_version wl_proxy_get_version_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_get_id wl_proxy_get_id_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_set_tag wl_proxy_set_tag_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_get_tag wl_proxy_get_tag_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_get_class wl_proxy_get_class_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_set_queue wl_proxy_set_queue_dylibloader_orig_wayland_client
|
||||
#define wl_display_connect wl_display_connect_dylibloader_orig_wayland_client
|
||||
#define wl_display_connect_to_fd wl_display_connect_to_fd_dylibloader_orig_wayland_client
|
||||
#define wl_display_disconnect wl_display_disconnect_dylibloader_orig_wayland_client
|
||||
#define wl_display_get_fd wl_display_get_fd_dylibloader_orig_wayland_client
|
||||
#define wl_display_dispatch wl_display_dispatch_dylibloader_orig_wayland_client
|
||||
#define wl_display_dispatch_queue wl_display_dispatch_queue_dylibloader_orig_wayland_client
|
||||
#define wl_display_dispatch_queue_pending wl_display_dispatch_queue_pending_dylibloader_orig_wayland_client
|
||||
#define wl_display_dispatch_pending wl_display_dispatch_pending_dylibloader_orig_wayland_client
|
||||
#define wl_display_get_error wl_display_get_error_dylibloader_orig_wayland_client
|
||||
#define wl_display_get_protocol_error wl_display_get_protocol_error_dylibloader_orig_wayland_client
|
||||
#define wl_display_flush wl_display_flush_dylibloader_orig_wayland_client
|
||||
#define wl_display_roundtrip_queue wl_display_roundtrip_queue_dylibloader_orig_wayland_client
|
||||
#define wl_display_roundtrip wl_display_roundtrip_dylibloader_orig_wayland_client
|
||||
#define wl_display_create_queue wl_display_create_queue_dylibloader_orig_wayland_client
|
||||
#define wl_display_prepare_read_queue wl_display_prepare_read_queue_dylibloader_orig_wayland_client
|
||||
#define wl_display_prepare_read wl_display_prepare_read_dylibloader_orig_wayland_client
|
||||
#define wl_display_cancel_read wl_display_cancel_read_dylibloader_orig_wayland_client
|
||||
#define wl_display_read_events wl_display_read_events_dylibloader_orig_wayland_client
|
||||
#define wl_log_set_handler_client wl_log_set_handler_client_dylibloader_orig_wayland_client
|
||||
#include "./thirdparty/linuxbsd_headers/wayland/wayland-client-core.h"
|
||||
#undef wl_list_init
|
||||
#undef wl_list_insert
|
||||
#undef wl_list_remove
|
||||
#undef wl_list_length
|
||||
#undef wl_list_empty
|
||||
#undef wl_list_insert_list
|
||||
#undef wl_array_init
|
||||
#undef wl_array_release
|
||||
#undef wl_array_add
|
||||
#undef wl_array_copy
|
||||
#undef wl_event_queue_destroy
|
||||
#undef wl_proxy_marshal_flags
|
||||
#undef wl_proxy_marshal_array_flags
|
||||
#undef wl_proxy_marshal
|
||||
#undef wl_proxy_marshal_array
|
||||
#undef wl_proxy_create
|
||||
#undef wl_proxy_create_wrapper
|
||||
#undef wl_proxy_wrapper_destroy
|
||||
#undef wl_proxy_marshal_constructor
|
||||
#undef wl_proxy_marshal_constructor_versioned
|
||||
#undef wl_proxy_marshal_array_constructor
|
||||
#undef wl_proxy_marshal_array_constructor_versioned
|
||||
#undef wl_proxy_destroy
|
||||
#undef wl_proxy_add_listener
|
||||
#undef wl_proxy_get_listener
|
||||
#undef wl_proxy_add_dispatcher
|
||||
#undef wl_proxy_set_user_data
|
||||
#undef wl_proxy_get_user_data
|
||||
#undef wl_proxy_get_version
|
||||
#undef wl_proxy_get_id
|
||||
#undef wl_proxy_set_tag
|
||||
#undef wl_proxy_get_tag
|
||||
#undef wl_proxy_get_class
|
||||
#undef wl_proxy_set_queue
|
||||
#undef wl_display_connect
|
||||
#undef wl_display_connect_to_fd
|
||||
#undef wl_display_disconnect
|
||||
#undef wl_display_get_fd
|
||||
#undef wl_display_dispatch
|
||||
#undef wl_display_dispatch_queue
|
||||
#undef wl_display_dispatch_queue_pending
|
||||
#undef wl_display_dispatch_pending
|
||||
#undef wl_display_get_error
|
||||
#undef wl_display_get_protocol_error
|
||||
#undef wl_display_flush
|
||||
#undef wl_display_roundtrip_queue
|
||||
#undef wl_display_roundtrip
|
||||
#undef wl_display_create_queue
|
||||
#undef wl_display_prepare_read_queue
|
||||
#undef wl_display_prepare_read
|
||||
#undef wl_display_cancel_read
|
||||
#undef wl_display_read_events
|
||||
#undef wl_log_set_handler_client
|
||||
#include <dlfcn.h>
|
||||
#include <stdio.h>
|
||||
void (*wl_list_init_dylibloader_wrapper_wayland_client)(struct wl_list*);
|
||||
void (*wl_list_insert_dylibloader_wrapper_wayland_client)(struct wl_list*,struct wl_list*);
|
||||
void (*wl_list_remove_dylibloader_wrapper_wayland_client)(struct wl_list*);
|
||||
int (*wl_list_length_dylibloader_wrapper_wayland_client)(struct wl_list*);
|
||||
int (*wl_list_empty_dylibloader_wrapper_wayland_client)(struct wl_list*);
|
||||
void (*wl_list_insert_list_dylibloader_wrapper_wayland_client)(struct wl_list*,struct wl_list*);
|
||||
void (*wl_array_init_dylibloader_wrapper_wayland_client)(struct wl_array*);
|
||||
void (*wl_array_release_dylibloader_wrapper_wayland_client)(struct wl_array*);
|
||||
void* (*wl_array_add_dylibloader_wrapper_wayland_client)(struct wl_array*, size_t);
|
||||
int (*wl_array_copy_dylibloader_wrapper_wayland_client)(struct wl_array*,struct wl_array*);
|
||||
void (*wl_event_queue_destroy_dylibloader_wrapper_wayland_client)(struct wl_event_queue*);
|
||||
struct wl_proxy* (*wl_proxy_marshal_flags_dylibloader_wrapper_wayland_client)(struct wl_proxy*, uint32_t,const struct wl_interface*, uint32_t, uint32_t,...);
|
||||
struct wl_proxy* (*wl_proxy_marshal_array_flags_dylibloader_wrapper_wayland_client)(struct wl_proxy*, uint32_t,const struct wl_interface*, uint32_t, uint32_t,union wl_argument);
|
||||
void (*wl_proxy_marshal_dylibloader_wrapper_wayland_client)(struct wl_proxy*, uint32_t,...);
|
||||
void (*wl_proxy_marshal_array_dylibloader_wrapper_wayland_client)(struct wl_proxy*, uint32_t,union wl_argument);
|
||||
struct wl_proxy* (*wl_proxy_create_dylibloader_wrapper_wayland_client)(struct wl_proxy*,const struct wl_interface*);
|
||||
void* (*wl_proxy_create_wrapper_dylibloader_wrapper_wayland_client)( void*);
|
||||
void (*wl_proxy_wrapper_destroy_dylibloader_wrapper_wayland_client)( void*);
|
||||
struct wl_proxy* (*wl_proxy_marshal_constructor_dylibloader_wrapper_wayland_client)(struct wl_proxy*, uint32_t,const struct wl_interface*,...);
|
||||
struct wl_proxy* (*wl_proxy_marshal_constructor_versioned_dylibloader_wrapper_wayland_client)(struct wl_proxy*, uint32_t,const struct wl_interface*, uint32_t,...);
|
||||
struct wl_proxy* (*wl_proxy_marshal_array_constructor_dylibloader_wrapper_wayland_client)(struct wl_proxy*, uint32_t,union wl_argument,const struct wl_interface*);
|
||||
struct wl_proxy* (*wl_proxy_marshal_array_constructor_versioned_dylibloader_wrapper_wayland_client)(struct wl_proxy*, uint32_t,union wl_argument,const struct wl_interface*, uint32_t);
|
||||
void (*wl_proxy_destroy_dylibloader_wrapper_wayland_client)(struct wl_proxy*);
|
||||
int (*wl_proxy_add_listener_dylibloader_wrapper_wayland_client)(struct wl_proxy*, void(**)(void), void*);
|
||||
const void* (*wl_proxy_get_listener_dylibloader_wrapper_wayland_client)(struct wl_proxy*);
|
||||
int (*wl_proxy_add_dispatcher_dylibloader_wrapper_wayland_client)(struct wl_proxy*, wl_dispatcher_func_t,const void*, void*);
|
||||
void (*wl_proxy_set_user_data_dylibloader_wrapper_wayland_client)(struct wl_proxy*, void*);
|
||||
void* (*wl_proxy_get_user_data_dylibloader_wrapper_wayland_client)(struct wl_proxy*);
|
||||
uint32_t (*wl_proxy_get_version_dylibloader_wrapper_wayland_client)(struct wl_proxy*);
|
||||
uint32_t (*wl_proxy_get_id_dylibloader_wrapper_wayland_client)(struct wl_proxy*);
|
||||
void (*wl_proxy_set_tag_dylibloader_wrapper_wayland_client)(struct wl_proxy*,const char**);
|
||||
const char** (*wl_proxy_get_tag_dylibloader_wrapper_wayland_client)(struct wl_proxy*);
|
||||
const char* (*wl_proxy_get_class_dylibloader_wrapper_wayland_client)(struct wl_proxy*);
|
||||
void (*wl_proxy_set_queue_dylibloader_wrapper_wayland_client)(struct wl_proxy*,struct wl_event_queue*);
|
||||
struct wl_display* (*wl_display_connect_dylibloader_wrapper_wayland_client)(const char*);
|
||||
struct wl_display* (*wl_display_connect_to_fd_dylibloader_wrapper_wayland_client)( int);
|
||||
void (*wl_display_disconnect_dylibloader_wrapper_wayland_client)(struct wl_display*);
|
||||
int (*wl_display_get_fd_dylibloader_wrapper_wayland_client)(struct wl_display*);
|
||||
int (*wl_display_dispatch_dylibloader_wrapper_wayland_client)(struct wl_display*);
|
||||
int (*wl_display_dispatch_queue_dylibloader_wrapper_wayland_client)(struct wl_display*,struct wl_event_queue*);
|
||||
int (*wl_display_dispatch_queue_pending_dylibloader_wrapper_wayland_client)(struct wl_display*,struct wl_event_queue*);
|
||||
int (*wl_display_dispatch_pending_dylibloader_wrapper_wayland_client)(struct wl_display*);
|
||||
int (*wl_display_get_error_dylibloader_wrapper_wayland_client)(struct wl_display*);
|
||||
uint32_t (*wl_display_get_protocol_error_dylibloader_wrapper_wayland_client)(struct wl_display*,const struct wl_interface**, uint32_t*);
|
||||
int (*wl_display_flush_dylibloader_wrapper_wayland_client)(struct wl_display*);
|
||||
int (*wl_display_roundtrip_queue_dylibloader_wrapper_wayland_client)(struct wl_display*,struct wl_event_queue*);
|
||||
int (*wl_display_roundtrip_dylibloader_wrapper_wayland_client)(struct wl_display*);
|
||||
struct wl_event_queue* (*wl_display_create_queue_dylibloader_wrapper_wayland_client)(struct wl_display*);
|
||||
int (*wl_display_prepare_read_queue_dylibloader_wrapper_wayland_client)(struct wl_display*,struct wl_event_queue*);
|
||||
int (*wl_display_prepare_read_dylibloader_wrapper_wayland_client)(struct wl_display*);
|
||||
void (*wl_display_cancel_read_dylibloader_wrapper_wayland_client)(struct wl_display*);
|
||||
int (*wl_display_read_events_dylibloader_wrapper_wayland_client)(struct wl_display*);
|
||||
void (*wl_log_set_handler_client_dylibloader_wrapper_wayland_client)( wl_log_func_t);
|
||||
int initialize_wayland_client(int verbose) {
|
||||
void *handle;
|
||||
char *error;
|
||||
handle = dlopen("libwayland-client.so.0", RTLD_LAZY);
|
||||
if (!handle) {
|
||||
if (verbose) {
|
||||
fprintf(stderr, "%s\n", dlerror());
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
dlerror();
|
||||
// wl_list_init
|
||||
*(void **) (&wl_list_init_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_list_init");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_list_insert
|
||||
*(void **) (&wl_list_insert_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_list_insert");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_list_remove
|
||||
*(void **) (&wl_list_remove_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_list_remove");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_list_length
|
||||
*(void **) (&wl_list_length_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_list_length");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_list_empty
|
||||
*(void **) (&wl_list_empty_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_list_empty");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_list_insert_list
|
||||
*(void **) (&wl_list_insert_list_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_list_insert_list");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_array_init
|
||||
*(void **) (&wl_array_init_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_array_init");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_array_release
|
||||
*(void **) (&wl_array_release_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_array_release");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_array_add
|
||||
*(void **) (&wl_array_add_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_array_add");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_array_copy
|
||||
*(void **) (&wl_array_copy_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_array_copy");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_event_queue_destroy
|
||||
*(void **) (&wl_event_queue_destroy_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_event_queue_destroy");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_proxy_marshal_flags
|
||||
*(void **) (&wl_proxy_marshal_flags_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_marshal_flags");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_proxy_marshal_array_flags
|
||||
*(void **) (&wl_proxy_marshal_array_flags_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_marshal_array_flags");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_proxy_marshal
|
||||
*(void **) (&wl_proxy_marshal_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_marshal");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_proxy_marshal_array
|
||||
*(void **) (&wl_proxy_marshal_array_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_marshal_array");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_proxy_create
|
||||
*(void **) (&wl_proxy_create_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_create");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_proxy_create_wrapper
|
||||
*(void **) (&wl_proxy_create_wrapper_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_create_wrapper");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_proxy_wrapper_destroy
|
||||
*(void **) (&wl_proxy_wrapper_destroy_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_wrapper_destroy");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_proxy_marshal_constructor
|
||||
*(void **) (&wl_proxy_marshal_constructor_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_marshal_constructor");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_proxy_marshal_constructor_versioned
|
||||
*(void **) (&wl_proxy_marshal_constructor_versioned_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_marshal_constructor_versioned");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_proxy_marshal_array_constructor
|
||||
*(void **) (&wl_proxy_marshal_array_constructor_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_marshal_array_constructor");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_proxy_marshal_array_constructor_versioned
|
||||
*(void **) (&wl_proxy_marshal_array_constructor_versioned_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_marshal_array_constructor_versioned");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_proxy_destroy
|
||||
*(void **) (&wl_proxy_destroy_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_destroy");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_proxy_add_listener
|
||||
*(void **) (&wl_proxy_add_listener_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_add_listener");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_proxy_get_listener
|
||||
*(void **) (&wl_proxy_get_listener_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_get_listener");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_proxy_add_dispatcher
|
||||
*(void **) (&wl_proxy_add_dispatcher_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_add_dispatcher");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_proxy_set_user_data
|
||||
*(void **) (&wl_proxy_set_user_data_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_set_user_data");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_proxy_get_user_data
|
||||
*(void **) (&wl_proxy_get_user_data_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_get_user_data");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_proxy_get_version
|
||||
*(void **) (&wl_proxy_get_version_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_get_version");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_proxy_get_id
|
||||
*(void **) (&wl_proxy_get_id_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_get_id");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_proxy_set_tag
|
||||
*(void **) (&wl_proxy_set_tag_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_set_tag");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_proxy_get_tag
|
||||
*(void **) (&wl_proxy_get_tag_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_get_tag");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_proxy_get_class
|
||||
*(void **) (&wl_proxy_get_class_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_get_class");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_proxy_set_queue
|
||||
*(void **) (&wl_proxy_set_queue_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_set_queue");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_display_connect
|
||||
*(void **) (&wl_display_connect_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_display_connect");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_display_connect_to_fd
|
||||
*(void **) (&wl_display_connect_to_fd_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_display_connect_to_fd");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_display_disconnect
|
||||
*(void **) (&wl_display_disconnect_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_display_disconnect");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_display_get_fd
|
||||
*(void **) (&wl_display_get_fd_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_display_get_fd");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_display_dispatch
|
||||
*(void **) (&wl_display_dispatch_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_display_dispatch");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_display_dispatch_queue
|
||||
*(void **) (&wl_display_dispatch_queue_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_display_dispatch_queue");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_display_dispatch_queue_pending
|
||||
*(void **) (&wl_display_dispatch_queue_pending_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_display_dispatch_queue_pending");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_display_dispatch_pending
|
||||
*(void **) (&wl_display_dispatch_pending_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_display_dispatch_pending");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_display_get_error
|
||||
*(void **) (&wl_display_get_error_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_display_get_error");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_display_get_protocol_error
|
||||
*(void **) (&wl_display_get_protocol_error_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_display_get_protocol_error");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_display_flush
|
||||
*(void **) (&wl_display_flush_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_display_flush");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_display_roundtrip_queue
|
||||
*(void **) (&wl_display_roundtrip_queue_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_display_roundtrip_queue");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_display_roundtrip
|
||||
*(void **) (&wl_display_roundtrip_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_display_roundtrip");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_display_create_queue
|
||||
*(void **) (&wl_display_create_queue_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_display_create_queue");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_display_prepare_read_queue
|
||||
*(void **) (&wl_display_prepare_read_queue_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_display_prepare_read_queue");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_display_prepare_read
|
||||
*(void **) (&wl_display_prepare_read_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_display_prepare_read");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_display_cancel_read
|
||||
*(void **) (&wl_display_cancel_read_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_display_cancel_read");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_display_read_events
|
||||
*(void **) (&wl_display_read_events_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_display_read_events");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_log_set_handler_client
|
||||
*(void **) (&wl_log_set_handler_client_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_log_set_handler_client");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -0,0 +1,231 @@
|
||||
#ifndef DYLIBLOAD_WRAPPER_WAYLAND_CLIENT
|
||||
#define DYLIBLOAD_WRAPPER_WAYLAND_CLIENT
|
||||
// This file is generated. Do not edit!
|
||||
// see https://github.com/hpvb/dynload-wrapper for details
|
||||
// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-25 17:36:12
|
||||
// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/wayland/wayland-client-core.h --sys-include "./thirdparty/linuxbsd_headers/wayland/wayland-client-core.h" --soname libwayland-client.so.0 --init-name wayland_client --output-header platform/linuxbsd/wayland/dynwrappers/wayland-client-core-so_wrap.h --output-implementation platform/linuxbsd/wayland/dynwrappers/wayland-client-core-so_wrap.c
|
||||
//
|
||||
// NOTE: This has been hand-patched to workaround some issues.
|
||||
#include <stdint.h>
|
||||
|
||||
#define wl_list_init wl_list_init_dylibloader_orig_wayland_client
|
||||
#define wl_list_insert wl_list_insert_dylibloader_orig_wayland_client
|
||||
#define wl_list_remove wl_list_remove_dylibloader_orig_wayland_client
|
||||
#define wl_list_length wl_list_length_dylibloader_orig_wayland_client
|
||||
#define wl_list_empty wl_list_empty_dylibloader_orig_wayland_client
|
||||
#define wl_list_insert_list wl_list_insert_list_dylibloader_orig_wayland_client
|
||||
#define wl_array_init wl_array_init_dylibloader_orig_wayland_client
|
||||
#define wl_array_release wl_array_release_dylibloader_orig_wayland_client
|
||||
#define wl_array_add wl_array_add_dylibloader_orig_wayland_client
|
||||
#define wl_array_copy wl_array_copy_dylibloader_orig_wayland_client
|
||||
#define wl_event_queue_destroy wl_event_queue_destroy_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_marshal_flags wl_proxy_marshal_flags_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_marshal_array_flags wl_proxy_marshal_array_flags_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_marshal wl_proxy_marshal_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_marshal_array wl_proxy_marshal_array_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_create wl_proxy_create_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_create_wrapper wl_proxy_create_wrapper_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_wrapper_destroy wl_proxy_wrapper_destroy_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_marshal_constructor wl_proxy_marshal_constructor_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_marshal_constructor_versioned wl_proxy_marshal_constructor_versioned_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_marshal_array_constructor wl_proxy_marshal_array_constructor_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_marshal_array_constructor_versioned wl_proxy_marshal_array_constructor_versioned_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_destroy wl_proxy_destroy_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_add_listener wl_proxy_add_listener_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_get_listener wl_proxy_get_listener_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_add_dispatcher wl_proxy_add_dispatcher_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_set_user_data wl_proxy_set_user_data_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_get_user_data wl_proxy_get_user_data_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_get_version wl_proxy_get_version_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_get_id wl_proxy_get_id_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_set_tag wl_proxy_set_tag_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_get_tag wl_proxy_get_tag_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_get_class wl_proxy_get_class_dylibloader_orig_wayland_client
|
||||
#define wl_proxy_set_queue wl_proxy_set_queue_dylibloader_orig_wayland_client
|
||||
#define wl_display_connect wl_display_connect_dylibloader_orig_wayland_client
|
||||
#define wl_display_connect_to_fd wl_display_connect_to_fd_dylibloader_orig_wayland_client
|
||||
#define wl_display_disconnect wl_display_disconnect_dylibloader_orig_wayland_client
|
||||
#define wl_display_get_fd wl_display_get_fd_dylibloader_orig_wayland_client
|
||||
#define wl_display_dispatch wl_display_dispatch_dylibloader_orig_wayland_client
|
||||
#define wl_display_dispatch_queue wl_display_dispatch_queue_dylibloader_orig_wayland_client
|
||||
#define wl_display_dispatch_queue_pending wl_display_dispatch_queue_pending_dylibloader_orig_wayland_client
|
||||
#define wl_display_dispatch_pending wl_display_dispatch_pending_dylibloader_orig_wayland_client
|
||||
#define wl_display_get_error wl_display_get_error_dylibloader_orig_wayland_client
|
||||
#define wl_display_get_protocol_error wl_display_get_protocol_error_dylibloader_orig_wayland_client
|
||||
#define wl_display_flush wl_display_flush_dylibloader_orig_wayland_client
|
||||
#define wl_display_roundtrip_queue wl_display_roundtrip_queue_dylibloader_orig_wayland_client
|
||||
#define wl_display_roundtrip wl_display_roundtrip_dylibloader_orig_wayland_client
|
||||
#define wl_display_create_queue wl_display_create_queue_dylibloader_orig_wayland_client
|
||||
#define wl_display_prepare_read_queue wl_display_prepare_read_queue_dylibloader_orig_wayland_client
|
||||
#define wl_display_prepare_read wl_display_prepare_read_dylibloader_orig_wayland_client
|
||||
#define wl_display_cancel_read wl_display_cancel_read_dylibloader_orig_wayland_client
|
||||
#define wl_display_read_events wl_display_read_events_dylibloader_orig_wayland_client
|
||||
#define wl_log_set_handler_client wl_log_set_handler_client_dylibloader_orig_wayland_client
|
||||
#include "./thirdparty/linuxbsd_headers/wayland/wayland-client-core.h"
|
||||
#undef wl_list_init
|
||||
#undef wl_list_insert
|
||||
#undef wl_list_remove
|
||||
#undef wl_list_length
|
||||
#undef wl_list_empty
|
||||
#undef wl_list_insert_list
|
||||
#undef wl_array_init
|
||||
#undef wl_array_release
|
||||
#undef wl_array_add
|
||||
#undef wl_array_copy
|
||||
#undef wl_event_queue_destroy
|
||||
#undef wl_proxy_marshal_flags
|
||||
#undef wl_proxy_marshal_array_flags
|
||||
#undef wl_proxy_marshal
|
||||
#undef wl_proxy_marshal_array
|
||||
#undef wl_proxy_create
|
||||
#undef wl_proxy_create_wrapper
|
||||
#undef wl_proxy_wrapper_destroy
|
||||
#undef wl_proxy_marshal_constructor
|
||||
#undef wl_proxy_marshal_constructor_versioned
|
||||
#undef wl_proxy_marshal_array_constructor
|
||||
#undef wl_proxy_marshal_array_constructor_versioned
|
||||
#undef wl_proxy_destroy
|
||||
#undef wl_proxy_add_listener
|
||||
#undef wl_proxy_get_listener
|
||||
#undef wl_proxy_add_dispatcher
|
||||
#undef wl_proxy_set_user_data
|
||||
#undef wl_proxy_get_user_data
|
||||
#undef wl_proxy_get_version
|
||||
#undef wl_proxy_get_id
|
||||
#undef wl_proxy_set_tag
|
||||
#undef wl_proxy_get_tag
|
||||
#undef wl_proxy_get_class
|
||||
#undef wl_proxy_set_queue
|
||||
#undef wl_display_connect
|
||||
#undef wl_display_connect_to_fd
|
||||
#undef wl_display_disconnect
|
||||
#undef wl_display_get_fd
|
||||
#undef wl_display_dispatch
|
||||
#undef wl_display_dispatch_queue
|
||||
#undef wl_display_dispatch_queue_pending
|
||||
#undef wl_display_dispatch_pending
|
||||
#undef wl_display_get_error
|
||||
#undef wl_display_get_protocol_error
|
||||
#undef wl_display_flush
|
||||
#undef wl_display_roundtrip_queue
|
||||
#undef wl_display_roundtrip
|
||||
#undef wl_display_create_queue
|
||||
#undef wl_display_prepare_read_queue
|
||||
#undef wl_display_prepare_read
|
||||
#undef wl_display_cancel_read
|
||||
#undef wl_display_read_events
|
||||
#undef wl_log_set_handler_client
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#define wl_list_init wl_list_init_dylibloader_wrapper_wayland_client
|
||||
#define wl_list_insert wl_list_insert_dylibloader_wrapper_wayland_client
|
||||
#define wl_list_remove wl_list_remove_dylibloader_wrapper_wayland_client
|
||||
#define wl_list_length wl_list_length_dylibloader_wrapper_wayland_client
|
||||
#define wl_list_empty wl_list_empty_dylibloader_wrapper_wayland_client
|
||||
#define wl_list_insert_list wl_list_insert_list_dylibloader_wrapper_wayland_client
|
||||
#define wl_array_init wl_array_init_dylibloader_wrapper_wayland_client
|
||||
#define wl_array_release wl_array_release_dylibloader_wrapper_wayland_client
|
||||
#define wl_array_add wl_array_add_dylibloader_wrapper_wayland_client
|
||||
#define wl_array_copy wl_array_copy_dylibloader_wrapper_wayland_client
|
||||
#define wl_event_queue_destroy wl_event_queue_destroy_dylibloader_wrapper_wayland_client
|
||||
#define wl_proxy_marshal_flags wl_proxy_marshal_flags_dylibloader_wrapper_wayland_client
|
||||
#define wl_proxy_marshal_array_flags wl_proxy_marshal_array_flags_dylibloader_wrapper_wayland_client
|
||||
#define wl_proxy_marshal wl_proxy_marshal_dylibloader_wrapper_wayland_client
|
||||
#define wl_proxy_marshal_array wl_proxy_marshal_array_dylibloader_wrapper_wayland_client
|
||||
#define wl_proxy_create wl_proxy_create_dylibloader_wrapper_wayland_client
|
||||
#define wl_proxy_create_wrapper wl_proxy_create_wrapper_dylibloader_wrapper_wayland_client
|
||||
#define wl_proxy_wrapper_destroy wl_proxy_wrapper_destroy_dylibloader_wrapper_wayland_client
|
||||
#define wl_proxy_marshal_constructor wl_proxy_marshal_constructor_dylibloader_wrapper_wayland_client
|
||||
#define wl_proxy_marshal_constructor_versioned wl_proxy_marshal_constructor_versioned_dylibloader_wrapper_wayland_client
|
||||
#define wl_proxy_marshal_array_constructor wl_proxy_marshal_array_constructor_dylibloader_wrapper_wayland_client
|
||||
#define wl_proxy_marshal_array_constructor_versioned wl_proxy_marshal_array_constructor_versioned_dylibloader_wrapper_wayland_client
|
||||
#define wl_proxy_destroy wl_proxy_destroy_dylibloader_wrapper_wayland_client
|
||||
#define wl_proxy_add_listener wl_proxy_add_listener_dylibloader_wrapper_wayland_client
|
||||
#define wl_proxy_get_listener wl_proxy_get_listener_dylibloader_wrapper_wayland_client
|
||||
#define wl_proxy_add_dispatcher wl_proxy_add_dispatcher_dylibloader_wrapper_wayland_client
|
||||
#define wl_proxy_set_user_data wl_proxy_set_user_data_dylibloader_wrapper_wayland_client
|
||||
#define wl_proxy_get_user_data wl_proxy_get_user_data_dylibloader_wrapper_wayland_client
|
||||
#define wl_proxy_get_version wl_proxy_get_version_dylibloader_wrapper_wayland_client
|
||||
#define wl_proxy_get_id wl_proxy_get_id_dylibloader_wrapper_wayland_client
|
||||
#define wl_proxy_set_tag wl_proxy_set_tag_dylibloader_wrapper_wayland_client
|
||||
#define wl_proxy_get_tag wl_proxy_get_tag_dylibloader_wrapper_wayland_client
|
||||
#define wl_proxy_get_class wl_proxy_get_class_dylibloader_wrapper_wayland_client
|
||||
#define wl_proxy_set_queue wl_proxy_set_queue_dylibloader_wrapper_wayland_client
|
||||
#define wl_display_connect wl_display_connect_dylibloader_wrapper_wayland_client
|
||||
#define wl_display_connect_to_fd wl_display_connect_to_fd_dylibloader_wrapper_wayland_client
|
||||
#define wl_display_disconnect wl_display_disconnect_dylibloader_wrapper_wayland_client
|
||||
#define wl_display_get_fd wl_display_get_fd_dylibloader_wrapper_wayland_client
|
||||
#define wl_display_dispatch wl_display_dispatch_dylibloader_wrapper_wayland_client
|
||||
#define wl_display_dispatch_queue wl_display_dispatch_queue_dylibloader_wrapper_wayland_client
|
||||
#define wl_display_dispatch_queue_pending wl_display_dispatch_queue_pending_dylibloader_wrapper_wayland_client
|
||||
#define wl_display_dispatch_pending wl_display_dispatch_pending_dylibloader_wrapper_wayland_client
|
||||
#define wl_display_get_error wl_display_get_error_dylibloader_wrapper_wayland_client
|
||||
#define wl_display_get_protocol_error wl_display_get_protocol_error_dylibloader_wrapper_wayland_client
|
||||
#define wl_display_flush wl_display_flush_dylibloader_wrapper_wayland_client
|
||||
#define wl_display_roundtrip_queue wl_display_roundtrip_queue_dylibloader_wrapper_wayland_client
|
||||
#define wl_display_roundtrip wl_display_roundtrip_dylibloader_wrapper_wayland_client
|
||||
#define wl_display_create_queue wl_display_create_queue_dylibloader_wrapper_wayland_client
|
||||
#define wl_display_prepare_read_queue wl_display_prepare_read_queue_dylibloader_wrapper_wayland_client
|
||||
#define wl_display_prepare_read wl_display_prepare_read_dylibloader_wrapper_wayland_client
|
||||
#define wl_display_cancel_read wl_display_cancel_read_dylibloader_wrapper_wayland_client
|
||||
#define wl_display_read_events wl_display_read_events_dylibloader_wrapper_wayland_client
|
||||
#define wl_log_set_handler_client wl_log_set_handler_client_dylibloader_wrapper_wayland_client
|
||||
extern void (*wl_list_init_dylibloader_wrapper_wayland_client)(struct wl_list*);
|
||||
extern void (*wl_list_insert_dylibloader_wrapper_wayland_client)(struct wl_list*,struct wl_list*);
|
||||
extern void (*wl_list_remove_dylibloader_wrapper_wayland_client)(struct wl_list*);
|
||||
extern int (*wl_list_length_dylibloader_wrapper_wayland_client)(struct wl_list*);
|
||||
extern int (*wl_list_empty_dylibloader_wrapper_wayland_client)(struct wl_list*);
|
||||
extern void (*wl_list_insert_list_dylibloader_wrapper_wayland_client)(struct wl_list*,struct wl_list*);
|
||||
extern void (*wl_array_init_dylibloader_wrapper_wayland_client)(struct wl_array*);
|
||||
extern void (*wl_array_release_dylibloader_wrapper_wayland_client)(struct wl_array*);
|
||||
extern void* (*wl_array_add_dylibloader_wrapper_wayland_client)(struct wl_array*, size_t);
|
||||
extern int (*wl_array_copy_dylibloader_wrapper_wayland_client)(struct wl_array*,struct wl_array*);
|
||||
extern void (*wl_event_queue_destroy_dylibloader_wrapper_wayland_client)(struct wl_event_queue*);
|
||||
extern struct wl_proxy* (*wl_proxy_marshal_flags_dylibloader_wrapper_wayland_client)(struct wl_proxy*, uint32_t,const struct wl_interface*, uint32_t, uint32_t,...);
|
||||
extern struct wl_proxy* (*wl_proxy_marshal_array_flags_dylibloader_wrapper_wayland_client)(struct wl_proxy*, uint32_t,const struct wl_interface*, uint32_t, uint32_t,union wl_argument);
|
||||
extern void (*wl_proxy_marshal_dylibloader_wrapper_wayland_client)(struct wl_proxy*, uint32_t,...);
|
||||
extern void (*wl_proxy_marshal_array_dylibloader_wrapper_wayland_client)(struct wl_proxy*, uint32_t,union wl_argument);
|
||||
extern struct wl_proxy* (*wl_proxy_create_dylibloader_wrapper_wayland_client)(struct wl_proxy*,const struct wl_interface*);
|
||||
extern void* (*wl_proxy_create_wrapper_dylibloader_wrapper_wayland_client)( void*);
|
||||
extern void (*wl_proxy_wrapper_destroy_dylibloader_wrapper_wayland_client)( void*);
|
||||
extern struct wl_proxy* (*wl_proxy_marshal_constructor_dylibloader_wrapper_wayland_client)(struct wl_proxy*, uint32_t,const struct wl_interface*,...);
|
||||
extern struct wl_proxy* (*wl_proxy_marshal_constructor_versioned_dylibloader_wrapper_wayland_client)(struct wl_proxy*, uint32_t,const struct wl_interface*, uint32_t,...);
|
||||
extern struct wl_proxy* (*wl_proxy_marshal_array_constructor_dylibloader_wrapper_wayland_client)(struct wl_proxy*, uint32_t,union wl_argument,const struct wl_interface*);
|
||||
extern struct wl_proxy* (*wl_proxy_marshal_array_constructor_versioned_dylibloader_wrapper_wayland_client)(struct wl_proxy*, uint32_t,union wl_argument,const struct wl_interface*, uint32_t);
|
||||
extern void (*wl_proxy_destroy_dylibloader_wrapper_wayland_client)(struct wl_proxy*);
|
||||
extern int (*wl_proxy_add_listener_dylibloader_wrapper_wayland_client)(struct wl_proxy*, void(**)(void), void*);
|
||||
extern const void* (*wl_proxy_get_listener_dylibloader_wrapper_wayland_client)(struct wl_proxy*);
|
||||
extern int (*wl_proxy_add_dispatcher_dylibloader_wrapper_wayland_client)(struct wl_proxy*, wl_dispatcher_func_t,const void*, void*);
|
||||
extern void (*wl_proxy_set_user_data_dylibloader_wrapper_wayland_client)(struct wl_proxy*, void*);
|
||||
extern void* (*wl_proxy_get_user_data_dylibloader_wrapper_wayland_client)(struct wl_proxy*);
|
||||
extern uint32_t (*wl_proxy_get_version_dylibloader_wrapper_wayland_client)(struct wl_proxy*);
|
||||
extern uint32_t (*wl_proxy_get_id_dylibloader_wrapper_wayland_client)(struct wl_proxy*);
|
||||
extern void (*wl_proxy_set_tag_dylibloader_wrapper_wayland_client)(struct wl_proxy*,const char**);
|
||||
extern const char** (*wl_proxy_get_tag_dylibloader_wrapper_wayland_client)(struct wl_proxy*);
|
||||
extern const char* (*wl_proxy_get_class_dylibloader_wrapper_wayland_client)(struct wl_proxy*);
|
||||
extern void (*wl_proxy_set_queue_dylibloader_wrapper_wayland_client)(struct wl_proxy*,struct wl_event_queue*);
|
||||
extern struct wl_display* (*wl_display_connect_dylibloader_wrapper_wayland_client)(const char*);
|
||||
extern struct wl_display* (*wl_display_connect_to_fd_dylibloader_wrapper_wayland_client)( int);
|
||||
extern void (*wl_display_disconnect_dylibloader_wrapper_wayland_client)(struct wl_display*);
|
||||
extern int (*wl_display_get_fd_dylibloader_wrapper_wayland_client)(struct wl_display*);
|
||||
extern int (*wl_display_dispatch_dylibloader_wrapper_wayland_client)(struct wl_display*);
|
||||
extern int (*wl_display_dispatch_queue_dylibloader_wrapper_wayland_client)(struct wl_display*,struct wl_event_queue*);
|
||||
extern int (*wl_display_dispatch_queue_pending_dylibloader_wrapper_wayland_client)(struct wl_display*,struct wl_event_queue*);
|
||||
extern int (*wl_display_dispatch_pending_dylibloader_wrapper_wayland_client)(struct wl_display*);
|
||||
extern int (*wl_display_get_error_dylibloader_wrapper_wayland_client)(struct wl_display*);
|
||||
extern uint32_t (*wl_display_get_protocol_error_dylibloader_wrapper_wayland_client)(struct wl_display*,const struct wl_interface**, uint32_t*);
|
||||
extern int (*wl_display_flush_dylibloader_wrapper_wayland_client)(struct wl_display*);
|
||||
extern int (*wl_display_roundtrip_queue_dylibloader_wrapper_wayland_client)(struct wl_display*,struct wl_event_queue*);
|
||||
extern int (*wl_display_roundtrip_dylibloader_wrapper_wayland_client)(struct wl_display*);
|
||||
extern struct wl_event_queue* (*wl_display_create_queue_dylibloader_wrapper_wayland_client)(struct wl_display*);
|
||||
extern int (*wl_display_prepare_read_queue_dylibloader_wrapper_wayland_client)(struct wl_display*,struct wl_event_queue*);
|
||||
extern int (*wl_display_prepare_read_dylibloader_wrapper_wayland_client)(struct wl_display*);
|
||||
extern void (*wl_display_cancel_read_dylibloader_wrapper_wayland_client)(struct wl_display*);
|
||||
extern int (*wl_display_read_events_dylibloader_wrapper_wayland_client)(struct wl_display*);
|
||||
extern void (*wl_log_set_handler_client_dylibloader_wrapper_wayland_client)( wl_log_func_t);
|
||||
int initialize_wayland_client(int verbose);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
@ -0,0 +1,89 @@
|
||||
// This file is generated. Do not edit!
|
||||
// see https://github.com/hpvb/dynload-wrapper for details
|
||||
// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-25 17:46:12
|
||||
// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/wayland/wayland-cursor.h --sys-include "./thirdparty/linuxbsd_headers/wayland/wayland-cursor.h" --soname libwayland-cursor.so.0 --init-name wayland_cursor --output-header platform/linuxbsd/wayland/dynwrappers/wayland-cursor-so_wrap.h --output-implementation platform/linuxbsd/wayland/dynwrappers/wayland-cursor-so_wrap.c
|
||||
//
|
||||
#include <stdint.h>
|
||||
|
||||
#define wl_cursor_theme_load wl_cursor_theme_load_dylibloader_orig_wayland_cursor
|
||||
#define wl_cursor_theme_destroy wl_cursor_theme_destroy_dylibloader_orig_wayland_cursor
|
||||
#define wl_cursor_theme_get_cursor wl_cursor_theme_get_cursor_dylibloader_orig_wayland_cursor
|
||||
#define wl_cursor_image_get_buffer wl_cursor_image_get_buffer_dylibloader_orig_wayland_cursor
|
||||
#define wl_cursor_frame wl_cursor_frame_dylibloader_orig_wayland_cursor
|
||||
#define wl_cursor_frame_and_duration wl_cursor_frame_and_duration_dylibloader_orig_wayland_cursor
|
||||
#include "./thirdparty/linuxbsd_headers/wayland/wayland-cursor.h"
|
||||
#undef wl_cursor_theme_load
|
||||
#undef wl_cursor_theme_destroy
|
||||
#undef wl_cursor_theme_get_cursor
|
||||
#undef wl_cursor_image_get_buffer
|
||||
#undef wl_cursor_frame
|
||||
#undef wl_cursor_frame_and_duration
|
||||
#include <dlfcn.h>
|
||||
#include <stdio.h>
|
||||
struct wl_cursor_theme* (*wl_cursor_theme_load_dylibloader_wrapper_wayland_cursor)(const char*, int,struct wl_shm*);
|
||||
void (*wl_cursor_theme_destroy_dylibloader_wrapper_wayland_cursor)(struct wl_cursor_theme*);
|
||||
struct wl_cursor* (*wl_cursor_theme_get_cursor_dylibloader_wrapper_wayland_cursor)(struct wl_cursor_theme*,const char*);
|
||||
struct wl_buffer* (*wl_cursor_image_get_buffer_dylibloader_wrapper_wayland_cursor)(struct wl_cursor_image*);
|
||||
int (*wl_cursor_frame_dylibloader_wrapper_wayland_cursor)(struct wl_cursor*, uint32_t);
|
||||
int (*wl_cursor_frame_and_duration_dylibloader_wrapper_wayland_cursor)(struct wl_cursor*, uint32_t, uint32_t*);
|
||||
int initialize_wayland_cursor(int verbose) {
|
||||
void *handle;
|
||||
char *error;
|
||||
handle = dlopen("libwayland-cursor.so.0", RTLD_LAZY);
|
||||
if (!handle) {
|
||||
if (verbose) {
|
||||
fprintf(stderr, "%s\n", dlerror());
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
dlerror();
|
||||
// wl_cursor_theme_load
|
||||
*(void **) (&wl_cursor_theme_load_dylibloader_wrapper_wayland_cursor) = dlsym(handle, "wl_cursor_theme_load");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_cursor_theme_destroy
|
||||
*(void **) (&wl_cursor_theme_destroy_dylibloader_wrapper_wayland_cursor) = dlsym(handle, "wl_cursor_theme_destroy");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_cursor_theme_get_cursor
|
||||
*(void **) (&wl_cursor_theme_get_cursor_dylibloader_wrapper_wayland_cursor) = dlsym(handle, "wl_cursor_theme_get_cursor");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_cursor_image_get_buffer
|
||||
*(void **) (&wl_cursor_image_get_buffer_dylibloader_wrapper_wayland_cursor) = dlsym(handle, "wl_cursor_image_get_buffer");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_cursor_frame
|
||||
*(void **) (&wl_cursor_frame_dylibloader_wrapper_wayland_cursor) = dlsym(handle, "wl_cursor_frame");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_cursor_frame_and_duration
|
||||
*(void **) (&wl_cursor_frame_and_duration_dylibloader_wrapper_wayland_cursor) = dlsym(handle, "wl_cursor_frame_and_duration");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -0,0 +1,42 @@
|
||||
#ifndef DYLIBLOAD_WRAPPER_WAYLAND_CURSOR
|
||||
#define DYLIBLOAD_WRAPPER_WAYLAND_CURSOR
|
||||
// This file is generated. Do not edit!
|
||||
// see https://github.com/hpvb/dynload-wrapper for details
|
||||
// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-25 17:46:12
|
||||
// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/wayland/wayland-cursor.h --sys-include "./thirdparty/linuxbsd_headers/wayland/wayland-cursor.h" --soname libwayland-cursor.so.0 --init-name wayland_cursor --output-header platform/linuxbsd/wayland/dynwrappers/wayland-cursor-so_wrap.h --output-implementation platform/linuxbsd/wayland/dynwrappers/wayland-cursor-so_wrap.c
|
||||
//
|
||||
#include <stdint.h>
|
||||
|
||||
#define wl_cursor_theme_load wl_cursor_theme_load_dylibloader_orig_wayland_cursor
|
||||
#define wl_cursor_theme_destroy wl_cursor_theme_destroy_dylibloader_orig_wayland_cursor
|
||||
#define wl_cursor_theme_get_cursor wl_cursor_theme_get_cursor_dylibloader_orig_wayland_cursor
|
||||
#define wl_cursor_image_get_buffer wl_cursor_image_get_buffer_dylibloader_orig_wayland_cursor
|
||||
#define wl_cursor_frame wl_cursor_frame_dylibloader_orig_wayland_cursor
|
||||
#define wl_cursor_frame_and_duration wl_cursor_frame_and_duration_dylibloader_orig_wayland_cursor
|
||||
#include "./thirdparty/linuxbsd_headers/wayland/wayland-cursor.h"
|
||||
#undef wl_cursor_theme_load
|
||||
#undef wl_cursor_theme_destroy
|
||||
#undef wl_cursor_theme_get_cursor
|
||||
#undef wl_cursor_image_get_buffer
|
||||
#undef wl_cursor_frame
|
||||
#undef wl_cursor_frame_and_duration
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#define wl_cursor_theme_load wl_cursor_theme_load_dylibloader_wrapper_wayland_cursor
|
||||
#define wl_cursor_theme_destroy wl_cursor_theme_destroy_dylibloader_wrapper_wayland_cursor
|
||||
#define wl_cursor_theme_get_cursor wl_cursor_theme_get_cursor_dylibloader_wrapper_wayland_cursor
|
||||
#define wl_cursor_image_get_buffer wl_cursor_image_get_buffer_dylibloader_wrapper_wayland_cursor
|
||||
#define wl_cursor_frame wl_cursor_frame_dylibloader_wrapper_wayland_cursor
|
||||
#define wl_cursor_frame_and_duration wl_cursor_frame_and_duration_dylibloader_wrapper_wayland_cursor
|
||||
extern struct wl_cursor_theme* (*wl_cursor_theme_load_dylibloader_wrapper_wayland_cursor)(const char*, int,struct wl_shm*);
|
||||
extern void (*wl_cursor_theme_destroy_dylibloader_wrapper_wayland_cursor)(struct wl_cursor_theme*);
|
||||
extern struct wl_cursor* (*wl_cursor_theme_get_cursor_dylibloader_wrapper_wayland_cursor)(struct wl_cursor_theme*,const char*);
|
||||
extern struct wl_buffer* (*wl_cursor_image_get_buffer_dylibloader_wrapper_wayland_cursor)(struct wl_cursor_image*);
|
||||
extern int (*wl_cursor_frame_dylibloader_wrapper_wayland_cursor)(struct wl_cursor*, uint32_t);
|
||||
extern int (*wl_cursor_frame_and_duration_dylibloader_wrapper_wayland_cursor)(struct wl_cursor*, uint32_t, uint32_t*);
|
||||
int initialize_wayland_cursor(int verbose);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
@ -0,0 +1,67 @@
|
||||
// This file is generated. Do not edit!
|
||||
// see https://github.com/hpvb/dynload-wrapper for details
|
||||
// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-25 17:49:37
|
||||
// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/wayland/wayland-egl-core.h --sys-include "./thirdparty/linuxbsd_headers/wayland/wayland-egl-core.h" --soname libwayland-egl.so.1 --init-name wayland_egl --output-header platform/linuxbsd/wayland/dynwrappers/wayland-egl-core-so_wrap.h --output-implementation platform/linuxbsd/wayland/dynwrappers/wayland-egl-core-so_wrap.c
|
||||
//
|
||||
#include <stdint.h>
|
||||
|
||||
#define wl_egl_window_create wl_egl_window_create_dylibloader_orig_wayland_egl
|
||||
#define wl_egl_window_destroy wl_egl_window_destroy_dylibloader_orig_wayland_egl
|
||||
#define wl_egl_window_resize wl_egl_window_resize_dylibloader_orig_wayland_egl
|
||||
#define wl_egl_window_get_attached_size wl_egl_window_get_attached_size_dylibloader_orig_wayland_egl
|
||||
#include "./thirdparty/linuxbsd_headers/wayland/wayland-egl-core.h"
|
||||
#undef wl_egl_window_create
|
||||
#undef wl_egl_window_destroy
|
||||
#undef wl_egl_window_resize
|
||||
#undef wl_egl_window_get_attached_size
|
||||
#include <dlfcn.h>
|
||||
#include <stdio.h>
|
||||
struct wl_egl_window* (*wl_egl_window_create_dylibloader_wrapper_wayland_egl)(struct wl_surface*, int, int);
|
||||
void (*wl_egl_window_destroy_dylibloader_wrapper_wayland_egl)(struct wl_egl_window*);
|
||||
void (*wl_egl_window_resize_dylibloader_wrapper_wayland_egl)(struct wl_egl_window*, int, int, int, int);
|
||||
void (*wl_egl_window_get_attached_size_dylibloader_wrapper_wayland_egl)(struct wl_egl_window*, int*, int*);
|
||||
int initialize_wayland_egl(int verbose) {
|
||||
void *handle;
|
||||
char *error;
|
||||
handle = dlopen("libwayland-egl.so.1", RTLD_LAZY);
|
||||
if (!handle) {
|
||||
if (verbose) {
|
||||
fprintf(stderr, "%s\n", dlerror());
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
dlerror();
|
||||
// wl_egl_window_create
|
||||
*(void **) (&wl_egl_window_create_dylibloader_wrapper_wayland_egl) = dlsym(handle, "wl_egl_window_create");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_egl_window_destroy
|
||||
*(void **) (&wl_egl_window_destroy_dylibloader_wrapper_wayland_egl) = dlsym(handle, "wl_egl_window_destroy");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_egl_window_resize
|
||||
*(void **) (&wl_egl_window_resize_dylibloader_wrapper_wayland_egl) = dlsym(handle, "wl_egl_window_resize");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
// wl_egl_window_get_attached_size
|
||||
*(void **) (&wl_egl_window_get_attached_size_dylibloader_wrapper_wayland_egl) = dlsym(handle, "wl_egl_window_get_attached_size");
|
||||
if (verbose) {
|
||||
error = dlerror();
|
||||
if (error != NULL) {
|
||||
fprintf(stderr, "%s\n", error);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -0,0 +1,34 @@
|
||||
#ifndef DYLIBLOAD_WRAPPER_WAYLAND_EGL
|
||||
#define DYLIBLOAD_WRAPPER_WAYLAND_EGL
|
||||
// This file is generated. Do not edit!
|
||||
// see https://github.com/hpvb/dynload-wrapper for details
|
||||
// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-25 17:49:37
|
||||
// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/wayland/wayland-egl-core.h --sys-include "./thirdparty/linuxbsd_headers/wayland/wayland-egl-core.h" --soname libwayland-egl.so.1 --init-name wayland_egl --output-header platform/linuxbsd/wayland/dynwrappers/wayland-egl-core-so_wrap.h --output-implementation platform/linuxbsd/wayland/dynwrappers/wayland-egl-core-so_wrap.c
|
||||
//
|
||||
#include <stdint.h>
|
||||
|
||||
#define wl_egl_window_create wl_egl_window_create_dylibloader_orig_wayland_egl
|
||||
#define wl_egl_window_destroy wl_egl_window_destroy_dylibloader_orig_wayland_egl
|
||||
#define wl_egl_window_resize wl_egl_window_resize_dylibloader_orig_wayland_egl
|
||||
#define wl_egl_window_get_attached_size wl_egl_window_get_attached_size_dylibloader_orig_wayland_egl
|
||||
#include "./thirdparty/linuxbsd_headers/wayland/wayland-egl-core.h"
|
||||
#undef wl_egl_window_create
|
||||
#undef wl_egl_window_destroy
|
||||
#undef wl_egl_window_resize
|
||||
#undef wl_egl_window_get_attached_size
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#define wl_egl_window_create wl_egl_window_create_dylibloader_wrapper_wayland_egl
|
||||
#define wl_egl_window_destroy wl_egl_window_destroy_dylibloader_wrapper_wayland_egl
|
||||
#define wl_egl_window_resize wl_egl_window_resize_dylibloader_wrapper_wayland_egl
|
||||
#define wl_egl_window_get_attached_size wl_egl_window_get_attached_size_dylibloader_wrapper_wayland_egl
|
||||
extern struct wl_egl_window* (*wl_egl_window_create_dylibloader_wrapper_wayland_egl)(struct wl_surface*, int, int);
|
||||
extern void (*wl_egl_window_destroy_dylibloader_wrapper_wayland_egl)(struct wl_egl_window*);
|
||||
extern void (*wl_egl_window_resize_dylibloader_wrapper_wayland_egl)(struct wl_egl_window*, int, int, int, int);
|
||||
extern void (*wl_egl_window_get_attached_size_dylibloader_wrapper_wayland_egl)(struct wl_egl_window*, int*, int*);
|
||||
int initialize_wayland_egl(int verbose);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
@ -0,0 +1,66 @@
|
||||
/**************************************************************************/
|
||||
/* egl_manager_wayland.cpp */
|
||||
/**************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/**************************************************************************/
|
||||
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
|
||||
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/**************************************************************************/
|
||||
|
||||
#include "egl_manager_wayland.h"
|
||||
|
||||
#ifdef WAYLAND_ENABLED
|
||||
#ifdef EGL_ENABLED
|
||||
#ifdef GLES3_ENABLED
|
||||
|
||||
const char *EGLManagerWayland::_get_platform_extension_name() const {
|
||||
return "EGL_KHR_platform_wayland";
|
||||
}
|
||||
|
||||
EGLenum EGLManagerWayland::_get_platform_extension_enum() const {
|
||||
return EGL_PLATFORM_WAYLAND_KHR;
|
||||
}
|
||||
|
||||
EGLenum EGLManagerWayland::_get_platform_api_enum() const {
|
||||
return EGL_OPENGL_API;
|
||||
}
|
||||
|
||||
Vector<EGLAttrib> EGLManagerWayland::_get_platform_display_attributes() const {
|
||||
return Vector<EGLAttrib>();
|
||||
}
|
||||
|
||||
Vector<EGLint> EGLManagerWayland::_get_platform_context_attribs() const {
|
||||
Vector<EGLint> ret;
|
||||
ret.push_back(EGL_CONTEXT_MAJOR_VERSION);
|
||||
ret.push_back(3);
|
||||
ret.push_back(EGL_CONTEXT_MINOR_VERSION);
|
||||
ret.push_back(3);
|
||||
ret.push_back(EGL_NONE);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif // GLES3_ENABLED
|
||||
#endif // EGL_ENABLED
|
||||
#endif // WAYLAND_ENABLED
|
||||
@ -0,0 +1,53 @@
|
||||
/**************************************************************************/
|
||||
/* egl_manager_wayland.h */
|
||||
/**************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/**************************************************************************/
|
||||
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
|
||||
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/**************************************************************************/
|
||||
|
||||
#ifndef EGL_MANAGER_WAYLAND_H
|
||||
#define EGL_MANAGER_WAYLAND_H
|
||||
|
||||
#ifdef WAYLAND_ENABLED
|
||||
#ifdef EGL_ENABLED
|
||||
#ifdef GLES3_ENABLED
|
||||
|
||||
#include "drivers/egl/egl_manager.h"
|
||||
|
||||
class EGLManagerWayland : public EGLManager {
|
||||
public:
|
||||
virtual const char *_get_platform_extension_name() const override;
|
||||
virtual EGLenum _get_platform_extension_enum() const override;
|
||||
virtual EGLenum _get_platform_api_enum() const override;
|
||||
virtual Vector<EGLAttrib> _get_platform_display_attributes() const override;
|
||||
virtual Vector<EGLint> _get_platform_context_attribs() const override;
|
||||
};
|
||||
|
||||
#endif // GLES3_ENABLED
|
||||
#endif // EGL_ENABLED
|
||||
#endif // WAYLAND_ENABLED
|
||||
|
||||
#endif // EGL_MANAGER_WAYLAND_H
|
||||
@ -0,0 +1,411 @@
|
||||
/**************************************************************************/
|
||||
/* key_mapping_xkb.cpp */
|
||||
/**************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/**************************************************************************/
|
||||
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
|
||||
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/**************************************************************************/
|
||||
|
||||
#include "key_mapping_xkb.h"
|
||||
|
||||
void KeyMappingXKB::initialize() {
|
||||
// XKB keycode to Godot Key map.
|
||||
|
||||
xkb_keycode_map[XKB_KEY_Escape] = Key::ESCAPE;
|
||||
xkb_keycode_map[XKB_KEY_Tab] = Key::TAB;
|
||||
xkb_keycode_map[XKB_KEY_ISO_Left_Tab] = Key::BACKTAB;
|
||||
xkb_keycode_map[XKB_KEY_BackSpace] = Key::BACKSPACE;
|
||||
xkb_keycode_map[XKB_KEY_Return] = Key::ENTER;
|
||||
xkb_keycode_map[XKB_KEY_Insert] = Key::INSERT;
|
||||
xkb_keycode_map[XKB_KEY_Delete] = Key::KEY_DELETE;
|
||||
xkb_keycode_map[XKB_KEY_Clear] = Key::KEY_DELETE;
|
||||
xkb_keycode_map[XKB_KEY_Pause] = Key::PAUSE;
|
||||
xkb_keycode_map[XKB_KEY_Print] = Key::PRINT;
|
||||
xkb_keycode_map[XKB_KEY_Home] = Key::HOME;
|
||||
xkb_keycode_map[XKB_KEY_End] = Key::END;
|
||||
xkb_keycode_map[XKB_KEY_Left] = Key::LEFT;
|
||||
xkb_keycode_map[XKB_KEY_Up] = Key::UP;
|
||||
xkb_keycode_map[XKB_KEY_Right] = Key::RIGHT;
|
||||
xkb_keycode_map[XKB_KEY_Down] = Key::DOWN;
|
||||
xkb_keycode_map[XKB_KEY_Prior] = Key::PAGEUP;
|
||||
xkb_keycode_map[XKB_KEY_Next] = Key::PAGEDOWN;
|
||||
xkb_keycode_map[XKB_KEY_Shift_L] = Key::SHIFT;
|
||||
xkb_keycode_map[XKB_KEY_Shift_R] = Key::SHIFT;
|
||||
xkb_keycode_map[XKB_KEY_Shift_Lock] = Key::SHIFT;
|
||||
xkb_keycode_map[XKB_KEY_Control_L] = Key::CTRL;
|
||||
xkb_keycode_map[XKB_KEY_Control_R] = Key::CTRL;
|
||||
xkb_keycode_map[XKB_KEY_Meta_L] = Key::META;
|
||||
xkb_keycode_map[XKB_KEY_Meta_R] = Key::META;
|
||||
xkb_keycode_map[XKB_KEY_Alt_L] = Key::ALT;
|
||||
xkb_keycode_map[XKB_KEY_Alt_R] = Key::ALT;
|
||||
xkb_keycode_map[XKB_KEY_Caps_Lock] = Key::CAPSLOCK;
|
||||
xkb_keycode_map[XKB_KEY_Num_Lock] = Key::NUMLOCK;
|
||||
xkb_keycode_map[XKB_KEY_Scroll_Lock] = Key::SCROLLLOCK;
|
||||
xkb_keycode_map[XKB_KEY_less] = Key::QUOTELEFT;
|
||||
xkb_keycode_map[XKB_KEY_grave] = Key::SECTION;
|
||||
xkb_keycode_map[XKB_KEY_Super_L] = Key::META;
|
||||
xkb_keycode_map[XKB_KEY_Super_R] = Key::META;
|
||||
xkb_keycode_map[XKB_KEY_Menu] = Key::MENU;
|
||||
xkb_keycode_map[XKB_KEY_Hyper_L] = Key::HYPER;
|
||||
xkb_keycode_map[XKB_KEY_Hyper_R] = Key::HYPER;
|
||||
xkb_keycode_map[XKB_KEY_Help] = Key::HELP;
|
||||
xkb_keycode_map[XKB_KEY_KP_Space] = Key::SPACE;
|
||||
xkb_keycode_map[XKB_KEY_KP_Tab] = Key::TAB;
|
||||
xkb_keycode_map[XKB_KEY_KP_Enter] = Key::KP_ENTER;
|
||||
xkb_keycode_map[XKB_KEY_Home] = Key::HOME;
|
||||
xkb_keycode_map[XKB_KEY_Left] = Key::LEFT;
|
||||
xkb_keycode_map[XKB_KEY_Up] = Key::UP;
|
||||
xkb_keycode_map[XKB_KEY_Right] = Key::RIGHT;
|
||||
xkb_keycode_map[XKB_KEY_Down] = Key::DOWN;
|
||||
xkb_keycode_map[XKB_KEY_Prior] = Key::PAGEUP;
|
||||
xkb_keycode_map[XKB_KEY_Next] = Key::PAGEDOWN;
|
||||
xkb_keycode_map[XKB_KEY_End] = Key::END;
|
||||
xkb_keycode_map[XKB_KEY_Begin] = Key::CLEAR;
|
||||
xkb_keycode_map[XKB_KEY_Insert] = Key::INSERT;
|
||||
xkb_keycode_map[XKB_KEY_Delete] = Key::KEY_DELETE;
|
||||
xkb_keycode_map[XKB_KEY_KP_Equal] = Key::EQUAL;
|
||||
xkb_keycode_map[XKB_KEY_KP_Separator] = Key::COMMA;
|
||||
xkb_keycode_map[XKB_KEY_KP_Decimal] = Key::KP_PERIOD;
|
||||
xkb_keycode_map[XKB_KEY_KP_Multiply] = Key::KP_MULTIPLY;
|
||||
xkb_keycode_map[XKB_KEY_KP_Divide] = Key::KP_DIVIDE;
|
||||
xkb_keycode_map[XKB_KEY_KP_Subtract] = Key::KP_SUBTRACT;
|
||||
xkb_keycode_map[XKB_KEY_KP_Add] = Key::KP_ADD;
|
||||
xkb_keycode_map[XKB_KEY_KP_0] = Key::KP_0;
|
||||
xkb_keycode_map[XKB_KEY_KP_1] = Key::KP_1;
|
||||
xkb_keycode_map[XKB_KEY_KP_2] = Key::KP_2;
|
||||
xkb_keycode_map[XKB_KEY_KP_3] = Key::KP_3;
|
||||
xkb_keycode_map[XKB_KEY_KP_4] = Key::KP_4;
|
||||
xkb_keycode_map[XKB_KEY_KP_5] = Key::KP_5;
|
||||
xkb_keycode_map[XKB_KEY_KP_6] = Key::KP_6;
|
||||
xkb_keycode_map[XKB_KEY_KP_7] = Key::KP_7;
|
||||
xkb_keycode_map[XKB_KEY_KP_8] = Key::KP_8;
|
||||
xkb_keycode_map[XKB_KEY_KP_9] = Key::KP_9;
|
||||
// Same keys but with numlock off.
|
||||
xkb_keycode_map[XKB_KEY_KP_Insert] = Key::INSERT;
|
||||
xkb_keycode_map[XKB_KEY_KP_Delete] = Key::KEY_DELETE;
|
||||
xkb_keycode_map[XKB_KEY_KP_End] = Key::END;
|
||||
xkb_keycode_map[XKB_KEY_KP_Down] = Key::DOWN;
|
||||
xkb_keycode_map[XKB_KEY_KP_Page_Down] = Key::PAGEDOWN;
|
||||
xkb_keycode_map[XKB_KEY_KP_Left] = Key::LEFT;
|
||||
// X11 documents this (numpad 5) as "begin of line" but no toolkit seems to interpret it this way.
|
||||
// On Windows this is emitting Key::Clear so for consistency it will be mapped to Key::Clear
|
||||
xkb_keycode_map[XKB_KEY_KP_Begin] = Key::CLEAR;
|
||||
xkb_keycode_map[XKB_KEY_KP_Right] = Key::RIGHT;
|
||||
xkb_keycode_map[XKB_KEY_KP_Home] = Key::HOME;
|
||||
xkb_keycode_map[XKB_KEY_KP_Up] = Key::UP;
|
||||
xkb_keycode_map[XKB_KEY_KP_Page_Up] = Key::PAGEUP;
|
||||
xkb_keycode_map[XKB_KEY_F1] = Key::F1;
|
||||
xkb_keycode_map[XKB_KEY_F2] = Key::F2;
|
||||
xkb_keycode_map[XKB_KEY_F3] = Key::F3;
|
||||
xkb_keycode_map[XKB_KEY_F4] = Key::F4;
|
||||
xkb_keycode_map[XKB_KEY_F5] = Key::F5;
|
||||
xkb_keycode_map[XKB_KEY_F6] = Key::F6;
|
||||
xkb_keycode_map[XKB_KEY_F7] = Key::F7;
|
||||
xkb_keycode_map[XKB_KEY_F8] = Key::F8;
|
||||
xkb_keycode_map[XKB_KEY_F9] = Key::F9;
|
||||
xkb_keycode_map[XKB_KEY_F10] = Key::F10;
|
||||
xkb_keycode_map[XKB_KEY_F11] = Key::F11;
|
||||
xkb_keycode_map[XKB_KEY_F12] = Key::F12;
|
||||
xkb_keycode_map[XKB_KEY_F13] = Key::F13;
|
||||
xkb_keycode_map[XKB_KEY_F14] = Key::F14;
|
||||
xkb_keycode_map[XKB_KEY_F15] = Key::F15;
|
||||
xkb_keycode_map[XKB_KEY_F16] = Key::F16;
|
||||
xkb_keycode_map[XKB_KEY_F17] = Key::F17;
|
||||
xkb_keycode_map[XKB_KEY_F18] = Key::F18;
|
||||
xkb_keycode_map[XKB_KEY_F19] = Key::F19;
|
||||
xkb_keycode_map[XKB_KEY_F20] = Key::F20;
|
||||
xkb_keycode_map[XKB_KEY_F21] = Key::F21;
|
||||
xkb_keycode_map[XKB_KEY_F22] = Key::F22;
|
||||
xkb_keycode_map[XKB_KEY_F23] = Key::F23;
|
||||
xkb_keycode_map[XKB_KEY_F24] = Key::F24;
|
||||
xkb_keycode_map[XKB_KEY_F25] = Key::F25;
|
||||
xkb_keycode_map[XKB_KEY_F26] = Key::F26;
|
||||
xkb_keycode_map[XKB_KEY_F27] = Key::F27;
|
||||
xkb_keycode_map[XKB_KEY_F28] = Key::F28;
|
||||
xkb_keycode_map[XKB_KEY_F29] = Key::F29;
|
||||
xkb_keycode_map[XKB_KEY_F30] = Key::F30;
|
||||
xkb_keycode_map[XKB_KEY_F31] = Key::F31;
|
||||
xkb_keycode_map[XKB_KEY_F32] = Key::F32;
|
||||
xkb_keycode_map[XKB_KEY_F33] = Key::F33;
|
||||
xkb_keycode_map[XKB_KEY_F34] = Key::F34;
|
||||
xkb_keycode_map[XKB_KEY_F35] = Key::F35;
|
||||
xkb_keycode_map[XKB_KEY_yen] = Key::YEN;
|
||||
xkb_keycode_map[XKB_KEY_section] = Key::SECTION;
|
||||
// Media keys.
|
||||
xkb_keycode_map[XKB_KEY_XF86Back] = Key::BACK;
|
||||
xkb_keycode_map[XKB_KEY_XF86Forward] = Key::FORWARD;
|
||||
xkb_keycode_map[XKB_KEY_XF86Stop] = Key::STOP;
|
||||
xkb_keycode_map[XKB_KEY_XF86Refresh] = Key::REFRESH;
|
||||
xkb_keycode_map[XKB_KEY_XF86Favorites] = Key::FAVORITES;
|
||||
xkb_keycode_map[XKB_KEY_XF86OpenURL] = Key::OPENURL;
|
||||
xkb_keycode_map[XKB_KEY_XF86HomePage] = Key::HOMEPAGE;
|
||||
xkb_keycode_map[XKB_KEY_XF86Search] = Key::SEARCH;
|
||||
xkb_keycode_map[XKB_KEY_XF86AudioLowerVolume] = Key::VOLUMEDOWN;
|
||||
xkb_keycode_map[XKB_KEY_XF86AudioMute] = Key::VOLUMEMUTE;
|
||||
xkb_keycode_map[XKB_KEY_XF86AudioRaiseVolume] = Key::VOLUMEUP;
|
||||
xkb_keycode_map[XKB_KEY_XF86AudioPlay] = Key::MEDIAPLAY;
|
||||
xkb_keycode_map[XKB_KEY_XF86AudioStop] = Key::MEDIASTOP;
|
||||
xkb_keycode_map[XKB_KEY_XF86AudioPrev] = Key::MEDIAPREVIOUS;
|
||||
xkb_keycode_map[XKB_KEY_XF86AudioNext] = Key::MEDIANEXT;
|
||||
xkb_keycode_map[XKB_KEY_XF86AudioRecord] = Key::MEDIARECORD;
|
||||
xkb_keycode_map[XKB_KEY_XF86Standby] = Key::STANDBY;
|
||||
// Launch keys.
|
||||
xkb_keycode_map[XKB_KEY_XF86Mail] = Key::LAUNCHMAIL;
|
||||
xkb_keycode_map[XKB_KEY_XF86AudioMedia] = Key::LAUNCHMEDIA;
|
||||
xkb_keycode_map[XKB_KEY_XF86MyComputer] = Key::LAUNCH0;
|
||||
xkb_keycode_map[XKB_KEY_XF86Calculator] = Key::LAUNCH1;
|
||||
xkb_keycode_map[XKB_KEY_XF86Launch0] = Key::LAUNCH2;
|
||||
xkb_keycode_map[XKB_KEY_XF86Launch1] = Key::LAUNCH3;
|
||||
xkb_keycode_map[XKB_KEY_XF86Launch2] = Key::LAUNCH4;
|
||||
xkb_keycode_map[XKB_KEY_XF86Launch3] = Key::LAUNCH5;
|
||||
xkb_keycode_map[XKB_KEY_XF86Launch4] = Key::LAUNCH6;
|
||||
xkb_keycode_map[XKB_KEY_XF86Launch5] = Key::LAUNCH7;
|
||||
xkb_keycode_map[XKB_KEY_XF86Launch6] = Key::LAUNCH8;
|
||||
xkb_keycode_map[XKB_KEY_XF86Launch7] = Key::LAUNCH9;
|
||||
xkb_keycode_map[XKB_KEY_XF86Launch8] = Key::LAUNCHA;
|
||||
xkb_keycode_map[XKB_KEY_XF86Launch9] = Key::LAUNCHB;
|
||||
xkb_keycode_map[XKB_KEY_XF86LaunchA] = Key::LAUNCHC;
|
||||
xkb_keycode_map[XKB_KEY_XF86LaunchB] = Key::LAUNCHD;
|
||||
xkb_keycode_map[XKB_KEY_XF86LaunchC] = Key::LAUNCHE;
|
||||
xkb_keycode_map[XKB_KEY_XF86LaunchD] = Key::LAUNCHF;
|
||||
|
||||
// Scancode to Godot Key map.
|
||||
scancode_map[0x09] = Key::ESCAPE;
|
||||
scancode_map[0x0A] = Key::KEY_1;
|
||||
scancode_map[0x0B] = Key::KEY_2;
|
||||
scancode_map[0x0C] = Key::KEY_3;
|
||||
scancode_map[0x0D] = Key::KEY_4;
|
||||
scancode_map[0x0E] = Key::KEY_5;
|
||||
scancode_map[0x0F] = Key::KEY_6;
|
||||
scancode_map[0x10] = Key::KEY_7;
|
||||
scancode_map[0x11] = Key::KEY_8;
|
||||
scancode_map[0x12] = Key::KEY_9;
|
||||
scancode_map[0x13] = Key::KEY_0;
|
||||
scancode_map[0x14] = Key::MINUS;
|
||||
scancode_map[0x15] = Key::EQUAL;
|
||||
scancode_map[0x16] = Key::BACKSPACE;
|
||||
scancode_map[0x17] = Key::TAB;
|
||||
scancode_map[0x18] = Key::Q;
|
||||
scancode_map[0x19] = Key::W;
|
||||
scancode_map[0x1A] = Key::E;
|
||||
scancode_map[0x1B] = Key::R;
|
||||
scancode_map[0x1C] = Key::T;
|
||||
scancode_map[0x1D] = Key::Y;
|
||||
scancode_map[0x1E] = Key::U;
|
||||
scancode_map[0x1F] = Key::I;
|
||||
scancode_map[0x20] = Key::O;
|
||||
scancode_map[0x21] = Key::P;
|
||||
scancode_map[0x22] = Key::BRACELEFT;
|
||||
scancode_map[0x23] = Key::BRACERIGHT;
|
||||
scancode_map[0x24] = Key::ENTER;
|
||||
scancode_map[0x25] = Key::CTRL; // Left
|
||||
scancode_map[0x26] = Key::A;
|
||||
scancode_map[0x27] = Key::S;
|
||||
scancode_map[0x28] = Key::D;
|
||||
scancode_map[0x29] = Key::F;
|
||||
scancode_map[0x2A] = Key::G;
|
||||
scancode_map[0x2B] = Key::H;
|
||||
scancode_map[0x2C] = Key::J;
|
||||
scancode_map[0x2D] = Key::K;
|
||||
scancode_map[0x2E] = Key::L;
|
||||
scancode_map[0x2F] = Key::SEMICOLON;
|
||||
scancode_map[0x30] = Key::APOSTROPHE;
|
||||
scancode_map[0x31] = Key::SECTION;
|
||||
scancode_map[0x32] = Key::SHIFT; // Left
|
||||
scancode_map[0x33] = Key::BACKSLASH;
|
||||
scancode_map[0x34] = Key::Z;
|
||||
scancode_map[0x35] = Key::X;
|
||||
scancode_map[0x36] = Key::C;
|
||||
scancode_map[0x37] = Key::V;
|
||||
scancode_map[0x38] = Key::B;
|
||||
scancode_map[0x39] = Key::N;
|
||||
scancode_map[0x3A] = Key::M;
|
||||
scancode_map[0x3B] = Key::COMMA;
|
||||
scancode_map[0x3C] = Key::PERIOD;
|
||||
scancode_map[0x3D] = Key::SLASH;
|
||||
scancode_map[0x3E] = Key::SHIFT; // Right
|
||||
scancode_map[0x3F] = Key::KP_MULTIPLY;
|
||||
scancode_map[0x40] = Key::ALT; // Left
|
||||
scancode_map[0x41] = Key::SPACE;
|
||||
scancode_map[0x42] = Key::CAPSLOCK;
|
||||
scancode_map[0x43] = Key::F1;
|
||||
scancode_map[0x44] = Key::F2;
|
||||
scancode_map[0x45] = Key::F3;
|
||||
scancode_map[0x46] = Key::F4;
|
||||
scancode_map[0x47] = Key::F5;
|
||||
scancode_map[0x48] = Key::F6;
|
||||
scancode_map[0x49] = Key::F7;
|
||||
scancode_map[0x4A] = Key::F8;
|
||||
scancode_map[0x4B] = Key::F9;
|
||||
scancode_map[0x4C] = Key::F10;
|
||||
scancode_map[0x4D] = Key::NUMLOCK;
|
||||
scancode_map[0x4E] = Key::SCROLLLOCK;
|
||||
scancode_map[0x4F] = Key::KP_7;
|
||||
scancode_map[0x50] = Key::KP_8;
|
||||
scancode_map[0x51] = Key::KP_9;
|
||||
scancode_map[0x52] = Key::KP_SUBTRACT;
|
||||
scancode_map[0x53] = Key::KP_4;
|
||||
scancode_map[0x54] = Key::KP_5;
|
||||
scancode_map[0x55] = Key::KP_6;
|
||||
scancode_map[0x56] = Key::KP_ADD;
|
||||
scancode_map[0x57] = Key::KP_1;
|
||||
scancode_map[0x58] = Key::KP_2;
|
||||
scancode_map[0x59] = Key::KP_3;
|
||||
scancode_map[0x5A] = Key::KP_0;
|
||||
scancode_map[0x5B] = Key::KP_PERIOD;
|
||||
//scancode_map[0x5C]
|
||||
//scancode_map[0x5D] // Zenkaku Hankaku
|
||||
scancode_map[0x5E] = Key::QUOTELEFT;
|
||||
scancode_map[0x5F] = Key::F11;
|
||||
scancode_map[0x60] = Key::F12;
|
||||
//scancode_map[0x61] // Romaji
|
||||
//scancode_map[0x62] // Katakana
|
||||
//scancode_map[0x63] // Hiragana
|
||||
//scancode_map[0x64] // Henkan
|
||||
//scancode_map[0x65] // Hiragana Katakana
|
||||
//scancode_map[0x66] // Muhenkan
|
||||
scancode_map[0x67] = Key::COMMA; // KP_Separator
|
||||
scancode_map[0x68] = Key::KP_ENTER;
|
||||
scancode_map[0x69] = Key::CTRL; // Right
|
||||
scancode_map[0x6A] = Key::KP_DIVIDE;
|
||||
scancode_map[0x6B] = Key::PRINT;
|
||||
scancode_map[0x6C] = Key::ALT; // Right
|
||||
scancode_map[0x6D] = Key::ENTER;
|
||||
scancode_map[0x6E] = Key::HOME;
|
||||
scancode_map[0x6F] = Key::UP;
|
||||
scancode_map[0x70] = Key::PAGEUP;
|
||||
scancode_map[0x71] = Key::LEFT;
|
||||
scancode_map[0x72] = Key::RIGHT;
|
||||
scancode_map[0x73] = Key::END;
|
||||
scancode_map[0x74] = Key::DOWN;
|
||||
scancode_map[0x75] = Key::PAGEDOWN;
|
||||
scancode_map[0x76] = Key::INSERT;
|
||||
scancode_map[0x77] = Key::KEY_DELETE;
|
||||
//scancode_map[0x78] // Macro
|
||||
scancode_map[0x79] = Key::VOLUMEMUTE;
|
||||
scancode_map[0x7A] = Key::VOLUMEDOWN;
|
||||
scancode_map[0x7B] = Key::VOLUMEUP;
|
||||
//scancode_map[0x7C] // Power
|
||||
scancode_map[0x7D] = Key::EQUAL; // KP_Equal
|
||||
//scancode_map[0x7E] // KP_PlusMinus
|
||||
scancode_map[0x7F] = Key::PAUSE;
|
||||
scancode_map[0x80] = Key::LAUNCH0;
|
||||
scancode_map[0x81] = Key::COMMA; // KP_Comma
|
||||
//scancode_map[0x82] // Hangul
|
||||
//scancode_map[0x83] // Hangul_Hanja
|
||||
scancode_map[0x84] = Key::YEN;
|
||||
scancode_map[0x85] = Key::META; // Left
|
||||
scancode_map[0x86] = Key::META; // Right
|
||||
scancode_map[0x87] = Key::MENU;
|
||||
|
||||
scancode_map[0xA6] = Key::BACK; // On Chromebooks
|
||||
scancode_map[0xA7] = Key::FORWARD; // On Chromebooks
|
||||
|
||||
scancode_map[0xB5] = Key::REFRESH; // On Chromebooks
|
||||
|
||||
scancode_map[0xBF] = Key::F13;
|
||||
scancode_map[0xC0] = Key::F14;
|
||||
scancode_map[0xC1] = Key::F15;
|
||||
scancode_map[0xC2] = Key::F16;
|
||||
scancode_map[0xC3] = Key::F17;
|
||||
scancode_map[0xC4] = Key::F18;
|
||||
scancode_map[0xC5] = Key::F19;
|
||||
scancode_map[0xC6] = Key::F20;
|
||||
scancode_map[0xC7] = Key::F21;
|
||||
scancode_map[0xC8] = Key::F22;
|
||||
scancode_map[0xC9] = Key::F23;
|
||||
scancode_map[0xCA] = Key::F24;
|
||||
scancode_map[0xCB] = Key::F25;
|
||||
scancode_map[0xCC] = Key::F26;
|
||||
scancode_map[0xCD] = Key::F27;
|
||||
scancode_map[0xCE] = Key::F28;
|
||||
scancode_map[0xCF] = Key::F29;
|
||||
scancode_map[0xD0] = Key::F30;
|
||||
scancode_map[0xD1] = Key::F31;
|
||||
scancode_map[0xD2] = Key::F32;
|
||||
scancode_map[0xD3] = Key::F33;
|
||||
scancode_map[0xD4] = Key::F34;
|
||||
scancode_map[0xD5] = Key::F35;
|
||||
|
||||
// Godot to scancode map.
|
||||
for (const KeyValue<unsigned int, Key> &E : scancode_map) {
|
||||
scancode_map_inv[E.value] = E.key;
|
||||
}
|
||||
|
||||
// Scancode to physical location map.
|
||||
// Ctrl.
|
||||
location_map[0x25] = KeyLocation::LEFT;
|
||||
location_map[0x69] = KeyLocation::RIGHT;
|
||||
// Shift.
|
||||
location_map[0x32] = KeyLocation::LEFT;
|
||||
location_map[0x3E] = KeyLocation::RIGHT;
|
||||
// Alt.
|
||||
location_map[0x40] = KeyLocation::LEFT;
|
||||
location_map[0x6C] = KeyLocation::RIGHT;
|
||||
// Meta.
|
||||
location_map[0x85] = KeyLocation::LEFT;
|
||||
location_map[0x86] = KeyLocation::RIGHT;
|
||||
}
|
||||
|
||||
Key KeyMappingXKB::get_keycode(xkb_keycode_t p_keysym) {
|
||||
if (p_keysym >= 0x20 && p_keysym < 0x7E) { // ASCII, maps 1-1
|
||||
if (p_keysym > 0x60 && p_keysym < 0x7B) { // Lowercase ASCII.
|
||||
return (Key)(p_keysym - 32);
|
||||
} else {
|
||||
return (Key)p_keysym;
|
||||
}
|
||||
}
|
||||
|
||||
const Key *key = xkb_keycode_map.getptr(p_keysym);
|
||||
if (key) {
|
||||
return *key;
|
||||
}
|
||||
return Key::NONE;
|
||||
}
|
||||
|
||||
Key KeyMappingXKB::get_scancode(unsigned int p_code) {
|
||||
const Key *key = scancode_map.getptr(p_code);
|
||||
if (key) {
|
||||
return *key;
|
||||
}
|
||||
|
||||
return Key::NONE;
|
||||
}
|
||||
|
||||
xkb_keycode_t KeyMappingXKB::get_xkb_keycode(Key p_key) {
|
||||
const unsigned int *key = scancode_map_inv.getptr(p_key);
|
||||
if (key) {
|
||||
return *key;
|
||||
}
|
||||
return 0x00;
|
||||
}
|
||||
|
||||
KeyLocation KeyMappingXKB::get_location(unsigned int p_code) {
|
||||
const KeyLocation *location = location_map.getptr(p_code);
|
||||
if (location) {
|
||||
return *location;
|
||||
}
|
||||
return KeyLocation::UNSPECIFIED;
|
||||
}
|
||||
@ -0,0 +1,65 @@
|
||||
/**************************************************************************/
|
||||
/* key_mapping_xkb.h */
|
||||
/**************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/**************************************************************************/
|
||||
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
|
||||
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/**************************************************************************/
|
||||
|
||||
#ifndef KEY_MAPPING_XKB_H
|
||||
#define KEY_MAPPING_XKB_H
|
||||
|
||||
#include "core/os/keyboard.h"
|
||||
#include "core/templates/hash_map.h"
|
||||
|
||||
#ifdef SOWRAP_ENABLED
|
||||
#include "xkbcommon-so_wrap.h"
|
||||
#else
|
||||
#include <xkbcommon/xkbcommon.h>
|
||||
#endif // SOWRAP_ENABLED
|
||||
|
||||
class KeyMappingXKB {
|
||||
struct HashMapHasherKeys {
|
||||
static _FORCE_INLINE_ uint32_t hash(Key p_key) { return hash_fmix32(static_cast<uint32_t>(p_key)); }
|
||||
static _FORCE_INLINE_ uint32_t hash(unsigned p_key) { return hash_fmix32(p_key); }
|
||||
};
|
||||
|
||||
static inline HashMap<xkb_keycode_t, Key, HashMapHasherKeys> xkb_keycode_map;
|
||||
static inline HashMap<unsigned int, Key, HashMapHasherKeys> scancode_map;
|
||||
static inline HashMap<Key, unsigned int, HashMapHasherKeys> scancode_map_inv;
|
||||
static inline HashMap<unsigned int, KeyLocation, HashMapHasherKeys> location_map;
|
||||
|
||||
KeyMappingXKB(){};
|
||||
|
||||
public:
|
||||
static void initialize();
|
||||
|
||||
static Key get_keycode(xkb_keysym_t p_keysym);
|
||||
static xkb_keycode_t get_xkb_keycode(Key p_keycode);
|
||||
static Key get_scancode(unsigned int p_code);
|
||||
static KeyLocation get_location(unsigned int p_code);
|
||||
};
|
||||
|
||||
#endif // KEY_MAPPING_XKB_H
|
||||
@ -0,0 +1,59 @@
|
||||
/**************************************************************************/
|
||||
/* vulkan_context_wayland.cpp */
|
||||
/**************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/**************************************************************************/
|
||||
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
|
||||
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/**************************************************************************/
|
||||
|
||||
#include "vulkan_context_wayland.h"
|
||||
|
||||
#ifdef VULKAN_ENABLED
|
||||
|
||||
#ifdef USE_VOLK
|
||||
#include <volk.h>
|
||||
#else
|
||||
#include <vulkan/vulkan.h>
|
||||
#endif
|
||||
|
||||
const char *VulkanContextWayland::_get_platform_surface_extension() const {
|
||||
return VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME;
|
||||
}
|
||||
|
||||
Error VulkanContextWayland::window_create(DisplayServer::WindowID p_window_id, DisplayServer::VSyncMode p_vsync_mode, int p_width, int p_height, const void *p_platform_data) {
|
||||
const WindowPlatformData *wpd = (const WindowPlatformData *)p_platform_data;
|
||||
|
||||
VkWaylandSurfaceCreateInfoKHR createInfo = {};
|
||||
createInfo.sType = VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR;
|
||||
createInfo.display = wpd->display;
|
||||
createInfo.surface = wpd->surface;
|
||||
|
||||
VkSurfaceKHR surface = VK_NULL_HANDLE;
|
||||
VkResult err = vkCreateWaylandSurfaceKHR(get_instance(), &createInfo, nullptr, &surface);
|
||||
ERR_FAIL_COND_V(err, ERR_CANT_CREATE);
|
||||
return _window_create(p_window_id, p_vsync_mode, surface, p_width, p_height);
|
||||
}
|
||||
|
||||
#endif // VULKAN_ENABLED
|
||||
@ -0,0 +1,52 @@
|
||||
/**************************************************************************/
|
||||
/* vulkan_context_wayland.h */
|
||||
/**************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/**************************************************************************/
|
||||
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
|
||||
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/**************************************************************************/
|
||||
|
||||
#ifndef VULKAN_CONTEXT_WAYLAND_H
|
||||
#define VULKAN_CONTEXT_WAYLAND_H
|
||||
|
||||
#ifdef VULKAN_ENABLED
|
||||
|
||||
#include "drivers/vulkan/vulkan_context.h"
|
||||
|
||||
class VulkanContextWayland : public VulkanContext {
|
||||
const char *_get_platform_surface_extension() const override final;
|
||||
|
||||
public:
|
||||
struct WindowPlatformData {
|
||||
struct wl_display *display;
|
||||
struct wl_surface *surface;
|
||||
};
|
||||
|
||||
Error window_create(DisplayServer::WindowID p_window_id, DisplayServer::VSyncMode p_vsync_mode, int p_width, int p_height, const void *p_platform_data) override final;
|
||||
};
|
||||
|
||||
#endif // VULKAN_ENABLED
|
||||
|
||||
#endif // VULKAN_CONTEXT_WAYLAND_H
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,930 @@
|
||||
/**************************************************************************/
|
||||
/* wayland_thread.h */
|
||||
/**************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/**************************************************************************/
|
||||
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
|
||||
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/**************************************************************************/
|
||||
|
||||
#ifndef WAYLAND_THREAD_H
|
||||
#define WAYLAND_THREAD_H
|
||||
|
||||
#ifdef WAYLAND_ENABLED
|
||||
|
||||
#include "key_mapping_xkb.h"
|
||||
|
||||
#ifdef SOWRAP_ENABLED
|
||||
#include "wayland/dynwrappers/wayland-client-core-so_wrap.h"
|
||||
#include "wayland/dynwrappers/wayland-cursor-so_wrap.h"
|
||||
#include "wayland/dynwrappers/wayland-egl-core-so_wrap.h"
|
||||
#include "xkbcommon-so_wrap.h"
|
||||
#else
|
||||
#include <wayland-client-core.h>
|
||||
#include <wayland-cursor.h>
|
||||
#include <xkbcommon/xkbcommon.h>
|
||||
#endif // SOWRAP_ENABLED
|
||||
|
||||
// These must go after the Wayland client include to work properly.
|
||||
#include "wayland/protocol/idle_inhibit.gen.h"
|
||||
#include "wayland/protocol/primary_selection.gen.h"
|
||||
// These three protocol headers name wl_pointer method arguments as `pointer`,
|
||||
// which is the same name as X11's pointer typedef. This trips some very
|
||||
// annoying shadowing warnings. A `#define` works around this issue.
|
||||
#define pointer wl_pointer
|
||||
#include "wayland/protocol/pointer_constraints.gen.h"
|
||||
#include "wayland/protocol/pointer_gestures.gen.h"
|
||||
#include "wayland/protocol/relative_pointer.gen.h"
|
||||
#undef pointer
|
||||
#include "wayland/protocol/fractional_scale.gen.h"
|
||||
#include "wayland/protocol/tablet.gen.h"
|
||||
#include "wayland/protocol/viewporter.gen.h"
|
||||
#include "wayland/protocol/wayland.gen.h"
|
||||
#include "wayland/protocol/xdg_activation.gen.h"
|
||||
#include "wayland/protocol/xdg_decoration.gen.h"
|
||||
#include "wayland/protocol/xdg_shell.gen.h"
|
||||
|
||||
#ifdef LIBDECOR_ENABLED
|
||||
#ifdef SOWRAP_ENABLED
|
||||
#include "dynwrappers/libdecor-so_wrap.h"
|
||||
#else
|
||||
#include <libdecor-0/libdecor.h>
|
||||
#endif // SOWRAP_ENABLED
|
||||
#endif // LIBDECOR_ENABLED
|
||||
|
||||
#include "core/os/thread.h"
|
||||
#include "servers/display_server.h"
|
||||
|
||||
class WaylandThread {
|
||||
public:
|
||||
// Messages used for exchanging information between Godot's and Wayland's thread.
|
||||
class Message : public RefCounted {
|
||||
public:
|
||||
Message() {}
|
||||
virtual ~Message() = default;
|
||||
};
|
||||
|
||||
// Message data for window rect changes.
|
||||
class WindowRectMessage : public Message {
|
||||
public:
|
||||
// NOTE: This is in "scaled" terms. For example, if there's a 1920x1080 rect
|
||||
// with a scale factor of 2, the actual value of `rect` will be 3840x2160.
|
||||
Rect2i rect;
|
||||
};
|
||||
|
||||
class WindowEventMessage : public Message {
|
||||
public:
|
||||
DisplayServer::WindowEvent event;
|
||||
};
|
||||
|
||||
class InputEventMessage : public Message {
|
||||
public:
|
||||
Ref<InputEvent> event;
|
||||
};
|
||||
|
||||
class DropFilesEventMessage : public Message {
|
||||
public:
|
||||
Vector<String> files;
|
||||
};
|
||||
|
||||
struct RegistryState {
|
||||
WaylandThread *wayland_thread;
|
||||
|
||||
// Core Wayland globals.
|
||||
struct wl_shm *wl_shm = nullptr;
|
||||
uint32_t wl_shm_name = 0;
|
||||
|
||||
struct wl_compositor *wl_compositor = nullptr;
|
||||
uint32_t wl_compositor_name = 0;
|
||||
|
||||
struct wl_subcompositor *wl_subcompositor = nullptr;
|
||||
uint32_t wl_subcompositor_name = 0;
|
||||
|
||||
struct wl_data_device_manager *wl_data_device_manager = nullptr;
|
||||
uint32_t wl_data_device_manager_name = 0;
|
||||
|
||||
List<struct wl_output *> wl_outputs;
|
||||
List<struct wl_seat *> wl_seats;
|
||||
|
||||
// xdg-shell globals.
|
||||
|
||||
struct xdg_wm_base *xdg_wm_base = nullptr;
|
||||
uint32_t xdg_wm_base_name = 0;
|
||||
|
||||
// wayland-protocols globals.
|
||||
|
||||
struct wp_viewporter *wp_viewporter = nullptr;
|
||||
uint32_t wp_viewporter_name = 0;
|
||||
|
||||
struct wp_fractional_scale_manager_v1 *wp_fractional_scale_manager = nullptr;
|
||||
uint32_t wp_fractional_scale_manager_name = 0;
|
||||
|
||||
struct zxdg_decoration_manager_v1 *xdg_decoration_manager = nullptr;
|
||||
uint32_t xdg_decoration_manager_name = 0;
|
||||
|
||||
struct xdg_activation_v1 *xdg_activation = nullptr;
|
||||
uint32_t xdg_activation_name = 0;
|
||||
|
||||
struct zwp_primary_selection_device_manager_v1 *wp_primary_selection_device_manager = nullptr;
|
||||
uint32_t wp_primary_selection_device_manager_name = 0;
|
||||
|
||||
struct zwp_relative_pointer_manager_v1 *wp_relative_pointer_manager = nullptr;
|
||||
uint32_t wp_relative_pointer_manager_name = 0;
|
||||
|
||||
struct zwp_pointer_constraints_v1 *wp_pointer_constraints = nullptr;
|
||||
uint32_t wp_pointer_constraints_name = 0;
|
||||
|
||||
struct zwp_pointer_gestures_v1 *wp_pointer_gestures = nullptr;
|
||||
uint32_t wp_pointer_gestures_name = 0;
|
||||
|
||||
struct zwp_idle_inhibit_manager_v1 *wp_idle_inhibit_manager = nullptr;
|
||||
uint32_t wp_idle_inhibit_manager_name = 0;
|
||||
|
||||
struct zwp_tablet_manager_v2 *wp_tablet_manager = nullptr;
|
||||
uint32_t wp_tablet_manager_name = 0;
|
||||
};
|
||||
|
||||
// General Wayland-specific states. Shouldn't be accessed directly.
|
||||
// TODO: Make private?
|
||||
|
||||
struct WindowState {
|
||||
DisplayServer::WindowID id;
|
||||
|
||||
Rect2i rect;
|
||||
DisplayServer::WindowMode mode = DisplayServer::WINDOW_MODE_WINDOWED;
|
||||
|
||||
// These are true by default as it isn't guaranteed that we'll find an
|
||||
// xdg-shell implementation with wm_capabilities available. If and once we
|
||||
// receive a wm_capabilities event these will get reset and updated with
|
||||
// whatever the compositor says.
|
||||
bool can_minimize = false;
|
||||
bool can_maximize = false;
|
||||
bool can_fullscreen = false;
|
||||
|
||||
HashSet<struct wl_output *> wl_outputs;
|
||||
|
||||
// NOTE: If for whatever reason this callback is destroyed _while_ the event
|
||||
// thread is still running, it might be a good idea to set its user data to
|
||||
// `nullptr`. From some initial testing of mine, it looks like it might still
|
||||
// be called even after being destroyed, pointing to probably invalid window
|
||||
// data by then and segfaulting hard.
|
||||
struct wl_callback *frame_callback = nullptr;
|
||||
|
||||
struct wl_surface *wl_surface = nullptr;
|
||||
struct xdg_surface *xdg_surface = nullptr;
|
||||
struct xdg_toplevel *xdg_toplevel = nullptr;
|
||||
|
||||
struct wp_viewport *wp_viewport = nullptr;
|
||||
struct wp_fractional_scale_v1 *wp_fractional_scale = nullptr;
|
||||
|
||||
// Currently applied buffer scale.
|
||||
int buffer_scale = 1;
|
||||
|
||||
// Buffer scale must be applied right before rendering but _after_ committing
|
||||
// everything else or otherwise we might have an inconsistent state (e.g.
|
||||
// double scale and odd resolution). This flag assists with that; when set,
|
||||
// on the next frame, we'll commit whatever is set in `buffer_scale`.
|
||||
bool buffer_scale_changed = false;
|
||||
|
||||
// NOTE: The preferred buffer scale is currently only dynamically calculated.
|
||||
// It can be accessed by calling `window_state_get_preferred_buffer_scale`.
|
||||
|
||||
// Override used by the fractional scale add-on object. If less or equal to 0
|
||||
// (default) then the normal output-based scale is used instead.
|
||||
double fractional_scale = 0;
|
||||
|
||||
// What the compositor is recommending us.
|
||||
double preferred_fractional_scale = 0;
|
||||
|
||||
struct zxdg_toplevel_decoration_v1 *xdg_toplevel_decoration = nullptr;
|
||||
|
||||
struct zwp_idle_inhibitor_v1 *wp_idle_inhibitor = nullptr;
|
||||
|
||||
#ifdef LIBDECOR_ENABLED
|
||||
// If this is null the xdg_* variables must be set and vice-versa. This way we
|
||||
// can handle this mess gracefully enough to hopefully being able of getting
|
||||
// rid of this cleanly once we have our own CSDs.
|
||||
struct libdecor_frame *libdecor_frame = nullptr;
|
||||
struct libdecor_configuration *pending_libdecor_configuration = nullptr;
|
||||
#endif
|
||||
|
||||
RegistryState *registry;
|
||||
WaylandThread *wayland_thread;
|
||||
};
|
||||
|
||||
// "High level" Godot-side screen data.
|
||||
struct ScreenData {
|
||||
// Geometry data.
|
||||
Point2i position;
|
||||
|
||||
String make;
|
||||
String model;
|
||||
|
||||
Size2i size;
|
||||
Size2i physical_size;
|
||||
|
||||
float refresh_rate = -1;
|
||||
int scale = 1;
|
||||
};
|
||||
|
||||
struct ScreenState {
|
||||
uint32_t wl_output_name = 0;
|
||||
|
||||
ScreenData pending_data;
|
||||
ScreenData data;
|
||||
|
||||
WaylandThread *wayland_thread;
|
||||
};
|
||||
|
||||
enum class Gesture {
|
||||
NONE,
|
||||
MAGNIFY,
|
||||
};
|
||||
|
||||
enum class PointerConstraint {
|
||||
NONE,
|
||||
LOCKED,
|
||||
CONFINED,
|
||||
};
|
||||
|
||||
struct PointerData {
|
||||
Point2i position;
|
||||
uint32_t motion_time = 0;
|
||||
|
||||
// Relative motion has its own optional event and so needs its own time.
|
||||
Vector2 relative_motion;
|
||||
uint32_t relative_motion_time = 0;
|
||||
|
||||
BitField<MouseButtonMask> pressed_button_mask;
|
||||
|
||||
MouseButton last_button_pressed = MouseButton::NONE;
|
||||
Point2i last_pressed_position;
|
||||
|
||||
// This is needed to check for a new double click every time.
|
||||
bool double_click_begun = false;
|
||||
|
||||
uint32_t button_time = 0;
|
||||
uint32_t button_serial = 0;
|
||||
|
||||
uint32_t scroll_type = WL_POINTER_AXIS_SOURCE_WHEEL;
|
||||
|
||||
// The amount "scrolled" in pixels, in each direction.
|
||||
Vector2 scroll_vector;
|
||||
|
||||
// The amount of scroll "clicks" in each direction.
|
||||
Vector2i discrete_scroll_vector;
|
||||
|
||||
uint32_t pinch_scale = 1;
|
||||
};
|
||||
|
||||
struct TabletToolData {
|
||||
Point2i position;
|
||||
Vector2i tilt;
|
||||
uint32_t pressure = 0;
|
||||
|
||||
BitField<MouseButtonMask> pressed_button_mask;
|
||||
|
||||
MouseButton last_button_pressed = MouseButton::NONE;
|
||||
Point2i last_pressed_position;
|
||||
|
||||
bool double_click_begun = false;
|
||||
|
||||
// Note: the protocol doesn't have it (I guess that this isn't really meant to
|
||||
// be used as a mouse...), but we'll hack one in with the current ticks.
|
||||
uint64_t button_time = 0;
|
||||
|
||||
bool is_eraser = false;
|
||||
|
||||
bool in_proximity = false;
|
||||
bool touching = false;
|
||||
};
|
||||
|
||||
struct OfferState {
|
||||
HashSet<String> mime_types;
|
||||
};
|
||||
|
||||
struct SeatState {
|
||||
RegistryState *registry = nullptr;
|
||||
|
||||
WaylandThread *wayland_thread = nullptr;
|
||||
|
||||
struct wl_seat *wl_seat = nullptr;
|
||||
uint32_t wl_seat_name = 0;
|
||||
|
||||
// Pointer.
|
||||
struct wl_pointer *wl_pointer = nullptr;
|
||||
|
||||
uint32_t pointer_enter_serial = 0;
|
||||
|
||||
struct wl_surface *pointed_surface = nullptr;
|
||||
struct wl_surface *last_pointed_surface = nullptr;
|
||||
|
||||
struct zwp_relative_pointer_v1 *wp_relative_pointer = nullptr;
|
||||
struct zwp_locked_pointer_v1 *wp_locked_pointer = nullptr;
|
||||
struct zwp_confined_pointer_v1 *wp_confined_pointer = nullptr;
|
||||
|
||||
struct zwp_pointer_gesture_pinch_v1 *wp_pointer_gesture_pinch = nullptr;
|
||||
|
||||
// NOTE: According to the wp_pointer_gestures protocol specification, there
|
||||
// can be only one active gesture at a time.
|
||||
Gesture active_gesture = Gesture::NONE;
|
||||
|
||||
// Used for delta calculations.
|
||||
// NOTE: The wp_pointer_gestures protocol keeps track of the total scale of
|
||||
// the pinch gesture, while godot instead wants its delta.
|
||||
wl_fixed_t old_pinch_scale = 0;
|
||||
|
||||
struct wl_surface *cursor_surface = nullptr;
|
||||
struct wl_callback *cursor_frame_callback = nullptr;
|
||||
uint32_t cursor_time_ms = 0;
|
||||
|
||||
// This variable is needed to buffer all pointer changes until a
|
||||
// wl_pointer.frame event, as per Wayland's specification. Everything is
|
||||
// first set in `data_buffer` and then `data` is set with its contents on
|
||||
// an input frame event. All methods should generally read from
|
||||
// `pointer_data` and write to `data_buffer`.
|
||||
PointerData pointer_data_buffer;
|
||||
PointerData pointer_data;
|
||||
|
||||
// Keyboard.
|
||||
struct wl_keyboard *wl_keyboard = nullptr;
|
||||
|
||||
struct xkb_context *xkb_context = nullptr;
|
||||
struct xkb_keymap *xkb_keymap = nullptr;
|
||||
struct xkb_state *xkb_state = nullptr;
|
||||
|
||||
const char *keymap_buffer = nullptr;
|
||||
uint32_t keymap_buffer_size = 0;
|
||||
|
||||
xkb_layout_index_t current_layout_index = 0;
|
||||
|
||||
int32_t repeat_key_delay_msec = 0;
|
||||
int32_t repeat_start_delay_msec = 0;
|
||||
|
||||
xkb_keycode_t repeating_keycode = XKB_KEYCODE_INVALID;
|
||||
uint64_t last_repeat_start_msec = 0;
|
||||
uint64_t last_repeat_msec = 0;
|
||||
|
||||
bool shift_pressed = false;
|
||||
bool ctrl_pressed = false;
|
||||
bool alt_pressed = false;
|
||||
bool meta_pressed = false;
|
||||
|
||||
uint32_t last_key_pressed_serial = 0;
|
||||
|
||||
struct wl_data_device *wl_data_device = nullptr;
|
||||
|
||||
// Drag and drop.
|
||||
struct wl_data_offer *wl_data_offer_dnd = nullptr;
|
||||
uint32_t dnd_enter_serial = 0;
|
||||
|
||||
// Clipboard.
|
||||
struct wl_data_source *wl_data_source_selection = nullptr;
|
||||
Vector<uint8_t> selection_data;
|
||||
|
||||
struct wl_data_offer *wl_data_offer_selection = nullptr;
|
||||
|
||||
// Primary selection.
|
||||
struct zwp_primary_selection_device_v1 *wp_primary_selection_device = nullptr;
|
||||
|
||||
struct zwp_primary_selection_source_v1 *wp_primary_selection_source = nullptr;
|
||||
Vector<uint8_t> primary_data;
|
||||
|
||||
struct zwp_primary_selection_offer_v1 *wp_primary_selection_offer = nullptr;
|
||||
|
||||
// Tablet.
|
||||
struct zwp_tablet_seat_v2 *wp_tablet_seat = nullptr;
|
||||
|
||||
List<struct zwp_tablet_tool_v2 *> tablet_tools;
|
||||
|
||||
TabletToolData tablet_tool_data_buffer;
|
||||
TabletToolData tablet_tool_data;
|
||||
};
|
||||
|
||||
struct CustomCursor {
|
||||
struct wl_buffer *wl_buffer = nullptr;
|
||||
uint32_t *buffer_data = nullptr;
|
||||
uint32_t buffer_data_size = 0;
|
||||
|
||||
RID rid;
|
||||
Point2i hotspot;
|
||||
};
|
||||
|
||||
private:
|
||||
struct ThreadData {
|
||||
SafeFlag thread_done;
|
||||
Mutex mutex;
|
||||
|
||||
struct wl_display *wl_display = nullptr;
|
||||
};
|
||||
|
||||
// FIXME: Is this the right thing to do?
|
||||
inline static const char *proxy_tag = "godot";
|
||||
|
||||
Thread events_thread;
|
||||
ThreadData thread_data;
|
||||
|
||||
WindowState main_window;
|
||||
|
||||
List<Ref<Message>> messages;
|
||||
|
||||
String cursor_theme_name;
|
||||
int unscaled_cursor_size = 24;
|
||||
|
||||
// NOTE: Regarding screen scale handling, the cursor cache is currently
|
||||
// "static", by which I mean that we try to change it as little as possible and
|
||||
// thus will be as big as the largest screen. This is mainly due to the fact
|
||||
// that doing it dynamically doesn't look like it's worth it to me currently,
|
||||
// especially as usually screen scales don't change continuously.
|
||||
int cursor_scale = 1;
|
||||
|
||||
struct wl_cursor_theme *wl_cursor_theme = nullptr;
|
||||
struct wl_cursor *wl_cursors[DisplayServer::CURSOR_MAX] = {};
|
||||
|
||||
HashMap<DisplayServer::CursorShape, CustomCursor> custom_cursors;
|
||||
|
||||
struct wl_cursor *current_wl_cursor = nullptr;
|
||||
struct CustomCursor *current_custom_cursor = nullptr;
|
||||
|
||||
DisplayServer::CursorShape last_cursor_shape = DisplayServer::CURSOR_ARROW;
|
||||
|
||||
PointerConstraint pointer_constraint = PointerConstraint::NONE;
|
||||
|
||||
struct wl_display *wl_display = nullptr;
|
||||
struct wl_registry *wl_registry = nullptr;
|
||||
|
||||
struct wl_seat *wl_seat_current = nullptr;
|
||||
|
||||
bool frame = true;
|
||||
|
||||
RegistryState registry;
|
||||
|
||||
bool initialized = false;
|
||||
|
||||
#ifdef LIBDECOR_ENABLED
|
||||
struct libdecor *libdecor_context = nullptr;
|
||||
#endif // LIBDECOR_ENABLED
|
||||
|
||||
// Main polling method.
|
||||
static void _poll_events_thread(void *p_data);
|
||||
|
||||
// Core Wayland event handlers.
|
||||
static void _wl_registry_on_global(void *data, struct wl_registry *wl_registry, uint32_t name, const char *interface, uint32_t version);
|
||||
static void _wl_registry_on_global_remove(void *data, struct wl_registry *wl_registry, uint32_t name);
|
||||
|
||||
static void _wl_surface_on_enter(void *data, struct wl_surface *wl_surface, struct wl_output *wl_output);
|
||||
static void _wl_surface_on_leave(void *data, struct wl_surface *wl_surface, struct wl_output *wl_output);
|
||||
|
||||
static void _frame_wl_callback_on_done(void *data, struct wl_callback *wl_callback, uint32_t callback_data);
|
||||
|
||||
static void _wl_output_on_geometry(void *data, struct wl_output *wl_output, int32_t x, int32_t y, int32_t physical_width, int32_t physical_height, int32_t subpixel, const char *make, const char *model, int32_t transform);
|
||||
static void _wl_output_on_mode(void *data, struct wl_output *wl_output, uint32_t flags, int32_t width, int32_t height, int32_t refresh);
|
||||
static void _wl_output_on_done(void *data, struct wl_output *wl_output);
|
||||
static void _wl_output_on_scale(void *data, struct wl_output *wl_output, int32_t factor);
|
||||
static void _wl_output_on_name(void *data, struct wl_output *wl_output, const char *name);
|
||||
static void _wl_output_on_description(void *data, struct wl_output *wl_output, const char *description);
|
||||
|
||||
static void _wl_seat_on_capabilities(void *data, struct wl_seat *wl_seat, uint32_t capabilities);
|
||||
static void _wl_seat_on_name(void *data, struct wl_seat *wl_seat, const char *name);
|
||||
|
||||
static void _cursor_frame_callback_on_done(void *data, struct wl_callback *wl_callback, uint32_t time_ms);
|
||||
|
||||
static void _wl_pointer_on_enter(void *data, struct wl_pointer *wl_pointer, uint32_t serial, struct wl_surface *surface, wl_fixed_t surface_x, wl_fixed_t surface_y);
|
||||
static void _wl_pointer_on_leave(void *data, struct wl_pointer *wl_pointer, uint32_t serial, struct wl_surface *surface);
|
||||
static void _wl_pointer_on_motion(void *data, struct wl_pointer *wl_pointer, uint32_t time, wl_fixed_t surface_x, wl_fixed_t surface_y);
|
||||
static void _wl_pointer_on_button(void *data, struct wl_pointer *wl_pointer, uint32_t serial, uint32_t time, uint32_t button, uint32_t state);
|
||||
static void _wl_pointer_on_axis(void *data, struct wl_pointer *wl_pointer, uint32_t time, uint32_t axis, wl_fixed_t value);
|
||||
static void _wl_pointer_on_frame(void *data, struct wl_pointer *wl_pointer);
|
||||
static void _wl_pointer_on_axis_source(void *data, struct wl_pointer *wl_pointer, uint32_t axis_source);
|
||||
static void _wl_pointer_on_axis_stop(void *data, struct wl_pointer *wl_pointer, uint32_t time, uint32_t axis);
|
||||
static void _wl_pointer_on_axis_discrete(void *data, struct wl_pointer *wl_pointer, uint32_t axis, int32_t discrete);
|
||||
static void _wl_pointer_on_axis_value120(void *data, struct wl_pointer *wl_pointer, uint32_t axis, int32_t value120);
|
||||
|
||||
static void _wl_keyboard_on_keymap(void *data, struct wl_keyboard *wl_keyboard, uint32_t format, int32_t fd, uint32_t size);
|
||||
static void _wl_keyboard_on_enter(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial, struct wl_surface *surface, struct wl_array *keys);
|
||||
static void _wl_keyboard_on_leave(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial, struct wl_surface *surface);
|
||||
static void _wl_keyboard_on_key(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial, uint32_t time, uint32_t key, uint32_t state);
|
||||
static void _wl_keyboard_on_modifiers(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial, uint32_t mods_depressed, uint32_t mods_latched, uint32_t mods_locked, uint32_t group);
|
||||
static void _wl_keyboard_on_repeat_info(void *data, struct wl_keyboard *wl_keyboard, int32_t rate, int32_t delay);
|
||||
|
||||
static void _wl_data_device_on_data_offer(void *data, struct wl_data_device *wl_data_device, struct wl_data_offer *id);
|
||||
static void _wl_data_device_on_enter(void *data, struct wl_data_device *wl_data_device, uint32_t serial, struct wl_surface *surface, wl_fixed_t x, wl_fixed_t y, struct wl_data_offer *id);
|
||||
static void _wl_data_device_on_leave(void *data, struct wl_data_device *wl_data_device);
|
||||
static void _wl_data_device_on_motion(void *data, struct wl_data_device *wl_data_device, uint32_t time, wl_fixed_t x, wl_fixed_t y);
|
||||
static void _wl_data_device_on_drop(void *data, struct wl_data_device *wl_data_device);
|
||||
static void _wl_data_device_on_selection(void *data, struct wl_data_device *wl_data_device, struct wl_data_offer *id);
|
||||
|
||||
static void _wl_data_offer_on_offer(void *data, struct wl_data_offer *wl_data_offer, const char *mime_type);
|
||||
static void _wl_data_offer_on_source_actions(void *data, struct wl_data_offer *wl_data_offer, uint32_t source_actions);
|
||||
static void _wl_data_offer_on_action(void *data, struct wl_data_offer *wl_data_offer, uint32_t dnd_action);
|
||||
|
||||
static void _wl_data_source_on_target(void *data, struct wl_data_source *wl_data_source, const char *mime_type);
|
||||
static void _wl_data_source_on_send(void *data, struct wl_data_source *wl_data_source, const char *mime_type, int32_t fd);
|
||||
static void _wl_data_source_on_cancelled(void *data, struct wl_data_source *wl_data_source);
|
||||
static void _wl_data_source_on_dnd_drop_performed(void *data, struct wl_data_source *wl_data_source);
|
||||
static void _wl_data_source_on_dnd_finished(void *data, struct wl_data_source *wl_data_source);
|
||||
static void _wl_data_source_on_action(void *data, struct wl_data_source *wl_data_source, uint32_t dnd_action);
|
||||
|
||||
// xdg-shell event handlers.
|
||||
static void _xdg_wm_base_on_ping(void *data, struct xdg_wm_base *xdg_wm_base, uint32_t serial);
|
||||
|
||||
static void _xdg_surface_on_configure(void *data, struct xdg_surface *xdg_surface, uint32_t serial);
|
||||
|
||||
static void _xdg_toplevel_on_configure(void *data, struct xdg_toplevel *xdg_toplevel, int32_t width, int32_t height, struct wl_array *states);
|
||||
static void _xdg_toplevel_on_close(void *data, struct xdg_toplevel *xdg_toplevel);
|
||||
static void _xdg_toplevel_on_configure_bounds(void *data, struct xdg_toplevel *xdg_toplevel, int32_t width, int32_t height);
|
||||
static void _xdg_toplevel_on_wm_capabilities(void *data, struct xdg_toplevel *xdg_toplevel, struct wl_array *capabilities);
|
||||
|
||||
// wayland-protocols event handlers.
|
||||
static void _wp_fractional_scale_on_preferred_scale(void *data, struct wp_fractional_scale_v1 *wp_fractional_scale_v1, uint32_t scale);
|
||||
|
||||
static void _wp_relative_pointer_on_relative_motion(void *data, struct zwp_relative_pointer_v1 *wp_relative_pointer_v1, uint32_t uptime_hi, uint32_t uptime_lo, wl_fixed_t dx, wl_fixed_t dy, wl_fixed_t dx_unaccel, wl_fixed_t dy_unaccel);
|
||||
|
||||
static void _wp_pointer_gesture_pinch_on_begin(void *data, struct zwp_pointer_gesture_pinch_v1 *zwp_pointer_gesture_pinch_v1, uint32_t serial, uint32_t time, struct wl_surface *surface, uint32_t fingers);
|
||||
static void _wp_pointer_gesture_pinch_on_update(void *data, struct zwp_pointer_gesture_pinch_v1 *zwp_pointer_gesture_pinch_v1, uint32_t time, wl_fixed_t dx, wl_fixed_t dy, wl_fixed_t scale, wl_fixed_t rotation);
|
||||
static void _wp_pointer_gesture_pinch_on_end(void *data, struct zwp_pointer_gesture_pinch_v1 *zwp_pointer_gesture_pinch_v1, uint32_t serial, uint32_t time, int32_t cancelled);
|
||||
|
||||
static void _wp_primary_selection_device_on_data_offer(void *data, struct zwp_primary_selection_device_v1 *wp_primary_selection_device_v1, struct zwp_primary_selection_offer_v1 *offer);
|
||||
static void _wp_primary_selection_device_on_selection(void *data, struct zwp_primary_selection_device_v1 *wp_primary_selection_device_v1, struct zwp_primary_selection_offer_v1 *id);
|
||||
|
||||
static void _wp_primary_selection_offer_on_offer(void *data, struct zwp_primary_selection_offer_v1 *zwp_primary_selection_offer_v1, const char *mime_type);
|
||||
|
||||
static void _wp_primary_selection_source_on_send(void *data, struct zwp_primary_selection_source_v1 *wp_primary_selection_source_v1, const char *mime_type, int32_t fd);
|
||||
static void _wp_primary_selection_source_on_cancelled(void *data, struct zwp_primary_selection_source_v1 *wp_primary_selection_source_v1);
|
||||
|
||||
static void _wp_tablet_seat_on_tablet_added(void *data, struct zwp_tablet_seat_v2 *zwp_tablet_seat_v2, struct zwp_tablet_v2 *id);
|
||||
static void _wp_tablet_seat_on_tool_added(void *data, struct zwp_tablet_seat_v2 *zwp_tablet_seat_v2, struct zwp_tablet_tool_v2 *id);
|
||||
static void _wp_tablet_seat_on_pad_added(void *data, struct zwp_tablet_seat_v2 *zwp_tablet_seat_v2, struct zwp_tablet_pad_v2 *id);
|
||||
|
||||
static void _wp_tablet_tool_on_type(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2, uint32_t tool_type);
|
||||
static void _wp_tablet_tool_on_hardware_serial(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2, uint32_t hardware_serial_hi, uint32_t hardware_serial_lo);
|
||||
static void _wp_tablet_tool_on_hardware_id_wacom(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2, uint32_t hardware_id_hi, uint32_t hardware_id_lo);
|
||||
static void _wp_tablet_tool_on_capability(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2, uint32_t capability);
|
||||
static void _wp_tablet_tool_on_done(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2);
|
||||
static void _wp_tablet_tool_on_removed(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2);
|
||||
static void _wp_tablet_tool_on_proximity_in(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2, uint32_t serial, struct zwp_tablet_v2 *tablet, struct wl_surface *surface);
|
||||
static void _wp_tablet_tool_on_proximity_out(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2);
|
||||
static void _wp_tablet_tool_on_down(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2, uint32_t serial);
|
||||
static void _wp_tablet_tool_on_up(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2);
|
||||
static void _wp_tablet_tool_on_motion(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2, wl_fixed_t x, wl_fixed_t y);
|
||||
static void _wp_tablet_tool_on_pressure(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2, uint32_t pressure);
|
||||
static void _wp_tablet_tool_on_distance(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2, uint32_t distance);
|
||||
static void _wp_tablet_tool_on_tilt(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2, wl_fixed_t tilt_x, wl_fixed_t tilt_y);
|
||||
static void _wp_tablet_tool_on_rotation(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2, wl_fixed_t degrees);
|
||||
static void _wp_tablet_tool_on_slider(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2, int32_t position);
|
||||
static void _wp_tablet_tool_on_wheel(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2, wl_fixed_t degrees, int32_t clicks);
|
||||
static void _wp_tablet_tool_on_button(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2, uint32_t serial, uint32_t button, uint32_t state);
|
||||
static void _wp_tablet_tool_on_frame(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2, uint32_t time);
|
||||
|
||||
static void _xdg_toplevel_decoration_on_configure(void *data, struct zxdg_toplevel_decoration_v1 *xdg_toplevel_decoration, uint32_t mode);
|
||||
|
||||
static void _xdg_activation_token_on_done(void *data, struct xdg_activation_token_v1 *xdg_activation_token, const char *token);
|
||||
|
||||
// Core Wayland event listeners.
|
||||
static constexpr struct wl_registry_listener wl_registry_listener = {
|
||||
.global = _wl_registry_on_global,
|
||||
.global_remove = _wl_registry_on_global_remove,
|
||||
};
|
||||
|
||||
static constexpr struct wl_surface_listener wl_surface_listener = {
|
||||
.enter = _wl_surface_on_enter,
|
||||
.leave = _wl_surface_on_leave,
|
||||
};
|
||||
|
||||
static constexpr struct wl_callback_listener frame_wl_callback_listener {
|
||||
.done = _frame_wl_callback_on_done,
|
||||
};
|
||||
|
||||
static constexpr struct wl_output_listener wl_output_listener = {
|
||||
.geometry = _wl_output_on_geometry,
|
||||
.mode = _wl_output_on_mode,
|
||||
.done = _wl_output_on_done,
|
||||
.scale = _wl_output_on_scale,
|
||||
.name = _wl_output_on_name,
|
||||
.description = _wl_output_on_description,
|
||||
};
|
||||
|
||||
static constexpr struct wl_seat_listener wl_seat_listener = {
|
||||
.capabilities = _wl_seat_on_capabilities,
|
||||
.name = _wl_seat_on_name,
|
||||
};
|
||||
|
||||
static constexpr struct wl_callback_listener cursor_frame_callback_listener {
|
||||
.done = _cursor_frame_callback_on_done,
|
||||
};
|
||||
|
||||
static constexpr struct wl_pointer_listener wl_pointer_listener = {
|
||||
.enter = _wl_pointer_on_enter,
|
||||
.leave = _wl_pointer_on_leave,
|
||||
.motion = _wl_pointer_on_motion,
|
||||
.button = _wl_pointer_on_button,
|
||||
.axis = _wl_pointer_on_axis,
|
||||
.frame = _wl_pointer_on_frame,
|
||||
.axis_source = _wl_pointer_on_axis_source,
|
||||
.axis_stop = _wl_pointer_on_axis_stop,
|
||||
.axis_discrete = _wl_pointer_on_axis_discrete,
|
||||
.axis_value120 = _wl_pointer_on_axis_value120,
|
||||
};
|
||||
|
||||
static constexpr struct wl_keyboard_listener wl_keyboard_listener = {
|
||||
.keymap = _wl_keyboard_on_keymap,
|
||||
.enter = _wl_keyboard_on_enter,
|
||||
.leave = _wl_keyboard_on_leave,
|
||||
.key = _wl_keyboard_on_key,
|
||||
.modifiers = _wl_keyboard_on_modifiers,
|
||||
.repeat_info = _wl_keyboard_on_repeat_info,
|
||||
};
|
||||
|
||||
static constexpr struct wl_data_device_listener wl_data_device_listener = {
|
||||
.data_offer = _wl_data_device_on_data_offer,
|
||||
.enter = _wl_data_device_on_enter,
|
||||
.leave = _wl_data_device_on_leave,
|
||||
.motion = _wl_data_device_on_motion,
|
||||
.drop = _wl_data_device_on_drop,
|
||||
.selection = _wl_data_device_on_selection,
|
||||
};
|
||||
|
||||
static constexpr struct wl_data_offer_listener wl_data_offer_listener = {
|
||||
.offer = _wl_data_offer_on_offer,
|
||||
.source_actions = _wl_data_offer_on_source_actions,
|
||||
.action = _wl_data_offer_on_action,
|
||||
};
|
||||
|
||||
static constexpr struct wl_data_source_listener wl_data_source_listener = {
|
||||
.target = _wl_data_source_on_target,
|
||||
.send = _wl_data_source_on_send,
|
||||
.cancelled = _wl_data_source_on_cancelled,
|
||||
.dnd_drop_performed = _wl_data_source_on_dnd_drop_performed,
|
||||
.dnd_finished = _wl_data_source_on_dnd_finished,
|
||||
.action = _wl_data_source_on_action,
|
||||
};
|
||||
|
||||
// xdg-shell event listeners.
|
||||
static constexpr struct xdg_wm_base_listener xdg_wm_base_listener = {
|
||||
.ping = _xdg_wm_base_on_ping,
|
||||
};
|
||||
|
||||
static constexpr struct xdg_surface_listener xdg_surface_listener = {
|
||||
.configure = _xdg_surface_on_configure,
|
||||
};
|
||||
|
||||
static constexpr struct xdg_toplevel_listener xdg_toplevel_listener = {
|
||||
.configure = _xdg_toplevel_on_configure,
|
||||
.close = _xdg_toplevel_on_close,
|
||||
.configure_bounds = _xdg_toplevel_on_configure_bounds,
|
||||
.wm_capabilities = _xdg_toplevel_on_wm_capabilities,
|
||||
};
|
||||
|
||||
// wayland-protocols event listeners.
|
||||
static constexpr struct wp_fractional_scale_v1_listener wp_fractional_scale_listener = {
|
||||
.preferred_scale = _wp_fractional_scale_on_preferred_scale,
|
||||
};
|
||||
|
||||
static constexpr struct zwp_relative_pointer_v1_listener wp_relative_pointer_listener = {
|
||||
.relative_motion = _wp_relative_pointer_on_relative_motion,
|
||||
};
|
||||
|
||||
static constexpr struct zwp_pointer_gesture_pinch_v1_listener wp_pointer_gesture_pinch_listener = {
|
||||
.begin = _wp_pointer_gesture_pinch_on_begin,
|
||||
.update = _wp_pointer_gesture_pinch_on_update,
|
||||
.end = _wp_pointer_gesture_pinch_on_end,
|
||||
};
|
||||
|
||||
static constexpr struct zwp_primary_selection_device_v1_listener wp_primary_selection_device_listener = {
|
||||
.data_offer = _wp_primary_selection_device_on_data_offer,
|
||||
.selection = _wp_primary_selection_device_on_selection,
|
||||
};
|
||||
|
||||
static constexpr struct zwp_primary_selection_offer_v1_listener wp_primary_selection_offer_listener = {
|
||||
.offer = _wp_primary_selection_offer_on_offer,
|
||||
};
|
||||
|
||||
static constexpr struct zwp_primary_selection_source_v1_listener wp_primary_selection_source_listener = {
|
||||
.send = _wp_primary_selection_source_on_send,
|
||||
.cancelled = _wp_primary_selection_source_on_cancelled,
|
||||
};
|
||||
|
||||
static constexpr struct zwp_tablet_seat_v2_listener wp_tablet_seat_listener = {
|
||||
.tablet_added = _wp_tablet_seat_on_tablet_added,
|
||||
.tool_added = _wp_tablet_seat_on_tool_added,
|
||||
.pad_added = _wp_tablet_seat_on_pad_added,
|
||||
};
|
||||
|
||||
static constexpr struct zwp_tablet_tool_v2_listener wp_tablet_tool_listener = {
|
||||
.type = _wp_tablet_tool_on_type,
|
||||
.hardware_serial = _wp_tablet_tool_on_hardware_serial,
|
||||
.hardware_id_wacom = _wp_tablet_tool_on_hardware_id_wacom,
|
||||
.capability = _wp_tablet_tool_on_capability,
|
||||
.done = _wp_tablet_tool_on_done,
|
||||
.removed = _wp_tablet_tool_on_removed,
|
||||
.proximity_in = _wp_tablet_tool_on_proximity_in,
|
||||
.proximity_out = _wp_tablet_tool_on_proximity_out,
|
||||
.down = _wp_tablet_tool_on_down,
|
||||
.up = _wp_tablet_tool_on_up,
|
||||
.motion = _wp_tablet_tool_on_motion,
|
||||
.pressure = _wp_tablet_tool_on_pressure,
|
||||
.distance = _wp_tablet_tool_on_distance,
|
||||
.tilt = _wp_tablet_tool_on_tilt,
|
||||
.rotation = _wp_tablet_tool_on_rotation,
|
||||
.slider = _wp_tablet_tool_on_slider,
|
||||
.wheel = _wp_tablet_tool_on_wheel,
|
||||
.button = _wp_tablet_tool_on_button,
|
||||
.frame = _wp_tablet_tool_on_frame,
|
||||
};
|
||||
|
||||
static constexpr struct zxdg_toplevel_decoration_v1_listener xdg_toplevel_decoration_listener = {
|
||||
.configure = _xdg_toplevel_decoration_on_configure,
|
||||
};
|
||||
|
||||
static constexpr struct xdg_activation_token_v1_listener xdg_activation_token_listener = {
|
||||
.done = _xdg_activation_token_on_done,
|
||||
};
|
||||
|
||||
#ifdef LIBDECOR_ENABLED
|
||||
// libdecor event handlers.
|
||||
static void libdecor_on_error(struct libdecor *context, enum libdecor_error error, const char *message);
|
||||
|
||||
static void libdecor_frame_on_configure(struct libdecor_frame *frame, struct libdecor_configuration *configuration, void *user_data);
|
||||
|
||||
static void libdecor_frame_on_close(struct libdecor_frame *frame, void *user_data);
|
||||
|
||||
static void libdecor_frame_on_commit(struct libdecor_frame *frame, void *user_data);
|
||||
|
||||
static void libdecor_frame_on_dismiss_popup(struct libdecor_frame *frame, const char *seat_name, void *user_data);
|
||||
|
||||
// libdecor event listeners.
|
||||
static constexpr struct libdecor_interface libdecor_interface = {
|
||||
.error = libdecor_on_error,
|
||||
.reserved0 = nullptr,
|
||||
.reserved1 = nullptr,
|
||||
.reserved2 = nullptr,
|
||||
.reserved3 = nullptr,
|
||||
.reserved4 = nullptr,
|
||||
.reserved5 = nullptr,
|
||||
.reserved6 = nullptr,
|
||||
.reserved7 = nullptr,
|
||||
.reserved8 = nullptr,
|
||||
.reserved9 = nullptr,
|
||||
};
|
||||
|
||||
static constexpr struct libdecor_frame_interface libdecor_frame_interface = {
|
||||
.configure = libdecor_frame_on_configure,
|
||||
.close = libdecor_frame_on_close,
|
||||
.commit = libdecor_frame_on_commit,
|
||||
.dismiss_popup = libdecor_frame_on_dismiss_popup,
|
||||
.reserved0 = nullptr,
|
||||
.reserved1 = nullptr,
|
||||
.reserved2 = nullptr,
|
||||
.reserved3 = nullptr,
|
||||
.reserved4 = nullptr,
|
||||
.reserved5 = nullptr,
|
||||
.reserved6 = nullptr,
|
||||
.reserved7 = nullptr,
|
||||
.reserved8 = nullptr,
|
||||
.reserved9 = nullptr,
|
||||
};
|
||||
#endif // LIBDECOR_ENABLED
|
||||
|
||||
static Vector<uint8_t> _read_fd(int fd);
|
||||
static int _allocate_shm_file(size_t size);
|
||||
|
||||
static Vector<uint8_t> _wl_data_offer_read(struct wl_display *wl_display, const char *p_mime, struct wl_data_offer *wl_data_offer);
|
||||
static Vector<uint8_t> _wp_primary_selection_offer_read(struct wl_display *wl_display, const char *p_mime, struct zwp_primary_selection_offer_v1 *wp_primary_selection_offer);
|
||||
|
||||
static void _seat_state_set_current(WaylandThread::SeatState &p_ss);
|
||||
static bool _seat_state_configure_key_event(WaylandThread::SeatState &p_seat, Ref<InputEventKey> p_event, xkb_keycode_t p_keycode, bool p_pressed);
|
||||
|
||||
static void _wayland_state_update_cursor();
|
||||
|
||||
void _set_current_seat(struct wl_seat *p_seat);
|
||||
|
||||
bool _load_cursor_theme(int p_cursor_size);
|
||||
|
||||
void _update_scale(int p_scale);
|
||||
|
||||
public:
|
||||
Mutex &mutex = thread_data.mutex;
|
||||
|
||||
struct wl_display *get_wl_display() const;
|
||||
|
||||
// Core Wayland utilities for integrating with our own data structures.
|
||||
static bool wl_proxy_is_godot(struct wl_proxy *p_proxy);
|
||||
static void wl_proxy_tag_godot(struct wl_proxy *p_proxy);
|
||||
|
||||
static WindowState *wl_surface_get_window_state(struct wl_surface *p_surface);
|
||||
static ScreenState *wl_output_get_screen_state(struct wl_output *p_output);
|
||||
static SeatState *wl_seat_get_seat_state(struct wl_seat *p_seat);
|
||||
static OfferState *wl_data_offer_get_offer_state(struct wl_data_offer *p_offer);
|
||||
|
||||
static OfferState *wp_primary_selection_offer_get_offer_state(struct zwp_primary_selection_offer_v1 *p_offer);
|
||||
|
||||
void seat_state_unlock_pointer(SeatState *p_ss);
|
||||
void seat_state_lock_pointer(SeatState *p_ss);
|
||||
void seat_state_set_hint(SeatState *p_ss, int p_x, int p_y);
|
||||
void seat_state_confine_pointer(SeatState *p_ss);
|
||||
|
||||
static void seat_state_update_cursor(SeatState *p_ss);
|
||||
|
||||
void seat_state_echo_keys(SeatState *p_ss);
|
||||
|
||||
static int window_state_get_preferred_buffer_scale(WindowState *p_ws);
|
||||
static double window_state_get_scale_factor(WindowState *p_ws);
|
||||
static void window_state_update_size(WindowState *p_ws, int p_width, int p_height);
|
||||
|
||||
static Vector2i scale_vector2i(const Vector2i &p_vector, double p_amount);
|
||||
|
||||
void push_message(Ref<Message> message);
|
||||
bool has_message();
|
||||
Ref<Message> pop_message();
|
||||
|
||||
void window_create(DisplayServer::WindowID p_window_id, int p_width, int p_height);
|
||||
|
||||
struct wl_surface *window_get_wl_surface(DisplayServer::WindowID p_window_id) const;
|
||||
|
||||
void window_set_max_size(DisplayServer::WindowID p_window_id, const Size2i &p_size);
|
||||
void window_set_min_size(DisplayServer::WindowID p_window_id, const Size2i &p_size);
|
||||
|
||||
bool window_can_set_mode(DisplayServer::WindowID p_window_id, DisplayServer::WindowMode p_window_mode) const;
|
||||
void window_try_set_mode(DisplayServer::WindowID p_window_id, DisplayServer::WindowMode p_window_mode);
|
||||
DisplayServer::WindowMode window_get_mode(DisplayServer::WindowID p_window_id) const;
|
||||
|
||||
void window_set_borderless(DisplayServer::WindowID p_window_id, bool p_borderless);
|
||||
void window_set_title(DisplayServer::WindowID p_window_id, const String &p_title);
|
||||
void window_set_app_id(DisplayServer::WindowID p_window_id, const String &p_app_id);
|
||||
|
||||
bool window_is_focused(DisplayServer::WindowID p_window_id);
|
||||
|
||||
// Optional - requires xdg_activation_v1
|
||||
void window_request_attention(DisplayServer::WindowID p_window_id);
|
||||
|
||||
// Optional - require idle_inhibit_unstable_v1
|
||||
void window_set_idle_inhibition(DisplayServer::WindowID p_window_id, bool p_enable);
|
||||
bool window_get_idle_inhibition(DisplayServer::WindowID p_window_id) const;
|
||||
|
||||
ScreenData screen_get_data(int p_screen) const;
|
||||
int get_screen_count() const;
|
||||
|
||||
void pointer_set_constraint(PointerConstraint p_constraint);
|
||||
void pointer_set_hint(const Point2i &p_hint);
|
||||
PointerConstraint pointer_get_constraint() const;
|
||||
DisplayServer::WindowID pointer_get_pointed_window_id() const;
|
||||
BitField<MouseButtonMask> pointer_get_button_mask() const;
|
||||
|
||||
void cursor_hide();
|
||||
void cursor_set_shape(DisplayServer::CursorShape p_cursor_shape);
|
||||
|
||||
void cursor_set_custom_shape(DisplayServer::CursorShape p_cursor_shape);
|
||||
void cursor_shape_set_custom_image(DisplayServer::CursorShape p_cursor_shape, Ref<Image> p_image, const Point2i &p_hotspot);
|
||||
void cursor_shape_clear_custom_image(DisplayServer::CursorShape p_cursor_shape);
|
||||
|
||||
int keyboard_get_layout_count() const;
|
||||
int keyboard_get_current_layout_index() const;
|
||||
void keyboard_set_current_layout_index(int p_index);
|
||||
String keyboard_get_layout_name(int p_index) const;
|
||||
|
||||
Key keyboard_get_key_from_physical(Key p_key) const;
|
||||
|
||||
void keyboard_echo_keys();
|
||||
|
||||
bool selection_has_mime(const String &p_mime) const;
|
||||
Vector<uint8_t> selection_get_mime(const String &p_mime) const;
|
||||
|
||||
void selection_set_text(const String &p_text);
|
||||
|
||||
// Optional primary support - requires wp_primary_selection_unstable_v1
|
||||
bool primary_has_mime(const String &p_mime) const;
|
||||
Vector<uint8_t> primary_get_mime(const String &p_mime) const;
|
||||
|
||||
void primary_set_text(const String &p_text);
|
||||
|
||||
void set_frame();
|
||||
bool get_reset_frame();
|
||||
|
||||
Error init();
|
||||
void destroy();
|
||||
};
|
||||
|
||||
#endif // WAYLAND_ENABLED
|
||||
|
||||
#endif // WAYLAND_THREAD_H
|
||||
@ -0,0 +1,521 @@
|
||||
/*
|
||||
* Copyright © 2017-2018 Red Hat Inc.
|
||||
* Copyright © 2018 Jonas Ådahl
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the
|
||||
* next paragraph) shall be included in all copies or substantial
|
||||
* portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef LIBDECOR_H
|
||||
#define LIBDECOR_H
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <wayland-client.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#if defined(__GNUC__) && __GNUC__ >= 4
|
||||
#define LIBDECOR_EXPORT __attribute__ ((visibility("default")))
|
||||
#else
|
||||
#define LIBDECOR_EXPORT
|
||||
#endif
|
||||
|
||||
struct xdg_toplevel;
|
||||
|
||||
/** \class libdecor
|
||||
*
|
||||
* \brief A libdecor context instance.
|
||||
*/
|
||||
struct libdecor;
|
||||
|
||||
/** \class libdecor_frame
|
||||
*
|
||||
* \brief A frame used for decorating a Wayland surface.
|
||||
*/
|
||||
struct libdecor_frame;
|
||||
|
||||
/** \class libdecor_configuration
|
||||
*
|
||||
* \brief An object representing a toplevel window configuration.
|
||||
*/
|
||||
struct libdecor_configuration;
|
||||
|
||||
/** \class libdecor_state
|
||||
*
|
||||
* \brief An object corresponding to a configured content state.
|
||||
*/
|
||||
struct libdecor_state;
|
||||
|
||||
enum libdecor_error {
|
||||
LIBDECOR_ERROR_COMPOSITOR_INCOMPATIBLE,
|
||||
LIBDECOR_ERROR_INVALID_FRAME_CONFIGURATION,
|
||||
};
|
||||
|
||||
enum libdecor_window_state {
|
||||
LIBDECOR_WINDOW_STATE_NONE = 0,
|
||||
LIBDECOR_WINDOW_STATE_ACTIVE = 1 << 0,
|
||||
LIBDECOR_WINDOW_STATE_MAXIMIZED = 1 << 1,
|
||||
LIBDECOR_WINDOW_STATE_FULLSCREEN = 1 << 2,
|
||||
LIBDECOR_WINDOW_STATE_TILED_LEFT = 1 << 3,
|
||||
LIBDECOR_WINDOW_STATE_TILED_RIGHT = 1 << 4,
|
||||
LIBDECOR_WINDOW_STATE_TILED_TOP = 1 << 5,
|
||||
LIBDECOR_WINDOW_STATE_TILED_BOTTOM = 1 << 6,
|
||||
};
|
||||
|
||||
enum libdecor_resize_edge {
|
||||
LIBDECOR_RESIZE_EDGE_NONE,
|
||||
LIBDECOR_RESIZE_EDGE_TOP,
|
||||
LIBDECOR_RESIZE_EDGE_BOTTOM,
|
||||
LIBDECOR_RESIZE_EDGE_LEFT,
|
||||
LIBDECOR_RESIZE_EDGE_TOP_LEFT,
|
||||
LIBDECOR_RESIZE_EDGE_BOTTOM_LEFT,
|
||||
LIBDECOR_RESIZE_EDGE_RIGHT,
|
||||
LIBDECOR_RESIZE_EDGE_TOP_RIGHT,
|
||||
LIBDECOR_RESIZE_EDGE_BOTTOM_RIGHT,
|
||||
};
|
||||
|
||||
enum libdecor_capabilities {
|
||||
LIBDECOR_ACTION_MOVE = 1 << 0,
|
||||
LIBDECOR_ACTION_RESIZE = 1 << 1,
|
||||
LIBDECOR_ACTION_MINIMIZE = 1 << 2,
|
||||
LIBDECOR_ACTION_FULLSCREEN = 1 << 3,
|
||||
LIBDECOR_ACTION_CLOSE = 1 << 4,
|
||||
};
|
||||
|
||||
struct libdecor_interface {
|
||||
/**
|
||||
* An error event
|
||||
*/
|
||||
void (* error)(struct libdecor *context,
|
||||
enum libdecor_error error,
|
||||
const char *message);
|
||||
|
||||
/* Reserved */
|
||||
void (* reserved0)(void);
|
||||
void (* reserved1)(void);
|
||||
void (* reserved2)(void);
|
||||
void (* reserved3)(void);
|
||||
void (* reserved4)(void);
|
||||
void (* reserved5)(void);
|
||||
void (* reserved6)(void);
|
||||
void (* reserved7)(void);
|
||||
void (* reserved8)(void);
|
||||
void (* reserved9)(void);
|
||||
};
|
||||
|
||||
/**
|
||||
* Interface for integrating a Wayland surface with libdecor.
|
||||
*/
|
||||
struct libdecor_frame_interface {
|
||||
/**
|
||||
* A new configuration was received. An application should respond to
|
||||
* this by creating a suitable libdecor_state, and apply it using
|
||||
* libdecor_frame_commit.
|
||||
*/
|
||||
void (* configure)(struct libdecor_frame *frame,
|
||||
struct libdecor_configuration *configuration,
|
||||
void *user_data);
|
||||
|
||||
/**
|
||||
* The window was requested to be closed by the compositor.
|
||||
*/
|
||||
void (* close)(struct libdecor_frame *frame,
|
||||
void *user_data);
|
||||
|
||||
/**
|
||||
* The window decoration asked to have the main surface to be
|
||||
* committed. This is required when the decoration is implemented using
|
||||
* synchronous subsurfaces.
|
||||
*/
|
||||
void (* commit)(struct libdecor_frame *frame,
|
||||
void *user_data);
|
||||
|
||||
/**
|
||||
* Any mapped popup that has a grab on the given seat should be
|
||||
* dismissed.
|
||||
*/
|
||||
void (* dismiss_popup)(struct libdecor_frame *frame,
|
||||
const char *seat_name,
|
||||
void *user_data);
|
||||
|
||||
/* Reserved */
|
||||
void (* reserved0)(void);
|
||||
void (* reserved1)(void);
|
||||
void (* reserved2)(void);
|
||||
void (* reserved3)(void);
|
||||
void (* reserved4)(void);
|
||||
void (* reserved5)(void);
|
||||
void (* reserved6)(void);
|
||||
void (* reserved7)(void);
|
||||
void (* reserved8)(void);
|
||||
void (* reserved9)(void);
|
||||
};
|
||||
|
||||
/**
|
||||
* Remove a reference to the libdecor instance. When the reference count
|
||||
* reaches zero, it is freed.
|
||||
*/
|
||||
void
|
||||
libdecor_unref(struct libdecor *context);
|
||||
|
||||
/**
|
||||
* Create a new libdecor context for the given wl_display.
|
||||
*/
|
||||
struct libdecor *
|
||||
libdecor_new(struct wl_display *display,
|
||||
struct libdecor_interface *iface);
|
||||
|
||||
/**
|
||||
* Get the file descriptor used by libdecor. This is similar to
|
||||
* wl_display_get_fd(), thus should be polled, and when data is available,
|
||||
* libdecor_dispatch() should be called.
|
||||
*/
|
||||
int
|
||||
libdecor_get_fd(struct libdecor *context);
|
||||
|
||||
/**
|
||||
* Dispatch events. This function should be called when data is available on
|
||||
* the file descriptor returned by libdecor_get_fd(). If timeout is zero, this
|
||||
* function will never block.
|
||||
*/
|
||||
int
|
||||
libdecor_dispatch(struct libdecor *context,
|
||||
int timeout);
|
||||
|
||||
/**
|
||||
* Decorate the given content wl_surface.
|
||||
*
|
||||
* This will create an xdg_surface and an xdg_toplevel, and integrate it
|
||||
* properly with the windowing system, including creating appropriate
|
||||
* decorations when needed, as well as handle windowing integration events such
|
||||
* as resizing, moving, maximizing, etc.
|
||||
*
|
||||
* The passed wl_surface should only contain actual application content,
|
||||
* without any window decoration.
|
||||
*/
|
||||
struct libdecor_frame *
|
||||
libdecor_decorate(struct libdecor *context,
|
||||
struct wl_surface *surface,
|
||||
struct libdecor_frame_interface *iface,
|
||||
void *user_data);
|
||||
|
||||
/**
|
||||
* Add a reference to the frame object.
|
||||
*/
|
||||
void
|
||||
libdecor_frame_ref(struct libdecor_frame *frame);
|
||||
|
||||
/**
|
||||
* Remove a reference to the frame object. When the reference count reaches
|
||||
* zero, the frame object is destroyed.
|
||||
*/
|
||||
void
|
||||
libdecor_frame_unref(struct libdecor_frame *frame);
|
||||
|
||||
/**
|
||||
* Set the visibility of the frame.
|
||||
*
|
||||
* If an application wants to be borderless, it can set the frame visibility to
|
||||
* false.
|
||||
*/
|
||||
void
|
||||
libdecor_frame_set_visibility(struct libdecor_frame *frame,
|
||||
bool visible);
|
||||
|
||||
/**
|
||||
* Get the visibility of the frame.
|
||||
*/
|
||||
bool
|
||||
libdecor_frame_is_visible(struct libdecor_frame *frame);
|
||||
|
||||
|
||||
/**
|
||||
* Set the parent of the window.
|
||||
*
|
||||
* This can be used to stack multiple toplevel windows above or under each
|
||||
* other.
|
||||
*/
|
||||
void
|
||||
libdecor_frame_set_parent(struct libdecor_frame *frame,
|
||||
struct libdecor_frame *parent);
|
||||
|
||||
/**
|
||||
* Set the title of the window.
|
||||
*/
|
||||
void
|
||||
libdecor_frame_set_title(struct libdecor_frame *frame,
|
||||
const char *title);
|
||||
|
||||
/**
|
||||
* Get the title of the window.
|
||||
*/
|
||||
const char *
|
||||
libdecor_frame_get_title(struct libdecor_frame *frame);
|
||||
|
||||
/**
|
||||
* Set the application ID of the window.
|
||||
*/
|
||||
void
|
||||
libdecor_frame_set_app_id(struct libdecor_frame *frame,
|
||||
const char *app_id);
|
||||
|
||||
/**
|
||||
* Set new capabilities of the window.
|
||||
*
|
||||
* This determines whether e.g. a window decoration should show a maximize
|
||||
* button, etc.
|
||||
*
|
||||
* Setting a capability does not implicitly unset any other.
|
||||
*/
|
||||
void
|
||||
libdecor_frame_set_capabilities(struct libdecor_frame *frame,
|
||||
enum libdecor_capabilities capabilities);
|
||||
|
||||
/**
|
||||
* Unset capabilities of the window.
|
||||
*
|
||||
* The opposite of libdecor_frame_set_capabilities.
|
||||
*/
|
||||
void
|
||||
libdecor_frame_unset_capabilities(struct libdecor_frame *frame,
|
||||
enum libdecor_capabilities capabilities);
|
||||
|
||||
/**
|
||||
* Check whether the window has any of the given capabilities.
|
||||
*/
|
||||
bool
|
||||
libdecor_frame_has_capability(struct libdecor_frame *frame,
|
||||
enum libdecor_capabilities capability);
|
||||
|
||||
/**
|
||||
* Show the window menu.
|
||||
*/
|
||||
void
|
||||
libdecor_frame_show_window_menu(struct libdecor_frame *frame,
|
||||
struct wl_seat *wl_seat,
|
||||
uint32_t serial,
|
||||
int x,
|
||||
int y);
|
||||
|
||||
/**
|
||||
* Issue a popup grab on the window. Call this when a xdg_popup is mapped, so
|
||||
* that it can be properly dismissed by the decorations.
|
||||
*/
|
||||
void
|
||||
libdecor_frame_popup_grab(struct libdecor_frame *frame,
|
||||
const char *seat_name);
|
||||
|
||||
/**
|
||||
* Release the popup grab. Call this when you unmap a popup.
|
||||
*/
|
||||
void
|
||||
libdecor_frame_popup_ungrab(struct libdecor_frame *frame,
|
||||
const char *seat_name);
|
||||
|
||||
/**
|
||||
* Translate content surface local coordinates to toplevel window local
|
||||
* coordinates.
|
||||
*
|
||||
* This can be used to translate surface coordinates to coordinates useful for
|
||||
* e.g. showing the window menu, or positioning a popup.
|
||||
*/
|
||||
void
|
||||
libdecor_frame_translate_coordinate(struct libdecor_frame *frame,
|
||||
int surface_x,
|
||||
int surface_y,
|
||||
int *frame_x,
|
||||
int *frame_y);
|
||||
|
||||
/**
|
||||
* Set the min content size.
|
||||
*
|
||||
* This translates roughly to xdg_toplevel_set_min_size().
|
||||
*/
|
||||
void
|
||||
libdecor_frame_set_min_content_size(struct libdecor_frame *frame,
|
||||
int content_width,
|
||||
int content_height);
|
||||
|
||||
/**
|
||||
* Set the max content size.
|
||||
*
|
||||
* This translates roughly to xdg_toplevel_set_max_size().
|
||||
*/
|
||||
void
|
||||
libdecor_frame_set_max_content_size(struct libdecor_frame *frame,
|
||||
int content_width,
|
||||
int content_height);
|
||||
|
||||
/**
|
||||
* Initiate an interactive resize.
|
||||
*
|
||||
* This roughly translates to xdg_toplevel_resize().
|
||||
*/
|
||||
void
|
||||
libdecor_frame_resize(struct libdecor_frame *frame,
|
||||
struct wl_seat *wl_seat,
|
||||
uint32_t serial,
|
||||
enum libdecor_resize_edge edge);
|
||||
|
||||
/**
|
||||
* Initiate an interactive move.
|
||||
*
|
||||
* This roughly translates to xdg_toplevel_move().
|
||||
*/
|
||||
void
|
||||
libdecor_frame_move(struct libdecor_frame *frame,
|
||||
struct wl_seat *wl_seat,
|
||||
uint32_t serial);
|
||||
|
||||
/**
|
||||
* Commit a new window state. This can be called on application driven resizes
|
||||
* when the window is floating, or in response to received configurations, i.e.
|
||||
* from e.g. interactive resizes or state changes.
|
||||
*/
|
||||
void
|
||||
libdecor_frame_commit(struct libdecor_frame *frame,
|
||||
struct libdecor_state *state,
|
||||
struct libdecor_configuration *configuration);
|
||||
|
||||
/**
|
||||
* Minimize the window.
|
||||
*
|
||||
* Roughly translates to xdg_toplevel_set_minimized().
|
||||
*/
|
||||
void
|
||||
libdecor_frame_set_minimized(struct libdecor_frame *frame);
|
||||
|
||||
/**
|
||||
* Maximize the window.
|
||||
*
|
||||
* Roughly translates to xdg_toplevel_set_maximized().
|
||||
*/
|
||||
void
|
||||
libdecor_frame_set_maximized(struct libdecor_frame *frame);
|
||||
|
||||
/**
|
||||
* Unmaximize the window.
|
||||
*
|
||||
* Roughly translates to xdg_toplevel_unset_maximized().
|
||||
*/
|
||||
void
|
||||
libdecor_frame_unset_maximized(struct libdecor_frame *frame);
|
||||
|
||||
/**
|
||||
* Fullscreen the window.
|
||||
*
|
||||
* Roughly translates to xdg_toplevel_set_fullscreen().
|
||||
*/
|
||||
void
|
||||
libdecor_frame_set_fullscreen(struct libdecor_frame *frame,
|
||||
struct wl_output *output);
|
||||
|
||||
/**
|
||||
* Unfullscreen the window.
|
||||
*
|
||||
* Roughly translates to xdg_toplevel_unset_unfullscreen().
|
||||
*/
|
||||
void
|
||||
libdecor_frame_unset_fullscreen(struct libdecor_frame *frame);
|
||||
|
||||
/**
|
||||
* Return true if the window is floating.
|
||||
*
|
||||
* A window is floating when it's not maximized, tiled, fullscreen, or in any
|
||||
* similar way with a fixed size and state.
|
||||
* Note that this function uses the "applied" configuration. If this function
|
||||
* is used in the 'configure' callback, the provided configuration has to be
|
||||
* applied via 'libdecor_frame_commit' first, before it will reflect the current
|
||||
* window state from the provided configuration.
|
||||
*/
|
||||
bool
|
||||
libdecor_frame_is_floating(struct libdecor_frame *frame);
|
||||
|
||||
/**
|
||||
* Close the window.
|
||||
*
|
||||
* Roughly translates to xdg_toplevel_close().
|
||||
*/
|
||||
void
|
||||
libdecor_frame_close(struct libdecor_frame *frame);
|
||||
|
||||
/**
|
||||
* Map the window.
|
||||
*
|
||||
* This will eventually result in the initial configure event.
|
||||
*/
|
||||
void
|
||||
libdecor_frame_map(struct libdecor_frame *frame);
|
||||
|
||||
/**
|
||||
* Get the associated xdg_surface for content wl_surface.
|
||||
*/
|
||||
struct xdg_surface *
|
||||
libdecor_frame_get_xdg_surface(struct libdecor_frame *frame);
|
||||
|
||||
/**
|
||||
* Get the associated xdg_toplevel for the content wl_surface.
|
||||
*/
|
||||
struct xdg_toplevel *
|
||||
libdecor_frame_get_xdg_toplevel(struct libdecor_frame *frame);
|
||||
|
||||
/**
|
||||
* Create a new content surface state.
|
||||
*/
|
||||
struct libdecor_state *
|
||||
libdecor_state_new(int width,
|
||||
int height);
|
||||
|
||||
/**
|
||||
* Free a content surface state.
|
||||
*/
|
||||
void
|
||||
libdecor_state_free(struct libdecor_state *state);
|
||||
|
||||
/**
|
||||
* Get the expected size of the content for this configuration.
|
||||
*
|
||||
* If the configuration doesn't contain a size, false is returned.
|
||||
*/
|
||||
bool
|
||||
libdecor_configuration_get_content_size(struct libdecor_configuration *configuration,
|
||||
struct libdecor_frame *frame,
|
||||
int *width,
|
||||
int *height);
|
||||
|
||||
/**
|
||||
* Get the window state for this configuration.
|
||||
*
|
||||
* If the configuration doesn't contain any associated window state, false is
|
||||
* returned, and the application should assume the window state remains
|
||||
* unchanged.
|
||||
*/
|
||||
bool
|
||||
libdecor_configuration_get_window_state(struct libdecor_configuration *configuration,
|
||||
enum libdecor_window_state *window_state);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* LIBDECOR_H */
|
||||
@ -0,0 +1,292 @@
|
||||
/*
|
||||
* Copyright © 2008 Kristian Høgsberg
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the
|
||||
* next paragraph) shall be included in all copies or substantial
|
||||
* portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef WAYLAND_CLIENT_CORE_H
|
||||
#define WAYLAND_CLIENT_CORE_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include "wayland-util.h"
|
||||
#include "wayland-version.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/** \class wl_proxy
|
||||
*
|
||||
* \brief Represents a protocol object on the client side.
|
||||
*
|
||||
* A wl_proxy acts as a client side proxy to an object existing in the
|
||||
* compositor. The proxy is responsible for converting requests made by the
|
||||
* clients with \ref wl_proxy_marshal() into Wayland's wire format. Events
|
||||
* coming from the compositor are also handled by the proxy, which will in
|
||||
* turn call the handler set with \ref wl_proxy_add_listener().
|
||||
*
|
||||
* \note With the exception of function \ref wl_proxy_set_queue(), functions
|
||||
* accessing a wl_proxy are not normally used by client code. Clients
|
||||
* should normally use the higher level interface generated by the scanner to
|
||||
* interact with compositor objects.
|
||||
*
|
||||
*/
|
||||
struct wl_proxy;
|
||||
|
||||
/** \class wl_display
|
||||
*
|
||||
* \brief Represents a connection to the compositor and acts as a proxy to
|
||||
* the wl_display singleton object.
|
||||
*
|
||||
* A wl_display object represents a client connection to a Wayland
|
||||
* compositor. It is created with either \ref wl_display_connect() or
|
||||
* \ref wl_display_connect_to_fd(). A connection is terminated using
|
||||
* \ref wl_display_disconnect().
|
||||
*
|
||||
* A wl_display is also used as the \ref wl_proxy for the wl_display
|
||||
* singleton object on the compositor side.
|
||||
*
|
||||
* A wl_display object handles all the data sent from and to the
|
||||
* compositor. When a \ref wl_proxy marshals a request, it will write its wire
|
||||
* representation to the display's write buffer. The data is sent to the
|
||||
* compositor when the client calls \ref wl_display_flush().
|
||||
*
|
||||
* Incoming data is handled in two steps: queueing and dispatching. In the
|
||||
* queue step, the data coming from the display fd is interpreted and
|
||||
* added to a queue. On the dispatch step, the handler for the incoming
|
||||
* event set by the client on the corresponding \ref wl_proxy is called.
|
||||
*
|
||||
* A wl_display has at least one event queue, called the <em>default
|
||||
* queue</em>. Clients can create additional event queues with \ref
|
||||
* wl_display_create_queue() and assign \ref wl_proxy's to it. Events
|
||||
* occurring in a particular proxy are always queued in its assigned queue.
|
||||
* A client can ensure that a certain assumption, such as holding a lock
|
||||
* or running from a given thread, is true when a proxy event handler is
|
||||
* called by assigning that proxy to an event queue and making sure that
|
||||
* this queue is only dispatched when the assumption holds.
|
||||
*
|
||||
* The default queue is dispatched by calling \ref wl_display_dispatch().
|
||||
* This will dispatch any events queued on the default queue and attempt
|
||||
* to read from the display fd if it's empty. Events read are then queued
|
||||
* on the appropriate queues according to the proxy assignment.
|
||||
*
|
||||
* A user created queue is dispatched with \ref wl_display_dispatch_queue().
|
||||
* This function behaves exactly the same as wl_display_dispatch()
|
||||
* but it dispatches given queue instead of the default queue.
|
||||
*
|
||||
* A real world example of event queue usage is Mesa's implementation of
|
||||
* eglSwapBuffers() for the Wayland platform. This function might need
|
||||
* to block until a frame callback is received, but dispatching the default
|
||||
* queue could cause an event handler on the client to start drawing
|
||||
* again. This problem is solved using another event queue, so that only
|
||||
* the events handled by the EGL code are dispatched during the block.
|
||||
*
|
||||
* This creates a problem where a thread dispatches a non-default
|
||||
* queue, reading all the data from the display fd. If the application
|
||||
* would call \em poll(2) after that it would block, even though there
|
||||
* might be events queued on the default queue. Those events should be
|
||||
* dispatched with \ref wl_display_dispatch_pending() or \ref
|
||||
* wl_display_dispatch_queue_pending() before flushing and blocking.
|
||||
*/
|
||||
struct wl_display;
|
||||
|
||||
/** \class wl_event_queue
|
||||
*
|
||||
* \brief A queue for \ref wl_proxy object events.
|
||||
*
|
||||
* Event queues allows the events on a display to be handled in a thread-safe
|
||||
* manner. See \ref wl_display for details.
|
||||
*
|
||||
*/
|
||||
struct wl_event_queue;
|
||||
|
||||
/** Destroy proxy after marshalling
|
||||
* @ingroup wl_proxy
|
||||
*/
|
||||
#define WL_MARSHAL_FLAG_DESTROY (1 << 0)
|
||||
|
||||
void
|
||||
wl_event_queue_destroy(struct wl_event_queue *queue);
|
||||
|
||||
struct wl_proxy *
|
||||
wl_proxy_marshal_flags(struct wl_proxy *proxy, uint32_t opcode,
|
||||
const struct wl_interface *interface,
|
||||
uint32_t version,
|
||||
uint32_t flags, ...);
|
||||
|
||||
struct wl_proxy *
|
||||
wl_proxy_marshal_array_flags(struct wl_proxy *proxy, uint32_t opcode,
|
||||
const struct wl_interface *interface,
|
||||
uint32_t version,
|
||||
uint32_t flags,
|
||||
union wl_argument *args);
|
||||
|
||||
void
|
||||
wl_proxy_marshal(struct wl_proxy *p, uint32_t opcode, ...);
|
||||
|
||||
void
|
||||
wl_proxy_marshal_array(struct wl_proxy *p, uint32_t opcode,
|
||||
union wl_argument *args);
|
||||
|
||||
struct wl_proxy *
|
||||
wl_proxy_create(struct wl_proxy *factory,
|
||||
const struct wl_interface *interface);
|
||||
|
||||
void *
|
||||
wl_proxy_create_wrapper(void *proxy);
|
||||
|
||||
void
|
||||
wl_proxy_wrapper_destroy(void *proxy_wrapper);
|
||||
|
||||
struct wl_proxy *
|
||||
wl_proxy_marshal_constructor(struct wl_proxy *proxy,
|
||||
uint32_t opcode,
|
||||
const struct wl_interface *interface,
|
||||
...);
|
||||
|
||||
struct wl_proxy *
|
||||
wl_proxy_marshal_constructor_versioned(struct wl_proxy *proxy,
|
||||
uint32_t opcode,
|
||||
const struct wl_interface *interface,
|
||||
uint32_t version,
|
||||
...);
|
||||
|
||||
struct wl_proxy *
|
||||
wl_proxy_marshal_array_constructor(struct wl_proxy *proxy,
|
||||
uint32_t opcode, union wl_argument *args,
|
||||
const struct wl_interface *interface);
|
||||
|
||||
struct wl_proxy *
|
||||
wl_proxy_marshal_array_constructor_versioned(struct wl_proxy *proxy,
|
||||
uint32_t opcode,
|
||||
union wl_argument *args,
|
||||
const struct wl_interface *interface,
|
||||
uint32_t version);
|
||||
|
||||
void
|
||||
wl_proxy_destroy(struct wl_proxy *proxy);
|
||||
|
||||
int
|
||||
wl_proxy_add_listener(struct wl_proxy *proxy,
|
||||
void (**implementation)(void), void *data);
|
||||
|
||||
const void *
|
||||
wl_proxy_get_listener(struct wl_proxy *proxy);
|
||||
|
||||
int
|
||||
wl_proxy_add_dispatcher(struct wl_proxy *proxy,
|
||||
wl_dispatcher_func_t dispatcher_func,
|
||||
const void * dispatcher_data, void *data);
|
||||
|
||||
void
|
||||
wl_proxy_set_user_data(struct wl_proxy *proxy, void *user_data);
|
||||
|
||||
void *
|
||||
wl_proxy_get_user_data(struct wl_proxy *proxy);
|
||||
|
||||
uint32_t
|
||||
wl_proxy_get_version(struct wl_proxy *proxy);
|
||||
|
||||
uint32_t
|
||||
wl_proxy_get_id(struct wl_proxy *proxy);
|
||||
|
||||
void
|
||||
wl_proxy_set_tag(struct wl_proxy *proxy,
|
||||
const char * const *tag);
|
||||
|
||||
const char * const *
|
||||
wl_proxy_get_tag(struct wl_proxy *proxy);
|
||||
|
||||
const char *
|
||||
wl_proxy_get_class(struct wl_proxy *proxy);
|
||||
|
||||
void
|
||||
wl_proxy_set_queue(struct wl_proxy *proxy, struct wl_event_queue *queue);
|
||||
|
||||
struct wl_display *
|
||||
wl_display_connect(const char *name);
|
||||
|
||||
struct wl_display *
|
||||
wl_display_connect_to_fd(int fd);
|
||||
|
||||
void
|
||||
wl_display_disconnect(struct wl_display *display);
|
||||
|
||||
int
|
||||
wl_display_get_fd(struct wl_display *display);
|
||||
|
||||
int
|
||||
wl_display_dispatch(struct wl_display *display);
|
||||
|
||||
int
|
||||
wl_display_dispatch_queue(struct wl_display *display,
|
||||
struct wl_event_queue *queue);
|
||||
|
||||
int
|
||||
wl_display_dispatch_queue_pending(struct wl_display *display,
|
||||
struct wl_event_queue *queue);
|
||||
|
||||
int
|
||||
wl_display_dispatch_pending(struct wl_display *display);
|
||||
|
||||
int
|
||||
wl_display_get_error(struct wl_display *display);
|
||||
|
||||
uint32_t
|
||||
wl_display_get_protocol_error(struct wl_display *display,
|
||||
const struct wl_interface **interface,
|
||||
uint32_t *id);
|
||||
|
||||
int
|
||||
wl_display_flush(struct wl_display *display);
|
||||
|
||||
int
|
||||
wl_display_roundtrip_queue(struct wl_display *display,
|
||||
struct wl_event_queue *queue);
|
||||
|
||||
int
|
||||
wl_display_roundtrip(struct wl_display *display);
|
||||
|
||||
struct wl_event_queue *
|
||||
wl_display_create_queue(struct wl_display *display);
|
||||
|
||||
int
|
||||
wl_display_prepare_read_queue(struct wl_display *display,
|
||||
struct wl_event_queue *queue);
|
||||
|
||||
int
|
||||
wl_display_prepare_read(struct wl_display *display);
|
||||
|
||||
void
|
||||
wl_display_cancel_read(struct wl_display *display);
|
||||
|
||||
int
|
||||
wl_display_read_events(struct wl_display *display);
|
||||
|
||||
void
|
||||
wl_log_set_handler_client(wl_log_func_t handler);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,42 @@
|
||||
/*
|
||||
* Copyright © 2008 Kristian Høgsberg
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the
|
||||
* next paragraph) shall be included in all copies or substantial
|
||||
* portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
/** \file
|
||||
*
|
||||
* \brief Include the client API and protocol C API.
|
||||
*
|
||||
* \warning Use of this header file is discouraged. Prefer including
|
||||
* wayland-client-core.h instead, which does not include the
|
||||
* client protocol header and as such only defines the library
|
||||
* API.
|
||||
*/
|
||||
|
||||
#ifndef WAYLAND_CLIENT_H
|
||||
#define WAYLAND_CLIENT_H
|
||||
|
||||
#include "wayland-client-core.h"
|
||||
#include "wayland-client-protocol.h"
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,59 @@
|
||||
/*
|
||||
* Copyright © 2011 Kristian Høgsberg
|
||||
* Copyright © 2011 Benjamin Franzke
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the
|
||||
* next paragraph) shall be included in all copies or substantial
|
||||
* portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef WAYLAND_EGL_CORE_H
|
||||
#define WAYLAND_EGL_CORE_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define WL_EGL_PLATFORM 1
|
||||
|
||||
struct wl_egl_window;
|
||||
struct wl_surface;
|
||||
|
||||
struct wl_egl_window *
|
||||
wl_egl_window_create(struct wl_surface *surface,
|
||||
int width, int height);
|
||||
|
||||
void
|
||||
wl_egl_window_destroy(struct wl_egl_window *egl_window);
|
||||
|
||||
void
|
||||
wl_egl_window_resize(struct wl_egl_window *egl_window,
|
||||
int width, int height,
|
||||
int dx, int dy);
|
||||
|
||||
void
|
||||
wl_egl_window_get_attached_size(struct wl_egl_window *egl_window,
|
||||
int *width, int *height);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,765 @@
|
||||
/*
|
||||
* Copyright © 2008 Kristian Høgsberg
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the
|
||||
* next paragraph) shall be included in all copies or substantial
|
||||
* portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
/** \file wayland-util.h
|
||||
*
|
||||
* \brief Utility classes, functions, and macros.
|
||||
*/
|
||||
|
||||
#ifndef WAYLAND_UTIL_H
|
||||
#define WAYLAND_UTIL_H
|
||||
|
||||
#include <math.h>
|
||||
#include <stddef.h>
|
||||
#include <inttypes.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/** Visibility attribute */
|
||||
#if defined(__GNUC__) && __GNUC__ >= 4
|
||||
#define WL_EXPORT __attribute__ ((visibility("default")))
|
||||
#else
|
||||
#define WL_EXPORT
|
||||
#endif
|
||||
|
||||
/** Deprecated attribute */
|
||||
#if defined(__GNUC__) && __GNUC__ >= 4
|
||||
#define WL_DEPRECATED __attribute__ ((deprecated))
|
||||
#else
|
||||
#define WL_DEPRECATED
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Printf-style argument attribute
|
||||
*
|
||||
* \param x Ordinality of the format string argument
|
||||
* \param y Ordinality of the argument to check against the format string
|
||||
*
|
||||
* \sa https://gcc.gnu.org/onlinedocs/gcc-3.2.1/gcc/Function-Attributes.html
|
||||
*/
|
||||
#if defined(__GNUC__) && __GNUC__ >= 4
|
||||
#define WL_PRINTF(x, y) __attribute__((__format__(__printf__, x, y)))
|
||||
#else
|
||||
#define WL_PRINTF(x, y)
|
||||
#endif
|
||||
|
||||
/** \class wl_object
|
||||
*
|
||||
* \brief A protocol object.
|
||||
*
|
||||
* A `wl_object` is an opaque struct identifying the protocol object
|
||||
* underlying a `wl_proxy` or `wl_resource`.
|
||||
*
|
||||
* \note Functions accessing a `wl_object` are not normally used by client code.
|
||||
* Clients should normally use the higher level interface generated by the
|
||||
* scanner to interact with compositor objects.
|
||||
*
|
||||
*/
|
||||
struct wl_object;
|
||||
|
||||
/**
|
||||
* Protocol message signature
|
||||
*
|
||||
* A wl_message describes the signature of an actual protocol message, such as a
|
||||
* request or event, that adheres to the Wayland protocol wire format. The
|
||||
* protocol implementation uses a wl_message within its demarshal machinery for
|
||||
* decoding messages between a compositor and its clients. In a sense, a
|
||||
* wl_message is to a protocol message like a class is to an object.
|
||||
*
|
||||
* The `name` of a wl_message is the name of the corresponding protocol message.
|
||||
*
|
||||
* The `signature` is an ordered list of symbols representing the data types
|
||||
* of message arguments and, optionally, a protocol version and indicators for
|
||||
* nullability. A leading integer in the `signature` indicates the _since_
|
||||
* version of the protocol message. A `?` preceding a data type symbol indicates
|
||||
* that the following argument type is nullable. While it is a protocol violation
|
||||
* to send messages with non-nullable arguments set to `NULL`, event handlers in
|
||||
* clients might still get called with non-nullable object arguments set to
|
||||
* `NULL`. This can happen when the client destroyed the object being used as
|
||||
* argument on its side and an event referencing that object was sent before the
|
||||
* server knew about its destruction. As this race cannot be prevented, clients
|
||||
* should - as a general rule - program their event handlers such that they can
|
||||
* handle object arguments declared non-nullable being `NULL` gracefully.
|
||||
*
|
||||
* When no arguments accompany a message, `signature` is an empty string.
|
||||
*
|
||||
* Symbols:
|
||||
*
|
||||
* * `i`: int
|
||||
* * `u`: uint
|
||||
* * `f`: fixed
|
||||
* * `s`: string
|
||||
* * `o`: object
|
||||
* * `n`: new_id
|
||||
* * `a`: array
|
||||
* * `h`: fd
|
||||
* * `?`: following argument is nullable
|
||||
*
|
||||
* While demarshaling primitive arguments is straightforward, when demarshaling
|
||||
* messages containing `object` or `new_id` arguments, the protocol
|
||||
* implementation often must determine the type of the object. The `types` of a
|
||||
* wl_message is an array of wl_interface references that correspond to `o` and
|
||||
* `n` arguments in `signature`, with `NULL` placeholders for arguments with
|
||||
* non-object types.
|
||||
*
|
||||
* Consider the protocol event wl_display `delete_id` that has a single `uint`
|
||||
* argument. The wl_message is:
|
||||
*
|
||||
* \code
|
||||
* { "delete_id", "u", [NULL] }
|
||||
* \endcode
|
||||
*
|
||||
* Here, the message `name` is `"delete_id"`, the `signature` is `"u"`, and the
|
||||
* argument `types` is `[NULL]`, indicating that the `uint` argument has no
|
||||
* corresponding wl_interface since it is a primitive argument.
|
||||
*
|
||||
* In contrast, consider a `wl_foo` interface supporting protocol request `bar`
|
||||
* that has existed since version 2, and has two arguments: a `uint` and an
|
||||
* object of type `wl_baz_interface` that may be `NULL`. Such a `wl_message`
|
||||
* might be:
|
||||
*
|
||||
* \code
|
||||
* { "bar", "2u?o", [NULL, &wl_baz_interface] }
|
||||
* \endcode
|
||||
*
|
||||
* Here, the message `name` is `"bar"`, and the `signature` is `"2u?o"`. Notice
|
||||
* how the `2` indicates the protocol version, the `u` indicates the first
|
||||
* argument type is `uint`, and the `?o` indicates that the second argument
|
||||
* is an object that may be `NULL`. Lastly, the argument `types` array indicates
|
||||
* that no wl_interface corresponds to the first argument, while the type
|
||||
* `wl_baz_interface` corresponds to the second argument.
|
||||
*
|
||||
* \sa wl_argument
|
||||
* \sa wl_interface
|
||||
* \sa <a href="https://wayland.freedesktop.org/docs/html/ch04.html#sect-Protocol-Wire-Format">Wire Format</a>
|
||||
*/
|
||||
struct wl_message {
|
||||
/** Message name */
|
||||
const char *name;
|
||||
/** Message signature */
|
||||
const char *signature;
|
||||
/** Object argument interfaces */
|
||||
const struct wl_interface **types;
|
||||
};
|
||||
|
||||
/**
|
||||
* Protocol object interface
|
||||
*
|
||||
* A wl_interface describes the API of a protocol object defined in the Wayland
|
||||
* protocol specification. The protocol implementation uses a wl_interface
|
||||
* within its marshalling machinery for encoding client requests.
|
||||
*
|
||||
* The `name` of a wl_interface is the name of the corresponding protocol
|
||||
* interface, and `version` represents the version of the interface. The members
|
||||
* `method_count` and `event_count` represent the number of `methods` (requests)
|
||||
* and `events` in the respective wl_message members.
|
||||
*
|
||||
* For example, consider a protocol interface `foo`, marked as version `1`, with
|
||||
* two requests and one event.
|
||||
*
|
||||
* \code{.xml}
|
||||
* <interface name="foo" version="1">
|
||||
* <request name="a"></request>
|
||||
* <request name="b"></request>
|
||||
* <event name="c"></event>
|
||||
* </interface>
|
||||
* \endcode
|
||||
*
|
||||
* Given two wl_message arrays `foo_requests` and `foo_events`, a wl_interface
|
||||
* for `foo` might be:
|
||||
*
|
||||
* \code
|
||||
* struct wl_interface foo_interface = {
|
||||
* "foo", 1,
|
||||
* 2, foo_requests,
|
||||
* 1, foo_events
|
||||
* };
|
||||
* \endcode
|
||||
*
|
||||
* \note The server side of the protocol may define interface <em>implementation
|
||||
* types</em> that incorporate the term `interface` in their name. Take
|
||||
* care to not confuse these server-side `struct`s with a wl_interface
|
||||
* variable whose name also ends in `interface`. For example, while the
|
||||
* server may define a type `struct wl_foo_interface`, the client may
|
||||
* define a `struct wl_interface wl_foo_interface`.
|
||||
*
|
||||
* \sa wl_message
|
||||
* \sa wl_proxy
|
||||
* \sa <a href="https://wayland.freedesktop.org/docs/html/ch04.html#sect-Protocol-Interfaces">Interfaces</a>
|
||||
* \sa <a href="https://wayland.freedesktop.org/docs/html/ch04.html#sect-Protocol-Versioning">Versioning</a>
|
||||
*/
|
||||
struct wl_interface {
|
||||
/** Interface name */
|
||||
const char *name;
|
||||
/** Interface version */
|
||||
int version;
|
||||
/** Number of methods (requests) */
|
||||
int method_count;
|
||||
/** Method (request) signatures */
|
||||
const struct wl_message *methods;
|
||||
/** Number of events */
|
||||
int event_count;
|
||||
/** Event signatures */
|
||||
const struct wl_message *events;
|
||||
};
|
||||
|
||||
/** \class wl_list
|
||||
*
|
||||
* \brief Doubly-linked list
|
||||
*
|
||||
* On its own, an instance of `struct wl_list` represents the sentinel head of
|
||||
* a doubly-linked list, and must be initialized using wl_list_init().
|
||||
* When empty, the list head's `next` and `prev` members point to the list head
|
||||
* itself, otherwise `next` references the first element in the list, and `prev`
|
||||
* refers to the last element in the list.
|
||||
*
|
||||
* Use the `struct wl_list` type to represent both the list head and the links
|
||||
* between elements within the list. Use wl_list_empty() to determine if the
|
||||
* list is empty in O(1).
|
||||
*
|
||||
* All elements in the list must be of the same type. The element type must have
|
||||
* a `struct wl_list` member, often named `link` by convention. Prior to
|
||||
* insertion, there is no need to initialize an element's `link` - invoking
|
||||
* wl_list_init() on an individual list element's `struct wl_list` member is
|
||||
* unnecessary if the very next operation is wl_list_insert(). However, a
|
||||
* common idiom is to initialize an element's `link` prior to removal - ensure
|
||||
* safety by invoking wl_list_init() before wl_list_remove().
|
||||
*
|
||||
* Consider a list reference `struct wl_list foo_list`, an element type as
|
||||
* `struct element`, and an element's link member as `struct wl_list link`.
|
||||
*
|
||||
* The following code initializes a list and adds three elements to it.
|
||||
*
|
||||
* \code
|
||||
* struct wl_list foo_list;
|
||||
*
|
||||
* struct element {
|
||||
* int foo;
|
||||
* struct wl_list link;
|
||||
* };
|
||||
* struct element e1, e2, e3;
|
||||
*
|
||||
* wl_list_init(&foo_list);
|
||||
* wl_list_insert(&foo_list, &e1.link); // e1 is the first element
|
||||
* wl_list_insert(&foo_list, &e2.link); // e2 is now the first element
|
||||
* wl_list_insert(&e2.link, &e3.link); // insert e3 after e2
|
||||
* \endcode
|
||||
*
|
||||
* The list now looks like <em>[e2, e3, e1]</em>.
|
||||
*
|
||||
* The `wl_list` API provides some iterator macros. For example, to iterate
|
||||
* a list in ascending order:
|
||||
*
|
||||
* \code
|
||||
* struct element *e;
|
||||
* wl_list_for_each(e, foo_list, link) {
|
||||
* do_something_with_element(e);
|
||||
* }
|
||||
* \endcode
|
||||
*
|
||||
* See the documentation of each iterator for details.
|
||||
* \sa http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/linux/list.h
|
||||
*/
|
||||
struct wl_list {
|
||||
/** Previous list element */
|
||||
struct wl_list *prev;
|
||||
/** Next list element */
|
||||
struct wl_list *next;
|
||||
};
|
||||
|
||||
/**
|
||||
* Initializes the list.
|
||||
*
|
||||
* \param list List to initialize
|
||||
*
|
||||
* \memberof wl_list
|
||||
*/
|
||||
void
|
||||
wl_list_init(struct wl_list *list);
|
||||
|
||||
/**
|
||||
* Inserts an element into the list, after the element represented by \p list.
|
||||
* When \p list is a reference to the list itself (the head), set the containing
|
||||
* struct of \p elm as the first element in the list.
|
||||
*
|
||||
* \note If \p elm is already part of a list, inserting it again will lead to
|
||||
* list corruption.
|
||||
*
|
||||
* \param list List element after which the new element is inserted
|
||||
* \param elm Link of the containing struct to insert into the list
|
||||
*
|
||||
* \memberof wl_list
|
||||
*/
|
||||
void
|
||||
wl_list_insert(struct wl_list *list, struct wl_list *elm);
|
||||
|
||||
/**
|
||||
* Removes an element from the list.
|
||||
*
|
||||
* \note This operation leaves \p elm in an invalid state.
|
||||
*
|
||||
* \param elm Link of the containing struct to remove from the list
|
||||
*
|
||||
* \memberof wl_list
|
||||
*/
|
||||
void
|
||||
wl_list_remove(struct wl_list *elm);
|
||||
|
||||
/**
|
||||
* Determines the length of the list.
|
||||
*
|
||||
* \note This is an O(n) operation.
|
||||
*
|
||||
* \param list List whose length is to be determined
|
||||
*
|
||||
* \return Number of elements in the list
|
||||
*
|
||||
* \memberof wl_list
|
||||
*/
|
||||
int
|
||||
wl_list_length(const struct wl_list *list);
|
||||
|
||||
/**
|
||||
* Determines if the list is empty.
|
||||
*
|
||||
* \param list List whose emptiness is to be determined
|
||||
*
|
||||
* \return 1 if empty, or 0 if not empty
|
||||
*
|
||||
* \memberof wl_list
|
||||
*/
|
||||
int
|
||||
wl_list_empty(const struct wl_list *list);
|
||||
|
||||
/**
|
||||
* Inserts all of the elements of one list into another, after the element
|
||||
* represented by \p list.
|
||||
*
|
||||
* \note This leaves \p other in an invalid state.
|
||||
*
|
||||
* \param list List element after which the other list elements will be inserted
|
||||
* \param other List of elements to insert
|
||||
*
|
||||
* \memberof wl_list
|
||||
*/
|
||||
void
|
||||
wl_list_insert_list(struct wl_list *list, struct wl_list *other);
|
||||
|
||||
/**
|
||||
* Retrieves a pointer to a containing struct, given a member name.
|
||||
*
|
||||
* This macro allows "conversion" from a pointer to a member to its containing
|
||||
* struct. This is useful if you have a contained item like a wl_list,
|
||||
* wl_listener, or wl_signal, provided via a callback or other means, and would
|
||||
* like to retrieve the struct that contains it.
|
||||
*
|
||||
* To demonstrate, the following example retrieves a pointer to
|
||||
* `example_container` given only its `destroy_listener` member:
|
||||
*
|
||||
* \code
|
||||
* struct example_container {
|
||||
* struct wl_listener destroy_listener;
|
||||
* // other members...
|
||||
* };
|
||||
*
|
||||
* void example_container_destroy(struct wl_listener *listener, void *data)
|
||||
* {
|
||||
* struct example_container *ctr;
|
||||
*
|
||||
* ctr = wl_container_of(listener, ctr, destroy_listener);
|
||||
* // destroy ctr...
|
||||
* }
|
||||
* \endcode
|
||||
*
|
||||
* \note `sample` need not be a valid pointer. A null or uninitialised pointer
|
||||
* is sufficient.
|
||||
*
|
||||
* \param ptr Valid pointer to the contained member
|
||||
* \param sample Pointer to a struct whose type contains \p ptr
|
||||
* \param member Named location of \p ptr within the \p sample type
|
||||
*
|
||||
* \return The container for the specified pointer
|
||||
*/
|
||||
#define wl_container_of(ptr, sample, member) \
|
||||
(__typeof__(sample))((char *)(ptr) - \
|
||||
offsetof(__typeof__(*sample), member))
|
||||
|
||||
/**
|
||||
* Iterates over a list.
|
||||
*
|
||||
* This macro expresses a for-each iterator for wl_list. Given a list and
|
||||
* wl_list link member name (often named `link` by convention), this macro
|
||||
* assigns each element in the list to \p pos, which can then be referenced in
|
||||
* a trailing code block. For example, given a wl_list of `struct message`
|
||||
* elements:
|
||||
*
|
||||
* \code
|
||||
* struct message {
|
||||
* char *contents;
|
||||
* wl_list link;
|
||||
* };
|
||||
*
|
||||
* struct wl_list *message_list;
|
||||
* // Assume message_list now "contains" many messages
|
||||
*
|
||||
* struct message *m;
|
||||
* wl_list_for_each(m, message_list, link) {
|
||||
* do_something_with_message(m);
|
||||
* }
|
||||
* \endcode
|
||||
*
|
||||
* \param pos Cursor that each list element will be assigned to
|
||||
* \param head Head of the list to iterate over
|
||||
* \param member Name of the link member within the element struct
|
||||
*
|
||||
* \relates wl_list
|
||||
*/
|
||||
#define wl_list_for_each(pos, head, member) \
|
||||
for (pos = wl_container_of((head)->next, pos, member); \
|
||||
&pos->member != (head); \
|
||||
pos = wl_container_of(pos->member.next, pos, member))
|
||||
|
||||
/**
|
||||
* Iterates over a list, safe against removal of the list element.
|
||||
*
|
||||
* \note Only removal of the current element, \p pos, is safe. Removing
|
||||
* any other element during traversal may lead to a loop malfunction.
|
||||
*
|
||||
* \sa wl_list_for_each()
|
||||
*
|
||||
* \param pos Cursor that each list element will be assigned to
|
||||
* \param tmp Temporary pointer of the same type as \p pos
|
||||
* \param head Head of the list to iterate over
|
||||
* \param member Name of the link member within the element struct
|
||||
*
|
||||
* \relates wl_list
|
||||
*/
|
||||
#define wl_list_for_each_safe(pos, tmp, head, member) \
|
||||
for (pos = wl_container_of((head)->next, pos, member), \
|
||||
tmp = wl_container_of((pos)->member.next, tmp, member); \
|
||||
&pos->member != (head); \
|
||||
pos = tmp, \
|
||||
tmp = wl_container_of(pos->member.next, tmp, member))
|
||||
|
||||
/**
|
||||
* Iterates backwards over a list.
|
||||
*
|
||||
* \sa wl_list_for_each()
|
||||
*
|
||||
* \param pos Cursor that each list element will be assigned to
|
||||
* \param head Head of the list to iterate over
|
||||
* \param member Name of the link member within the element struct
|
||||
*
|
||||
* \relates wl_list
|
||||
*/
|
||||
#define wl_list_for_each_reverse(pos, head, member) \
|
||||
for (pos = wl_container_of((head)->prev, pos, member); \
|
||||
&pos->member != (head); \
|
||||
pos = wl_container_of(pos->member.prev, pos, member))
|
||||
|
||||
/**
|
||||
* Iterates backwards over a list, safe against removal of the list element.
|
||||
*
|
||||
* \note Only removal of the current element, \p pos, is safe. Removing
|
||||
* any other element during traversal may lead to a loop malfunction.
|
||||
*
|
||||
* \sa wl_list_for_each()
|
||||
*
|
||||
* \param pos Cursor that each list element will be assigned to
|
||||
* \param tmp Temporary pointer of the same type as \p pos
|
||||
* \param head Head of the list to iterate over
|
||||
* \param member Name of the link member within the element struct
|
||||
*
|
||||
* \relates wl_list
|
||||
*/
|
||||
#define wl_list_for_each_reverse_safe(pos, tmp, head, member) \
|
||||
for (pos = wl_container_of((head)->prev, pos, member), \
|
||||
tmp = wl_container_of((pos)->member.prev, tmp, member); \
|
||||
&pos->member != (head); \
|
||||
pos = tmp, \
|
||||
tmp = wl_container_of(pos->member.prev, tmp, member))
|
||||
|
||||
/**
|
||||
* \class wl_array
|
||||
*
|
||||
* Dynamic array
|
||||
*
|
||||
* A wl_array is a dynamic array that can only grow until released. It is
|
||||
* intended for relatively small allocations whose size is variable or not known
|
||||
* in advance. While construction of a wl_array does not require all elements to
|
||||
* be of the same size, wl_array_for_each() does require all elements to have
|
||||
* the same type and size.
|
||||
*
|
||||
*/
|
||||
struct wl_array {
|
||||
/** Array size */
|
||||
size_t size;
|
||||
/** Allocated space */
|
||||
size_t alloc;
|
||||
/** Array data */
|
||||
void *data;
|
||||
};
|
||||
|
||||
/**
|
||||
* Initializes the array.
|
||||
*
|
||||
* \param array Array to initialize
|
||||
*
|
||||
* \memberof wl_array
|
||||
*/
|
||||
void
|
||||
wl_array_init(struct wl_array *array);
|
||||
|
||||
/**
|
||||
* Releases the array data.
|
||||
*
|
||||
* \note Leaves the array in an invalid state.
|
||||
*
|
||||
* \param array Array whose data is to be released
|
||||
*
|
||||
* \memberof wl_array
|
||||
*/
|
||||
void
|
||||
wl_array_release(struct wl_array *array);
|
||||
|
||||
/**
|
||||
* Increases the size of the array by \p size bytes.
|
||||
*
|
||||
* \param array Array whose size is to be increased
|
||||
* \param size Number of bytes to increase the size of the array by
|
||||
*
|
||||
* \return A pointer to the beginning of the newly appended space, or NULL when
|
||||
* resizing fails.
|
||||
*
|
||||
* \memberof wl_array
|
||||
*/
|
||||
void *
|
||||
wl_array_add(struct wl_array *array, size_t size);
|
||||
|
||||
/**
|
||||
* Copies the contents of \p source to \p array.
|
||||
*
|
||||
* \param array Destination array to copy to
|
||||
* \param source Source array to copy from
|
||||
*
|
||||
* \return 0 on success, or -1 on failure
|
||||
*
|
||||
* \memberof wl_array
|
||||
*/
|
||||
int
|
||||
wl_array_copy(struct wl_array *array, struct wl_array *source);
|
||||
|
||||
/**
|
||||
* Iterates over an array.
|
||||
*
|
||||
* This macro expresses a for-each iterator for wl_array. It assigns each
|
||||
* element in the array to \p pos, which can then be referenced in a trailing
|
||||
* code block. \p pos must be a pointer to the array element type, and all
|
||||
* array elements must be of the same type and size.
|
||||
*
|
||||
* \param pos Cursor that each array element will be assigned to
|
||||
* \param array Array to iterate over
|
||||
*
|
||||
* \relates wl_array
|
||||
* \sa wl_list_for_each()
|
||||
*/
|
||||
#define wl_array_for_each(pos, array) \
|
||||
for (pos = (array)->data; \
|
||||
(const char *) pos < ((const char *) (array)->data + (array)->size); \
|
||||
(pos)++)
|
||||
|
||||
/**
|
||||
* Fixed-point number
|
||||
*
|
||||
* A `wl_fixed_t` is a 24.8 signed fixed-point number with a sign bit, 23 bits
|
||||
* of integer precision and 8 bits of decimal precision. Consider `wl_fixed_t`
|
||||
* as an opaque struct with methods that facilitate conversion to and from
|
||||
* `double` and `int` types.
|
||||
*/
|
||||
typedef int32_t wl_fixed_t;
|
||||
|
||||
/**
|
||||
* Converts a fixed-point number to a floating-point number.
|
||||
*
|
||||
* \param f Fixed-point number to convert
|
||||
*
|
||||
* \return Floating-point representation of the fixed-point argument
|
||||
*/
|
||||
static inline double
|
||||
wl_fixed_to_double(wl_fixed_t f)
|
||||
{
|
||||
union {
|
||||
double d;
|
||||
int64_t i;
|
||||
} u;
|
||||
|
||||
u.i = ((1023LL + 44LL) << 52) + (1LL << 51) + f;
|
||||
|
||||
return u.d - (3LL << 43);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a floating-point number to a fixed-point number.
|
||||
*
|
||||
* \param d Floating-point number to convert
|
||||
*
|
||||
* \return Fixed-point representation of the floating-point argument
|
||||
*/
|
||||
static inline wl_fixed_t
|
||||
wl_fixed_from_double(double d)
|
||||
{
|
||||
union {
|
||||
double d;
|
||||
int64_t i;
|
||||
} u;
|
||||
|
||||
u.d = d + (3LL << (51 - 8));
|
||||
|
||||
return (wl_fixed_t)u.i;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a fixed-point number to an integer.
|
||||
*
|
||||
* \param f Fixed-point number to convert
|
||||
*
|
||||
* \return Integer component of the fixed-point argument
|
||||
*/
|
||||
static inline int
|
||||
wl_fixed_to_int(wl_fixed_t f)
|
||||
{
|
||||
return f / 256;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts an integer to a fixed-point number.
|
||||
*
|
||||
* \param i Integer to convert
|
||||
*
|
||||
* \return Fixed-point representation of the integer argument
|
||||
*/
|
||||
static inline wl_fixed_t
|
||||
wl_fixed_from_int(int i)
|
||||
{
|
||||
return i * 256;
|
||||
}
|
||||
|
||||
/**
|
||||
* Protocol message argument data types
|
||||
*
|
||||
* This union represents all of the argument types in the Wayland protocol wire
|
||||
* format. The protocol implementation uses wl_argument within its marshalling
|
||||
* machinery for dispatching messages between a client and a compositor.
|
||||
*
|
||||
* \sa wl_message
|
||||
* \sa wl_interface
|
||||
* \sa <a href="https://wayland.freedesktop.org/docs/html/ch04.html#sect-Protocol-wire-Format">Wire Format</a>
|
||||
*/
|
||||
union wl_argument {
|
||||
int32_t i; /**< `int` */
|
||||
uint32_t u; /**< `uint` */
|
||||
wl_fixed_t f; /**< `fixed` */
|
||||
const char *s; /**< `string` */
|
||||
struct wl_object *o; /**< `object` */
|
||||
uint32_t n; /**< `new_id` */
|
||||
struct wl_array *a; /**< `array` */
|
||||
int32_t h; /**< `fd` */
|
||||
};
|
||||
|
||||
/**
|
||||
* Dispatcher function type alias
|
||||
*
|
||||
* A dispatcher is a function that handles the emitting of callbacks in client
|
||||
* code. For programs directly using the C library, this is done by using
|
||||
* libffi to call function pointers. When binding to languages other than C,
|
||||
* dispatchers provide a way to abstract the function calling process to be
|
||||
* friendlier to other function calling systems.
|
||||
*
|
||||
* A dispatcher takes five arguments: The first is the dispatcher-specific
|
||||
* implementation associated with the target object. The second is the object
|
||||
* upon which the callback is being invoked (either wl_proxy or wl_resource).
|
||||
* The third and fourth arguments are the opcode and the wl_message
|
||||
* corresponding to the callback. The final argument is an array of arguments
|
||||
* received from the other process via the wire protocol.
|
||||
*
|
||||
* \param "const void *" Dispatcher-specific implementation data
|
||||
* \param "void *" Callback invocation target (wl_proxy or `wl_resource`)
|
||||
* \param uint32_t Callback opcode
|
||||
* \param "const struct wl_message *" Callback message signature
|
||||
* \param "union wl_argument *" Array of received arguments
|
||||
*
|
||||
* \return 0 on success, or -1 on failure
|
||||
*/
|
||||
typedef int (*wl_dispatcher_func_t)(const void *, void *, uint32_t,
|
||||
const struct wl_message *,
|
||||
union wl_argument *);
|
||||
|
||||
/**
|
||||
* Log function type alias
|
||||
*
|
||||
* The C implementation of the Wayland protocol abstracts the details of
|
||||
* logging. Users may customize the logging behavior, with a function conforming
|
||||
* to the `wl_log_func_t` type, via `wl_log_set_handler_client` and
|
||||
* `wl_log_set_handler_server`.
|
||||
*
|
||||
* A `wl_log_func_t` must conform to the expectations of `vprintf`, and
|
||||
* expects two arguments: a string to write and a corresponding variable
|
||||
* argument list. While the string to write may contain format specifiers and
|
||||
* use values in the variable argument list, the behavior of any `wl_log_func_t`
|
||||
* depends on the implementation.
|
||||
*
|
||||
* \note Take care to not confuse this with `wl_protocol_logger_func_t`, which
|
||||
* is a specific server-side logger for requests and events.
|
||||
*
|
||||
* \param "const char *" String to write to the log, containing optional format
|
||||
* specifiers
|
||||
* \param "va_list" Variable argument list
|
||||
*
|
||||
* \sa wl_log_set_handler_client
|
||||
* \sa wl_log_set_handler_server
|
||||
*/
|
||||
typedef void (*wl_log_func_t)(const char *, va_list) WL_PRINTF(1, 0);
|
||||
|
||||
/**
|
||||
* Return value of an iterator function
|
||||
*
|
||||
* \sa wl_client_for_each_resource_iterator_func_t
|
||||
* \sa wl_client_for_each_resource
|
||||
*/
|
||||
enum wl_iterator_result {
|
||||
/** Stop the iteration */
|
||||
WL_ITERATOR_STOP,
|
||||
/** Continue the iteration */
|
||||
WL_ITERATOR_CONTINUE
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,34 @@
|
||||
/*
|
||||
* Copyright © 2012 Intel Corporation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the
|
||||
* next paragraph) shall be included in all copies or substantial
|
||||
* portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef WAYLAND_VERSION_H
|
||||
#define WAYLAND_VERSION_H
|
||||
|
||||
#define WAYLAND_VERSION_MAJOR 1
|
||||
#define WAYLAND_VERSION_MINOR 21
|
||||
#define WAYLAND_VERSION_MICRO 0
|
||||
#define WAYLAND_VERSION "1.21.0"
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,33 @@
|
||||
Copyright © 2008-2013 Kristian Høgsberg
|
||||
Copyright © 2010-2013 Intel Corporation
|
||||
Copyright © 2013 Rafael Antognolli
|
||||
Copyright © 2013 Jasper St. Pierre
|
||||
Copyright © 2014 Jonas Ådahl
|
||||
Copyright © 2014 Jason Ekstrand
|
||||
Copyright © 2014-2015 Collabora, Ltd.
|
||||
Copyright © 2015 Red Hat Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice (including the next
|
||||
paragraph) shall be included in all copies or substantial portions of the
|
||||
Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
|
||||
---
|
||||
|
||||
The above is the version of the MIT "Expat" License used by X.org:
|
||||
|
||||
http://cgit.freedesktop.org/xorg/xserver/tree/COPYING
|
||||
@ -0,0 +1,7 @@
|
||||
Viewporter: cropping and scaling extension for surface contents
|
||||
|
||||
Previously known as wl_scaler.
|
||||
|
||||
Maintainers:
|
||||
Pekka Paalanen <pekka.paalanen@collabora.co.uk>
|
||||
|
||||
@ -0,0 +1,180 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<protocol name="viewporter">
|
||||
|
||||
<copyright>
|
||||
Copyright © 2013-2016 Collabora, Ltd.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice (including the next
|
||||
paragraph) shall be included in all copies or substantial portions of the
|
||||
Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
</copyright>
|
||||
|
||||
<interface name="wp_viewporter" version="1">
|
||||
<description summary="surface cropping and scaling">
|
||||
The global interface exposing surface cropping and scaling
|
||||
capabilities is used to instantiate an interface extension for a
|
||||
wl_surface object. This extended interface will then allow
|
||||
cropping and scaling the surface contents, effectively
|
||||
disconnecting the direct relationship between the buffer and the
|
||||
surface size.
|
||||
</description>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="unbind from the cropping and scaling interface">
|
||||
Informs the server that the client will not be using this
|
||||
protocol object anymore. This does not affect any other objects,
|
||||
wp_viewport objects included.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<enum name="error">
|
||||
<entry name="viewport_exists" value="0"
|
||||
summary="the surface already has a viewport object associated"/>
|
||||
</enum>
|
||||
|
||||
<request name="get_viewport">
|
||||
<description summary="extend surface interface for crop and scale">
|
||||
Instantiate an interface extension for the given wl_surface to
|
||||
crop and scale its content. If the given wl_surface already has
|
||||
a wp_viewport object associated, the viewport_exists
|
||||
protocol error is raised.
|
||||
</description>
|
||||
<arg name="id" type="new_id" interface="wp_viewport"
|
||||
summary="the new viewport interface id"/>
|
||||
<arg name="surface" type="object" interface="wl_surface"
|
||||
summary="the surface"/>
|
||||
</request>
|
||||
</interface>
|
||||
|
||||
<interface name="wp_viewport" version="1">
|
||||
<description summary="crop and scale interface to a wl_surface">
|
||||
An additional interface to a wl_surface object, which allows the
|
||||
client to specify the cropping and scaling of the surface
|
||||
contents.
|
||||
|
||||
This interface works with two concepts: the source rectangle (src_x,
|
||||
src_y, src_width, src_height), and the destination size (dst_width,
|
||||
dst_height). The contents of the source rectangle are scaled to the
|
||||
destination size, and content outside the source rectangle is ignored.
|
||||
This state is double-buffered, and is applied on the next
|
||||
wl_surface.commit.
|
||||
|
||||
The two parts of crop and scale state are independent: the source
|
||||
rectangle, and the destination size. Initially both are unset, that
|
||||
is, no scaling is applied. The whole of the current wl_buffer is
|
||||
used as the source, and the surface size is as defined in
|
||||
wl_surface.attach.
|
||||
|
||||
If the destination size is set, it causes the surface size to become
|
||||
dst_width, dst_height. The source (rectangle) is scaled to exactly
|
||||
this size. This overrides whatever the attached wl_buffer size is,
|
||||
unless the wl_buffer is NULL. If the wl_buffer is NULL, the surface
|
||||
has no content and therefore no size. Otherwise, the size is always
|
||||
at least 1x1 in surface local coordinates.
|
||||
|
||||
If the source rectangle is set, it defines what area of the wl_buffer is
|
||||
taken as the source. If the source rectangle is set and the destination
|
||||
size is not set, then src_width and src_height must be integers, and the
|
||||
surface size becomes the source rectangle size. This results in cropping
|
||||
without scaling. If src_width or src_height are not integers and
|
||||
destination size is not set, the bad_size protocol error is raised when
|
||||
the surface state is applied.
|
||||
|
||||
The coordinate transformations from buffer pixel coordinates up to
|
||||
the surface-local coordinates happen in the following order:
|
||||
1. buffer_transform (wl_surface.set_buffer_transform)
|
||||
2. buffer_scale (wl_surface.set_buffer_scale)
|
||||
3. crop and scale (wp_viewport.set*)
|
||||
This means, that the source rectangle coordinates of crop and scale
|
||||
are given in the coordinates after the buffer transform and scale,
|
||||
i.e. in the coordinates that would be the surface-local coordinates
|
||||
if the crop and scale was not applied.
|
||||
|
||||
If src_x or src_y are negative, the bad_value protocol error is raised.
|
||||
Otherwise, if the source rectangle is partially or completely outside of
|
||||
the non-NULL wl_buffer, then the out_of_buffer protocol error is raised
|
||||
when the surface state is applied. A NULL wl_buffer does not raise the
|
||||
out_of_buffer error.
|
||||
|
||||
If the wl_surface associated with the wp_viewport is destroyed,
|
||||
all wp_viewport requests except 'destroy' raise the protocol error
|
||||
no_surface.
|
||||
|
||||
If the wp_viewport object is destroyed, the crop and scale
|
||||
state is removed from the wl_surface. The change will be applied
|
||||
on the next wl_surface.commit.
|
||||
</description>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="remove scaling and cropping from the surface">
|
||||
The associated wl_surface's crop and scale state is removed.
|
||||
The change is applied on the next wl_surface.commit.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<enum name="error">
|
||||
<entry name="bad_value" value="0"
|
||||
summary="negative or zero values in width or height"/>
|
||||
<entry name="bad_size" value="1"
|
||||
summary="destination size is not integer"/>
|
||||
<entry name="out_of_buffer" value="2"
|
||||
summary="source rectangle extends outside of the content area"/>
|
||||
<entry name="no_surface" value="3"
|
||||
summary="the wl_surface was destroyed"/>
|
||||
</enum>
|
||||
|
||||
<request name="set_source">
|
||||
<description summary="set the source rectangle for cropping">
|
||||
Set the source rectangle of the associated wl_surface. See
|
||||
wp_viewport for the description, and relation to the wl_buffer
|
||||
size.
|
||||
|
||||
If all of x, y, width and height are -1.0, the source rectangle is
|
||||
unset instead. Any other set of values where width or height are zero
|
||||
or negative, or x or y are negative, raise the bad_value protocol
|
||||
error.
|
||||
|
||||
The crop and scale state is double-buffered state, and will be
|
||||
applied on the next wl_surface.commit.
|
||||
</description>
|
||||
<arg name="x" type="fixed" summary="source rectangle x"/>
|
||||
<arg name="y" type="fixed" summary="source rectangle y"/>
|
||||
<arg name="width" type="fixed" summary="source rectangle width"/>
|
||||
<arg name="height" type="fixed" summary="source rectangle height"/>
|
||||
</request>
|
||||
|
||||
<request name="set_destination">
|
||||
<description summary="set the surface size for scaling">
|
||||
Set the destination size of the associated wl_surface. See
|
||||
wp_viewport for the description, and relation to the wl_buffer
|
||||
size.
|
||||
|
||||
If width is -1 and height is -1, the destination size is unset
|
||||
instead. Any other pair of values for width and height that
|
||||
contains zero or negative values raises the bad_value protocol
|
||||
error.
|
||||
|
||||
The crop and scale state is double-buffered state, and will be
|
||||
applied on the next wl_surface.commit.
|
||||
</description>
|
||||
<arg name="width" type="int" summary="surface width"/>
|
||||
<arg name="height" type="int" summary="surface height"/>
|
||||
</request>
|
||||
</interface>
|
||||
|
||||
</protocol>
|
||||
@ -0,0 +1,5 @@
|
||||
xdg shell protocol
|
||||
|
||||
Maintainers:
|
||||
Jonas Ådahl <jadahl@gmail.com>
|
||||
Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,4 @@
|
||||
wp fractional scale protocol
|
||||
|
||||
Maintainers:
|
||||
Kenny Levinsen <kl@kl.wtf>
|
||||
@ -0,0 +1,102 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<protocol name="fractional_scale_v1">
|
||||
<copyright>
|
||||
Copyright © 2022 Kenny Levinsen
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice (including the next
|
||||
paragraph) shall be included in all copies or substantial portions of the
|
||||
Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
</copyright>
|
||||
|
||||
<description summary="Protocol for requesting fractional surface scales">
|
||||
This protocol allows a compositor to suggest for surfaces to render at
|
||||
fractional scales.
|
||||
|
||||
A client can submit scaled content by utilizing wp_viewport. This is done by
|
||||
creating a wp_viewport object for the surface and setting the destination
|
||||
rectangle to the surface size before the scale factor is applied.
|
||||
|
||||
The buffer size is calculated by multiplying the surface size by the
|
||||
intended scale.
|
||||
|
||||
The wl_surface buffer scale should remain set to 1.
|
||||
|
||||
If a surface has a surface-local size of 100 px by 50 px and wishes to
|
||||
submit buffers with a scale of 1.5, then a buffer of 150px by 75 px should
|
||||
be used and the wp_viewport destination rectangle should be 100 px by 50 px.
|
||||
|
||||
For toplevel surfaces, the size is rounded halfway away from zero. The
|
||||
rounding algorithm for subsurface position and size is not defined.
|
||||
</description>
|
||||
|
||||
<interface name="wp_fractional_scale_manager_v1" version="1">
|
||||
<description summary="fractional surface scale information">
|
||||
A global interface for requesting surfaces to use fractional scales.
|
||||
</description>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="unbind the fractional surface scale interface">
|
||||
Informs the server that the client will not be using this protocol
|
||||
object anymore. This does not affect any other objects,
|
||||
wp_fractional_scale_v1 objects included.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<enum name="error">
|
||||
<entry name="fractional_scale_exists" value="0"
|
||||
summary="the surface already has a fractional_scale object associated"/>
|
||||
</enum>
|
||||
|
||||
<request name="get_fractional_scale">
|
||||
<description summary="extend surface interface for scale information">
|
||||
Create an add-on object for the the wl_surface to let the compositor
|
||||
request fractional scales. If the given wl_surface already has a
|
||||
wp_fractional_scale_v1 object associated, the fractional_scale_exists
|
||||
protocol error is raised.
|
||||
</description>
|
||||
<arg name="id" type="new_id" interface="wp_fractional_scale_v1"
|
||||
summary="the new surface scale info interface id"/>
|
||||
<arg name="surface" type="object" interface="wl_surface"
|
||||
summary="the surface"/>
|
||||
</request>
|
||||
</interface>
|
||||
|
||||
<interface name="wp_fractional_scale_v1" version="1">
|
||||
<description summary="fractional scale interface to a wl_surface">
|
||||
An additional interface to a wl_surface object which allows the compositor
|
||||
to inform the client of the preferred scale.
|
||||
</description>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="remove surface scale information for surface">
|
||||
Destroy the fractional scale object. When this object is destroyed,
|
||||
preferred_scale events will no longer be sent.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<event name="preferred_scale">
|
||||
<description summary="notify of new preferred scale">
|
||||
Notification of a new preferred scale for this surface that the
|
||||
compositor suggests that the client should use.
|
||||
|
||||
The sent scale is the numerator of a fraction with a denominator of 120.
|
||||
</description>
|
||||
<arg name="scale" type="uint" summary="the new preferred scale"/>
|
||||
</event>
|
||||
</interface>
|
||||
</protocol>
|
||||
@ -0,0 +1,4 @@
|
||||
XDG Activation protocol
|
||||
|
||||
Maintainers:
|
||||
Aleix Pol Gonzalez <aleixpol@kde.org>
|
||||
@ -0,0 +1,200 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<protocol name="xdg_activation_v1">
|
||||
|
||||
<copyright>
|
||||
Copyright © 2020 Aleix Pol Gonzalez <aleixpol@kde.org>
|
||||
Copyright © 2020 Carlos Garnacho <carlosg@gnome.org>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice (including the next
|
||||
paragraph) shall be included in all copies or substantial portions of the
|
||||
Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
</copyright>
|
||||
|
||||
<description summary="Protocol for requesting activation of surfaces">
|
||||
The way for a client to pass focus to another toplevel is as follows.
|
||||
|
||||
The client that intends to activate another toplevel uses the
|
||||
xdg_activation_v1.get_activation_token request to get an activation token.
|
||||
This token is then forwarded to the client, which is supposed to activate
|
||||
one of its surfaces, through a separate band of communication.
|
||||
|
||||
One established way of doing this is through the XDG_ACTIVATION_TOKEN
|
||||
environment variable of a newly launched child process. The child process
|
||||
should unset the environment variable again right after reading it out in
|
||||
order to avoid propagating it to other child processes.
|
||||
|
||||
Another established way exists for Applications implementing the D-Bus
|
||||
interface org.freedesktop.Application, which should get their token under
|
||||
activation-token on their platform_data.
|
||||
|
||||
In general activation tokens may be transferred across clients through
|
||||
means not described in this protocol.
|
||||
|
||||
The client to be activated will then pass the token
|
||||
it received to the xdg_activation_v1.activate request. The compositor can
|
||||
then use this token to decide how to react to the activation request.
|
||||
|
||||
The token the activating client gets may be ineffective either already at
|
||||
the time it receives it, for example if it was not focused, for focus
|
||||
stealing prevention. The activating client will have no way to discover
|
||||
the validity of the token, and may still forward it to the to be activated
|
||||
client.
|
||||
|
||||
The created activation token may optionally get information attached to it
|
||||
that can be used by the compositor to identify the application that we
|
||||
intend to activate. This can for example be used to display a visual hint
|
||||
about what application is being started.
|
||||
|
||||
Warning! The protocol described in this file is currently in the testing
|
||||
phase. Backward compatible changes may be added together with the
|
||||
corresponding interface version bump. Backward incompatible changes can
|
||||
only be done by creating a new major version of the extension.
|
||||
</description>
|
||||
|
||||
<interface name="xdg_activation_v1" version="1">
|
||||
<description summary="interface for activating surfaces">
|
||||
A global interface used for informing the compositor about applications
|
||||
being activated or started, or for applications to request to be
|
||||
activated.
|
||||
</description>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="destroy the xdg_activation object">
|
||||
Notify the compositor that the xdg_activation object will no longer be
|
||||
used.
|
||||
|
||||
The child objects created via this interface are unaffected and should
|
||||
be destroyed separately.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<request name="get_activation_token">
|
||||
<description summary="requests a token">
|
||||
Creates an xdg_activation_token_v1 object that will provide
|
||||
the initiating client with a unique token for this activation. This
|
||||
token should be offered to the clients to be activated.
|
||||
</description>
|
||||
|
||||
<arg name="id" type="new_id" interface="xdg_activation_token_v1"/>
|
||||
</request>
|
||||
|
||||
<request name="activate">
|
||||
<description summary="notify new interaction being available">
|
||||
Requests surface activation. It's up to the compositor to display
|
||||
this information as desired, for example by placing the surface above
|
||||
the rest.
|
||||
|
||||
The compositor may know who requested this by checking the activation
|
||||
token and might decide not to follow through with the activation if it's
|
||||
considered unwanted.
|
||||
|
||||
Compositors can ignore unknown activation tokens when an invalid
|
||||
token is passed.
|
||||
</description>
|
||||
<arg name="token" type="string" summary="the activation token of the initiating client"/>
|
||||
<arg name="surface" type="object" interface="wl_surface"
|
||||
summary="the wl_surface to activate"/>
|
||||
</request>
|
||||
</interface>
|
||||
|
||||
<interface name="xdg_activation_token_v1" version="1">
|
||||
<description summary="an exported activation handle">
|
||||
An object for setting up a token and receiving a token handle that can
|
||||
be passed as an activation token to another client.
|
||||
|
||||
The object is created using the xdg_activation_v1.get_activation_token
|
||||
request. This object should then be populated with the app_id, surface
|
||||
and serial information and committed. The compositor shall then issue a
|
||||
done event with the token. In case the request's parameters are invalid,
|
||||
the compositor will provide an invalid token.
|
||||
</description>
|
||||
|
||||
<enum name="error">
|
||||
<entry name="already_used" value="0"
|
||||
summary="The token has already been used previously"/>
|
||||
</enum>
|
||||
|
||||
<request name="set_serial">
|
||||
<description summary="specifies the seat and serial of the activating event">
|
||||
Provides information about the seat and serial event that requested the
|
||||
token.
|
||||
|
||||
The serial can come from an input or focus event. For instance, if a
|
||||
click triggers the launch of a third-party client, the launcher client
|
||||
should send a set_serial request with the serial and seat from the
|
||||
wl_pointer.button event.
|
||||
|
||||
Some compositors might refuse to activate toplevels when the token
|
||||
doesn't have a valid and recent enough event serial.
|
||||
|
||||
Must be sent before commit. This information is optional.
|
||||
</description>
|
||||
<arg name="serial" type="uint"
|
||||
summary="the serial of the event that triggered the activation"/>
|
||||
<arg name="seat" type="object" interface="wl_seat"
|
||||
summary="the wl_seat of the event"/>
|
||||
</request>
|
||||
|
||||
<request name="set_app_id">
|
||||
<description summary="specifies the application being activated">
|
||||
The requesting client can specify an app_id to associate the token
|
||||
being created with it.
|
||||
|
||||
Must be sent before commit. This information is optional.
|
||||
</description>
|
||||
<arg name="app_id" type="string"
|
||||
summary="the application id of the client being activated."/>
|
||||
</request>
|
||||
|
||||
<request name="set_surface">
|
||||
<description summary="specifies the surface requesting activation">
|
||||
This request sets the surface requesting the activation. Note, this is
|
||||
different from the surface that will be activated.
|
||||
|
||||
Some compositors might refuse to activate toplevels when the token
|
||||
doesn't have a requesting surface.
|
||||
|
||||
Must be sent before commit. This information is optional.
|
||||
</description>
|
||||
<arg name="surface" type="object" interface="wl_surface"
|
||||
summary="the requesting surface"/>
|
||||
</request>
|
||||
|
||||
<request name="commit">
|
||||
<description summary="issues the token request">
|
||||
Requests an activation token based on the different parameters that
|
||||
have been offered through set_serial, set_surface and set_app_id.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<event name="done">
|
||||
<description summary="the exported activation token">
|
||||
The 'done' event contains the unique token of this activation request
|
||||
and notifies that the provider is done.
|
||||
</description>
|
||||
<arg name="token" type="string" summary="the exported activation token"/>
|
||||
</event>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="destroy the xdg_activation_token_v1 object">
|
||||
Notify the compositor that the xdg_activation_token_v1 object will no
|
||||
longer be used. The received token stays valid.
|
||||
</description>
|
||||
</request>
|
||||
</interface>
|
||||
</protocol>
|
||||
@ -0,0 +1,4 @@
|
||||
Screensaver inhibition protocol
|
||||
|
||||
Maintainers:
|
||||
Bryce Harrington <bryce@osg.samsung.com>
|
||||
@ -0,0 +1,83 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<protocol name="idle_inhibit_unstable_v1">
|
||||
|
||||
<copyright>
|
||||
Copyright © 2015 Samsung Electronics Co., Ltd
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice (including the next
|
||||
paragraph) shall be included in all copies or substantial portions of the
|
||||
Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
</copyright>
|
||||
|
||||
<interface name="zwp_idle_inhibit_manager_v1" version="1">
|
||||
<description summary="control behavior when display idles">
|
||||
This interface permits inhibiting the idle behavior such as screen
|
||||
blanking, locking, and screensaving. The client binds the idle manager
|
||||
globally, then creates idle-inhibitor objects for each surface.
|
||||
|
||||
Warning! The protocol described in this file is experimental and
|
||||
backward incompatible changes may be made. Backward compatible changes
|
||||
may be added together with the corresponding interface version bump.
|
||||
Backward incompatible changes are done by bumping the version number in
|
||||
the protocol and interface names and resetting the interface version.
|
||||
Once the protocol is to be declared stable, the 'z' prefix and the
|
||||
version number in the protocol and interface names are removed and the
|
||||
interface version number is reset.
|
||||
</description>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="destroy the idle inhibitor object">
|
||||
Destroy the inhibit manager.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<request name="create_inhibitor">
|
||||
<description summary="create a new inhibitor object">
|
||||
Create a new inhibitor object associated with the given surface.
|
||||
</description>
|
||||
<arg name="id" type="new_id" interface="zwp_idle_inhibitor_v1"/>
|
||||
<arg name="surface" type="object" interface="wl_surface"
|
||||
summary="the surface that inhibits the idle behavior"/>
|
||||
</request>
|
||||
|
||||
</interface>
|
||||
|
||||
<interface name="zwp_idle_inhibitor_v1" version="1">
|
||||
<description summary="context object for inhibiting idle behavior">
|
||||
An idle inhibitor prevents the output that the associated surface is
|
||||
visible on from being set to a state where it is not visually usable due
|
||||
to lack of user interaction (e.g. blanked, dimmed, locked, set to power
|
||||
save, etc.) Any screensaver processes are also blocked from displaying.
|
||||
|
||||
If the surface is destroyed, unmapped, becomes occluded, loses
|
||||
visibility, or otherwise becomes not visually relevant for the user, the
|
||||
idle inhibitor will not be honored by the compositor; if the surface
|
||||
subsequently regains visibility the inhibitor takes effect once again.
|
||||
Likewise, the inhibitor isn't honored if the system was already idled at
|
||||
the time the inhibitor was established, although if the system later
|
||||
de-idles and re-idles the inhibitor will take effect.
|
||||
</description>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="destroy the idle inhibitor object">
|
||||
Remove the inhibitor effect from the associated wl_surface.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
</interface>
|
||||
</protocol>
|
||||
@ -0,0 +1,4 @@
|
||||
Pointer constraints protocol
|
||||
|
||||
Maintainers:
|
||||
Jonas Ådahl <jadahl@gmail.com>
|
||||
@ -0,0 +1,339 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<protocol name="pointer_constraints_unstable_v1">
|
||||
|
||||
<copyright>
|
||||
Copyright © 2014 Jonas Ådahl
|
||||
Copyright © 2015 Red Hat Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice (including the next
|
||||
paragraph) shall be included in all copies or substantial portions of the
|
||||
Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
</copyright>
|
||||
|
||||
<description summary="protocol for constraining pointer motions">
|
||||
This protocol specifies a set of interfaces used for adding constraints to
|
||||
the motion of a pointer. Possible constraints include confining pointer
|
||||
motions to a given region, or locking it to its current position.
|
||||
|
||||
In order to constrain the pointer, a client must first bind the global
|
||||
interface "wp_pointer_constraints" which, if a compositor supports pointer
|
||||
constraints, is exposed by the registry. Using the bound global object, the
|
||||
client uses the request that corresponds to the type of constraint it wants
|
||||
to make. See wp_pointer_constraints for more details.
|
||||
|
||||
Warning! The protocol described in this file is experimental and backward
|
||||
incompatible changes may be made. Backward compatible changes may be added
|
||||
together with the corresponding interface version bump. Backward
|
||||
incompatible changes are done by bumping the version number in the protocol
|
||||
and interface names and resetting the interface version. Once the protocol
|
||||
is to be declared stable, the 'z' prefix and the version number in the
|
||||
protocol and interface names are removed and the interface version number is
|
||||
reset.
|
||||
</description>
|
||||
|
||||
<interface name="zwp_pointer_constraints_v1" version="1">
|
||||
<description summary="constrain the movement of a pointer">
|
||||
The global interface exposing pointer constraining functionality. It
|
||||
exposes two requests: lock_pointer for locking the pointer to its
|
||||
position, and confine_pointer for locking the pointer to a region.
|
||||
|
||||
The lock_pointer and confine_pointer requests create the objects
|
||||
wp_locked_pointer and wp_confined_pointer respectively, and the client can
|
||||
use these objects to interact with the lock.
|
||||
|
||||
For any surface, only one lock or confinement may be active across all
|
||||
wl_pointer objects of the same seat. If a lock or confinement is requested
|
||||
when another lock or confinement is active or requested on the same surface
|
||||
and with any of the wl_pointer objects of the same seat, an
|
||||
'already_constrained' error will be raised.
|
||||
</description>
|
||||
|
||||
<enum name="error">
|
||||
<description summary="wp_pointer_constraints error values">
|
||||
These errors can be emitted in response to wp_pointer_constraints
|
||||
requests.
|
||||
</description>
|
||||
<entry name="already_constrained" value="1"
|
||||
summary="pointer constraint already requested on that surface"/>
|
||||
</enum>
|
||||
|
||||
<enum name="lifetime">
|
||||
<description summary="constraint lifetime">
|
||||
These values represent different lifetime semantics. They are passed
|
||||
as arguments to the factory requests to specify how the constraint
|
||||
lifetimes should be managed.
|
||||
</description>
|
||||
<entry name="oneshot" value="1">
|
||||
<description summary="the pointer constraint is defunct once deactivated">
|
||||
A oneshot pointer constraint will never reactivate once it has been
|
||||
deactivated. See the corresponding deactivation event
|
||||
(wp_locked_pointer.unlocked and wp_confined_pointer.unconfined) for
|
||||
details.
|
||||
</description>
|
||||
</entry>
|
||||
<entry name="persistent" value="2">
|
||||
<description summary="the pointer constraint may reactivate">
|
||||
A persistent pointer constraint may again reactivate once it has
|
||||
been deactivated. See the corresponding deactivation event
|
||||
(wp_locked_pointer.unlocked and wp_confined_pointer.unconfined) for
|
||||
details.
|
||||
</description>
|
||||
</entry>
|
||||
</enum>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="destroy the pointer constraints manager object">
|
||||
Used by the client to notify the server that it will no longer use this
|
||||
pointer constraints object.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<request name="lock_pointer">
|
||||
<description summary="lock pointer to a position">
|
||||
The lock_pointer request lets the client request to disable movements of
|
||||
the virtual pointer (i.e. the cursor), effectively locking the pointer
|
||||
to a position. This request may not take effect immediately; in the
|
||||
future, when the compositor deems implementation-specific constraints
|
||||
are satisfied, the pointer lock will be activated and the compositor
|
||||
sends a locked event.
|
||||
|
||||
The protocol provides no guarantee that the constraints are ever
|
||||
satisfied, and does not require the compositor to send an error if the
|
||||
constraints cannot ever be satisfied. It is thus possible to request a
|
||||
lock that will never activate.
|
||||
|
||||
There may not be another pointer constraint of any kind requested or
|
||||
active on the surface for any of the wl_pointer objects of the seat of
|
||||
the passed pointer when requesting a lock. If there is, an error will be
|
||||
raised. See general pointer lock documentation for more details.
|
||||
|
||||
The intersection of the region passed with this request and the input
|
||||
region of the surface is used to determine where the pointer must be
|
||||
in order for the lock to activate. It is up to the compositor whether to
|
||||
warp the pointer or require some kind of user interaction for the lock
|
||||
to activate. If the region is null the surface input region is used.
|
||||
|
||||
A surface may receive pointer focus without the lock being activated.
|
||||
|
||||
The request creates a new object wp_locked_pointer which is used to
|
||||
interact with the lock as well as receive updates about its state. See
|
||||
the the description of wp_locked_pointer for further information.
|
||||
|
||||
Note that while a pointer is locked, the wl_pointer objects of the
|
||||
corresponding seat will not emit any wl_pointer.motion events, but
|
||||
relative motion events will still be emitted via wp_relative_pointer
|
||||
objects of the same seat. wl_pointer.axis and wl_pointer.button events
|
||||
are unaffected.
|
||||
</description>
|
||||
<arg name="id" type="new_id" interface="zwp_locked_pointer_v1"/>
|
||||
<arg name="surface" type="object" interface="wl_surface"
|
||||
summary="surface to lock pointer to"/>
|
||||
<arg name="pointer" type="object" interface="wl_pointer"
|
||||
summary="the pointer that should be locked"/>
|
||||
<arg name="region" type="object" interface="wl_region" allow-null="true"
|
||||
summary="region of surface"/>
|
||||
<arg name="lifetime" type="uint" enum="lifetime" summary="lock lifetime"/>
|
||||
</request>
|
||||
|
||||
<request name="confine_pointer">
|
||||
<description summary="confine pointer to a region">
|
||||
The confine_pointer request lets the client request to confine the
|
||||
pointer cursor to a given region. This request may not take effect
|
||||
immediately; in the future, when the compositor deems implementation-
|
||||
specific constraints are satisfied, the pointer confinement will be
|
||||
activated and the compositor sends a confined event.
|
||||
|
||||
The intersection of the region passed with this request and the input
|
||||
region of the surface is used to determine where the pointer must be
|
||||
in order for the confinement to activate. It is up to the compositor
|
||||
whether to warp the pointer or require some kind of user interaction for
|
||||
the confinement to activate. If the region is null the surface input
|
||||
region is used.
|
||||
|
||||
The request will create a new object wp_confined_pointer which is used
|
||||
to interact with the confinement as well as receive updates about its
|
||||
state. See the the description of wp_confined_pointer for further
|
||||
information.
|
||||
</description>
|
||||
<arg name="id" type="new_id" interface="zwp_confined_pointer_v1"/>
|
||||
<arg name="surface" type="object" interface="wl_surface"
|
||||
summary="surface to lock pointer to"/>
|
||||
<arg name="pointer" type="object" interface="wl_pointer"
|
||||
summary="the pointer that should be confined"/>
|
||||
<arg name="region" type="object" interface="wl_region" allow-null="true"
|
||||
summary="region of surface"/>
|
||||
<arg name="lifetime" type="uint" enum="lifetime" summary="confinement lifetime"/>
|
||||
</request>
|
||||
</interface>
|
||||
|
||||
<interface name="zwp_locked_pointer_v1" version="1">
|
||||
<description summary="receive relative pointer motion events">
|
||||
The wp_locked_pointer interface represents a locked pointer state.
|
||||
|
||||
While the lock of this object is active, the wl_pointer objects of the
|
||||
associated seat will not emit any wl_pointer.motion events.
|
||||
|
||||
This object will send the event 'locked' when the lock is activated.
|
||||
Whenever the lock is activated, it is guaranteed that the locked surface
|
||||
will already have received pointer focus and that the pointer will be
|
||||
within the region passed to the request creating this object.
|
||||
|
||||
To unlock the pointer, send the destroy request. This will also destroy
|
||||
the wp_locked_pointer object.
|
||||
|
||||
If the compositor decides to unlock the pointer the unlocked event is
|
||||
sent. See wp_locked_pointer.unlock for details.
|
||||
|
||||
When unlocking, the compositor may warp the cursor position to the set
|
||||
cursor position hint. If it does, it will not result in any relative
|
||||
motion events emitted via wp_relative_pointer.
|
||||
|
||||
If the surface the lock was requested on is destroyed and the lock is not
|
||||
yet activated, the wp_locked_pointer object is now defunct and must be
|
||||
destroyed.
|
||||
</description>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="destroy the locked pointer object">
|
||||
Destroy the locked pointer object. If applicable, the compositor will
|
||||
unlock the pointer.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<request name="set_cursor_position_hint">
|
||||
<description summary="set the pointer cursor position hint">
|
||||
Set the cursor position hint relative to the top left corner of the
|
||||
surface.
|
||||
|
||||
If the client is drawing its own cursor, it should update the position
|
||||
hint to the position of its own cursor. A compositor may use this
|
||||
information to warp the pointer upon unlock in order to avoid pointer
|
||||
jumps.
|
||||
|
||||
The cursor position hint is double buffered. The new hint will only take
|
||||
effect when the associated surface gets it pending state applied. See
|
||||
wl_surface.commit for details.
|
||||
</description>
|
||||
<arg name="surface_x" type="fixed"
|
||||
summary="surface-local x coordinate"/>
|
||||
<arg name="surface_y" type="fixed"
|
||||
summary="surface-local y coordinate"/>
|
||||
</request>
|
||||
|
||||
<request name="set_region">
|
||||
<description summary="set a new lock region">
|
||||
Set a new region used to lock the pointer.
|
||||
|
||||
The new lock region is double-buffered. The new lock region will
|
||||
only take effect when the associated surface gets its pending state
|
||||
applied. See wl_surface.commit for details.
|
||||
|
||||
For details about the lock region, see wp_locked_pointer.
|
||||
</description>
|
||||
<arg name="region" type="object" interface="wl_region" allow-null="true"
|
||||
summary="region of surface"/>
|
||||
</request>
|
||||
|
||||
<event name="locked">
|
||||
<description summary="lock activation event">
|
||||
Notification that the pointer lock of the seat's pointer is activated.
|
||||
</description>
|
||||
</event>
|
||||
|
||||
<event name="unlocked">
|
||||
<description summary="lock deactivation event">
|
||||
Notification that the pointer lock of the seat's pointer is no longer
|
||||
active. If this is a oneshot pointer lock (see
|
||||
wp_pointer_constraints.lifetime) this object is now defunct and should
|
||||
be destroyed. If this is a persistent pointer lock (see
|
||||
wp_pointer_constraints.lifetime) this pointer lock may again
|
||||
reactivate in the future.
|
||||
</description>
|
||||
</event>
|
||||
</interface>
|
||||
|
||||
<interface name="zwp_confined_pointer_v1" version="1">
|
||||
<description summary="confined pointer object">
|
||||
The wp_confined_pointer interface represents a confined pointer state.
|
||||
|
||||
This object will send the event 'confined' when the confinement is
|
||||
activated. Whenever the confinement is activated, it is guaranteed that
|
||||
the surface the pointer is confined to will already have received pointer
|
||||
focus and that the pointer will be within the region passed to the request
|
||||
creating this object. It is up to the compositor to decide whether this
|
||||
requires some user interaction and if the pointer will warp to within the
|
||||
passed region if outside.
|
||||
|
||||
To unconfine the pointer, send the destroy request. This will also destroy
|
||||
the wp_confined_pointer object.
|
||||
|
||||
If the compositor decides to unconfine the pointer the unconfined event is
|
||||
sent. The wp_confined_pointer object is at this point defunct and should
|
||||
be destroyed.
|
||||
</description>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="destroy the confined pointer object">
|
||||
Destroy the confined pointer object. If applicable, the compositor will
|
||||
unconfine the pointer.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<request name="set_region">
|
||||
<description summary="set a new confine region">
|
||||
Set a new region used to confine the pointer.
|
||||
|
||||
The new confine region is double-buffered. The new confine region will
|
||||
only take effect when the associated surface gets its pending state
|
||||
applied. See wl_surface.commit for details.
|
||||
|
||||
If the confinement is active when the new confinement region is applied
|
||||
and the pointer ends up outside of newly applied region, the pointer may
|
||||
warped to a position within the new confinement region. If warped, a
|
||||
wl_pointer.motion event will be emitted, but no
|
||||
wp_relative_pointer.relative_motion event.
|
||||
|
||||
The compositor may also, instead of using the new region, unconfine the
|
||||
pointer.
|
||||
|
||||
For details about the confine region, see wp_confined_pointer.
|
||||
</description>
|
||||
<arg name="region" type="object" interface="wl_region" allow-null="true"
|
||||
summary="region of surface"/>
|
||||
</request>
|
||||
|
||||
<event name="confined">
|
||||
<description summary="pointer confined">
|
||||
Notification that the pointer confinement of the seat's pointer is
|
||||
activated.
|
||||
</description>
|
||||
</event>
|
||||
|
||||
<event name="unconfined">
|
||||
<description summary="pointer unconfined">
|
||||
Notification that the pointer confinement of the seat's pointer is no
|
||||
longer active. If this is a oneshot pointer confinement (see
|
||||
wp_pointer_constraints.lifetime) this object is now defunct and should
|
||||
be destroyed. If this is a persistent pointer confinement (see
|
||||
wp_pointer_constraints.lifetime) this pointer confinement may again
|
||||
reactivate in the future.
|
||||
</description>
|
||||
</event>
|
||||
</interface>
|
||||
|
||||
</protocol>
|
||||
@ -0,0 +1,4 @@
|
||||
Pointer gestures protocol
|
||||
|
||||
Maintainers:
|
||||
Carlos Garnacho <carlosg@gnome.org>
|
||||
@ -0,0 +1,253 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<protocol name="pointer_gestures_unstable_v1">
|
||||
|
||||
<interface name="zwp_pointer_gestures_v1" version="3">
|
||||
<description summary="touchpad gestures">
|
||||
A global interface to provide semantic touchpad gestures for a given
|
||||
pointer.
|
||||
|
||||
Three gestures are currently supported: swipe, pinch, and hold.
|
||||
Pinch and swipe gestures follow a three-stage cycle: begin, update,
|
||||
end, hold gestures follow a two-stage cycle: begin and end. All
|
||||
gestures are identified by a unique id.
|
||||
|
||||
Warning! The protocol described in this file is experimental and
|
||||
backward incompatible changes may be made. Backward compatible changes
|
||||
may be added together with the corresponding interface version bump.
|
||||
Backward incompatible changes are done by bumping the version number in
|
||||
the protocol and interface names and resetting the interface version.
|
||||
Once the protocol is to be declared stable, the 'z' prefix and the
|
||||
version number in the protocol and interface names are removed and the
|
||||
interface version number is reset.
|
||||
</description>
|
||||
|
||||
<request name="get_swipe_gesture">
|
||||
<description summary="get swipe gesture">
|
||||
Create a swipe gesture object. See the
|
||||
wl_pointer_gesture_swipe interface for details.
|
||||
</description>
|
||||
<arg name="id" type="new_id" interface="zwp_pointer_gesture_swipe_v1"/>
|
||||
<arg name="pointer" type="object" interface="wl_pointer"/>
|
||||
</request>
|
||||
|
||||
<request name="get_pinch_gesture">
|
||||
<description summary="get pinch gesture">
|
||||
Create a pinch gesture object. See the
|
||||
wl_pointer_gesture_pinch interface for details.
|
||||
</description>
|
||||
<arg name="id" type="new_id" interface="zwp_pointer_gesture_pinch_v1"/>
|
||||
<arg name="pointer" type="object" interface="wl_pointer"/>
|
||||
</request>
|
||||
|
||||
<!-- Version 2 additions -->
|
||||
|
||||
<request name="release" type="destructor" since="2">
|
||||
<description summary="destroy the pointer gesture object">
|
||||
Destroy the pointer gesture object. Swipe, pinch and hold objects
|
||||
created via this gesture object remain valid.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<!-- Version 3 additions -->
|
||||
|
||||
<request name="get_hold_gesture" since="3">
|
||||
<description summary="get hold gesture">
|
||||
Create a hold gesture object. See the
|
||||
wl_pointer_gesture_hold interface for details.
|
||||
</description>
|
||||
<arg name="id" type="new_id" interface="zwp_pointer_gesture_hold_v1"/>
|
||||
<arg name="pointer" type="object" interface="wl_pointer"/>
|
||||
</request>
|
||||
|
||||
</interface>
|
||||
|
||||
<interface name="zwp_pointer_gesture_swipe_v1" version="2">
|
||||
<description summary="a swipe gesture object">
|
||||
A swipe gesture object notifies a client about a multi-finger swipe
|
||||
gesture detected on an indirect input device such as a touchpad.
|
||||
The gesture is usually initiated by multiple fingers moving in the
|
||||
same direction but once initiated the direction may change.
|
||||
The precise conditions of when such a gesture is detected are
|
||||
implementation-dependent.
|
||||
|
||||
A gesture consists of three stages: begin, update (optional) and end.
|
||||
There cannot be multiple simultaneous hold, pinch or swipe gestures on a
|
||||
same pointer/seat, how compositors prevent these situations is
|
||||
implementation-dependent.
|
||||
|
||||
A gesture may be cancelled by the compositor or the hardware.
|
||||
Clients should not consider performing permanent or irreversible
|
||||
actions until the end of a gesture has been received.
|
||||
</description>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="destroy the pointer swipe gesture object"/>
|
||||
</request>
|
||||
|
||||
<event name="begin">
|
||||
<description summary="multi-finger swipe begin">
|
||||
This event is sent when a multi-finger swipe gesture is detected
|
||||
on the device.
|
||||
</description>
|
||||
<arg name="serial" type="uint"/>
|
||||
<arg name="time" type="uint" summary="timestamp with millisecond granularity"/>
|
||||
<arg name="surface" type="object" interface="wl_surface"/>
|
||||
<arg name="fingers" type="uint" summary="number of fingers"/>
|
||||
</event>
|
||||
|
||||
<event name="update">
|
||||
<description summary="multi-finger swipe motion">
|
||||
This event is sent when a multi-finger swipe gesture changes the
|
||||
position of the logical center.
|
||||
|
||||
The dx and dy coordinates are relative coordinates of the logical
|
||||
center of the gesture compared to the previous event.
|
||||
</description>
|
||||
<arg name="time" type="uint" summary="timestamp with millisecond granularity"/>
|
||||
<arg name="dx" type="fixed" summary="delta x coordinate in surface coordinate space"/>
|
||||
<arg name="dy" type="fixed" summary="delta y coordinate in surface coordinate space"/>
|
||||
</event>
|
||||
|
||||
<event name="end">
|
||||
<description summary="multi-finger swipe end">
|
||||
This event is sent when a multi-finger swipe gesture ceases to
|
||||
be valid. This may happen when one or more fingers are lifted or
|
||||
the gesture is cancelled.
|
||||
|
||||
When a gesture is cancelled, the client should undo state changes
|
||||
caused by this gesture. What causes a gesture to be cancelled is
|
||||
implementation-dependent.
|
||||
</description>
|
||||
<arg name="serial" type="uint"/>
|
||||
<arg name="time" type="uint" summary="timestamp with millisecond granularity"/>
|
||||
<arg name="cancelled" type="int" summary="1 if the gesture was cancelled, 0 otherwise"/>
|
||||
</event>
|
||||
</interface>
|
||||
|
||||
<interface name="zwp_pointer_gesture_pinch_v1" version="2">
|
||||
<description summary="a pinch gesture object">
|
||||
A pinch gesture object notifies a client about a multi-finger pinch
|
||||
gesture detected on an indirect input device such as a touchpad.
|
||||
The gesture is usually initiated by multiple fingers moving towards
|
||||
each other or away from each other, or by two or more fingers rotating
|
||||
around a logical center of gravity. The precise conditions of when
|
||||
such a gesture is detected are implementation-dependent.
|
||||
|
||||
A gesture consists of three stages: begin, update (optional) and end.
|
||||
There cannot be multiple simultaneous hold, pinch or swipe gestures on a
|
||||
same pointer/seat, how compositors prevent these situations is
|
||||
implementation-dependent.
|
||||
|
||||
A gesture may be cancelled by the compositor or the hardware.
|
||||
Clients should not consider performing permanent or irreversible
|
||||
actions until the end of a gesture has been received.
|
||||
</description>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="destroy the pinch gesture object"/>
|
||||
</request>
|
||||
|
||||
<event name="begin">
|
||||
<description summary="multi-finger pinch begin">
|
||||
This event is sent when a multi-finger pinch gesture is detected
|
||||
on the device.
|
||||
</description>
|
||||
<arg name="serial" type="uint"/>
|
||||
<arg name="time" type="uint" summary="timestamp with millisecond granularity"/>
|
||||
<arg name="surface" type="object" interface="wl_surface"/>
|
||||
<arg name="fingers" type="uint" summary="number of fingers"/>
|
||||
</event>
|
||||
|
||||
<event name="update">
|
||||
<description summary="multi-finger pinch motion">
|
||||
This event is sent when a multi-finger pinch gesture changes the
|
||||
position of the logical center, the rotation or the relative scale.
|
||||
|
||||
The dx and dy coordinates are relative coordinates in the
|
||||
surface coordinate space of the logical center of the gesture.
|
||||
|
||||
The scale factor is an absolute scale compared to the
|
||||
pointer_gesture_pinch.begin event, e.g. a scale of 2 means the fingers
|
||||
are now twice as far apart as on pointer_gesture_pinch.begin.
|
||||
|
||||
The rotation is the relative angle in degrees clockwise compared to the previous
|
||||
pointer_gesture_pinch.begin or pointer_gesture_pinch.update event.
|
||||
</description>
|
||||
<arg name="time" type="uint" summary="timestamp with millisecond granularity"/>
|
||||
<arg name="dx" type="fixed" summary="delta x coordinate in surface coordinate space"/>
|
||||
<arg name="dy" type="fixed" summary="delta y coordinate in surface coordinate space"/>
|
||||
<arg name="scale" type="fixed" summary="scale relative to the initial finger position"/>
|
||||
<arg name="rotation" type="fixed" summary="angle in degrees cw relative to the previous event"/>
|
||||
</event>
|
||||
|
||||
<event name="end">
|
||||
<description summary="multi-finger pinch end">
|
||||
This event is sent when a multi-finger pinch gesture ceases to
|
||||
be valid. This may happen when one or more fingers are lifted or
|
||||
the gesture is cancelled.
|
||||
|
||||
When a gesture is cancelled, the client should undo state changes
|
||||
caused by this gesture. What causes a gesture to be cancelled is
|
||||
implementation-dependent.
|
||||
</description>
|
||||
<arg name="serial" type="uint"/>
|
||||
<arg name="time" type="uint" summary="timestamp with millisecond granularity"/>
|
||||
<arg name="cancelled" type="int" summary="1 if the gesture was cancelled, 0 otherwise"/>
|
||||
</event>
|
||||
|
||||
</interface>
|
||||
|
||||
<interface name="zwp_pointer_gesture_hold_v1" version="3">
|
||||
<description summary="a hold gesture object">
|
||||
A hold gesture object notifies a client about a single- or
|
||||
multi-finger hold gesture detected on an indirect input device such as
|
||||
a touchpad. The gesture is usually initiated by one or more fingers
|
||||
being held down without significant movement. The precise conditions
|
||||
of when such a gesture is detected are implementation-dependent.
|
||||
|
||||
In particular, this gesture may be used to cancel kinetic scrolling.
|
||||
|
||||
A hold gesture consists of two stages: begin and end. Unlike pinch and
|
||||
swipe there is no update stage.
|
||||
There cannot be multiple simultaneous hold, pinch or swipe gestures on a
|
||||
same pointer/seat, how compositors prevent these situations is
|
||||
implementation-dependent.
|
||||
|
||||
A gesture may be cancelled by the compositor or the hardware.
|
||||
Clients should not consider performing permanent or irreversible
|
||||
actions until the end of a gesture has been received.
|
||||
</description>
|
||||
|
||||
<request name="destroy" type="destructor" since="3">
|
||||
<description summary="destroy the hold gesture object"/>
|
||||
</request>
|
||||
|
||||
<event name="begin" since="3">
|
||||
<description summary="multi-finger hold begin">
|
||||
This event is sent when a hold gesture is detected on the device.
|
||||
</description>
|
||||
<arg name="serial" type="uint"/>
|
||||
<arg name="time" type="uint" summary="timestamp with millisecond granularity"/>
|
||||
<arg name="surface" type="object" interface="wl_surface"/>
|
||||
<arg name="fingers" type="uint" summary="number of fingers"/>
|
||||
</event>
|
||||
|
||||
<event name="end" since="3">
|
||||
<description summary="multi-finger hold end">
|
||||
This event is sent when a hold gesture ceases to
|
||||
be valid. This may happen when the holding fingers are lifted or
|
||||
the gesture is cancelled, for example if the fingers move past an
|
||||
implementation-defined threshold, the finger count changes or the hold
|
||||
gesture changes into a different type of gesture.
|
||||
|
||||
When a gesture is cancelled, the client may need to undo state changes
|
||||
caused by this gesture. What causes a gesture to be cancelled is
|
||||
implementation-dependent.
|
||||
</description>
|
||||
<arg name="serial" type="uint"/>
|
||||
<arg name="time" type="uint" summary="timestamp with millisecond granularity"/>
|
||||
<arg name="cancelled" type="int" summary="1 if the gesture was cancelled, 0 otherwise"/>
|
||||
</event>
|
||||
|
||||
</interface>
|
||||
</protocol>
|
||||
@ -0,0 +1,4 @@
|
||||
Primary selection protocol
|
||||
|
||||
Maintainers:
|
||||
Simon Ser <contact@emersion.fr>
|
||||
@ -0,0 +1,225 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<protocol name="wp_primary_selection_unstable_v1">
|
||||
<copyright>
|
||||
Copyright © 2015, 2016 Red Hat
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice (including the next
|
||||
paragraph) shall be included in all copies or substantial portions of the
|
||||
Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
</copyright>
|
||||
|
||||
<description summary="Primary selection protocol">
|
||||
This protocol provides the ability to have a primary selection device to
|
||||
match that of the X server. This primary selection is a shortcut to the
|
||||
common clipboard selection, where text just needs to be selected in order
|
||||
to allow copying it elsewhere. The de facto way to perform this action
|
||||
is the middle mouse button, although it is not limited to this one.
|
||||
|
||||
Clients wishing to honor primary selection should create a primary
|
||||
selection source and set it as the selection through
|
||||
wp_primary_selection_device.set_selection whenever the text selection
|
||||
changes. In order to minimize calls in pointer-driven text selection,
|
||||
it should happen only once after the operation finished. Similarly,
|
||||
a NULL source should be set when text is unselected.
|
||||
|
||||
wp_primary_selection_offer objects are first announced through the
|
||||
wp_primary_selection_device.data_offer event. Immediately after this event,
|
||||
the primary data offer will emit wp_primary_selection_offer.offer events
|
||||
to let know of the mime types being offered.
|
||||
|
||||
When the primary selection changes, the client with the keyboard focus
|
||||
will receive wp_primary_selection_device.selection events. Only the client
|
||||
with the keyboard focus will receive such events with a non-NULL
|
||||
wp_primary_selection_offer. Across keyboard focus changes, previously
|
||||
focused clients will receive wp_primary_selection_device.events with a
|
||||
NULL wp_primary_selection_offer.
|
||||
|
||||
In order to request the primary selection data, the client must pass
|
||||
a recent serial pertaining to the press event that is triggering the
|
||||
operation, if the compositor deems the serial valid and recent, the
|
||||
wp_primary_selection_source.send event will happen in the other end
|
||||
to let the transfer begin. The client owning the primary selection
|
||||
should write the requested data, and close the file descriptor
|
||||
immediately.
|
||||
|
||||
If the primary selection owner client disappeared during the transfer,
|
||||
the client reading the data will receive a
|
||||
wp_primary_selection_device.selection event with a NULL
|
||||
wp_primary_selection_offer, the client should take this as a hint
|
||||
to finish the reads related to the no longer existing offer.
|
||||
|
||||
The primary selection owner should be checking for errors during
|
||||
writes, merely cancelling the ongoing transfer if any happened.
|
||||
</description>
|
||||
|
||||
<interface name="zwp_primary_selection_device_manager_v1" version="1">
|
||||
<description summary="X primary selection emulation">
|
||||
The primary selection device manager is a singleton global object that
|
||||
provides access to the primary selection. It allows to create
|
||||
wp_primary_selection_source objects, as well as retrieving the per-seat
|
||||
wp_primary_selection_device objects.
|
||||
</description>
|
||||
|
||||
<request name="create_source">
|
||||
<description summary="create a new primary selection source">
|
||||
Create a new primary selection source.
|
||||
</description>
|
||||
<arg name="id" type="new_id" interface="zwp_primary_selection_source_v1"/>
|
||||
</request>
|
||||
|
||||
<request name="get_device">
|
||||
<description summary="create a new primary selection device">
|
||||
Create a new data device for a given seat.
|
||||
</description>
|
||||
<arg name="id" type="new_id" interface="zwp_primary_selection_device_v1"/>
|
||||
<arg name="seat" type="object" interface="wl_seat"/>
|
||||
</request>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="destroy the primary selection device manager">
|
||||
Destroy the primary selection device manager.
|
||||
</description>
|
||||
</request>
|
||||
</interface>
|
||||
|
||||
<interface name="zwp_primary_selection_device_v1" version="1">
|
||||
<request name="set_selection">
|
||||
<description summary="set the primary selection">
|
||||
Replaces the current selection. The previous owner of the primary
|
||||
selection will receive a wp_primary_selection_source.cancelled event.
|
||||
|
||||
To unset the selection, set the source to NULL.
|
||||
</description>
|
||||
<arg name="source" type="object" interface="zwp_primary_selection_source_v1" allow-null="true"/>
|
||||
<arg name="serial" type="uint" summary="serial of the event that triggered this request"/>
|
||||
</request>
|
||||
|
||||
<event name="data_offer">
|
||||
<description summary="introduce a new wp_primary_selection_offer">
|
||||
Introduces a new wp_primary_selection_offer object that may be used
|
||||
to receive the current primary selection. Immediately following this
|
||||
event, the new wp_primary_selection_offer object will send
|
||||
wp_primary_selection_offer.offer events to describe the offered mime
|
||||
types.
|
||||
</description>
|
||||
<arg name="offer" type="new_id" interface="zwp_primary_selection_offer_v1"/>
|
||||
</event>
|
||||
|
||||
<event name="selection">
|
||||
<description summary="advertise a new primary selection">
|
||||
The wp_primary_selection_device.selection event is sent to notify the
|
||||
client of a new primary selection. This event is sent after the
|
||||
wp_primary_selection.data_offer event introducing this object, and after
|
||||
the offer has announced its mimetypes through
|
||||
wp_primary_selection_offer.offer.
|
||||
|
||||
The data_offer is valid until a new offer or NULL is received
|
||||
or until the client loses keyboard focus. The client must destroy the
|
||||
previous selection data_offer, if any, upon receiving this event.
|
||||
</description>
|
||||
<arg name="id" type="object" interface="zwp_primary_selection_offer_v1" allow-null="true"/>
|
||||
</event>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="destroy the primary selection device">
|
||||
Destroy the primary selection device.
|
||||
</description>
|
||||
</request>
|
||||
</interface>
|
||||
|
||||
<interface name="zwp_primary_selection_offer_v1" version="1">
|
||||
<description summary="offer to transfer primary selection contents">
|
||||
A wp_primary_selection_offer represents an offer to transfer the contents
|
||||
of the primary selection clipboard to the client. Similar to
|
||||
wl_data_offer, the offer also describes the mime types that the data can
|
||||
be converted to and provides the mechanisms for transferring the data
|
||||
directly to the client.
|
||||
</description>
|
||||
|
||||
<request name="receive">
|
||||
<description summary="request that the data is transferred">
|
||||
To transfer the contents of the primary selection clipboard, the client
|
||||
issues this request and indicates the mime type that it wants to
|
||||
receive. The transfer happens through the passed file descriptor
|
||||
(typically created with the pipe system call). The source client writes
|
||||
the data in the mime type representation requested and then closes the
|
||||
file descriptor.
|
||||
|
||||
The receiving client reads from the read end of the pipe until EOF and
|
||||
closes its end, at which point the transfer is complete.
|
||||
</description>
|
||||
<arg name="mime_type" type="string"/>
|
||||
<arg name="fd" type="fd"/>
|
||||
</request>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="destroy the primary selection offer">
|
||||
Destroy the primary selection offer.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<event name="offer">
|
||||
<description summary="advertise offered mime type">
|
||||
Sent immediately after creating announcing the
|
||||
wp_primary_selection_offer through
|
||||
wp_primary_selection_device.data_offer. One event is sent per offered
|
||||
mime type.
|
||||
</description>
|
||||
<arg name="mime_type" type="string"/>
|
||||
</event>
|
||||
</interface>
|
||||
|
||||
<interface name="zwp_primary_selection_source_v1" version="1">
|
||||
<description summary="offer to replace the contents of the primary selection">
|
||||
The source side of a wp_primary_selection_offer, it provides a way to
|
||||
describe the offered data and respond to requests to transfer the
|
||||
requested contents of the primary selection clipboard.
|
||||
</description>
|
||||
|
||||
<request name="offer">
|
||||
<description summary="add an offered mime type">
|
||||
This request adds a mime type to the set of mime types advertised to
|
||||
targets. Can be called several times to offer multiple types.
|
||||
</description>
|
||||
<arg name="mime_type" type="string"/>
|
||||
</request>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="destroy the primary selection source">
|
||||
Destroy the primary selection source.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<event name="send">
|
||||
<description summary="send the primary selection contents">
|
||||
Request for the current primary selection contents from the client.
|
||||
Send the specified mime type over the passed file descriptor, then
|
||||
close it.
|
||||
</description>
|
||||
<arg name="mime_type" type="string"/>
|
||||
<arg name="fd" type="fd"/>
|
||||
</event>
|
||||
|
||||
<event name="cancelled">
|
||||
<description summary="request for primary selection contents was canceled">
|
||||
This primary selection source is no longer valid. The client should
|
||||
clean up and destroy this primary selection source.
|
||||
</description>
|
||||
</event>
|
||||
</interface>
|
||||
</protocol>
|
||||
@ -0,0 +1,4 @@
|
||||
Relative pointer protocol
|
||||
|
||||
Maintainers:
|
||||
Jonas Ådahl <jadahl@gmail.com>
|
||||
@ -0,0 +1,136 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<protocol name="relative_pointer_unstable_v1">
|
||||
|
||||
<copyright>
|
||||
Copyright © 2014 Jonas Ådahl
|
||||
Copyright © 2015 Red Hat Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice (including the next
|
||||
paragraph) shall be included in all copies or substantial portions of the
|
||||
Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
</copyright>
|
||||
|
||||
<description summary="protocol for relative pointer motion events">
|
||||
This protocol specifies a set of interfaces used for making clients able to
|
||||
receive relative pointer events not obstructed by barriers (such as the
|
||||
monitor edge or other pointer barriers).
|
||||
|
||||
To start receiving relative pointer events, a client must first bind the
|
||||
global interface "wp_relative_pointer_manager" which, if a compositor
|
||||
supports relative pointer motion events, is exposed by the registry. After
|
||||
having created the relative pointer manager proxy object, the client uses
|
||||
it to create the actual relative pointer object using the
|
||||
"get_relative_pointer" request given a wl_pointer. The relative pointer
|
||||
motion events will then, when applicable, be transmitted via the proxy of
|
||||
the newly created relative pointer object. See the documentation of the
|
||||
relative pointer interface for more details.
|
||||
|
||||
Warning! The protocol described in this file is experimental and backward
|
||||
incompatible changes may be made. Backward compatible changes may be added
|
||||
together with the corresponding interface version bump. Backward
|
||||
incompatible changes are done by bumping the version number in the protocol
|
||||
and interface names and resetting the interface version. Once the protocol
|
||||
is to be declared stable, the 'z' prefix and the version number in the
|
||||
protocol and interface names are removed and the interface version number is
|
||||
reset.
|
||||
</description>
|
||||
|
||||
<interface name="zwp_relative_pointer_manager_v1" version="1">
|
||||
<description summary="get relative pointer objects">
|
||||
A global interface used for getting the relative pointer object for a
|
||||
given pointer.
|
||||
</description>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="destroy the relative pointer manager object">
|
||||
Used by the client to notify the server that it will no longer use this
|
||||
relative pointer manager object.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<request name="get_relative_pointer">
|
||||
<description summary="get a relative pointer object">
|
||||
Create a relative pointer interface given a wl_pointer object. See the
|
||||
wp_relative_pointer interface for more details.
|
||||
</description>
|
||||
<arg name="id" type="new_id" interface="zwp_relative_pointer_v1"/>
|
||||
<arg name="pointer" type="object" interface="wl_pointer"/>
|
||||
</request>
|
||||
</interface>
|
||||
|
||||
<interface name="zwp_relative_pointer_v1" version="1">
|
||||
<description summary="relative pointer object">
|
||||
A wp_relative_pointer object is an extension to the wl_pointer interface
|
||||
used for emitting relative pointer events. It shares the same focus as
|
||||
wl_pointer objects of the same seat and will only emit events when it has
|
||||
focus.
|
||||
</description>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="release the relative pointer object"/>
|
||||
</request>
|
||||
|
||||
<event name="relative_motion">
|
||||
<description summary="relative pointer motion">
|
||||
Relative x/y pointer motion from the pointer of the seat associated with
|
||||
this object.
|
||||
|
||||
A relative motion is in the same dimension as regular wl_pointer motion
|
||||
events, except they do not represent an absolute position. For example,
|
||||
moving a pointer from (x, y) to (x', y') would have the equivalent
|
||||
relative motion (x' - x, y' - y). If a pointer motion caused the
|
||||
absolute pointer position to be clipped by for example the edge of the
|
||||
monitor, the relative motion is unaffected by the clipping and will
|
||||
represent the unclipped motion.
|
||||
|
||||
This event also contains non-accelerated motion deltas. The
|
||||
non-accelerated delta is, when applicable, the regular pointer motion
|
||||
delta as it was before having applied motion acceleration and other
|
||||
transformations such as normalization.
|
||||
|
||||
Note that the non-accelerated delta does not represent 'raw' events as
|
||||
they were read from some device. Pointer motion acceleration is device-
|
||||
and configuration-specific and non-accelerated deltas and accelerated
|
||||
deltas may have the same value on some devices.
|
||||
|
||||
Relative motions are not coupled to wl_pointer.motion events, and can be
|
||||
sent in combination with such events, but also independently. There may
|
||||
also be scenarios where wl_pointer.motion is sent, but there is no
|
||||
relative motion. The order of an absolute and relative motion event
|
||||
originating from the same physical motion is not guaranteed.
|
||||
|
||||
If the client needs button events or focus state, it can receive them
|
||||
from a wl_pointer object of the same seat that the wp_relative_pointer
|
||||
object is associated with.
|
||||
</description>
|
||||
<arg name="utime_hi" type="uint"
|
||||
summary="high 32 bits of a 64 bit timestamp with microsecond granularity"/>
|
||||
<arg name="utime_lo" type="uint"
|
||||
summary="low 32 bits of a 64 bit timestamp with microsecond granularity"/>
|
||||
<arg name="dx" type="fixed"
|
||||
summary="the x component of the motion vector"/>
|
||||
<arg name="dy" type="fixed"
|
||||
summary="the y component of the motion vector"/>
|
||||
<arg name="dx_unaccel" type="fixed"
|
||||
summary="the x component of the unaccelerated motion vector"/>
|
||||
<arg name="dy_unaccel" type="fixed"
|
||||
summary="the y component of the unaccelerated motion vector"/>
|
||||
</event>
|
||||
</interface>
|
||||
|
||||
</protocol>
|
||||
@ -0,0 +1,4 @@
|
||||
Tablet protocol
|
||||
|
||||
Maintainers:
|
||||
Peter Hutterer <peter.hutterer@who-t.net>
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,4 @@
|
||||
xdg_decoration protocol
|
||||
|
||||
Maintainers:
|
||||
Simon Ser <contact@emersion.fr>
|
||||
@ -0,0 +1,156 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<protocol name="xdg_decoration_unstable_v1">
|
||||
<copyright>
|
||||
Copyright © 2018 Simon Ser
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice (including the next
|
||||
paragraph) shall be included in all copies or substantial portions of the
|
||||
Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
</copyright>
|
||||
|
||||
<interface name="zxdg_decoration_manager_v1" version="1">
|
||||
<description summary="window decoration manager">
|
||||
This interface allows a compositor to announce support for server-side
|
||||
decorations.
|
||||
|
||||
A window decoration is a set of window controls as deemed appropriate by
|
||||
the party managing them, such as user interface components used to move,
|
||||
resize and change a window's state.
|
||||
|
||||
A client can use this protocol to request being decorated by a supporting
|
||||
compositor.
|
||||
|
||||
If compositor and client do not negotiate the use of a server-side
|
||||
decoration using this protocol, clients continue to self-decorate as they
|
||||
see fit.
|
||||
|
||||
Warning! The protocol described in this file is experimental and
|
||||
backward incompatible changes may be made. Backward compatible changes
|
||||
may be added together with the corresponding interface version bump.
|
||||
Backward incompatible changes are done by bumping the version number in
|
||||
the protocol and interface names and resetting the interface version.
|
||||
Once the protocol is to be declared stable, the 'z' prefix and the
|
||||
version number in the protocol and interface names are removed and the
|
||||
interface version number is reset.
|
||||
</description>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="destroy the decoration manager object">
|
||||
Destroy the decoration manager. This doesn't destroy objects created
|
||||
with the manager.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<request name="get_toplevel_decoration">
|
||||
<description summary="create a new toplevel decoration object">
|
||||
Create a new decoration object associated with the given toplevel.
|
||||
|
||||
Creating an xdg_toplevel_decoration from an xdg_toplevel which has a
|
||||
buffer attached or committed is a client error, and any attempts by a
|
||||
client to attach or manipulate a buffer prior to the first
|
||||
xdg_toplevel_decoration.configure event must also be treated as
|
||||
errors.
|
||||
</description>
|
||||
<arg name="id" type="new_id" interface="zxdg_toplevel_decoration_v1"/>
|
||||
<arg name="toplevel" type="object" interface="xdg_toplevel"/>
|
||||
</request>
|
||||
</interface>
|
||||
|
||||
<interface name="zxdg_toplevel_decoration_v1" version="1">
|
||||
<description summary="decoration object for a toplevel surface">
|
||||
The decoration object allows the compositor to toggle server-side window
|
||||
decorations for a toplevel surface. The client can request to switch to
|
||||
another mode.
|
||||
|
||||
The xdg_toplevel_decoration object must be destroyed before its
|
||||
xdg_toplevel.
|
||||
</description>
|
||||
|
||||
<enum name="error">
|
||||
<entry name="unconfigured_buffer" value="0"
|
||||
summary="xdg_toplevel has a buffer attached before configure"/>
|
||||
<entry name="already_constructed" value="1"
|
||||
summary="xdg_toplevel already has a decoration object"/>
|
||||
<entry name="orphaned" value="2"
|
||||
summary="xdg_toplevel destroyed before the decoration object"/>
|
||||
</enum>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="destroy the decoration object">
|
||||
Switch back to a mode without any server-side decorations at the next
|
||||
commit.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<enum name="mode">
|
||||
<description summary="window decoration modes">
|
||||
These values describe window decoration modes.
|
||||
</description>
|
||||
<entry name="client_side" value="1"
|
||||
summary="no server-side window decoration"/>
|
||||
<entry name="server_side" value="2"
|
||||
summary="server-side window decoration"/>
|
||||
</enum>
|
||||
|
||||
<request name="set_mode">
|
||||
<description summary="set the decoration mode">
|
||||
Set the toplevel surface decoration mode. This informs the compositor
|
||||
that the client prefers the provided decoration mode.
|
||||
|
||||
After requesting a decoration mode, the compositor will respond by
|
||||
emitting an xdg_surface.configure event. The client should then update
|
||||
its content, drawing it without decorations if the received mode is
|
||||
server-side decorations. The client must also acknowledge the configure
|
||||
when committing the new content (see xdg_surface.ack_configure).
|
||||
|
||||
The compositor can decide not to use the client's mode and enforce a
|
||||
different mode instead.
|
||||
|
||||
Clients whose decoration mode depend on the xdg_toplevel state may send
|
||||
a set_mode request in response to an xdg_surface.configure event and wait
|
||||
for the next xdg_surface.configure event to prevent unwanted state.
|
||||
Such clients are responsible for preventing configure loops and must
|
||||
make sure not to send multiple successive set_mode requests with the
|
||||
same decoration mode.
|
||||
</description>
|
||||
<arg name="mode" type="uint" enum="mode" summary="the decoration mode"/>
|
||||
</request>
|
||||
|
||||
<request name="unset_mode">
|
||||
<description summary="unset the decoration mode">
|
||||
Unset the toplevel surface decoration mode. This informs the compositor
|
||||
that the client doesn't prefer a particular decoration mode.
|
||||
|
||||
This request has the same semantics as set_mode.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<event name="configure">
|
||||
<description summary="suggest a surface change">
|
||||
The configure event asks the client to change its decoration mode. The
|
||||
configured state should not be applied immediately. Clients must send an
|
||||
ack_configure in response to this event. See xdg_surface.configure and
|
||||
xdg_surface.ack_configure for details.
|
||||
|
||||
A configure event can be sent at any time. The specified mode must be
|
||||
obeyed by the client.
|
||||
</description>
|
||||
<arg name="mode" type="uint" enum="mode" summary="the decoration mode"/>
|
||||
</event>
|
||||
</interface>
|
||||
</protocol>
|
||||
@ -0,0 +1,29 @@
|
||||
Copyright © 2008-2012 Kristian Høgsberg
|
||||
Copyright © 2010-2012 Intel Corporation
|
||||
Copyright © 2011 Benjamin Franzke
|
||||
Copyright © 2012 Collabora, Ltd.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice (including the next
|
||||
paragraph) shall be included in all copies or substantial portions of the
|
||||
Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
|
||||
---
|
||||
|
||||
The above is the version of the MIT "Expat" License used by X.org:
|
||||
|
||||
http://cgit.freedesktop.org/xorg/xserver/tree/COPYING
|
||||
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue