Alexandre Julliard : user: Convert the 16-bit winproc functions to use a callback pointer.

Alexandre Julliard julliard at wine.codeweavers.com
Sat May 20 07:26:10 CDT 2006


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu May 18 19:44:30 2006 +0200

user: Convert the 16-bit winproc functions to use a callback pointer.

---

 dlls/user/winproc.c |  110 ++++++++++++++++++++++++---------------------------
 dlls/user/winproc.h |    2 +
 2 files changed, 54 insertions(+), 58 deletions(-)

diff --git a/dlls/user/winproc.c b/dlls/user/winproc.c
index 98b189a..db8b5ae 100644
--- a/dlls/user/winproc.c
+++ b/dlls/user/winproc.c
@@ -474,15 +474,11 @@ static LRESULT WINPROC_CallWndProc( WNDP
     return retvalue;
 }
 
-/***********************************************************************
- *           WINPROC_CallWndProc16
- *
- * Call a 16-bit window procedure
- */
-static LRESULT WINAPI WINPROC_CallWndProc16( WNDPROC16 proc, HWND16 hwnd,
-                                             UINT16 msg, WPARAM16 wParam,
-                                             LPARAM lParam )
+/* call a 16-bit window procedure */
+static LRESULT call_window_proc16( HWND16 hwnd, UINT16 msg, WPARAM16 wParam, LPARAM lParam,
+                                   LRESULT *result, void *arg )
 {
+    WNDPROC16 proc = arg;
     CONTEXT86 context;
     size_t size = 0;
     struct
@@ -540,7 +536,17 @@ static LRESULT WINAPI WINPROC_CallWndPro
     args.params[1] = HIWORD(lParam);
     args.params[0] = LOWORD(lParam);
     WOWCallback16Ex( 0, WCB16_REGS, sizeof(args.params) + size, &args, (DWORD *)&context );
-    return MAKELONG( LOWORD(context.Eax), LOWORD(context.Edx) );
+    *result = MAKELONG( LOWORD(context.Eax), LOWORD(context.Edx) );
+    return *result;
+}
+
+/* call a 16-bit dialog procedure */
+static LRESULT call_dialog_proc16( HWND16 hwnd, UINT16 msg, WPARAM16 wp, LPARAM lp,
+                                   LRESULT *result, void *arg )
+{
+    LRESULT ret = call_window_proc16( hwnd, msg, wp, lp, result, arg );
+    *result = GetWindowLongPtrW( WIN_Handle32(hwnd), DWLP_MSGRESULT );
+    return LOWORD(ret);
 }
 
 
