From 04e39e4fc97806428bef09a761508b65f2885352 Mon Sep 17 00:00:00 2001 From: mjbudd77 Date: Mon, 21 Feb 2022 21:17:01 -0500 Subject: [PATCH 1/4] Added logic to Qt key scanner to fix key scancodes for characters that are only accessible via the use of the shift key (dual function keys). Should help issue #464. --- src/drivers/Qt/keyscan.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/drivers/Qt/keyscan.cpp b/src/drivers/Qt/keyscan.cpp index 4b2b2f99..57d935c4 100644 --- a/src/drivers/Qt/keyscan.cpp +++ b/src/drivers/Qt/keyscan.cpp @@ -1082,6 +1082,13 @@ int pushKeyEvent(QKeyEvent *event, int pressDown) sdlev.key.keysym.scancode = SDL_GetScancodeFromKey(sdlev.key.keysym.sym); + if ( sdlev.key.keysym.scancode == SDL_SCANCODE_UNKNOWN ) + { // If scancode is unknown, the key may be dual function via the shift key. + //printf("Scancode: %08X \n", sdlev.key.keysym.scancode ); + + sdlev.key.keysym.scancode = convQtKey2SDLScanCode( (Qt::Key)event->key() ); + } + sdlev.key.keysym.mod = convQtKey2SDLModifier(event->modifiers()); sdlev.key.repeat = 0; From d76715353157070780f17406ebfce14388e8cd0c Mon Sep 17 00:00:00 2001 From: mjbudd77 Date: Wed, 23 Feb 2022 04:55:43 -0500 Subject: [PATCH 2/4] Bug fix for family keyboard mapping of caret character. Fix for family keyboard potential data tearing on key state. For issue #464 --- src/drivers/Qt/input.cpp | 6 ++++-- src/drivers/Qt/keyscan.cpp | 6 +++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/drivers/Qt/input.cpp b/src/drivers/Qt/input.cpp index 39d76699..75712a4a 100644 --- a/src/drivers/Qt/input.cpp +++ b/src/drivers/Qt/input.cpp @@ -1838,12 +1838,14 @@ static void UpdateFKB() for (x = 0; x < 0x48; x++) { - fkbkeys[x] = 0; - if (DTestButton(&fkbmap[x])) { fkbkeys[x] = 1; } + else + { + fkbkeys[x] = 0; + } } } diff --git a/src/drivers/Qt/keyscan.cpp b/src/drivers/Qt/keyscan.cpp index 57d935c4..9882fd0e 100644 --- a/src/drivers/Qt/keyscan.cpp +++ b/src/drivers/Qt/keyscan.cpp @@ -401,9 +401,9 @@ SDL_Scancode convQtKey2SDLScanCode(Qt::Key q) case Key_BracketRight: s = SDL_SCANCODE_RIGHTBRACKET; break; - //case Key_AsciiCircum: - // s = SDL_SCANCODE_UNKNOWN; - //break; + case Key_AsciiCircum: + s = SDL_SCANCODE_6; + break; case Key_Underscore: s = SDL_SCANCODE_MINUS; break; From 98f3e57ac2be0c6a287fe6383a3e15a10c877f8b Mon Sep 17 00:00:00 2001 From: mjbudd77 Date: Wed, 23 Feb 2022 05:37:23 -0500 Subject: [PATCH 3/4] Bug fix for odd SDL scancode returns in Qt GUI. For issue #464. --- src/drivers/Qt/input.cpp | 12 ++++++++++++ src/drivers/Qt/keyscan.cpp | 16 +++++++++++++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/drivers/Qt/input.cpp b/src/drivers/Qt/input.cpp index 75712a4a..52bd6110 100644 --- a/src/drivers/Qt/input.cpp +++ b/src/drivers/Qt/input.cpp @@ -1835,17 +1835,29 @@ static ButtConfig fkbmap[0x48] = { static void UpdateFKB() { int x; + //static char lp[0x48]; for (x = 0; x < 0x48; x++) { if (DTestButton(&fkbmap[x])) { fkbkeys[x] = 1; + + //if ( !lp[x] ) + //{ + // printf("FKB Key %i Down\n", x ); + //} } else { fkbkeys[x] = 0; + + //if ( lp[x] ) + //{ + // printf("FKB Key %i Up\n", x ); + //} } + //lp[x] = fkbkeys[x]; } } diff --git a/src/drivers/Qt/keyscan.cpp b/src/drivers/Qt/keyscan.cpp index 9882fd0e..9a022d9f 100644 --- a/src/drivers/Qt/keyscan.cpp +++ b/src/drivers/Qt/keyscan.cpp @@ -313,7 +313,6 @@ SDL_Scancode convQtKey2SDLScanCode(Qt::Key q) case Key_At: s = SDL_SCANCODE_2; break; - break; case Key_A: s = SDL_SCANCODE_A; break; @@ -788,7 +787,6 @@ SDL_Keycode convQtKey2SDLKeyCode(Qt::Key q) case Key_At: s = SDLK_AT; break; - break; case Key_A: s = SDLK_a; break; @@ -1082,11 +1080,23 @@ int pushKeyEvent(QKeyEvent *event, int pressDown) sdlev.key.keysym.scancode = SDL_GetScancodeFromKey(sdlev.key.keysym.sym); + //printf("Native ScanCode: x%08X %i \n", event->nativeScanCode(), event->nativeScanCode() ); + //printf("Scancode: 0x%08X %i \n", sdlev.key.keysym.scancode, sdlev.key.keysym.scancode ); + + // SDL Docs say this code should never happen, but it does... + // so force it to alternative scancode algorithm if it occurs. + if ( (sdlev.key.keysym.scancode == SDL_SCANCODE_NONUSHASH ) || + (sdlev.key.keysym.scancode == SDL_SCANCODE_NONUSBACKSLASH ) ) + { + sdlev.key.keysym.scancode = SDL_SCANCODE_UNKNOWN; + } + if ( sdlev.key.keysym.scancode == SDL_SCANCODE_UNKNOWN ) { // If scancode is unknown, the key may be dual function via the shift key. - //printf("Scancode: %08X \n", sdlev.key.keysym.scancode ); sdlev.key.keysym.scancode = convQtKey2SDLScanCode( (Qt::Key)event->key() ); + + //printf("Dual Scancode: 0x%08X %i \n", sdlev.key.keysym.scancode, sdlev.key.keysym.scancode ); } sdlev.key.keysym.mod = convQtKey2SDLModifier(event->modifiers()); From 187ee9646c267deb78448390d4007d3b334af20f Mon Sep 17 00:00:00 2001 From: mjbudd77 Date: Thu, 24 Feb 2022 07:06:14 -0500 Subject: [PATCH 4/4] Bug fix for Qt GUI family keyboard shift key issue. Family BASIC appears to not like when both shift keys are down at the same time. For issue #464 --- src/drivers/Qt/input.cpp | 45 ++++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/src/drivers/Qt/input.cpp b/src/drivers/Qt/input.cpp index 52bd6110..665dd66e 100644 --- a/src/drivers/Qt/input.cpp +++ b/src/drivers/Qt/input.cpp @@ -1812,22 +1812,22 @@ void InitInputInterface() } static ButtConfig fkbmap[0x48] = { - MK(SDLK_F1), MK(SDLK_F2), MK(SDLK_F3), MK(SDLK_F4), MK(SDLK_F5), MK(SDLK_F6), MK(SDLK_F7), MK(SDLK_F8), - MK(SDLK_1), MK(SDLK_2), MK(SDLK_3), MK(SDLK_4), MK(SDLK_5), MK(SDLK_6), MK(SDLK_7), MK(SDLK_8), MK(SDLK_9), - MK(SDLK_0), - MK(SDLK_MINUS), MK(SDLK_EQUAL), MK(SDLK_BACKSLASH), MK(SDLK_BACKSPACE), - MK(SDLK_ESCAPE), MK(SDLK_Q), MK(SDLK_W), MK(SDLK_E), MK(SDLK_R), MK(SDLK_T), MK(SDLK_Y), MK(SDLK_U), MK(SDLK_I), - MK(SDLK_O), - MK(SDLK_P), MK(SDLK_GRAVE), MK(SDLK_BRACKET_LEFT), MK(SDLK_ENTER), - MK(SDLK_LEFTCONTROL), MK(SDLK_A), MK(SDLK_S), MK(SDLK_D), MK(SDLK_F), MK(SDLK_G), MK(SDLK_H), MK(SDLK_J), - MK(SDLK_K), - MK(SDLK_L), MK(SDLK_SEMICOLON), MK(SDLK_APOSTROPHE), MK(SDLK_BRACKET_RIGHT), MK(SDLK_INSERT), - MK(SDLK_LEFTSHIFT), MK(SDLK_Z), MK(SDLK_X), MK(SDLK_C), MK(SDLK_V), MK(SDLK_B), MK(SDLK_N), MK(SDLK_M), - MK(SDLK_COMMA), - MK(SDLK_PERIOD), MK(SDLK_SLASH), MK(SDLK_RIGHTALT), MK(SDLK_RIGHTSHIFT), MK(SDLK_LEFTALT), - MK(SDLK_SPACE), - MK(SDLK_DELETE), MK(SDLK_END), MK(SDLK_PAGEDOWN), - MK(SDLK_CURSORUP), MK(SDLK_CURSORLEFT), MK(SDLK_CURSORRIGHT), MK(SDLK_CURSORDOWN)}; + /* 0 */ MK(SDLK_F1), MK(SDLK_F2), MK(SDLK_F3), MK(SDLK_F4), MK(SDLK_F5), MK(SDLK_F6), MK(SDLK_F7), MK(SDLK_F8), + /* 8 */ MK(SDLK_1), MK(SDLK_2), MK(SDLK_3), MK(SDLK_4), MK(SDLK_5), MK(SDLK_6), MK(SDLK_7), MK(SDLK_8), MK(SDLK_9), + /* 17 */ MK(SDLK_0), + /* 18 */ MK(SDLK_MINUS), MK(SDLK_EQUAL), MK(SDLK_BACKSLASH), MK(SDLK_BACKSPACE), + /* 22 */ MK(SDLK_ESCAPE), MK(SDLK_Q), MK(SDLK_W), MK(SDLK_E), MK(SDLK_R), MK(SDLK_T), MK(SDLK_Y), MK(SDLK_U), MK(SDLK_I), + /* 31 */ MK(SDLK_O), + /* 32 */ MK(SDLK_P), MK(SDLK_GRAVE), MK(SDLK_BRACKET_LEFT), MK(SDLK_ENTER), + /* 36 */ MK(SDLK_LEFTCONTROL), MK(SDLK_A), MK(SDLK_S), MK(SDLK_D), MK(SDLK_F), MK(SDLK_G), MK(SDLK_H), MK(SDLK_J), + /* 44 */ MK(SDLK_K), + /* 45 */ MK(SDLK_L), MK(SDLK_SEMICOLON), MK(SDLK_APOSTROPHE), MK(SDLK_BRACKET_RIGHT), MK(SDLK_INSERT), + /* 50 */ MK(SDLK_LEFTSHIFT), MK(SDLK_Z), MK(SDLK_X), MK(SDLK_C), MK(SDLK_V), MK(SDLK_B), MK(SDLK_N), MK(SDLK_M), + /* 58 */ MK(SDLK_COMMA), + /* 59 */ MK(SDLK_PERIOD), MK(SDLK_SLASH), MK(SDLK_RIGHTALT), MK(SDLK_RIGHTSHIFT), MK(SDLK_LEFTALT), + /* 64 */ MK(SDLK_SPACE), + /* 65 */ MK(SDLK_DELETE), MK(SDLK_END), MK(SDLK_PAGEDOWN), + /* 68 */ MK(SDLK_CURSORUP), MK(SDLK_CURSORLEFT), MK(SDLK_CURSORRIGHT), MK(SDLK_CURSORDOWN)}; /** * Update the status of the Family KeyBoard. @@ -1835,10 +1835,23 @@ static ButtConfig fkbmap[0x48] = { static void UpdateFKB() { int x; + char leftShiftDown; //static char lp[0x48]; + leftShiftDown = DTestButton(&fkbmap[50]); + for (x = 0; x < 0x48; x++) { + if ( leftShiftDown && (x == 62) ) + { // Family BASIC appears to not like when both shift keys are pressed at the + // same time. Since Qt key events do not differentiate between left and right + // shift this GUI sets both left and right shift scancodes when a shift modifier + // is detected. So to avoid having the FKB see both shift keys pressed at once, + // always skip the right shift key here if the left key is already detected down. + fkbkeys[x] = 0; + continue; + } + if (DTestButton(&fkbmap[x])) { fkbkeys[x] = 1;