|
|
|
|
@ -95,176 +95,6 @@ void FocusOnCharInfo()
|
|
|
|
|
SetCursorPos(ChrBtnsRect[stat].Center()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int TranslateSdlKey(SDL_Keysym key) |
|
|
|
|
{ |
|
|
|
|
// ref: https://wiki.libsdl.org/SDL_Keycode
|
|
|
|
|
// ref: https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
|
|
|
|
|
SDL_Keycode sym = key.sym; |
|
|
|
|
remap_keyboard_key(&sym); |
|
|
|
|
switch (sym) { |
|
|
|
|
case SDLK_BACKSPACE: |
|
|
|
|
return DVL_VK_BACK; |
|
|
|
|
case SDLK_TAB: |
|
|
|
|
return DVL_VK_TAB; |
|
|
|
|
case SDLK_RETURN: |
|
|
|
|
return DVL_VK_RETURN; |
|
|
|
|
case SDLK_ESCAPE: |
|
|
|
|
return DVL_VK_ESCAPE; |
|
|
|
|
case SDLK_SPACE: |
|
|
|
|
return DVL_VK_SPACE; |
|
|
|
|
case SDLK_QUOTE: |
|
|
|
|
return DVL_VK_OEM_7; |
|
|
|
|
case SDLK_COMMA: |
|
|
|
|
return DVL_VK_OEM_COMMA; |
|
|
|
|
case SDLK_MINUS: |
|
|
|
|
return DVL_VK_OEM_MINUS; |
|
|
|
|
case SDLK_PERIOD: |
|
|
|
|
return DVL_VK_OEM_PERIOD; |
|
|
|
|
case SDLK_SLASH: |
|
|
|
|
return DVL_VK_OEM_2; |
|
|
|
|
case SDLK_SEMICOLON: |
|
|
|
|
return DVL_VK_OEM_1; |
|
|
|
|
case SDLK_EQUALS: |
|
|
|
|
return DVL_VK_OEM_PLUS; |
|
|
|
|
case SDLK_LEFTBRACKET: |
|
|
|
|
return DVL_VK_OEM_4; |
|
|
|
|
case SDLK_BACKSLASH: |
|
|
|
|
return DVL_VK_OEM_5; |
|
|
|
|
case SDLK_RIGHTBRACKET: |
|
|
|
|
return DVL_VK_OEM_6; |
|
|
|
|
case SDLK_BACKQUOTE: |
|
|
|
|
return DVL_VK_OEM_3; |
|
|
|
|
case SDLK_DELETE: |
|
|
|
|
return DVL_VK_DELETE; |
|
|
|
|
case SDLK_CAPSLOCK: |
|
|
|
|
return DVL_VK_CAPITAL; |
|
|
|
|
case SDLK_F1: |
|
|
|
|
return DVL_VK_F1; |
|
|
|
|
case SDLK_F2: |
|
|
|
|
return DVL_VK_F2; |
|
|
|
|
case SDLK_F3: |
|
|
|
|
return DVL_VK_F3; |
|
|
|
|
case SDLK_F4: |
|
|
|
|
return DVL_VK_F4; |
|
|
|
|
case SDLK_F5: |
|
|
|
|
return DVL_VK_F5; |
|
|
|
|
case SDLK_F6: |
|
|
|
|
return DVL_VK_F6; |
|
|
|
|
case SDLK_F7: |
|
|
|
|
return DVL_VK_F7; |
|
|
|
|
case SDLK_F8: |
|
|
|
|
return DVL_VK_F8; |
|
|
|
|
case SDLK_F9: |
|
|
|
|
return DVL_VK_F9; |
|
|
|
|
case SDLK_F10: |
|
|
|
|
return DVL_VK_F10; |
|
|
|
|
case SDLK_F11: |
|
|
|
|
return DVL_VK_F11; |
|
|
|
|
case SDLK_F12: |
|
|
|
|
return DVL_VK_F12; |
|
|
|
|
case SDLK_PRINTSCREEN: |
|
|
|
|
return DVL_VK_SNAPSHOT; |
|
|
|
|
case SDLK_SCROLLLOCK: |
|
|
|
|
return DVL_VK_SCROLL; |
|
|
|
|
case SDLK_PAUSE: |
|
|
|
|
return DVL_VK_PAUSE; |
|
|
|
|
case SDLK_INSERT: |
|
|
|
|
return DVL_VK_INSERT; |
|
|
|
|
case SDLK_HOME: |
|
|
|
|
return DVL_VK_HOME; |
|
|
|
|
case SDLK_PAGEUP: |
|
|
|
|
return DVL_VK_PRIOR; |
|
|
|
|
case SDLK_END: |
|
|
|
|
return DVL_VK_END; |
|
|
|
|
case SDLK_PAGEDOWN: |
|
|
|
|
return DVL_VK_NEXT; |
|
|
|
|
case SDLK_RIGHT: |
|
|
|
|
return DVL_VK_RIGHT; |
|
|
|
|
case SDLK_LEFT: |
|
|
|
|
return DVL_VK_LEFT; |
|
|
|
|
case SDLK_DOWN: |
|
|
|
|
return DVL_VK_DOWN; |
|
|
|
|
case SDLK_UP: |
|
|
|
|
return DVL_VK_UP; |
|
|
|
|
case SDLK_NUMLOCKCLEAR: |
|
|
|
|
return DVL_VK_NUMLOCK; |
|
|
|
|
case SDLK_KP_DIVIDE: |
|
|
|
|
return DVL_VK_DIVIDE; |
|
|
|
|
case SDLK_KP_MULTIPLY: |
|
|
|
|
return DVL_VK_MULTIPLY; |
|
|
|
|
case SDLK_KP_MINUS: |
|
|
|
|
// Returning DVL_VK_OEM_MINUS to play nice with Devilution automap zoom.
|
|
|
|
|
//
|
|
|
|
|
// For a distinct keypad key-code, DVL_VK_SUBTRACT should be returned.
|
|
|
|
|
return DVL_VK_OEM_MINUS; |
|
|
|
|
case SDLK_KP_PLUS: |
|
|
|
|
// Returning DVL_VK_OEM_PLUS to play nice with Devilution automap zoom.
|
|
|
|
|
//
|
|
|
|
|
// For a distinct keypad key-code, DVL_VK_ADD should be returned.
|
|
|
|
|
return DVL_VK_OEM_PLUS; |
|
|
|
|
case SDLK_KP_ENTER: |
|
|
|
|
return DVL_VK_RETURN; |
|
|
|
|
case SDLK_KP_1: |
|
|
|
|
return DVL_VK_NUMPAD1; |
|
|
|
|
case SDLK_KP_2: |
|
|
|
|
return DVL_VK_NUMPAD2; |
|
|
|
|
case SDLK_KP_3: |
|
|
|
|
return DVL_VK_NUMPAD3; |
|
|
|
|
case SDLK_KP_4: |
|
|
|
|
return DVL_VK_NUMPAD4; |
|
|
|
|
case SDLK_KP_5: |
|
|
|
|
return DVL_VK_NUMPAD5; |
|
|
|
|
case SDLK_KP_6: |
|
|
|
|
return DVL_VK_NUMPAD6; |
|
|
|
|
case SDLK_KP_7: |
|
|
|
|
return DVL_VK_NUMPAD7; |
|
|
|
|
case SDLK_KP_8: |
|
|
|
|
return DVL_VK_NUMPAD8; |
|
|
|
|
case SDLK_KP_9: |
|
|
|
|
return DVL_VK_NUMPAD9; |
|
|
|
|
#ifndef USE_SDL1 |
|
|
|
|
case SDLK_KP_000: |
|
|
|
|
case SDLK_KP_00: |
|
|
|
|
#endif |
|
|
|
|
case SDLK_KP_0: |
|
|
|
|
return DVL_VK_NUMPAD0; |
|
|
|
|
case SDLK_KP_PERIOD: |
|
|
|
|
return DVL_VK_DECIMAL; |
|
|
|
|
case SDLK_MENU: |
|
|
|
|
return DVL_VK_MENU; |
|
|
|
|
#ifndef USE_SDL1 |
|
|
|
|
case SDLK_KP_COMMA: |
|
|
|
|
return DVL_VK_OEM_COMMA; |
|
|
|
|
#endif |
|
|
|
|
case SDLK_LCTRL: |
|
|
|
|
return DVL_VK_LCONTROL; |
|
|
|
|
case SDLK_LSHIFT: |
|
|
|
|
return DVL_VK_LSHIFT; |
|
|
|
|
case SDLK_LALT: |
|
|
|
|
return DVL_VK_LMENU; |
|
|
|
|
case SDLK_LGUI: |
|
|
|
|
return DVL_VK_LWIN; |
|
|
|
|
case SDLK_RCTRL: |
|
|
|
|
return DVL_VK_RCONTROL; |
|
|
|
|
case SDLK_RSHIFT: |
|
|
|
|
return DVL_VK_RSHIFT; |
|
|
|
|
case SDLK_RALT: |
|
|
|
|
return DVL_VK_RMENU; |
|
|
|
|
case SDLK_RGUI: |
|
|
|
|
return DVL_VK_RWIN; |
|
|
|
|
default: |
|
|
|
|
if (sym >= SDLK_a && sym <= SDLK_z) { |
|
|
|
|
return 'A' + (sym - SDLK_a); |
|
|
|
|
} else if (sym >= SDLK_0 && sym <= SDLK_9) { |
|
|
|
|
return '0' + (sym - SDLK_0); |
|
|
|
|
} else if (sym >= SDLK_F1 && sym <= SDLK_F12) { |
|
|
|
|
return DVL_VK_F1 + (sym - SDLK_F1); |
|
|
|
|
} |
|
|
|
|
Log("unknown key: name={} sym=0x{:X} scan={} mod=0x{:X}", SDL_GetKeyName(sym), static_cast<int>(sym), static_cast<int>(key.scancode), static_cast<unsigned>(key.mod)); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
namespace { |
|
|
|
|
|
|
|
|
|
int32_t PositionForMouse(int16_t x, int16_t y) |
|
|
|
|
@ -272,14 +102,6 @@ int32_t PositionForMouse(int16_t x, int16_t y)
|
|
|
|
|
return (((uint16_t)(y & 0xFFFF)) << 16) | (uint16_t)(x & 0xFFFF); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int32_t KeystateForMouse(int32_t ret) |
|
|
|
|
{ |
|
|
|
|
ret |= (SDL_GetModState() & KMOD_SHIFT) != 0 ? DVL_MK_SHIFT : 0; |
|
|
|
|
ret |= (SDL_GetModState() & KMOD_CTRL) != 0 ? DVL_MK_CTRL : 0; |
|
|
|
|
// XXX: other DVL_MK_* codes not implemented
|
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool FalseAvail(const char *name, int value) |
|
|
|
|
{ |
|
|
|
|
LogVerbose("Unhandled SDL event: {} {}", name, value); |
|
|
|
|
@ -313,7 +135,6 @@ void ProcessGamepadEvents(GameAction &action)
|
|
|
|
|
switch (action.type) { |
|
|
|
|
case GameActionType_NONE: |
|
|
|
|
case GameActionType_SEND_KEY: |
|
|
|
|
case GameActionType_SEND_MOUSE_CLICK: |
|
|
|
|
break; |
|
|
|
|
case GameActionType_USE_HEALTH_POTION: |
|
|
|
|
if (IsStashOpen) |
|
|
|
|
@ -476,14 +297,17 @@ bool FetchMessage_Real(tagMSG *lpMsg)
|
|
|
|
|
lpMsg->wParam = action.send_key.vk_code; |
|
|
|
|
} |
|
|
|
|
} else if (action.type == GameActionType_SEND_KEY) { |
|
|
|
|
lpMsg->message = action.send_key.up ? DVL_WM_KEYUP : DVL_WM_KEYDOWN; |
|
|
|
|
lpMsg->wParam = action.send_key.vk_code; |
|
|
|
|
} else if (action.type == GameActionType_SEND_MOUSE_CLICK) { |
|
|
|
|
lpMsg->message = action.send_mouse_click.up |
|
|
|
|
? (action.send_mouse_click.button == GameActionSendMouseClick::LEFT ? DVL_WM_LBUTTONUP : DVL_WM_RBUTTONUP) |
|
|
|
|
: (action.send_mouse_click.button == GameActionSendMouseClick::LEFT ? DVL_WM_LBUTTONDOWN : DVL_WM_RBUTTONDOWN); |
|
|
|
|
lpMsg->wParam = 0; |
|
|
|
|
lpMsg->lParam = (static_cast<int16_t>(MousePosition.y) << 16) | static_cast<int16_t>(MousePosition.x); |
|
|
|
|
if ((action.send_key.vk_code & KeymapperMouseButtonMask) != 0) { |
|
|
|
|
const unsigned button = action.send_key.vk_code & ~KeymapperMouseButtonMask; |
|
|
|
|
lpMsg->message = action.send_key.up |
|
|
|
|
? (button == SDL_BUTTON_LEFT ? DVL_WM_LBUTTONUP : DVL_WM_RBUTTONUP) |
|
|
|
|
: (button == SDL_BUTTON_RIGHT ? DVL_WM_LBUTTONDOWN : DVL_WM_RBUTTONDOWN); |
|
|
|
|
lpMsg->wParam = 0; |
|
|
|
|
lpMsg->lParam = (static_cast<int16_t>(MousePosition.y) << 16) | static_cast<int16_t>(MousePosition.x); |
|
|
|
|
} else { |
|
|
|
|
lpMsg->message = action.send_key.up ? DVL_WM_KEYUP : DVL_WM_KEYDOWN; |
|
|
|
|
lpMsg->wParam = action.send_key.vk_code; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
ProcessGamepadEvents(action); |
|
|
|
|
} |
|
|
|
|
@ -512,78 +336,62 @@ bool FetchMessage_Real(tagMSG *lpMsg)
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
int key = TranslateSdlKey(e.key.keysym); |
|
|
|
|
SDL_Keycode key = e.key.keysym.sym; |
|
|
|
|
remap_keyboard_key(&key); |
|
|
|
|
if (key == -1) |
|
|
|
|
return FalseAvail(e.type == SDL_KEYDOWN ? "SDL_KEYDOWN" : "SDL_KEYUP", e.key.keysym.sym); |
|
|
|
|
lpMsg->message = e.type == SDL_KEYDOWN ? DVL_WM_KEYDOWN : DVL_WM_KEYUP; |
|
|
|
|
lpMsg->wParam = (uint32_t)key; |
|
|
|
|
// HACK: Encode modifier in lParam for TranslateMessage later
|
|
|
|
|
lpMsg->lParam = e.key.keysym.mod << 16; |
|
|
|
|
lpMsg->wParam = static_cast<uint32_t>(key); |
|
|
|
|
lpMsg->lParam = EncodeKeyboardModState(e.key.keysym.mod); |
|
|
|
|
} break; |
|
|
|
|
case SDL_MOUSEMOTION: |
|
|
|
|
lpMsg->message = DVL_WM_MOUSEMOVE; |
|
|
|
|
lpMsg->lParam = PositionForMouse(e.motion.x, e.motion.y); |
|
|
|
|
lpMsg->wParam = KeystateForMouse(0); |
|
|
|
|
lpMsg->wParam = EncodeMouseModState(SDL_GetModState()); |
|
|
|
|
if (ControlMode == ControlTypes::KeyboardAndMouse && invflag) |
|
|
|
|
InvalidateInventorySlot(); |
|
|
|
|
break; |
|
|
|
|
case SDL_MOUSEBUTTONDOWN: { |
|
|
|
|
int button = e.button.button; |
|
|
|
|
lpMsg->lParam = PositionForMouse(e.button.x, e.button.y); |
|
|
|
|
lpMsg->wParam = EncodeMouseModState(SDL_GetModState()); |
|
|
|
|
const int button = e.button.button; |
|
|
|
|
switch (button) { |
|
|
|
|
case SDL_BUTTON_LEFT: |
|
|
|
|
lpMsg->message = DVL_WM_LBUTTONDOWN; |
|
|
|
|
lpMsg->lParam = PositionForMouse(e.button.x, e.button.y); |
|
|
|
|
lpMsg->wParam = KeystateForMouse(DVL_MK_LBUTTON); |
|
|
|
|
break; |
|
|
|
|
case SDL_BUTTON_RIGHT: |
|
|
|
|
lpMsg->message = DVL_WM_RBUTTONDOWN; |
|
|
|
|
lpMsg->lParam = PositionForMouse(e.button.x, e.button.y); |
|
|
|
|
lpMsg->wParam = KeystateForMouse(DVL_MK_RBUTTON); |
|
|
|
|
break; |
|
|
|
|
case SDL_BUTTON_MIDDLE: |
|
|
|
|
lpMsg->message = DVL_WM_MBUTTONDOWN; |
|
|
|
|
lpMsg->lParam = PositionForMouse(e.button.x, e.button.y); |
|
|
|
|
lpMsg->wParam = KeystateForMouse(0); |
|
|
|
|
break; |
|
|
|
|
case SDL_BUTTON_X1: |
|
|
|
|
lpMsg->message = DVL_WM_X1BUTTONDOWN; |
|
|
|
|
lpMsg->lParam = PositionForMouse(e.button.x, e.button.y); |
|
|
|
|
lpMsg->wParam = KeystateForMouse(0); |
|
|
|
|
break; |
|
|
|
|
case SDL_BUTTON_X2: |
|
|
|
|
lpMsg->message = DVL_WM_X2BUTTONDOWN; |
|
|
|
|
lpMsg->lParam = PositionForMouse(e.button.x, e.button.y); |
|
|
|
|
lpMsg->wParam = KeystateForMouse(0); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} break; |
|
|
|
|
case SDL_MOUSEBUTTONUP: { |
|
|
|
|
int button = e.button.button; |
|
|
|
|
lpMsg->lParam = PositionForMouse(e.button.x, e.button.y); |
|
|
|
|
lpMsg->wParam = EncodeMouseModState(SDL_GetModState()); |
|
|
|
|
const int button = e.button.button; |
|
|
|
|
switch (button) { |
|
|
|
|
case SDL_BUTTON_LEFT: |
|
|
|
|
lpMsg->message = DVL_WM_LBUTTONUP; |
|
|
|
|
lpMsg->lParam = PositionForMouse(e.button.x, e.button.y); |
|
|
|
|
lpMsg->wParam = KeystateForMouse(0); |
|
|
|
|
break; |
|
|
|
|
case SDL_BUTTON_RIGHT: |
|
|
|
|
lpMsg->message = DVL_WM_RBUTTONUP; |
|
|
|
|
lpMsg->lParam = PositionForMouse(e.button.x, e.button.y); |
|
|
|
|
lpMsg->wParam = KeystateForMouse(0); |
|
|
|
|
break; |
|
|
|
|
case SDL_BUTTON_MIDDLE: |
|
|
|
|
lpMsg->message = DVL_WM_MBUTTONUP; |
|
|
|
|
lpMsg->lParam = PositionForMouse(e.button.x, e.button.y); |
|
|
|
|
lpMsg->wParam = KeystateForMouse(0); |
|
|
|
|
break; |
|
|
|
|
case SDL_BUTTON_X1: |
|
|
|
|
lpMsg->message = DVL_WM_X1BUTTONUP; |
|
|
|
|
lpMsg->lParam = PositionForMouse(e.button.x, e.button.y); |
|
|
|
|
lpMsg->wParam = KeystateForMouse(0); |
|
|
|
|
break; |
|
|
|
|
case SDL_BUTTON_X2: |
|
|
|
|
lpMsg->message = DVL_WM_X2BUTTONUP; |
|
|
|
|
lpMsg->lParam = PositionForMouse(e.button.x, e.button.y); |
|
|
|
|
lpMsg->wParam = KeystateForMouse(0); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} break; |
|
|
|
|
@ -591,13 +399,13 @@ bool FetchMessage_Real(tagMSG *lpMsg)
|
|
|
|
|
case SDL_MOUSEWHEEL: |
|
|
|
|
lpMsg->message = DVL_WM_KEYDOWN; |
|
|
|
|
if (e.wheel.y > 0) { |
|
|
|
|
lpMsg->wParam = GetAsyncKeyState(DVL_VK_CONTROL) ? DVL_VK_OEM_PLUS : DVL_VK_UP; |
|
|
|
|
lpMsg->wParam = (SDL_GetModState() & KMOD_CTRL) != 0 ? SDLK_KP_PLUS : SDLK_UP; |
|
|
|
|
} else if (e.wheel.y < 0) { |
|
|
|
|
lpMsg->wParam = GetAsyncKeyState(DVL_VK_CONTROL) ? DVL_VK_OEM_MINUS : DVL_VK_DOWN; |
|
|
|
|
lpMsg->wParam = (SDL_GetModState() & KMOD_CTRL) != 0 ? SDLK_KP_MINUS : SDLK_DOWN; |
|
|
|
|
} else if (e.wheel.x > 0) { |
|
|
|
|
lpMsg->wParam = DVL_VK_LEFT; |
|
|
|
|
lpMsg->wParam = SDLK_LEFT; |
|
|
|
|
} else if (e.wheel.x < 0) { |
|
|
|
|
lpMsg->wParam = DVL_VK_RIGHT; |
|
|
|
|
lpMsg->wParam = SDLK_RIGHT; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
#if SDL_VERSION_ATLEAST(2, 0, 4) |
|
|
|
|
@ -695,136 +503,84 @@ bool FetchMessage(tagMSG *lpMsg)
|
|
|
|
|
return available; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool TranslateMessage(const tagMSG *lpMsg) |
|
|
|
|
void TranslateMessage(const tagMSG *lpMsg) |
|
|
|
|
{ |
|
|
|
|
if (lpMsg->message == DVL_WM_KEYDOWN) { |
|
|
|
|
int key = lpMsg->wParam; |
|
|
|
|
unsigned mod = (uint32_t)lpMsg->lParam >> 16; |
|
|
|
|
|
|
|
|
|
bool shift = (mod & KMOD_SHIFT) != 0; |
|
|
|
|
bool caps = (mod & KMOD_CAPS) != 0; |
|
|
|
|
bool upper = shift != caps; |
|
|
|
|
|
|
|
|
|
bool isAlpha = (key >= 'A' && key <= 'Z'); |
|
|
|
|
bool isNumeric = (key >= '0' && key <= '9'); |
|
|
|
|
bool isControl = key == DVL_VK_SPACE || key == DVL_VK_BACK || key == DVL_VK_ESCAPE || key == DVL_VK_TAB || key == DVL_VK_RETURN; |
|
|
|
|
bool isOem = (key >= DVL_VK_OEM_1 && key <= DVL_VK_OEM_7); |
|
|
|
|
|
|
|
|
|
if (isControl || isAlpha || isNumeric || isOem) { |
|
|
|
|
if (!upper && isAlpha) { |
|
|
|
|
key = tolower(key); |
|
|
|
|
} else if (shift && isNumeric) { |
|
|
|
|
switch (key) { |
|
|
|
|
case '1': |
|
|
|
|
key = '!'; |
|
|
|
|
break; |
|
|
|
|
case '2': |
|
|
|
|
key = '@'; |
|
|
|
|
break; |
|
|
|
|
case '3': |
|
|
|
|
key = '#'; |
|
|
|
|
break; |
|
|
|
|
case '4': |
|
|
|
|
key = '$'; |
|
|
|
|
break; |
|
|
|
|
case '5': |
|
|
|
|
key = '%'; |
|
|
|
|
break; |
|
|
|
|
case '6': |
|
|
|
|
key = '^'; |
|
|
|
|
break; |
|
|
|
|
case '7': |
|
|
|
|
key = '&'; |
|
|
|
|
break; |
|
|
|
|
case '8': |
|
|
|
|
key = '*'; |
|
|
|
|
break; |
|
|
|
|
case '9': |
|
|
|
|
key = '('; |
|
|
|
|
break; |
|
|
|
|
case '0': |
|
|
|
|
key = ')'; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} else if (isOem) { |
|
|
|
|
// XXX: This probably only supports US keyboard layout
|
|
|
|
|
switch (key) { |
|
|
|
|
case DVL_VK_OEM_1: |
|
|
|
|
key = shift ? ':' : ';'; |
|
|
|
|
break; |
|
|
|
|
case DVL_VK_OEM_2: |
|
|
|
|
key = shift ? '?' : '/'; |
|
|
|
|
break; |
|
|
|
|
case DVL_VK_OEM_3: |
|
|
|
|
key = shift ? '~' : '`'; |
|
|
|
|
break; |
|
|
|
|
case DVL_VK_OEM_4: |
|
|
|
|
key = shift ? '{' : '['; |
|
|
|
|
break; |
|
|
|
|
case DVL_VK_OEM_5: |
|
|
|
|
key = shift ? '|' : '\\'; |
|
|
|
|
break; |
|
|
|
|
case DVL_VK_OEM_6: |
|
|
|
|
key = shift ? '}' : ']'; |
|
|
|
|
break; |
|
|
|
|
case DVL_VK_OEM_7: |
|
|
|
|
key = shift ? '"' : '\''; |
|
|
|
|
break; |
|
|
|
|
case DVL_VK_OEM_MINUS: |
|
|
|
|
key = shift ? '_' : '-'; |
|
|
|
|
break; |
|
|
|
|
case DVL_VK_OEM_PLUS: |
|
|
|
|
key = shift ? '+' : '='; |
|
|
|
|
break; |
|
|
|
|
case DVL_VK_OEM_PERIOD: |
|
|
|
|
key = shift ? '>' : '.'; |
|
|
|
|
break; |
|
|
|
|
case DVL_VK_OEM_COMMA: |
|
|
|
|
key = shift ? '<' : ','; |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
default: |
|
|
|
|
UNIMPLEMENTED(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
const auto key = static_cast<SDL_Keycode>(lpMsg->wParam); |
|
|
|
|
const uint16_t mod = DecodeKeyboardModState(lpMsg->lParam >> 16); |
|
|
|
|
|
|
|
|
|
const bool isShift = (mod & KMOD_SHIFT) != 0; |
|
|
|
|
const bool isCapsLock = (mod & KMOD_CAPS) != 0; |
|
|
|
|
const bool isUpper = isShift != isCapsLock; |
|
|
|
|
|
|
|
|
|
char chr; |
|
|
|
|
if (key >= SDLK_a && key <= SDLK_z) { |
|
|
|
|
chr = static_cast<char>(key); |
|
|
|
|
if (isUpper) |
|
|
|
|
chr = static_cast<char>(chr - ('a' - 'A')); |
|
|
|
|
} else if (key <= 0x7F) { |
|
|
|
|
chr = static_cast<char>(key); |
|
|
|
|
} else if (key >= SDLK_KP_1 && key <= SDLK_KP_9) { |
|
|
|
|
chr = static_cast<char>(SDLK_1 + (key - SDLK_KP_1)); |
|
|
|
|
} else if (key == SDLK_KP_0) { |
|
|
|
|
chr = static_cast<char>(SDLK_0); |
|
|
|
|
} else if (key == SDLK_KP_PLUS) { |
|
|
|
|
chr = static_cast<char>(SDLK_PLUS); |
|
|
|
|
} else if (key == SDLK_KP_MINUS) { |
|
|
|
|
chr = static_cast<char>(SDLK_MINUS); |
|
|
|
|
} else if (key == SDLK_KP_DIVIDE) { |
|
|
|
|
chr = static_cast<char>(SDLK_SLASH); |
|
|
|
|
} else if (key == SDLK_KP_MULTIPLY) { |
|
|
|
|
chr = static_cast<char>(SDLK_ASTERISK); |
|
|
|
|
} else if (key == SDLK_KP_COMMA) { |
|
|
|
|
chr = static_cast<char>(SDLK_COMMA); |
|
|
|
|
} else if (key == SDLK_KP_PERIOD) { |
|
|
|
|
chr = static_cast<char>(SDLK_PERIOD); |
|
|
|
|
} else if (key == SDLK_KP_ENTER) { |
|
|
|
|
chr = static_cast<char>(SDLK_RETURN); |
|
|
|
|
} else if (key == SDLK_KP_EQUALS) { |
|
|
|
|
chr = static_cast<char>(SDLK_EQUALS); |
|
|
|
|
} else { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (key >= 32) { |
|
|
|
|
LogVerbose("char: {:c}", key); |
|
|
|
|
if (isShift) { |
|
|
|
|
switch (chr) { |
|
|
|
|
case '1': |
|
|
|
|
chr = '!'; |
|
|
|
|
break; |
|
|
|
|
case '2': |
|
|
|
|
chr = '@'; |
|
|
|
|
break; |
|
|
|
|
case '3': |
|
|
|
|
chr = '#'; |
|
|
|
|
break; |
|
|
|
|
case '4': |
|
|
|
|
chr = '$'; |
|
|
|
|
break; |
|
|
|
|
case '5': |
|
|
|
|
chr = '%'; |
|
|
|
|
break; |
|
|
|
|
case '6': |
|
|
|
|
chr = '^'; |
|
|
|
|
break; |
|
|
|
|
case '7': |
|
|
|
|
chr = '&'; |
|
|
|
|
break; |
|
|
|
|
case '8': |
|
|
|
|
chr = '*'; |
|
|
|
|
break; |
|
|
|
|
case '9': |
|
|
|
|
chr = '('; |
|
|
|
|
break; |
|
|
|
|
case '0': |
|
|
|
|
chr = ')'; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// XXX: This does not add extended info to lParam
|
|
|
|
|
PostMessage(DVL_WM_CHAR, key, 0); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool GetAsyncKeyState(int vKey) |
|
|
|
|
{ |
|
|
|
|
if (vKey == DVL_MK_LBUTTON) |
|
|
|
|
return (SDL_GetMouseState(nullptr, nullptr) & SDL_BUTTON(SDL_BUTTON_LEFT)) != 0; |
|
|
|
|
if (vKey == DVL_MK_RBUTTON) |
|
|
|
|
return (SDL_GetMouseState(nullptr, nullptr) & SDL_BUTTON(SDL_BUTTON_RIGHT)) != 0; |
|
|
|
|
|
|
|
|
|
const Uint8 *state = SDLC_GetKeyState(); |
|
|
|
|
switch (vKey) { |
|
|
|
|
case DVL_VK_CONTROL: |
|
|
|
|
return state[SDLC_KEYSTATE_LEFTCTRL] != 0 || state[SDLC_KEYSTATE_RIGHTCTRL] != 0; |
|
|
|
|
case DVL_VK_SHIFT: |
|
|
|
|
return state[SDLC_KEYSTATE_LEFTSHIFT] != 0 || state[SDLC_KEYSTATE_RIGHTSHIFT] != 0; |
|
|
|
|
case DVL_VK_MENU: |
|
|
|
|
return state[SDLC_KEYSTATE_LALT] != 0 || state[SDLC_KEYSTATE_RALT] != 0; |
|
|
|
|
case DVL_VK_LEFT: |
|
|
|
|
return state[SDLC_KEYSTATE_LEFT] != 0; |
|
|
|
|
case DVL_VK_UP: |
|
|
|
|
return state[SDLC_KEYSTATE_UP] != 0; |
|
|
|
|
case DVL_VK_RIGHT: |
|
|
|
|
return state[SDLC_KEYSTATE_RIGHT] != 0; |
|
|
|
|
case DVL_VK_DOWN: |
|
|
|
|
return state[SDLC_KEYSTATE_DOWN] != 0; |
|
|
|
|
default: |
|
|
|
|
return false; |
|
|
|
|
// XXX: This does not add extended info to lParam
|
|
|
|
|
PostMessage(DVL_WM_CHAR, key, 0); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -835,11 +591,9 @@ void PushMessage(const tagMSG *lpMsg)
|
|
|
|
|
CurrentEventHandler(lpMsg->message, lpMsg->wParam, lpMsg->lParam); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool PostMessage(uint32_t type, int32_t wParam, int32_t lParam) |
|
|
|
|
void PostMessage(uint32_t type, uint32_t wParam, uint32_t lParam) |
|
|
|
|
{ |
|
|
|
|
message_queue.push_back({ type, wParam, lParam }); |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void ClearMessageQueue() |
|
|
|
|
|