[2/2] user32: Fix for finding nested default buttons (try 2)

André Hentschel nerv at dawncrow.de
Mon Jul 11 17:29:12 CDT 2011


---
 dlls/comctl32/tests/propsheet.c |    1 -
 dlls/user32/controls.h          |    1 +
 dlls/user32/defdlg.c            |    2 +-
 dlls/user32/dialog.c            |   38 +++++++++++++++++++++++++++++++++++++-
 dlls/user32/tests/dialog.c      |    2 +-
 5 files changed, 40 insertions(+), 4 deletions(-)

diff --git a/dlls/comctl32/tests/propsheet.c b/dlls/comctl32/tests/propsheet.c
index c6e3e9f..b22e8e4 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/controls.h b/dlls/user32/controls.h
index 66d6659..2038f4c 100644
--- a/dlls/user32/controls.h
+++ b/dlls/user32/controls.h
@@ -240,6 +240,7 @@ typedef struct tagDIALOGINFO
 
 extern DIALOGINFO *DIALOG_get_info( HWND hwnd, BOOL create ) DECLSPEC_HIDDEN;
 extern INT DIALOG_DoDialogBox( HWND hwnd, HWND owner ) DECLSPEC_HIDDEN;
+extern HWND DEFDLG_FindDefButton( HWND hwndDlg ) DECLSPEC_HIDDEN;
 
 HRGN set_control_clipping( HDC hdc, const RECT *rect ) DECLSPEC_HIDDEN;
 
diff --git a/dlls/user32/defdlg.c b/dlls/user32/defdlg.c
index fecd417..1cdd19a 100644
--- a/dlls/user32/defdlg.c
+++ b/dlls/user32/defdlg.c
@@ -109,7 +109,7 @@ static void DEFDLG_RestoreFocus( HWND hwnd )
  *
  * Find the current default push-button.
  */
-static HWND DEFDLG_FindDefButton( HWND hwndDlg )
+HWND DEFDLG_FindDefButton( HWND hwndDlg )
 {
     HWND hwndChild, hwndTmp;
 
diff --git a/dlls/user32/dialog.c b/dlls/user32/dialog.c
index 2aa89d9..f27e3d4 100644
--- a/dlls/user32/dialog.c
+++ b/dlls/user32/dialog.c
@@ -1120,6 +1120,36 @@ 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 = WIN_ListChildren( hwndDlg );
+    HWND ret = 0;
+
+    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 = GetDlgItem( list[i], id );
+        if (ret) break;
+    }
+
+    HeapFree( GetProcessHeap(), 0, list );
+    return ret;
+}
+
+/***********************************************************************
  *		IsDialogMessageW (USER32.@)
  */
 BOOL WINAPI IsDialogMessageW( HWND hwndDlg, LPMSG msg )
@@ -1227,7 +1257,13 @@ 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 = DEFDLG_FindDefButton(hwndDlg);
+                    if (!hwndDef)
+                    {
+                        DIALOGINFO *dlgInfo = DIALOG_get_info( hwndDlg, FALSE );
+                        if(dlgInfo && !(dlgInfo->flags & DF_END) && dlgInfo->idResult)
+                           hwndDef = DIALOG_IdToHwnd(hwndDlg, dlgInfo->idResult);
+                    }
                     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 5d40b7f..0164721 100644
--- a/dlls/user32/tests/dialog.c
+++ b/dlls/user32/tests/dialog.c
@@ -738,7 +738,7 @@ static void test_IsDialogMessage(void)
     g_bReceivedCommand = FALSE;
     FormEnterMsg (&msg, child3);
     ok(IsDialogMessage (g_hwndMain, &msg), "Did not handle the ENTER\n");
-    todo_wine ok(g_bReceivedCommand, "Did not triggered the default Button action\n");
+    ok(g_bReceivedCommand, "Did not triggered the default Button action\n");
 
     DestroyWindow(child3);
     DestroyWindow(child2);
-- 

Best Regards, André Hentschel



More information about the wine-patches mailing list