Keyboard/mouse event proc thunk creation moved out of if1632/thunk.c.
diff --git a/windows/keyboard.c b/windows/keyboard.c index 9b6a3c6..946c986 100644 --- a/windows/keyboard.c +++ b/windows/keyboard.c
@@ -19,7 +19,8 @@ #include "heap.h" #include "keyboard.h" #include "message.h" -#include "debugtools.h" +#include "callback.h" +#include "builtin16.h" #include "debugtools.h" #include "struct32.h" #include "winerror.h" @@ -55,6 +56,8 @@ LPBYTE lpKeyState ) { static BOOL initDone = FALSE; + + THUNK_Free( (FARPROC)DefKeybEventProc ); DefKeybEventProc = lpKeybEventProc; pKeyStateTable = lpKeyState; @@ -66,11 +69,40 @@ initDone = TRUE; } +static VOID WINAPI KEYBOARD_CallKeybdEventProc( FARPROC16 proc, + BYTE bVk, BYTE bScan, + DWORD dwFlags, DWORD dwExtraInfo ) +{ + CONTEXT86 context; + + memset( &context, 0, sizeof(context) ); + CS_reg(&context) = SELECTOROF( proc ); + EIP_reg(&context) = OFFSETOF( proc ); + AH_reg(&context) = (dwFlags & KEYEVENTF_KEYUP)? 0x80 : 0; + AL_reg(&context) = bVk; + BH_reg(&context) = (dwFlags & KEYEVENTF_EXTENDEDKEY)? 1 : 0; + BL_reg(&context) = bScan; + SI_reg(&context) = LOWORD( dwExtraInfo ); + DI_reg(&context) = HIWORD( dwExtraInfo ); + + CallTo16RegisterShort( &context, 0 ); +} + +VOID WINAPI WIN16_KEYBOARD_Enable( FARPROC16 proc, LPBYTE lpKeyState ) +{ + LPKEYBD_EVENT_PROC thunk = + (LPKEYBD_EVENT_PROC)THUNK_Alloc( proc, (RELAY)KEYBOARD_CallKeybdEventProc ); + + KEYBOARD_Enable( thunk, lpKeyState ); +} + /*********************************************************************** * KEYBOARD_Disable (KEYBOARD.3) */ VOID WINAPI KEYBOARD_Disable(VOID) { + THUNK_Free( (FARPROC)DefKeybEventProc ); + DefKeybEventProc = NULL; pKeyStateTable = NULL; }