win32: keyboard support

This commit is contained in:
Flyinghead 2019-02-09 16:22:09 +01:00
parent 1fcfb6b10a
commit 5ef0f74620
3 changed files with 237 additions and 42 deletions

View File

@ -346,34 +346,29 @@ void input_x11_handle()
{
if (e.type == KeyPress)
{
if (kb_used < 6)
if (kb_used < ARRAY_SIZE(kb_key))
{
bool found = false;
for (int i = 0; !found && i < 6; i++)
for (int i = 0; !found && i < kb_used; i++)
{
if (kb_key[i] == dc_keycode)
found = true;
}
if (!found)
{
kb_key[kb_used] = dc_keycode;
kb_used++;
}
kb_key[kb_used++] = dc_keycode;
}
}
else
{
if (kb_used > 0)
for (int i = 0; i < kb_used; i++)
{
for (int i = 0; i < 6; i++)
if (kb_key[i] == dc_keycode)
{
if (kb_key[i] == dc_keycode)
{
kb_used--;
for (int j = i; j < 5; j++)
kb_key[j] = kb_key[j + 1];
kb_key[5] = 0;
}
kb_used--;
for (int j = i; j < ARRAY_SIZE(kb_key) - 1; j++)
kb_key[j] = kb_key[j + 1];
kb_key[ARRAY_SIZE(kb_key) - 1] = 0;
break;
}
}
}

View File

@ -367,34 +367,29 @@ void input_sdl_handle(u32 port)
u8 dc_keycode = it->second;
if (event.type == SDL_KEYDOWN)
{
if (kb_used < 6)
if (kb_used < ARRAY_SIZE(kb_key))
{
bool found = false;
for (int i = 0; !found && i < 6; i++)
for (int i = 0; !found && i < kb_used; i++)
{
if (kb_key[i] == dc_keycode)
found = true;
}
if (!found)
{
kb_key[kb_used] = dc_keycode;
kb_used++;
}
kb_key[kb_used++] = dc_keycode;
}
}
else
{
if (kb_used > 0)
for (int i = 0; i < kb_used; i++)
{
for (int i = 0; i < 6; i++)
if (kb_key[i] == dc_keycode)
{
if (kb_key[i] == dc_keycode)
{
kb_used--;
for (int j = i; j < 5; j++)
kb_key[j] = kb_key[j + 1];
kb_key[5] = 0;
}
kb_used--;
for (int j = i; j < ARRAY_SIZE(kb_key) - 1; j++)
kb_key[j] = kb_key[j + 1];
kb_key[ARRAY_SIZE(kb_key) - 1] = 0;
break;
}
}
}

View File

@ -114,8 +114,11 @@ bool ngen_Rewrite(unat& addr,unat retadr,unat acc);
bool BM_LockedWrite(u8* address);
void UpdateController(u32 port);
static void init_kb_map();
void os_SetupInput()
{
init_kb_map();
#if DC_PLATFORM == DC_PLATFORM_DREAMCAST
mcfg_CreateDevicesFromConfig();
#endif
@ -188,15 +191,24 @@ int msgboxf(const wchar* text,unsigned int type,...)
return MessageBox(NULL,temp,VER_SHORTNAME,type | MB_TASKMODAL);
}
// Gamepads
u16 kcode[4];
u32 vks[4];
s8 joyx[4],joyy[4];
u8 rt[4],lt[4];
extern bool coin_chute;
extern bool naomi_test_button;
// Mouse
extern s32 mo_x_abs;
extern s32 mo_y_abs;
extern u32 mo_buttons;
// Keyboard
static u32 kb_used = 0;
extern u8 kb_key[6]; // normal keys pressed
extern u8 kb_shift; // shift keys pressed (bitmask)
static u8 kb_map[256];
// Used to differentiate between main enter key and num keypad one
#define VK_NUMPAD_RETURN 0x0E
#define key_CONT_C (1 << 0)
#define key_CONT_B (1 << 1)
@ -376,17 +388,77 @@ LRESULT CALLBACK WndProc2(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
case WM_RBUTTONDOWN:
case WM_RBUTTONUP:
case WM_MOUSEMOVE:
int xPos = GET_X_LPARAM(lParam);
int yPos = GET_Y_LPARAM(lParam);
mo_x_abs = (xPos - (WINDOW_WIDTH - 640 * WINDOW_HEIGHT / 480) / 2) * 480 / WINDOW_HEIGHT;
mo_y_abs = yPos * 480 / WINDOW_HEIGHT;
mo_buttons = 0xffffffff;
if (wParam & MK_LBUTTON)
mo_buttons &= ~(1 << 2);
if (wParam & MK_MBUTTON)
mo_buttons &= ~(1 << 3);
if (wParam & MK_RBUTTON)
mo_buttons &= ~(1 << 1);
{
int xPos = GET_X_LPARAM(lParam);
int yPos = GET_Y_LPARAM(lParam);
mo_x_abs = (xPos - (WINDOW_WIDTH - 640 * WINDOW_HEIGHT / 480) / 2) * 480 / WINDOW_HEIGHT;
mo_y_abs = yPos * 480 / WINDOW_HEIGHT;
mo_buttons = 0xffffffff;
if (wParam & MK_LBUTTON)
mo_buttons &= ~(1 << 2);
if (wParam & MK_MBUTTON)
mo_buttons &= ~(1 << 3);
if (wParam & MK_RBUTTON)
mo_buttons &= ~(1 << 1);
}
break;
case WM_KEYDOWN:
case WM_KEYUP:
if (wParam == VK_SHIFT)
{
if (message == WM_KEYDOWN)
kb_shift |= 0x02 | 0x20;
else
kb_shift &= ~(0x02 | 0x20);
}
else if (wParam == VK_CONTROL)
{
if (message == WM_KEYDOWN)
kb_shift |= 0x01 | 0x10;
else
kb_shift &= ~(0x01 | 0x10);
}
else
{
u8 keycode;
if (wParam == VK_RETURN && (lParam & (1 << 24) != 0))
keycode = VK_NUMPAD_RETURN;
else
keycode = wParam & 0xff;
u8 dc_keycode = kb_map[keycode];
if (dc_keycode != 0)
{
if (message == WM_KEYDOWN)
{
if (kb_used < ARRAY_SIZE(kb_key))
{
bool found = false;
for (int i = 0; !found && i < kb_used; i++)
{
if (kb_key[i] == dc_keycode)
found = true;
}
if (!found)
kb_key[kb_used++] = dc_keycode;
}
}
else
{
for (int i = 0; i < kb_used; i++)
{
if (kb_key[i] == dc_keycode)
{
kb_used--;
for (int j = i; j < ARRAY_SIZE(kb_key) - 1; j++)
kb_key[j] = kb_key[j + 1];
kb_key[ARRAY_SIZE(kb_key) - 1] = 0;
break;
}
}
}
}
}
break;
default:
@ -776,7 +848,7 @@ cThread::cThread(ThreadEntryFP* function,void* prm)
void cThread::Start()
{
hThread=CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)Entry,param,0,NULL);
hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Entry,param,0,NULL);
ResumeThread(hThread);
}
@ -848,3 +920,136 @@ void VArray2::UnLockRegion(u32 offset,u32 size)
int get_mic_data(u8* buffer) { return 0; }
int push_vmu_screen(u8* buffer) { return 0; }
static void init_kb_map()
{
//04-1D Letter keys A-Z (in alphabetic order)
kb_map['A'] = 0x04;
kb_map['B'] = 0x05;
kb_map['C'] = 0x06;
kb_map['D'] = 0x07;
kb_map['E'] = 0x08;
kb_map['F'] = 0x09;
kb_map['G'] = 0x0A;
kb_map['H'] = 0x0B;
kb_map['I'] = 0x0C;
kb_map['J'] = 0x0D;
kb_map['K'] = 0x0E;
kb_map['L'] = 0x0F;
kb_map['M'] = 0x10;
kb_map['N'] = 0x11;
kb_map['O'] = 0x12;
kb_map['P'] = 0x13;
kb_map['Q'] = 0x14;
kb_map['R'] = 0x15;
kb_map['S'] = 0x16;
kb_map['T'] = 0x17;
kb_map['U'] = 0x18;
kb_map['V'] = 0x19;
kb_map['W'] = 0x1A;
kb_map['X'] = 0x1B;
kb_map['Y'] = 0x1C;
kb_map['Z'] = 0x1D;
//1E-27 Number keys 1-0
kb_map['1'] = 0x1E;
kb_map['2'] = 0x1F;
kb_map['3'] = 0x20;
kb_map['4'] = 0x21;
kb_map['5'] = 0x22;
kb_map['6'] = 0x23;
kb_map['7'] = 0x24;
kb_map['8'] = 0x25;
kb_map['9'] = 0x26;
kb_map['0'] = 0x27;
kb_map[VK_RETURN] = 0x28;
kb_map[VK_ESCAPE] = 0x29;
kb_map[VK_BACK] = 0x2A;
kb_map[VK_TAB] = 0x2B;
kb_map[VK_SPACE] = 0x2C;
kb_map[VK_OEM_MINUS] = 0x2D; // -
kb_map[VK_OEM_PLUS] = 0x2E; // =
kb_map[VK_OEM_4] = 0x2F; // [
kb_map[VK_OEM_6] = 0x30; // ]
kb_map[VK_OEM_5] = 0x31; // \ (US) unsure of keycode
//32-34 "]", ";" and ":" (the 3 keys right of L)
kb_map[VK_OEM_8] = 0x32; // ~ (non-US) *,µ in FR layout
kb_map[VK_OEM_1] = 0x33; // ;
kb_map[VK_OEM_7] = 0x34; // '
//35 hankaku/zenkaku / kanji (top left)
kb_map[VK_OEM_3] = 0x35; // `~ (US)
//36-38 ",", "." and "/" (the 3 keys right of M)
kb_map[VK_OEM_COMMA] = 0x36;
kb_map[VK_OEM_PERIOD] = 0x37;
kb_map[VK_OEM_2] = 0x38;
// CAPSLOCK
kb_map[VK_CAPITAL] = 0x39;
//3A-45 Function keys F1-F12
for (int i = 0;i < 12; i++)
kb_map[VK_F1 + i] = 0x3A + i;
//46-4E Control keys above cursor keys
kb_map[VK_SNAPSHOT] = 0x46; // Print Screen
kb_map[VK_SCROLL] = 0x47; // Scroll Lock
kb_map[VK_PAUSE] = 0x48; // Pause
kb_map[VK_INSERT] = 0x49;
kb_map[VK_HOME] = 0x4A;
kb_map[VK_PRIOR] = 0x4B;
kb_map[VK_DELETE] = 0x4C;
kb_map[VK_END] = 0x4D;
kb_map[VK_NEXT] = 0x4E;
//4F-52 Cursor keys
kb_map[VK_RIGHT] = 0x4F;
kb_map[VK_LEFT] = 0x50;
kb_map[VK_DOWN] = 0x51;
kb_map[VK_UP] = 0x52;
//53 Num Lock (Numeric keypad)
kb_map[VK_NUMLOCK] = 0x53;
//54 "/" (Numeric keypad)
kb_map[VK_DIVIDE] = 0x54;
//55 "*" (Numeric keypad)
kb_map[VK_MULTIPLY] = 0x55;
//56 "-" (Numeric keypad)
kb_map[VK_SUBTRACT] = 0x56;
//57 "+" (Numeric keypad)
kb_map[VK_ADD] = 0x57;
//58 Enter (Numeric keypad)
kb_map[VK_NUMPAD_RETURN] = 0x58;
//59-62 Number keys 1-0 (Numeric keypad)
kb_map[VK_NUMPAD1] = 0x59;
kb_map[VK_NUMPAD2] = 0x5A;
kb_map[VK_NUMPAD3] = 0x5B;
kb_map[VK_NUMPAD4] = 0x5C;
kb_map[VK_NUMPAD5] = 0x5D;
kb_map[VK_NUMPAD6] = 0x5E;
kb_map[VK_NUMPAD7] = 0x5F;
kb_map[VK_NUMPAD8] = 0x60;
kb_map[VK_NUMPAD9] = 0x61;
kb_map[VK_NUMPAD0] = 0x62;
//63 "." (Numeric keypad)
kb_map[VK_DECIMAL] = 0x63;
//64 #| (non-US)
//kb_map[94] = 0x64;
//65 S3 key
//66-A4 Not used
//A5-DF Reserved
//E0 Left Control
//E1 Left Shift
//E2 Left Alt
//E3 Left S1
//E4 Right Control
//E5 Right Shift
//E6 Right Alt
//E7 Right S3
//E8-FF Reserved
}