Go to the documentation of this file.
22 #include "../../SDL_internal.h"
24 #if SDL_VIDEO_DRIVER_WAYLAND
29 #include "../../events/SDL_events_c.h"
40 #include <sys/types.h>
43 #include <xkbcommon/xkbcommon.h>
46 #include <wayland-util.h>
53 #define WAYLANDVID_DRIVER_NAME "wayland"
57 Wayland_VideoInit(
_THIS);
65 Wayland_VideoQuit(
_THIS);
79 #if defined(__LINUX__) || defined(__FREEBSD__)
86 spot =
SDL_getenv(
"SDL_VIDEO_WAYLAND_WMCLASS");
98 #if defined(__LINUX__) || defined(__FREEBSD__)
99 #if defined(__LINUX__)
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';
125 Wayland_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);
147 Wayland_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
217 display_handle_geometry(
void *
data,
234 display_handle_mode(
void *
data,
248 mode.refresh_rate = refresh / 1000;
259 display_handle_done(
void *
data,
271 display_handle_scale(
void *
data,
280 display_handle_geometry,
306 data->scale_factor = 1.0;
312 #ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH
314 windowmanager_hints(
void *
data,
struct qt_windowmanager *qt_windowmanager,
320 windowmanager_quit(
void *
data,
struct qt_windowmanager *qt_windowmanager)
325 static const struct qt_windowmanager_listener windowmanager_listener = {
333 handle_ping_zxdg_shell(
void *
data,
struct zxdg_shell_v6 *zxdg,
uint32_t serial)
339 handle_ping_zxdg_shell
344 handle_ping_xdg_wm_base(
void *
data,
struct xdg_wm_base *xdg,
uint32_t serial)
350 handle_ping_xdg_wm_base
355 display_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);
405 display_remove_global(
void *
data,
struct wl_registry *registry,
uint32_t id) {}
408 display_handle_global,
409 display_remove_global
413 Wayland_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);
469 Wayland_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);
#define Wayland_GLES_SetSwapInterval
void SDL_WAYLAND_UnloadSymbols(void)
static void zxdg_shell_v6_destroy(struct zxdg_shell_v6 *zxdg_shell_v6)
static struct wl_registry * wl_display_get_registry(struct wl_display *wl_display)
static int zxdg_shell_v6_add_listener(struct zxdg_shell_v6 *zxdg_shell_v6, const struct zxdg_shell_v6_listener *listener, void *data)
SDL_DisplayMode * display_modes
static int wl_output_add_listener(struct wl_output *wl_output, const struct wl_output_listener *listener, void *data)
SDL_bool Wayland_HasClipboardText(_THIS)
int Wayland_GLES_MakeCurrent(_THIS, SDL_Window *window, SDL_GLContext context)
static void wl_output_destroy(struct wl_output *wl_output)
int Wayland_GLES_LoadLibrary(_THIS, const char *path)
GLint GLint GLsizei width
static void wl_compositor_destroy(struct wl_compositor *wl_compositor)
static void xdg_wm_base_pong(struct xdg_wm_base *xdg_wm_base, uint32_t serial)
void Wayland_GLES_GetDrawableSize(_THIS, SDL_Window *window, int *w, int *h)
SDL_GLContext Wayland_GLES_CreateContext(_THIS, SDL_Window *window)
const struct wl_interface xdg_wm_base_interface
const struct wl_interface zxdg_decoration_manager_v1_interface
void Wayland_display_add_input(SDL_VideoData *d, uint32_t id)
void Wayland_MaximizeWindow(_THIS, SDL_Window *window)
int Wayland_GLES_SwapWindow(_THIS, SDL_Window *window)
SDL_DisplayMode desktop_mode
void Wayland_PumpEvents(_THIS)
void Wayland_display_destroy_input(SDL_VideoData *d)
static void wl_shell_destroy(struct wl_shell *wl_shell)
const struct wl_interface wl_compositor_interface
static void zxdg_shell_v6_pong(struct zxdg_shell_v6 *zxdg_shell_v6, uint32_t serial)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
The structure that defines a display mode.
SDL_bool SDL_AddDisplayMode(SDL_VideoDisplay *display, const SDL_DisplayMode *mode)
#define Wayland_GLES_GetSwapInterval
const struct wl_interface wl_data_device_manager_interface
void Wayland_GLES_DeleteContext(_THIS, SDL_GLContext context)
static void * wl_registry_bind(struct wl_registry *wl_registry, uint32_t name, const struct wl_interface *interface, uint32_t version)
void Wayland_ShowWindow(_THIS, SDL_Window *window)
static int xdg_wm_base_add_listener(struct xdg_wm_base *xdg_wm_base, const struct xdg_wm_base_listener *listener, void *data)
void Wayland_SetWindowTitle(_THIS, SDL_Window *window)
static SDL_VideoDevice * _this
GLint GLint GLint GLint GLint x
const struct wl_interface wl_shell_interface
void Wayland_display_destroy_pointer_constraints(SDL_VideoData *d)
GLint GLint GLsizei GLsizei height
const struct wl_interface wl_shm_interface
static void xdg_wm_base_destroy(struct xdg_wm_base *xdg_wm_base)
SDL_VideoDisplay * displays
void Wayland_RestoreWindow(_THIS, SDL_Window *window)
const struct wl_interface zxdg_shell_v6_interface
const struct wl_interface wl_output_interface
static void wl_shm_destroy(struct wl_shm *wl_shm)
#define Wayland_GLES_GetProcAddress
SDL_bool Wayland_GetWindowWMInfo(_THIS, SDL_Window *window, SDL_SysWMinfo *info)
int SDL_AddVideoDisplay(const SDL_VideoDisplay *display)
void Wayland_DestroyWindow(_THIS, SDL_Window *window)
VideoBootStrap Wayland_bootstrap
void Wayland_SetWindowBordered(_THIS, SDL_Window *window, SDL_bool bordered)
void Wayland_display_destroy_relative_pointer_manager(SDL_VideoData *d)
void Wayland_display_add_pointer_constraints(SDL_VideoData *d, uint32_t id)
int Wayland_SetClipboardText(_THIS, const char *text)
#define SDL_OutOfMemory()
GLint GLint GLint GLint GLint GLint y
int SDL_WAYLAND_LoadSymbols(void)
#define SDL_arraysize(array)
GLuint GLenum GLenum transform
static void wl_output_set_user_data(struct wl_output *wl_output, void *user_data)
char * Wayland_GetClipboardText(_THIS)
void Wayland_SetWindowFullscreen(_THIS, SDL_Window *window, SDL_VideoDisplay *_display, SDL_bool fullscreen)
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)
int Wayland_SetWindowHitTest(SDL_Window *window, SDL_bool enabled)
void Wayland_display_add_relative_pointer_manager(SDL_VideoData *d, uint32_t id)
const struct wl_interface org_kde_kwin_server_decoration_manager_interface
#define Wayland_GLES_UnloadLibrary
#define SDL_Unsupported()
SDL_DisplayMode current_mode
static int wl_registry_add_listener(struct wl_registry *wl_registry, const struct wl_registry_listener *listener, void *data)
static SDL_AudioDeviceID device
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_registry_destroy(struct wl_registry *wl_registry)
const SDL_PRINTF_FORMAT_STRING char int const SDL_PRINTF_FORMAT_STRING char int const SDL_PRINTF_FORMAT_STRING char int const SDL_PRINTF_FORMAT_STRING char const char const SDL_SCANF_FORMAT_STRING 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
int Wayland_CreateWindow(_THIS, SDL_Window *window)
void Wayland_SetWindowSize(_THIS, SDL_Window *window)