[User32]
authorJames Tabor <james.tabor@reactos.org>
Tue, 23 Aug 2011 03:27:14 +0000 (03:27 +0000)
committerJames Tabor <james.tabor@reactos.org>
Tue, 23 Aug 2011 03:27:14 +0000 (03:27 +0000)
- Fix copy paste error in DIALOG_IsAccelerator, fixes a crash.
- Up Dialog.c to 1.3.26, sync port and minimized differences.

svn path=/trunk/; revision=53391

reactos/dll/win32/user32/windows/dialog.c

index b967dfc..2814fa3 100644 (file)
@@ -74,7 +74,7 @@ typedef struct
     UINT       id;
     LPCWSTR    className;
     LPCWSTR    windowName;
-    BOOL       windowNameFree;
+    BOOL       windowNameFree; // ReactOS
     LPCVOID    data;
 } DLG_CONTROL_INFO;
 
@@ -318,6 +318,7 @@ static BOOL DIALOG_CreateControls32( HWND hwnd, LPCSTR template, const DLG_TEMPL
 
     if (!(dlgInfo = GETDLGINFO(hwnd))) return FALSE;
 
+    TRACE(" BEGIN\n" );
     while (items--)
     {
         template = (LPCSTR)DIALOG_GetControl32( (const WORD *)template, &info,
@@ -401,44 +402,10 @@ static BOOL DIALOG_CreateControls32( HWND hwnd, LPCSTR template, const DLG_TEMPL
             dlgInfo->idResult = GetWindowLongPtrA( hwndCtrl, GWLP_ID );
         }
     }
+    TRACE(" END\n" );
     return TRUE;
 }
 
- /***********************************************************************
-  *           DIALOG_FindMsgDestination
-  *
-  * The messages that IsDialogMessage sends may not go to the dialog
-  * calling IsDialogMessage if that dialog is a child, and it has the
-  * DS_CONTROL style set.
-  * We propagate up until we hit one that does not have DS_CONTROL, or
-  * whose parent is not a dialog.
-  *
-  * This is undocumented behaviour.
-  */
-static HWND DIALOG_FindMsgDestination( HWND hwndDlg )
-{
-    while (GetWindowLongA(hwndDlg, GWL_STYLE) & DS_CONTROL)
-    {
-        PWND pWnd;
-        HWND hParent = GetParent(hwndDlg);
-        if (!hParent) break;
-// ReactOS
-        if (!IsWindow(hParent)) break;
-
-        pWnd = ValidateHwnd(hParent);
-        // FIXME: Use pWnd->fnid == FNID_DESKTOP
-        if (!pWnd || hParent == GetDesktopWindow()) break;
-
-        if (!(pWnd->state & WNDS_DIALOGWINDOW))
-        {
-            break;
-        }
-
-        hwndDlg = hParent;
-    }
-
-    return hwndDlg;
-}
 
  /***********************************************************************
   *           DIALOG_IsAccelerator
@@ -455,7 +422,7 @@ static BOOL DIALOG_IsAccelerator( HWND hwnd, HWND hwndDlg, WPARAM wParam )
         DWORD style = GetWindowLongPtrW( hwndControl, GWL_STYLE );
         if ((style & (WS_VISIBLE | WS_DISABLED)) == WS_VISIBLE)
         {
-            dlgCode = SendMessageA( hwndControl, WM_GETDLGCODE, 0, 0 );
+            dlgCode = SendMessageW( hwndControl, WM_GETDLGCODE, 0, 0 );
             if ( (dlgCode & (DLGC_BUTTON | DLGC_STATIC)) &&
                  GetWindowTextW( hwndControl, buffer, sizeof(buffer)/sizeof(WCHAR) ))
             {
@@ -464,7 +431,7 @@ static BOOL DIALOG_IsAccelerator( HWND hwnd, HWND hwndDlg, WPARAM wParam )
 
                 do
                 {
-                    p = wcschr( p + 2, '&' );
+                    p = strchrW( p + 2, '&' );
                 }
                 while (p != NULL && p[1] == '&');
 
@@ -514,6 +481,42 @@ static BOOL DIALOG_IsAccelerator( HWND hwnd, HWND hwndDlg, WPARAM wParam )
     return FALSE;
 }
 
+ /***********************************************************************
+  *           DIALOG_FindMsgDestination
+  *
+  * The messages that IsDialogMessage sends may not go to the dialog
+  * calling IsDialogMessage if that dialog is a child, and it has the
+  * DS_CONTROL style set.
+  * We propagate up until we hit one that does not have DS_CONTROL, or
+  * whose parent is not a dialog.
+  *
+  * This is undocumented behaviour.
+  */
+static HWND DIALOG_FindMsgDestination( HWND hwndDlg )
+{
+    while (GetWindowLongA(hwndDlg, GWL_STYLE) & DS_CONTROL)
+    {
+        PWND pWnd;
+        HWND hParent = GetParent(hwndDlg);
+        if (!hParent) break;
+// ReactOS
+        if (!IsWindow(hParent)) break;
+
+        pWnd = ValidateHwnd(hParent);
+        // FIXME: Use pWnd->fnid == FNID_DESKTOP
+        if (!pWnd || hParent == GetDesktopWindow()) break;
+
+        if (!(pWnd->state & WNDS_DIALOGWINDOW))
+        {
+            break;
+        }
+
+        hwndDlg = hParent;
+    }
+
+    return hwndDlg;
+}
+
  /***********************************************************************
  *           DIALOG_DoDialogBox
  */
@@ -545,15 +548,22 @@ INT DIALOG_DoDialogBox( HWND hwnd, HWND owner )
                     /* No message present -> send ENTERIDLE and wait */
                     SendMessageW( ownerMsg, WM_ENTERIDLE, MSGF_DIALOGBOX, (LPARAM)hwnd );
                 }
