From ad1b12653905ab515ccdfc00e430131320cadef1 Mon Sep 17 00:00:00 2001 From: Alexey 'Cluster' Avdyukhin Date: Tue, 8 Jun 2021 01:36:45 +0300 Subject: [PATCH] Ability to map 'win' keys, binding dialog fix --- src/drivers/win/input.cpp | 46 ++++++++++++++++++++++++++++++++++++--- src/drivers/win/input.h | 3 +++ src/drivers/win/keyscan.h | 5 ++++- 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/src/drivers/win/input.cpp b/src/drivers/win/input.cpp index 652e8d28..576c0d8b 100644 --- a/src/drivers/win/input.cpp +++ b/src/drivers/win/input.cpp @@ -278,6 +278,16 @@ int DTestButton(ButtConfig *bc) else if ((cmdmask != SCAN_LEFTSHIFT && keys_data[SCAN_LEFTSHIFT]) || (cmdmask != SCAN_RIGHTSHIFT && keys_data[SCAN_RIGHTSHIFT])) continue; + if (cmd & CMD_KEY_WIN) + { + int ctlstate = (cmd & CMD_KEY_LWIN) ? keys_data[SCAN_LEFTWIN] : 0; + ctlstate |= (cmd & CMD_KEY_RWIN) ? keys_data[SCAN_RIGHTWIN] : 0; + if (!ctlstate) + continue; + } + else if ((cmdmask != SCAN_LEFTWIN && keys_data[SCAN_LEFTWIN]) || (cmdmask != SCAN_RIGHTWIN && keys_data[SCAN_RIGHTWIN])) + continue; + if(keys_data[cmdmask]) { return 1; @@ -960,7 +970,7 @@ static char *MakeButtString(ButtConfig *bc, int appendKB = 1) { if (appendKB) strcat(tmpstr,"KB: "); - + if ((bc->ButtonNum[x] & CMD_KEY_CTRL) == CMD_KEY_CTRL) { strcat(tmpstr, "Ctrl + "); @@ -1000,6 +1010,19 @@ static char *MakeButtString(ButtConfig *bc, int appendKB = 1) strcat(tmpstr, "Right Shift + "); } + if ((bc->ButtonNum[x] & CMD_KEY_WIN) == CMD_KEY_WIN) + { + strcat(tmpstr, "Win + "); + } + else if ((bc->ButtonNum[x] & CMD_KEY_WIN) == CMD_KEY_LWIN) + { + strcat(tmpstr, "Left Win + "); + } + else if ((bc->ButtonNum[x] & CMD_KEY_WIN) == CMD_KEY_RWIN) + { + strcat(tmpstr, "Right Win + "); + } + if(!GetKeyNameText(((bc->ButtonNum[x] & 0x7F) << 16) | ((bc->ButtonNum[x] & 0x80) << 17), tmpstr+strlen(tmpstr), 16)) { // GetKeyNameText wasn't able to provide a name for the key, then just show scancode @@ -1106,6 +1129,10 @@ static int GetKeyMeta(int key) case SCAN_RIGHTSHIFT: return CMD_KEY_SHIFT | meta; + case SCAN_LEFTWIN: + case SCAN_RIGHTWIN: + return CMD_KEY_WIN | meta; + default: break; } @@ -1140,6 +1167,7 @@ static void ClearExtraMeta(int* key) static int DWBStarted; static ButtConfig *DWBButtons; static const uint8 *DWBText; +static uint8 DWBFirstPress; static HWND die; @@ -1158,10 +1186,15 @@ static INT_PTR CALLBACK DWBCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM GUID guid; ButtConfig *bc = DWBButtons; char *nstr; - int wc = bc->NumC; if(DoJoyWaitTest(&guid, &devicenum, &buttonnum)) { + if (DWBFirstPress) + { + bc->NumC = 0; + DWBFirstPress = 0; + } + int wc = bc->NumC; bc->ButtType[wc]=BUTTC_JOYSTICK; bc->DeviceNum[wc]=devicenum; bc->ButtonNum[wc]=buttonnum; @@ -1191,6 +1224,12 @@ static INT_PTR CALLBACK DWBCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM { key = newkey | meta; ClearExtraMeta(&key); + if (DWBFirstPress) + { + bc->NumC = 0; + DWBFirstPress = 0; + } + int wc = bc->NumC; bc->ButtType[wc] = BUTTC_KEYBOARD; bc->DeviceNum[wc] = 0; bc->ButtonNum[wc] = key; @@ -1208,6 +1247,7 @@ static INT_PTR CALLBACK DWBCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM } else if (NothingPressed() && key) { + int wc = bc->NumC; bc->ButtType[wc] = BUTTC_KEYBOARD; bc->DeviceNum[wc] = 0; bc->ButtonNum[wc] = key; @@ -1235,6 +1275,7 @@ static INT_PTR CALLBACK DWBCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM case WM_INITDIALOG: key = 0; + DWBFirstPress = 1; memset(keyonce, 0, sizeof(keyonce)); SetWindowText(hwndDlg, (char*)DWBText); //mbg merge 7/17/06 added cast BeginJoyWait(hwndDlg); @@ -1246,7 +1287,6 @@ static INT_PTR CALLBACK DWBCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM SetDlgItemText(hwndDlg, LBL_DWBDIALOG_TEXT, nstr); free(nstr); } - DWBButtons->NumC = 0; /* workaround for enter and tab keys */ SetFocus(NULL); break; diff --git a/src/drivers/win/input.h b/src/drivers/win/input.h index 8a310d12..3e115e38 100644 --- a/src/drivers/win/input.h +++ b/src/drivers/win/input.h @@ -13,6 +13,9 @@ #define CMD_KEY_LALT (1<<20) #define CMD_KEY_RALT (1<<21) #define CMD_KEY_ALT (CMD_KEY_LALT|CMD_KEY_RALT) +#define CMD_KEY_LWIN (1<<22) +#define CMD_KEY_RWIN (1<<23) +#define CMD_KEY_WIN (CMD_KEY_LWIN|CMD_KEY_RWIN) void ConfigInput(HWND hParent); int InitDInput(void); diff --git a/src/drivers/win/keyscan.h b/src/drivers/win/keyscan.h index 14c1f987..2c5a8322 100644 --- a/src/drivers/win/keyscan.h +++ b/src/drivers/win/keyscan.h @@ -124,6 +124,9 @@ #define SCAN_F10 0x44 #define SCAN_F11 0x57 #define SCAN_F12 0x58 - + +#define SCAN_LEFTWIN 0xDB +#define SCAN_RIGHTWIN 0xDC + #define MKK(k) SCAN_##k #define MKK_COUNT (256)