From c91c249d1a945e2b9d080505356e906bbc3bfdfa Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Thu, 31 Jul 2025 20:53:48 +0300 Subject: [PATCH] PageUp = End option for keyboards without home/end/prtscr/numpad. --- include/inputdevice.h | 2 +- od-win32/dinput.cpp | 85 ++++++++++++++++++++++++++++++++++- od-win32/keyboard_win32.cpp | 4 +- od-win32/resources/resource.h | 1 + od-win32/resources/winuae.rc | 1 + od-win32/win32.cpp | 1 + od-win32/win32gui.cpp | 11 ++++- 7 files changed, 100 insertions(+), 5 deletions(-) diff --git a/include/inputdevice.h b/include/inputdevice.h index 71ad37c6..6c7e1896 100644 --- a/include/inputdevice.h +++ b/include/inputdevice.h @@ -391,6 +391,6 @@ bool osk_status(void); void inputdevice_draco_key(int kc); -extern int key_swap_hack, key_swap_hack2; +extern int key_swap_hack, key_swap_hack2, key_swap_end_pgup; #endif /* UAE_INPUTDEVICE_H */ diff --git a/od-win32/dinput.cpp b/od-win32/dinput.cpp index ee331383..f58a1b33 100644 --- a/od-win32/dinput.cpp +++ b/od-win32/dinput.cpp @@ -19,6 +19,7 @@ int no_directinput = 0; int no_windowsmouse = 0; int winekeyboard = 0; int key_swap_hack = 0; +int key_swap_end_pgup = 0; #define _WIN32_WINNT 0x501 /* enable RAWINPUT support */ @@ -2116,7 +2117,7 @@ static void initialize_windowsmouse (void) static uae_u8 rawkeystate[256]; static int rawprevkey; -static int key_lshift, key_lwin; +static int key_lshift, key_lwin, key_pgup; static void sendscancode(int num, int scancode, int pressed) { @@ -2152,6 +2153,80 @@ static void sendscancode(int num, int scancode, int pressed) } } +static int key_swap_end(int num, int scancode, int pressed, bool *repress) +{ + if (key_pgup) { + int sc = scancode; + switch (scancode) { + case DIK_PRIOR: + scancode = DIK_END; + key_pgup = pressed; + return scancode; + case DIK_NEXT: // PGUP -> PGDN (Freeze button) + scancode = DIK_PRIOR; + break; + // numpad emulation + case DIK_7: + scancode = DIK_F14; + break; + case DIK_8: + scancode = DIK_F15; + break; + case DIK_9: + scancode = DIK_DIVIDE; + break; + case DIK_0: + scancode = DIK_MULTIPLY; + break; + case DIK_U: + scancode = DIK_NUMPAD7; + break; + case DIK_I: + scancode = DIK_NUMPAD8; + break; + case DIK_O: + scancode = DIK_NUMPAD9; + break; + case DIK_P: + scancode = DIK_SUBTRACT; + break; + case DIK_J: + scancode = DIK_NUMPAD1; + break; + case DIK_K: + scancode = DIK_NUMPAD2; + break; + case DIK_L: + scancode = DIK_NUMPAD3; + break; + case DIK_SEMICOLON: + scancode = DIK_NUMPADENTER; + break; + case DIK_M: + scancode = DIK_NUMPAD0; + break; + case DIK_COMMA: + scancode = DIK_DECIMAL; + break; + case DIK_PERIOD: + scancode = DIK_NUMPADENTER; + break; + } + if (sc != scancode) { + sendscancode(num, DIK_END, 0); + *repress = true; + } + } else { + if (scancode == DIK_END) { + scancode = DIK_PRIOR; + } else if (scancode == DIK_PRIOR) { + scancode = DIK_END; + key_pgup = pressed; + } + } + return scancode; +} + static void handle_rawinput_2 (RAWINPUT *raw, LPARAM lParam) { int i, num; @@ -2603,6 +2678,10 @@ static void handle_rawinput_2 (RAWINPUT *raw, LPARAM lParam) if (!pressed) return; #endif + bool key_endswap_repress = false; + if (key_swap_end_pgup) { + scancode = key_swap_end(num, scancode, pressed, &key_endswap_repress); + } // quick hack to support copilot+ key as right amiga key bool key_lx_repress = false; if (scancode == DIK_LWIN) { @@ -2689,6 +2768,9 @@ static void handle_rawinput_2 (RAWINPUT *raw, LPARAM lParam) sendscancode(num, DIK_LSHIFT, 1); } } + if (key_endswap_repress) { + sendscancode(num, DIK_END, 1); + } } } } @@ -3815,6 +3897,7 @@ void release_keys(void) memset (rawkeystate, 0, sizeof rawkeystate); rawprevkey = -1; key_lwin = key_lshift = 0; + key_pgup = 0; } static void flushmsgpump (void) diff --git a/od-win32/keyboard_win32.cpp b/od-win32/keyboard_win32.cpp index 7da9ece0..94efed98 100644 --- a/od-win32/keyboard_win32.cpp +++ b/od-win32/keyboard_win32.cpp @@ -141,8 +141,8 @@ static struct uae_input_device_kbr_default keytrans_amiga[] = { { DIK_UP, INPUTEVENT_KEY_CURSOR_UP }, { DIK_DOWN, INPUTEVENT_KEY_CURSOR_DOWN }, - { DIK_LEFT, INPUTEVENT_KEY_CURSOR_LEFT }, - { DIK_RIGHT, INPUTEVENT_KEY_CURSOR_RIGHT }, + { DIK_LEFT, INPUTEVENT_KEY_CURSOR_LEFT, 0, INPUTEVENT_SPC_PAUSE, ID_FLAG_QUALIFIER_SPECIAL }, + { DIK_RIGHT, INPUTEVENT_KEY_CURSOR_RIGHT, 0, INPUTEVENT_SPC_WARP, ID_FLAG_QUALIFIER_SPECIAL }, { DIK_INSERT, INPUTEVENT_KEY_AMIGA_LEFT, 0, INPUTEVENT_SPC_PASTE, ID_FLAG_QUALIFIER_SPECIAL }, { DIK_DELETE, INPUTEVENT_KEY_DEL }, diff --git a/od-win32/resources/resource.h b/od-win32/resources/resource.h index 67cfd967..c14e5fbc 100644 --- a/od-win32/resources/resource.h +++ b/od-win32/resources/resource.h @@ -1362,6 +1362,7 @@ #define IDC_KEYBOARD_SWAPHACK 1865 #define IDC_SCSIROM24BITDMA 1866 #define IDC_CUSTOMDATAPATH 1866 +#define IDC_KEYBOARD_ENDHACK 1866 #define IDC_SER_RTSCTSDTRDTECD 1867 #define IDC_SER_RI 1868 #define ID__FLOPPYDRIVES 40004 diff --git a/od-win32/resources/winuae.rc b/od-win32/resources/winuae.rc index 493533dc..8ffac19a 100644 --- a/od-win32/resources/winuae.rc +++ b/od-win32/resources/winuae.rc @@ -936,6 +936,7 @@ BEGIN COMBOBOX IDC_INPUTCOPYFROM,324,285,70,150,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "Swap 1<>2",IDC_INPUTSWAP,324,302,70,14 CONTROL "Swap Backslash/F11",IDC_KEYBOARD_SWAPHACK,"Button",BS_AUTO3STATE | WS_TABSTOP,209,302,87,10 + CONTROL "Page Up = End",IDC_KEYBOARD_ENDHACK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,111,302,87,10 END IDD_FILTER DIALOGEX 0, 0, 396, 316 diff --git a/od-win32/win32.cpp b/od-win32/win32.cpp index 934ac69b..724dc77d 100644 --- a/od-win32/win32.cpp +++ b/od-win32/win32.cpp @@ -5961,6 +5961,7 @@ static void WIN32_HandleRegistryStuff (void) quickstart = 1; regqueryint(NULL, _T("KeySwapBackslashF11"), &key_swap_hack); + regqueryint(NULL, _T("KeyEndPageUp"), &key_swap_end_pgup); tmp[0] = 0; size = sizeof(tmp) / sizeof(TCHAR); diff --git a/od-win32/win32gui.cpp b/od-win32/win32gui.cpp index 2f9e2b8c..0b97793f 100644 --- a/od-win32/win32gui.cpp +++ b/od-win32/win32gui.cpp @@ -6819,6 +6819,7 @@ static void resetregistry (void) regdelete(NULL, _T("ArtImageCount")); regdelete(NULL, _T("ArtImageWidth")); regdelete(NULL, _T("KeySwapBackslashF11")); + regdelete(NULL, _T("KeyEndPageUp")); } #include "zip.h" @@ -18607,7 +18608,8 @@ static void values_to_inputdlg (HWND hDlg) SetDlgItemInt (hDlg, IDC_INPUTAUTOFIRERATE, workprefs.input_autofire_linecnt, FALSE); SetDlgItemInt (hDlg, IDC_INPUTSPEEDD, workprefs.input_joymouse_speed, FALSE); SetDlgItemInt (hDlg, IDC_INPUTSPEEDA, workprefs.input_joymouse_multiplier, FALSE); - CheckDlgButton (hDlg, IDC_INPUTDEVICEDISABLE, (!input_total_devices || inputdevice_get_device_status (input_selected_device)) ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hDlg, IDC_INPUTDEVICEDISABLE, (!input_total_devices || inputdevice_get_device_status(input_selected_device)) ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hDlg, IDC_KEYBOARD_ENDHACK, key_swap_end_pgup ? BST_CHECKED : BST_UNCHECKED); if (key_swap_hack == 2) { CheckDlgButton(hDlg, IDC_KEYBOARD_SWAPHACK, BST_INDETERMINATE); } else { @@ -20192,6 +20194,13 @@ static INT_PTR CALLBACK InputDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM case IDC_INPUTDEVICEDISABLE: inputdevice_set_device_status (input_selected_device, ischecked (hDlg, IDC_INPUTDEVICEDISABLE)); break; + case IDC_KEYBOARD_ENDHACK: + { + key_swap_end_pgup = IsDlgButtonChecked(hDlg, IDC_KEYBOARD_ENDHACK); + regsetint(NULL, _T("KeyEndPageUp"), key_swap_end_pgup); + values_to_inputdlg(hDlg); + } + break; case IDC_KEYBOARD_SWAPHACK: { int v = IsDlgButtonChecked(hDlg, IDC_KEYBOARD_SWAPHACK); -- 2.47.3