-                if (!GetMessageW( &msg, 0, 0, 0 )) break;
+                GetMessageW( &msg, 0, 0, 0 );
             }
 
+            if (msg.message == WM_QUIT)
+            {
+                PostQuitMessage( msg.wParam );
+                if (!IsWindow( hwnd )) return 0;
+                break;
+            }
             if (!IsWindow( hwnd )) return 0;
             if (!(dlgInfo->flags & DF_END) && !IsDialogMessageW( hwnd, &msg))
             {
                 TranslateMessage( &msg );
                 DispatchMessageW( &msg );
             }
+            if (!IsWindow( hwnd )) return 0;
             if (dlgInfo->flags & DF_END) break;
 
             if (bFirstEmpty && msg.message == WM_TIMER)
@@ -603,6 +613,11 @@ static LPCSTR DIALOG_ParseTemplate32( LPCSTR template, DLG_TEMPLATE * result )
     result->y       = GET_WORD(p); p++;
     result->cx      = GET_WORD(p); p++;
     result->cy      = GET_WORD(p); p++;
+    TRACE("DIALOG%s %d, %d, %d, %d, %d\n",
+           result->dialogEx ? "EX" : "", result->x, result->y,
+           result->cx, result->cy, result->helpId );
+    TRACE(" STYLE 0x%08x\n", result->style );
+    TRACE(" EXSTYLE 0x%08x\n", result->exStyle );
 
     /* Get the menu name */
 
@@ -615,9 +630,11 @@ static LPCSTR DIALOG_ParseTemplate32( LPCSTR template, DLG_TEMPLATE * result )
         case 0xffff:
             result->menuName = (LPCWSTR)(UINT_PTR)GET_WORD( p + 1 );
             p += 2;
+            TRACE(" MENU %04x\n", LOWORD(result->menuName) );
             break;
         default:
             result->menuName = (LPCWSTR)p;
+            TRACE(" MENU %s\n", debugstr_w(result->menuName) );
             p += strlenW( result->menuName ) + 1;
             break;
     }
@@ -633,9 +650,11 @@ static LPCSTR DIALOG_ParseTemplate32( LPCSTR template, DLG_TEMPLATE * result )
         case 0xffff:
             result->className = (LPCWSTR)(UINT_PTR)GET_WORD( p + 1 );
             p += 2;
+            TRACE(" CLASS %04x\n", LOWORD(result->className) );
             break;
         default:
             result->className = (LPCWSTR)p;
+            TRACE(" CLASS %s\n", debugstr_w( result->className ));
             p += strlenW( result->className ) + 1;
             break;
     }
@@ -644,6 +663,7 @@ static LPCSTR DIALOG_ParseTemplate32( LPCSTR template, DLG_TEMPLATE * result )
 
     result->caption = (LPCWSTR)p;
     p += strlenW( result->caption ) + 1;
+    TRACE(" CAPTION %s\n", debugstr_w( result->caption ) );
 
     /* Get the font name */
 
