Alexandre Julliard : user: Use winproc callbacks instead of message map/ unmap for 16-bit hooks.

Alexandre Julliard julliard at wine.codeweavers.com
Sat May 20 11:22:35 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: dc61a4bc65617b0748b978a68c8a18d111d3e6a7
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=dc61a4bc65617b0748b978a68c8a18d111d3e6a7

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Sat May 20 16:34:14 2006 +0200

user: Use winproc callbacks instead of message map/unmap for 16-bit hooks.

---

 dlls/user/hook16.c  |   85 +++++++++++++++++++++++++++++++++++----------------
 dlls/user/winproc.c |    4 +-
 dlls/user/winproc.h |    2 +
 3 files changed, 62 insertions(+), 29 deletions(-)

diff --git a/dlls/user/hook16.c b/dlls/user/hook16.c
index cbec32c..db1c05e 100644
--- a/dlls/user/hook16.c
+++ b/dlls/user/hook16.c
@@ -133,6 +133,50 @@ static LRESULT call_hook_16( INT id, INT
 }
 
 
+struct wndproc_hook_params
+{
+    HHOOK  hhook;
+    INT    code;
+    WPARAM wparam;
+};
+
+/* callback for WINPROC_Call16To32A */
+static LRESULT wndproc_hook_callback( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp,
+                                      LRESULT *result, void *arg )
+{
+    struct wndproc_hook_params *params = arg;
+    CWPSTRUCT cwp;
+
+    cwp.hwnd    = hwnd;
+    cwp.message = msg;
+    cwp.wParam  = wp;
+    cwp.lParam  = lp;
+    *result = 0;
+    return CallNextHookEx( params->hhook, params->code, params->wparam, (LPARAM)&cwp );
+}
+
+/* callback for WINPROC_Call32ATo16 */
+static LRESULT wndproc_hook_callback16( HWND16 hwnd, UINT16 msg, WPARAM16 wp, LPARAM lp,
+                                        LRESULT *result, void *arg )
+{
+    struct wndproc_hook_params *params = arg;
+    CWPSTRUCT16 cwp;
+    LRESULT ret;
+
+    cwp.hwnd    = hwnd;
+    cwp.message = msg;
+    cwp.wParam  = wp;
+    cwp.lParam  = lp;
+
+    lp = MapLS( &cwp );
+    ret = call_hook_16( WH_CALLWNDPROC, params->code, params->wparam, lp );
+    UnMapLS( lp );
+
+    *result = 0;
+    return ret;
+}
+
+
 /***********************************************************************
  *		call_WH_MSGFILTER
  */
@@ -184,26 +228,14 @@ static LRESULT CALLBACK call_WH_GETMESSA
  */
 static LRESULT CALLBACK call_WH_CALLWNDPROC( INT code, WPARAM wp, LPARAM lp )
 {
+    struct wndproc_hook_params params;
     CWPSTRUCT *cwp32 = (CWPSTRUCT *)lp;
-    CWPSTRUCT16 cwp16;
-    MSGPARAM16 mp16;
-    LRESULT ret;
-
-    cwp16.hwnd   = HWND_16(cwp32->hwnd);
-    cwp16.lParam = cwp32->lParam;
+    LRESULT result;
 
-    WINPROC_MapMsg32ATo16( cwp32->hwnd, cwp32->message, cwp32->wParam,
-                           &cwp16.message, &cwp16.wParam, &cwp16.lParam );
-
-    lp = MapLS( &cwp16 );
-    ret = call_hook_16( WH_CALLWNDPROC, code, wp, lp );
-    UnMapLS( lp );
-
-    mp16.wParam  = cwp16.wParam;
-    mp16.lParam  = cwp16.lParam;
-    mp16.lResult = 0;
-    WINPROC_UnmapMsg32ATo16( cwp32->hwnd, cwp32->message, cwp32->wParam, cwp32->lParam, &mp16 );
-    return ret;
+    params.code   = code;
+    params.wparam = wp;
+    return WINPROC_CallProc32ATo16( wndproc_hook_callback16, cwp32->hwnd, cwp32->message,
+                                    cwp32->wParam, cwp32->lParam, &result, &params );
 }
 
 
@@ -499,15 +531,14 @@ LRESULT WINAPI CallNextHookEx16( HHOOK h
     case WH_CALLWNDPROC:
     {
         CWPSTRUCT16 *cwp16 = MapSL(lparam);
-        CWPSTRUCT cwp32;
-
-        cwp32.hwnd   = WIN_Handle32(cwp16->hwnd);
-        cwp32.lParam = cwp16->lParam;
-
-        WINPROC_MapMsg16To32A( cwp32.hwnd, cwp16->message, cwp16->wParam,
-                               &cwp32.message, &cwp32.wParam, &cwp32.lParam );
-        ret = CallNextHookEx( hhook, code, wparam, (LPARAM)&cwp32 );
-        WINPROC_UnmapMsg16To32A( cwp32.hwnd, cwp32.message, cwp32.wParam, cwp32.lParam, 0 );
+        LRESULT result;
+        struct wndproc_hook_params params;
+
+        params.hhook  = hhook;
+        params.code   = code;
+        params.wparam = wparam;
+        ret = WINPROC_CallProc16To32A( wndproc_hook_callback, cwp16->hwnd, cwp16->message,
+                                       cwp16->wParam, cwp16->lParam, &result, &params );
         break;
     }
 
diff --git a/dlls/user/winproc.c b/dlls/user/winproc.c
index 37f9c79..39f914c 100644
--- a/dlls/user/winproc.c
+++ b/dlls/user/winproc.c
@@ -2967,8 +2967,8 @@ LRESULT WINAPI __wine_call_wndproc( HWND
  *
  * Call a 16-bit window procedure, translating the 32-bit args.
  */
-static LRESULT WINPROC_CallProc32ATo16( winproc_callback16_t callback, HWND hwnd, UINT msg,
-                                        WPARAM wParam, LPARAM lParam, LRESULT *result, void *arg )
+LRESULT WINPROC_CallProc32ATo16( winproc_callback16_t callback, HWND hwnd, UINT msg,
+                                 WPARAM wParam, LPARAM lParam, LRESULT *result, void *arg )
 {
     LRESULT ret;
     UINT16 msg16;
diff --git a/dlls/user/winproc.h b/dlls/user/winproc.h
index 4db36d5..4bbc6f3 100644
--- a/dlls/user/winproc.h
+++ b/dlls/user/winproc.h
@@ -59,6 +59,8 @@ extern LRESULT WINPROC_CallProcAtoW( win
                                      WPARAM wParam, LPARAM lParam, LRESULT *result, void *arg );
 extern LRESULT WINPROC_CallProc16To32A( winproc_callback_t callback, HWND16 hwnd, UINT16 msg,
                                         WPARAM16 wParam, LPARAM lParam, LRESULT *result, void *arg );
+extern LRESULT WINPROC_CallProc32ATo16( winproc_callback16_t callback, HWND hwnd, UINT msg,
+                                        WPARAM wParam, LPARAM lParam, LRESULT *result, void *arg );
 
 extern INT WINPROC_MapMsg16To32A( HWND hwnd, UINT16 msg16, WPARAM16 wParam16,
                                     UINT *pmsg32, WPARAM *pwparam32,




More information about the wine-cvs mailing list