[PATCH] user32: Convert dialog procedure arguments basing on window type not procedure type

Nikolay Sivov nsivov at codeweavers.com
Sun Jan 21 10:52:33 CST 2018


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/user32/tests/dialog.c |  6 ------
 dlls/user32/winproc.c      | 28 +++++++++++++++++++---------
 2 files changed, 19 insertions(+), 15 deletions(-)

diff --git a/dlls/user32/tests/dialog.c b/dlls/user32/tests/dialog.c
index cbe4b2b1d8..900ffc7b9c 100644
--- a/dlls/user32/tests/dialog.c
+++ b/dlls/user32/tests/dialog.c
@@ -1252,10 +1252,8 @@ static INT_PTR CALLBACK test_aw_conversion_dlgprocA(HWND hdlg, UINT msg, WPARAM
     case LB_ADDFILE:
     case EM_REPLACESEL:
         if (IsWindowUnicode(hdlg))
-        todo_wine
             ok(!lstrcmpW(text, testtextW), "Unexpected text %s.\n", wine_dbgstr_w(text));
         else
-        todo_wine
             ok(!strcmp(textA, "WndText"), "Unexpected text %s.\n", textA);
         break;
     };
@@ -1333,13 +1331,11 @@ static INT_PTR CALLBACK test_aw_conversion_dlgproc(HWND hdlg, UINT msg, WPARAM w
 
         memset(buff, 'A', sizeof(buff));
         len = GetWindowTextA(hdlg, buff, sizeof(buff));
-    todo_wine
         ok(buff[0] == 0 && buff[1] == 'A' && len == 0, "Unexpected window text %#x, %#x, len %d\n",
            (BYTE)buff[0], (BYTE)buff[1], len);
 
         memset(buffW, 0xff, sizeof(buffW));
         len = GetWindowTextW(hdlg, buffW, 64);
-    todo_wine
         ok(!lstrcmpW(buffW, testtextW) && len == 0, "Unexpected window text %s, len %d\n", wine_dbgstr_w(buffW), len);
 
         dlg_test_aw_message(hdlg, WM_WININICHANGE);
@@ -1449,12 +1445,10 @@ static INT_PTR CALLBACK test_aw_conversion_dlgproc2(HWND hdlg, UINT msg, WPARAM
 
         memset(buff, 'A', sizeof(buff));
         len = GetWindowTextA(hdlg, buff, sizeof(buff));
-    todo_wine
         ok(!strcmp(buff, "WndText") && len == 0, "Unexpected window text %s, len %d\n", buff, len);
 
         memset(buffW, 0xff, sizeof(buffW));
         len = GetWindowTextW(hdlg, buffW, sizeof(buffW)/sizeof(buffW[0]));
-    todo_wine
         ok(buffW[0] == 0 && buffW[1] == 0xffff && len == 0, "Unexpected window text %#x, %#x, len %d\n",
             buffW[0], buffW[1], len);
 
diff --git a/dlls/user32/winproc.c b/dlls/user32/winproc.c
index 73bbe95028..3d00a09233 100644
--- a/dlls/user32/winproc.c
+++ b/dlls/user32/winproc.c
@@ -993,6 +993,10 @@ LRESULT WINAPI CallWindowProcW( WNDPROC func, HWND hwnd, UINT msg,
     return result;
 }
 
+static WNDPROC WINPROC_GetDlgProcFunc(const WINDOWPROC *proc)
+{
+    return proc->procW ? proc->procW : proc->procA;
+}
 
 /**********************************************************************
  *		WINPROC_CallDlgProcA
@@ -1006,20 +1010,23 @@ INT_PTR WINPROC_CallDlgProcA( DLGPROC func, HWND hwnd, UINT msg, WPARAM wParam,
     if (!func) return 0;
 
     if (!(proc = handle_to_proc( func )))
-        ret = call_dialog_proc( hwnd, msg, wParam, lParam, &result, func );
+        return call_dialog_proc( hwnd, msg, wParam, lParam, &result, func );
     else if (proc == WINPROC_PROC16)
     {
         ret = wow_handlers.call_dialog_proc( hwnd, msg, wParam, lParam, &result, func );
         SetWindowLongPtrW( hwnd, DWLP_MSGRESULT, result );
+        return ret;
     }
-    else if (proc->procW)
+
+    if (IsWindowUnicode( hwnd ))
     {
         ret = WINPROC_CallProcAtoW( call_dialog_proc, hwnd, msg, wParam, lParam, &result,
-                                    proc->procW, WMCHAR_MAP_CALLWINDOWPROC );
+                                    WINPROC_GetDlgProcFunc( proc ), WMCHAR_MAP_CALLWINDOWPROC );
         SetWindowLongPtrW( hwnd, DWLP_MSGRESULT, result );
     }
     else
-        ret = call_dialog_proc( hwnd, msg, wParam, lParam, &result, proc->procA );
+        ret = call_dialog_proc( hwnd, msg, wParam, lParam, &result, WINPROC_GetDlgProcFunc( proc ));
+
     return ret;
 }
 
@@ -1036,19 +1043,22 @@ INT_PTR WINPROC_CallDlgProcW( DLGPROC func, HWND hwnd, UINT msg, WPARAM wParam,
     if (!func) return 0;
 
     if (!(proc = handle_to_proc( func )))
-        ret = call_dialog_proc( hwnd, msg, wParam, lParam, &result, func );
+        return call_dialog_proc( hwnd, msg, wParam, lParam, &result, func );
     else if (proc == WINPROC_PROC16)
     {
         ret = WINPROC_CallProcWtoA( wow_handlers.call_dialog_proc, hwnd, msg, wParam, lParam, &result, func );
         SetWindowLongPtrW( hwnd, DWLP_MSGRESULT, result );
+        return ret;
     }
-    else if (proc->procA)
+
+    if (IsWindowUnicode( hwnd ))
+        ret = call_dialog_proc( hwnd, msg, wParam, lParam, &result, WINPROC_GetDlgProcFunc( proc ));
+    else
     {
-        ret = WINPROC_CallProcWtoA( call_dialog_proc, hwnd, msg, wParam, lParam, &result, proc->procA );
+        ret = WINPROC_CallProcWtoA( call_dialog_proc, hwnd, msg, wParam, lParam, &result, WINPROC_GetDlgProcFunc( proc ));
         SetWindowLongPtrW( hwnd, DWLP_MSGRESULT, result );
     }
-    else
-        ret = call_dialog_proc( hwnd, msg, wParam, lParam, &result, proc->procW );
+
     return ret;
 }
 
-- 
2.15.1




More information about the wine-devel mailing list