]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
PageUp = End option for keyboards without home/end/prtscr/numpad.
authorToni Wilen <twilen@winuae.net>
Thu, 31 Jul 2025 17:53:48 +0000 (20:53 +0300)
committerToni Wilen <twilen@winuae.net>
Thu, 31 Jul 2025 17:53:48 +0000 (20:53 +0300)
include/inputdevice.h
od-win32/dinput.cpp
od-win32/keyboard_win32.cpp
od-win32/resources/resource.h
od-win32/resources/winuae.rc
od-win32/win32.cpp
od-win32/win32gui.cpp

index 71ad37c6d2f4fffd00ce9180700986c37bf3cd0d..6c7e189660c92e011a9a9fafd5cc3e746817db8a 100644 (file)
@@ -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 */
index ee3313830abcfaf9ec4906bbe0c01e43621c07cc..f58a1b33e1264dbc3a59fe506037a372fd5e3a72 100644 (file)
@@ -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)
index 7da9ece04ecb774c41fbf2a0d89856019fa969a0..94efed9893b49a1b61cfce2bf21a804739a267c6 100644 (file)
@@ -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 },
index 67cfd9679af0e18b9b13525001f49f4397718fa4..c14e5fbcbaaf46d8fc8744039ff1a0e3a57812fe 100644 (file)
 #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
index 493533dcc522e0a54fc64263086215fd95363f7b..8ffac19a8d2531e2f3d023970ed1b15103f6441e 100644 (file)
@@ -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
index 934ac69bfcfb8e6f0fac2bcf39773f2a41b4e347..724dc77df046ea73f4ddbcd359a7c4b16b494161 100644 (file)
@@ -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);
index 2f9e2b8c2463cfd75553c2165c4adcdaf2be2afa..0b97793f34539ed2c2c0c70cddd2961b7d330897 100644 (file)
@@ -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);