@@ -2961,33 +2967,23 @@ LRESULT WINAPI __wine_call_wndproc( HWND
  *
  * Call a 16-bit window procedure, translating the 32-bit args.
  */
-static LRESULT WINPROC_CallProc32ATo16( WNDPROC16 func, HWND hwnd, UINT msg,
-                                        WPARAM wParam, LPARAM lParam, BOOL dialog )
+static LRESULT WINPROC_CallProc32ATo16( winproc_callback16_t callback, HWND hwnd, UINT msg,
+                                        WPARAM wParam, LPARAM lParam, LRESULT *result, void *arg )
 {
     LRESULT ret;
     UINT16 msg16;
     MSGPARAM16 mp16;
 
-    TRACE_(msg)("func %p (hwnd=%p,msg=%s,wp=%08x,lp=%08lx)\n",
-                func, hwnd, SPY_GetMsgName(msg, hwnd), wParam, lParam);
+    TRACE_(msg)("(hwnd=%p,msg=%s,wp=%08x,lp=%08lx)\n",
+                hwnd, SPY_GetMsgName(msg, hwnd), wParam, lParam);
 
     mp16.lParam = lParam;
     if (WINPROC_MapMsg32ATo16( hwnd, msg, wParam, &msg16, &mp16.wParam, &mp16.lParam ) == -1)
         return 0;
-    ret = WINPROC_CallWndProc16( func, HWND_16(hwnd), msg16, mp16.wParam, mp16.lParam );
-    if (dialog)
-    {
-        mp16.lResult = GetWindowLongPtrW( hwnd, DWLP_MSGRESULT );
-        WINPROC_UnmapMsg32ATo16( hwnd, msg, wParam, lParam, &mp16 );
-        SetWindowLongPtrW( hwnd, DWLP_MSGRESULT, mp16.lResult );
-        ret = LOWORD(ret);
-    }
-    else
-    {
-        mp16.lResult = ret;
-        WINPROC_UnmapMsg32ATo16( hwnd, msg, wParam, lParam, &mp16 );
-        ret = mp16.lResult;
-    }
+    ret = callback( HWND_16(hwnd), msg16, mp16.wParam, mp16.lParam, result, arg );
+    mp16.lResult = *result;
+    WINPROC_UnmapMsg32ATo16( hwnd, msg, wParam, lParam, &mp16 );
+    *result = mp16.lResult;
     return ret;
 }
 
@@ -2997,33 +2993,23 @@ static LRESULT WINPROC_CallProc32ATo16( 
  *
  * Call a 16-bit window procedure, translating the 32-bit args.
  */
-static LRESULT WINPROC_CallProc32WTo16( WNDPROC16 func, HWND hwnd, UINT msg,
-                                        WPARAM wParam, LPARAM lParam, BOOL dialog )
+static LRESULT WINPROC_CallProc32WTo16( winproc_callback16_t callback, HWND hwnd, UINT msg,
+                                        WPARAM wParam, LPARAM lParam, LRESULT *result, void *arg )
 {
     LRESULT ret;
     UINT16 msg16;
     MSGPARAM16 mp16;
 
-    TRACE_(msg)("func %p (hwnd=%p,msg=%s,wp=%08x,lp=%08lx)\n",
-                func, hwnd, SPY_GetMsgName(msg, hwnd), wParam, lParam);
+    TRACE_(msg)("(hwnd=%p,msg=%s,wp=%08x,lp=%08lx)\n",
+                hwnd, SPY_GetMsgName(msg, hwnd), wParam, lParam);
 
     mp16.lParam = lParam;
     if (WINPROC_MapMsg32WTo16( hwnd, msg, wParam, &msg16, &mp16.wParam, &mp16.lParam ) == -1)
         return 0;
-    ret = WINPROC_CallWndProc16( func, HWND_16(hwnd), msg16, mp16.wParam, mp16.lParam );
-    if (dialog)
-    {
-        mp16.lResult = GetWindowLongPtrW( hwnd, DWLP_MSGRESULT );
-        WINPROC_UnmapMsg32WTo16( hwnd, msg, wParam, lParam, &mp16 );
-        SetWindowLongPtrW( hwnd, DWLP_MSGRESULT, mp16.lResult );
-        ret = LOWORD(ret);
-    }
-    else
-    {
-        mp16.lResult = ret;
-        WINPROC_UnmapMsg32WTo16( hwnd, msg, wParam, lParam, &mp16 );
-        ret = mp16.lResult;
-    }
+    ret = callback( HWND_16(hwnd), msg16, mp16.wParam, mp16.lParam, result, arg );
+    mp16.lResult = *result;
+    WINPROC_UnmapMsg32WTo16( hwnd, msg, wParam, lParam, &mp16 );
+    *result = mp16.lResult;
     return ret;
 }
 
@@ -3040,14 +3026,13 @@ LRESULT WINAPI CallWindowProc16( WNDPROC
     if (!func) return 0;
 
     if (!(proc = handle16_to_proc( func )))
-        return WINPROC_CallWndProc16( func, hwnd, msg, wParam, lParam );
-
-    if (proc->procA)
+        call_window_proc16( hwnd, msg, wParam, lParam, &result, func );
+    else if (proc->procA)
         WINPROC_CallProc16To32A( call_window_proc, hwnd, msg, wParam, lParam, &result, proc->procA );
     else if (proc->procW)
         WINPROC_CallProc16To32W( call_window_proc, hwnd, msg, wParam, lParam, &result, proc->procW );
     else
-        result = WINPROC_CallWndProc16( proc->proc16, hwnd, msg, wParam, lParam );
+        call_window_proc16( hwnd, msg, wParam, lParam, &result, proc->proc16 );
 
     return result;
 }
@@ -3096,7 +3081,7 @@ LRESULT WINAPI CallWindowProcA(
     else if (proc->procW)
         WINPROC_CallProcAtoW( call_window_proc, hwnd, msg, wParam, lParam, &result, proc->procW );
     else
-        result = WINPROC_CallProc32ATo16( proc->proc16, hwnd, msg, wParam, lParam, FALSE );
+        WINPROC_CallProc32ATo16( call_window_proc16, hwnd, msg, wParam, lParam, &result, proc->proc16 );
     return result;
 }
 
@@ -3121,7 +3106,7 @@ LRESULT WINAPI CallWindowProcW( WNDPROC 
     else if (proc->procA)
         WINPROC_CallProcWtoA( call_window_proc, hwnd, msg, wParam, lParam, &result, proc->procA );
     else
-        result = WINPROC_CallProc32WTo16( proc->proc16, hwnd, msg, wParam, lParam, FALSE );
+        WINPROC_CallProc32WTo16( call_window_proc16, hwnd, msg, wParam, lParam, &result, proc->proc16 );
     return result;
 }
 
@@ -3138,9 +3123,10 @@ INT_PTR WINPROC_CallDlgProc16( DLGPROC16
     if (!func) return 0;
 
     if (!(proc = handle16_to_proc( (WNDPROC16)func )))
-        return LOWORD( WINPROC_CallWndProc16( (WNDPROC16)func, hwnd, msg, wParam, lParam ) );
-
-    if (proc->procA)
+    {
+        ret = call_dialog_proc16( hwnd, msg, wParam, lParam, &result, func );
+    }
+    else if (proc->procA)
     {
         ret = WINPROC_CallProc16To32A( call_dialog_proc, hwnd, msg, wParam, lParam,
                                        &result, proc->procA );
@@ -3152,8 +3138,10 @@ INT_PTR WINPROC_CallDlgProc16( DLGPROC16
                                        &result, proc->procW );
         SetWindowLongPtrW( WIN_Handle32(hwnd), DWLP_MSGRESULT, result );
     }
-    else ret = LOWORD( WINPROC_CallWndProc16( proc->proc16, hwnd, msg, wParam, lParam ) );
-
+    else
+    {
+        ret = call_dialog_proc16( hwnd, msg, wParam, lParam, &result, proc->proc16 );
+    }
     return ret;
 }
 
@@ -3179,7 +3167,10 @@ INT_PTR WINPROC_CallDlgProcA( DLGPROC fu
         SetWindowLongPtrW( hwnd, DWLP_MSGRESULT, result );
     }
     else
-        ret = WINPROC_CallProc32ATo16( proc->proc16, hwnd, msg, wParam, lParam, TRUE );
+    {
+        ret = WINPROC_CallProc32ATo16( call_dialog_proc16, hwnd, msg, wParam, lParam, &result, proc->proc16 );
+        SetWindowLongPtrW( hwnd, DWLP_MSGRESULT, result );
+    }
     return ret;
 }
 
@@ -3205,6 +3196,9 @@ INT_PTR WINPROC_CallDlgProcW( DLGPROC fu
         SetWindowLongPtrW( hwnd, DWLP_MSGRESULT, result );
     }
     else
-        ret = WINPROC_CallProc32WTo16( proc->proc16, hwnd, msg, wParam, lParam, TRUE );
+    {
+        ret = WINPROC_CallProc32WTo16( call_dialog_proc16, hwnd, msg, wParam, lParam, &result, proc->proc16 );
+        SetWindowLongPtrW( hwnd, DWLP_MSGRESULT, result );
+    }
     return ret;
 }
diff --git a/dlls/user/winproc.h b/dlls/user/winproc.h
index bbe1278..02d96cf 100644
--- a/dlls/user/winproc.h
+++ b/dlls/user/winproc.h
@@ -46,6 +46,8 @@ struct tagWINDOWPROC;
 
 typedef LRESULT (*winproc_callback_t)( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp,
                                        LRESULT *result, void *arg );
+typedef LRESULT (*winproc_callback16_t)( HWND16 hwnd, UINT16 msg, WPARAM16 wp, LPARAM lp,
+                                         LRESULT *result, void *arg );
 
 extern WNDPROC16 WINPROC_GetProc16( WNDPROC proc, BOOL unicode );
 extern WNDPROC WINPROC_AllocProc16( WNDPROC16 func );




More information about the wine-cvs mailing list