From 001a533399bf3551e21ec28e0203c0ff36745217 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Tue, 30 Apr 2024 00:50:09 -0400 Subject: [PATCH 01/12] Initial migration from SDL 1.2 to SDL2. --- CMakeLists.txt | 15 +- Descent3/CMakeLists.txt | 6 +- Descent3/lnxmain.cpp | 11 +- Descent3/loki_utils.c | 289 +------------------------------ ddio_lnx/lnxcdrom.cpp | 24 +-- ddio_lnx/lnxkey_sdl.cpp | 325 ++--------------------------------- ddio_lnx/lnxmouse.cpp | 4 - ddio_lnx/sdljoy.cpp | 6 +- linux/lnxapp.cpp | 10 +- lnxmvelib/lnxdraw.cpp | 23 ++- netcon/inetfile/CFtp.cpp | 2 +- netcon/inetfile/Chttpget.cpp | 4 +- networking/networking.cpp | 2 +- renderer/HardwareOpenGL.cpp | 77 +++++---- renderer/dyna_gl.h | 4 +- renderer/lnxscreenmode.cpp | 2 + 16 files changed, 120 insertions(+), 684 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 413841c6..d2d81550 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -76,27 +76,20 @@ if(UNIX) add_compile_options("$<$:-Wno-multichar;${BITS};${EXTRA_CXX_FLAGS}>") add_compile_options("$<$:${BITS}>") - find_package(SDL REQUIRED) - if(APPLE) - # Provide FIND_PACKAGE( SDL_image ) below with an include dir and library that work with brew-installed sdl2_image - find_path(SDL_IMAGE_INCLUDE_DIR NAMES SDL_image.h PATH_SUFFIXES include/SDL2) - find_library(SDL_IMAGE_LIBRARY NAMES SDL2_image) - endif() - - find_package(SDL_image REQUIRED) + find_package(SDL2 REQUIRED) find_package(Curses REQUIRED) find_package(OpenGL REQUIRED) - message("SDL Include Dir is " ${SDL_INCLUDE_DIR}) + message("SDL2 Include Dir is " ${SDL2_INCLUDE_DIR}) endif() if(CMAKE_SYSTEM_NAME STREQUAL "Linux") message("Building for Linux") add_compile_definitions(__LINUX__ LINUX _MAX_PATH=260 _MAX_FNAME=256 _REENRANT __32BIT__ HAVEALLOCA_H _USE_OGL_ACTIVE_TEXTURES) - set(PLATFORM_INCLUDES "lib/linux" ${SDL_INCLUDE_DIR}) + set(PLATFORM_INCLUDES "lib/linux" ${SDL2_INCLUDE_DIR}) elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin") message("Building for MAC OSX") add_compile_definitions(__LINUX__ LINUX _MAX_PATH=260 _MAX_FNAME=256 _REENRANT MACOSX=1 _USE_OGL_ACTIVE_TEXTURES) - set(PLATFORM_INCLUDES "lib/linux" ${SDL_INCLUDE_DIR}) + set(PLATFORM_INCLUDES "lib/linux" ${SDL2_INCLUDE_DIR}) elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows") list(APPEND CMAKE_LIBRARY_PATH "lib/win" "lib/win/directx") add_compile_options("$<$,$>:/EHsc;/RTC1;/W3;/nologo;/c;/Zi;/TP;/errorReport:prompt>") diff --git a/Descent3/CMakeLists.txt b/Descent3/CMakeLists.txt index 12ae50b1..861a06b6 100644 --- a/Descent3/CMakeLists.txt +++ b/Descent3/CMakeLists.txt @@ -282,13 +282,13 @@ if(WIN32) endif() if(UNIX AND NOT APPLE) - set(PLATFORM_LIBS linux dd_lnxsound ddvid_lnx lnxcontroller ddio_lnx SDL::SDL m ${CMAKE_DL_LIBS} ${CURSES_LIBRARIES}) + set(PLATFORM_LIBS linux dd_lnxsound ddvid_lnx lnxcontroller ddio_lnx SDL2::SDL2 m ${CMAKE_DL_LIBS} ${CURSES_LIBRARIES}) set(PLATFORM_CPPS loki_utils.c lnxmain.cpp) endif() if(APPLE) - set(PLATFORM_LIBS linux dd_lnxsound ddvid_lnx lnxcontroller ddio_lnx SDL::SDL ${CURSES_LIBRARIES}) - set(PLATFORM_CPPS loki_utils.c lnxmain.cpp SDLMain.m) + set(PLATFORM_LIBS linux dd_lnxsound ddvid_lnx lnxcontroller ddio_lnx SDL2::SDL2 ${CURSES_LIBRARIES}) + set(PLATFORM_CPPS loki_utils.c lnxmain.cpp) set(CMAKE_EXE_LINKER_FLAGS "-framework IOKit -framework Cocoa -framework OpenGL -framework Carbon") endif() diff --git a/Descent3/lnxmain.cpp b/Descent3/lnxmain.cpp index 2e2462ca..4487365b 100644 --- a/Descent3/lnxmain.cpp +++ b/Descent3/lnxmain.cpp @@ -309,7 +309,7 @@ int sdlMouseButtonUpFilter(const SDL_Event *event); int sdlMouseButtonDownFilter(const SDL_Event *event); int sdlMouseMotionFilter(const SDL_Event *event); -int d3SDLEventFilter(const SDL_Event *event) { +int SDLCALL d3SDLEventFilter(void *userdata, SDL_Event *event) { switch (event->type) { case SDL_KEYUP: case SDL_KEYDOWN: @@ -614,8 +614,11 @@ int main(int argc, char *argv[]) { } // if */ - SDL_ClearError(); - int rc = SDL_Init(SDL_INIT_VIDEO | SDL_INIT_CDROM); + #ifdef DEDICATED + setenv("SDL_VIDEODRIVER", "dummy", 1); + #endif + + int rc = SDL_Init(SDL_INIT_VIDEO); if (rc != 0) { fprintf(stderr, "SDL: SDL_Init() failed! rc == (%d).\n", rc); fprintf(stderr, "SDL_GetError() reports \"%s\".\n", SDL_GetError()); @@ -625,7 +628,7 @@ int main(int argc, char *argv[]) { // atexit(SDL_Quit); // !!! FIXME: Don't use an event filter! - SDL_SetEventFilter(d3SDLEventFilter); + SDL_SetEventFilter(d3SDLEventFilter, NULL); install_signal_handlers(); // build the command line as one long string, seperated by spaces... diff --git a/Descent3/loki_utils.c b/Descent3/loki_utils.c index 299d0e75..c059a191 100644 --- a/Descent3/loki_utils.c +++ b/Descent3/loki_utils.c @@ -31,6 +31,8 @@ #include #include +#include "SDL.h" + #include "loki_utils.h" #define BAIL_IF_MACRO(x, y, z) \ @@ -174,236 +176,6 @@ int loki_getmountpoint(const char *device, char *mountpoint, int max_size) { } #endif -char *__PHYSFS_platformCurrentDir(void) { - int allocSize = 0; - char *retval = NULL; - char *ptr; - - do { - allocSize += 100; - ptr = (char *)realloc(retval, allocSize); - if (ptr == NULL) { - if (retval != NULL) - free(retval); - BAIL_MACRO(ERR_OUT_OF_MEMORY, NULL); - } /* if */ - - retval = ptr; - ptr = getcwd(retval, allocSize); - } while (ptr == NULL && errno == ERANGE); - - if (ptr == NULL && errno) { - /* - * getcwd() failed for some reason, for example current - * directory not existing. - */ - if (retval != NULL) - free(retval); - BAIL_MACRO(ERR_NO_SUCH_FILE, NULL); - } /* if */ - - return (retval); -} /* __PHYSFS_platformCurrentDir */ - -/* - * See where program (bin) resides in the $PATH specified by (envr). - * returns a copy of the first element in envr that contains it, or NULL - * if it doesn't exist or there were other problems. PHYSFS_SetError() is - * called if we have a problem. - * - * (envr) will be scribbled over, and you are expected to free() the - * return value when you're done with it. - */ -static char *findBinaryInPath(const char *bin, char *envr) { - size_t alloc_size = 0; - char *exe = NULL; - char *start = envr; - char *ptr; - - BAIL_IF_MACRO(bin == NULL, ERR_INVALID_ARGUMENT, NULL); - BAIL_IF_MACRO(envr == NULL, ERR_INVALID_ARGUMENT, NULL); - - do { - size_t size; - ptr = strchr(start, ':'); /* find next $PATH separator. */ - if (ptr) - *ptr = '\0'; - - size = strlen(start) + strlen(bin) + 2; - if (size > alloc_size) { - char *x = (char *)realloc(exe, size); - if (x == NULL) { - if (exe != NULL) - free(exe); - BAIL_MACRO(ERR_OUT_OF_MEMORY, NULL); - } /* if */ - - alloc_size = size; - exe = x; - } /* if */ - - /* build full binary path... */ - strcpy(exe, start); - if ((exe[0] == '\0') || (exe[strlen(exe) - 1] != '/')) - strcat(exe, "/"); - strcat(exe, bin); - - if (access(exe, X_OK) == 0) /* Exists as executable? We're done. */ - { - strcpy(exe, start); /* i'm lazy. piss off. */ - return (exe); - } /* if */ - - start = ptr + 1; /* start points to beginning of next element. */ - } while (ptr != NULL); - - if (exe != NULL) - free(exe); - - return (NULL); /* doesn't exist in path. */ -} /* findBinaryInPath */ - -char *__PHYSFS_platformCopyEnvironmentVariable(const char *varname) { - const char *envr = getenv(varname); - char *retval = NULL; - - if (envr != NULL) { - retval = (char *)malloc(strlen(envr) + 1); - if (retval != NULL) - strcpy(retval, envr); - } /* if */ - - return (retval); -} /* __PHYSFS_platformCopyEnvironmentVariable */ - -static char *getUserNameByUID(void) { - uid_t uid = getuid(); - struct passwd *pw; - char *retval = NULL; - - pw = getpwuid(uid); - if ((pw != NULL) && (pw->pw_name != NULL)) { - retval = (char *)malloc(strlen(pw->pw_name) + 1); - if (retval != NULL) - strcpy(retval, pw->pw_name); - } /* if */ - - return (retval); -} /* getUserNameByUID */ - -static char *getUserDirByUID(void) { - uid_t uid = getuid(); - struct passwd *pw; - char *retval = NULL; - - pw = getpwuid(uid); - if ((pw != NULL) && (pw->pw_dir != NULL)) { - retval = (char *)malloc(strlen(pw->pw_dir) + 1); - if (retval != NULL) - strcpy(retval, pw->pw_dir); - } /* if */ - - return (retval); -} /* getUserDirByUID */ - -char *__PHYSFS_platformGetUserName(void) { - char *retval = getUserNameByUID(); - if (retval == NULL) - retval = __PHYSFS_platformCopyEnvironmentVariable("USER"); - return (retval); -} /* __PHYSFS_platformGetUserName */ - -char *__PHYSFS_platformGetUserDir(void) { - char *retval = __PHYSFS_platformCopyEnvironmentVariable("HOME"); - if (retval == NULL) - retval = getUserDirByUID(); - return (retval); -} /* __PHYSFS_platformGetUserDir */ - -static int appendDirSep(char **dir) { - const char *dirsep = "/"; - char *ptr; - - if (strcmp((*dir + strlen(*dir)) - strlen(dirsep), dirsep) == 0) - return (1); - - ptr = (char *)realloc(*dir, strlen(*dir) + strlen(dirsep) + 1); - if (!ptr) { - free(*dir); - return (0); - } /* if */ - - strcat(ptr, dirsep); - *dir = ptr; - return (1); -} /* appendDirSep */ - -static char *unixCalcBaseDir(const char *argv0) { - /* If there isn't a path on argv0, then look through the $PATH for it. */ - - char *retval; - char *envr; - - if (strchr(argv0, '/') != NULL) /* default behaviour can handle this. */ - return (NULL); - - envr = __PHYSFS_platformCopyEnvironmentVariable("PATH"); - BAIL_IF_MACRO(!envr, NULL, NULL); - retval = findBinaryInPath(argv0, envr); - free(envr); - return (retval); -} - -static char *calcBaseDir(const char *argv0) { - const char *dirsep = "/"; - char *retval; - char *ptr; - - /* - * See if the platform driver wants to handle this for us... - */ - retval = unixCalcBaseDir(argv0); - if (retval != NULL) - return (retval); - - /* - * Determine if there's a path on argv0. If there is, that's the base dir. - */ - ptr = strstr(argv0, dirsep); - if (ptr != NULL) { - char *p = ptr; - size_t size; - while (p != NULL) { - ptr = p; - p = strstr(p + 1, dirsep); - } /* while */ - - size = (size_t)(ptr - argv0); - retval = (char *)malloc(size + 1); - if (retval == NULL) - return NULL; - memcpy(retval, argv0, size); - retval[size] = '\0'; - return (retval); - } /* if */ - - /* - * Last ditch effort: it's the current working directory. (*shrug*) - */ - retval = __PHYSFS_platformCurrentDir(); - if (retval != NULL) { - return (retval); - } - - /* - * Ok, current directory doesn't exist, use the root directory. - * Not a good alternative, but it only happens if the current - * directory was deleted from under the program. - */ - retval = (char *)malloc(strlen(dirsep) + 1); - strcpy(retval, dirsep); - return (retval); -} static char *basepath = NULL; static char *prefpath = NULL; @@ -413,65 +185,18 @@ const char *loki_getdatapath(void) { return basepath; } const char *loki_getprefpath(void) { return prefpath; } void loki_initialize(int argc, char **argv, char *desc) { - char resolved_path[MAXPATHLEN]; - char *ptr = __PHYSFS_platformGetUserDir(); - if (!ptr) { - fprintf(stderr, "ERROR: environment variable HOME not set?!"); - exit(42); - } - -#if MACOSX - const char *extra = "Library/Application Support/Descent 3"; -#else - const char *extra = ".loki/descent3"; -#endif - - prefpath = (char *)malloc(strlen(ptr) + strlen(extra) + 3); - strcpy(prefpath, ptr); - if (prefpath[strlen(prefpath) - 1] != '/') - strcat(prefpath, "/"); - - free(ptr); - - strcat(prefpath, extra); - ptr = prefpath; - while ((ptr = strchr(ptr, '/')) != NULL) { - *ptr = '\0'; - mkdir(prefpath, S_IRWXU); - *ptr = '/'; - ptr++; - } - mkdir(prefpath, S_IRWXU); - - basepath = calcBaseDir(argv[0]); + basepath = SDL_GetBasePath(); if (basepath == NULL) { fprintf(stderr, "ERROR: Couldn't find game directory!\n"); exit(43); } - if (realpath(prefpath, resolved_path)) { - ptr = (char *)realloc(prefpath, strlen(resolved_path) + 1); - if (ptr) { - strcpy(ptr, resolved_path); - prefpath = ptr; - } + prefpath = SDL_GetPrefPath("Outrage Entertainment", "Descent 3"); + if (prefpath == NULL) { + fprintf(stderr, "ERROR: Couldn't find preference directory!\n"); + exit(43); } - if (realpath(basepath, resolved_path)) { - ptr = (char *)realloc(basepath, strlen(resolved_path) + 1); - if (ptr) { - strcpy(ptr, resolved_path); - basepath = ptr; - } - } - -// Strip out Application Bundle... -#if MACOSX - { - // !!! FIXME - } -#endif - // printf("base path: %s\n", basepath); // printf("pref path: %s\n", prefpath); diff --git a/ddio_lnx/lnxcdrom.cpp b/ddio_lnx/lnxcdrom.cpp index 28b4755c..ba678fe2 100644 --- a/ddio_lnx/lnxcdrom.cpp +++ b/ddio_lnx/lnxcdrom.cpp @@ -95,7 +95,6 @@ #include #include #include -#include #include "mem.h" #include "mono.h" #include "ddio.h" @@ -242,8 +241,6 @@ void cdrom_set_system_shutdown(void) { system_cdroms::system_cdroms(void) { reinit(); } void system_cdroms::reinit(void) { - SDL_QuitSubSystem(SDL_INIT_CDROM); - SDL_Init(SDL_INIT_CDROM); m_CreatedMountPoint = false; m_NumCDRoms = 0; m_DeviceToUse = -1; @@ -253,10 +250,9 @@ void system_cdroms::reinit(void) { } // reinit system_cdroms::~system_cdroms(void) { - // SDL_QuitSubSystem(SDL_INIT_CDROM); } -int system_cdroms::GetNumCDRoms(void) { return (SDL_CDNumDrives()); } +int system_cdroms::GetNumCDRoms(void) { return 0; } // Returns the device name of the default drive const char *system_cdroms::GetDeviceName(void) { return CDName(m_DeviceToUse); } @@ -264,7 +260,7 @@ const char *system_cdroms::GetDeviceName(void) { return CDName(m_DeviceToUse); } // Returns the volume name of the default drive const char *system_cdroms::GetVolumeName(void) { return GetVolume(m_DeviceToUse); } -const char *system_cdroms::CDName(int drive) { return (SDL_CDName(drive)); } +const char *system_cdroms::CDName(int drive) { return NULL; } const char *system_cdroms::GetVolume(int drive) { #if 1 // MACOSX @@ -342,21 +338,7 @@ const char *system_cdroms::GetVolume(int drive) { bool system_cdroms::IsCdInDrive(void) { return IsCdInDrive(m_DeviceToUse); } bool system_cdroms::IsCdInDrive(int drive) { - // int cdfd,is_in=0; - // struct cdrom_subchnl info; - // struct stat stbuf; - CDstatus cdStat; - SDL_CD cdInfo; - bool retVal = true; - - if (drive < 0 || drive >= m_NumCDRoms) - retVal = false; - else { - cdStat = SDL_CDStatus(&cdInfo); - if ((cdStat == CD_TRAYEMPTY) || (cdStat == CD_ERROR)) - retVal = false; - } // else - return (retVal); + return false; } static int read_file_string(FILE *fd, char *buffer, int maxsize) { diff --git a/ddio_lnx/lnxkey_sdl.cpp b/ddio_lnx/lnxkey_sdl.cpp index 1ccbadf5..508cfa60 100644 --- a/ddio_lnx/lnxkey_sdl.cpp +++ b/ddio_lnx/lnxkey_sdl.cpp @@ -199,34 +199,34 @@ inline ubyte sdlkeycode_to_keycode(unsigned int sdlkeycode) { case SDLK_KP_MULTIPLY: rc = KEY_PADMULTIPLY; break; - case SDLK_KP0: + case SDLK_KP_0: rc = KEY_PAD0; break; - case SDLK_KP1: + case SDLK_KP_1: rc = KEY_PAD1; break; - case SDLK_KP2: + case SDLK_KP_2: rc = KEY_PAD2; break; - case SDLK_KP3: + case SDLK_KP_3: rc = KEY_PAD3; break; - case SDLK_KP4: + case SDLK_KP_4: rc = KEY_PAD4; break; - case SDLK_KP5: + case SDLK_KP_5: rc = KEY_PAD5; break; - case SDLK_KP6: + case SDLK_KP_6: rc = KEY_PAD6; break; - case SDLK_KP7: + case SDLK_KP_7: rc = KEY_PAD7; break; - case SDLK_KP8: + case SDLK_KP_8: rc = KEY_PAD8; break; - case SDLK_KP9: + case SDLK_KP_9: rc = KEY_PAD9; break; case SDLK_SPACE: @@ -277,11 +277,11 @@ inline ubyte sdlkeycode_to_keycode(unsigned int sdlkeycode) { rc = KEY_RCTRL; break; case SDLK_LALT: - case SDLK_LMETA: + case SDLK_LGUI: rc = KEY_LALT; break; case SDLK_RALT: - case SDLK_RMETA: + case SDLK_RGUI: rc = KEY_RALT; break; @@ -319,309 +319,19 @@ inline ubyte sdlkeycode_to_keycode(unsigned int sdlkeycode) { case SDLK_COMMA: rc = KEY_COMMA; break; - case SDLK_NUMLOCK: + case SDLK_NUMLOCKCLEAR: rc = KEY_NUMLOCK; break; - case SDLK_PRINT: + case SDLK_PRINTSCREEN: rc = KEY_PRINT_SCREEN; break; - case SDLK_SCROLLOCK: + case SDLK_SCROLLLOCK: rc = KEY_SCROLLOCK; break; case SDLK_CAPSLOCK: rc = KEY_CAPSLOCK; break; - // world keys. Ugh. - case SDLK_WORLD_0: - rc = KEY_WORLD0; - break; - case SDLK_WORLD_1: - rc = KEY_WORLD1; - break; - case SDLK_WORLD_2: - rc = KEY_WORLD2; - break; - case SDLK_WORLD_3: - rc = KEY_WORLD3; - break; - case SDLK_WORLD_4: - rc = KEY_WORLD4; - break; - case SDLK_WORLD_5: - rc = KEY_WORLD5; - break; - case SDLK_WORLD_6: - rc = KEY_WORLD6; - break; - case SDLK_WORLD_7: - rc = KEY_WORLD7; - break; - case SDLK_WORLD_8: - rc = KEY_WORLD8; - break; - case SDLK_WORLD_9: - rc = KEY_WORLD9; - break; - case SDLK_WORLD_10: - rc = KEY_WORLD10; - break; - case SDLK_WORLD_11: - rc = KEY_WORLD11; - break; - case SDLK_WORLD_12: - rc = KEY_WORLD12; - break; - case SDLK_WORLD_13: - rc = KEY_WORLD13; - break; - case SDLK_WORLD_14: - rc = KEY_WORLD14; - break; - case SDLK_WORLD_15: - rc = KEY_WORLD15; - break; - case SDLK_WORLD_16: - rc = KEY_WORLD16; - break; - case SDLK_WORLD_17: - rc = KEY_WORLD17; - break; - case SDLK_WORLD_18: - rc = KEY_WORLD18; - break; - case SDLK_WORLD_19: - rc = KEY_WORLD19; - break; - case SDLK_WORLD_20: - rc = KEY_WORLD20; - break; - case SDLK_WORLD_21: - rc = KEY_WORLD21; - break; - case SDLK_WORLD_22: - rc = KEY_WORLD22; - break; - case SDLK_WORLD_23: - rc = KEY_WORLD23; - break; - case SDLK_WORLD_24: - rc = KEY_WORLD24; - break; - case SDLK_WORLD_25: - rc = KEY_WORLD25; - break; - case SDLK_WORLD_26: - rc = KEY_WORLD26; - break; - case SDLK_WORLD_27: - rc = KEY_WORLD27; - break; - case SDLK_WORLD_28: - rc = KEY_WORLD28; - break; - case SDLK_WORLD_29: - rc = KEY_WORLD29; - break; - case SDLK_WORLD_30: - rc = KEY_WORLD30; - break; - case SDLK_WORLD_31: - rc = KEY_WORLD31; - break; - case SDLK_WORLD_32: - rc = KEY_WORLD32; - break; - case SDLK_WORLD_33: - rc = KEY_WORLD33; - break; - case SDLK_WORLD_34: - rc = KEY_WORLD34; - break; - case SDLK_WORLD_35: - rc = KEY_WORLD35; - break; - case SDLK_WORLD_36: - rc = KEY_WORLD36; - break; - case SDLK_WORLD_37: - rc = KEY_WORLD37; - break; - case SDLK_WORLD_38: - rc = KEY_WORLD38; - break; - case SDLK_WORLD_39: - rc = KEY_WORLD39; - break; - case SDLK_WORLD_40: - rc = KEY_WORLD40; - break; - case SDLK_WORLD_41: - rc = KEY_WORLD41; - break; - case SDLK_WORLD_42: - rc = KEY_WORLD42; - break; - case SDLK_WORLD_43: - rc = KEY_WORLD43; - break; - case SDLK_WORLD_44: - rc = KEY_WORLD44; - break; - case SDLK_WORLD_45: - rc = KEY_WORLD45; - break; - case SDLK_WORLD_46: - rc = KEY_WORLD46; - break; - case SDLK_WORLD_47: - rc = KEY_WORLD47; - break; - case SDLK_WORLD_48: - rc = KEY_WORLD48; - break; - case SDLK_WORLD_49: - rc = KEY_WORLD49; - break; - case SDLK_WORLD_50: - rc = KEY_WORLD50; - break; - case SDLK_WORLD_51: - rc = KEY_WORLD51; - break; - case SDLK_WORLD_52: - rc = KEY_WORLD52; - break; - case SDLK_WORLD_53: - rc = KEY_WORLD53; - break; - case SDLK_WORLD_54: - rc = KEY_WORLD54; - break; - case SDLK_WORLD_55: - rc = KEY_WORLD55; - break; - case SDLK_WORLD_56: - rc = KEY_WORLD56; - break; - case SDLK_WORLD_57: - rc = KEY_WORLD57; - break; - case SDLK_WORLD_58: - rc = KEY_WORLD58; - break; - case SDLK_WORLD_59: - rc = KEY_WORLD59; - break; - case SDLK_WORLD_60: - rc = KEY_WORLD60; - break; - case SDLK_WORLD_61: - rc = KEY_WORLD61; - break; - case SDLK_WORLD_62: - rc = KEY_WORLD62; - break; - case SDLK_WORLD_63: - rc = KEY_WORLD63; - break; - case SDLK_WORLD_64: - rc = KEY_WORLD64; - break; - case SDLK_WORLD_65: - rc = KEY_WORLD65; - break; - case SDLK_WORLD_66: - rc = KEY_WORLD66; - break; - case SDLK_WORLD_67: - rc = KEY_WORLD67; - break; - case SDLK_WORLD_68: - rc = KEY_WORLD68; - break; - case SDLK_WORLD_69: - rc = KEY_WORLD69; - break; - case SDLK_WORLD_70: - rc = KEY_WORLD70; - break; - case SDLK_WORLD_71: - rc = KEY_WORLD71; - break; - case SDLK_WORLD_72: - rc = KEY_WORLD72; - break; - case SDLK_WORLD_73: - rc = KEY_WORLD73; - break; - case SDLK_WORLD_74: - rc = KEY_WORLD74; - break; - case SDLK_WORLD_75: - rc = KEY_WORLD75; - break; - case SDLK_WORLD_76: - rc = KEY_WORLD76; - break; - case SDLK_WORLD_77: - rc = KEY_WORLD77; - break; - case SDLK_WORLD_78: - rc = KEY_WORLD78; - break; - case SDLK_WORLD_79: - rc = KEY_WORLD79; - break; - case SDLK_WORLD_80: - rc = KEY_WORLD80; - break; - case SDLK_WORLD_81: - rc = KEY_WORLD81; - break; - case SDLK_WORLD_82: - rc = KEY_WORLD82; - break; - case SDLK_WORLD_83: - rc = KEY_WORLD83; - break; - case SDLK_WORLD_84: - rc = KEY_WORLD84; - break; - case SDLK_WORLD_85: - rc = KEY_WORLD85; - break; - case SDLK_WORLD_86: - rc = KEY_WORLD86; - break; - case SDLK_WORLD_87: - rc = KEY_WORLD87; - break; - case SDLK_WORLD_88: - rc = KEY_WORLD88; - break; - case SDLK_WORLD_89: - rc = KEY_WORLD89; - break; - case SDLK_WORLD_90: - rc = KEY_WORLD90; - break; - case SDLK_WORLD_91: - rc = KEY_WORLD91; - break; - case SDLK_WORLD_92: - rc = KEY_WORLD92; - break; - case SDLK_WORLD_93: - rc = KEY_WORLD93; - break; - case SDLK_WORLD_94: - rc = KEY_WORLD94; - break; - case SDLK_WORLD_95: - rc = KEY_WORLD95; - break; - // convert 'a' - 'z' to 0-27, and then convert to ddio format. default: if (rc >= SDLK_a && rc <= SDLK_z) { @@ -646,6 +356,7 @@ int sdlKeyFilter(const SDL_Event *event) { switch (event->key.state) { case SDL_PRESSED: kc = sdlkeycode_to_keycode(event->key.keysym.sym); +#if 0 // !!! FIXME: migrate from SDL 1.2 if (event->key.keysym.mod & KMOD_CTRL) { switch (kc) { case KEY_G: // toggle grabbed input. @@ -685,6 +396,7 @@ int sdlKeyFilter(const SDL_Event *event) { return (0); } // if } // else if +#endif LKeys[kc].down_time = timer_GetTime(); LKeys[kc].status = true; @@ -711,9 +423,6 @@ bool ddio_sdl_InternalKeyInit(ddio_init_info *init_info) { LKeys[i].up_ticks = 0; LKeys[i].status = false; } - - SDL_EventState(SDL_KEYDOWN, SDL_ENABLE); - SDL_EventState(SDL_KEYUP, SDL_ENABLE); return true; } diff --git a/ddio_lnx/lnxmouse.cpp b/ddio_lnx/lnxmouse.cpp index 53ff14dc..69c7b548 100644 --- a/ddio_lnx/lnxmouse.cpp +++ b/ddio_lnx/lnxmouse.cpp @@ -125,10 +125,6 @@ static int Mouse_mode = MOUSE_STANDARD_MODE; bool ddio_MouseInit(void) { DDIO_mouse_init = true; - - SDL_EventState(SDL_MOUSEBUTTONDOWN, SDL_ENABLE); - SDL_EventState(SDL_MOUSEBUTTONUP, SDL_ENABLE); - SDL_EventState(SDL_MOUSEMOTION, SDL_ENABLE); ddio_MouseReset(); return true; } diff --git a/ddio_lnx/sdljoy.cpp b/ddio_lnx/sdljoy.cpp index 38186eec..4975e71f 100644 --- a/ddio_lnx/sdljoy.cpp +++ b/ddio_lnx/sdljoy.cpp @@ -106,10 +106,6 @@ bool joy_Init(bool remote) { // FIXME: report an error? return false; } - SDL_EventState(SDL_JOYAXISMOTION, SDL_IGNORE); - SDL_EventState(SDL_JOYHATMOTION, SDL_IGNORE); - SDL_EventState(SDL_JOYBUTTONDOWN, SDL_IGNORE); - SDL_EventState(SDL_JOYBUTTONUP, SDL_IGNORE); // check if this OS supports joysticks if (!joyGetNumDevs() && !remote) { @@ -155,7 +151,7 @@ static bool joy_InitStick(tJoystick joy, char *server_adr) { tJoyInfo caps; memset(&caps, 0, (sizeof caps)); - strncpy(caps.name, SDL_JoystickName(joy), sizeof(caps.name) - 1); + strncpy(caps.name, SDL_JoystickNameForIndex(joy), sizeof(caps.name) - 1); caps.num_btns = SDL_JoystickNumButtons(stick); int axes = SDL_JoystickNumAxes(stick); switch (axes) { diff --git a/linux/lnxapp.cpp b/linux/lnxapp.cpp index ffd3bb56..ad141ede 100644 --- a/linux/lnxapp.cpp +++ b/linux/lnxapp.cpp @@ -80,6 +80,11 @@ #include #include #include + +#ifdef buttons // termios.h defines buttons, but SDL's headers use that symbol. +#undef buttons +#endif + #include #include #include @@ -148,8 +153,6 @@ void LnxAppShutdown(void) { if (LinuxAppFlags & OEAPP_CONSOLE) { con_Destroy(); tcsetattr(0, TCSANOW, &Linux_initial_terminal_settings); - } else { - SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); } } @@ -163,8 +166,6 @@ oeLnxApplication::oeLnxApplication(unsigned flags) { con_Create(m_Flags); } - SDL_EnableKeyRepeat(0, 0); - LinuxAppFlags = m_Flags; if (!LinuxAppSetAtExit) { @@ -252,7 +253,6 @@ void oeLnxApplication::set_sizepos(int x, int y, int w, int h) { const char *oeLnxApplication::get_window_name(void) { return "Descent 3"; } void oeLnxApplication::clear_window(void) { - SDL_FillRect(SDL_GetVideoSurface(), NULL, SDL_MapRGB(SDL_GetVideoSurface()->format, 255, 0, 0)); } // initializes OS components. diff --git a/lnxmvelib/lnxdraw.cpp b/lnxmvelib/lnxdraw.cpp index 59702c57..3f541902 100644 --- a/lnxmvelib/lnxdraw.cpp +++ b/lnxmvelib/lnxdraw.cpp @@ -65,7 +65,7 @@ int LnxDraw_InitVideo(LnxVideoDesc *ldesc) { return 0; } -int d3SDLEventFilter(const SDL_Event *event); +int SDLCALL d3SDLEventFilter(void *userdata, SDL_Event *event); ///////////////////////// // LnxDraw_CreateWindow @@ -78,8 +78,10 @@ int d3SDLEventFilter(const SDL_Event *event); // -2 : Display not opened // -3 : Out of memory int LnxDraw_CreateWindow(LnxWindowDesc *ldesc, LnxWindow **lphandle) { - +#if 1 + SDL_Log("!!! FIXME no movie window %s:%d\n", __FILE__, __LINE__); return -1; +#else if (!ldesc || !lphandle) return -1; *lphandle = NULL; @@ -93,7 +95,7 @@ int LnxDraw_CreateWindow(LnxWindowDesc *ldesc, LnxWindow **lphandle) { fprintf(stderr, "SDL_GetError() reports \"%s\".\n", SDL_GetError()); return (-2); } // if - SDL_SetEventFilter(d3SDLEventFilter); + SDL_SetEventFilter(d3SDLEventFilter, NULL); SDL_Rect **modes = LinuxVideoMode.getModes(); Uint32 sdlflags = LinuxVideoMode.getSDLFlags(); @@ -315,6 +317,7 @@ int LnxDraw_CreateWindow(LnxWindowDesc *ldesc, LnxWindow **lphandle) { } return 0; +#endif } ////////////////////////// @@ -326,7 +329,10 @@ int LnxDraw_CreateWindow(LnxWindowDesc *ldesc, LnxWindow **lphandle) { // 0 : no error // -1 : invalid parameter int LnxDraw_DestroyWindow(LnxWindow *handle) { +#if 1 + SDL_Log("!!! FIXME no movie window %s:%d\n", __FILE__, __LINE__); return -1; +#else int i; LnxWindow *wnd = NULL; @@ -373,6 +379,7 @@ int LnxDraw_DestroyWindow(LnxWindow *handle) { free(wnd); return 0; +#endif } //////////////////////// @@ -385,6 +392,10 @@ int LnxDraw_DestroyWindow(LnxWindow *handle) { // false : error bool LnxDraw_LockSurface(LnxWindow *wnd, unsigned x1, unsigned y1, unsigned x2, unsigned y2, unsigned char **ptr, int *pitch) { +#if 1 + SDL_Log("!!! FIXME no movie window %s:%d\n", __FILE__, __LINE__); + return false; +#else return -1; if (!wnd || !ptr || !pitch) return false; @@ -460,6 +471,7 @@ bool LnxDraw_LockSurface(LnxWindow *wnd, unsigned x1, unsigned y1, unsigned x2, *ptr = ((unsigned char *)wnd->surface->pixels) + ((wnd->surface->format->BytesPerPixel * wnd->dwWidth) * linesDown); return true; +#endif } ////////////////////////// @@ -468,7 +480,9 @@ bool LnxDraw_LockSurface(LnxWindow *wnd, unsigned x1, unsigned y1, unsigned x2, // Unlocks the window surface, blitting the buffer // void LnxDraw_UnlockSurface(LnxWindow *wnd, unsigned char *ptr) { - return; +#if 1 + SDL_Log("!!! FIXME no movie window %s:%d\n", __FILE__, __LINE__); +#else if (!wnd->bLocked) return; bool still_have_shared = true; @@ -514,6 +528,7 @@ void LnxDraw_UnlockSurface(LnxWindow *wnd, unsigned char *ptr) { SDL_SaveBMP(wnd->surface, filename); framenum++; #endif +#endif } //////////////////////////// diff --git a/netcon/inetfile/CFtp.cpp b/netcon/inetfile/CFtp.cpp index 9d13a877..12006202 100644 --- a/netcon/inetfile/CFtp.cpp +++ b/netcon/inetfile/CFtp.cpp @@ -218,7 +218,7 @@ CFtpGet::CFtpGet(char *URL, char *localfile, char *Username, char *Password) { } // if(df_pthread_create(&thread,NULL,FTPObjThread,this)!=0) - thread = SDL_CreateThread(FTPObjThread, this); + thread = SDL_CreateThread(FTPObjThread, "ftpget", this); if (thread == NULL) { m_State = FTP_STATE_INTERNAL_ERROR; return; diff --git a/netcon/inetfile/Chttpget.cpp b/netcon/inetfile/Chttpget.cpp index 71d0af39..0db4f18b 100644 --- a/netcon/inetfile/Chttpget.cpp +++ b/netcon/inetfile/Chttpget.cpp @@ -291,7 +291,7 @@ void ChttpGet::GetFile(char *URL, char *localfile) { } // if(df_pthread_create(&thread,NULL,HTTPObjThread,this)!=0) - thread = SDL_CreateThread(HTTPObjThread, this); + thread = SDL_CreateThread(HTTPObjThread, "httpget", this); if (thread == NULL) { m_State = HTTP_STATE_INTERNAL_ERROR; return; @@ -713,7 +713,7 @@ int http_Asyncgethostbyname(unsigned int *ip, int command, char *hostname) { } // df_pthread_create(&thread,NULL,http_gethostbynameworker,newaslu); - newaslu->threadId = SDL_CreateThread(http_gethostbynameworker, newaslu); + newaslu->threadId = SDL_CreateThread(http_gethostbynameworker, "httpdns", newaslu); #endif return 1; } else if (command == NW_AGHBN_CANCEL) { diff --git a/networking/networking.cpp b/networking/networking.cpp index a816038b..c7b24c45 100644 --- a/networking/networking.cpp +++ b/networking/networking.cpp @@ -2158,7 +2158,7 @@ int nw_Asyncgethostbyname(unsigned int *ip, int command, char *hostname) { // rcg06192000 SDLified. // pthread_t thread; // dpthread_create(&thread, NULL, gethostbynameworker,newaslu); - aslu.threadId = SDL_CreateThread(gethostbynameworker, &aslu); + aslu.threadId = SDL_CreateThread(gethostbynameworker, "dnsworker", &aslu); } #else HOSTENT *he = gethostbyname(lastaslu->host); diff --git a/renderer/HardwareOpenGL.cpp b/renderer/HardwareOpenGL.cpp index e8ec00c1..fa455110 100644 --- a/renderer/HardwareOpenGL.cpp +++ b/renderer/HardwareOpenGL.cpp @@ -108,6 +108,8 @@ static HDC hOpenGLDC = NULL; HGLRC ResourceContext; static WORD Saved_gamma_values[256 * 3]; #elif defined(__LINUX__) +SDL_Window *GSDLWindow = NULL; +SDL_GLContext GSDLGLContext = NULL; char loadedLibrary[_MAX_PATH]; #else #endif @@ -216,7 +218,7 @@ int checkForGLErrors( const char *file, int line ) counter++ ; } */ - char *sdlp = SDL_GetError(); + const char *sdlp = SDL_GetError(); if(sdlp && *sdlp) mprintf((0,"SDL: %s",sdlp)); return 1; @@ -566,7 +568,7 @@ void setMinimumAcceptableRenderTime(int ms) { extern bool linux_permit_gamma; extern renderer_preferred_state Render_preferred_state; extern bool ddio_mouseGrabbed; -int d3SDLEventFilter(const SDL_Event *event); +int SDLCALL d3SDLEventFilter(void *userdata, SDL_Event *event); int opengl_Setup(oeApplication *app, int *width, int *height) { // rcg11192000 don't check for FPS. @@ -595,15 +597,18 @@ int opengl_Setup(oeApplication *app, int *width, int *height) { rend_SetErrorMessage(buffer); return (0); } // if - SDL_SetEventFilter(d3SDLEventFilter); + SDL_SetEventFilter(d3SDLEventFilter, NULL); bool fullscreen = false; + +#if 0 // this was a workaround for 3DFx Voodoo cards back in the day. Presumably no longer needed? --ryan 04/27/2024 char *env = getenv("MESA_GLX_FX"); if ((!env) || (*env == 'f')) // Full screen Mesa mode !!! needs more. { fullscreen = true; } +#endif if (FindArgChar("-fullscreen", 'f')) { fullscreen = true; @@ -612,7 +617,6 @@ int opengl_Setup(oeApplication *app, int *width, int *height) { } #if 0 // this was for 3DFx Voodoo cards...probably don't need this anymore. --ryan 04/27/2024 - if (env == NULL) { putenv((char *)(fullscreen ? "MESA_GLX_FX=f" : "MESA_GLX_FX=w")); } @@ -631,14 +635,10 @@ int opengl_Setup(oeApplication *app, int *width, int *height) { if (arg != 0) { strcpy(gl_library, GameArgs[arg + 1]); } else { -#if defined(MACOSX) - strcpy(gl_library, "/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib"); -#else - strcpy(gl_library, "libGL.so"); -#endif + gl_library[0] = 0; } - mprintf((0, "OpenGL: Attempting to use \"%s\" for OpenGL\n", gl_library)); + mprintf((0, "OpenGL: Attempting to use \"%s\" for OpenGL\n", gl_library[0] ? gl_library : "[system default library]")); #if 0 // this was for 3DFx Voodoo cards...probably don't need this anymore. --ryan 04/27/2024 putenv("MESA_FX_NO_SIGNALS=ihatesegfaults"); @@ -690,45 +690,49 @@ int opengl_Setup(oeApplication *app, int *width, int *height) { SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); - int flags = SDL_OPENGL; + Uint32 flags = SDL_WINDOW_OPENGL; if (fullscreen) { - flags |= SDL_FULLSCREEN; + flags |= SDL_WINDOW_FULLSCREEN; } - // Should we shoot for 32-bpp if available? !!! - SDL_Surface *surface = SDL_SetVideoMode(*width, *height, 32, flags); - mprintf((0, "OpenGL: SDL GL surface is %sNULL.", (surface == NULL) ? "" : "NOT ")); + + GSDLWindow = SDL_CreateWindow("Descent 3", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, *width, *height, flags); + if (!GSDLWindow) { + mprintf((0, "OpenGL: SDL window creation failed: %s", SDL_GetError())); + return 0; + } + + GSDLGLContext = SDL_GL_CreateContext(GSDLWindow); + if (!GSDLGLContext) { + mprintf((0, "OpenGL: OpenGL context creation failed: %s", SDL_GetError())); + SDL_DestroyWindow(GSDLWindow); + GSDLWindow = NULL; + return 0; + } if (!FindArg("-nomousecap")) { - // ShowCursor(0) and input grabbing need to be done before setting - // the video mode, or the Voodoo 3 gets a hardware cursor stuck - // on the screen. - // On modern systems this is not necessary and must be done after to take effect. - SDL_ShowCursor(0); - SDL_WM_GrabInput(SDL_GRAB_ON); ddio_mouseGrabbed = true; } - if (ddio_mouseGrabbed == false) { - SDL_WM_GrabInput(SDL_GRAB_OFF); + if (ddio_mouseGrabbed) { + SDL_ShowCursor( 0 ); + SDL_SetWindowGrab(GSDLWindow, SDL_TRUE); } - SDL_WM_SetCaption("Descent 3", "Descent3"); - // rcg09182000 gamma fun. // rcg01112000 --nogamma fun. if (FindArgChar("-nogamma", 'M')) { linux_permit_gamma = false; } else { - float f = Render_preferred_state.gamma; - bool gammarc = SDL_SetGamma(f, f, f); - linux_permit_gamma = (gammarc == 0); + Uint16 ramp[256]; + SDL_CalculateGammaRamp(Render_preferred_state.gamma, ramp); + linux_permit_gamma = (SDL_SetWindowGammaRamp(GSDLWindow, ramp, ramp, ramp) == 0); } // else if (ParentApplication) { reinterpret_cast(ParentApplication)->set_sizepos(0, 0, *width, *height); - SDL_FillRect(SDL_GetVideoSurface(), NULL, SDL_MapRGB(SDL_GetVideoSurface()->format, 255, 0, 0)); + //SDL_FillRect(SDL_GetVideoSurface(), NULL, SDL_MapRGB(SDL_GetVideoSurface()->format, 255, 0, 0)); } Already_loaded = 1; @@ -1061,7 +1065,16 @@ void opengl_Close() { #endif } #elif defined(__LINUX__) - // SDL_Quit() handles this for us. + if (GSDLGLContext) { + SDL_GL_MakeCurrent(NULL, NULL); + SDL_GL_DeleteContext(GSDLGLContext); + GSDLGLContext = NULL; + } + + if (GSDLWindow) { + SDL_DestroyWindow(GSDLWindow); + GSDLWindow = NULL; + } #else #endif @@ -2323,6 +2336,8 @@ void rend_StartFrame(int x1, int y1, int x2, int y2, int clear_flags) { } #ifdef __CHECK_FOR_TOO_SLOW_RENDERING__ +// !!! FIXME: delete this whole section (and definitely the Loki email and phone number!). +#error do not compile this in. This was for software mesa problems in 2000. static void slownessAbort(void) { #ifdef __LINUX__ @@ -2376,7 +2391,7 @@ void rend_Flip(void) { #if defined(WIN32) SwapBuffers((HDC)hOpenGLDC); #elif defined(__LINUX__) - SDL_GL_SwapBuffers(); + SDL_GL_SwapWindow(GSDLWindow); #endif #ifdef __PERMIT_GL_LOGGING diff --git a/renderer/dyna_gl.h b/renderer/dyna_gl.h index a25554ba..513e64ab 100644 --- a/renderer/dyna_gl.h +++ b/renderer/dyna_gl.h @@ -228,12 +228,12 @@ module *LoadOpenGLDLL(const char *dllname) { #ifdef __LINUX__ char *tmp = getcwd(NULL, 0); chdir(__orig_pwd); - int rc = SDL_GL_LoadLibrary(dllname); + int rc = SDL_GL_LoadLibrary(dllname[0] ? dllname : NULL); chdir(tmp); free(tmp); if (rc < 0) { const char *sdlErr = SDL_GetError(); - mprintf((0, "OpenGL: Couldn't open library [%s].\n", dllname)); + mprintf((0, "OpenGL: Couldn't open library [%s].\n", dllname[0] ? dllname : "system default")); mprintf((0, "OpenGL: SDL error is [%s].", sdlErr)); return NULL; } diff --git a/renderer/lnxscreenmode.cpp b/renderer/lnxscreenmode.cpp index 51120dc6..8297fd9d 100644 --- a/renderer/lnxscreenmode.cpp +++ b/renderer/lnxscreenmode.cpp @@ -115,6 +115,7 @@ CLnxVideoModes::~CLnxVideoModes() { // enumerate all the possible video modes bool CLnxVideoModes::Init(void) // Display *dpy,int screen) { +#if 0 // with SDL2, we'll just use FULLSCREEN_DESKTOP and never change the physical vidmode if (m_Inited) return true; @@ -181,6 +182,7 @@ bool CLnxVideoModes::Init(void) // Display *dpy,int screen) } // for mprintf((0, "-------------------------\n")); } // else +#endif return true; } From f739edff3dedb9cc58f96fb9d521834bb5220c42 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Tue, 30 Apr 2024 01:08:36 -0400 Subject: [PATCH 02/12] Some more SDL1.2 -> SDL2 work. Mouse input doesn't suck now! --- ddio_lnx/lnxkey_sdl.cpp | 25 ++++++++++++------------- renderer/HardwareOpenGL.cpp | 5 +---- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/ddio_lnx/lnxkey_sdl.cpp b/ddio_lnx/lnxkey_sdl.cpp index 508cfa60..bd567385 100644 --- a/ddio_lnx/lnxkey_sdl.cpp +++ b/ddio_lnx/lnxkey_sdl.cpp @@ -356,19 +356,12 @@ int sdlKeyFilter(const SDL_Event *event) { switch (event->key.state) { case SDL_PRESSED: kc = sdlkeycode_to_keycode(event->key.keysym.sym); -#if 0 // !!! FIXME: migrate from SDL 1.2 if (event->key.keysym.mod & KMOD_CTRL) { switch (kc) { case KEY_G: // toggle grabbed input. - if (ddio_mouseGrabbed) { - SDL_WM_GrabInput(SDL_GRAB_OFF); - ddio_mouseGrabbed = false; - } // if - else { - SDL_WM_GrabInput(SDL_GRAB_ON); - ddio_mouseGrabbed = true; - } // else - return (0); + ddio_mouseGrabbed = !ddio_mouseGrabbed; + SDL_SetRelativeMouseMode(ddio_mouseGrabbed ? SDL_TRUE : SDL_FALSE); + return 0; #ifdef __PERMIT_GL_LOGGING case KEY_INSERT: @@ -392,11 +385,17 @@ int sdlKeyFilter(const SDL_Event *event) { else if (event->key.keysym.mod & KMOD_ALT) { if ((kc == KEY_ENTER) || (kc == KEY_PADENTER)) { - SDL_WM_ToggleFullScreen(SDL_GetVideoSurface()); - return (0); + extern SDL_Window *GSDLWindow; + Uint32 flags = SDL_GetWindowFlags(GSDLWindow); + if (flags & SDL_WINDOW_FULLSCREEN) { + flags &= ~SDL_WINDOW_FULLSCREEN_DESKTOP; + } else { + flags |= SDL_WINDOW_FULLSCREEN; // !!! FIXME: FULLSCREEN_DESKTOP + } + SDL_SetWindowFullscreen(GSDLWindow, flags); + return(0); } // if } // else if -#endif LKeys[kc].down_time = timer_GetTime(); LKeys[kc].status = true; diff --git a/renderer/HardwareOpenGL.cpp b/renderer/HardwareOpenGL.cpp index fa455110..951c1208 100644 --- a/renderer/HardwareOpenGL.cpp +++ b/renderer/HardwareOpenGL.cpp @@ -715,10 +715,7 @@ int opengl_Setup(oeApplication *app, int *width, int *height) { ddio_mouseGrabbed = true; } - if (ddio_mouseGrabbed) { - SDL_ShowCursor( 0 ); - SDL_SetWindowGrab(GSDLWindow, SDL_TRUE); - } + SDL_SetRelativeMouseMode(ddio_mouseGrabbed ? SDL_TRUE : SDL_FALSE); // rcg09182000 gamma fun. // rcg01112000 --nogamma fun. From 20601d15e6136b5e59bc823da9ddef507a887972 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Tue, 30 Apr 2024 01:11:07 -0400 Subject: [PATCH 03/12] Quit immediately if we get an SDL_QUIT event. --- Descent3/lnxmain.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Descent3/lnxmain.cpp b/Descent3/lnxmain.cpp index 4487365b..013dfa11 100644 --- a/Descent3/lnxmain.cpp +++ b/Descent3/lnxmain.cpp @@ -322,6 +322,11 @@ int SDLCALL d3SDLEventFilter(void *userdata, SDL_Event *event) { return (sdlMouseButtonUpFilter(event)); case SDL_MOUSEBUTTONDOWN: return (sdlMouseButtonDownFilter(event)); + case SDL_QUIT: + SDL_Quit(); + _exit(0); + break; + default: break; } // switch return (1); From b5d68319d58c0e08406ec7c6e91f97d461307864 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Tue, 30 Apr 2024 01:25:14 -0400 Subject: [PATCH 04/12] Use SDL_assert on Linux/Mac. --- lib/pserror.h | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/lib/pserror.h b/lib/pserror.h index dc07a817..ebbe3247 100644 --- a/lib/pserror.h +++ b/lib/pserror.h @@ -237,6 +237,7 @@ inline void SetDebugBreakHandlers(void (*stop)(), void (*resume)()) { Int3(); \ } while (0) #elif defined(LINUX) +#include "SDL.h" // For some reason Linux doesn't like the \ continuation character, so I have to uglify this #define DEBUG_BREAK() \ do { \ @@ -246,16 +247,7 @@ inline void SetDebugBreakHandlers(void (*stop)(), void (*resume)()) { if (DebugBreak_callback_resume) \ (*DebugBreak_callback_resume)(); \ } while (0) -#define ASSERT(x) \ - do { \ - if (!(unsigned long long)(x)) { \ - mprintf((0, "Assertion failed (%s) in %s line %d.\n", #x, __FILE__, __LINE__)); \ - if (Debug_break) \ - DEBUG_BREAK(); \ - else \ - AssertionFailed(#x, __FILE__, __LINE__); \ - } \ - } while (0) +#define ASSERT(x) SDL_assert(x) #define Int3() \ do { \ mprintf((0, "Int3 at %s line %d.\n", __FILE__, __LINE__)); \ From ff571ed7dd40e27ed6b3b0a57f52c30afdf13824 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Tue, 30 Apr 2024 12:36:52 -0400 Subject: [PATCH 05/12] Make sure Mac and Linux builds have SDL2 available. Currently Windows gets this from vcpkg. Mac will get it from Homebrew, and the GitHub linux builders will just install it with apt-get. This might not be the perfect solution (having to install Homebrew is a pain, GitHub Actions has an ancient SDL2), but it gets all the common platforms running for now without much fuss. --- .github/workflows/build.yml | 2 +- Brewfile | 3 +-- CMakeLists.txt | 7 ++++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9d68f122..1ceafe72 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -67,7 +67,7 @@ jobs: run: | sudo apt update sudo apt install -y --no-install-recommends \ - ninja-build cmake g++ libgtest-dev libsdl1.2-dev libsdl-image1.2-dev libncurses-dev zlib1g-dev libspdlog-dev + ninja-build cmake g++ libgtest-dev libsdl2-dev libncurses-dev zlib1g-dev libspdlog-dev - name: Configure CMake env: diff --git a/Brewfile b/Brewfile index 948895dc..74ebe092 100644 --- a/Brewfile +++ b/Brewfile @@ -1,8 +1,7 @@ # Homebrew dependencies to build Descent3 # SDL -brew "sdl12-compat" -brew "sdl2_image" +brew "sdl2" brew "cmake" brew "googletest" diff --git a/CMakeLists.txt b/CMakeLists.txt index d2d81550..c4952b2c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -79,17 +79,18 @@ if(UNIX) find_package(SDL2 REQUIRED) find_package(Curses REQUIRED) find_package(OpenGL REQUIRED) - message("SDL2 Include Dir is " ${SDL2_INCLUDE_DIR}) + # Some versions of the SDL2 find_package set SDL2_INCLUDE_DIR and some set a plural SDL2_INCLUDE_DIRS. Check both. + message("SDL2 Include Dir is ${SDL2_INCLUDE_DIR} ${SDL2_INCLUDE_DIRS}") endif() if(CMAKE_SYSTEM_NAME STREQUAL "Linux") message("Building for Linux") add_compile_definitions(__LINUX__ LINUX _MAX_PATH=260 _MAX_FNAME=256 _REENRANT __32BIT__ HAVEALLOCA_H _USE_OGL_ACTIVE_TEXTURES) - set(PLATFORM_INCLUDES "lib/linux" ${SDL2_INCLUDE_DIR}) + set(PLATFORM_INCLUDES "lib/linux" ${SDL2_INCLUDE_DIR} ${SDL2_INCLUDE_DIRS}) elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin") message("Building for MAC OSX") add_compile_definitions(__LINUX__ LINUX _MAX_PATH=260 _MAX_FNAME=256 _REENRANT MACOSX=1 _USE_OGL_ACTIVE_TEXTURES) - set(PLATFORM_INCLUDES "lib/linux" ${SDL2_INCLUDE_DIR}) + set(PLATFORM_INCLUDES "lib/linux" ${SDL2_INCLUDE_DIR} ${SDL2_INCLUDE_DIRS}) elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows") list(APPEND CMAKE_LIBRARY_PATH "lib/win" "lib/win/directx") add_compile_options("$<$,$>:/EHsc;/RTC1;/W3;/nologo;/c;/Zi;/TP;/errorReport:prompt>") From 65b1a7dc3bb921a40205a02b944208ef5179babe Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Sun, 5 May 2024 10:04:58 -0400 Subject: [PATCH 06/12] sdl2: Fix broken audio in MVE playback. This doesn't fix the audio gaps, just the static introduced in the SDL2 port. SDL2 does not initialize the audio callback's buffer, unlike SDL 1.2, under the assumption the callback is going to fully write it anyhow. But since the movie player wants to mix against the current contents of the buffer, we need to explicitly initialize it to silence first. --- libmve/lnxdsound.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libmve/lnxdsound.cpp b/libmve/lnxdsound.cpp index 5787e35f..e4ab4622 100644 --- a/libmve/lnxdsound.cpp +++ b/libmve/lnxdsound.cpp @@ -775,6 +775,8 @@ static void LinuxSoundMixBuffersIntoMain(int len) { } static void LinuxSoundThreadHandler(void *unused, Uint8 *stream, int len) { + SDL_memset(stream, '\0', len); + LnxBuffers[0]->buffer = stream; LnxBuffers[0]->buffer_len = len; LnxBuffers[0]->play_cursor = 0; From 851f47537b8a40477543eeaa274c1692895e78f9 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Sun, 5 May 2024 10:13:21 -0400 Subject: [PATCH 07/12] sdl2: Ignore key-repeats events. Fixes keyboard input during gameplay. --- ddio_lnx/lnxkey_sdl.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/ddio_lnx/lnxkey_sdl.cpp b/ddio_lnx/lnxkey_sdl.cpp index bd567385..70a07d60 100644 --- a/ddio_lnx/lnxkey_sdl.cpp +++ b/ddio_lnx/lnxkey_sdl.cpp @@ -355,6 +355,7 @@ int sdlKeyFilter(const SDL_Event *event) { switch (event->key.state) { case SDL_PRESSED: + if (event->key.repeat) break; // ignore these, we only want to know if it's a first time pressed, not a key-repeat. kc = sdlkeycode_to_keycode(event->key.keysym.sym); if (event->key.keysym.mod & KMOD_CTRL) { switch (kc) { From b362bc9c543f9688f6f269167f83c6606ae679aa Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Sun, 5 May 2024 10:22:16 -0400 Subject: [PATCH 08/12] sdl2: Remove a commented out line. --- renderer/HardwareOpenGL.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/renderer/HardwareOpenGL.cpp b/renderer/HardwareOpenGL.cpp index 951c1208..b38b32a5 100644 --- a/renderer/HardwareOpenGL.cpp +++ b/renderer/HardwareOpenGL.cpp @@ -729,7 +729,6 @@ int opengl_Setup(oeApplication *app, int *width, int *height) { if (ParentApplication) { reinterpret_cast(ParentApplication)->set_sizepos(0, 0, *width, *height); - //SDL_FillRect(SDL_GetVideoSurface(), NULL, SDL_MapRGB(SDL_GetVideoSurface()->format, 255, 0, 0)); } Already_loaded = 1; From 6f07fd5a94190f67813d637ffbce77d8507753a7 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Sun, 5 May 2024 10:25:05 -0400 Subject: [PATCH 09/12] sdl2: Remove some dead 3DFx Voodoo Linux support code from the year 2000. --- renderer/HardwareOpenGL.cpp | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/renderer/HardwareOpenGL.cpp b/renderer/HardwareOpenGL.cpp index b38b32a5..b1137bc8 100644 --- a/renderer/HardwareOpenGL.cpp +++ b/renderer/HardwareOpenGL.cpp @@ -601,29 +601,12 @@ int opengl_Setup(oeApplication *app, int *width, int *height) { bool fullscreen = false; -#if 0 // this was a workaround for 3DFx Voodoo cards back in the day. Presumably no longer needed? --ryan 04/27/2024 - char *env = getenv("MESA_GLX_FX"); - - if ((!env) || (*env == 'f')) // Full screen Mesa mode !!! needs more. - { - fullscreen = true; - } -#endif - if (FindArgChar("-fullscreen", 'f')) { fullscreen = true; } else if (FindArgChar("-windowed", 'w')) { fullscreen = false; } -#if 0 // this was for 3DFx Voodoo cards...probably don't need this anymore. --ryan 04/27/2024 - if (env == NULL) { - putenv((char *)(fullscreen ? "MESA_GLX_FX=f" : "MESA_GLX_FX=w")); - } - - putenv("FX_GLIDE_NO_SPLASH=1"); -#endif - if (!Already_loaded) { #define MAX_ARGS 30 #define MAX_CHARS_PER_ARG 100 @@ -640,10 +623,6 @@ int opengl_Setup(oeApplication *app, int *width, int *height) { mprintf((0, "OpenGL: Attempting to use \"%s\" for OpenGL\n", gl_library[0] ? gl_library : "[system default library]")); -#if 0 // this was for 3DFx Voodoo cards...probably don't need this anymore. --ryan 04/27/2024 - putenv("MESA_FX_NO_SIGNALS=ihatesegfaults"); -#endif - // ryan's adds. 04/18/2000...SDL stuff on 04/25/2000 bool success = true; From bd3a596975aeadfb3288102530823b0287796333 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Sun, 5 May 2024 10:27:11 -0400 Subject: [PATCH 10/12] sdl2: Updated README for SDL2 changes. Update SDL 1.2 references, remove SDL_image references. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e5c6d2a6..49a9050b 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ cmake --build --preset mac --config [Debug|Release] #### Building - Linux (Ubuntu) ```sh sudo apt update -sudo apt install -y --no-install-recommends ninja-build cmake g++ libsdl1.2-dev libsdl-image1.2-dev libncurses-dev zlib1g-dev libspdlog-dev +sudo apt install -y --no-install-recommends ninja-build cmake g++ libsdl2-dev libncurses-dev zlib1g-dev libspdlog-dev cmake --preset linux -D ENABLE_LOGGER=[ON|OFF] cmake --build --preset linux --config [Debug|Release] ``` @@ -59,7 +59,7 @@ cmake --build --preset linux --config [Debug|Release] #### Building - Linux (Fedora) ```sh sudo dnf update --refresh -sudo dnf install -y ninja-build cmake gcc-c++ SDL-devel SDL_image-devel ncurses-devel zlib-devel spdlog-devel +sudo dnf install -y ninja-build cmake gcc-c++ SDL2-devel ncurses-devel zlib-devel spdlog-devel cmake --preset linux -D ENABLE_LOGGER=[ON|OFF] cmake --build --preset linux --config [Debug|Release] ``` From 80335136e3fa46aa6d2860915dc6a48dd0ffadcc Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Sun, 5 May 2024 11:09:07 -0400 Subject: [PATCH 11/12] sdl2: Add support for mousewheel and more mouse buttons. --- Descent3/lnxmain.cpp | 3 + ddio_lnx/lnxmouse.cpp | 137 ++++++++++++++++++++++++++++++++---------- 2 files changed, 109 insertions(+), 31 deletions(-) diff --git a/Descent3/lnxmain.cpp b/Descent3/lnxmain.cpp index 013dfa11..bcc86823 100644 --- a/Descent3/lnxmain.cpp +++ b/Descent3/lnxmain.cpp @@ -307,6 +307,7 @@ static void register_d3_args(void) { int sdlKeyFilter(const SDL_Event *event); int sdlMouseButtonUpFilter(const SDL_Event *event); int sdlMouseButtonDownFilter(const SDL_Event *event); +int sdlMouseWheelFilter(const SDL_Event *event); int sdlMouseMotionFilter(const SDL_Event *event); int SDLCALL d3SDLEventFilter(void *userdata, SDL_Event *event) { @@ -322,6 +323,8 @@ int SDLCALL d3SDLEventFilter(void *userdata, SDL_Event *event) { return (sdlMouseButtonUpFilter(event)); case SDL_MOUSEBUTTONDOWN: return (sdlMouseButtonDownFilter(event)); + case SDL_MOUSEWHEEL: + return (sdlMouseWheelFilter(event)); case SDL_QUIT: SDL_Quit(); _exit(0); diff --git a/ddio_lnx/lnxmouse.cpp b/ddio_lnx/lnxmouse.cpp index 69c7b548..cff15e8f 100644 --- a/ddio_lnx/lnxmouse.cpp +++ b/ddio_lnx/lnxmouse.cpp @@ -207,7 +207,7 @@ int sdlMouseButtonDownFilter(SDL_Event const *event) { const SDL_MouseButtonEvent *ev = &event->button; t_mse_event mevt; - if (ev->button == 1) { //(evt.xbutton.state & Button1Mask) || (evt.xbutton.button == Button1)) { + if (ev->button == 1) { DDIO_mouse_state.btn_mask |= MOUSE_LB; DIM_buttons.down_count[0]++; DIM_buttons.time_down[0] = timer_GetTime(); @@ -216,7 +216,7 @@ int sdlMouseButtonDownFilter(SDL_Event const *event) { mevt.state = true; MB_queue.send(mevt); // mprintf((0, "MOUSE Button 0: Down\n")); - } else if (ev->button == 2) { //((evt.xbutton.state & Button2Mask) || (evt.xbutton.button == Button2)) { + } else if (ev->button == 2) { DDIO_mouse_state.btn_mask |= MOUSE_RB; DIM_buttons.down_count[1]++; DIM_buttons.time_down[1] = timer_GetTime(); @@ -226,7 +226,6 @@ int sdlMouseButtonDownFilter(SDL_Event const *event) { MB_queue.send(mevt); // mprintf((0, "MOUSE Button 1: Down\n")); } - // if ((evt.xbutton.state & Button3Mask) || (evt.xbutton.button == Button3)) { else if (ev->button == 3) { DDIO_mouse_state.btn_mask |= MOUSE_CB; DIM_buttons.down_count[2]++; @@ -237,19 +236,10 @@ int sdlMouseButtonDownFilter(SDL_Event const *event) { MB_queue.send(mevt); // mprintf((0, "MOUSE Button 2: Down\n")); } - // if ((evt.xbutton.state & Button4Mask) || (evt.xbutton.button == Button4)) { - else if (ev->button == 4) { /* Mouse scroll up */ - DDIO_mouse_state.btn_mask |= MOUSE_B5; - DIM_buttons.down_count[4]++; - DIM_buttons.time_down[4] = timer_GetTime(); - DIM_buttons.is_down[4] = true; - mevt.btn = 4; - mevt.state = true; - MB_queue.send(mevt); - // mprintf((0, "MOUSE Button 4: Down\n")); - } - // if ((evt.xbutton.state & Button5Mask) || (evt.xbutton.button == Button5)) { - else if (ev->button == 5) { /* Mouse scroll down */ + + // buttons 4 and 5 are reserved for the mouse wheel...that's how the engine works...adjust in here. + + else if (ev->button == 4) { DDIO_mouse_state.btn_mask |= MOUSE_B6; DIM_buttons.down_count[5]++; DIM_buttons.time_down[5] = timer_GetTime(); @@ -259,6 +249,27 @@ int sdlMouseButtonDownFilter(SDL_Event const *event) { MB_queue.send(mevt); // mprintf((0, "MOUSE Button 5: Down\n")); } + else if (ev->button == 5) { + DDIO_mouse_state.btn_mask |= MOUSE_B7; + DIM_buttons.down_count[6]++; + DIM_buttons.time_down[6] = timer_GetTime(); + DIM_buttons.is_down[6] = true; + mevt.btn = 6; + mevt.state = true; + MB_queue.send(mevt); + // mprintf((0, "MOUSE Button 6: Down\n")); + } + else if (ev->button == 6) { + DDIO_mouse_state.btn_mask |= MOUSE_B8; + DIM_buttons.down_count[7]++; + DIM_buttons.time_down[7] = timer_GetTime(); + DIM_buttons.is_down[7] = true; + mevt.btn = 7; + mevt.state = true; + MB_queue.send(mevt); + // mprintf((0, "MOUSE Button 7: Down\n")); + } + return (0); } @@ -268,7 +279,6 @@ int sdlMouseButtonUpFilter(SDL_Event const *event) { const SDL_MouseButtonEvent *ev = &event->button; t_mse_event mevt; - // if ((evt.xbutton.state & Button1Mask) || (evt.xbutton.button == Button1)) { if (ev->button == 1) { DDIO_mouse_state.btn_mask &= (~MOUSE_LB); DIM_buttons.up_count[0]++; @@ -279,7 +289,6 @@ int sdlMouseButtonUpFilter(SDL_Event const *event) { MB_queue.send(mevt); // mprintf((0, "MOUSE Button 0: Up\n")); } - // if ((evt.xbutton.state & Button2Mask) || (evt.xbutton.button == Button2)) { else if (ev->button == 2) { DDIO_mouse_state.btn_mask &= (~MOUSE_RB); DIM_buttons.up_count[1]++; @@ -290,7 +299,6 @@ int sdlMouseButtonUpFilter(SDL_Event const *event) { MB_queue.send(mevt); // mprintf((0, "MOUSE Button 1: Up\n")); } - // if ((evt.xbutton.state & Button3Mask) || (evt.xbutton.button == Button3)) { else if (ev->button == 3) { DDIO_mouse_state.btn_mask &= (~MOUSE_CB); DIM_buttons.up_count[2]++; @@ -300,20 +308,12 @@ int sdlMouseButtonUpFilter(SDL_Event const *event) { mevt.state = false; MB_queue.send(mevt); // mprintf((0, "MOUSE Button 2: Up\n")); + } - // if ((evt.xbutton.state & Button4Mask) || (evt.xbutton.button == Button4)) { + + // buttons 4 and 5 are reserved for the mouse wheel...that's how the engine works...adjust in here. + else if (ev->button == 4) { - DDIO_mouse_state.btn_mask &= (~MOUSE_B5); - DIM_buttons.up_count[4]++; - DIM_buttons.is_down[4] = false; - DIM_buttons.time_up[4] = timer_GetTime(); - mevt.btn = 4; - mevt.state = false; - MB_queue.send(mevt); - // mprintf((0, "MOUSE Button 4: Up\n")); - } - // if ((evt.xbutton.state & Button5Mask) || (evt.xbutton.button == Button5)) { - else if (ev->button == 5) { DDIO_mouse_state.btn_mask &= (~MOUSE_B6); DIM_buttons.up_count[5]++; DIM_buttons.is_down[5] = false; @@ -323,10 +323,81 @@ int sdlMouseButtonUpFilter(SDL_Event const *event) { MB_queue.send(mevt); // mprintf((0, "MOUSE Button 5: Up\n")); } + else if (ev->button == 5) { + DDIO_mouse_state.btn_mask &= (~MOUSE_B7); + DIM_buttons.up_count[6]++; + DIM_buttons.is_down[6] = false; + DIM_buttons.time_up[6] = timer_GetTime(); + mevt.btn = 6; + mevt.state = false; + MB_queue.send(mevt); + // mprintf((0, "MOUSE Button 6: Up\n")); + } + else if (ev->button == 6) { + DDIO_mouse_state.btn_mask &= (~MOUSE_B8); + DIM_buttons.up_count[7]++; + DIM_buttons.is_down[7] = false; + DIM_buttons.time_up[7] = timer_GetTime(); + mevt.btn = 7; + mevt.state = false; + MB_queue.send(mevt); + // mprintf((0, "MOUSE Button 7: Up\n")); + } return (0); } +int sdlMouseWheelFilter(SDL_Event const *event) { + ASSERT(event->type == SDL_MOUSEWHEEL); + + const SDL_MouseWheelEvent *ev = &event->wheel; + t_mse_event mevt; + + // !!! FIXME: this ignores horizontal wheels for now, since Descent3 doesn't currently have a concept of them + // !!! FIXME: (vertical mouse wheels are represented as mouse buttons 4 and 5, incorrectly, on all platforms). + // !!! FIXME: this will require improvements to the engine before this changes here, though. + + if (ev->y > 0) { /* Mouse scroll up */ + DDIO_mouse_state.btn_mask |= MOUSE_B5; + DIM_buttons.down_count[4]++; + DIM_buttons.time_down[4] = timer_GetTime(); + DIM_buttons.is_down[4] = true; + mevt.btn = 4; + mevt.state = true; + MB_queue.send(mevt); + + // send an immediate release event, as if the "button" was clicked. !!! FIXME: this also needs improvements in the engine. + // don't remove from btn_mask + DIM_buttons.up_count[4]++; + DIM_buttons.is_down[4] = false; + DIM_buttons.time_up[4] = timer_GetTime(); + mevt.btn = 4; + mevt.state = false; + MB_queue.send(mevt); + // mprintf((0, "MOUSE Scrollwheel: Rolled Up\n")); + } else if (ev->y < 0) { /* Mouse scroll down */ + DDIO_mouse_state.btn_mask |= MOUSE_B6; + DIM_buttons.down_count[5]++; + DIM_buttons.time_down[5] = timer_GetTime(); + DIM_buttons.is_down[5] = true; + mevt.btn = 5; + mevt.state = true; + MB_queue.send(mevt); + + // send an immediate release event, as if the "button" was clicked. !!! FIXME: this also needs improvements in the engine. + // don't remove from btn_mask + DIM_buttons.up_count[5]++; + DIM_buttons.is_down[5] = false; + DIM_buttons.time_up[5] = timer_GetTime(); + mevt.btn = 5; + mevt.state = false; + MB_queue.send(mevt); + // mprintf((0, "MOUSE Scrollwheel: Rolled Down\n")); + } + + return 0; +} + int sdlMouseMotionFilter(SDL_Event const *event) { /* int oldmx, oldmy; @@ -454,6 +525,10 @@ int ddio_MouseGetState(int *x, int *y, int *dx, int *dy, int *z, int *dz) { DDIO_mouse_state.dx = 0; DDIO_mouse_state.dy = 0; + + // unset the mouse wheel "button" once it's been retrieved. + DDIO_mouse_state.btn_mask &= ~(MOUSE_B5|MOUSE_B6); + return btn_mask; } From 6d837e20830dfd2e297e5ddebfcf6403930a926d Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Mon, 6 May 2024 01:43:06 -0400 Subject: [PATCH 12/12] sdl2: default to fullscreen mode. --- renderer/HardwareOpenGL.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/renderer/HardwareOpenGL.cpp b/renderer/HardwareOpenGL.cpp index b1137bc8..ecd28767 100644 --- a/renderer/HardwareOpenGL.cpp +++ b/renderer/HardwareOpenGL.cpp @@ -599,7 +599,7 @@ int opengl_Setup(oeApplication *app, int *width, int *height) { } // if SDL_SetEventFilter(d3SDLEventFilter, NULL); - bool fullscreen = false; + bool fullscreen = true; if (FindArgChar("-fullscreen", 'f')) { fullscreen = true;