mirror of
https://github.com/mkxp-z/mkxp-z.git
synced 2025-04-22 06:02:04 +02:00
Add Input.pressex?, Input.repeatex?, Input.triggerex?
This commit is contained in:
parent
8f6b0775b6
commit
ffec65b98f
7 changed files with 303 additions and 183 deletions
|
@ -94,6 +94,36 @@ RB_METHOD(inputRepeat)
|
||||||
return rb_bool_new(shState->input().isRepeated(num));
|
return rb_bool_new(shState->input().isRepeated(num));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RB_METHOD(inputPressEx)
|
||||||
|
{
|
||||||
|
RB_UNUSED_PARAM;
|
||||||
|
|
||||||
|
int num;
|
||||||
|
rb_get_args(argc, argv, "i", &num RB_ARG_END);
|
||||||
|
|
||||||
|
return rb_bool_new(shState->input().isPressedEx(num));
|
||||||
|
}
|
||||||
|
|
||||||
|
RB_METHOD(inputTriggerEx)
|
||||||
|
{
|
||||||
|
RB_UNUSED_PARAM;
|
||||||
|
|
||||||
|
int num;
|
||||||
|
rb_get_args(argc, argv, "i", &num RB_ARG_END);
|
||||||
|
|
||||||
|
return rb_bool_new(shState->input().isTriggeredEx(num));
|
||||||
|
}
|
||||||
|
|
||||||
|
RB_METHOD(inputRepeatEx)
|
||||||
|
{
|
||||||
|
RB_UNUSED_PARAM;
|
||||||
|
|
||||||
|
int num;
|
||||||
|
rb_get_args(argc, argv, "i", &num RB_ARG_END);
|
||||||
|
|
||||||
|
return rb_bool_new(shState->input().isRepeatedEx(num));
|
||||||
|
}
|
||||||
|
|
||||||
RB_METHOD(inputDir4)
|
RB_METHOD(inputDir4)
|
||||||
{
|
{
|
||||||
RB_UNUSED_PARAM;
|
RB_UNUSED_PARAM;
|
||||||
|
@ -171,6 +201,9 @@ inputBindingInit()
|
||||||
_rb_define_module_function(module, "press?", inputPress);
|
_rb_define_module_function(module, "press?", inputPress);
|
||||||
_rb_define_module_function(module, "trigger?", inputTrigger);
|
_rb_define_module_function(module, "trigger?", inputTrigger);
|
||||||
_rb_define_module_function(module, "repeat?", inputRepeat);
|
_rb_define_module_function(module, "repeat?", inputRepeat);
|
||||||
|
_rb_define_module_function(module, "pressex?", inputPressEx);
|
||||||
|
_rb_define_module_function(module, "triggerex?", inputTriggerEx);
|
||||||
|
_rb_define_module_function(module, "repeatex?", inputRepeatEx);
|
||||||
_rb_define_module_function(module, "dir4", inputDir4);
|
_rb_define_module_function(module, "dir4", inputDir4);
|
||||||
_rb_define_module_function(module, "dir8", inputDir8);
|
_rb_define_module_function(module, "dir8", inputDir8);
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
project('mkxp-z', 'cpp', 'c', version: '1.0', default_options: ['cpp_std=c++11'])
|
project('mkxp-z', 'cpp', 'c', version: '1.0', default_options: ['cpp_std=c++11'])
|
||||||
|
|
||||||
minimum_macos_version = '10.10'
|
minimum_macos_version = get_option('macos_min_version')
|
||||||
|
|
||||||
# The meson build is mostly directly copied from the old CMakeLists,
|
# The meson build is mostly directly copied from the old CMakeLists,
|
||||||
# it still needs to be cleaned up
|
# it still needs to be cleaned up
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
option('shared_fluid', type: 'boolean', value: false, description: 'Dynamically link fluidsynth at build time')
|
|
||||||
option('mri_version', type: 'string', value: '1.8', description: 'Version of MRI to link with')
|
option('mri_version', type: 'string', value: '1.8', description: 'Version of MRI to link with')
|
||||||
option('workdir_current', type: 'boolean', value: false, description: 'Keep current directory on startup')
|
|
||||||
option('ruby_lib', type: 'string', value: 'ruby', description: 'Name of the Ruby library')
|
option('ruby_lib', type: 'string', value: 'ruby', description: 'Name of the Ruby library')
|
||||||
option('console', type: 'boolean', value: true, description: 'Whether to debug information in the console')
|
option('console', type: 'boolean', value: true, description: 'Whether to debug information in the console')
|
||||||
|
option('macos_min_version', type: 'string', value: '10.10', description: 'Minimum macOS system version to support')
|
||||||
|
|
||||||
|
option('shared_fluid', type: 'boolean', value: false, description: 'Dynamically link fluidsynth at build time')
|
||||||
option('cjk_fallback_font', type: 'boolean', value: false, description: 'Use WenQuanYi Micro Hei as the fallback font')
|
option('cjk_fallback_font', type: 'boolean', value: false, description: 'Use WenQuanYi Micro Hei as the fallback font')
|
||||||
option('use_fakeapi', type: 'boolean', value: false, description: 'Attempt to repair Win32API calls that do not work with MKXP')
|
option('use_fakeapi', type: 'boolean', value: false, description: 'Attempt to repair Win32API calls that do not work with MKXP')
|
||||||
option('default_framerate', type: 'boolean', value: false, description: 'Disable syncToRefreshrate and fixedFramerate configuration options')
|
option('default_framerate', type: 'boolean', value: false, description: 'Disable syncToRefreshrate and fixedFramerate configuration options')
|
||||||
option('no_preload_scripts', type: 'boolean', value: false, description: 'Disable the preloadScript configuration option')
|
option('no_preload_scripts', type: 'boolean', value: false, description: 'Disable the preloadScript configuration option')
|
||||||
|
option('workdir_current', type: 'boolean', value: false, description: 'Keep current directory on startup')
|
181
src/fake-api.cpp
181
src/fake-api.cpp
|
@ -4,7 +4,6 @@
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <SDL_syswm.h>
|
#include <SDL_syswm.h>
|
||||||
#else
|
#else
|
||||||
#include <map>
|
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include "iniconfig.h"
|
#include "iniconfig.h"
|
||||||
#endif
|
#endif
|
||||||
|
@ -50,178 +49,6 @@
|
||||||
// something instead of having to make a messy Win32API call
|
// something instead of having to make a messy Win32API call
|
||||||
// that *now* has to run entirely different function to even work)
|
// that *now* has to run entirely different function to even work)
|
||||||
|
|
||||||
// macOS/Linux support WIP.
|
|
||||||
|
|
||||||
// ===============================================================
|
|
||||||
// This map is for converting Windows virtual keycodes to SDL's
|
|
||||||
// scancodes. Only needs to exist on macOS and Linux to allow
|
|
||||||
// getAsyncKeyState to work.
|
|
||||||
// ===============================================================
|
|
||||||
#ifndef __WIN32__
|
|
||||||
#define m(vk,sc) { vk, SDL_SCANCODE_##sc }
|
|
||||||
std::map<int, int> vKeyToScancode{
|
|
||||||
// 0x01 LEFT MOUSE
|
|
||||||
// 0x02 RIGHT MOUSE
|
|
||||||
m(0x03, CANCEL),
|
|
||||||
// 0x04 MIDDLE MOUSE
|
|
||||||
// 0x05 XBUTTON 1
|
|
||||||
// 0x06 XBUTTON 2
|
|
||||||
// 0x07 undef
|
|
||||||
m(0x08, BACKSPACE),
|
|
||||||
m(0x09, TAB),
|
|
||||||
// 0x0a reserved
|
|
||||||
// 0x0b reserved
|
|
||||||
m(0x0c, CLEAR),
|
|
||||||
m(0x0d, RETURN),
|
|
||||||
// 0x0e undefined
|
|
||||||
// 0x0f undefined
|
|
||||||
// 0x10 SHIFT (both)
|
|
||||||
// 0x11 CONTROL (both)
|
|
||||||
// 0x12 ALT (both)
|
|
||||||
m(0x13, PAUSE),
|
|
||||||
m(0x14, CAPSLOCK),
|
|
||||||
// 0x15 KANA, HANGUL
|
|
||||||
// 0x16 undefined
|
|
||||||
// 0x17 JUNJA
|
|
||||||
// 0x18 FINAL
|
|
||||||
// 0x19 HANJA, KANJI
|
|
||||||
// 0x1a undefined
|
|
||||||
m(0x1b, ESCAPE),
|
|
||||||
// 0x1c CONVERT
|
|
||||||
// 0x1d NONCONVERT
|
|
||||||
// 0x1e ACCEPT
|
|
||||||
// 0x1f MODECHANGE
|
|
||||||
m(0x20, SPACE),
|
|
||||||
m(0x21, PAGEUP),
|
|
||||||
m(0x22, PAGEDOWN),
|
|
||||||
m(0x23, END),
|
|
||||||
m(0x24, HOME),
|
|
||||||
m(0x25, LEFT),
|
|
||||||
m(0x26, UP),
|
|
||||||
m(0x27, RIGHT),
|
|
||||||
m(0x28, DOWN),
|
|
||||||
m(0x29, SELECT),
|
|
||||||
// 0x2A print
|
|
||||||
m(0x2b, EXECUTE),
|
|
||||||
m(0x2c, PRINTSCREEN),
|
|
||||||
m(0x2d, INSERT),
|
|
||||||
m(0x2e, DELETE),
|
|
||||||
m(0x2f, HELP),
|
|
||||||
m(0x30, 0), m(0x31, 1),
|
|
||||||
m(0x32, 2), m(0x33, 3),
|
|
||||||
m(0x34, 4), m(0x35, 5),
|
|
||||||
m(0x36, 6), m(0x37, 7),
|
|
||||||
m(0x38, 8), m(0x39, 9),
|
|
||||||
// 0x3a-0x40 undefined
|
|
||||||
m(0x41, A), m(0x42, B),
|
|
||||||
m(0x43, C), m(0x44, D),
|
|
||||||
m(0x45, E), m(0x46, F),
|
|
||||||
m(0x47, G), m(0x48, H),
|
|
||||||
m(0x49, I), m(0x4a, J),
|
|
||||||
m(0x4b, K), m(0x4c, L),
|
|
||||||
m(0x4d, M), m(0x4e, N),
|
|
||||||
m(0x4f, O), m(0x50, P),
|
|
||||||
m(0x51, Q), m(0x52, R),
|
|
||||||
m(0x53, S), m(0x54, T),
|
|
||||||
m(0x55, U), m(0x56, V),
|
|
||||||
m(0x57, W), m(0x58, X),
|
|
||||||
m(0x59, Y), m(0x5a, Z),
|
|
||||||
m(0x5b, LGUI), m(0x5c, RGUI),
|
|
||||||
m(0x5d, APPLICATION),
|
|
||||||
// 0x5e reserved
|
|
||||||
m(0x5f, SLEEP),
|
|
||||||
m(0x60, KP_0), m(0x61, KP_1),
|
|
||||||
m(0x62, KP_2), m(0x63, KP_3),
|
|
||||||
m(0x64, KP_4), m(0x65, KP_5),
|
|
||||||
m(0x66, KP_6), m(0x67, KP_7),
|
|
||||||
m(0x68, KP_8), m(0x69, KP_9),
|
|
||||||
m(0x6a, KP_MULTIPLY),
|
|
||||||
m(0x6b, KP_PLUS),
|
|
||||||
m(0x6c, RETURN), // SEPARATOR
|
|
||||||
m(0x6d, KP_MINUS),
|
|
||||||
m(0x6e, KP_DECIMAL),
|
|
||||||
m(0x6f, KP_DIVIDE),
|
|
||||||
m(0x70, F1), m(0x71, F2),
|
|
||||||
m(0x72, F3), m(0x73, F4),
|
|
||||||
m(0x74, F5), m(0x75, F6),
|
|
||||||
m(0x76, F7), m(0x77, F8),
|
|
||||||
m(0x78, F9), m(0x79, F10),
|
|
||||||
m(0x7a, F11), m(0x7b, F12),
|
|
||||||
m(0x7c, F13), m(0x7d, F14),
|
|
||||||
m(0x7e, F15), m(0x7f, F16),
|
|
||||||
m(0x80, F17), m(0x81, F18),
|
|
||||||
m(0x82, F19), m(0x83, F20),
|
|
||||||
m(0x84, F21), m(0x85, F22),
|
|
||||||
m(0x86, F23), m(0x87, F24),
|
|
||||||
// 0x88-0x8f unassigned
|
|
||||||
m(0x90, NUMLOCKCLEAR),
|
|
||||||
m(0x91, SCROLLLOCK),
|
|
||||||
// 0x92-0x96 oem specific
|
|
||||||
// 0x97-0x9f unassigned
|
|
||||||
m(0xa0, LSHIFT),
|
|
||||||
m(0xa1, RSHIFT),
|
|
||||||
m(0xa2, LCTRL),
|
|
||||||
m(0xa3, RCTRL),
|
|
||||||
m(0xa4, LALT),
|
|
||||||
m(0xa5, RALT),
|
|
||||||
m(0xa6, AC_BACK),
|
|
||||||
m(0xa7, AC_FORWARD),
|
|
||||||
m(0xa8, AC_REFRESH),
|
|
||||||
m(0xa9, AC_STOP),
|
|
||||||
m(0xaa, AC_SEARCH),
|
|
||||||
// 0xab BROWSER_FAVORITES
|
|
||||||
m(0xac, AC_HOME),
|
|
||||||
m(0xad, AUDIOMUTE),
|
|
||||||
m(0xae, VOLUMEDOWN),
|
|
||||||
m(0xaf, VOLUMEUP),
|
|
||||||
m(0xb0, AUDIONEXT),
|
|
||||||
m(0xb1, AUDIOPREV),
|
|
||||||
m(0xb2, AUDIOSTOP),
|
|
||||||
m(0xb3, AUDIOPLAY),
|
|
||||||
m(0xb4, MAIL),
|
|
||||||
m(0xb5, MEDIASELECT),
|
|
||||||
// 0xb6 LAUNCH_APP1
|
|
||||||
// 0xb7 LAUNCH_APP2
|
|
||||||
// 0xb8-0xb9 reserved
|
|
||||||
|
|
||||||
// Everything below here is OEM
|
|
||||||
// and can vary by country
|
|
||||||
m(0xba, SEMICOLON),
|
|
||||||
m(0xbb, EQUALS),
|
|
||||||
m(0xbc, COMMA),
|
|
||||||
m(0xbd, MINUS),
|
|
||||||
m(0xbe, PERIOD),
|
|
||||||
m(0xbf, SLASH),
|
|
||||||
m(0xc0, GRAVE),
|
|
||||||
// 0xc1-0xd7 reserved
|
|
||||||
// 0xd8-0xda unassigned
|
|
||||||
m(0xdb, LEFTBRACKET),
|
|
||||||
m(0xdc, BACKSLASH),
|
|
||||||
m(0xdd, RIGHTBRACKET),
|
|
||||||
m(0xde, APOSTROPHE),
|
|
||||||
// 0xdf OEM_8
|
|
||||||
// 0xe0 reserved
|
|
||||||
// 0xe1 oem-specific
|
|
||||||
// 0xe2 OEM_102
|
|
||||||
// 0xe3-0xe4 oem-specific
|
|
||||||
// 0xe5 PROCESSKEY
|
|
||||||
// 0xe6 oem-specific
|
|
||||||
// 0xe7 PACKET
|
|
||||||
// 0xe8 unassigned
|
|
||||||
// 0xe9-0xf5 oem_specific
|
|
||||||
// 0xf6 ATTN
|
|
||||||
m(0xf7, CRSEL),
|
|
||||||
m(0xf8, EXSEL),
|
|
||||||
// 0xf9 EREOF
|
|
||||||
m(0xfa, AUDIOPLAY), // PLAY, guessing
|
|
||||||
// 0xfb ZOOM
|
|
||||||
// 0xfc NONAME
|
|
||||||
// 0xfd PA1
|
|
||||||
m(0xfe, CLEAR)
|
|
||||||
};
|
|
||||||
#undef m
|
|
||||||
#endif
|
|
||||||
|
|
||||||
PREFABI DWORD
|
PREFABI DWORD
|
||||||
MKXP_GetCurrentThreadId(void)
|
MKXP_GetCurrentThreadId(void)
|
||||||
NOP_VAL(DUMMY_VAL)
|
NOP_VAL(DUMMY_VAL)
|
||||||
|
@ -440,10 +267,14 @@ MKXP_GetAsyncKeyState(int vKey)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
try {
|
try
|
||||||
|
{
|
||||||
|
// Use EventThread instead of Input because
|
||||||
|
// Input.update typically gets overridden
|
||||||
result = shState->eThread().keyStates[vKeyToScancode[vKey]] << 15;
|
result = shState->eThread().keyStates[vKeyToScancode[vKey]] << 15;
|
||||||
}
|
}
|
||||||
catch (...) {
|
catch (...)
|
||||||
|
{
|
||||||
result = 0;
|
result = 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -2,8 +2,6 @@
|
||||||
|
|
||||||
#ifdef __WIN32__
|
#ifdef __WIN32__
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#else
|
|
||||||
#include <map>
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define ABI(x) __attribute__((x))
|
#define ABI(x) __attribute__((x))
|
||||||
|
@ -42,8 +40,6 @@ typedef struct {
|
||||||
DWORD BatteryLifeTime;
|
DWORD BatteryLifeTime;
|
||||||
DWORD BatteryFullLifeTime;
|
DWORD BatteryFullLifeTime;
|
||||||
} SYSTEM_POWER_STATUS, *LPSYSTEM_POWER_STATUS;
|
} SYSTEM_POWER_STATUS, *LPSYSTEM_POWER_STATUS;
|
||||||
|
|
||||||
extern std::map<int, int> vKeyToScancode;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define DUMMY_VAL 571
|
#define DUMMY_VAL 571
|
||||||
|
|
252
src/input.cpp
252
src/input.cpp
|
@ -30,11 +30,177 @@
|
||||||
#include <SDL_mouse.h>
|
#include <SDL_mouse.h>
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <map>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
#define BUTTON_CODE_COUNT 24
|
#define BUTTON_CODE_COUNT 24
|
||||||
|
|
||||||
|
// Map of Windows virtualkey codes to SDL scancodes.
|
||||||
|
// Used for pressex, triggerex and repeatex
|
||||||
|
#define m(vk,sc) { vk, SDL_SCANCODE_##sc }
|
||||||
|
std::map<int, int> vKeyToScancode{
|
||||||
|
// 0x01 LEFT MOUSE
|
||||||
|
// 0x02 RIGHT MOUSE
|
||||||
|
m(0x03, CANCEL),
|
||||||
|
// 0x04 MIDDLE MOUSE
|
||||||
|
// 0x05 XBUTTON 1
|
||||||
|
// 0x06 XBUTTON 2
|
||||||
|
// 0x07 undef
|
||||||
|
m(0x08, BACKSPACE),
|
||||||
|
m(0x09, TAB),
|
||||||
|
// 0x0a reserved
|
||||||
|
// 0x0b reserved
|
||||||
|
m(0x0c, CLEAR),
|
||||||
|
m(0x0d, RETURN),
|
||||||
|
// 0x0e undefined
|
||||||
|
// 0x0f undefined
|
||||||
|
// 0x10 SHIFT (both)
|
||||||
|
// 0x11 CONTROL (both)
|
||||||
|
// 0x12 ALT (both)
|
||||||
|
m(0x13, PAUSE),
|
||||||
|
m(0x14, CAPSLOCK),
|
||||||
|
// 0x15 KANA, HANGUL
|
||||||
|
// 0x16 undefined
|
||||||
|
// 0x17 JUNJA
|
||||||
|
// 0x18 FINAL
|
||||||
|
// 0x19 HANJA, KANJI
|
||||||
|
// 0x1a undefined
|
||||||
|
m(0x1b, ESCAPE),
|
||||||
|
// 0x1c CONVERT
|
||||||
|
// 0x1d NONCONVERT
|
||||||
|
// 0x1e ACCEPT
|
||||||
|
// 0x1f MODECHANGE
|
||||||
|
m(0x20, SPACE),
|
||||||
|
m(0x21, PAGEUP),
|
||||||
|
m(0x22, PAGEDOWN),
|
||||||
|
m(0x23, END),
|
||||||
|
m(0x24, HOME),
|
||||||
|
m(0x25, LEFT),
|
||||||
|
m(0x26, UP),
|
||||||
|
m(0x27, RIGHT),
|
||||||
|
m(0x28, DOWN),
|
||||||
|
m(0x29, SELECT),
|
||||||
|
// 0x2A print
|
||||||
|
m(0x2b, EXECUTE),
|
||||||
|
m(0x2c, PRINTSCREEN),
|
||||||
|
m(0x2d, INSERT),
|
||||||
|
m(0x2e, DELETE),
|
||||||
|
m(0x2f, HELP),
|
||||||
|
m(0x30, 0), m(0x31, 1),
|
||||||
|
m(0x32, 2), m(0x33, 3),
|
||||||
|
m(0x34, 4), m(0x35, 5),
|
||||||
|
m(0x36, 6), m(0x37, 7),
|
||||||
|
m(0x38, 8), m(0x39, 9),
|
||||||
|
// 0x3a-0x40 undefined
|
||||||
|
m(0x41, A), m(0x42, B),
|
||||||
|
m(0x43, C), m(0x44, D),
|
||||||
|
m(0x45, E), m(0x46, F),
|
||||||
|
m(0x47, G), m(0x48, H),
|
||||||
|
m(0x49, I), m(0x4a, J),
|
||||||
|
m(0x4b, K), m(0x4c, L),
|
||||||
|
m(0x4d, M), m(0x4e, N),
|
||||||
|
m(0x4f, O), m(0x50, P),
|
||||||
|
m(0x51, Q), m(0x52, R),
|
||||||
|
m(0x53, S), m(0x54, T),
|
||||||
|
m(0x55, U), m(0x56, V),
|
||||||
|
m(0x57, W), m(0x58, X),
|
||||||
|
m(0x59, Y), m(0x5a, Z),
|
||||||
|
m(0x5b, LGUI), m(0x5c, RGUI),
|
||||||
|
m(0x5d, APPLICATION),
|
||||||
|
// 0x5e reserved
|
||||||
|
m(0x5f, SLEEP),
|
||||||
|
m(0x60, KP_0), m(0x61, KP_1),
|
||||||
|
m(0x62, KP_2), m(0x63, KP_3),
|
||||||
|
m(0x64, KP_4), m(0x65, KP_5),
|
||||||
|
m(0x66, KP_6), m(0x67, KP_7),
|
||||||
|
m(0x68, KP_8), m(0x69, KP_9),
|
||||||
|
m(0x6a, KP_MULTIPLY),
|
||||||
|
m(0x6b, KP_PLUS),
|
||||||
|
m(0x6c, RETURN), // SEPARATOR
|
||||||
|
m(0x6d, KP_MINUS),
|
||||||
|
m(0x6e, KP_DECIMAL),
|
||||||
|
m(0x6f, KP_DIVIDE),
|
||||||
|
m(0x70, F1), m(0x71, F2),
|
||||||
|
m(0x72, F3), m(0x73, F4),
|
||||||
|
m(0x74, F5), m(0x75, F6),
|
||||||
|
m(0x76, F7), m(0x77, F8),
|
||||||
|
m(0x78, F9), m(0x79, F10),
|
||||||
|
m(0x7a, F11), m(0x7b, F12),
|
||||||
|
m(0x7c, F13), m(0x7d, F14),
|
||||||
|
m(0x7e, F15), m(0x7f, F16),
|
||||||
|
m(0x80, F17), m(0x81, F18),
|
||||||
|
m(0x82, F19), m(0x83, F20),
|
||||||
|
m(0x84, F21), m(0x85, F22),
|
||||||
|
m(0x86, F23), m(0x87, F24),
|
||||||
|
// 0x88-0x8f unassigned
|
||||||
|
m(0x90, NUMLOCKCLEAR),
|
||||||
|
m(0x91, SCROLLLOCK),
|
||||||
|
// 0x92-0x96 oem specific
|
||||||
|
// 0x97-0x9f unassigned
|
||||||
|
m(0xa0, LSHIFT),
|
||||||
|
m(0xa1, RSHIFT),
|
||||||
|
m(0xa2, LCTRL),
|
||||||
|
m(0xa3, RCTRL),
|
||||||
|
m(0xa4, LALT),
|
||||||
|
m(0xa5, RALT),
|
||||||
|
m(0xa6, AC_BACK),
|
||||||
|
m(0xa7, AC_FORWARD),
|
||||||
|
m(0xa8, AC_REFRESH),
|
||||||
|
m(0xa9, AC_STOP),
|
||||||
|
m(0xaa, AC_SEARCH),
|
||||||
|
// 0xab BROWSER_FAVORITES
|
||||||
|
m(0xac, AC_HOME),
|
||||||
|
m(0xad, AUDIOMUTE),
|
||||||
|
m(0xae, VOLUMEDOWN),
|
||||||
|
m(0xaf, VOLUMEUP),
|
||||||
|
m(0xb0, AUDIONEXT),
|
||||||
|
m(0xb1, AUDIOPREV),
|
||||||
|
m(0xb2, AUDIOSTOP),
|
||||||
|
m(0xb3, AUDIOPLAY),
|
||||||
|
m(0xb4, MAIL),
|
||||||
|
m(0xb5, MEDIASELECT),
|
||||||
|
// 0xb6 LAUNCH_APP1
|
||||||
|
// 0xb7 LAUNCH_APP2
|
||||||
|
// 0xb8-0xb9 reserved
|
||||||
|
|
||||||
|
// Everything below here is OEM
|
||||||
|
// and can vary by country
|
||||||
|
m(0xba, SEMICOLON),
|
||||||
|
m(0xbb, EQUALS),
|
||||||
|
m(0xbc, COMMA),
|
||||||
|
m(0xbd, MINUS),
|
||||||
|
m(0xbe, PERIOD),
|
||||||
|
m(0xbf, SLASH),
|
||||||
|
m(0xc0, GRAVE),
|
||||||
|
// 0xc1-0xd7 reserved
|
||||||
|
// 0xd8-0xda unassigned
|
||||||
|
m(0xdb, LEFTBRACKET),
|
||||||
|
m(0xdc, BACKSLASH),
|
||||||
|
m(0xdd, RIGHTBRACKET),
|
||||||
|
m(0xde, APOSTROPHE),
|
||||||
|
// 0xdf OEM_8
|
||||||
|
// 0xe0 reserved
|
||||||
|
// 0xe1 oem-specific
|
||||||
|
// 0xe2 OEM_102
|
||||||
|
// 0xe3-0xe4 oem-specific
|
||||||
|
// 0xe5 PROCESSKEY
|
||||||
|
// 0xe6 oem-specific
|
||||||
|
// 0xe7 PACKET
|
||||||
|
// 0xe8 unassigned
|
||||||
|
// 0xe9-0xf5 oem_specific
|
||||||
|
// 0xf6 ATTN
|
||||||
|
m(0xf7, CRSEL),
|
||||||
|
m(0xf8, EXSEL),
|
||||||
|
// 0xf9 EREOF
|
||||||
|
m(0xfa, AUDIOPLAY), // PLAY, guessing
|
||||||
|
// 0xfb ZOOM
|
||||||
|
// 0xfc NONAME
|
||||||
|
// 0xfd PA1
|
||||||
|
m(0xfe, CLEAR)
|
||||||
|
};
|
||||||
|
#undef m
|
||||||
|
|
||||||
struct ButtonState
|
struct ButtonState
|
||||||
{
|
{
|
||||||
bool pressed;
|
bool pressed;
|
||||||
|
@ -281,6 +447,12 @@ struct InputPrivate
|
||||||
ButtonState *states;
|
ButtonState *states;
|
||||||
ButtonState *statesOld;
|
ButtonState *statesOld;
|
||||||
|
|
||||||
|
// Raw keystates
|
||||||
|
uint8_t rawStateArray[SDL_NUM_SCANCODES*2];
|
||||||
|
|
||||||
|
uint8_t *rawStates;
|
||||||
|
uint8_t *rawStatesOld;
|
||||||
|
|
||||||
Input::ButtonCode repeating;
|
Input::ButtonCode repeating;
|
||||||
unsigned int repeatCount;
|
unsigned int repeatCount;
|
||||||
|
|
||||||
|
@ -307,6 +479,9 @@ struct InputPrivate
|
||||||
states = stateArray;
|
states = stateArray;
|
||||||
statesOld = stateArray + BUTTON_CODE_COUNT;
|
statesOld = stateArray + BUTTON_CODE_COUNT;
|
||||||
|
|
||||||
|
rawStates = rawStateArray;
|
||||||
|
rawStatesOld = rawStateArray + SDL_NUM_SCANCODES;
|
||||||
|
|
||||||
/* Clear buffers */
|
/* Clear buffers */
|
||||||
clearBuffer();
|
clearBuffer();
|
||||||
swapBuffers();
|
swapBuffers();
|
||||||
|
@ -343,17 +518,71 @@ struct InputPrivate
|
||||||
return statesOld[mapToIndex[code]];
|
return statesOld[mapToIndex[code]];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline ButtonState getStateRaw(int code)
|
||||||
|
{
|
||||||
|
ButtonState b;
|
||||||
|
int scancode = -1;
|
||||||
|
|
||||||
|
switch (code)
|
||||||
|
{
|
||||||
|
case 0x10:
|
||||||
|
return getState(Input::Shift);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x11:
|
||||||
|
return getState(Input::Ctrl);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x12:
|
||||||
|
return getState(Input::Alt);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x1:
|
||||||
|
return getState(Input::MouseLeft);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x2:
|
||||||
|
return getState(Input::MouseRight);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x4:
|
||||||
|
return getState(Input::MouseMiddle);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
ButtonState b;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
scancode = vKeyToScancode[code];
|
||||||
|
}
|
||||||
|
catch (...) {}
|
||||||
|
if (scancode == -1) return b;
|
||||||
|
|
||||||
|
b.pressed = rawStates[scancode];
|
||||||
|
b.triggered = (rawStates[scancode] && !rawStatesOld[scancode]);
|
||||||
|
b.repeated = (rawStates[scancode] && rawStatesOld[scancode]);
|
||||||
|
return b;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void swapBuffers()
|
void swapBuffers()
|
||||||
{
|
{
|
||||||
ButtonState *tmp = states;
|
ButtonState *tmp = states;
|
||||||
states = statesOld;
|
states = statesOld;
|
||||||
statesOld = tmp;
|
statesOld = tmp;
|
||||||
|
|
||||||
|
uint8_t *tmpr = rawStates;
|
||||||
|
rawStates = rawStatesOld;
|
||||||
|
rawStatesOld = tmpr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void clearBuffer()
|
void clearBuffer()
|
||||||
{
|
{
|
||||||
const size_t size = sizeof(ButtonState) * BUTTON_CODE_COUNT;
|
const size_t size = sizeof(ButtonState) * BUTTON_CODE_COUNT;
|
||||||
memset(states, 0, size);
|
memset(states, 0, size);
|
||||||
|
|
||||||
|
memset(rawStates, 0, SDL_NUM_SCANCODES);
|
||||||
}
|
}
|
||||||
|
|
||||||
void checkBindingChange(const RGSSThreadData &rtData)
|
void checkBindingChange(const RGSSThreadData &rtData)
|
||||||
|
@ -506,6 +735,11 @@ struct InputPrivate
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void updateRaw()
|
||||||
|
{
|
||||||
|
memcpy(rawStates, shState->eThread().keyStates, SDL_NUM_SCANCODES);
|
||||||
|
}
|
||||||
|
|
||||||
void updateDir4()
|
void updateDir4()
|
||||||
{
|
{
|
||||||
int dirFlag = 0;
|
int dirFlag = 0;
|
||||||
|
@ -607,6 +841,9 @@ void Input::update()
|
||||||
/* Poll all bindings */
|
/* Poll all bindings */
|
||||||
p->pollBindings(repeatCand);
|
p->pollBindings(repeatCand);
|
||||||
|
|
||||||
|
// Get raw keystates
|
||||||
|
p->updateRaw();
|
||||||
|
|
||||||
/* Check for new repeating key */
|
/* Check for new repeating key */
|
||||||
if (repeatCand != None && repeatCand != p->repeating)
|
if (repeatCand != None && repeatCand != p->repeating)
|
||||||
{
|
{
|
||||||
|
@ -651,6 +888,21 @@ bool Input::isRepeated(int button)
|
||||||
return p->getStateCheck(button).repeated;
|
return p->getStateCheck(button).repeated;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Input::isPressedEx(int vKey)
|
||||||
|
{
|
||||||
|
return p->getStateRaw(vKey).pressed;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Input::isTriggeredEx(int vKey)
|
||||||
|
{
|
||||||
|
return p->getStateRaw(vKey).triggered;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Input::isRepeatedEx(int vKey)
|
||||||
|
{
|
||||||
|
return p->getStateRaw(vKey).repeated;
|
||||||
|
}
|
||||||
|
|
||||||
int Input::dir4Value()
|
int Input::dir4Value()
|
||||||
{
|
{
|
||||||
return p->dir4Data.active;
|
return p->dir4Data.active;
|
||||||
|
|
|
@ -22,6 +22,10 @@
|
||||||
#ifndef INPUT_H
|
#ifndef INPUT_H
|
||||||
#define INPUT_H
|
#define INPUT_H
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
extern std::map<int, int> vKeyToScancode;
|
||||||
|
|
||||||
struct InputPrivate;
|
struct InputPrivate;
|
||||||
struct RGSSThreadData;
|
struct RGSSThreadData;
|
||||||
|
|
||||||
|
@ -51,6 +55,9 @@ public:
|
||||||
bool isPressed(int button);
|
bool isPressed(int button);
|
||||||
bool isTriggered(int button);
|
bool isTriggered(int button);
|
||||||
bool isRepeated(int button);
|
bool isRepeated(int button);
|
||||||
|
bool isPressedEx(int vKey);
|
||||||
|
bool isTriggeredEx(int vKey);
|
||||||
|
bool isRepeatedEx(int vKey);
|
||||||
|
|
||||||
int dir4Value();
|
int dir4Value();
|
||||||
int dir8Value();
|
int dir8Value();
|
||||||
|
|
Loading…
Add table
Reference in a new issue