4coder-non-source/test_data/lots_of_files/lang_raw_input.cpp

158 lines
3.5 KiB
C++
Raw Normal View History

2023-09-30 01:17:40 +00:00
/*
* Experiments with language/layout stuff for win32.
* 04.01.2016 (dd.mm.yyyy)
* Allen Webster
*/
// TOP
#include <Windows.h>
struct Win32Vars{
int keep_playing;
int controls[3];
} win32;
LRESULT WinCallback(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
){
LRESULT result = 0;
switch(uMsg){
case WM_QUIT:
case WM_DESTROY:
{
win32.keep_playing = 0;
}break;
case WM_SYSKEYDOWN:
case WM_SYSKEYUP:
case WM_KEYUP:
case WM_KEYDOWN:
{
switch (wParam){
case VK_SHIFT:case VK_LSHIFT:case VK_RSHIFT:
case VK_CONTROL:case VK_LCONTROL:case VK_RCONTROL:
case VK_MENU:case VK_LMENU:case VK_RMENU:
break;
default:
{
UINT vk = (UINT)wParam;
UINT scan = (UINT)((lParam >> 16) & 0x7F);
BYTE bytes[256];
WORD x;
memset(bytes, 0, 256);
GetKeyboardState(bytes);
ToAscii(vk, scan, bytes, &x, 0);
int a = 0, b = 1, c = 2;
a = x&1 + c;
b *= a + x;
}break;
}
}break;
case WM_SETFOCUS:
{
win32.controls[0] = 0;
win32.controls[1] = 0;
win32.controls[2] = 0;
}break;
case WM_INPUT:
{
char buffer[sizeof(RAWINPUT)] = {};
UINT size = sizeof(RAWINPUT);
GetRawInputData((HRAWINPUT)(lParam), RID_INPUT, buffer, &size, sizeof(RAWINPUTHEADER));
RAWINPUT *rawinput = (RAWINPUT*)(buffer);
if (rawinput->header.dwType == RIM_TYPEKEYBOARD){
RAWKEYBOARD *raw = &rawinput->data.keyboard;
UINT vk = raw->VKey;
UINT flags = raw->Flags;
UINT down = !(flags & 1);
if (vk != 255){
if (vk == VK_SHIFT){
win32.controls[0] = down;
}
else if (vk == VK_CONTROL){
win32.controls[1] = down;
}
else if (vk == VK_MENU){
win32.controls[2] = down;
}
}
}
result = DefWindowProcA(hwnd, uMsg, wParam, lParam);
}break;
default:
{
result = DefWindowProcA(hwnd, uMsg, wParam, lParam);
}break;
}
return(result);
}
int WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
){
WNDCLASS winclass = {};
winclass.style = CS_HREDRAW | CS_VREDRAW;
winclass.lpfnWndProc = WinCallback;
winclass.hInstance = hInstance;
winclass.lpszClassName = "lang-test-class";
ATOM winclassatom = RegisterClassA(&winclass);
if (winclassatom == 0){
return(1);
}
HWND window = CreateWindowA(
"lang-test-class",
"lang test window",
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
CW_USEDEFAULT,
CW_USEDEFAULT,
400,
400,
0,
0,
hInstance,
0);
if (window == 0){
return(2);
}
RAWINPUTDEVICE device;
device.usUsagePage = 0x1;
device.usUsage = 0x6;
device.dwFlags = 0;
device.hwndTarget = window;
RegisterRawInputDevices(&device, 1, sizeof(device));
ShowWindow(window, SW_SHOW);
for (win32.keep_playing = 1; win32.keep_playing;){
MSG msg;
GetMessage(&msg, 0, 0, 0);
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return(0);
}
// BOTTOM