More Peachy reviews + added dxgi gKeyboard support

This commit is contained in:
xLuigiGamerx 2025-11-24 02:55:38 +03:00
parent 24ac64b8b8
commit 77952291b8
11 changed files with 622 additions and 221 deletions

View file

@ -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;

View file

@ -4,7 +4,7 @@
#include <stdbool.h>
#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
}

View file

@ -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;

View file

@ -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);

View file

@ -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;

View file

@ -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

View file

@ -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);

View file

@ -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

View file

@ -7,8 +7,6 @@
#define MAX_GAMEPADS 256
#define MAX_TOUCHPAD_FINGERS 10
#if defined(CAPI_SDL1) || defined(CAPI_SDL2)
#include "types.h"
#include <stdbool.h>
@ -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

View file

@ -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) {

View file

@ -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();