@@ -678,6 +698,10 @@ static LPCSTR DIALOG_ParseTemplate32( LPCSTR template, DLG_TEMPLATE * result )
             }
             result->faceName = (LPCWSTR)p;
             p += strlenW( result->faceName ) + 1;
+
+            TRACE(" FONT %d, %s, %d, %s\n",
+                  result->pointSize, debugstr_w( result->faceName ),
+                  result->weight, result->italic ? "TRUE" : "FALSE" );
         }
     }
 
@@ -969,13 +993,13 @@ static HWND DIALOG_CreateIndirect( HINSTANCE hInst, LPCVOID dlgTemplate,
         if (dlgProc)
         {
             HWND focus = GetNextDlgTabItem( hwnd, 0, FALSE );
-            if (SendMessageW( hwnd, WM_INITDIALOG, (WPARAM)focus, param ) &&
+            if (SendMessageW( hwnd, WM_INITDIALOG, (WPARAM)focus, param ) && IsWindow( hwnd ) &&
                 ((~template.style & DS_CONTROL) || (template.style & WS_VISIBLE)))
             {
                 /* By returning TRUE, app has requested a default focus assignment.
                  * WM_INITDIALOG may have changed the tab order, so find the first
                  * tabstop control again. */
-                dlgInfo->hwndFocus = GetNextDlgTabItem( hwnd, 0, FALSE);
+                dlgInfo->hwndFocus = GetNextDlgTabItem( hwnd, 0, FALSE );
                 if( dlgInfo->hwndFocus )
                     SetFocus( dlgInfo->hwndFocus );
             }
@@ -1289,6 +1313,7 @@ static HWND DIALOG_GetNextTabItem( HWND hwndMain, HWND hwndDlg, HWND hwndCtrl, B
     return retWnd ? retWnd : hwndCtrl;
 }
 
+
 /**********************************************************************
  *         DIALOG_DlgDirListW
  *
@@ -1305,8 +1330,7 @@ static INT DIALOG_DlgDirListW( HWND hDlg, LPWSTR spec, INT idLBox,
     ((attrib & DDL_POSTMSGS) ? PostMessageW( hwnd, msg, wparam, lparam ) \
                              : SendMessageW( hwnd, msg, wparam, lparam ))
 
-//    TRACE("%p '%s' %d %d %04x\n",
-//          hDlg, spec ? spec : "NULL", idLBox, idStatic, attrib );
+    TRACE("%p %s %d %d %04x\n", hDlg, debugstr_w(spec), idLBox, idStatic, attrib );
 
     /* If the path exists and is a directory, chdir to it */
     if (!spec || !spec[0] || SetCurrentDirectoryW( spec )) spec = any;
@@ -1378,6 +1402,7 @@ static INT DIALOG_DlgDirListW( HWND hDlg, LPWSTR spec, INT idLBox,
 #undef SENDMSG
 }
 
+
 /**********************************************************************
  *         DIALOG_DlgDirListA
  *
@@ -2039,7 +2064,7 @@ GetDlgItemInt(
   BOOL *lpTranslated,
   BOOL bSigned)
 {
-       char str[30];
+    char str[30];
     char * endptr;
     long result = 0;
 
@@ -2315,6 +2340,39 @@ static void DIALOG_FixChildrenOnChangeFocus (HWND hwndDlg, HWND hwndNext)
     }
 }
 
+/***********************************************************************
+ *           DIALOG_IdToHwnd
+ *
+ * A recursive version of GetDlgItem
+ *
+ * RETURNS
+ *  The HWND for a Child ID.
+ */
+static 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 */
+        if ((ret = DIALOG_IdToHwnd( list[i], id ))) break;
+    }
+
+    HeapFree( GetProcessHeap(), 0, list );
+    return ret;
+}
+
+
 /*
  * @implemented
  */
@@ -2419,7 +2477,7 @@ IsDialogMessageW(
                  }
                  else if (DC_HASDEFID == HIWORD(dw = SendMessageW (hDlg, DM_GETDEFID, 0, 0)))
                  {
-                    HWND hwndDef = GetDlgItem(hDlg, LOWORD(dw));
+                    HWND hwndDef = DIALOG_IdToHwnd(hDlg, LOWORD(dw));
                     if (hwndDef ? IsWindowEnabled(hwndDef) : LOWORD(dw)==IDOK)
                         SendMessageW( hDlg, WM_COMMAND, MAKEWPARAM( LOWORD(dw), BN_CLICKED ), (LPARAM)hwndDef);
                  }