Keyboard/mouse event proc thunk creation moved out of if1632/thunk.c.

diff --git a/windows/mouse.c b/windows/mouse.c
index 9355e56..3089a19 100644
--- a/windows/mouse.c
+++ b/windows/mouse.c
@@ -5,7 +5,11 @@
  * 
  */
 
+#include <string.h>
+
 #include "debugtools.h"
+#include "callback.h"
+#include "builtin16.h"
 #include "mouse.h"
 #include "monitor.h"
 #include "winuser.h"
@@ -42,14 +46,43 @@
  */
 VOID WINAPI MOUSE_Enable(LPMOUSE_EVENT_PROC lpMouseEventProc)
 {
+    THUNK_Free( (FARPROC)DefMouseEventProc );
     DefMouseEventProc = lpMouseEventProc;
 }
 
+static VOID WINAPI MOUSE_CallMouseEventProc( FARPROC16 proc,
+                                             DWORD dwFlags, DWORD dx, DWORD dy,
+                                             DWORD cButtons, DWORD dwExtraInfo )
+{
+    CONTEXT86 context;
+
+    memset( &context, 0, sizeof(context) );
+    CS_reg(&context)  = SELECTOROF( proc );
+    EIP_reg(&context) = OFFSETOF( proc );
+    AX_reg(&context)  = (WORD)dwFlags;
+    BX_reg(&context)  = (WORD)dx;
+    CX_reg(&context)  = (WORD)dy;
+    DX_reg(&context)  = (WORD)cButtons;
+    SI_reg(&context)  = LOWORD( dwExtraInfo );
+    DI_reg(&context)  = HIWORD( dwExtraInfo );
+
+    CallTo16RegisterShort( &context, 0 );
+}
+
+VOID WINAPI WIN16_MOUSE_Enable( FARPROC16 proc )
+{
+    LPMOUSE_EVENT_PROC thunk = 
+      (LPMOUSE_EVENT_PROC)THUNK_Alloc( proc, (RELAY)MOUSE_CallMouseEventProc );
+
+    MOUSE_Enable( thunk );
+}
+
 /***********************************************************************
  *           MOUSE_Disable                       (MOUSE.3)
  */
 VOID WINAPI MOUSE_Disable(VOID)
 {
+    THUNK_Free( (FARPROC)DefMouseEventProc );
     DefMouseEventProc = 0;
 }