From e0f5c3c58e0b3cadf3d61b5cf8ef486eaaebc5d6 Mon Sep 17 00:00:00 2001 From: mjbudd77 Date: Mon, 5 Apr 2021 21:01:50 -0400 Subject: [PATCH] Added code to fix Qt key sequences to avoid impossible combinations. --- src/drivers/Qt/ConsoleWindow.cpp | 17 ++++++++ src/drivers/Qt/ConsoleWindow.h | 2 + src/drivers/Qt/HotKeyConf.cpp | 11 ++--- src/drivers/Qt/input.cpp | 30 ++++++------- src/drivers/Qt/keyscan.cpp | 74 ++++++++++++++++++++++++++++++-- src/drivers/Qt/keyscan.h | 3 ++ 6 files changed, 114 insertions(+), 23 deletions(-) diff --git a/src/drivers/Qt/ConsoleWindow.cpp b/src/drivers/Qt/ConsoleWindow.cpp index ebde1890..13ed1a3c 100644 --- a/src/drivers/Qt/ConsoleWindow.cpp +++ b/src/drivers/Qt/ConsoleWindow.cpp @@ -726,6 +726,9 @@ void consoleWin_t::createMainMenu(void) connect( Hotkeys[ HK_SELECT_STATE_8 ].getShortcut(), SIGNAL(activated()), this, SLOT(changeState8(void)) ); connect( Hotkeys[ HK_SELECT_STATE_9 ].getShortcut(), SIGNAL(activated()), this, SLOT(changeState9(void)) ); + connect( Hotkeys[ HK_SELECT_STATE_PREV ].getShortcut(), SIGNAL(activated()), this, SLOT(decrementState(void)) ); + connect( Hotkeys[ HK_SELECT_STATE_NEXT ].getShortcut(), SIGNAL(activated()), this, SLOT(incrementState(void)) ); + #ifdef _S9XLUA_H // File -> Quick Save loadLuaAct = new QAction(tr("Load &Lua Script"), this); @@ -2053,6 +2056,20 @@ void consoleWin_t::changeState9(void) fceuWrapperUnLock(); } +void consoleWin_t::incrementState(void) +{ + fceuWrapperLock(); + FCEUI_SelectStateNext(1); + fceuWrapperUnLock(); +} + +void consoleWin_t::decrementState(void) +{ + fceuWrapperLock(); + FCEUI_SelectStateNext(-1); + fceuWrapperUnLock(); +} + void consoleWin_t::takeScreenShot(void) { fceuWrapperLock(); diff --git a/src/drivers/Qt/ConsoleWindow.h b/src/drivers/Qt/ConsoleWindow.h index 3fabde86..453ca480 100644 --- a/src/drivers/Qt/ConsoleWindow.h +++ b/src/drivers/Qt/ConsoleWindow.h @@ -262,6 +262,8 @@ class consoleWin_t : public QMainWindow void changeState7(void); void changeState8(void); void changeState9(void); + void incrementState(void); + void decrementState(void); void loadLua(void); void takeScreenShot(void); void powerConsoleCB(void); diff --git a/src/drivers/Qt/HotKeyConf.cpp b/src/drivers/Qt/HotKeyConf.cpp index dac6d66c..43f7a311 100644 --- a/src/drivers/Qt/HotKeyConf.cpp +++ b/src/drivers/Qt/HotKeyConf.cpp @@ -302,15 +302,16 @@ void HotKeyConfSetDialog_t::keyReleaseEvent(QKeyEvent *event) void HotKeyConfSetDialog_t::assignHotkey(QKeyEvent *event) { bool keyIsModifier; - QKeySequence ks( event->modifiers() + event->key() ); + //QKeySequence ks( event->modifiers() + event->key() ); + QKeySequence ks( convKeyEvent2Sequence(event) ); SDL_Keycode k = convQtKey2SDLKeyCode((Qt::Key)event->key()); //SDL_Keymod m = convQtKey2SDLModifier(event->modifiers()); keyIsModifier = (k == SDLK_LCTRL) || (k == SDLK_RCTRL) || - (k == SDLK_LSHIFT) || (k == SDLK_RSHIFT) || - (k == SDLK_LALT) || (k == SDLK_RALT) || - (k == SDLK_LGUI) || (k == SDLK_RGUI) || - (k == SDLK_CAPSLOCK); + (k == SDLK_LSHIFT) || (k == SDLK_RSHIFT) || + (k == SDLK_LALT) || (k == SDLK_RALT) || + (k == SDLK_LGUI) || (k == SDLK_RGUI) || + (k == SDLK_CAPSLOCK); //printf("Assign: '%s' %i 0x%08x\n", ks.toString().toStdString().c_str(), event->key(), event->key() ); diff --git a/src/drivers/Qt/input.cpp b/src/drivers/Qt/input.cpp index 522860e9..676adbcc 100644 --- a/src/drivers/Qt/input.cpp +++ b/src/drivers/Qt/input.cpp @@ -1007,23 +1007,23 @@ static void KeyboardCommands (void) } #endif - for (int i = 0; i < 10; i++) - { - if ( Hotkeys[HK_SELECT_STATE_0 + i].getRisingEdge() ) - { - FCEUI_SelectState (i, 1); - } - } + //for (int i = 0; i < 10; i++) + //{ + // if ( Hotkeys[HK_SELECT_STATE_0 + i].getRisingEdge() ) + // { + // FCEUI_SelectState (i, 1); + // } + //} - if ( Hotkeys[HK_SELECT_STATE_NEXT].getRisingEdge() ) - { - FCEUI_SelectStateNext (1); - } + //if ( Hotkeys[HK_SELECT_STATE_NEXT].getRisingEdge() ) + //{ + // FCEUI_SelectStateNext (1); + //} - if ( Hotkeys[HK_SELECT_STATE_PREV].getRisingEdge() ) - { - FCEUI_SelectStateNext (-1); - } + //if ( Hotkeys[HK_SELECT_STATE_PREV].getRisingEdge() ) + //{ + // FCEUI_SelectStateNext (-1); + //} if ( Hotkeys[HK_BIND_STATE].getRisingEdge() ) { diff --git a/src/drivers/Qt/keyscan.cpp b/src/drivers/Qt/keyscan.cpp index 0b9c5a4d..fc92ba1b 100644 --- a/src/drivers/Qt/keyscan.cpp +++ b/src/drivers/Qt/keyscan.cpp @@ -876,9 +876,9 @@ SDL_Keycode convQtKey2SDLKeyCode(Qt::Key q) case Key_BracketRight: s = SDLK_RIGHTBRACKET; break; - //case Key_AsciiCircum: - // s = SDLK_CARET; - //break; + case Key_AsciiCircum: + s = SDLK_CARET; + break; case Key_Underscore: s = SDLK_UNDERSCORE; break; @@ -995,6 +995,74 @@ SDL_Keymod convQtKey2SDLModifier(Qt::KeyboardModifiers m) return (SDL_Keymod)s; } +int convKeyEvent2Sequence( QKeyEvent *event ) +{ + int k, m; + + k = event->key(); + m = event->modifiers(); + + printf("Key: %x Modifier: %x \n", k, m ); + + switch ( k ) + { + case Qt::Key_Tab: + case Qt::Key_Backtab: + case Qt::Key_Space: + case Qt::Key_Exclam: + case Qt::Key_QuoteDbl: + case Qt::Key_NumberSign: + case Qt::Key_Dollar: + case Qt::Key_Percent: + case Qt::Key_Ampersand: + case Qt::Key_Apostrophe: + case Qt::Key_ParenLeft: + case Qt::Key_ParenRight: + case Qt::Key_Asterisk: + case Qt::Key_Plus: + case Qt::Key_Comma: + case Qt::Key_Minus: + case Qt::Key_Period: + case Qt::Key_Slash: + case Qt::Key_0: + case Qt::Key_1: + case Qt::Key_2: + case Qt::Key_3: + case Qt::Key_4: + case Qt::Key_5: + case Qt::Key_6: + case Qt::Key_7: + case Qt::Key_8: + case Qt::Key_9: + case Qt::Key_Colon: + case Qt::Key_Semicolon: + case Qt::Key_Less: + case Qt::Key_Equal: + case Qt::Key_Greater: + case Qt::Key_Question: + case Qt::Key_At: + case Qt::Key_BracketLeft: + case Qt::Key_Backslash: + case Qt::Key_BracketRight: + case Qt::Key_AsciiCircum: + case Qt::Key_Underscore: + case Qt::Key_QuoteLeft: + case Qt::Key_BraceLeft: + case Qt::Key_Bar: + case Qt::Key_BraceRight: + case Qt::Key_AsciiTilde: + // With these keys, the shift modifier can be implied and + // should not be included in the output. Doing so may create + // an impossible double shifted key sequence. + m &= ~Qt::ShiftModifier; + break; + default: + // Leave Modifier Unchanged + break; + } + return (m | k); +} + int pushKeyEvent(QKeyEvent *event, int pressDown) { SDL_Event sdlev; diff --git a/src/drivers/Qt/keyscan.h b/src/drivers/Qt/keyscan.h index bf31d1df..04e739dd 100644 --- a/src/drivers/Qt/keyscan.h +++ b/src/drivers/Qt/keyscan.h @@ -45,6 +45,7 @@ #include #include +#include #include SDL_Keycode convQtKey2SDLKeyCode( Qt::Key q ); @@ -53,4 +54,6 @@ SDL_Scancode convQtKey2SDLScanCode( Qt::Key q ); SDL_Keymod convQtKey2SDLModifier( Qt::KeyboardModifiers m ); +int convKeyEvent2Sequence( QKeyEvent *event ); + int pushKeyEvent( QKeyEvent *event, int pressDown );