Skip to content
Snippets Groups Projects
Commit 38e7a398 authored by Deucе's avatar Deucе :ok_hand_tone4:
Browse files

Add the worlds worst input processing

Also, get SyncTERM to stop displaying (null) as the mode.

Video is very slow in the menus, and the input appears to repeat
forever when connected (but *not* in the menus), but it's something
at least.
parent c381f2f7
No related branches found
No related tags found
1 merge request!463MRC mods by Codefenix (2024-10-20)
Pipeline #4143 failed
......@@ -28,14 +28,6 @@
#include "vidmodes.h"
#include "win32cio.h"
struct keyvals {
int VirtualKeyCode
,Key
,Shift
,CTRL
,ALT;
};
CIOLIBEXPORTVAR const struct keyvals keyval[] =
{
{VK_BACK, 0x08, 0x08, 0x7f, 0x0e00},
......
......@@ -34,6 +34,14 @@
#ifndef _WIN32CIO_H_
#define _WIN32CIO_H_
struct keyvals {
int VirtualKeyCode
,Key
,Shift
,CTRL
,ALT;
};
#ifdef __cplusplus
extern "C" {
#endif
......@@ -61,6 +69,7 @@ void win32_setcustomcursor(int s, int e, int r, int b, int v);
int win32_getvideoflags(void);
int win32_setpalette(uint32_t entry, uint16_t r, uint16_t g, uint16_t b);
extern const struct keyvals keyval[];
#ifdef __cplusplus
}
#endif
......
#include <windows.h>
#include <stdbool.h>
#include <stdio.h>
#define BITMAP_CIOLIB_DRIVER
#include "win32gdi.h"
#include "bitmap_con.h"
#include "win32cio.h"
#include "scale.h"
HBITMAP bmp;
HWND win;
FILE *debug;
HANDLE rch;
HANDLE wch;
......@@ -43,22 +44,43 @@ static void
add_key(uint16_t key)
{
uint8_t buf[2];
uint8_t *bp = buf;
DWORD added;
DWORD remain = sizeof(buf);
buf[0] = key & 0xff;
buf[1] = key >> 8;
DWORD remain;
if (key < 256) {
buf[0] = key;
remain = 1;
}
else {
buf[0] = key & 0xff;
buf[1] = key >> 8;
remain = 2;
}
do {
WriteFile(wch, buf, remain, &added, NULL);
WriteFile(wch, bp, remain, &added, NULL);
remain -= added;
bp += added;
} while (remain > 0);
}
static uint32_t
sp_to_codepoint(uint16_t high, uint16_t low)
{
return (high - 0xd800) * 0x400 + (low - 0xdc00) + 0x10000;
}
static LRESULT CALLBACK
gdi_WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
PAINTSTRUCT ps;
HBITMAP obmp;
HDC memDC;
HDC winDC;
WPARAM highpair;
uint32_t cp;
uint8_t ch;
uint16_t repeat;
uint16_t i;
bool alt;
switch(msg) {
case WM_PAINT:
......@@ -78,6 +100,26 @@ gdi_WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_CHAR:
repeat = lParam & 0xffff;
alt = lParam & (1 << 29);
if (IS_HIGH_SURROGATE(wParam)) {
highpair = wParam;
return 0;
}
else if (IS_LOW_SURROGATE(wParam)) {
cp = sp_to_codepoint(highpair, wParam);
}
else {
cp = wParam;
}
// Translate from unicode to codepage...
ch = cpchar_from_unicode_cpoint(getcodepage(), cp, 0);
if (ch) {
for (i = 0; i < repeat; i++)
add_key(ch);
}
return 0;
}
return DefWindowProcW(hwnd, msg, wParam, lParam);
......@@ -101,6 +143,88 @@ setup_bitmaps(void)
b5hdr.bV5SizeImage = b5hdr.bV5Width * b5hdr.bV5Height * 4;
}
#define WMOD_CTRL 1
#define WMOD_LCTRL 2
#define WMOD_RCTRL 4
#define WMOD_SHIFT 8
#define WMOD_LSHIFT 16
#define WMOD_RSHIFT 32
bool
magic_message(MSG msg)
{
static uint8_t mods = 0;
size_t i;
uint8_t set = 0;
int *hack;
// TODO: When window gets focus, poll mods... *sigh*
// TODO: Check "extended" for RCTRL and RSHIFT
if (msg.message == WM_KEYDOWN || msg.message == WM_KEYUP || msg.message == WM_SYSKEYDOWN || msg.message == WM_SYSKEYUP) {
switch (msg.wParam) {
case VK_CONTROL:
set = WMOD_CTRL;
break;
case VK_LCONTROL:
set = WMOD_LCTRL;
break;
case VK_RCONTROL:
set = WMOD_RCTRL;
break;
case VK_SHIFT:
set = WMOD_SHIFT;
break;
case VK_LSHIFT:
set = WMOD_LSHIFT;
break;
case VK_RSHIFT:
set = WMOD_RSHIFT;
break;
}
if (set) {
if (msg.message == WM_KEYDOWN || msg.message == WM_SYSKEYDOWN)
mods |= set;
else
mods &= ~set;
return false;
}
if (msg.message == WM_KEYUP)
return false;
while (keyval[i].VirtualKeyCode != 0) {
if (keyval[i].VirtualKeyCode == msg.wParam)
break;
i++;
}
if (keyval[i].VirtualKeyCode != 0) {
if (msg.lParam & (0x2000)) {
if (keyval[i].ALT > 255) {
add_key(keyval[i].ALT);
return true;
}
}
else if (mods & (WMOD_CTRL | WMOD_LCTRL | WMOD_RCTRL)) {
if (keyval[i].CTRL > 255) {
add_key(keyval[i].CTRL);
return true;
}
}
else if (mods & (WMOD_SHIFT | WMOD_LSHIFT | WMOD_RSHIFT)) {
if (keyval[i].Shift > 255) {
add_key(keyval[i].Shift);
return true;
}
}
else {
if (keyval[i].Key > 255) {
add_key(keyval[i].Key);
return true;
}
}
}
}
return false;
}
static void
gdi_thread(void *arg)
{
......@@ -131,8 +255,10 @@ gdi_thread(void *arg)
win = CreateWindowW(wc.lpszClassName, L"SyncTERM", WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, r.right - r.left, r.bottom - r.top, NULL, NULL, wc.hInstance, NULL);
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
if (!magic_message(msg)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
// This may not be necessary...
DestroyWindow(win);
......@@ -254,8 +380,6 @@ gdi_get_window_info(int *width, int *height, int *xpos, int *ypos)
int
gdi_init(int mode)
{
pthread_mutex_init(&gdi_headlock, NULL);
pthread_mutex_init(&bmp_lock, NULL);
CreatePipe(&rch, &wch, NULL, 0);
bitmap_drv_init(gdi_drawrect, gdi_flush);
......@@ -272,7 +396,6 @@ gdi_init(int mode)
int
gdi_initciolib(int mode)
{
debug = fopen("gdi.log", "w");
pthread_mutex_init(&gdi_headlock, NULL);
pthread_mutex_init(&bmp_lock, NULL);
......@@ -319,9 +442,6 @@ gdi_flush(void)
pthread_mutex_lock(&bmp_lock);
obmp2 = SelectObject(mDC2, bmp);
BitBlt(mDC2, list->rect.x, list->rect.y, list->rect.width, list->rect.height, mDC1, 0, 0, SRCCOPY);
//pthread_mutex_lock(&vstatlock);
//StretchBlt(mDC2, 0, 0, vstat.winwidth, vstat.winheight, mDC1, 0, 0, vstat.scrnwidth, vstat.scrnheight, SRCCOPY);
//pthread_mutex_unlock(&vstatlock);
SelectObject(mDC1, obmp1);
SelectObject(mDC2, obmp2);
pthread_mutex_unlock(&bmp_lock);
......
......@@ -759,6 +759,9 @@ char *output_types[] = {
#if defined(WITH_SDL) || defined(WITH_SDL_AUDIO)
, "SDL",
"SDL Fullscreen"
#endif
#if defined(WITH_GDI)
, "GDI"
#endif
, NULL
};
......@@ -780,6 +783,10 @@ int output_map[] = {
#if defined(WITH_SDL) || defined(WITH_SDL_AUDIO)
, CIOLIB_MODE_SDL,
CIOLIB_MODE_SDL_FULLSCREEN
#endif
#ifdef WITH_GDI
, CIOLIB_MODE_GDI,
CIOLIB_MODE_GDI
#endif
, 0
};
......@@ -794,6 +801,7 @@ char *output_descrs[] = {
"Win32 Console Fullscreen",
"SDL",
"SDL Fullscreen",
"GDI",
NULL
};
......@@ -808,6 +816,7 @@ char *output_enum[] = {
"WinConsoleFullscreen",
"SDL",
"SDLFullscreen",
"GDI",
NULL
};
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment