117 lines
6.8 KiB
C++
117 lines
6.8 KiB
C++
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdint.h>
|
|
#define DIRECTINPUT_VERSION 0x0700
|
|
#define BITMAP WINDOWS_BITMAP
|
|
#include <dinput.h>
|
|
#undef BITMAP
|
|
#include "plat-keyboard.h"
|
|
#include "win.h"
|
|
#include "video.h"
|
|
|
|
extern "C" int key[256];
|
|
uint8_t dinput_key[256];
|
|
|
|
extern "C" void fatal(const char *format, ...);
|
|
extern "C" void pclog(const char *format, ...);
|
|
|
|
extern "C" void keyboard_init();
|
|
extern "C" void keyboard_close();
|
|
extern "C" void keyboard_poll();
|
|
|
|
LPDIRECTINPUT lpdi = NULL;
|
|
LPDIRECTINPUTDEVICE lpdi_key = NULL;
|
|
|
|
static int keyboard_lookup[256] =
|
|
{
|
|
-1, DIK_ESCAPE, DIK_1, DIK_2, DIK_3, DIK_4, DIK_5, DIK_6, /*00*/
|
|
DIK_7, DIK_8, DIK_9, DIK_0, DIK_MINUS, DIK_EQUALS, DIK_BACKSPACE, DIK_TAB, /*08*/
|
|
DIK_Q, DIK_W, DIK_E, DIK_R, DIK_T, DIK_Y, DIK_U, DIK_I, /*10*/
|
|
DIK_O, DIK_P, DIK_LBRACKET, DIK_RBRACKET, DIK_RETURN, DIK_LCONTROL, DIK_A, DIK_S, /*18*/
|
|
DIK_D, DIK_F, DIK_G, DIK_H, DIK_J, DIK_K, DIK_L, DIK_SEMICOLON,/*20*/
|
|
DIK_APOSTROPHE, DIK_GRAVE, DIK_LSHIFT, DIK_BACKSLASH, DIK_Z, DIK_X, DIK_C, DIK_V, /*28*/
|
|
DIK_B, DIK_N, DIK_M, DIK_COMMA, DIK_PERIOD, DIK_SLASH, DIK_RSHIFT, DIK_MULTIPLY, /*30*/
|
|
DIK_LMENU, DIK_SPACE, DIK_CAPSLOCK, DIK_F1, DIK_F2, DIK_F3, DIK_F4, DIK_F5, /*38*/
|
|
DIK_F6, DIK_F7, DIK_F8, DIK_F9, DIK_F10, DIK_NUMLOCK, DIK_SCROLL, DIK_NUMPAD7, /*40*/
|
|
DIK_NUMPAD8, DIK_NUMPAD9, DIK_NUMPADMINUS, DIK_NUMPAD4, DIK_NUMPAD5, DIK_NUMPAD6, DIK_NUMPADPLUS, DIK_NUMPAD1, /*48*/
|
|
DIK_NUMPAD2, DIK_NUMPAD3, DIK_NUMPAD0, DIK_DECIMAL, DIK_SYSRQ, -1, DIK_OEM_102, DIK_F11, /*50*/
|
|
DIK_F12, -1, -1, DIK_LWIN, DIK_RWIN, DIK_LMENU, -1, -1, /*58*/
|
|
-1, -1, -1, -1, -1, -1, -1, -1, /*60*/
|
|
-1, -1, -1, -1, -1, -1, -1, -1, /*68*/
|
|
-1, -1, -1, -1, -1, -1, -1, -1, /*70*/
|
|
-1, -1, -1, -1, -1, -1, -1, -1, /*78*/
|
|
|
|
-1, -1, -1, -1, -1, -1, -1, -1, /*80*/
|
|
-1, -1, -1, -1, -1, -1, -1, -1, /*88*/
|
|
-1, -1, -1, -1, -1, -1, -1, -1, /*90*/
|
|
-1, -1, -1, -1, DIK_NUMPADENTER, DIK_RCONTROL, -1, -1, /*98*/
|
|
-1, -1, -1, -1, -1, -1, -1, -1, /*a0*/
|
|
-1, -1, -1, -1, -1, -1, -1, -1, /*a8*/
|
|
-1, -1, -1, -1, -1, -1, -1, -1, /*b0*/
|
|
DIK_RMENU, -1, -1, -1, -1, -1, -1, -1, /*b8*/
|
|
-1, -1, -1, -1, -1, -1, -1, DIK_HOME, /*c0*/
|
|
DIK_UP, DIK_PRIOR, -1, DIK_LEFT, -1, DIK_RIGHT, -1, DIK_END, /*c8*/
|
|
DIK_DOWN, DIK_NEXT, DIK_INSERT, DIK_DELETE, -1, -1, -1, -1, /*d0*/
|
|
-1, -1, -1, -1, -1, -1, -1, -1, /*d8*/
|
|
-1, -1, -1, -1, -1, -1, -1, -1, /*e0*/
|
|
-1, -1, -1, -1, -1, -1, -1, -1, /*e8*/
|
|
-1, -1, -1, -1, -1, -1, -1, -1, /*f0*/
|
|
-1, -1, -1, -1, -1, -1, -1, DIK_PAUSE, /*f8*/
|
|
|
|
};
|
|
|
|
void keyboard_init()
|
|
{
|
|
atexit(keyboard_close);
|
|
|
|
if (FAILED(DirectInputCreate(hinstance, DIRECTINPUT_VERSION, &lpdi, NULL)))
|
|
fatal("install_keyboard : DirectInputCreate failed\n");
|
|
if (FAILED(lpdi->CreateDevice(GUID_SysKeyboard, &lpdi_key, NULL)))
|
|
fatal("install_keyboard : CreateDevice failed\n");
|
|
if (FAILED(lpdi_key->SetCooperativeLevel(ghwnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE)))
|
|
fatal("install_keyboard : SetCooperativeLevel failed\n");
|
|
if (FAILED(lpdi_key->SetDataFormat(&c_dfDIKeyboard)))
|
|
fatal("install_keyboard : SetDataFormat failed\n");
|
|
if (FAILED(lpdi_key->Acquire()))
|
|
fatal("install_keyboard : Acquire failed\n");
|
|
|
|
memset(key, 0, sizeof(key));
|
|
}
|
|
|
|
void keyboard_close()
|
|
{
|
|
if (lpdi_key)
|
|
{
|
|
lpdi_key->Release();
|
|
lpdi_key = NULL;
|
|
}
|
|
if (lpdi)
|
|
{
|
|
lpdi->Release();
|
|
lpdi = NULL;
|
|
}
|
|
}
|
|
|
|
void keyboard_poll_host()
|
|
{
|
|
int c;
|
|
if (FAILED(lpdi_key->GetDeviceState(256, (LPVOID)dinput_key)))
|
|
{
|
|
lpdi_key->Acquire();
|
|
lpdi_key->GetDeviceState(256, (LPVOID)dinput_key);
|
|
}
|
|
for (c = 0; c < 256; c++)
|
|
{
|
|
// if (dinput_key[c] & 0x80) pclog("Dinput key down %i %02X\n", c, c);
|
|
if (keyboard_lookup[c] != -1)
|
|
{
|
|
key[c] = dinput_key[keyboard_lookup[c]] & 0x80;
|
|
// if (key[c]) pclog("Key down %i %02X %i %02X\n", c, c, keyboard_lookup[c], keyboard_lookup[c]);
|
|
}
|
|
}
|
|
if (((dinput_key[DIK_LCONTROL] | dinput_key[DIK_RCONTROL]) & 0x80) &&
|
|
((dinput_key[DIK_LMENU] | dinput_key[DIK_RMENU]) & 0x80) &&
|
|
(dinput_key[DIK_NEXT] & 0x80) &&
|
|
video_fullscreen)
|
|
leave_fullscreen();
|
|
}
|