From fe5cef43df40a3c7011ef2aa51f0d86c382784d8 Mon Sep 17 00:00:00 2001 From: WQSG Date: Sat, 24 Oct 2020 00:36:20 +0800 Subject: [PATCH] Fixed a bug that PS4 controller could not reset the key status in win10 when using SDL joystick. Input\Port\1\Id\1\Controller\2\ScanIgnoreAxisFlags=24 ignore axis 3(L2) and 4(R2). --- yabause/src/peripheral.h | 1 + yabause/src/persdljoy.c | 16 +++++++++++++++- yabause/src/qt/ui/UIControllerSetting.cpp | 12 ++++++++++++ yabause/src/qt/ui/UIControllerSetting.h | 1 + 4 files changed, 29 insertions(+), 1 deletion(-) diff --git a/yabause/src/peripheral.h b/yabause/src/peripheral.h index 85d5054c8..027a75a33 100644 --- a/yabause/src/peripheral.h +++ b/yabause/src/peripheral.h @@ -71,6 +71,7 @@ typedef struct int canScan; void (*Flush)(void); void (*KeyName)(u32 key, char * name, int size); + void (*ScanIgnoreAxisFlags)(u32 flags); } PerInterface_struct; /** @brief Pointer to the current peripheral core. diff --git a/yabause/src/persdljoy.c b/yabause/src/persdljoy.c index 099b51669..055c93c68 100644 --- a/yabause/src/persdljoy.c +++ b/yabause/src/persdljoy.c @@ -51,6 +51,7 @@ int PERSDLJoyHandleEvents(void); u32 PERSDLJoyScan(u32 flags); void PERSDLJoyFlush(void); void PERSDLKeyName(u32 key, char * name, int size); +void PERSDLScanIgnoreAxisFlags(u32 flags); PerInterface_struct PERSDLJoy = { PERCORE_SDLJOY, @@ -61,7 +62,8 @@ PERSDLJoyHandleEvents, PERSDLJoyScan, 1, PERSDLJoyFlush, -PERSDLKeyName +PERSDLKeyName, +PERSDLScanIgnoreAxisFlags }; typedef struct { @@ -75,6 +77,7 @@ unsigned int SDL_PERCORE_JOYSTICKS_INITIALIZED = 0; PERSDLJoystick* SDL_PERCORE_JOYSTICKS = 0; unsigned int SDL_HAT_VALUES[] = { SDL_HAT_UP, SDL_HAT_RIGHT, SDL_HAT_LEFT, SDL_HAT_DOWN }; const unsigned int SDL_HAT_VALUES_NUM = sizeof(SDL_HAT_VALUES) / sizeof(SDL_HAT_VALUES[0]); +u32 SDL_PERCORE_SCAN_IGNORE_AXIS_FLAGS = 0; ////////////////////////////////////////////////////////////////////////////// @@ -295,6 +298,8 @@ u32 PERSDLJoyScan( u32 flags ) { // check axis for ( i = 0; i < SDL_JoystickNumAxes( joy ); i++ ) { + if (SDL_PERCORE_SCAN_IGNORE_AXIS_FLAGS & (1 << i)) continue; + cur = SDL_JoystickGetAxis( joy, i ); if ( cur != SDL_PERCORE_JOYSTICKS[ joyId ].mScanStatus[ i ] ) @@ -354,6 +359,10 @@ u32 PERSDLJoyScan( u32 flags ) { } void PERSDLJoyFlush(void) { +#ifdef WIN32 + PERSDLJoyDeInit(); + PERSDLJoyInit(); +#endif } void PERSDLKeyName(u32 key, char * name, UNUSED int size) @@ -361,4 +370,9 @@ void PERSDLKeyName(u32 key, char * name, UNUSED int size) sprintf(name, "%x", (int)key); } +void PERSDLScanIgnoreAxisFlags(u32 flags) +{ + SDL_PERCORE_SCAN_IGNORE_AXIS_FLAGS = flags; +} + #endif diff --git a/yabause/src/qt/ui/UIControllerSetting.cpp b/yabause/src/qt/ui/UIControllerSetting.cpp index dd79bab2f..0d45c0190 100644 --- a/yabause/src/qt/ui/UIControllerSetting.cpp +++ b/yabause/src/qt/ui/UIControllerSetting.cpp @@ -44,6 +44,7 @@ UIControllerSetting::UIControllerSetting( PerInterface_struct* core, uint port, mPadKey = 0; mlInfos = NULL; scanFlags = PERSF_ALL; + mScanIgnoreAxisFlags = 0; QtYabause::retranslateWidget( this ); } @@ -173,6 +174,13 @@ void UIControllerSetting::loadPadSettings() setPadKey( settings->value( settingsKey ).toUInt() ); } } + + const QString keyScanIgnoreAxisFlags = QString("Input/Port/%1/Id/%2/Controller/%3/ScanIgnoreAxisFlags") + .arg(mPort) + .arg(mPad) + .arg(mPerType); + + mScanIgnoreAxisFlags = settings->contains(keyScanIgnoreAxisFlags) ? settings->value(keyScanIgnoreAxisFlags).toUInt() : 0; } bool UIControllerSetting::eventFilter( QObject* object, QEvent* event ) @@ -234,6 +242,10 @@ void UIControllerSetting::tbButton_clicked() void UIControllerSetting::timer_timeout() { u32 key = 0; + if (mCore->ScanIgnoreAxisFlags) + { + mCore->ScanIgnoreAxisFlags(mScanIgnoreAxisFlags); + } key = mCore->Scan(scanFlags); if ( key != 0 ) diff --git a/yabause/src/qt/ui/UIControllerSetting.h b/yabause/src/qt/ui/UIControllerSetting.h index 2efbd34b8..83042465c 100644 --- a/yabause/src/qt/ui/UIControllerSetting.h +++ b/yabause/src/qt/ui/UIControllerSetting.h @@ -51,6 +51,7 @@ class UIControllerSetting : public QDialog QLabel *mlInfos; u32 scanFlags; QToolButton * curTb; + u32 mScanIgnoreAxisFlags; void keyPressEvent( QKeyEvent* event ); void mouseMoveEvent(QMouseEvent * event);