22#include "../../SDL_internal.h"
24#if SDL_VIDEO_DRIVER_WAYLAND
29#include "../../events/SDL_events_c.h"
43#include <xkbcommon/xkbcommon.h>
46#include <wayland-util.h>
53#define WAYLANDVID_DRIVER_NAME "wayland"
57Wayland_VideoInit(
_THIS);
65Wayland_VideoQuit(
_THIS);
79#if defined(__LINUX__) || defined(__FREEBSD__)
86 spot =
SDL_getenv(
"SDL_VIDEO_WAYLAND_WMCLASS");
98#if defined(__LINUX__) || defined(__FREEBSD__)
101#elif defined(__FREEBSD__)
105#error Where can we find the executable name?
107 linksize = readlink(procfile, linkfile,
sizeof(linkfile) - 1);
109 linkfile[linksize] =
'\0';
125Wayland_Available(
void)
127 struct wl_display *display =
NULL;
129 display = WAYLAND_wl_display_connect(
NULL);
130 if (display !=
NULL) {
131 WAYLAND_wl_display_disconnect(display);
136 return (display !=
NULL);
147Wayland_CreateDevice(
int devindex)
164 device->VideoInit = Wayland_VideoInit;
165 device->VideoQuit = Wayland_VideoQuit;
166 device->SetDisplayMode = Wayland_SetDisplayMode;
167 device->GetDisplayModes = Wayland_GetDisplayModes;
199 device->Vulkan_LoadLibrary = Wayland_Vulkan_LoadLibrary;
200 device->Vulkan_UnloadLibrary = Wayland_Vulkan_UnloadLibrary;
201 device->Vulkan_GetInstanceExtensions = Wayland_Vulkan_GetInstanceExtensions;
202 device->Vulkan_CreateSurface = Wayland_Vulkan_CreateSurface;
203 device->Vulkan_GetDrawableSize = Wayland_Vulkan_GetDrawableSize;
206 device->free = Wayland_DeleteDevice;
212 WAYLANDVID_DRIVER_NAME,
"SDL Wayland video driver",
213 Wayland_Available, Wayland_CreateDevice
217display_handle_geometry(
void *
data,
234display_handle_mode(
void *
data,
248 mode.refresh_rate = refresh / 1000;
259display_handle_done(
void *
data,
271display_handle_scale(
void *
data,
280 display_handle_geometry,
306 data->scale_factor = 1.0;
312#ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH
314windowmanager_hints(
void *
data,
struct qt_windowmanager *qt_windowmanager,
320windowmanager_quit(
void *
data,
struct qt_windowmanager *qt_windowmanager)
325static const struct qt_windowmanager_listener windowmanager_listener = {
333handle_ping_zxdg_shell(
void *
data,
struct zxdg_shell_v6 *zxdg,
uint32_t serial)
339 handle_ping_zxdg_shell
344handle_ping_xdg_wm_base(
void *
data,
struct xdg_wm_base *xdg,
uint32_t serial)
350 handle_ping_xdg_wm_base
355display_handle_global(
void *
data,
struct wl_registry *registry,
uint32_t id,
356 const char *interface,
uint32_t version)
362 if (strcmp(interface,
"wl_compositor") == 0) {
364 }
else if (strcmp(interface,
"wl_output") == 0) {
365 Wayland_add_display(
d,
id);
366 }
else if (strcmp(interface,
"wl_seat") == 0) {
368 }
else if (strcmp(interface,
"xdg_wm_base") == 0) {
371 }
else if (strcmp(interface,
"zxdg_shell_v6") == 0) {
374 }
else if (strcmp(interface,
"wl_shell") == 0) {
376 }
else if (strcmp(interface,
"wl_shm") == 0) {
378 d->cursor_theme = WAYLAND_wl_cursor_theme_load(
NULL, 32,
d->shm);
379 }
else if (strcmp(interface,
"zwp_relative_pointer_manager_v1") == 0) {
381 }
else if (strcmp(interface,
"zwp_pointer_constraints_v1") == 0) {
383 }
else if (strcmp(interface,
"wl_data_device_manager") == 0) {
385 }
else if (strcmp(interface,
"zxdg_decoration_manager_v1") == 0) {
387 }
else if (strcmp(interface,
"org_kde_kwin_server_decoration_manager") == 0) {
390#ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH
391 }
else if (strcmp(interface,
"qt_touch_extension") == 0) {
392 Wayland_touch_create(
d,
id);
393 }
else if (strcmp(interface,
"qt_surface_extension") == 0) {
395 &qt_surface_extension_interface, 1);
396 }
else if (strcmp(interface,
"qt_windowmanager") == 0) {
398 &qt_windowmanager_interface, 1);
399 qt_windowmanager_add_listener(
d->windowmanager, &windowmanager_listener,
d);
405display_remove_global(
void *
data,
struct wl_registry *registry,
uint32_t id) {}
408 display_handle_global,
409 display_remove_global
413Wayland_VideoInit(
_THIS)
422 data->xkb_context = WAYLAND_xkb_context_new(0);
423 if (!
data->xkb_context) {
427 data->display = WAYLAND_wl_display_connect(
NULL);
429 return SDL_SetError(
"Failed to connect to a Wayland display");
434 return SDL_SetError(
"Failed to get the Wayland registry");
440 WAYLAND_wl_display_roundtrip(
data->display);
443 WAYLAND_wl_display_roundtrip(
data->display);
448 data->classname = get_classname();
450 WAYLAND_wl_display_flush(
data->display);
469Wayland_VideoQuit(
_THIS)
474 Wayland_FiniMouse ();
493 if (
data->xkb_context) {
494 WAYLAND_xkb_context_unref(
data->xkb_context);
497#ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH
498 if (
data->windowmanager)
499 qt_windowmanager_destroy(
data->windowmanager);
501 if (
data->surface_extension)
502 qt_surface_extension_destroy(
data->surface_extension);
504 Wayland_touch_destroy(
data);
510 if (
data->cursor_theme)
511 WAYLAND_wl_cursor_theme_destroy(
data->cursor_theme);
519 if (
data->shell.zxdg)
522 if (
data->compositor)
529 WAYLAND_wl_display_flush(
data->display);
530 WAYLAND_wl_display_disconnect(
data->display);
SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char const char SDL_SCANF_FORMAT_STRING const char return SDL_ThreadFunction const char void return Uint32 return Uint32 SDL_AssertionHandler void SDL_SpinLock SDL_atomic_t int int return SDL_atomic_t return void void void return void return int return SDL_AudioSpec SDL_AudioSpec return int int return return int SDL_RWops int SDL_AudioSpec Uint8 ** d
#define SDL_OutOfMemory()
#define SDL_Unsupported()
GLint GLint GLint GLint GLint GLint y
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLint GLint GLsizei width
GLint GLint GLint GLint GLint x
GLint GLint GLsizei GLsizei height
GLuint GLenum GLenum transform
#define SDL_arraysize(array)
VideoBootStrap Wayland_bootstrap
int SDL_AddVideoDisplay(const SDL_VideoDisplay *display)
SDL_bool SDL_AddDisplayMode(SDL_VideoDisplay *display, const SDL_DisplayMode *mode)
static SDL_VideoDevice * _this
SDL_bool Wayland_HasClipboardText(_THIS)
char * Wayland_GetClipboardText(_THIS)
int Wayland_SetClipboardText(_THIS, const char *text)
int SDL_WAYLAND_LoadSymbols(void)
void SDL_WAYLAND_UnloadSymbols(void)
void Wayland_display_destroy_input(SDL_VideoData *d)
void Wayland_display_destroy_relative_pointer_manager(SDL_VideoData *d)
void Wayland_display_destroy_pointer_constraints(SDL_VideoData *d)
void Wayland_display_add_pointer_constraints(SDL_VideoData *d, uint32_t id)
void Wayland_display_add_relative_pointer_manager(SDL_VideoData *d, uint32_t id)
void Wayland_display_add_input(SDL_VideoData *d, uint32_t id)
void Wayland_PumpEvents(_THIS)
#define Wayland_GLES_UnloadLibrary
int Wayland_GLES_SwapWindow(_THIS, SDL_Window *window)
int Wayland_GLES_LoadLibrary(_THIS, const char *path)
int Wayland_GLES_MakeCurrent(_THIS, SDL_Window *window, SDL_GLContext context)
SDL_GLContext Wayland_GLES_CreateContext(_THIS, SDL_Window *window)
#define Wayland_GLES_SetSwapInterval
void Wayland_GLES_GetDrawableSize(_THIS, SDL_Window *window, int *w, int *h)
#define Wayland_GLES_GetSwapInterval
#define Wayland_GLES_GetProcAddress
void Wayland_GLES_DeleteContext(_THIS, SDL_GLContext context)
void Wayland_SetWindowFullscreen(_THIS, SDL_Window *window, SDL_VideoDisplay *_display, SDL_bool fullscreen)
SDL_bool Wayland_GetWindowWMInfo(_THIS, SDL_Window *window, SDL_SysWMinfo *info)
void Wayland_RestoreWindow(_THIS, SDL_Window *window)
void Wayland_SetWindowTitle(_THIS, SDL_Window *window)
int Wayland_SetWindowHitTest(SDL_Window *window, SDL_bool enabled)
void Wayland_ShowWindow(_THIS, SDL_Window *window)
int Wayland_CreateWindow(_THIS, SDL_Window *window)
void Wayland_SetWindowSize(_THIS, SDL_Window *window)
void Wayland_DestroyWindow(_THIS, SDL_Window *window)
void Wayland_MaximizeWindow(_THIS, SDL_Window *window)
void Wayland_SetWindowBordered(_THIS, SDL_Window *window, SDL_bool bordered)
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int int in j)
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
static void wl_compositor_destroy(struct wl_compositor *wl_compositor)
static struct wl_registry * wl_display_get_registry(struct wl_display *wl_display)
static void wl_output_set_user_data(struct wl_output *wl_output, void *user_data)
static void wl_output_destroy(struct wl_output *wl_output)
static int wl_output_add_listener(struct wl_output *wl_output, const struct wl_output_listener *listener, void *data)
static void wl_registry_destroy(struct wl_registry *wl_registry)
static void * wl_registry_bind(struct wl_registry *wl_registry, uint32_t name, const struct wl_interface *interface, uint32_t version)
static int wl_registry_add_listener(struct wl_registry *wl_registry, const struct wl_registry_listener *listener, void *data)
static void wl_shell_destroy(struct wl_shell *wl_shell)
static void wl_shm_destroy(struct wl_shm *wl_shm)
static void xdg_wm_base_destroy(struct xdg_wm_base *xdg_wm_base)
static int xdg_wm_base_add_listener(struct xdg_wm_base *xdg_wm_base, const struct xdg_wm_base_listener *listener, void *data)
static void xdg_wm_base_pong(struct xdg_wm_base *xdg_wm_base, uint32_t serial)
static void zxdg_shell_v6_destroy(struct zxdg_shell_v6 *zxdg_shell_v6)
static int zxdg_shell_v6_add_listener(struct zxdg_shell_v6 *zxdg_shell_v6, const struct zxdg_shell_v6_listener *listener, void *data)
static void zxdg_shell_v6_pong(struct zxdg_shell_v6 *zxdg_shell_v6, uint32_t serial)
static SDL_AudioDeviceID device
const struct wl_interface org_kde_kwin_server_decoration_manager_interface
The structure that defines a display mode.
SDL_VideoDisplay * displays
SDL_DisplayMode desktop_mode
SDL_DisplayMode * display_modes
SDL_DisplayMode current_mode
const struct wl_interface wl_shm_interface
const struct wl_interface wl_output_interface
const struct wl_interface wl_shell_interface
const struct wl_interface wl_compositor_interface
const struct wl_interface wl_data_device_manager_interface
const struct wl_interface zxdg_decoration_manager_v1_interface
const struct wl_interface xdg_wm_base_interface
const struct wl_interface zxdg_shell_v6_interface