[1/3] user32: Fix for finding nested default buttons (try 4)

André Hentschel nerv at dawncrow.de
Thu Jul 21 16:01:59 CDT 2011


---
 dlls/comctl32/tests/propsheet.c |    1 -
 dlls/user32/dialog.c            |   35 ++++++++++++++++++++++++++++++++++-
 dlls/user32/tests/dialog.c      |    2 +-
 3 files changed, 35 insertions(+), 3 deletions(-)

diff --git a/dlls/comctl32/tests/propsheet.c b/dlls/comctl32/tests/propsheet.c
index f6b4c7d..89c548f 100644
--- a/dlls/comctl32/tests/propsheet.c
+++ b/dlls/comctl32/tests/propsheet.c
@@ -502,7 +502,6 @@ static void test_custom_default_button(void)
         }
     }
 
-    todo_wine
     ok(add_button_has_been_pressed, "The Add button has not been pressed!\n");
 
     DestroyWindow(hdlg);
diff --git a/dlls/user32/dialog.c b/dlls/user32/dialog.c
index 2aa89d9..0e11e58 100644
--- a/dlls/user32/dialog.c
+++ b/dlls/user32/dialog.c
@@ -1120,6 +1120,39 @@ static void DIALOG_FixChildrenOnChangeFocus (HWND hwndDlg, HWND hwndNext)
 }
 
 /***********************************************************************
+*           DIALOG_IdToHwnd
+*
+* Return the HWND for a Child ID.
+*/
+HWND DIALOG_IdToHwnd( HWND hwndDlg, INT id )
+{
+    int i;
+    HWND *list;
+    HWND ret = GetDlgItem(hwndDlg, id);
+
+    if (ret) return ret;
+
+    list = WIN_ListChildren( hwndDlg );
+    if (!list) return 0;
+
+    for (i = 0; list[i]; i++)
+    {
+        if (GetWindowLongPtrW( list[i], GWLP_ID ) == id)
+        {
+            ret = list[i];
+            break;
+        }
+
+        /* Recurse into every child */
+        ret = DIALOG_IdToHwnd( list[i], id );
+        if (ret) break;
+    }
+
+    HeapFree( GetProcessHeap(), 0, list );
+    return ret;
+}
+
+/***********************************************************************
  *		IsDialogMessageW (USER32.@)
  */
 BOOL WINAPI IsDialogMessageW( HWND hwndDlg, LPMSG msg )
@@ -1227,7 +1260,7 @@ BOOL WINAPI IsDialogMessageW( HWND hwndDlg, LPMSG msg )
                 }
                 else if (DC_HASDEFID == HIWORD(dw = SendMessageW (hwndDlg, DM_GETDEFID, 0, 0)))
                 {
-                    HWND hwndDef = GetDlgItem(hwndDlg, LOWORD(dw));
+                    HWND hwndDef = DIALOG_IdToHwnd(hwndDlg, LOWORD(dw));
                     if (hwndDef ? IsWindowEnabled(hwndDef) : LOWORD(dw)==IDOK)
                         SendMessageW( hwndDlg, WM_COMMAND, MAKEWPARAM( LOWORD(dw), BN_CLICKED ), (LPARAM)hwndDef);
                 }
diff --git a/dlls/user32/tests/dialog.c b/dlls/user32/tests/dialog.c
index 5964931..ece6a94 100644
--- a/dlls/user32/tests/dialog.c
+++ b/dlls/user32/tests/dialog.c
@@ -709,7 +709,7 @@ static void test_WM_NEXTDLGCTL(void)
     g_bReceivedCommand = FALSE;
     FormEnterMsg (&msg, child3);
     ok(IsDialogMessage (g_hwndTestDlg, &msg), "Did not handle the ENTER\n");
-    todo_wine ok(g_bReceivedCommand, "Did not trigger the default Button action\n");
+    ok(g_bReceivedCommand, "Did not trigger the default Button action\n");
 
     DestroyWindow(child3);
     DestroyWindow(child2);
-- 

Best Regards, André Hentschel



More information about the wine-patches mailing list