436 lines
11 KiB
C
436 lines
11 KiB
C
#include <windows.h>
|
|
#include "SYSDEPNS.h"
|
|
#include "CNFGGLOB.h"
|
|
#include "CNFGRAPI.h"
|
|
#include "HW/KBRD/KEYCODES.h"
|
|
#include "UI/COMOSGLU.h"
|
|
#include "UI/WIN32/OSGLUWIN.h"
|
|
#include "UI/CONTROLM.h"
|
|
#include "UTIL/ENDIANAC.h"
|
|
|
|
/* keyboard */
|
|
|
|
static uint8_t WinKey2Mac[256];
|
|
|
|
static inline void AssignOneMacKey(uint8_t WinKey, uint8_t MacKey)
|
|
{
|
|
WinKey2Mac[WinKey] = MacKey;
|
|
}
|
|
|
|
bool InitWinKey2Mac(void)
|
|
{
|
|
memset(WinKey2Mac, MKC_None, sizeof(WinKey2Mac));
|
|
|
|
AssignOneMacKey('A', MKC_A);
|
|
AssignOneMacKey('S', MKC_S);
|
|
AssignOneMacKey('D', MKC_D);
|
|
AssignOneMacKey('F', MKC_F);
|
|
AssignOneMacKey('H', MKC_H);
|
|
AssignOneMacKey('G', MKC_G);
|
|
AssignOneMacKey('Z', MKC_Z);
|
|
AssignOneMacKey('X', MKC_X);
|
|
AssignOneMacKey('C', MKC_C);
|
|
AssignOneMacKey('V', MKC_V);
|
|
AssignOneMacKey('B', MKC_B);
|
|
AssignOneMacKey('Q', MKC_Q);
|
|
AssignOneMacKey('W', MKC_W);
|
|
AssignOneMacKey('E', MKC_E);
|
|
AssignOneMacKey('R', MKC_R);
|
|
AssignOneMacKey('Y', MKC_Y);
|
|
AssignOneMacKey('T', MKC_T);
|
|
AssignOneMacKey('1', MKC_1);
|
|
AssignOneMacKey('2', MKC_2);
|
|
AssignOneMacKey('3', MKC_3);
|
|
AssignOneMacKey('4', MKC_4);
|
|
AssignOneMacKey('6', MKC_6);
|
|
AssignOneMacKey('5', MKC_5);
|
|
AssignOneMacKey(myVK_Equal, MKC_Equal);
|
|
AssignOneMacKey('9', MKC_9);
|
|
AssignOneMacKey('7', MKC_7);
|
|
AssignOneMacKey(myVK_Subtract, MKC_Minus);
|
|
AssignOneMacKey('8', MKC_8);
|
|
AssignOneMacKey('0', MKC_0);
|
|
AssignOneMacKey(myVK_RightBracket, MKC_RightBracket);
|
|
AssignOneMacKey('O', MKC_O);
|
|
AssignOneMacKey('U', MKC_U);
|
|
AssignOneMacKey(myVK_LeftBracket, MKC_LeftBracket);
|
|
AssignOneMacKey('I', MKC_I);
|
|
AssignOneMacKey('P', MKC_P);
|
|
AssignOneMacKey(VK_RETURN, MKC_Return);
|
|
AssignOneMacKey('L', MKC_L);
|
|
AssignOneMacKey('J', MKC_J);
|
|
AssignOneMacKey(myVK_SingleQuote, MKC_SingleQuote);
|
|
AssignOneMacKey('K', MKC_K);
|
|
AssignOneMacKey(myVK_SemiColon, MKC_SemiColon);
|
|
AssignOneMacKey(myVK_BackSlash, MKC_formac_BackSlash);
|
|
AssignOneMacKey(myVK_Comma, MKC_Comma);
|
|
AssignOneMacKey(myVK_Slash, MKC_formac_Slash);
|
|
AssignOneMacKey('N', MKC_N);
|
|
AssignOneMacKey('M', MKC_M);
|
|
AssignOneMacKey(myVK_Period, MKC_Period);
|
|
|
|
AssignOneMacKey(VK_TAB, MKC_Tab);
|
|
AssignOneMacKey(VK_SPACE, MKC_Space);
|
|
AssignOneMacKey(myVK_Grave, MKC_formac_Grave);
|
|
AssignOneMacKey(VK_BACK, MKC_BackSpace);
|
|
AssignOneMacKey(VK_ESCAPE, MKC_formac_Escape);
|
|
|
|
AssignOneMacKey(VK_MENU, MKC_formac_Command);
|
|
|
|
AssignOneMacKey(VK_LMENU, MKC_formac_Command);
|
|
|
|
AssignOneMacKey(VK_RMENU, MKC_formac_RCommand);
|
|
|
|
AssignOneMacKey(VK_SHIFT, MKC_formac_Shift);
|
|
AssignOneMacKey(VK_LSHIFT, MKC_formac_Shift);
|
|
AssignOneMacKey(VK_RSHIFT, MKC_formac_RShift);
|
|
|
|
AssignOneMacKey(VK_CAPITAL, MKC_formac_CapsLock);
|
|
|
|
AssignOneMacKey(VK_APPS, MKC_formac_ROption);
|
|
AssignOneMacKey(VK_LWIN, MKC_formac_Option);
|
|
AssignOneMacKey(VK_RWIN, MKC_formac_ROption);
|
|
AssignOneMacKey(VK_CONTROL, MKC_formac_Control);
|
|
AssignOneMacKey(VK_LCONTROL, MKC_formac_Control);
|
|
AssignOneMacKey(VK_RCONTROL, MKC_formac_RControl);
|
|
|
|
AssignOneMacKey(VK_F1, MKC_formac_F1);
|
|
AssignOneMacKey(VK_F2, MKC_formac_F2);
|
|
AssignOneMacKey(VK_F3, MKC_formac_F3);
|
|
AssignOneMacKey(VK_F4, MKC_formac_F4);
|
|
AssignOneMacKey(VK_F5, MKC_formac_F5);
|
|
AssignOneMacKey(VK_F6, MKC_F6);
|
|
AssignOneMacKey(VK_F7, MKC_F7);
|
|
AssignOneMacKey(VK_F8, MKC_F8);
|
|
AssignOneMacKey(VK_F9, MKC_F9);
|
|
AssignOneMacKey(VK_F10, MKC_F10);
|
|
AssignOneMacKey(VK_F11, MKC_F11);
|
|
AssignOneMacKey(VK_F12, MKC_F12);
|
|
|
|
AssignOneMacKey(VK_DECIMAL, MKC_Decimal);
|
|
AssignOneMacKey(VK_DELETE, MKC_Decimal);
|
|
/* AssignOneMacKey(VK_RIGHT, 0x42); */
|
|
AssignOneMacKey(VK_MULTIPLY, MKC_KPMultiply);
|
|
AssignOneMacKey(VK_ADD, MKC_KPAdd);
|
|
/* AssignOneMacKey(VK_LEFT, 0x46); */
|
|
AssignOneMacKey(VK_NUMLOCK, MKC_Clear);
|
|
|
|
/* AssignOneMacKey(VK_DOWN, 0x48); */
|
|
AssignOneMacKey(VK_DIVIDE, MKC_KPDevide);
|
|
/* AssignOneMacKey(VK_RETURN, MKC_formac_Enter); */
|
|
/* AssignOneMacKey(VK_UP, 0x4D); */
|
|
AssignOneMacKey(VK_DIVIDE, MKC_KPDevide);
|
|
AssignOneMacKey(VK_SUBTRACT, MKC_KPSubtract);
|
|
|
|
AssignOneMacKey(VK_SEPARATOR, MKC_KPEqual);
|
|
AssignOneMacKey(VK_NUMPAD0, MKC_KP0);
|
|
AssignOneMacKey(VK_NUMPAD1, MKC_KP1);
|
|
AssignOneMacKey(VK_NUMPAD2, MKC_KP2);
|
|
AssignOneMacKey(VK_NUMPAD3, MKC_KP3);
|
|
AssignOneMacKey(VK_NUMPAD4, MKC_KP4);
|
|
AssignOneMacKey(VK_NUMPAD5, MKC_KP5);
|
|
|
|
AssignOneMacKey(VK_NUMPAD6, MKC_KP6);
|
|
AssignOneMacKey(VK_NUMPAD7, MKC_KP7);
|
|
AssignOneMacKey(VK_NUMPAD8, MKC_KP8);
|
|
AssignOneMacKey(VK_NUMPAD9, MKC_KP9);
|
|
|
|
AssignOneMacKey(VK_LEFT, MKC_Left);
|
|
AssignOneMacKey(VK_RIGHT, MKC_Right);
|
|
AssignOneMacKey(VK_DOWN, MKC_Down);
|
|
AssignOneMacKey(VK_UP, MKC_Up);
|
|
|
|
AssignOneMacKey(myVK_PRIOR, MKC_formac_PageUp);
|
|
AssignOneMacKey(myVK_NEXT, MKC_formac_PageDown);
|
|
AssignOneMacKey(myVK_END, MKC_formac_End);
|
|
AssignOneMacKey(myVK_HOME, MKC_formac_Home);
|
|
AssignOneMacKey(myVK_INSERT, MKC_formac_Help);
|
|
AssignOneMacKey(myVK_DELETE, MKC_formac_ForwardDel);
|
|
AssignOneMacKey(myVK_HELP, MKC_formac_Help);
|
|
AssignOneMacKey(myVK_SNAPSHOT, MKC_Print);
|
|
AssignOneMacKey(myVK_SCROLL, MKC_ScrollLock);
|
|
AssignOneMacKey(myVK_PAUSE, MKC_Pause);
|
|
|
|
AssignOneMacKey(myVK_OEM_102, MKC_AngleBracket);
|
|
|
|
InitKeyCodes();
|
|
|
|
#if ItnlKyBdFix
|
|
InitCheckKeyboardLayout();
|
|
#endif
|
|
|
|
return true;
|
|
}
|
|
|
|
LOCALPROC DoKeyCode(int i, bool down)
|
|
{
|
|
uint8_t key = WinKey2Mac[ItnlKyBdFix ? VkMapA[i] : i];
|
|
if (MKC_None != key) {
|
|
Keyboard_UpdateKeyMap2(key, down);
|
|
}
|
|
}
|
|
|
|
#if EnableGrabSpecialKeys
|
|
LOCALVAR bool HaveSetSysParam = false;
|
|
#endif
|
|
|
|
LOCALPROC CheckTheCapsLock(void)
|
|
{
|
|
DoKeyCode(VK_CAPITAL, (GetKeyState(VK_CAPITAL) & 1) != 0);
|
|
}
|
|
|
|
#if EnableGrabSpecialKeys
|
|
LOCALVAR bool VK_LWIN_pressed = false;
|
|
LOCALVAR bool VK_RWIN_pressed = false;
|
|
|
|
void CheckForLostKeyUps(void)
|
|
{
|
|
if (HaveSetSysParam) {
|
|
/* check for lost key ups */
|
|
if (VK_LWIN_pressed) {
|
|
if ((GetAsyncKeyState(VK_LWIN) & 0x8000) == 0) {
|
|
DoKeyCode(VK_LWIN, false);
|
|
VK_LWIN_pressed = false;
|
|
}
|
|
}
|
|
if (VK_RWIN_pressed) {
|
|
if ((GetAsyncKeyState(VK_RWIN) & 0x8000) == 0) {
|
|
DoKeyCode(VK_RWIN, false);
|
|
VK_RWIN_pressed = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
LOCALPROC DoVKcode0(int i, bool down)
|
|
{
|
|
#if EnableGrabSpecialKeys
|
|
if (HaveSetSysParam) {
|
|
/* will need to check for lost key ups */
|
|
if (VK_LWIN == i) {
|
|
VK_LWIN_pressed = down;
|
|
} else if (VK_RWIN == i) {
|
|
VK_RWIN_pressed = down;
|
|
}
|
|
}
|
|
#endif
|
|
DoKeyCode(i, down);
|
|
}
|
|
|
|
void DoVKcode(int i, uint8_t flags, bool down)
|
|
{
|
|
switch (i) {
|
|
#if MKC_formac_Control != MKC_formac_RControl
|
|
case VK_CONTROL:
|
|
Keyboard_UpdateKeyMap2(TestBit(flags, 0)
|
|
? MKC_formac_RControl : MKC_formac_Control,
|
|
down);
|
|
break;
|
|
#endif
|
|
#if MKC_formac_RCommand != MKC_formac_Command
|
|
case VK_MENU:
|
|
Keyboard_UpdateKeyMap2(TestBit(flags, 0)
|
|
? MKC_formac_RCommand : MKC_formac_Command,
|
|
down);
|
|
break;
|
|
#endif
|
|
case VK_RETURN:
|
|
Keyboard_UpdateKeyMap2(TestBit(flags, 0)
|
|
? MKC_formac_Enter : MKC_Return,
|
|
down);
|
|
break;
|
|
case myVK_HOME:
|
|
Keyboard_UpdateKeyMap2(TestBit(flags, 0)
|
|
? MKC_formac_Home : MKC_KP7,
|
|
down);
|
|
break;
|
|
case VK_UP:
|
|
Keyboard_UpdateKeyMap2(TestBit(flags, 0)
|
|
? MKC_Up : MKC_KP8,
|
|
down);
|
|
break;
|
|
case myVK_PRIOR:
|
|
Keyboard_UpdateKeyMap2(TestBit(flags, 0)
|
|
? MKC_formac_PageUp : MKC_KP9,
|
|
down);
|
|
break;
|
|
case VK_LEFT:
|
|
Keyboard_UpdateKeyMap2(TestBit(flags, 0)
|
|
? MKC_Left : MKC_KP4,
|
|
down);
|
|
break;
|
|
case myVK_CLEAR:
|
|
Keyboard_UpdateKeyMap2(TestBit(flags, 0)
|
|
? MKC_Clear : MKC_KP5,
|
|
down);
|
|
break;
|
|
case VK_RIGHT:
|
|
Keyboard_UpdateKeyMap2(TestBit(flags, 0)
|
|
? MKC_Right : MKC_KP6,
|
|
down);
|
|
break;
|
|
case myVK_END:
|
|
Keyboard_UpdateKeyMap2(TestBit(flags, 0)
|
|
? MKC_formac_End : MKC_KP1,
|
|
down);
|
|
break;
|
|
case VK_DOWN:
|
|
Keyboard_UpdateKeyMap2(TestBit(flags, 0)
|
|
? MKC_Down : MKC_KP2,
|
|
down);
|
|
break;
|
|
case myVK_NEXT:
|
|
Keyboard_UpdateKeyMap2(TestBit(flags, 0)
|
|
? MKC_formac_PageDown : MKC_KP3,
|
|
down);
|
|
break;
|
|
case myVK_INSERT:
|
|
Keyboard_UpdateKeyMap2(TestBit(flags, 0)
|
|
? MKC_formac_Help : MKC_KP0,
|
|
down);
|
|
break;
|
|
case myVK_DELETE:
|
|
Keyboard_UpdateKeyMap2(TestBit(flags, 0)
|
|
? MKC_formac_ForwardDel : MKC_Decimal,
|
|
down);
|
|
break;
|
|
case VK_CAPITAL:
|
|
CheckTheCapsLock();
|
|
break;
|
|
default:
|
|
if ((i >= 0) && (i < 256)) {
|
|
DoVKcode0(i, down);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
bool WantCmdOptOnReconnect = false;
|
|
|
|
void ReconnectKeyCodes3(void)
|
|
{
|
|
int i;
|
|
|
|
CheckTheCapsLock();
|
|
|
|
if (WantCmdOptOnReconnect) {
|
|
WantCmdOptOnReconnect = false;
|
|
|
|
for (i = 0; i < 256; ++i) {
|
|
if ((GetKeyState(i) & 0x8000) != 0) {
|
|
if ((VK_CAPITAL != i)
|
|
&& (VK_RETURN != i))
|
|
{
|
|
DoVKcode0(i, true);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void DisconnectKeyCodes3(void)
|
|
{
|
|
DisconnectKeyCodes2();
|
|
SetCurMouseButton(false);
|
|
}
|
|
|
|
#if EnableGrabSpecialKeys
|
|
static HHOOK hKeyHook = NULL;
|
|
#endif
|
|
|
|
#if EnableGrabSpecialKeys
|
|
typedef struct {
|
|
DWORD vkCode;
|
|
DWORD scanCode;
|
|
DWORD flags;
|
|
DWORD time;
|
|
DWORD dwExtraInfo;
|
|
} _KBDLLHOOKSTRUCT;
|
|
#endif
|
|
|
|
#if EnableGrabSpecialKeys
|
|
LRESULT CALLBACK LowLevelKeyboardProc(
|
|
int nCode, /* hook code */
|
|
WPARAM wParam, /* message identifier */
|
|
LPARAM lParam /* pointer to structure with message data */
|
|
);
|
|
#endif
|
|
|
|
#if EnableGrabSpecialKeys
|
|
LRESULT CALLBACK LowLevelKeyboardProc(
|
|
int nCode, /* hook code */
|
|
WPARAM wParam, /* message identifier */
|
|
LPARAM lParam /* pointer to structure with message data */
|
|
)
|
|
{
|
|
if (nCode == HC_ACTION) {
|
|
_KBDLLHOOKSTRUCT *p = (_KBDLLHOOKSTRUCT *)lParam;
|
|
if (p->vkCode != VK_CAPITAL) {
|
|
switch (wParam) {
|
|
case WM_KEYDOWN:
|
|
case WM_SYSKEYDOWN:
|
|
DoVKcode(p->vkCode, p->flags, true);
|
|
return 1;
|
|
break;
|
|
case WM_KEYUP:
|
|
case WM_SYSKEYUP:
|
|
DoVKcode(p->vkCode, p->flags, false);
|
|
return 1;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return CallNextHookEx(hKeyHook, /* handle to current hook */
|
|
nCode, /* hook code passed to hook procedure */
|
|
wParam, /* value passed to hook procedure */
|
|
lParam /* value passed to hook procedure */
|
|
);
|
|
|
|
}
|
|
#endif
|
|
|
|
#if EnableGrabSpecialKeys
|
|
#define _WH_KEYBOARD_LL 13
|
|
#define _SPI_SETSCREENSAVERRUNNING 0x0061
|
|
#endif
|
|
|
|
#if EnableGrabSpecialKeys
|
|
LOCALVAR UINT nPreviousState;
|
|
#endif
|
|
|
|
#if EnableGrabSpecialKeys
|
|
void GrabSpecialKeys(void)
|
|
{
|
|
if ((hKeyHook == NULL) && ! HaveSetSysParam) {
|
|
/* this works on Windows XP */
|
|
hKeyHook = SetWindowsHookEx(
|
|
_WH_KEYBOARD_LL, /* type of hook to install */
|
|
(HOOKPROC)LowLevelKeyboardProc,
|
|
/* address of hook procedure */
|
|
AppInstance, /* handle to application instance */
|
|
0 /* identity of thread to install hook for */
|
|
);
|
|
if (hKeyHook == NULL) {
|
|
/* this works on Windows 95/98 */
|
|
SystemParametersInfo(_SPI_SETSCREENSAVERRUNNING, TRUE,
|
|
&nPreviousState, 0);
|
|
HaveSetSysParam = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
void UnGrabSpecialKeys(void)
|
|
{
|
|
if (hKeyHook != NULL) {
|
|
(void) UnhookWindowsHookEx(hKeyHook);
|
|
hKeyHook = NULL;
|
|
}
|
|
if (HaveSetSysParam) {
|
|
SystemParametersInfo(_SPI_SETSCREENSAVERRUNNING, FALSE,
|
|
&nPreviousState, 0);
|
|
HaveSetSysParam = false;
|
|
}
|
|
}
|
|
#endif
|