From 77952291b8d1045bc578055c64e55b17e632145f Mon Sep 17 00:00:00 2001 From: xLuigiGamerx <88401287+xLuigiGamerx@users.noreply.github.com> Date: Mon, 24 Nov 2025 02:55:38 +0300 Subject: [PATCH] More Peachy reviews + added dxgi gKeyboard support --- src/pc/controller/controller_keyboard.c | 12 +- src/pc/controller/controller_keyboard.h | 6 +- src/pc/fs/fs.c | 59 +++++ src/pc/fs/fs.h | 1 + src/pc/gfx/gfx_dxgi.cpp | 289 +++++++++++++++++++++++- src/pc/gfx/gfx_dxgi.h | 252 +++++++++++++++++++++ src/pc/lua/smlua_cobject.c | 6 +- src/pc/lua/utils/smlua_input_utils.c | 69 +----- src/pc/lua/utils/smlua_input_utils.h | 4 - src/pc/mods/mod_import.c | 143 ++---------- src/pc/network/network.c | 2 - 11 files changed, 622 insertions(+), 221 deletions(-) diff --git a/src/pc/controller/controller_keyboard.c b/src/pc/controller/controller_keyboard.c index 5ce251f89..cabbd437c 100644 --- a/src/pc/controller/controller_keyboard.c +++ b/src/pc/controller/controller_keyboard.c @@ -18,9 +18,7 @@ static int keyboard_buttons_down; -#if defined(CAPI_SDL1) || defined(CAPI_SDL2) -bool kb_keys_curr_down[SDL_NUM_SCANCODES]; -#endif +bool kb_keys_curr_down[512]; #define MAX_KEYBINDS 64 static int keyboard_mapping[MAX_KEYBINDS][2]; @@ -65,13 +63,11 @@ bool keyboard_on_key_up(int scancode) { void keyboard_on_all_keys_up(void) { keyboard_buttons_down = 0; -#if defined(CAPI_SDL1) || defined(CAPI_SDL2) - for (int scancode = 0; scancode < SDL_NUM_SCANCODES; ++scancode) { + for (int scancode = 0; scancode < 512; ++scancode) { gKeyboard[scancode].down = false; gKeyboard[scancode].pressed = false; gKeyboard[scancode].released = false; } -#endif } void keyboard_on_text_input(char* text) { @@ -124,8 +120,7 @@ static void keyboard_init(void) { static void keyboard_read(OSContPad *pad) { -#if defined(CAPI_SDL1) || defined(CAPI_SDL2) - for (int scancode = 0; scancode < SDL_NUM_SCANCODES; ++scancode) { + for (int scancode = 0; scancode < 512; ++scancode) { bool prev = gKeyboard[scancode].down; bool curr = kb_keys_curr_down[scancode]; @@ -133,7 +128,6 @@ static void keyboard_read(OSContPad *pad) { gKeyboard[scancode].pressed = (!prev && curr); gKeyboard[scancode].released = (prev && !curr); } -#endif pad->button |= keyboard_buttons_down; const u32 xstick = keyboard_buttons_down & STICK_XMASK; diff --git a/src/pc/controller/controller_keyboard.h b/src/pc/controller/controller_keyboard.h index f0be796b3..25ba4c9d1 100644 --- a/src/pc/controller/controller_keyboard.h +++ b/src/pc/controller/controller_keyboard.h @@ -4,7 +4,7 @@ #include #include "controller_api.h" -# define VK_BASE_KEYBOARD 0x0000 +#define VK_BASE_KEYBOARD 0x0000 #define SCANCODE_ESCAPE 1 #define SCANCODE_BACKSPACE 14 @@ -44,9 +44,7 @@ void keyboard_on_all_keys_up(void); void keyboard_on_text_input(char* text); void keyboard_on_text_editing(char* text, int cursorPos); -#if defined(CAPI_SDL1) || defined(CAPI_SDL2) -extern bool kb_keys_curr_down[SDL_NUM_SCANCODES]; -#endif +extern bool kb_keys_curr_down[512]; #ifdef __cplusplus } diff --git a/src/pc/fs/fs.c b/src/pc/fs/fs.c index 0b4b5849d..6237f3fa5 100644 --- a/src/pc/fs/fs.c +++ b/src/pc/fs/fs.c @@ -292,6 +292,65 @@ bool fs_sys_filename_is_portable(char const *filename) { /* these operate on the real file system */ +static bool concat_path(char* destination, char* path, char* fname) { + return (snprintf(destination, SYS_MAX_PATH - 1, "%s/%s", path, fname) >= 0); +} + +static char* path_basename(char* path) { + char* base = path; + while (*path != '\0') { + if (*(path + 1) != '\0') { + if (*path == '\\' || *path == '/') { + base = path + 1; + } + } + path++; + } + return base; +} + +bool fs_sys_copy_file(char* src, const char* dir) { + const char* directory = fs_get_write_path(dir); + fs_sys_mkdir(directory); + + char dst[SYS_MAX_PATH] = { 0 }; + if (!concat_path(dst, (char*)directory, path_basename(src))) { + return false; + } + + FILE* fin = fopen(src, "rb"); + if (fin == NULL) { + return false; + } + + FILE* fout = fopen(dst, "wb"); + if (fout == NULL) { + fclose(fin); + return false; + } + + size_t rbytes; + size_t wbytes; + unsigned char buff[8192]; + do { + rbytes = fread(buff, 1, sizeof(buff), fin); + if (rbytes > 0) { + wbytes = fwrite(buff, 1, rbytes, fout); + } else { + wbytes = 0; + } + } while ((rbytes > 0) && (rbytes == wbytes)); + + fclose(fout); + fclose(fin); + + if (wbytes) { + return false; + } + + return true; +} + bool fs_sys_path_exists(const char *name) { #ifdef _WIN32 return GetFileAttributesA(name) != INVALID_FILE_ATTRIBUTES; diff --git a/src/pc/fs/fs.h b/src/pc/fs/fs.h index a5b9d06ba..e19c3f2a4 100644 --- a/src/pc/fs/fs.h +++ b/src/pc/fs/fs.h @@ -102,6 +102,7 @@ bool fs_sys_filename_is_portable(char const *filename); /* these operate on the real filesystem and are used by fs_packtype_dir */ bool fs_sys_walk(const char *base, walk_fn_t walk, void *user, const bool recur); +bool fs_sys_copy_file(char* src, const char* dir); bool fs_sys_path_exists(const char *name); bool fs_sys_file_exists(const char *name); bool fs_sys_dir_exists(const char *name); diff --git a/src/pc/gfx/gfx_dxgi.cpp b/src/pc/gfx/gfx_dxgi.cpp index e0b5887d1..27ab8fe37 100644 --- a/src/pc/gfx/gfx_dxgi.cpp +++ b/src/pc/gfx/gfx_dxgi.cpp @@ -30,6 +30,7 @@ extern "C" { #include "pc/network/version.h" #include "pc/configfile.h" #include "pc/lua/smlua.h" + #include "pc/controller/controller_keyboard.h" } #include "pc/pc_main.h" @@ -230,6 +231,260 @@ static void update_screen_settings(void) { } } +// Maps dxgi scancodes to sdl2 scancodes, left scancodes are non-extended keys and right ones are extended keys +static const DXGI_Scancode dxgi_scancodes[256][2] = { + /* Non-Extended | Extended */ + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_UNKNOWN }, // 0x00 + { DXGI_SCANCODE_ESCAPE, DXGI_SCANCODE_UNKNOWN }, // 0x01 + { DXGI_SCANCODE_1, DXGI_SCANCODE_UNKNOWN }, // 0x02 + { DXGI_SCANCODE_2, DXGI_SCANCODE_UNKNOWN }, // 0x03 + { DXGI_SCANCODE_3, DXGI_SCANCODE_UNKNOWN }, // 0x04 + { DXGI_SCANCODE_4, DXGI_SCANCODE_UNKNOWN }, // 0x05 + { DXGI_SCANCODE_5, DXGI_SCANCODE_UNKNOWN }, // 0x06 + { DXGI_SCANCODE_6, DXGI_SCANCODE_UNKNOWN }, // 0x07 + { DXGI_SCANCODE_7, DXGI_SCANCODE_UNKNOWN }, // 0x08 + { DXGI_SCANCODE_8, DXGI_SCANCODE_UNKNOWN }, // 0x09 + { DXGI_SCANCODE_9, DXGI_SCANCODE_UNKNOWN }, // 0x0A + { DXGI_SCANCODE_0, DXGI_SCANCODE_UNKNOWN }, // 0x0B + { DXGI_SCANCODE_MINUS, DXGI_SCANCODE_UNKNOWN }, // 0x0C + { DXGI_SCANCODE_EQUALS, DXGI_SCANCODE_UNKNOWN }, // 0x0D + { DXGI_SCANCODE_BACKSPACE, DXGI_SCANCODE_UNKNOWN }, // 0x0E + { DXGI_SCANCODE_TAB, DXGI_SCANCODE_UNKNOWN }, // 0x0F + { DXGI_SCANCODE_Q, DXGI_SCANCODE_UNKNOWN }, // 0x10 + { DXGI_SCANCODE_W, DXGI_SCANCODE_UNKNOWN }, // 0x11 + { DXGI_SCANCODE_E, DXGI_SCANCODE_UNKNOWN }, // 0x12 + { DXGI_SCANCODE_R, DXGI_SCANCODE_UNKNOWN }, // 0x13 + { DXGI_SCANCODE_T, DXGI_SCANCODE_UNKNOWN }, // 0x14 + { DXGI_SCANCODE_Y, DXGI_SCANCODE_UNKNOWN }, // 0x15 + { DXGI_SCANCODE_U, DXGI_SCANCODE_UNKNOWN }, // 0x16 + { DXGI_SCANCODE_I, DXGI_SCANCODE_UNKNOWN }, // 0x17 + { DXGI_SCANCODE_O, DXGI_SCANCODE_UNKNOWN }, // 0x18 + { DXGI_SCANCODE_P, DXGI_SCANCODE_UNKNOWN }, // 0x19 + { DXGI_SCANCODE_LEFTBRACKET, DXGI_SCANCODE_UNKNOWN }, // 0x1A + { DXGI_SCANCODE_RIGHTBRACKET, DXGI_SCANCODE_UNKNOWN }, // 0x1B + { DXGI_SCANCODE_RETURN, DXGI_SCANCODE_KP_ENTER }, // 0x1C + { DXGI_SCANCODE_LCTRL, DXGI_SCANCODE_RCTRL }, // 0x1D + { DXGI_SCANCODE_A, DXGI_SCANCODE_UNKNOWN }, // 0x1E + { DXGI_SCANCODE_S, DXGI_SCANCODE_UNKNOWN }, // 0x1F + { DXGI_SCANCODE_D, DXGI_SCANCODE_UNKNOWN }, // 0x20 + { DXGI_SCANCODE_F, DXGI_SCANCODE_UNKNOWN }, // 0x21 + { DXGI_SCANCODE_G, DXGI_SCANCODE_UNKNOWN }, // 0x22 + { DXGI_SCANCODE_H, DXGI_SCANCODE_UNKNOWN }, // 0x23 + { DXGI_SCANCODE_J, DXGI_SCANCODE_UNKNOWN }, // 0x24 + { DXGI_SCANCODE_K, DXGI_SCANCODE_UNKNOWN }, // 0x25 + { DXGI_SCANCODE_L, DXGI_SCANCODE_UNKNOWN }, // 0x26 + { DXGI_SCANCODE_SEMICOLON, DXGI_SCANCODE_UNKNOWN }, // 0x27 + { DXGI_SCANCODE_APOSTROPHE, DXGI_SCANCODE_UNKNOWN }, // 0x28 + { DXGI_SCANCODE_GRAVE, DXGI_SCANCODE_UNKNOWN }, // 0x29 + { DXGI_SCANCODE_LSHIFT, DXGI_SCANCODE_UNKNOWN }, // 0x2A + { DXGI_SCANCODE_BACKSLASH, DXGI_SCANCODE_UNKNOWN }, // 0x2B + { DXGI_SCANCODE_Z, DXGI_SCANCODE_UNKNOWN }, // 0x2C + { DXGI_SCANCODE_X, DXGI_SCANCODE_UNKNOWN }, // 0x2D + { DXGI_SCANCODE_C, DXGI_SCANCODE_UNKNOWN }, // 0x2E + { DXGI_SCANCODE_V, DXGI_SCANCODE_UNKNOWN }, // 0x2F + { DXGI_SCANCODE_B, DXGI_SCANCODE_UNKNOWN }, // 0x30 + { DXGI_SCANCODE_N, DXGI_SCANCODE_UNKNOWN }, // 0x31 + { DXGI_SCANCODE_M, DXGI_SCANCODE_UNKNOWN }, // 0x32 + { DXGI_SCANCODE_COMMA, DXGI_SCANCODE_UNKNOWN }, // 0x33 + { DXGI_SCANCODE_PERIOD, DXGI_SCANCODE_UNKNOWN }, // 0x34 + { DXGI_SCANCODE_SLASH, DXGI_SCANCODE_KP_DIVIDE }, // 0x35 + { DXGI_SCANCODE_RSHIFT, DXGI_SCANCODE_UNKNOWN }, // 0x36 + { DXGI_SCANCODE_KP_MULTIPLY, DXGI_SCANCODE_PRINTSCREEN }, // 0x37 + { DXGI_SCANCODE_LALT, DXGI_SCANCODE_RALT }, // 0x38 + { DXGI_SCANCODE_SPACE, DXGI_SCANCODE_UNKNOWN }, // 0x39 + { DXGI_SCANCODE_CAPSLOCK, DXGI_SCANCODE_UNKNOWN }, // 0x3A + { DXGI_SCANCODE_F1, DXGI_SCANCODE_UNKNOWN }, // 0x3B + { DXGI_SCANCODE_F2, DXGI_SCANCODE_UNKNOWN }, // 0x3C + { DXGI_SCANCODE_F3, DXGI_SCANCODE_UNKNOWN }, // 0x3D + { DXGI_SCANCODE_F4, DXGI_SCANCODE_UNKNOWN }, // 0x3E + { DXGI_SCANCODE_F5, DXGI_SCANCODE_UNKNOWN }, // 0x3F + { DXGI_SCANCODE_F6, DXGI_SCANCODE_UNKNOWN }, // 0x40 + { DXGI_SCANCODE_F7, DXGI_SCANCODE_UNKNOWN }, // 0x41 + { DXGI_SCANCODE_F8, DXGI_SCANCODE_UNKNOWN }, // 0x42 + { DXGI_SCANCODE_F9, DXGI_SCANCODE_UNKNOWN }, // 0x43 + { DXGI_SCANCODE_F10, DXGI_SCANCODE_UNKNOWN }, // 0x44 + { DXGI_SCANCODE_PAUSE, DXGI_SCANCODE_NUMLOCKCLEAR }, // 0x45 + { DXGI_SCANCODE_SCROLLLOCK, DXGI_SCANCODE_UNKNOWN }, // 0x46 + { DXGI_SCANCODE_KP_7, DXGI_SCANCODE_HOME }, // 0x47 + { DXGI_SCANCODE_KP_8, DXGI_SCANCODE_UP }, // 0x48 + { DXGI_SCANCODE_KP_9, DXGI_SCANCODE_PAGEUP }, // 0x49 + { DXGI_SCANCODE_KP_MINUS, DXGI_SCANCODE_UNKNOWN }, // 0x4A + { DXGI_SCANCODE_KP_4, DXGI_SCANCODE_LEFT }, // 0x4B + { DXGI_SCANCODE_KP_5, DXGI_SCANCODE_UNKNOWN }, // 0x4C + { DXGI_SCANCODE_KP_6, DXGI_SCANCODE_RIGHT }, // 0x4D + { DXGI_SCANCODE_KP_PLUS, DXGI_SCANCODE_UNKNOWN }, // 0x4E + { DXGI_SCANCODE_KP_1, DXGI_SCANCODE_END }, // 0x4F + { DXGI_SCANCODE_KP_2, DXGI_SCANCODE_DOWN }, // 0x50 + { DXGI_SCANCODE_KP_3, DXGI_SCANCODE_PAGEDOWN }, // 0x51 + { DXGI_SCANCODE_KP_0, DXGI_SCANCODE_INSERT }, // 0x52 + { DXGI_SCANCODE_KP_PERIOD, DXGI_SCANCODE_DELETE }, // 0x53 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_UNKNOWN }, // 0x54 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_UNKNOWN }, // 0x55 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_UNKNOWN }, // 0x56 + { DXGI_SCANCODE_F11, DXGI_SCANCODE_UNKNOWN }, // 0x57 + { DXGI_SCANCODE_F12, DXGI_SCANCODE_UNKNOWN }, // 0x58 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_UNKNOWN }, // 0x59 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_UNKNOWN }, // 0x5A + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_LGUI }, // 0x5B + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_RGUI }, // 0x5C + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_APPLICATION }, // 0x5D + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_F13 }, // 0x5E + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_F14 }, // 0x5F + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_F15 }, // 0x60 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_F16 }, // 0x61 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_F17 }, // 0x62 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_F18 }, // 0x63 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_F19 }, // 0x64 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_F20 }, // 0x65 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_F21 }, // 0x66 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_F22 }, // 0x67 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_F23 }, // 0x68 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_F24 }, // 0x69 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_EXECUTE }, // 0x6A + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_HELP }, // 0x6B + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_MENU }, // 0x6C + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_SELECT }, // 0x6D + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_STOP }, // 0x6E + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_AGAIN }, // 0x6F + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_UNDO }, // 0x70 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_CUT }, // 0x71 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_COPY }, // 0x72 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_PASTE }, // 0x73 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_FIND }, // 0x74 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_MUTE }, // 0x75 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_VOLUMEUP }, // 0x76 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_VOLUMEDOWN }, // 0x77 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_COMMA }, // 0x78 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_EQUALSAS400 }, // 0x79 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_INTERNATIONAL1 }, // 0x7A + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_INTERNATIONAL2 }, // 0x7B + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_INTERNATIONAL3 }, // 0x7C + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_INTERNATIONAL4 }, // 0x7D + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_INTERNATIONAL5 }, // 0x7E + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_INTERNATIONAL6 }, // 0x7F + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_INTERNATIONAL7 }, // 0x80 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_INTERNATIONAL8 }, // 0x81 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_INTERNATIONAL9 }, // 0x82 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_LANG1 }, // 0x83 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_LANG2 }, // 0x84 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_LANG3 }, // 0x85 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_LANG4 }, // 0x86 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_LANG5 }, // 0x87 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_LANG6 }, // 0x88 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_LANG7 }, // 0x89 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_LANG8 }, // 0x8A + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_LANG9 }, // 0x8B + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_ALTERASE }, // 0x8C + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_SYSREQ }, // 0x8D + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_CANCEL }, // 0x8E + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_CLEAR }, // 0x8F + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_PRIOR }, // 0x90 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_RETURN2 }, // 0x91 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_SEPARATOR }, // 0x92 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_OUT }, // 0x93 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_OPER }, // 0x94 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_CLEARAGAIN }, // 0x95 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_CRSEL }, // 0x96 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_EXSEL }, // 0x97 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_00 }, // 0x98 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_000 }, // 0x99 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_THOUSANDSSEPARATOR }, // 0x9A + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_DECIMALSEPARATOR }, // 0x9B + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_CURRENCYUNIT }, // 0x9C + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_CURRENCYSUBUNIT }, // 0x9D + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_LEFTPAREN }, // 0x9E + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_RIGHTPAREN }, // 0x9F + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_LEFTBRACE }, // 0xA0 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_RIGHTBRACE }, // 0xA1 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_TAB }, // 0xA2 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_BACKSPACE }, // 0xA3 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_A }, // 0xA4 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_B }, // 0xA5 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_C }, // 0xA6 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_D }, // 0xA7 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_E }, // 0xA8 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_F }, // 0xA9 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_XOR }, // 0xAA + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_POWER }, // 0xAB + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_PERCENT }, // 0xAC + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_LESS }, // 0xAD + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_GREATER }, // 0xAE + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_AMPERSAND }, // 0xAF + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_DBLAMPERSAND }, // 0xB0 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_VERTICALBAR }, // 0xB1 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_DBLVERTICALBAR }, // 0xB2 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_COLON }, // 0xB3 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_HASH }, // 0xB4 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_SPACE }, // 0xB5 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_AT }, // 0xB6 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_EXCLAM }, // 0xB7 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_MEMSTORE }, // 0xB8 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_MEMRECALL }, // 0xB9 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_MEMCLEAR }, // 0xBA + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_MEMADD }, // 0xBB + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_MEMSUBTRACT }, // 0xBC + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_MEMMULTIPLY }, // 0xBD + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_MEMDIVIDE }, // 0xBE + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_PLUSMINUS }, // 0xBF + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_CLEAR }, // 0xC0 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_CLEARENTRY }, // 0xC1 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_BINARY }, // 0xC2 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_OCTAL }, // 0xC3 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_DECIMAL }, // 0xC4 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KP_HEXADECIMAL }, // 0xC5 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_LCTRL }, // 0xC6 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_LSHIFT }, // 0xC7 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_LALT }, // 0xC8 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_LGUI }, // 0xC9 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_RCTRL }, // 0xCA + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_RSHIFT }, // 0xCB + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_RALT }, // 0xCC + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_RGUI }, // 0xCD + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_MODE }, // 0xCE + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_AUDIONEXT }, // 0xCF + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_AUDIOPREV }, // 0xD0 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_AUDIOSTOP }, // 0xD1 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_AUDIOPLAY }, // 0xD2 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_AUDIOMUTE }, // 0xD3 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_MEDIASELECT }, // 0xD4 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_WWW }, // 0xD5 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_MAIL }, // 0xD6 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_CALCULATOR }, // 0xD7 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_COMPUTER }, // 0xD8 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_AC_SEARCH }, // 0xD9 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_AC_HOME }, // 0xDA + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_AC_BACK }, // 0xDB + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_AC_FORWARD }, // 0xDC + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_AC_STOP }, // 0xDD + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_AC_REFRESH }, // 0xDE + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_AC_BOOKMARKS }, // 0xDF + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_BRIGHTNESSDOWN }, // 0xE0 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_BRIGHTNESSUP }, // 0xE1 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_DISPLAYSWITCH }, // 0xE2 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KBDILLUMTOGGLE }, // 0xE3 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KBDILLUMDOWN }, // 0xE4 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_KBDILLUMUP }, // 0xE5 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_EJECT }, // 0xE6 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_SLEEP }, // 0xE7 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_APP1 }, // 0xE8 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_APP2 }, // 0xE9 + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_AUDIOREWIND }, // 0xEA + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_AUDIOFASTFORWARD }, // 0xEB + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_SOFTLEFT }, // 0xEC + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_SOFTRIGHT }, // 0xED + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_CALL }, // 0xEE + { DXGI_SCANCODE_UNKNOWN, DXGI_SCANCODE_ENDCALL }, // 0xEF +}; + +static inline DXGI_Scancode dxgi_key_to_scancode(LPARAM l_param) { + uint32_t sc = (l_param >> 16) & 0xFF; + bool ext = (l_param >> 24) & 1; + + if (sc <= 0xEE) return dxgi_scancodes[sc][ext]; + + return DXGI_SCANCODE_UNKNOWN; +} + static void gfx_dxgi_on_resize(void) { if (dxgi.swap_chain.Get() != nullptr) { gfx_get_current_rendering_api()->on_resize(); @@ -247,11 +502,21 @@ static void gfx_dxgi_on_resize(void) { static void gfx_dxgi_on_key_down(WPARAM w_param, LPARAM l_param) { int key = ((l_param >> 16) & 0x1ff); - if (dxgi.on_key_down != nullptr) { dxgi.on_key_down(key); } + int scancode = dxgi_key_to_scancode(l_param); + if (dxgi.on_key_down != nullptr) { + dxgi.on_key_down(key); + kb_keys_curr_down[scancode] = true; + } } + static void gfx_dxgi_on_key_up(WPARAM w_param, LPARAM l_param) { int key = ((l_param >> 16) & 0x1ff); - if (dxgi.on_key_up != nullptr) { dxgi.on_key_up(key); } + int scancode = dxgi_key_to_scancode(l_param); + if (w_param == VK_PAUSE) scancode = DXGI_SCANCODE_PAUSE; + if (dxgi.on_key_up != nullptr) { + dxgi.on_key_up(key); + kb_keys_curr_down[scancode] = false; + } } static void gfx_dxgi_on_text_input(wchar_t code_unit) { @@ -306,10 +571,23 @@ static LRESULT CALLBACK gfx_dxgi_wnd_proc(HWND h_wnd, UINT message, WPARAM w_par } break; } + case WM_SYSKEYDOWN: { + if (w_param == VK_RETURN && !(l_param & (1 << 30))) { + toggle_borderless_window_full_screen(!dxgi.is_full_screen); + return 0; + } + + gfx_dxgi_on_key_down(w_param, l_param); + break; + } case WM_KEYDOWN: { gfx_dxgi_on_key_down(w_param, l_param); return 0; } + case WM_SYSKEYUP: { + gfx_dxgi_on_key_up(w_param, l_param); + break; + } case WM_KEYUP: { gfx_dxgi_on_key_up(w_param, l_param); return 0; @@ -323,13 +601,6 @@ static LRESULT CALLBACK gfx_dxgi_wnd_proc(HWND h_wnd, UINT message, WPARAM w_par gfx_dxgi_on_scroll(w_param); return 0; } - case WM_SYSKEYDOWN: { - if ((w_param == VK_RETURN) && ((l_param & 1 << 30) == 0)) { - toggle_borderless_window_full_screen(!dxgi.is_full_screen); - return 0; - } - break; - } case WM_LBUTTONDOWN: { if (!gRomIsValid) { OPENFILENAMEW ofn; diff --git a/src/pc/gfx/gfx_dxgi.h b/src/pc/gfx/gfx_dxgi.h index 04b9f156d..f4ca22cc6 100644 --- a/src/pc/gfx/gfx_dxgi.h +++ b/src/pc/gfx/gfx_dxgi.h @@ -13,4 +13,256 @@ void ThrowIfFailed(HRESULT res, HWND h_wnd, const char *message); extern struct GfxWindowManagerAPI gfx_dxgi; +// SDL_Scancode enum from SDL2 +typedef enum DXGI_Scancode { + DXGI_SCANCODE_UNKNOWN = 0, + DXGI_SCANCODE_A = 4, + DXGI_SCANCODE_B = 5, + DXGI_SCANCODE_C = 6, + DXGI_SCANCODE_D = 7, + DXGI_SCANCODE_E = 8, + DXGI_SCANCODE_F = 9, + DXGI_SCANCODE_G = 10, + DXGI_SCANCODE_H = 11, + DXGI_SCANCODE_I = 12, + DXGI_SCANCODE_J = 13, + DXGI_SCANCODE_K = 14, + DXGI_SCANCODE_L = 15, + DXGI_SCANCODE_M = 16, + DXGI_SCANCODE_N = 17, + DXGI_SCANCODE_O = 18, + DXGI_SCANCODE_P = 19, + DXGI_SCANCODE_Q = 20, + DXGI_SCANCODE_R = 21, + DXGI_SCANCODE_S = 22, + DXGI_SCANCODE_T = 23, + DXGI_SCANCODE_U = 24, + DXGI_SCANCODE_V = 25, + DXGI_SCANCODE_W = 26, + DXGI_SCANCODE_X = 27, + DXGI_SCANCODE_Y = 28, + DXGI_SCANCODE_Z = 29, + DXGI_SCANCODE_1 = 30, + DXGI_SCANCODE_2 = 31, + DXGI_SCANCODE_3 = 32, + DXGI_SCANCODE_4 = 33, + DXGI_SCANCODE_5 = 34, + DXGI_SCANCODE_6 = 35, + DXGI_SCANCODE_7 = 36, + DXGI_SCANCODE_8 = 37, + DXGI_SCANCODE_9 = 38, + DXGI_SCANCODE_0 = 39, + DXGI_SCANCODE_RETURN = 40, + DXGI_SCANCODE_ESCAPE = 41, + DXGI_SCANCODE_BACKSPACE = 42, + DXGI_SCANCODE_TAB = 43, + DXGI_SCANCODE_SPACE = 44, + DXGI_SCANCODE_MINUS = 45, + DXGI_SCANCODE_EQUALS = 46, + DXGI_SCANCODE_LEFTBRACKET = 47, + DXGI_SCANCODE_RIGHTBRACKET = 48, + DXGI_SCANCODE_BACKSLASH = 49, + DXGI_SCANCODE_NONUSHASH = 50, + DXGI_SCANCODE_SEMICOLON = 51, + DXGI_SCANCODE_APOSTROPHE = 52, + DXGI_SCANCODE_GRAVE = 53, + DXGI_SCANCODE_COMMA = 54, + DXGI_SCANCODE_PERIOD = 55, + DXGI_SCANCODE_SLASH = 56, + DXGI_SCANCODE_CAPSLOCK = 57, + DXGI_SCANCODE_F1 = 58, + DXGI_SCANCODE_F2 = 59, + DXGI_SCANCODE_F3 = 60, + DXGI_SCANCODE_F4 = 61, + DXGI_SCANCODE_F5 = 62, + DXGI_SCANCODE_F6 = 63, + DXGI_SCANCODE_F7 = 64, + DXGI_SCANCODE_F8 = 65, + DXGI_SCANCODE_F9 = 66, + DXGI_SCANCODE_F10 = 67, + DXGI_SCANCODE_F11 = 68, + DXGI_SCANCODE_F12 = 69, + DXGI_SCANCODE_PRINTSCREEN = 70, + DXGI_SCANCODE_SCROLLLOCK = 71, + DXGI_SCANCODE_PAUSE = 72, + DXGI_SCANCODE_INSERT = 73, + DXGI_SCANCODE_HOME = 74, + DXGI_SCANCODE_PAGEUP = 75, + DXGI_SCANCODE_DELETE = 76, + DXGI_SCANCODE_END = 77, + DXGI_SCANCODE_PAGEDOWN = 78, + DXGI_SCANCODE_RIGHT = 79, + DXGI_SCANCODE_LEFT = 80, + DXGI_SCANCODE_DOWN = 81, + DXGI_SCANCODE_UP = 82, + DXGI_SCANCODE_NUMLOCKCLEAR = 83, + DXGI_SCANCODE_KP_DIVIDE = 84, + DXGI_SCANCODE_KP_MULTIPLY = 85, + DXGI_SCANCODE_KP_MINUS = 86, + DXGI_SCANCODE_KP_PLUS = 87, + DXGI_SCANCODE_KP_ENTER = 88, + DXGI_SCANCODE_KP_1 = 89, + DXGI_SCANCODE_KP_2 = 90, + DXGI_SCANCODE_KP_3 = 91, + DXGI_SCANCODE_KP_4 = 92, + DXGI_SCANCODE_KP_5 = 93, + DXGI_SCANCODE_KP_6 = 94, + DXGI_SCANCODE_KP_7 = 95, + DXGI_SCANCODE_KP_8 = 96, + DXGI_SCANCODE_KP_9 = 97, + DXGI_SCANCODE_KP_0 = 98, + DXGI_SCANCODE_KP_PERIOD = 99, + DXGI_SCANCODE_NONUSBACKSLASH = 100, + DXGI_SCANCODE_APPLICATION = 101, + DXGI_SCANCODE_POWER = 102, + DXGI_SCANCODE_KP_EQUALS = 103, + DXGI_SCANCODE_F13 = 104, + DXGI_SCANCODE_F14 = 105, + DXGI_SCANCODE_F15 = 106, + DXGI_SCANCODE_F16 = 107, + DXGI_SCANCODE_F17 = 108, + DXGI_SCANCODE_F18 = 109, + DXGI_SCANCODE_F19 = 110, + DXGI_SCANCODE_F20 = 111, + DXGI_SCANCODE_F21 = 112, + DXGI_SCANCODE_F22 = 113, + DXGI_SCANCODE_F23 = 114, + DXGI_SCANCODE_F24 = 115, + DXGI_SCANCODE_EXECUTE = 116, + DXGI_SCANCODE_HELP = 117, + DXGI_SCANCODE_MENU = 118, + DXGI_SCANCODE_SELECT = 119, + DXGI_SCANCODE_STOP = 120, + DXGI_SCANCODE_AGAIN = 121, + DXGI_SCANCODE_UNDO = 122, + DXGI_SCANCODE_CUT = 123, + DXGI_SCANCODE_COPY = 124, + DXGI_SCANCODE_PASTE = 125, + DXGI_SCANCODE_FIND = 126, + DXGI_SCANCODE_MUTE = 127, + DXGI_SCANCODE_VOLUMEUP = 128, + DXGI_SCANCODE_VOLUMEDOWN = 129, + DXGI_SCANCODE_KP_COMMA = 133, + DXGI_SCANCODE_KP_EQUALSAS400 = 134, + DXGI_SCANCODE_INTERNATIONAL1 = 135, + DXGI_SCANCODE_INTERNATIONAL2 = 136, + DXGI_SCANCODE_INTERNATIONAL3 = 137, + DXGI_SCANCODE_INTERNATIONAL4 = 138, + DXGI_SCANCODE_INTERNATIONAL5 = 139, + DXGI_SCANCODE_INTERNATIONAL6 = 140, + DXGI_SCANCODE_INTERNATIONAL7 = 141, + DXGI_SCANCODE_INTERNATIONAL8 = 142, + DXGI_SCANCODE_INTERNATIONAL9 = 143, + DXGI_SCANCODE_LANG1 = 144, + DXGI_SCANCODE_LANG2 = 145, + DXGI_SCANCODE_LANG3 = 146, + DXGI_SCANCODE_LANG4 = 147, + DXGI_SCANCODE_LANG5 = 148, + DXGI_SCANCODE_LANG6 = 149, + DXGI_SCANCODE_LANG7 = 150, + DXGI_SCANCODE_LANG8 = 151, + DXGI_SCANCODE_LANG9 = 152, + DXGI_SCANCODE_ALTERASE = 153, + DXGI_SCANCODE_SYSREQ = 154, + DXGI_SCANCODE_CANCEL = 155, + DXGI_SCANCODE_CLEAR = 156, + DXGI_SCANCODE_PRIOR = 157, + DXGI_SCANCODE_RETURN2 = 158, + DXGI_SCANCODE_SEPARATOR = 159, + DXGI_SCANCODE_OUT = 160, + DXGI_SCANCODE_OPER = 161, + DXGI_SCANCODE_CLEARAGAIN = 162, + DXGI_SCANCODE_CRSEL = 163, + DXGI_SCANCODE_EXSEL = 164, + DXGI_SCANCODE_KP_00 = 176, + DXGI_SCANCODE_KP_000 = 177, + DXGI_SCANCODE_THOUSANDSSEPARATOR = 178, + DXGI_SCANCODE_DECIMALSEPARATOR = 179, + DXGI_SCANCODE_CURRENCYUNIT = 180, + DXGI_SCANCODE_CURRENCYSUBUNIT = 181, + DXGI_SCANCODE_KP_LEFTPAREN = 182, + DXGI_SCANCODE_KP_RIGHTPAREN = 183, + DXGI_SCANCODE_KP_LEFTBRACE = 184, + DXGI_SCANCODE_KP_RIGHTBRACE = 185, + DXGI_SCANCODE_KP_TAB = 186, + DXGI_SCANCODE_KP_BACKSPACE = 187, + DXGI_SCANCODE_KP_A = 188, + DXGI_SCANCODE_KP_B = 189, + DXGI_SCANCODE_KP_C = 190, + DXGI_SCANCODE_KP_D = 191, + DXGI_SCANCODE_KP_E = 192, + DXGI_SCANCODE_KP_F = 193, + DXGI_SCANCODE_KP_XOR = 194, + DXGI_SCANCODE_KP_POWER = 195, + DXGI_SCANCODE_KP_PERCENT = 196, + DXGI_SCANCODE_KP_LESS = 197, + DXGI_SCANCODE_KP_GREATER = 198, + DXGI_SCANCODE_KP_AMPERSAND = 199, + DXGI_SCANCODE_KP_DBLAMPERSAND = 200, + DXGI_SCANCODE_KP_VERTICALBAR = 201, + DXGI_SCANCODE_KP_DBLVERTICALBAR = 202, + DXGI_SCANCODE_KP_COLON = 203, + DXGI_SCANCODE_KP_HASH = 204, + DXGI_SCANCODE_KP_SPACE = 205, + DXGI_SCANCODE_KP_AT = 206, + DXGI_SCANCODE_KP_EXCLAM = 207, + DXGI_SCANCODE_KP_MEMSTORE = 208, + DXGI_SCANCODE_KP_MEMRECALL = 209, + DXGI_SCANCODE_KP_MEMCLEAR = 210, + DXGI_SCANCODE_KP_MEMADD = 211, + DXGI_SCANCODE_KP_MEMSUBTRACT = 212, + DXGI_SCANCODE_KP_MEMMULTIPLY = 213, + DXGI_SCANCODE_KP_MEMDIVIDE = 214, + DXGI_SCANCODE_KP_PLUSMINUS = 215, + DXGI_SCANCODE_KP_CLEAR = 216, + DXGI_SCANCODE_KP_CLEARENTRY = 217, + DXGI_SCANCODE_KP_BINARY = 218, + DXGI_SCANCODE_KP_OCTAL = 219, + DXGI_SCANCODE_KP_DECIMAL = 220, + DXGI_SCANCODE_KP_HEXADECIMAL = 221, + DXGI_SCANCODE_LCTRL = 224, + DXGI_SCANCODE_LSHIFT = 225, + DXGI_SCANCODE_LALT = 226, + DXGI_SCANCODE_LGUI = 227, + DXGI_SCANCODE_RCTRL = 228, + DXGI_SCANCODE_RSHIFT = 229, + DXGI_SCANCODE_RALT = 230, + DXGI_SCANCODE_RGUI = 231, + DXGI_SCANCODE_MODE = 257, + DXGI_SCANCODE_AUDIONEXT = 258, + DXGI_SCANCODE_AUDIOPREV = 259, + DXGI_SCANCODE_AUDIOSTOP = 260, + DXGI_SCANCODE_AUDIOPLAY = 261, + DXGI_SCANCODE_AUDIOMUTE = 262, + DXGI_SCANCODE_MEDIASELECT = 263, + DXGI_SCANCODE_WWW = 264, + DXGI_SCANCODE_MAIL = 265, + DXGI_SCANCODE_CALCULATOR = 266, + DXGI_SCANCODE_COMPUTER = 267, + DXGI_SCANCODE_AC_SEARCH = 268, + DXGI_SCANCODE_AC_HOME = 269, + DXGI_SCANCODE_AC_BACK = 270, + DXGI_SCANCODE_AC_FORWARD = 271, + DXGI_SCANCODE_AC_STOP = 272, + DXGI_SCANCODE_AC_REFRESH = 273, + DXGI_SCANCODE_AC_BOOKMARKS = 274, + DXGI_SCANCODE_BRIGHTNESSDOWN = 275, + DXGI_SCANCODE_BRIGHTNESSUP = 276, + DXGI_SCANCODE_DISPLAYSWITCH = 277, + DXGI_SCANCODE_KBDILLUMTOGGLE = 278, + DXGI_SCANCODE_KBDILLUMDOWN = 279, + DXGI_SCANCODE_KBDILLUMUP = 280, + DXGI_SCANCODE_EJECT = 281, + DXGI_SCANCODE_SLEEP = 282, + DXGI_SCANCODE_APP1 = 283, + DXGI_SCANCODE_APP2 = 284, + DXGI_SCANCODE_AUDIOREWIND = 285, + DXGI_SCANCODE_AUDIOFASTFORWARD = 286, + DXGI_SCANCODE_SOFTLEFT = 287, + DXGI_SCANCODE_SOFTRIGHT = 288, + DXGI_SCANCODE_CALL = 289, + DXGI_SCANCODE_ENDCALL = 290, + DXGI_NUM_SCANCODES = 512 +} DXGI_Scancode; + #endif diff --git a/src/pc/lua/smlua_cobject.c b/src/pc/lua/smlua_cobject.c index f5bff161f..4aaa7a907 100644 --- a/src/pc/lua/smlua_cobject.c +++ b/src/pc/lua/smlua_cobject.c @@ -14,9 +14,7 @@ #include "pc/lua/utils/smlua_anim_utils.h" #include "pc/lua/utils/smlua_collision_utils.h" #include "pc/lua/utils/smlua_obj_utils.h" -#if defined(CAPI_SDL1) || defined(CAPI_SDL2) #include "pc/lua/utils/smlua_input_utils.h" -#endif #include "pc/mods/mods.h" extern struct LuaObjectTable sLuaObjectTable[LOT_MAX]; @@ -763,11 +761,11 @@ void smlua_cobject_init_globals(void) { EXPOSE_GLOBAL_ARRAY(LOT_CHARACTER, gCharacters, CT_MAX); EXPOSE_GLOBAL_ARRAY(LOT_CONTROLLER, gControllers, MAX_PLAYERS); -#if defined(CAPI_SDL1) || defined(CAPI_SDL2) + EXPOSE_GLOBAL_ARRAY(LOT_GAMEPAD, gGamepads, MAX_GAMEPADS); EXPOSE_GLOBAL_ARRAY(LOT_KEY, gKeyboard, SDL_NUM_SCANCODES); -#endif + EXPOSE_GLOBAL_ARRAY(LOT_MAT4, gMatStack, MATRIX_STACK_SIZE); EXPOSE_GLOBAL_ARRAY(LOT_MAT4, gMatStackPrev, MATRIX_STACK_SIZE); diff --git a/src/pc/lua/utils/smlua_input_utils.c b/src/pc/lua/utils/smlua_input_utils.c index 2cd7cc1be..e3c46a877 100644 --- a/src/pc/lua/utils/smlua_input_utils.c +++ b/src/pc/lua/utils/smlua_input_utils.c @@ -1,5 +1,3 @@ -#if defined(CAPI_SDL1) || defined(CAPI_SDL2) - #include "smlua_input_utils.h" #include "engine/math_util.h" @@ -89,76 +87,17 @@ void controller_maps_load(const char* mapsPath, bool appendMaps) { char fullpath[SYS_MAX_PATH] = ""; snprintf(fullpath, SYS_MAX_PATH, "%s/%s.db", dbpath, path); - // open file - FILE* f = fopen(fullpath, "rb"); - if (!f) { + // load map + UNUSED int loadedMaps = SDL_GameControllerAddMappingsFromFile(fullpath); + #ifdef DEVELOPMENT - printf("Failed to load controller map '%s.db'\n", path); -#endif - continue; - } - - // get file size - fseek(f, 0, SEEK_END); - int64_t size = ftell(f); - fseek(f, 0, SEEK_SET); - - if (size <= 0) { -#ifdef DEVELOPMENT - printf("Controller map empty or invalid: '%s.db'\n", path); -#endif - fclose(f); - continue; - } - - void* data = malloc(size); - if (!data) { - fclose(f); - continue; - } - - if (fread(data, 1, size, f) != (size_t)size) { - free(data); - fclose(f); - continue; - } - - fclose(f); - - // SDL_RWFromConstMem uses int size - if (size > INT_MAX) { -#ifdef DEVELOPMENT - printf("Controller map too large: '%s.db'\n", path); -#endif - free(data); - continue; - } - - SDL_RWops* rw = SDL_RWFromConstMem(data, (int)size); - if (!rw) { -#ifdef DEVELOPMENT - printf("SDL_RWFromConstMem failed for '%s.db'\n", path); -#endif - free(data); - continue; - } - - // Load into SDL - int loadedMaps = SDL_GameControllerAddMappingsFromRW(rw, SDL_FALSE); - - SDL_RWclose(rw); - free(data); - if (loadedMaps >= 0) { -#ifdef DEVELOPMENT printf("Controller Database: Loaded %d controller mapping(s) from '%s.db'\n", loadedMaps, path); } else { printf("Controller Database: Failed to load controller map from '%s.db'\n", path); -#endif } +#endif } closedir(d); } - -#endif \ No newline at end of file diff --git a/src/pc/lua/utils/smlua_input_utils.h b/src/pc/lua/utils/smlua_input_utils.h index 3acf0425b..963bb77d8 100644 --- a/src/pc/lua/utils/smlua_input_utils.h +++ b/src/pc/lua/utils/smlua_input_utils.h @@ -7,8 +7,6 @@ #define MAX_GAMEPADS 256 #define MAX_TOUCHPAD_FINGERS 10 -#if defined(CAPI_SDL1) || defined(CAPI_SDL2) - #include "types.h" #include @@ -93,6 +91,4 @@ const char* get_clipboard_text(void); void set_clipboard_text(const char* text); void clear_gamepad_input_data(void); void controller_maps_load(const char* mapsPath, bool appendMaps); - -#endif #endif \ No newline at end of file diff --git a/src/pc/mods/mod_import.c b/src/pc/mods/mod_import.c index 370100ac9..c2e21e32c 100644 --- a/src/pc/mods/mod_import.c +++ b/src/pc/mods/mod_import.c @@ -11,144 +11,39 @@ #include "mods_utils.h" static bool mod_import_lua(char* src) { - char dst[SYS_MAX_PATH] = { 0 }; - if (!concat_path(dst, (char*)fs_get_write_path(MOD_DIRECTORY), path_basename(src))) { - LOG_ERROR("Failed to concat path for lua mod import"); - return false; + bool success = fs_sys_copy_file(src, MOD_DIRECTORY); + + if (!success) { + LOG_ERROR("Failed to import lua mod file"); + } else { + LOG_INFO("Imported lua mod: '%s'", src); } - FILE* fin = fopen(src, "rb"); - if (fin == NULL) { - LOG_ERROR("Failed to open src path for lua mod import"); - return false; - } - - FILE* fout = fopen(dst, "wb"); - if (fout == NULL) { - LOG_ERROR("Failed to open dst path for lua mod import"); - fclose(fin); - return false; - } - - size_t rbytes; - size_t wbytes; - unsigned char buff[8192]; - do { - rbytes = fread(buff, 1, sizeof(buff), fin); - if (rbytes > 0) { - wbytes = fwrite(buff, 1, rbytes, fout); - } else { - wbytes = 0; - } - } while ((rbytes > 0) && (rbytes == wbytes)); - - fclose(fout); - fclose(fin); - - if (wbytes) { - LOG_ERROR("Write error on lua mod import"); - return false; - } - - LOG_INFO("Imported lua mod: '%s' -> '%s'", src, dst); - - return true; + return success; } static bool mod_import_palette(char* src) { - const char* palettesDirectory = fs_get_write_path(PALETTES_DIRECTORY); - fs_sys_mkdir(palettesDirectory); + bool success = fs_sys_copy_file(src, PALETTES_DIRECTORY); - char dst[SYS_MAX_PATH] = { 0 }; - if (!concat_path(dst, (char*)palettesDirectory, path_basename(src))) { - LOG_ERROR("Failed to concat path for palette ini import"); - return false; + if (!success) { + LOG_ERROR("Failed to import palette preset file"); + } else { + LOG_INFO("Imported palette preset: '%s'", src); } - FILE* fin = fopen(src, "rb"); - if (fin == NULL) { - LOG_ERROR("Failed to open src path for palette ini import"); - return false; - } - - FILE* fout = fopen(dst, "wb"); - if (fout == NULL) { - LOG_ERROR("Failed to open dst path for palette ini import"); - fclose(fin); - return false; - } - - size_t rbytes; - size_t wbytes; - unsigned char buff[8192]; - do { - rbytes = fread(buff, 1, sizeof(buff), fin); - if (rbytes > 0) { - wbytes = fwrite(buff, 1, rbytes, fout); - } else { - wbytes = 0; - } - } while ((rbytes > 0) && (rbytes == wbytes)); - - fclose(fout); - fclose(fin); - - if (wbytes) { - LOG_ERROR("Write error on palette ini import"); - return false; - } - - LOG_INFO("Imported palette ini: '%s' -> '%s'", src, dst); - - return true; + return success; } static bool mod_import_database(char* src) { - const char* databasesDirectory = fs_get_write_path(DATABASES_DIRECTORY); - fs_sys_mkdir(databasesDirectory); + bool success = fs_sys_copy_file(src, DATABASES_DIRECTORY); - char dst[SYS_MAX_PATH] = { 0 }; - if (!concat_path(dst, (char*)databasesDirectory, path_basename(src))) { - LOG_ERROR("Failed to concat path for database db import"); - return false; + if (!success) { + LOG_ERROR("Failed to import controller database file"); + } else { + LOG_INFO("Imported controller database: '%s'", src); } - FILE* fin = fopen(src, "rb"); - if (fin == NULL) { - LOG_ERROR("Failed to open src path for database db import"); - return false; - } - - FILE* fout = fopen(dst, "wb"); - if (fout == NULL) { - LOG_ERROR("Failed to open dst path for database db import"); - fclose(fin); - return false; - } - - size_t rbytes; - size_t wbytes; - unsigned char buff[8192]; - do { - rbytes = fread(buff, 1, sizeof(buff), fin); - if (rbytes > 0) { - wbytes = fwrite(buff, 1, rbytes, fout); - } else { - wbytes = 0; - } - } while ((rbytes > 0) && (rbytes == wbytes)); - - fclose(fout); - fclose(fin); - - if (wbytes) { - LOG_ERROR("Write error on database db import"); - return false; - } - - LOG_INFO("Imported database db: '%s' -> '%s'", src, dst); - - return true; + return success; } static bool mod_import_zip(char* path, bool* isLua, bool* isDynos) { diff --git a/src/pc/network/network.c b/src/pc/network/network.c index 4791caf53..8610e292c 100644 --- a/src/pc/network/network.c +++ b/src/pc/network/network.c @@ -768,9 +768,7 @@ void network_shutdown(bool sendLeaving, bool exiting, bool popup, bool reconnect vec3f_set(gFirstPersonCamera.offset, 0, 0, 0); first_person_reset(); -#if defined(CAPI_SDL1) || defined(CAPI_SDL2) clear_gamepad_input_data(); -#endif le_shutdown();