diff options
Diffstat (limited to '3rdparty/SDL2/src/video/wayland/SDL_waylandvideo.c')
-rw-r--r-- | 3rdparty/SDL2/src/video/wayland/SDL_waylandvideo.c | 448 |
1 files changed, 0 insertions, 448 deletions
diff --git a/3rdparty/SDL2/src/video/wayland/SDL_waylandvideo.c b/3rdparty/SDL2/src/video/wayland/SDL_waylandvideo.c deleted file mode 100644 index 554b0ecada1..00000000000 --- a/3rdparty/SDL2/src/video/wayland/SDL_waylandvideo.c +++ /dev/null @@ -1,448 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_WAYLAND - -#include "SDL_video.h" -#include "SDL_mouse.h" -#include "SDL_stdinc.h" -#include "../../events/SDL_events_c.h" - -#include "SDL_waylandvideo.h" -#include "SDL_waylandevents_c.h" -#include "SDL_waylandwindow.h" -#include "SDL_waylandopengles.h" -#include "SDL_waylandmouse.h" -#include "SDL_waylandtouch.h" - -#include <sys/types.h> -#include <unistd.h> -#include <fcntl.h> -#include <xkbcommon/xkbcommon.h> - -#include "SDL_waylanddyn.h" -#include <wayland-util.h> - -#define WAYLANDVID_DRIVER_NAME "wayland" - -/* Initialization/Query functions */ -static int -Wayland_VideoInit(_THIS); - -static void -Wayland_GetDisplayModes(_THIS, SDL_VideoDisplay *sdl_display); -static int -Wayland_SetDisplayMode(_THIS, SDL_VideoDisplay *display, SDL_DisplayMode *mode); - -static void -Wayland_VideoQuit(_THIS); - -/* Find out what class name we should use - * Based on src/video/x11/SDL_x11video.c */ -static char * -get_classname() -{ - char *spot; -#if defined(__LINUX__) || defined(__FREEBSD__) - char procfile[1024]; - char linkfile[1024]; - int linksize; -#endif - - /* First allow environment variable override */ - spot = SDL_getenv("SDL_VIDEO_WAYLAND_WMCLASS"); - if (spot) { - return SDL_strdup(spot); - } else { - /* Fallback to the "old" envvar */ - spot = SDL_getenv("SDL_VIDEO_X11_WMCLASS"); - if (spot) { - return SDL_strdup(spot); - } - } - - /* Next look at the application's executable name */ -#if defined(__LINUX__) || defined(__FREEBSD__) -#if defined(__LINUX__) - SDL_snprintf(procfile, SDL_arraysize(procfile), "/proc/%d/exe", getpid()); -#elif defined(__FREEBSD__) - SDL_snprintf(procfile, SDL_arraysize(procfile), "/proc/%d/file", - getpid()); -#else -#error Where can we find the executable name? -#endif - linksize = readlink(procfile, linkfile, sizeof(linkfile) - 1); - if (linksize > 0) { - linkfile[linksize] = '\0'; - spot = SDL_strrchr(linkfile, '/'); - if (spot) { - return SDL_strdup(spot + 1); - } else { - return SDL_strdup(linkfile); - } - } -#endif /* __LINUX__ || __FREEBSD__ */ - - /* Finally use the default we've used forever */ - return SDL_strdup("SDL_App"); -} - -/* Wayland driver bootstrap functions */ -static int -Wayland_Available(void) -{ - struct wl_display *display = NULL; - if (SDL_WAYLAND_LoadSymbols()) { - display = WAYLAND_wl_display_connect(NULL); - if (display != NULL) { - WAYLAND_wl_display_disconnect(display); - } - SDL_WAYLAND_UnloadSymbols(); - } - - return (display != NULL); -} - -static void -Wayland_DeleteDevice(SDL_VideoDevice *device) -{ - SDL_free(device); - SDL_WAYLAND_UnloadSymbols(); -} - -static SDL_VideoDevice * -Wayland_CreateDevice(int devindex) -{ - SDL_VideoDevice *device; - - if (!SDL_WAYLAND_LoadSymbols()) { - return NULL; - } - - /* Initialize all variables that we clean on shutdown */ - device = SDL_calloc(1, sizeof(SDL_VideoDevice)); - if (!device) { - SDL_WAYLAND_UnloadSymbols(); - SDL_OutOfMemory(); - return NULL; - } - - /* Set the function pointers */ - device->VideoInit = Wayland_VideoInit; - device->VideoQuit = Wayland_VideoQuit; - device->SetDisplayMode = Wayland_SetDisplayMode; - device->GetDisplayModes = Wayland_GetDisplayModes; - device->GetWindowWMInfo = Wayland_GetWindowWMInfo; - - device->PumpEvents = Wayland_PumpEvents; - - device->GL_SwapWindow = Wayland_GLES_SwapWindow; - device->GL_GetSwapInterval = Wayland_GLES_GetSwapInterval; - device->GL_SetSwapInterval = Wayland_GLES_SetSwapInterval; - device->GL_MakeCurrent = Wayland_GLES_MakeCurrent; - device->GL_CreateContext = Wayland_GLES_CreateContext; - device->GL_LoadLibrary = Wayland_GLES_LoadLibrary; - device->GL_UnloadLibrary = Wayland_GLES_UnloadLibrary; - device->GL_GetProcAddress = Wayland_GLES_GetProcAddress; - device->GL_DeleteContext = Wayland_GLES_DeleteContext; - - device->CreateWindow = Wayland_CreateWindow; - device->ShowWindow = Wayland_ShowWindow; - device->SetWindowFullscreen = Wayland_SetWindowFullscreen; - device->MaximizeWindow = Wayland_MaximizeWindow; - device->RestoreWindow = Wayland_RestoreWindow; - device->SetWindowSize = Wayland_SetWindowSize; - device->SetWindowTitle = Wayland_SetWindowTitle; - device->DestroyWindow = Wayland_DestroyWindow; - device->SetWindowHitTest = Wayland_SetWindowHitTest; - - device->free = Wayland_DeleteDevice; - - return device; -} - -VideoBootStrap Wayland_bootstrap = { - WAYLANDVID_DRIVER_NAME, "SDL Wayland video driver", - Wayland_Available, Wayland_CreateDevice -}; - -static void -display_handle_geometry(void *data, - struct wl_output *output, - int x, int y, - int physical_width, - int physical_height, - int subpixel, - const char *make, - const char *model, - int transform) - -{ - SDL_VideoDisplay *display = data; - - display->name = SDL_strdup(model); - display->driverdata = output; -} - -static void -display_handle_mode(void *data, - struct wl_output *output, - uint32_t flags, - int width, - int height, - int refresh) -{ - SDL_VideoDisplay *display = data; - SDL_DisplayMode mode; - - SDL_zero(mode); - mode.w = width; - mode.h = height; - mode.refresh_rate = refresh / 1000; // mHz to Hz - SDL_AddDisplayMode(display, &mode); - - if (flags & WL_OUTPUT_MODE_CURRENT) { - display->current_mode = mode; - display->desktop_mode = mode; - } -} - -static void -display_handle_done(void *data, - struct wl_output *output) -{ - SDL_VideoDisplay *display = data; - SDL_AddVideoDisplay(display); - SDL_free(display->name); - SDL_free(display); -} - -static void -display_handle_scale(void *data, - struct wl_output *output, - int32_t factor) -{ - // TODO: do HiDPI stuff. -} - -static const struct wl_output_listener output_listener = { - display_handle_geometry, - display_handle_mode, - display_handle_done, - display_handle_scale -}; - -static void -Wayland_add_display(SDL_VideoData *d, uint32_t id) -{ - struct wl_output *output; - SDL_VideoDisplay *display = SDL_malloc(sizeof *display); - if (!display) { - SDL_OutOfMemory(); - return; - } - SDL_zero(*display); - - output = wl_registry_bind(d->registry, id, &wl_output_interface, 2); - if (!output) { - SDL_SetError("Failed to retrieve output."); - return; - } - - wl_output_add_listener(output, &output_listener, display); -} - -#ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH -static void -windowmanager_hints(void *data, struct qt_windowmanager *qt_windowmanager, - int32_t show_is_fullscreen) -{ -} - -static void -windowmanager_quit(void *data, struct qt_windowmanager *qt_windowmanager) -{ - SDL_SendQuit(); -} - -static const struct qt_windowmanager_listener windowmanager_listener = { - windowmanager_hints, - windowmanager_quit, -}; -#endif /* SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */ - -static void -display_handle_global(void *data, struct wl_registry *registry, uint32_t id, - const char *interface, uint32_t version) -{ - SDL_VideoData *d = data; - - if (strcmp(interface, "wl_compositor") == 0) { - d->compositor = wl_registry_bind(d->registry, id, &wl_compositor_interface, 1); - } else if (strcmp(interface, "wl_output") == 0) { - Wayland_add_display(d, id); - } else if (strcmp(interface, "wl_seat") == 0) { - Wayland_display_add_input(d, id); - } else if (strcmp(interface, "wl_shell") == 0) { - d->shell = wl_registry_bind(d->registry, id, &wl_shell_interface, 1); - } else if (strcmp(interface, "wl_shm") == 0) { - d->shm = wl_registry_bind(registry, id, &wl_shm_interface, 1); - d->cursor_theme = WAYLAND_wl_cursor_theme_load(NULL, 32, d->shm); - } else if (strcmp(interface, "zwp_relative_pointer_manager_v1") == 0) { - Wayland_display_add_relative_pointer_manager(d, id); - } else if (strcmp(interface, "zwp_pointer_constraints_v1") == 0) { - Wayland_display_add_pointer_constraints(d, id); -#ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH - } else if (strcmp(interface, "qt_touch_extension") == 0) { - Wayland_touch_create(d, id); - } else if (strcmp(interface, "qt_surface_extension") == 0) { - d->surface_extension = wl_registry_bind(registry, id, - &qt_surface_extension_interface, 1); - } else if (strcmp(interface, "qt_windowmanager") == 0) { - d->windowmanager = wl_registry_bind(registry, id, - &qt_windowmanager_interface, 1); - qt_windowmanager_add_listener(d->windowmanager, &windowmanager_listener, d); -#endif /* SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */ - } -} - -static const struct wl_registry_listener registry_listener = { - display_handle_global -}; - -int -Wayland_VideoInit(_THIS) -{ - SDL_VideoData *data = SDL_malloc(sizeof *data); - if (data == NULL) - return SDL_OutOfMemory(); - memset(data, 0, sizeof *data); - - _this->driverdata = data; - - data->xkb_context = WAYLAND_xkb_context_new(0); - if (!data->xkb_context) { - return SDL_SetError("Failed to create XKB context"); - } - - data->display = WAYLAND_wl_display_connect(NULL); - if (data->display == NULL) { - return SDL_SetError("Failed to connect to a Wayland display"); - } - - data->registry = wl_display_get_registry(data->display); - if (data->registry == NULL) { - return SDL_SetError("Failed to get the Wayland registry"); - } - - wl_registry_add_listener(data->registry, ®istry_listener, data); - - // First roundtrip to receive all registry objects. - WAYLAND_wl_display_roundtrip(data->display); - - // Second roundtrip to receive all output events. - WAYLAND_wl_display_roundtrip(data->display); - - Wayland_InitMouse(); - - /* Get the surface class name, usually the name of the application */ - data->classname = get_classname(); - - WAYLAND_wl_display_flush(data->display); - - return 0; -} - -static void -Wayland_GetDisplayModes(_THIS, SDL_VideoDisplay *sdl_display) -{ - // Nothing to do here, everything was already done in the wl_output - // callbacks. -} - -static int -Wayland_SetDisplayMode(_THIS, SDL_VideoDisplay *display, SDL_DisplayMode *mode) -{ - return SDL_Unsupported(); -} - -void -Wayland_VideoQuit(_THIS) -{ - SDL_VideoData *data = _this->driverdata; - int i; - - Wayland_FiniMouse (); - - for (i = 0; i < _this->num_displays; ++i) { - SDL_VideoDisplay *display = &_this->displays[i]; - wl_output_destroy(display->driverdata); - display->driverdata = NULL; - } - - Wayland_display_destroy_input(data); - Wayland_display_destroy_pointer_constraints(data); - Wayland_display_destroy_relative_pointer_manager(data); - - if (data->xkb_context) { - WAYLAND_xkb_context_unref(data->xkb_context); - data->xkb_context = NULL; - } -#ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH - if (data->windowmanager) - qt_windowmanager_destroy(data->windowmanager); - - if (data->surface_extension) - qt_surface_extension_destroy(data->surface_extension); - - Wayland_touch_destroy(data); -#endif /* SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */ - - if (data->shm) - wl_shm_destroy(data->shm); - - if (data->cursor_theme) - WAYLAND_wl_cursor_theme_destroy(data->cursor_theme); - - if (data->shell) - wl_shell_destroy(data->shell); - - if (data->compositor) - wl_compositor_destroy(data->compositor); - - if (data->registry) - wl_registry_destroy(data->registry); - - if (data->display) { - WAYLAND_wl_display_flush(data->display); - WAYLAND_wl_display_disconnect(data->display); - } - - SDL_free(data->classname); - free(data); - _this->driverdata = NULL; -} - -#endif /* SDL_VIDEO_DRIVER_WAYLAND */ - -/* vi: set ts=4 sw=4 expandtab: */ |