diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 07ca7c53..71861cd6 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -32,9 +32,6 @@ add_feature_info(ENABLE_ASAN ENABLE_ASAN "AddressSanitizer support.") option(ENABLE_UBSAN "Build with UndefinedBehaviorSanitizer" OFF) add_feature_info(ENABLE_UBSAN ENABLE_UBSAN "UndefinedBehaviorSanitizer support.") -option(ENABLE_SDL "Build with SDL support" OFF) -add_feature_info(ENABLE_SDL ENABLE_SDL "SDL support.") - option(ENABLE_X11 "Build with X11 support" ON) add_feature_info(ENABLE_X11 ENABLE_X11 "X11 support.") @@ -44,8 +41,8 @@ add_feature_info(ENABLE_WAYLAND ENABLE_WAYLAND "Wayland support.") option(ENABLE_LIBDECOR "Build with libdecor support" OFF) add_feature_info(ENABLE_LIBDECOR ENABLE_LIBDECOR "libdecor support.") -if (NOT ENABLE_SDL AND NOT ENABLE_X11 AND NOT ENABLE_WAYLAND) - message(FATAL_ERROR "One of ENABLE_SDL, ENABLE_X11, or ENABLE_WAYLAND must be on") +if (NOT ENABLE_X11 AND NOT ENABLE_WAYLAND) + message(FATAL_ERROR "Either ENABLE_X11 or ENABLE_WAYLAND must be on") endif() add_compile_options( diff --git a/client/displayservers/CMakeLists.txt b/client/displayservers/CMakeLists.txt index c6394b4f..1e6feb31 100644 --- a/client/displayservers/CMakeLists.txt +++ b/client/displayservers/CMakeLists.txt @@ -27,11 +27,6 @@ if (ENABLE_X11) add_displayserver(X11) endif() -# SDL must be last as it's the fallback implemntation -if (ENABLE_SDL) - add_displayserver(SDL) -endif() - list(REMOVE_AT DISPLAYSERVERS 0) list(REMOVE_AT DISPLAYSERVERS_LINK 0) diff --git a/client/displayservers/SDL/CMakeLists.txt b/client/displayservers/SDL/CMakeLists.txt deleted file mode 100644 index 05cbc3a8..00000000 --- a/client/displayservers/SDL/CMakeLists.txt +++ /dev/null @@ -1,24 +0,0 @@ -cmake_minimum_required(VERSION 3.0) -project(displayserver_SDL LANGUAGES C) - -find_package(PkgConfig) -pkg_check_modules(DISPLAYSERVER_SDL_PKGCONFIG REQUIRED - sdl2 -) - -add_library(displayserver_SDL STATIC - sdl.c -) - -target_link_libraries(displayserver_SDL - ${DISPLAYSERVER_SDL_PKGCONFIG_LIBRARIES} - ${DISPLAYSERVER_SDL_OPT_PKGCONFIG_LIBRARIES} - lg_common -) - -target_include_directories(displayserver_SDL - PRIVATE - src - ${DISPLAYSERVER_SDL_PKGCONFIG_INCLUDE_DIRS} - ${DISPLAYSERVER_SDL_OPT_PKGCONFIG_INCLUDE_DIRS} -) diff --git a/client/displayservers/SDL/kb.h b/client/displayservers/SDL/kb.h deleted file mode 100644 index ebb2b534..00000000 --- a/client/displayservers/SDL/kb.h +++ /dev/null @@ -1,197 +0,0 @@ -/** - * Looking Glass - * Copyright (C) 2017-2021 The Looking Glass Authors - * https://looking-glass.io - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., 59 - * Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include -#include - -//FIXME: this should be made static once config.c is no longer using SDL -//scancodes -uint32_t sdl_to_xfree86[SDL_NUM_SCANCODES] = -{ - [SDL_SCANCODE_UNKNOWN] /* = USB 0 */ = KEY_RESERVED, - [SDL_SCANCODE_A] /* = USB 4 */ = KEY_A, - [SDL_SCANCODE_B] /* = USB 5 */ = KEY_B, - [SDL_SCANCODE_C] /* = USB 6 */ = KEY_C, - [SDL_SCANCODE_D] /* = USB 7 */ = KEY_D, - [SDL_SCANCODE_E] /* = USB 8 */ = KEY_E, - [SDL_SCANCODE_F] /* = USB 9 */ = KEY_F, - [SDL_SCANCODE_G] /* = USB 10 */ = KEY_G, - [SDL_SCANCODE_H] /* = USB 11 */ = KEY_H, - [SDL_SCANCODE_I] /* = USB 12 */ = KEY_I, - [SDL_SCANCODE_J] /* = USB 13 */ = KEY_J, - [SDL_SCANCODE_K] /* = USB 14 */ = KEY_K, - [SDL_SCANCODE_L] /* = USB 15 */ = KEY_L, - [SDL_SCANCODE_M] /* = USB 16 */ = KEY_M, - [SDL_SCANCODE_N] /* = USB 17 */ = KEY_N, - [SDL_SCANCODE_O] /* = USB 18 */ = KEY_O, - [SDL_SCANCODE_P] /* = USB 19 */ = KEY_P, - [SDL_SCANCODE_Q] /* = USB 20 */ = KEY_Q, - [SDL_SCANCODE_R] /* = USB 21 */ = KEY_R, - [SDL_SCANCODE_S] /* = USB 22 */ = KEY_S, - [SDL_SCANCODE_T] /* = USB 23 */ = KEY_T, - [SDL_SCANCODE_U] /* = USB 24 */ = KEY_U, - [SDL_SCANCODE_V] /* = USB 25 */ = KEY_V, - [SDL_SCANCODE_W] /* = USB 26 */ = KEY_W, - [SDL_SCANCODE_X] /* = USB 27 */ = KEY_X, - [SDL_SCANCODE_Y] /* = USB 28 */ = KEY_Y, - [SDL_SCANCODE_Z] /* = USB 29 */ = KEY_Z, - [SDL_SCANCODE_1] /* = USB 30 */ = KEY_1, - [SDL_SCANCODE_2] /* = USB 31 */ = KEY_2, - [SDL_SCANCODE_3] /* = USB 32 */ = KEY_3, - [SDL_SCANCODE_4] /* = USB 33 */ = KEY_4, - [SDL_SCANCODE_5] /* = USB 34 */ = KEY_5, - [SDL_SCANCODE_6] /* = USB 35 */ = KEY_6, - [SDL_SCANCODE_7] /* = USB 36 */ = KEY_7, - [SDL_SCANCODE_8] /* = USB 37 */ = KEY_8, - [SDL_SCANCODE_9] /* = USB 38 */ = KEY_9, - [SDL_SCANCODE_0] /* = USB 39 */ = KEY_0, - [SDL_SCANCODE_RETURN] /* = USB 40 */ = KEY_ENTER, - [SDL_SCANCODE_ESCAPE] /* = USB 41 */ = KEY_ESC, - [SDL_SCANCODE_BACKSPACE] /* = USB 42 */ = KEY_BACKSPACE, - [SDL_SCANCODE_TAB] /* = USB 43 */ = KEY_TAB, - [SDL_SCANCODE_SPACE] /* = USB 44 */ = KEY_SPACE, - [SDL_SCANCODE_MINUS] /* = USB 45 */ = KEY_MINUS, - [SDL_SCANCODE_EQUALS] /* = USB 46 */ = KEY_EQUAL, - [SDL_SCANCODE_LEFTBRACKET] /* = USB 47 */ = KEY_LEFTBRACE, - [SDL_SCANCODE_RIGHTBRACKET] /* = USB 48 */ = KEY_RIGHTBRACE, - [SDL_SCANCODE_BACKSLASH] /* = USB 49 */ = KEY_BACKSLASH, - [SDL_SCANCODE_SEMICOLON] /* = USB 51 */ = KEY_SEMICOLON, - [SDL_SCANCODE_APOSTROPHE] /* = USB 52 */ = KEY_APOSTROPHE, - [SDL_SCANCODE_GRAVE] /* = USB 53 */ = KEY_GRAVE, - [SDL_SCANCODE_COMMA] /* = USB 54 */ = KEY_COMMA, - [SDL_SCANCODE_PERIOD] /* = USB 55 */ = KEY_DOT, - [SDL_SCANCODE_SLASH] /* = USB 56 */ = KEY_SLASH, - [SDL_SCANCODE_CAPSLOCK] /* = USB 57 */ = KEY_CAPSLOCK, - [SDL_SCANCODE_F1] /* = USB 58 */ = KEY_F1, - [SDL_SCANCODE_F2] /* = USB 59 */ = KEY_F2, - [SDL_SCANCODE_F3] /* = USB 60 */ = KEY_F3, - [SDL_SCANCODE_F4] /* = USB 61 */ = KEY_F4, - [SDL_SCANCODE_F5] /* = USB 62 */ = KEY_F5, - [SDL_SCANCODE_F6] /* = USB 63 */ = KEY_F6, - [SDL_SCANCODE_F7] /* = USB 64 */ = KEY_F7, - [SDL_SCANCODE_F8] /* = USB 65 */ = KEY_F8, - [SDL_SCANCODE_F9] /* = USB 66 */ = KEY_F9, - [SDL_SCANCODE_F10] /* = USB 67 */ = KEY_F10, - [SDL_SCANCODE_F11] /* = USB 68 */ = KEY_F11, - [SDL_SCANCODE_F12] /* = USB 69 */ = KEY_F12, - [SDL_SCANCODE_PRINTSCREEN] /* = USB 70 */ = KEY_SYSRQ, - [SDL_SCANCODE_SCROLLLOCK] /* = USB 71 */ = KEY_SCROLLLOCK, - [SDL_SCANCODE_PAUSE] /* = USB 72 */ = KEY_PAUSE, - [SDL_SCANCODE_INSERT] /* = USB 73 */ = KEY_INSERT, - [SDL_SCANCODE_HOME] /* = USB 74 */ = KEY_HOME, - [SDL_SCANCODE_PAGEUP] /* = USB 75 */ = KEY_PAGEUP, - [SDL_SCANCODE_DELETE] /* = USB 76 */ = KEY_DELETE, - [SDL_SCANCODE_END] /* = USB 77 */ = KEY_END, - [SDL_SCANCODE_PAGEDOWN] /* = USB 78 */ = KEY_PAGEDOWN, - [SDL_SCANCODE_RIGHT] /* = USB 79 */ = KEY_RIGHT, - [SDL_SCANCODE_LEFT] /* = USB 80 */ = KEY_LEFT, - [SDL_SCANCODE_DOWN] /* = USB 81 */ = KEY_DOWN, - [SDL_SCANCODE_UP] /* = USB 82 */ = KEY_UP, - [SDL_SCANCODE_NUMLOCKCLEAR] /* = USB 83 */ = KEY_NUMLOCK, - [SDL_SCANCODE_KP_DIVIDE] /* = USB 84 */ = KEY_KPSLASH, - [SDL_SCANCODE_KP_MULTIPLY] /* = USB 85 */ = KEY_KPASTERISK, - [SDL_SCANCODE_KP_MINUS] /* = USB 86 */ = KEY_KPMINUS, - [SDL_SCANCODE_KP_PLUS] /* = USB 87 */ = KEY_KPPLUS, - [SDL_SCANCODE_KP_ENTER] /* = USB 88 */ = KEY_KPENTER, - [SDL_SCANCODE_KP_1] /* = USB 89 */ = KEY_KP1, - [SDL_SCANCODE_KP_2] /* = USB 90 */ = KEY_KP2, - [SDL_SCANCODE_KP_3] /* = USB 91 */ = KEY_KP3, - [SDL_SCANCODE_KP_4] /* = USB 92 */ = KEY_KP4, - [SDL_SCANCODE_KP_5] /* = USB 93 */ = KEY_KP5, - [SDL_SCANCODE_KP_6] /* = USB 94 */ = KEY_KP6, - [SDL_SCANCODE_KP_7] /* = USB 95 */ = KEY_KP7, - [SDL_SCANCODE_KP_8] /* = USB 96 */ = KEY_KP8, - [SDL_SCANCODE_KP_9] /* = USB 97 */ = KEY_KP9, - [SDL_SCANCODE_KP_0] /* = USB 98 */ = KEY_KP0, - [SDL_SCANCODE_KP_PERIOD] /* = USB 99 */ = KEY_KPDOT, - [SDL_SCANCODE_NONUSBACKSLASH] /* = USB 100 */ = KEY_102ND, - [SDL_SCANCODE_APPLICATION] /* = USB 101 */ = KEY_COMPOSE, - [SDL_SCANCODE_POWER] /* = USB 102 */ = KEY_POWER, - [SDL_SCANCODE_KP_EQUALS] /* = USB 103 */ = KEY_KPEQUAL, - [SDL_SCANCODE_F13] /* = USB 104 */ = KEY_CONFIG, - [SDL_SCANCODE_F14] /* = USB 105 */ = KEY_F14, - [SDL_SCANCODE_F15] /* = USB 106 */ = KEY_F15, - [SDL_SCANCODE_F16] /* = USB 107 */ = KEY_F16, - [SDL_SCANCODE_F17] /* = USB 108 */ = KEY_F17, - [SDL_SCANCODE_F18] /* = USB 109 */ = KEY_F18, - [SDL_SCANCODE_F19] /* = USB 110 */ = KEY_F19, - [SDL_SCANCODE_F20] /* = USB 111 */ = KEY_F20, - [SDL_SCANCODE_HELP] /* = USB 117 */ = KEY_HELP, - [SDL_SCANCODE_MENU] /* = USB 118 */ = KEY_MENU, - [SDL_SCANCODE_STOP] /* = USB 120 */ = KEY_CANCEL, - [SDL_SCANCODE_AGAIN] /* = USB 121 */ = KEY_AGAIN, - [SDL_SCANCODE_UNDO] /* = USB 122 */ = KEY_UNDO, - [SDL_SCANCODE_CUT] /* = USB 123 */ = KEY_CUT, - [SDL_SCANCODE_COPY] /* = USB 124 */ = KEY_COPY, - [SDL_SCANCODE_PASTE] /* = USB 125 */ = KEY_PASTE, - [SDL_SCANCODE_FIND] /* = USB 126 */ = KEY_FIND, - [SDL_SCANCODE_MUTE] /* = USB 127 */ = KEY_MUTE, - [SDL_SCANCODE_VOLUMEUP] /* = USB 128 */ = KEY_VOLUMEUP, - [SDL_SCANCODE_VOLUMEDOWN] /* = USB 129 */ = KEY_VOLUMEDOWN, - [SDL_SCANCODE_KP_COMMA] /* = USB 133 */ = KEY_KPCOMMA, - [SDL_SCANCODE_INTERNATIONAL1] /* = USB 135 */ = KEY_RO, - [SDL_SCANCODE_INTERNATIONAL2] /* = USB 136 */ = KEY_KATAKANAHIRAGANA, - [SDL_SCANCODE_INTERNATIONAL3] /* = USB 137 */ = KEY_YEN, - [SDL_SCANCODE_INTERNATIONAL4] /* = USB 138 */ = KEY_HENKAN, - [SDL_SCANCODE_INTERNATIONAL5] /* = USB 139 */ = KEY_MUHENKAN, - [SDL_SCANCODE_LANG1] /* = USB 144 */ = KEY_HANGEUL, - [SDL_SCANCODE_LANG2] /* = USB 145 */ = KEY_HANJA, - [SDL_SCANCODE_SYSREQ] /* = USB 154 */ = KEY_RIGHTSHIFT, - [SDL_SCANCODE_CANCEL] /* = USB 155 */ = KEY_STOP, - [SDL_SCANCODE_KP_LEFTPAREN] /* = USB 182 */ = KEY_KPLEFTPAREN, - [SDL_SCANCODE_KP_RIGHTPAREN] /* = USB 183 */ = KEY_KPRIGHTPAREN, - [SDL_SCANCODE_KP_PLUSMINUS] /* = USB 215 */ = KEY_KPPLUSMINUS, - [SDL_SCANCODE_LCTRL] /* = USB 224 */ = KEY_LEFTCTRL, - [SDL_SCANCODE_LSHIFT] /* = USB 225 */ = KEY_LEFTSHIFT, - [SDL_SCANCODE_LALT] /* = USB 226 */ = KEY_LEFTALT, - [SDL_SCANCODE_LGUI] /* = USB 227 */ = KEY_LEFTMETA, - [SDL_SCANCODE_RCTRL] /* = USB 228 */ = KEY_RIGHTCTRL, - [SDL_SCANCODE_RSHIFT] /* = USB 229 */ = KEY_RIGHTSHIFT, - [SDL_SCANCODE_RALT] /* = USB 230 */ = KEY_RIGHTALT, - [SDL_SCANCODE_RGUI] /* = USB 231 */ = KEY_RIGHTMETA, - [SDL_SCANCODE_MODE] /* = USB 257 */ = KEY_ZENKAKUHANKAKU, - [SDL_SCANCODE_AUDIONEXT] /* = USB 258 */ = KEY_NEXTSONG, - [SDL_SCANCODE_AUDIOPREV] /* = USB 259 */ = KEY_PREVIOUSSONG, - [SDL_SCANCODE_AUDIOSTOP] /* = USB 260 */ = KEY_STOPCD, - [SDL_SCANCODE_AUDIOPLAY] /* = USB 261 */ = KEY_PLAYPAUSE, - [SDL_SCANCODE_MEDIASELECT] /* = USB 263 */ = KEY_MEDIA, - [SDL_SCANCODE_WWW] /* = USB 264 */ = KEY_WWW, - [SDL_SCANCODE_MAIL] /* = USB 265 */ = KEY_MAIL, - [SDL_SCANCODE_CALCULATOR] /* = USB 266 */ = KEY_CALC, - [SDL_SCANCODE_COMPUTER] /* = USB 267 */ = KEY_COMPUTER, - [SDL_SCANCODE_AC_SEARCH] /* = USB 268 */ = KEY_SEARCH, - [SDL_SCANCODE_AC_HOME] /* = USB 269 */ = KEY_HOMEPAGE, - [SDL_SCANCODE_AC_BACK] /* = USB 270 */ = KEY_BACK, - [SDL_SCANCODE_AC_FORWARD] /* = USB 271 */ = KEY_FORWARD, - [SDL_SCANCODE_AC_REFRESH] /* = USB 273 */ = KEY_REFRESH, - [SDL_SCANCODE_AC_BOOKMARKS] /* = USB 274 */ = KEY_BOOKMARKS, - [SDL_SCANCODE_BRIGHTNESSDOWN] /* = USB 275 */ = KEY_BRIGHTNESSDOWN, - [SDL_SCANCODE_BRIGHTNESSUP] /* = USB 276 */ = KEY_BRIGHTNESSUP, - [SDL_SCANCODE_DISPLAYSWITCH] /* = USB 277 */ = KEY_SWITCHVIDEOMODE, - [SDL_SCANCODE_KBDILLUMTOGGLE] /* = USB 278 */ = KEY_KBDILLUMTOGGLE, - [SDL_SCANCODE_KBDILLUMDOWN] /* = USB 279 */ = KEY_KBDILLUMDOWN, - [SDL_SCANCODE_KBDILLUMUP] /* = USB 280 */ = KEY_KBDILLUMUP, - [SDL_SCANCODE_EJECT] /* = USB 281 */ = KEY_EJECTCD, - [SDL_SCANCODE_SLEEP] /* = USB 282 */ = KEY_SLEEP, - [SDL_SCANCODE_APP1] /* = USB 283 */ = KEY_PROG1, - [SDL_SCANCODE_APP2] /* = USB 284 */ = KEY_PROG2, - [SDL_SCANCODE_AUDIOREWIND] /* = USB 285 */ = KEY_REWIND, - [SDL_SCANCODE_AUDIOFASTFORWARD] /* = USB 286 */ = KEY_FASTFORWARD, -}; diff --git a/client/displayservers/SDL/sdl.c b/client/displayservers/SDL/sdl.c deleted file mode 100644 index 08a12e33..00000000 --- a/client/displayservers/SDL/sdl.c +++ /dev/null @@ -1,561 +0,0 @@ -/** - * Looking Glass - * Copyright (C) 2017-2021 The Looking Glass Authors - * https://looking-glass.io - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., 59 - * Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "interface/displayserver.h" - -#include -#include - -#ifdef ENABLE_EGL -#include -#endif - -#if defined(SDL_VIDEO_DRIVER_WAYLAND) -#include -#endif - -#include "app.h" -#include "kb.h" -#include "egl_dynprocs.h" -#include "common/types.h" -#include "common/debug.h" -#include "util.h" - -struct SDLDSState -{ - SDL_Window * window; - SDL_Cursor * cursor; - - EGLNativeWindowType wlDisplay; - - bool keyboardGrabbed; - bool pointerGrabbed; - bool exiting; -}; - -static struct SDLDSState sdl; - -/* forwards */ -static int sdlEventFilter(void * userdata, SDL_Event * event); - -static void sdlSetup(void) -{ -} - -static bool sdlProbe(void) -{ - return true; -} - -static bool sdlEarlyInit(void) -{ - return true; -} - -static bool sdlInit(const LG_DSInitParams params) -{ - memset(&sdl, 0, sizeof(sdl)); - - // Allow screensavers for now: we will enable and disable as needed. - SDL_SetHint(SDL_HINT_VIDEO_ALLOW_SCREENSAVER, "1"); - - if (SDL_Init(SDL_INIT_VIDEO) < 0) - { - DEBUG_ERROR("SDL_Init Failed"); - return false; - } - -#ifdef ENABLE_OPENGL - if (params.opengl) - { - SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER , 1); - SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1); - SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 4); - SDL_GL_SetAttribute(SDL_GL_RED_SIZE , 8); - SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE , 8); - SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE , 8); - } -#endif - - sdl.window = SDL_CreateWindow( - params.title, - params.center ? SDL_WINDOWPOS_CENTERED : params.x, - params.center ? SDL_WINDOWPOS_CENTERED : params.y, - params.w, - params.h, - ( - SDL_WINDOW_HIDDEN | - (params.resizable ? SDL_WINDOW_RESIZABLE : 0) | - (params.borderless ? SDL_WINDOW_BORDERLESS : 0) | - (params.maximize ? SDL_WINDOW_MAXIMIZED : 0) | - (params.opengl ? SDL_WINDOW_OPENGL : 0) - ) - ); - - if (sdl.window == NULL) - { - DEBUG_ERROR("Could not create an SDL window: %s\n", SDL_GetError()); - goto fail_init; - } - - const uint8_t data[4] = {0xf, 0x9, 0x9, 0xf}; - const uint8_t mask[4] = {0xf, 0xf, 0xf, 0xf}; - sdl.cursor = SDL_CreateCursor(data, mask, 8, 4, 4, 0); - SDL_SetCursor(sdl.cursor); - - SDL_ShowWindow(sdl.window); - - SDL_SetHint(SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS, "0"); - - if (params.fullscreen) - SDL_SetWindowFullscreen(sdl.window, SDL_WINDOW_FULLSCREEN_DESKTOP); - - if (!params.center) - SDL_SetWindowPosition(sdl.window, params.x, params.y); - - // ensure mouse acceleration is identical in server mode - SDL_SetHintWithPriority(SDL_HINT_MOUSE_RELATIVE_MODE_WARP, "1", SDL_HINT_OVERRIDE); - - SDL_SetEventFilter(sdlEventFilter, NULL); - return true; - -fail_init: - SDL_Quit(); - return false; -} - -static void sdlStartup(void) -{ -} - -static void sdlShutdown(void) -{ -} - -static void sdlFree(void) -{ - SDL_DestroyWindow(sdl.window); - - if (sdl.cursor) - SDL_FreeCursor(sdl.cursor); - - if (sdl.window) - SDL_DestroyWindow(sdl.window); - SDL_Quit(); -} - -static bool sdlGetProp(LG_DSProperty prop, void * ret) -{ - return false; -} - -#ifdef ENABLE_EGL -static EGLDisplay sdlGetEGLDisplay(void) -{ - SDL_SysWMinfo wminfo; - SDL_VERSION(&wminfo.version); - if (!SDL_GetWindowWMInfo(sdl.window, &wminfo)) - { - DEBUG_ERROR("SDL_GetWindowWMInfo failed"); - return EGL_NO_DISPLAY; - } - - EGLNativeDisplayType native; - EGLenum platform; - - switch(wminfo.subsystem) - { - case SDL_SYSWM_X11: - native = (EGLNativeDisplayType)wminfo.info.x11.display; - platform = EGL_PLATFORM_X11_KHR; - break; - -#if defined(SDL_VIDEO_DRIVER_WAYLAND) - case SDL_SYSWM_WAYLAND: - native = (EGLNativeDisplayType)wminfo.info.wl.display; - platform = EGL_PLATFORM_WAYLAND_KHR; - break; -#endif - - default: - DEBUG_ERROR("Unsupported subsystem"); - return EGL_NO_DISPLAY; - } - - const char *early_exts = eglQueryString(NULL, EGL_EXTENSIONS); - - if (util_hasGLExt(early_exts, "EGL_KHR_platform_base") && - g_egl_dynProcs.eglGetPlatformDisplay) - { - DEBUG_INFO("Using eglGetPlatformDisplay"); - return g_egl_dynProcs.eglGetPlatformDisplay(platform, native, NULL); - } - - if (util_hasGLExt(early_exts, "EGL_EXT_platform_base") && - g_egl_dynProcs.eglGetPlatformDisplayEXT) - { - DEBUG_INFO("Using eglGetPlatformDisplayEXT"); - return g_egl_dynProcs.eglGetPlatformDisplayEXT(platform, native, NULL); - } - - DEBUG_INFO("Using eglGetDisplay"); - return eglGetDisplay(native); -} - -static EGLNativeWindowType sdlGetEGLNativeWindow(void) -{ - SDL_SysWMinfo wminfo; - SDL_VERSION(&wminfo.version); - if (!SDL_GetWindowWMInfo(sdl.window, &wminfo)) - { - DEBUG_ERROR("SDL_GetWindowWMInfo failed"); - return 0; - } - - switch(wminfo.subsystem) - { - case SDL_SYSWM_X11: - return (EGLNativeWindowType)wminfo.info.x11.window; - -#if defined(SDL_VIDEO_DRIVER_WAYLAND) - case SDL_SYSWM_WAYLAND: - { - if (sdl.wlDisplay) - return sdl.wlDisplay; - - int width, height; - SDL_GetWindowSize(sdl.window, &width, &height); - sdl.wlDisplay = (EGLNativeWindowType)wl_egl_window_create( - wminfo.info.wl.surface, width, height); - - return sdl.wlDisplay; - } -#endif - - default: - DEBUG_ERROR("Unsupported subsystem"); - return 0; - } -} - -static void sdlEGLSwapBuffers(EGLDisplay display, EGLSurface surface, const struct Rect * damage, int count) -{ - eglSwapBuffers(display, surface); -} -#endif //ENABLE_EGL - -#ifdef ENABLE_OPENGL -static LG_DSGLContext sdlGLCreateContext(void) -{ - return (LG_DSGLContext)SDL_GL_CreateContext(sdl.window); -} - -static void sdlGLDeleteContext(LG_DSGLContext context) -{ - SDL_GL_DeleteContext((SDL_GLContext)context); -} - -static void sdlGLMakeCurrent(LG_DSGLContext context) -{ - SDL_GL_MakeCurrent(sdl.window, (SDL_GLContext)context); -} - -static void sdlGLSetSwapInterval(int interval) -{ - SDL_GL_SetSwapInterval(interval); -} - -static void sdlGLSwapBuffers(void) -{ - SDL_GL_SwapWindow(sdl.window); -} -#endif //ENABLE_OPENGL - -static int sdlEventFilter(void * userdata, SDL_Event * event) -{ - switch(event->type) - { - case SDL_QUIT: - app_handleCloseEvent(); - break; - - case SDL_MOUSEMOTION: - // stop motion events during the warp out of the window - if (sdl.exiting) - break; - - app_updateCursorPos(event->motion.x, event->motion.y); - app_handleMouseRelative(event->motion.xrel, event->motion.yrel, - event->motion.xrel, event->motion.yrel); - break; - - case SDL_MOUSEBUTTONDOWN: - { - int button = event->button.button; - if (button > 3) - button += 2; - - app_handleButtonPress(button); - break; - } - - case SDL_MOUSEBUTTONUP: - { - int button = event->button.button; - if (button > 3) - button += 2; - - app_handleButtonRelease(button); - break; - } - - case SDL_MOUSEWHEEL: - { - int button = event->wheel.y > 0 ? 4 : 5; - app_handleButtonPress(button); - app_handleButtonRelease(button); - break; - } - - case SDL_KEYDOWN: - { - SDL_Scancode sc = event->key.keysym.scancode; - app_handleKeyPress(sdl_to_xfree86[sc]); - break; - } - - case SDL_KEYUP: - { - SDL_Scancode sc = event->key.keysym.scancode; - app_handleKeyRelease(sdl_to_xfree86[sc]); - break; - } - - case SDL_WINDOWEVENT: - switch(event->window.event) - { - case SDL_WINDOWEVENT_ENTER: - app_handleEnterEvent(true); - break; - - case SDL_WINDOWEVENT_LEAVE: - sdl.exiting = false; - app_handleEnterEvent(false); - break; - - case SDL_WINDOWEVENT_FOCUS_GAINED: - app_handleFocusEvent(true); - break; - - case SDL_WINDOWEVENT_FOCUS_LOST: - app_handleFocusEvent(false); - break; - - case SDL_WINDOWEVENT_SIZE_CHANGED: - case SDL_WINDOWEVENT_RESIZED: - { - struct Border border; - SDL_GetWindowBordersSize( - sdl.window, - &border.top, - &border.left, - &border.bottom, - &border.right - ); - app_handleResizeEvent( - event->window.data1, - event->window.data2, - 1, - border); - break; - } - - case SDL_WINDOWEVENT_MOVED: - app_updateWindowPos(event->window.data1, event->window.data2); - break; - - case SDL_WINDOWEVENT_CLOSE: - app_handleCloseEvent(); - break; - } - break; - } - - return 0; -} - -static void sdlShowPointer(bool show) -{ - SDL_ShowCursor(show ? SDL_ENABLE : SDL_DISABLE); -} - -static void sdlGrabPointer(void) -{ - SDL_SetWindowGrab(sdl.window, SDL_TRUE); - SDL_SetRelativeMouseMode(SDL_TRUE); - sdl.pointerGrabbed = true; -} - -static void sdlUngrabPointer(void) -{ - SDL_SetWindowGrab(sdl.window, SDL_FALSE); - SDL_SetRelativeMouseMode(SDL_FALSE); - sdl.pointerGrabbed = false; -} - -static void sdlGrabKeyboard(void) -{ - if (sdl.pointerGrabbed) - SDL_SetWindowGrab(sdl.window, SDL_FALSE); - else - { - DEBUG_WARN("SDL does not support grabbing only the keyboard, grabbing all"); - sdl.pointerGrabbed = true; - } - - SDL_SetHint(SDL_HINT_GRAB_KEYBOARD, "1"); - SDL_SetWindowGrab(sdl.window, SDL_TRUE); - sdl.keyboardGrabbed = true; -} - -static void sdlUngrabKeyboard(void) -{ - SDL_SetHint(SDL_HINT_GRAB_KEYBOARD, "0"); - SDL_SetWindowGrab(sdl.window, SDL_FALSE); - if (sdl.pointerGrabbed) - SDL_SetWindowGrab(sdl.window, SDL_TRUE); - sdl.keyboardGrabbed = false; -} - -static void sdlWarpPointer(int x, int y, bool exiting) -{ - if (sdl.exiting) - return; - - sdl.exiting = exiting; - - // if exiting turn off relative mode - if (exiting) - SDL_SetRelativeMouseMode(SDL_FALSE); - - // issue the warp - SDL_WarpMouseInWindow(sdl.window, x, y); -} - -static void sdlRealignPointer(void) -{ - app_handleMouseRelative(0.0, 0.0, 0.0, 0.0); -} - -static bool sdlIsValidPointerPos(int x, int y) -{ - const int displays = SDL_GetNumVideoDisplays(); - for(int i = 0; i < displays; ++i) - { - SDL_Rect r; - SDL_GetDisplayBounds(i, &r); - if ((x >= r.x && x < r.x + r.w) && - (y >= r.y && y < r.y + r.h)) - return true; - } - return false; -} - -static void sdlInhibitIdle(void) -{ - SDL_DisableScreenSaver(); -} - -static void sdlUninhibitIdle(void) -{ - SDL_EnableScreenSaver(); -} - -static void sdlWait(unsigned int time) -{ - SDL_WaitEventTimeout(NULL, time); -} - -static void sdlSetWindowSize(int x, int y) -{ - SDL_SetWindowSize(sdl.window, x, y); -} - -static void sdlSetFullscreen(bool fs) -{ - SDL_SetWindowFullscreen(sdl.window, fs ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0); -} - -static bool sdlGetFullscreen(void) -{ - return (SDL_GetWindowFlags(sdl.window) & SDL_WINDOW_FULLSCREEN_DESKTOP) != 0; -} - -static void sdlMinimize(void) -{ - SDL_MinimizeWindow(sdl.window); -} - -struct LG_DisplayServerOps LGDS_SDL = -{ - .setup = sdlSetup, - .probe = sdlProbe, - .earlyInit = sdlEarlyInit, - .init = sdlInit, - .startup = sdlStartup, - .shutdown = sdlShutdown, - .free = sdlFree, - .getProp = sdlGetProp, - -#ifdef ENABLE_EGL - .getEGLDisplay = sdlGetEGLDisplay, - .getEGLNativeWindow = sdlGetEGLNativeWindow, - .eglSwapBuffers = sdlEGLSwapBuffers, -#endif - -#ifdef ENABLE_OPENGL - .glCreateContext = sdlGLCreateContext, - .glDeleteContext = sdlGLDeleteContext, - .glMakeCurrent = sdlGLMakeCurrent, - .glSetSwapInterval = sdlGLSetSwapInterval, - .glSwapBuffers = sdlGLSwapBuffers, -#endif - - .showPointer = sdlShowPointer, - .grabPointer = sdlGrabPointer, - .ungrabPointer = sdlUngrabPointer, - .capturePointer = sdlGrabPointer, - .uncapturePointer = sdlUngrabPointer, - .grabKeyboard = sdlGrabKeyboard, - .ungrabKeyboard = sdlUngrabKeyboard, - .warpPointer = sdlWarpPointer, - .realignPointer = sdlRealignPointer, - .isValidPointerPos = sdlIsValidPointerPos, - .inhibitIdle = sdlInhibitIdle, - .uninhibitIdle = sdlUninhibitIdle, - .wait = sdlWait, - .setWindowSize = sdlSetWindowSize, - .setFullscreen = sdlSetFullscreen, - .getFullscreen = sdlGetFullscreen, - .minimize = sdlMinimize, - - /* SDL does not have clipboard support */ - .cbInit = NULL, -};