X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsdl.c;h=14ad28fe39d1b696cf748fcc5ede4284428fe1ae;hb=fab52dc04709ef9eb5110d860f02f5ccf7719c2c;hp=d6cf2b1779082a6a5b9d418273fe95c91add3ca7;hpb=e913fbf7e7caa3234df0de282363ee4d6bb727e1;p=rocksndiamonds.git diff --git a/src/libgame/sdl.c b/src/libgame/sdl.c index d6cf2b17..14ad28fe 100644 --- a/src/libgame/sdl.c +++ b/src/libgame/sdl.c @@ -17,6 +17,8 @@ #define ENABLE_UNUSED_CODE 0 /* currently unused functions */ +#define DEBUG_JOYSTICKS 0 + /* ========================================================================= */ /* video functions */ @@ -532,11 +534,7 @@ inline static void SDLInitVideoBuffer_VideoBuffer(boolean fullscreen) SDLSetWindowIcon(program.icon_filename); /* set window and icon title */ -#if defined(TARGET_SDL2) - SDL_SetWindowTitle(sdl_window, program.window_title); -#else - SDL_WM_SetCaption(program.window_title, program.window_title); -#endif + SDLSetWindowTitle(); } inline static void SDLInitVideoBuffer_DrawBuffer() @@ -830,6 +828,9 @@ boolean SDLSetVideoMode(boolean fullscreen) void SDLSetWindowTitle() { #if defined(TARGET_SDL2) + if (sdl_window == NULL) + return; + SDL_SetWindowTitle(sdl_window, program.window_title); #else SDL_WM_SetCaption(program.window_title, program.window_title); @@ -2601,9 +2602,24 @@ static int sdl_js_axis[MAX_PLAYERS][2]; static int sdl_js_button[MAX_PLAYERS][2]; static boolean sdl_is_controller[MAX_PLAYERS]; -static boolean SDLOpenJoystick(int nr) +void SDLClearJoystickState() { - if (nr < 0 || nr > MAX_PLAYERS) + int i, j; + + for (i = 0; i < MAX_PLAYERS; i++) + { + for (j = 0; j < 2; j++) + { + sdl_js_axis_raw[i][j] = -1; + sdl_js_axis[i][j] = 0; + sdl_js_button[i][j] = 0; + } + } +} + +boolean SDLOpenJoystick(int nr) +{ + if (nr < 0 || nr >= MAX_PLAYERS) return FALSE; #if defined(TARGET_SDL2) @@ -2612,7 +2628,7 @@ static boolean SDLOpenJoystick(int nr) sdl_is_controller[nr] = FALSE; #endif -#if 1 +#if DEBUG_JOYSTICKS Error(ERR_DEBUG, "opening joystick %d (%s)", nr, (sdl_is_controller[nr] ? "game controller" : "joystick")); #endif @@ -2629,12 +2645,12 @@ static boolean SDLOpenJoystick(int nr) return (sdl_joystick[nr] != NULL); } -static void SDLCloseJoystick(int nr) +void SDLCloseJoystick(int nr) { - if (nr < 0 || nr > MAX_PLAYERS) + if (nr < 0 || nr >= MAX_PLAYERS) return; -#if 1 +#if DEBUG_JOYSTICKS Error(ERR_DEBUG, "closing joystick %d", nr); #endif @@ -2648,18 +2664,11 @@ static void SDLCloseJoystick(int nr) #endif sdl_joystick[nr] = NULL; - - sdl_js_axis_raw[nr][0] = -1; - sdl_js_axis_raw[nr][1] = -1; - sdl_js_axis[nr][0] = 0; - sdl_js_axis[nr][1] = 0; - sdl_js_button[nr][0] = 0; - sdl_js_button[nr][1] = 0; } boolean SDLCheckJoystickOpened(int nr) { - if (nr < 0 || nr > MAX_PLAYERS) + if (nr < 0 || nr >= MAX_PLAYERS) return FALSE; #if defined(TARGET_SDL2) @@ -2680,6 +2689,9 @@ static void setJoystickAxis(int nr, int axis_id_raw, int axis_value) int axis_id = axis_id_raw % 2; #endif + if (nr < 0 || nr >= MAX_PLAYERS) + return; + if (axis_id == -1) return; @@ -2723,6 +2735,9 @@ static void setJoystickButton(int nr, int button_id_raw, int button_state) int button_id = button_id_raw % 2; #endif + if (nr < 0 || nr >= MAX_PLAYERS) + return; + if (button_id == -1) return; @@ -2735,7 +2750,7 @@ void HandleJoystickEvent(Event *event) { #if defined(TARGET_SDL2) case SDL_CONTROLLERDEVICEADDED: -#if 1 +#if DEBUG_JOYSTICKS Error(ERR_DEBUG, "SDL_CONTROLLERDEVICEADDED: device %d added", event->cdevice.which); #endif @@ -2743,7 +2758,7 @@ void HandleJoystickEvent(Event *event) break; case SDL_CONTROLLERDEVICEREMOVED: -#if 1 +#if DEBUG_JOYSTICKS Error(ERR_DEBUG, "SDL_CONTROLLERDEVICEREMOVED: device %d removed", event->cdevice.which); #endif @@ -2751,7 +2766,7 @@ void HandleJoystickEvent(Event *event) break; case SDL_CONTROLLERAXISMOTION: -#if 1 +#if DEBUG_JOYSTICKS Error(ERR_DEBUG, "SDL_CONTROLLERAXISMOTION: device %d, axis %d: %d", event->caxis.which, event->caxis.axis, event->caxis.value); #endif @@ -2761,7 +2776,7 @@ void HandleJoystickEvent(Event *event) break; case SDL_CONTROLLERBUTTONDOWN: -#if 1 +#if DEBUG_JOYSTICKS Error(ERR_DEBUG, "SDL_CONTROLLERBUTTONDOWN: device %d, button %d", event->cbutton.which, event->cbutton.button); #endif @@ -2771,7 +2786,7 @@ void HandleJoystickEvent(Event *event) break; case SDL_CONTROLLERBUTTONUP: -#if 1 +#if DEBUG_JOYSTICKS Error(ERR_DEBUG, "SDL_CONTROLLERBUTTONUP: device %d, button %d", event->cbutton.which, event->cbutton.button); #endif @@ -2785,7 +2800,7 @@ void HandleJoystickEvent(Event *event) if (sdl_is_controller[event->jaxis.which]) break; -#if 1 +#if DEBUG_JOYSTICKS Error(ERR_DEBUG, "SDL_JOYAXISMOTION: device %d, axis %d: %d", event->jaxis.which, event->jaxis.axis, event->jaxis.value); #endif @@ -2799,7 +2814,7 @@ void HandleJoystickEvent(Event *event) if (sdl_is_controller[event->jaxis.which]) break; -#if 1 +#if DEBUG_JOYSTICKS Error(ERR_DEBUG, "SDL_JOYBUTTONDOWN: device %d, button %d", event->jbutton.which, event->jbutton.button); #endif @@ -2813,7 +2828,7 @@ void HandleJoystickEvent(Event *event) if (sdl_is_controller[event->jaxis.which]) break; -#if 1 +#if DEBUG_JOYSTICKS Error(ERR_DEBUG, "SDL_JOYBUTTONUP: device %d, button %d", event->jbutton.which, event->jbutton.button); #endif @@ -2833,7 +2848,10 @@ void SDLInitJoysticks() static boolean sdl_joystick_subsystem_initialized = FALSE; boolean print_warning = !sdl_joystick_subsystem_initialized; #if defined(TARGET_SDL2) - char *mappings_file = "gamecontrollerdb.txt"; + char *mappings_file_base = getPath2(options.conf_directory, + GAMECONTROLLER_BASENAME); + char *mappings_file_user = getPath2(getUserGameDataDir(), + GAMECONTROLLER_BASENAME); int num_mappings; #endif int i; @@ -2855,15 +2873,32 @@ void SDLInitJoysticks() } #if defined(TARGET_SDL2) - num_mappings = SDL_GameControllerAddMappingsFromFile(mappings_file); + num_mappings = SDL_GameControllerAddMappingsFromFile(mappings_file_base); - if (num_mappings != -1) - Error(ERR_INFO, "%d game controller mapping(s) added", num_mappings); + /* the included game controller base mappings should always be found */ + if (num_mappings == -1) + Error(ERR_WARN, "no game controller base mappings found"); +#if DEBUG_JOYSTICKS else - Error(ERR_WARN, "no game controller mappings found"); + Error(ERR_INFO, "%d game controller base mapping(s) added", num_mappings); +#endif + + num_mappings = SDL_GameControllerAddMappingsFromFile(mappings_file_user); + +#if DEBUG_JOYSTICKS + /* the personal game controller user mappings may or may not be found */ + if (num_mappings == -1) + Error(ERR_WARN, "no game controller user mappings found"); + else + Error(ERR_INFO, "%d game controller user mapping(s) added", num_mappings); Error(ERR_INFO, "%d joystick(s) found:", SDL_NumJoysticks()); +#endif + + checked_free(mappings_file_base); + checked_free(mappings_file_user); +#if DEBUG_JOYSTICKS for (i = 0; i < SDL_NumJoysticks(); i++) { const char *name, *type; @@ -2882,6 +2917,7 @@ void SDLInitJoysticks() Error(ERR_INFO, "- joystick %d (%s): '%s'", i, type, (name ? name : "(Unknown)")); } +#endif #endif } @@ -2900,8 +2936,8 @@ void SDLInitJoysticks() joystick_nr = -1; } - /* misuse joystick file descriptor variable to store joystick number */ - joystick.fd[i] = joystick_nr; + /* store configured joystick number for each player */ + joystick.nr[i] = joystick_nr; } /* now open all connected joysticks (regardless if configured or not) */ @@ -2916,6 +2952,8 @@ void SDLInitJoysticks() else if (print_warning) Error(ERR_WARN, "cannot open joystick %d", i); } + + SDLClearJoystickState(); } boolean SDLReadJoystick(int nr, int *x, int *y, boolean *b1, boolean *b2) @@ -2936,6 +2974,11 @@ boolean SDLReadJoystick(int nr, int *x, int *y, boolean *b1, boolean *b2) return TRUE; } + +/* ========================================================================= */ +/* touch input overlay functions */ +/* ========================================================================= */ + #if defined(USE_TOUCH_INPUT_OVERLAY) static void DrawTouchInputOverlay() { @@ -2947,11 +2990,12 @@ static void DrawTouchInputOverlay() static int alpha_step = 5; static int alpha_last = 0; static int alpha = 0; + boolean active = (overlay.enabled && overlay.active); - if (!overlay.active && deactivated) + if (!active && deactivated) return; - if (overlay.active) + if (active) { if (alpha < alpha_max) alpha = MIN(alpha + alpha_step, alpha_max);