From 768a3aaa7f898bb82b4b42530de542e8fe508017 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 29 Sep 2021 12:55:20 +0200 Subject: [PATCH] #117 add hotkey settings to .ini --- inc/dd.h | 9 +++++++++ src/config.c | 41 ++++++++++++++++++++++++++++++++++++++--- src/wndproc.c | 27 +++++++++++++++++++-------- 3 files changed, 66 insertions(+), 11 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index 28a7f1b..4afc477 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -104,6 +104,15 @@ typedef struct CNCDDRAW RECT rc; } mouse; + struct + { + int toggle_fullscreen; + int toggle_maximize; + int unlock_cursor1; + int unlock_cursor2; + int screenshot; + } hotkeys; + HWND hwnd; WNDPROC wndproc; struct { DWORD x; DWORD y; } cursor; diff --git a/src/config.c b/src/config.c index f53e418..b5b4713 100644 --- a/src/config.c +++ b/src/config.c @@ -51,6 +51,12 @@ void cfg_load() g_ddraw->armadahack = cfg_get_bool("armadahack", FALSE); g_ddraw->tshack = cfg_get_bool("tshack", FALSE); + g_ddraw->hotkeys.toggle_fullscreen = cfg_get_int("keytogglefullscreen", VK_RETURN); + g_ddraw->hotkeys.toggle_maximize = cfg_get_int("keytogglemaximize", VK_NEXT); + g_ddraw->hotkeys.unlock_cursor1 = cfg_get_int("keyunlockcursor1", VK_TAB); + g_ddraw->hotkeys.unlock_cursor2 = cfg_get_int("keyunlockcursor2", VK_RCONTROL); + g_ddraw->hotkeys.screenshot = cfg_get_int("keyscreenshot", VK_SNAPSHOT); + g_config.window_rect.right = cfg_get_int("width", 0); g_config.window_rect.bottom = cfg_get_int("height", 0); g_config.window_rect.left = cfg_get_int("posX", -32000); @@ -328,6 +334,28 @@ static void cfg_create_ini() "\n" "\n" "\n" + "; ### Hotkeys ###\n" + "; Use the following settings to configure your hotkeys, 0x00 = disabled\n" + "; Virtual-Key Codes: https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes\n" + "\n" + "\n" + "; Toggle fullscreen - Alt + ???\n" + "keytogglefullscreen=0x0D\n" + "\n" + "; Toggle maximize - Alt + ???\n" + "keytogglemaximize=0x22\n" + "\n" + "; Unlock Cursor 1 - Ctrl + ???\n" + "keyunlockcursor1=0x09\n" + "\n" + "; Unlock Cursor 2 - RightAlt + ???\n" + "keyunlockcursor2=0xA3\n" + "\n" + "; Screenshot\n" + "keyscreenshot=0x2C\n" + "\n" + "\n" + "\n" "; ### Game specific settings ###\n" "; The following settings override all settings shown above, section name = executable name\n" "\n" @@ -996,11 +1024,18 @@ BOOL cfg_get_bool(LPCSTR key, BOOL default_value) int cfg_get_int(LPCSTR key, int default_value) { - char def_value[16]; + char def_value[20]; _snprintf(def_value, sizeof(def_value), "%d", default_value); - char value[16]; + char value[20]; cfg_get_string(key, def_value, value, sizeof(value)); - return atoi(value); + if (strstr(value, "0x")) + { + return (int)strtol(value, NULL, 0); + } + else + { + return atoi(value); + } } diff --git a/src/wndproc.c b/src/wndproc.c index b03ddd5..230d050 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -579,13 +579,22 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam BOOL context_code = (lParam & (1 << 29)) != 0; BOOL key_state = (lParam & (1 << 30)) != 0; - if (wParam == VK_RETURN && !g_ddraw->fullscreen && context_code && !key_state) + if (g_ddraw->hotkeys.toggle_fullscreen && + wParam == g_ddraw->hotkeys.toggle_fullscreen && + !g_ddraw->fullscreen && + context_code && + !key_state) { util_toggle_fullscreen(); return 0; } - if (wParam == VK_NEXT && g_ddraw->resizable && !g_ddraw->border && g_ddraw->windowed && !g_ddraw->fullscreen) + if (g_ddraw->hotkeys.toggle_maximize && + wParam == g_ddraw->hotkeys.toggle_maximize && + g_ddraw->resizable && + !g_ddraw->border && + g_ddraw->windowed && + !g_ddraw->fullscreen) { util_toggle_maximize(); return 0; @@ -605,7 +614,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam g_ddraw->alt_key_down = FALSE; } - if (wParam == VK_TAB || wParam == VK_RETURN) + if (wParam == VK_TAB || (g_ddraw->hotkeys.toggle_fullscreen && wParam == g_ddraw->hotkeys.toggle_fullscreen)) { return DefWindowProc(hWnd, uMsg, wParam, lParam); } @@ -614,18 +623,20 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_KEYDOWN: { - if (wParam == VK_CONTROL || wParam == VK_TAB) + if (g_ddraw->hotkeys.unlock_cursor1 && + (wParam == VK_CONTROL || wParam == g_ddraw->hotkeys.unlock_cursor1)) { - if (GetAsyncKeyState(VK_CONTROL) & 0x8000 && GetAsyncKeyState(VK_TAB) & 0x8000) + if (GetAsyncKeyState(VK_CONTROL) & 0x8000 && GetAsyncKeyState(g_ddraw->hotkeys.unlock_cursor1) & 0x8000) { mouse_unlock(); return 0; } } - if (wParam == VK_CONTROL || wParam == VK_MENU) + if (g_ddraw->hotkeys.unlock_cursor2 && + (wParam == g_ddraw->hotkeys.unlock_cursor2 || wParam == VK_MENU || wParam == VK_CONTROL)) { - if ((GetAsyncKeyState(VK_RMENU) & 0x8000) && GetAsyncKeyState(VK_RCONTROL) & 0x8000) + if ((GetAsyncKeyState(VK_RMENU) & 0x8000) && GetAsyncKeyState(g_ddraw->hotkeys.unlock_cursor2) & 0x8000) { mouse_unlock(); return 0; @@ -636,7 +647,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_KEYUP: { - if (wParam == VK_SNAPSHOT) + if (g_ddraw->hotkeys.screenshot && wParam == g_ddraw->hotkeys.screenshot) ss_take_screenshot(g_ddraw->primary); break;