From 266014faa74fb33cc2dd3a8e7c5c536097d66c9e Mon Sep 17 00:00:00 2001 From: Pierre Wendling Date: Sun, 18 Sep 2022 13:38:26 -0400 Subject: [PATCH] N3DS: Use SDL_Touch instead of the Joystick touch. --- src/joystick/n3ds/SDL_sysjoystick.c | 30 ----------- src/video/n3ds/SDL_n3dsevents.c | 6 ++- src/video/n3ds/SDL_n3dstouch.c | 84 +++++++++++++++++++++++++++++ src/video/n3ds/SDL_n3dstouch.h | 31 +++++++++++ src/video/n3ds/SDL_n3dsvideo.c | 3 ++ 5 files changed, 122 insertions(+), 32 deletions(-) create mode 100644 src/video/n3ds/SDL_n3dstouch.c create mode 100644 src/video/n3ds/SDL_n3dstouch.h diff --git a/src/joystick/n3ds/SDL_sysjoystick.c b/src/joystick/n3ds/SDL_sysjoystick.c index f65626290..3f2d5a262 100644 --- a/src/joystick/n3ds/SDL_sysjoystick.c +++ b/src/joystick/n3ds/SDL_sysjoystick.c @@ -45,15 +45,6 @@ */ #define CORRECTION_FACTOR_Y -CORRECTION_FACTOR_X -/* - Factors used to convert touchscreen coordinates to - SDL's 0-1 values. Note that the N3DS's screen is - internally in a portrait disposition so the - GSP_SCREEN constants are flipped. -*/ -#define TOUCHPAD_SCALE_X 1.0f / GSP_SCREEN_HEIGHT_BOTTOM -#define TOUCHPAD_SCALE_Y 1.0f / GSP_SCREEN_WIDTH - typedef struct N3DSJoystickState { u32 kDown; @@ -67,7 +58,6 @@ typedef struct N3DSJoystickState SDL_FORCE_INLINE void UpdateAxis(SDL_Joystick *joystick, N3DSJoystickState *previous_state); SDL_FORCE_INLINE void UpdateButtons(SDL_Joystick *joystick, N3DSJoystickState *previous_state); SDL_FORCE_INLINE void UpdateSensors(SDL_Joystick *joystick, N3DSJoystickState *previous_state); -SDL_FORCE_INLINE void UpdateTouch(SDL_Joystick *joystick); static N3DSJoystickState current_state; static SDL_bool sensors_enabled = SDL_FALSE; @@ -116,7 +106,6 @@ N3DS_JoystickOpen(SDL_Joystick *joystick, int device_index) SDL_PrivateJoystickAddSensor(joystick, SDL_SENSOR_ACCEL, 0.0f); SDL_PrivateJoystickAddSensor(joystick, SDL_SENSOR_GYRO, 0.0f); - SDL_PrivateJoystickAddTouchpad(joystick, 1); return 0; } @@ -132,11 +121,9 @@ static void N3DS_JoystickUpdate(SDL_Joystick *joystick) { N3DSJoystickState previous_state = current_state; - hidScanInput(); UpdateAxis(joystick, &previous_state); UpdateButtons(joystick, &previous_state); - UpdateTouch(joystick); if (sensors_enabled) { UpdateSensors(joystick, &previous_state); @@ -197,23 +184,6 @@ UpdateButtons(SDL_Joystick *joystick, N3DSJoystickState *previous_state) } } -SDL_FORCE_INLINE void -UpdateTouch(SDL_Joystick *joystick) -{ - touchPosition touch; - Uint8 state; - hidTouchRead(&touch); - state = (touch.px == 0 && touch.py == 0) ? SDL_RELEASED : SDL_PRESSED; - - SDL_PrivateJoystickTouchpad(joystick, - 0, - 0, - state, - touch.px * TOUCHPAD_SCALE_X, - touch.py * TOUCHPAD_SCALE_Y, - state == SDL_PRESSED ? 1.0f : 0.0f); -} - SDL_FORCE_INLINE void UpdateSensors(SDL_Joystick *joystick, N3DSJoystickState *previous_state) { diff --git a/src/video/n3ds/SDL_n3dsevents.c b/src/video/n3ds/SDL_n3dsevents.c index f54d68ee7..6b2126b1b 100644 --- a/src/video/n3ds/SDL_n3dsevents.c +++ b/src/video/n3ds/SDL_n3dsevents.c @@ -22,16 +22,18 @@ #ifdef SDL_VIDEO_DRIVER_N3DS -/* Pumping the events for the Home and Power buttons. */ - #include <3ds.h> #include "../../events/SDL_events_c.h" #include "SDL_n3dsevents_c.h" +#include "SDL_n3dstouch.h" void N3DS_PumpEvents(_THIS) { + hidScanInput(); + N3DS_PollTouch(); + if (!aptMainLoop()) { SDL_Event ev; ev.type = SDL_QUIT; diff --git a/src/video/n3ds/SDL_n3dstouch.c b/src/video/n3ds/SDL_n3dstouch.c new file mode 100644 index 000000000..fca0ae30f --- /dev/null +++ b/src/video/n3ds/SDL_n3dstouch.c @@ -0,0 +1,84 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2022 Sam Lantinga + + 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" + +#ifdef SDL_VIDEO_DRIVER_N3DS + +#include <3ds.h> + +#include "../../events/SDL_touch_c.h" +#include "SDL_n3dstouch.h" + +#define N3DS_TOUCH_ID 0 + +/* + Factors used to convert touchscreen coordinates to + SDL's 0-1 values. Note that the N3DS's screen is + internally in a portrait disposition so the + GSP_SCREEN constants are flipped. +*/ +#define TOUCHSCREEN_SCALE_X 1.0f / GSP_SCREEN_HEIGHT_BOTTOM +#define TOUCHSCREEN_SCALE_Y 1.0f / GSP_SCREEN_WIDTH + +void +N3DS_InitTouch(void) +{ + SDL_AddTouch(N3DS_TOUCH_ID, SDL_TOUCH_DEVICE_DIRECT, "Touchscreen"); +} + +void +N3DS_QuitTouch(void) +{ + SDL_DelTouch(N3DS_TOUCH_ID); +} + +void +N3DS_PollTouch(void) +{ + touchPosition touch; + static SDL_bool was_pressed = SDL_FALSE; + SDL_bool pressed; + hidTouchRead(&touch); + pressed = (touch.px != 0 || touch.py != 0); + + if (pressed != was_pressed) { + was_pressed = pressed; + SDL_SendTouch(N3DS_TOUCH_ID, + 0, + NULL, + pressed, + touch.px * TOUCHSCREEN_SCALE_X, + touch.py * TOUCHSCREEN_SCALE_Y, + pressed ? 1.0f : 0.0f); + } else if (pressed) { + SDL_SendTouchMotion(N3DS_TOUCH_ID, + 0, + NULL, + touch.px * TOUCHSCREEN_SCALE_X, + touch.py * TOUCHSCREEN_SCALE_Y, + 1.0f); + } +} + +#endif /* SDL_VIDEO_DRIVER_N3DS */ + +/* vi: set sts=4 ts=4 sw=4 expandtab: */ diff --git a/src/video/n3ds/SDL_n3dstouch.h b/src/video/n3ds/SDL_n3dstouch.h new file mode 100644 index 000000000..4cc7a0533 --- /dev/null +++ b/src/video/n3ds/SDL_n3dstouch.h @@ -0,0 +1,31 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2022 Sam Lantinga + + 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. +*/ + +#ifndef SDL_n3dstouch_h_ +#define SDL_n3dstouch_h_ + +void N3DS_InitTouch(void); +void N3DS_QuitTouch(void); +void N3DS_PollTouch(void); + +#endif /* SDL_n3dstouch_h_ */ + +/* vi: set sts=4 ts=4 sw=4 expandtab: */ diff --git a/src/video/n3ds/SDL_n3dsvideo.c b/src/video/n3ds/SDL_n3dsvideo.c index ebcb9de2e..cd5e01068 100644 --- a/src/video/n3ds/SDL_n3dsvideo.c +++ b/src/video/n3ds/SDL_n3dsvideo.c @@ -26,6 +26,7 @@ #include "SDL_n3dsevents_c.h" #include "SDL_n3dsframebuffer_c.h" #include "SDL_n3dsswkb.h" +#include "SDL_n3dstouch.h" #include "SDL_n3dsvideo.h" #define N3DSVID_DRIVER_NAME "n3ds" @@ -97,6 +98,7 @@ N3DS_VideoInit(_THIS) AddN3DSDisplay(GFX_TOP); AddN3DSDisplay(GFX_BOTTOM); + N3DS_InitTouch(); N3DS_SwkbInit(); return 0; @@ -136,6 +138,7 @@ static void N3DS_VideoQuit(_THIS) { N3DS_SwkbQuit(); + N3DS_QuitTouch(); return; }