Author: jimtabor
Date: Wed Aug 2 01:14:45 2006
New Revision: 23409
URL:
http://svn.reactos.org/svn/reactos?rev=23409&view=rev
Log:
- User32
- Dialog.c Partial sync to wine.
- Add WinPosActivateOtherWindow to winpos.c, activate another window when the dialog
gets hidden in EndDialog.
- Misc fixes and changes.
Modified:
trunk/reactos/dll/win32/user32/misc/desktop.c
trunk/reactos/dll/win32/user32/user32.def
trunk/reactos/dll/win32/user32/windows/dialog.c
trunk/reactos/dll/win32/user32/windows/winpos.c
Modified: trunk/reactos/dll/win32/user32/misc/desktop.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/misc/desk…
==============================================================================
--- trunk/reactos/dll/win32/user32/misc/desktop.c (original)
+++ trunk/reactos/dll/win32/user32/misc/desktop.c Wed Aug 2 01:14:45 2006
@@ -39,8 +39,6 @@
if (message == WM_NCCREATE) return TRUE;
return 0; /* all other messages are ignored */
}
-
-
VOID
STDCALL
Modified: trunk/reactos/dll/win32/user32/user32.def
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/user32.de…
==============================================================================
--- trunk/reactos/dll/win32/user32/user32.def (original)
+++ trunk/reactos/dll/win32/user32/user32.def Wed Aug 2 01:14:45 2006
@@ -85,7 +85,7 @@
CreateDesktopA@24
CreateDesktopW@24
CreateDialogIndirectParamA@20
-CreateDialogIndirectParamAorW@20
+CreateDialogIndirectParamAorW@24
CreateDialogIndirectParamW@20
CreateDialogParamA@20
CreateDialogParamW@20
@@ -158,7 +158,7 @@
DestroyWindow@4
;DeviceEventWorker
DialogBoxIndirectParamA@20
-DialogBoxIndirectParamAorW@20
+DialogBoxIndirectParamAorW@24
DialogBoxIndirectParamW@20
DialogBoxParamA@20
DialogBoxParamW@20
Modified: trunk/reactos/dll/win32/user32/windows/dialog.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/windows/d…
==============================================================================
--- trunk/reactos/dll/win32/user32/windows/dialog.c (original)
+++ trunk/reactos/dll/win32/user32/windows/dialog.c Wed Aug 2 01:14:45 2006
@@ -40,15 +40,17 @@
#define DF_END 0x0001
#define DF_OWNERENABLED 0x0002
#define CW_USEDEFAULT16 ((short)0x8000)
-#define DWL_INIT (12)
-#define GETDLGINFO(hwnd) (DIALOGINFO*)GetWindowLongW((hwnd), DWL_INIT)
-#define SETDLGINFO(hwnd, info) SetWindowLongW((hwnd), DWL_INIT, (LONG)(info))
+#define DWLP_ROS_DIALOGINFO (DWLP_USER+sizeof(ULONG_PTR))
+#define GETDLGINFO(hwnd) (DIALOGINFO*)GetWindowLongPtrW((hwnd),DWLP_ROS_DIALOGINFO)
+#define SETDLGINFO(hwnd, info) SetWindowLongPtrW((hwnd), DWLP_ROS_DIALOGINFO,
(LONG_PTR)(info))
#define GET_WORD(ptr) (*(WORD *)(ptr))
#define GET_DWORD(ptr) (*(DWORD *)(ptr))
#define MAKEINTATOMA(atom) ((LPCSTR)((ULONG_PTR)((WORD)(atom))))
#define MAKEINTATOMW(atom) ((LPCWSTR)((ULONG_PTR)((WORD)(atom))))
#define DIALOG_CLASS_ATOMA MAKEINTATOMA(32770) /* Dialog */
#define DIALOG_CLASS_ATOMW MAKEINTATOMW(32770) /* Dialog */
+
+void STDCALL WinPosActivateOtherWindow(HWND hwnd);
/* INTERNAL STRUCTS **********************************************************/
@@ -123,47 +125,17 @@
*/
const struct builtin_class_descr DIALOG_builtin_class =
{
- DIALOG_CLASS_ATOMW, /* name */
+ DIALOG_CLASS_ATOMW, /* name */
CS_SAVEBITS | CS_DBLCLKS, /* style */
- (WNDPROC) DefDlgProcW, /* procW */
- (WNDPROC) DefDlgProcA, /* procA */
- DWL_INIT + sizeof(LONG), /* extra */
- (LPCWSTR) IDC_ARROW, /* cursor */
- 0 /* brush */
+ (WNDPROC) DefDlgProcW, /* procW */
+ (WNDPROC) DefDlgProcA, /* procA */
+ DLGWINDOWEXTRA, /* extra */
+ (LPCWSTR) IDC_ARROW, /* cursor */
+ 0 /* brush */
};
/* INTERNAL FUNCTIONS ********************************************************/
-
-/***********************************************************************
- * DIALOG_GetCharSize
- *
- * Despite most of MSDN insisting that the horizontal base unit is
- * tmAveCharWidth it isn't. Knowledge base article Q145994
- * "HOWTO: Calculate Dialog Units When Not Using the System Font",
- * says that we should take the average of the 52 English upper and lower
- * case characters.
- */
-BOOL DIALOG_GetCharSize( HDC hDC, HFONT hFont, SIZE * pSize )
-{
- HFONT hFontPrev = 0;
- char *alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
- SIZE sz;
- TEXTMETRICA tm;
-
- if(!hDC) return FALSE;
-
- if(hFont) hFontPrev = SelectObject(hDC, hFont);
- if(!GetTextMetricsA(hDC, &tm)) return FALSE;
- if(!GetTextExtentPointA(hDC, alphabet, 52, &sz)) return FALSE;
-
- pSize->cy = tm.tmHeight;
- pSize->cx = (sz.cx / 26 + 1) / 2;
-
- if (hFontPrev) SelectObject(hDC, hFontPrev);
-
- return TRUE;
-}
/***********************************************************************
* DIALOG_EnableOwner
@@ -372,16 +344,16 @@
}
/* Send initialisation messages to the control */
- if (dlgInfo->hUserFont) SendMessageA( hwndCtrl, WM_SETFONT,
+ if (dlgInfo->hUserFont) SendMessageW( hwndCtrl, WM_SETFONT,
(WPARAM)dlgInfo->hUserFont, 0 );
- if (SendMessageA(hwndCtrl, WM_GETDLGCODE, 0, 0) & DLGC_DEFPUSHBUTTON)
+ if (SendMessageW(hwndCtrl, WM_GETDLGCODE, 0, 0) & DLGC_DEFPUSHBUTTON)
{
/* If there's already a default push-button, set it back */
/* to normal and use this one instead. */
if (hwndDefButton)
- SendMessageA( hwndDefButton, BM_SETSTYLE, BS_PUSHBUTTON, FALSE );
+ SendMessageW( hwndDefButton, BM_SETSTYLE, BS_PUSHBUTTON, FALSE );
hwndDefButton = hwndCtrl;
- dlgInfo->idResult = GetWindowLongA( hwndCtrl, GWL_ID );
+ dlgInfo->idResult = GetWindowLongPtrA( hwndCtrl, GWLP_ID );
}
}
return TRUE;
@@ -453,14 +425,14 @@
if ((dlgCode & DLGC_STATIC) || (style & 0x0f) == BS_GROUPBOX
)
{
/* set focus to the control */
- SendMessageA( hwndDlg, WM_NEXTDLGCTL, (WPARAM)hwndControl, 1);
+ SendMessageW( hwndDlg, WM_NEXTDLGCTL, (WPARAM)hwndControl, 1);
/* and bump it on to next */
- SendMessageA( hwndDlg, WM_NEXTDLGCTL, 0, 0);
+ SendMessageW( hwndDlg, WM_NEXTDLGCTL, 0, 0);
}
else if (dlgCode & DLGC_BUTTON)
{
/* send BM_CLICK message to the control */
- SendMessageA( hwndControl, BM_CLICK, 0, 0 );
+ SendMessageW( hwndControl, BM_CLICK, 0, 0 );
}
return TRUE;
}
@@ -551,9 +523,13 @@
static LPCSTR DIALOG_ParseTemplate32( LPCSTR template, DLG_TEMPLATE * result )
{
const WORD *p = (const WORD *)template;
-
- result->style = GET_DWORD(p); p += 2;
- if (result->style == 0xffff0001) /* DIALOGEX resource */
+ WORD signature;
+ WORD dlgver;
+
+ signature = GET_WORD(p); p++;
+ dlgver = GET_WORD(p); p++;
+
+ if (signature == 1 && dlgver == 0xffff) /* DIALOGEX resource */
{
result->dialogEx = TRUE;
result->helpId = GET_DWORD(p); p += 2;
@@ -562,6 +538,7 @@
}
else
{
+ result->style = GET_DWORD(p - 2);
result->dialogEx = FALSE;
result->helpId = 0;
result->exStyle = GET_DWORD(p); p += 2;
@@ -615,6 +592,11 @@
/* Get the font name */
+ result->pointSize = 0;
+ result->weight = FW_DONTCARE;
+ result->italic = FALSE;
+ result->faceName = NULL;
+
if (result->style & DS_SETFONT)
{
result->pointSize = GET_WORD(p);
@@ -624,20 +606,8 @@
result->weight = GET_WORD(p); p++;
result->italic = LOBYTE(GET_WORD(p)); p++;
}
- else
- {
- result->weight = FW_DONTCARE;
- result->italic = FALSE;
- }
result->faceName = (LPCWSTR)p;
p += wcslen( result->faceName ) + 1;
- }
- else
- {
- result->pointSize = 0;
- result->weight = FW_DONTCARE;
- result->italic = FALSE;
- result->faceName = NULL;
}
/* First control is on dword boundary */
@@ -659,72 +629,66 @@
HWND hwnd;
RECT rect;
DLG_TEMPLATE template;
- DIALOGINFO * dlgInfo;
+ DIALOGINFO * dlgInfo = NULL;
DWORD units = GetDialogBaseUnits();
BOOL ownerEnabled = TRUE;
-
- /* Parse dialog template */
+ HMENU hMenu = 0;
+ HFONT hUserFont = 0;
+ UINT flags = 0;
+ UINT xBaseUnit = LOWORD(units);
+ UINT yBaseUnit = HIWORD(units);
+
+ /* Parse dialog template */
if (!dlgTemplate) return 0;
dlgTemplate = DIALOG_ParseTemplate32( dlgTemplate, &template );
- /* Initialise dialog extra data */
-
- if (!(dlgInfo = HeapAlloc( GetProcessHeap(), 0, sizeof(*dlgInfo) ))) return 0;
- dlgInfo->hwndFocus = 0;
- dlgInfo->hUserFont = 0;
- dlgInfo->hMenu = 0;
- dlgInfo->xBaseUnit = LOWORD(units);
- dlgInfo->yBaseUnit = HIWORD(units);
- dlgInfo->idResult = 0;
- dlgInfo->flags = 0;
- //dlgInfo->hDialogHeap = 0;
-
- /* Load menu */
-
- if (template.menuName) dlgInfo->hMenu = LoadMenuW( hInst, template.menuName );
-
- /* Create custom font if needed */
+ /* Load menu */
+
+ if (template.menuName) hMenu = LoadMenuW( hInst, template.menuName );
+
+ /* Create custom font if needed */
if (template.style & DS_SETFONT)
{
- /* We convert the size to pixels and then make it -ve. This works
- * for both +ve and -ve template.pointSize */
+ /* We convert the size to pixels and then make it -ve. This works
+ * for both +ve and -ve template.pointSize */
HDC dc;
int pixels;
dc = GetDC(0);
pixels = MulDiv(template.pointSize, GetDeviceCaps(dc , LOGPIXELSY), 72);
- dlgInfo->hUserFont = CreateFontW( -pixels, 0, 0, 0, template.weight,
- template.italic, FALSE, FALSE,
DEFAULT_CHARSET, 0, 0,
- PROOF_QUALITY, FF_DONTCARE,
- template.faceName );
- if (dlgInfo->hUserFont)
+ hUserFont = CreateFontW( -pixels, 0, 0, 0, template.weight,
+ template.italic, FALSE, FALSE, DEFAULT_CHARSET,
0, 0,
+ PROOF_QUALITY, FF_DONTCARE,
+ template.faceName );
+ if (hUserFont)
{
SIZE charSize;
- HFONT hOldFont = SelectObject( dc, dlgInfo->hUserFont );
+ HFONT hOldFont = SelectObject( dc, hUserFont );
charSize.cx = GdiGetCharDimensions( dc, NULL, &charSize.cy );
if (charSize.cx)
{
- dlgInfo->xBaseUnit = charSize.cx;
- dlgInfo->yBaseUnit = charSize.cy;
+ xBaseUnit = charSize.cx;
+ yBaseUnit = charSize.cy;
}
SelectObject( dc, hOldFont );
}
ReleaseDC(0, dc);
+ TRACE("units = %d,%d\n", xBaseUnit, yBaseUnit );
}
/* Create dialog main window */
rect.left = rect.top = 0;
- rect.right = MulDiv(template.cx, dlgInfo->xBaseUnit, 4);
- rect.bottom = MulDiv(template.cy, dlgInfo->yBaseUnit, 8);
+ rect.right = MulDiv(template.cx, xBaseUnit, 4);
+ rect.bottom = MulDiv(template.cy, yBaseUnit, 8);
if (template.style & WS_CHILD)
template.style &= ~(WS_CAPTION|WS_SYSMENU);
if (template.style & DS_MODALFRAME)
template.exStyle |= WS_EX_DLGMODALFRAME;
if (template.style & DS_CONTROL)
template.exStyle |= WS_EX_CONTROLPARENT;
- AdjustWindowRectEx( &rect, template.style, (dlgInfo->hMenu != 0),
template.exStyle );
+ AdjustWindowRectEx( &rect, template.style, (hMenu != 0), template.exStyle );
rect.right -= rect.left;
rect.bottom -= rect.top;
@@ -741,8 +705,8 @@
}
else
{
- rect.left += MulDiv(template.x, dlgInfo->xBaseUnit, 4);
- rect.top += MulDiv(template.y, dlgInfo->yBaseUnit, 8);
+ rect.left += MulDiv(template.x, xBaseUnit, 4);
+ rect.top += MulDiv(template.y, yBaseUnit, 8);
}
if ( !(template.style & WS_CHILD) )
{
@@ -754,9 +718,9 @@
/* try to fit it into the desktop */
if( (dX = rect.left + rect.right + GetSystemMetrics(SM_CXDLGFRAME)
- - GetSystemMetrics(SM_CXSCREEN)) > 0 ) rect.left -= dX;
+ - GetSystemMetrics(SM_CXSCREEN)) > 0 ) rect.left -= dX;
if( (dY = rect.top + rect.bottom + GetSystemMetrics(SM_CYDLGFRAME)
- - GetSystemMetrics(SM_CYSCREEN)) > 0 ) rect.top -= dY;
+ - GetSystemMetrics(SM_CYSCREEN)) > 0 ) rect.top -= dY;
if( rect.left < 0 ) rect.left = 0;
if( rect.top < 0 ) rect.top = 0;
}
@@ -765,7 +729,7 @@
if (modal)
{
ownerEnabled = DIALOG_DisableOwner( owner );
- if (ownerEnabled) dlgInfo->flags |= DF_OWNERENABLED;
+ if (ownerEnabled) flags |= DF_OWNERENABLED;
}
if (unicode)
@@ -773,7 +737,7 @@
hwnd = CreateWindowExW(template.exStyle, template.className, template.caption,
template.style & ~WS_VISIBLE,
rect.left, rect.top, rect.right, rect.bottom,
- owner, dlgInfo->hMenu, hInst, NULL );
+ owner, hMenu, hInst, NULL );
}
else
{
@@ -795,36 +759,44 @@
hwnd = CreateWindowExA(template.exStyle, class, caption,
template.style & ~WS_VISIBLE,
rect.left, rect.top, rect.right, rect.bottom,
- owner, dlgInfo->hMenu, hInst, NULL );
+ owner, hMenu, hInst, NULL );
if (HIWORD(class)) HeapFree( GetProcessHeap(), 0, class );
if (HIWORD(caption)) HeapFree( GetProcessHeap(), 0, caption );
}
if (!hwnd)
{
- if (dlgInfo->hUserFont) DeleteObject( dlgInfo->hUserFont );
- if (dlgInfo->hMenu) DestroyMenu( dlgInfo->hMenu );
- if (modal && (dlgInfo->flags & DF_OWNERENABLED))
DIALOG_EnableOwner(owner);
- HeapFree( GetProcessHeap(), 0, dlgInfo );
+ if (hUserFont) DeleteObject( hUserFont );
+ if (hMenu) DestroyMenu( hMenu );
+ if (modal && (flags & DF_OWNERENABLED)) DIALOG_EnableOwner(owner);
return 0;
}
- if (template.helpId)
- SetWindowContextHelpId( hwnd, template.helpId );
-
- if (unicode)
- {
- SETDLGINFO(hwnd, dlgInfo); /* maybe SetPropW? */
- SetWindowLongW( hwnd, DWL_DLGPROC, (LONG)dlgProc );
- }
- else
- {
- SETDLGINFO(hwnd, dlgInfo);
- SetWindowLongA( hwnd, DWL_DLGPROC, (LONG)dlgProc );
- }
+ /* moved this from the top of the method to here as DIALOGINFO structure
+ will be valid only after WM_CREATE message has been handled in DefDlgProc
+ All the members of the structure get filled here using temp variables */
+
+// dlgInfo = DIALOG_get_info( hwnd, TRUE );
+
+ if (!(dlgInfo = HeapAlloc( GetProcessHeap(), 0, sizeof(*dlgInfo) ))) return 0;
+ SETDLGINFO(hwnd, dlgInfo);
+
+ dlgInfo->hwndFocus = 0;
+ dlgInfo->hUserFont = hUserFont;
+ dlgInfo->hMenu = hMenu;
+ dlgInfo->xBaseUnit = xBaseUnit;
+ dlgInfo->yBaseUnit = yBaseUnit;
+ dlgInfo->idResult = 0;
+ dlgInfo->flags = flags;
+// dlgInfo->hDialogHeap = 0;
+
+ if (template.helpId) SetWindowContextHelpId( hwnd, template.helpId );
+
+ if (unicode) SetWindowLongPtrW( hwnd, DWLP_DLGPROC, (ULONG_PTR)dlgProc );
+ else SetWindowLongPtrA( hwnd, DWLP_DLGPROC, (ULONG_PTR)dlgProc );
if (dlgInfo->hUserFont)
- SendMessageA( hwnd, WM_SETFONT, (WPARAM)dlgInfo->hUserFont, 0 );
+ SendMessageW( hwnd, WM_SETFONT, (WPARAM)dlgInfo->hUserFont, 0 );
/* Create controls */
@@ -847,7 +819,6 @@
}
return hwnd;
}
-
if (modal && ownerEnabled) DIALOG_EnableOwner(owner);
if( IsWindow(hwnd) ) DestroyWindow( hwnd );
return 0;
@@ -882,7 +853,7 @@
HWND hwndFocus = GetFocus();
if (!hwndFocus || !IsChild( hwnd, hwndFocus )) return;
- if (!(infoPtr = GETDLGINFO(hwnd))) return;
+ if (!(infoPtr = GETDLGINFO(hwnd))) return;
infoPtr->hwndFocus = hwndFocus;
/* Remove default button */
}
@@ -904,7 +875,7 @@
infoPtr->hwndFocus = GetNextDlgTabItem( hwnd, 0, FALSE );
if (!IsWindow( infoPtr->hwndFocus )) return;
}
- DEFDLG_SetFocus( hwnd, infoPtr->hwndFocus );
+ SetFocus( infoPtr->hwndFocus );
/* This used to set infoPtr->hwndFocus to NULL for no apparent reason,
sometimes losing focus when receiving WM_SETFOCUS messages. */
@@ -957,15 +928,15 @@
/* Make sure the old default control is a valid push button ID */
hwndOld = GetDlgItem( hwndDlg, old_id );
- if (!hwndOld || !(SendMessageA( hwndOld, WM_GETDLGCODE, 0, 0) &
DLGC_DEFPUSHBUTTON))
+ if (!hwndOld || !(SendMessageW( hwndOld, WM_GETDLGCODE, 0, 0) &
DLGC_DEFPUSHBUTTON))
hwndOld = DEFDLG_FindDefButton( hwndDlg );
if (hwndOld && hwndOld != hwndNew)
- SendMessageA( hwndOld, BM_SETSTYLE, BS_PUSHBUTTON, TRUE );
+ SendMessageW( hwndOld, BM_SETSTYLE, BS_PUSHBUTTON, TRUE );
if (hwndNew)
{
if(dlgcode & DLGC_UNDEFPUSHBUTTON)
- SendMessageA( hwndNew, BM_SETSTYLE, BS_DEFPUSHBUTTON, TRUE );
+ SendMessageW( hwndNew, BM_SETSTYLE, BS_DEFPUSHBUTTON, TRUE );
}
return TRUE;
}
@@ -994,15 +965,15 @@
}
/* Make sure the old default control is a valid push button ID */
- if (!hwndOld || !(SendMessageA( hwndOld, WM_GETDLGCODE, 0, 0) &
DLGC_DEFPUSHBUTTON))
+ if (!hwndOld || !(SendMessageW( hwndOld, WM_GETDLGCODE, 0, 0) &
DLGC_DEFPUSHBUTTON))
hwndOld = DEFDLG_FindDefButton( hwndDlg );
if (hwndOld && hwndOld != hwndNew)
- SendMessageA( hwndOld, BM_SETSTYLE, BS_PUSHBUTTON, TRUE );
+ SendMessageW( hwndOld, BM_SETSTYLE, BS_PUSHBUTTON, TRUE );
if (hwndNew)
{
if(dlgcode & DLGC_UNDEFPUSHBUTTON)
- SendMessageA( hwndNew, BM_SETSTYLE, BS_DEFPUSHBUTTON, TRUE );
+ SendMessageW( hwndNew, BM_SETSTYLE, BS_DEFPUSHBUTTON, TRUE );
}
return TRUE;
}
@@ -1033,7 +1004,7 @@
return 1;
}
case WM_NCDESTROY:
- if ((dlgInfo = GETDLGINFO(hwnd)))
+ if ((dlgInfo = (DIALOGINFO *)SetWindowLongPtrW( hwnd, DWLP_ROS_DIALOGINFO, 0
)))
{
/* Free dialog heap (if created) */
/*if (dlgInfo->hDialogHeap)
@@ -1048,7 +1019,7 @@
/* Window clean-up */
return DefWindowProcA( hwnd, msg, wParam, lParam );
- case WM_SHOWWINDOW:
+ case WM_SHOWWINDOW:
if (!wParam) DEFDLG_SaveFocus( hwnd );
return DefWindowProcA( hwnd, msg, wParam, lParam );
@@ -1096,8 +1067,8 @@
if (hwndFocus)
{
/* always make combo box hide its listbox control */
- if (!SendMessageA( hwndFocus, CB_SHOWDROPDOWN, FALSE, 0 ))
- SendMessageA( GetParent(hwndFocus), CB_SHOWDROPDOWN, FALSE, 0 );
+ if (!SendMessageW( hwndFocus, CB_SHOWDROPDOWN, FALSE, 0 ))
+ SendMessageW( GetParent(hwndFocus), CB_SHOWDROPDOWN, FALSE, 0 );
}
}
return DefWindowProcA( hwnd, msg, wParam, lParam );
@@ -1109,9 +1080,6 @@
PostMessageA( hwnd, WM_COMMAND, MAKEWPARAM(IDCANCEL, BN_CLICKED),
(LPARAM)GetDlgItem( hwnd, IDCANCEL ) );
return 0;
-
- case WM_NOTIFYFORMAT:
- return DefWindowProcA( hwnd, msg, wParam, lParam );
}
return 0;
}
@@ -1121,14 +1089,15 @@
*/
static LRESULT DEFDLG_Epilog(HWND hwnd, UINT msg, BOOL fResult)
{
- // TODO: where's wine's WM_CTLCOLOR from?
+
+ // TODO: where's wine's WM_CTLCOLOR from?
if ((msg >= WM_CTLCOLORMSGBOX && msg <= WM_CTLCOLORSTATIC) ||
- /*msg == WM_CTLCOLOR || */ msg == WM_COMPAREITEM ||
+ msg == WM_CTLCOLOR || msg == WM_COMPAREITEM ||
msg == WM_VKEYTOITEM || msg == WM_CHARTOITEM ||
msg == WM_QUERYDRAGICON || msg == WM_INITDIALOG)
return fResult;
- return GetWindowLongA( hwnd, DWL_MSGRESULT );
+ return GetWindowLongPtrW( hwnd, DWLP_MSGRESULT );
}
/***********************************************************************
@@ -1196,37 +1165,37 @@
}
/**********************************************************************
- * DIALOG_DlgDirList
+ * DIALOG_DlgDirListW
*
- * Helper function for DlgDirList*
- */
-static INT DIALOG_DlgDirList( HWND hDlg, LPSTR spec, INT idLBox,
+ * Helper function for DlgDirList*W
+ */
+static INT DIALOG_DlgDirListW( HWND hDlg, LPWSTR spec, INT idLBox,
INT idStatic, UINT attrib, BOOL combo )
{
HWND hwnd;
- LPSTR orig_spec = spec;
- char any[] = "*.*";
+ LPWSTR orig_spec = spec;
+ WCHAR any[] = {'*','.','*',0};
#define SENDMSG(msg,wparam,lparam) \
- ((attrib & DDL_POSTMSGS) ? PostMessageA( hwnd, msg, wparam, lparam ) \
- : SendMessageA( hwnd, msg, wparam, lparam ))
-
- DPRINT("%p '%s' %d %d %04x\n",
- hDlg, spec ? spec : "NULL", idLBox, idStatic, attrib );
+ ((attrib & DDL_POSTMSGS) ? PostMessageW( hwnd, msg, wparam, lparam ) \
+ : SendMessageW( hwnd, msg, wparam, lparam ))
+
+// DPRINT("%p '%s' %d %d %04x\n",
+// hDlg, spec ? spec : "NULL", idLBox, idStatic, attrib );
/* If the path exists and is a directory, chdir to it */
- if (!spec || !spec[0] || SetCurrentDirectoryA( spec )) spec = any;
+ if (!spec || !spec[0] || SetCurrentDirectoryW( spec )) spec = any;
else
{
- char *p, *p2;
+ WCHAR *p, *p2;
p = spec;
- if ((p2 = strrchr( p, '\\' ))) p = p2;
- if ((p2 = strrchr( p, '/' ))) p = p2;
+ if ((p2 = strrchrW( p, '\\' ))) p = p2;
+ if ((p2 = strrchrW( p, '/' ))) p = p2;
if (p != spec)
{
- char sep = *p;
+ WCHAR sep = *p;
*p = 0;
- if (!SetCurrentDirectoryA( spec ))
+ if (!SetCurrentDirectoryW( spec ))
{
*p = sep; /* Restore the original spec */
return FALSE;
@@ -1251,7 +1220,7 @@
}
if (SENDMSG( combo ? CB_DIR : LB_DIR,
(attrib & (DDL_DIRECTORY | DDL_DRIVES)) | DDL_EXCLUSIVE,
- (LPARAM)"*.*" ) == LB_ERR)
+ (LPARAM)any ) == LB_ERR)
return FALSE;
}
else
@@ -1264,17 +1233,17 @@
if (idStatic && ((hwnd = GetDlgItem( hDlg, idStatic )) != 0))
{
- char temp[MAX_PATH];
- GetCurrentDirectoryA( sizeof(temp), temp );
- CharLowerA( temp );
+ WCHAR temp[MAX_PATH];
+ GetCurrentDirectoryW( sizeof(temp)/sizeof(WCHAR), temp );
+ CharLowerW( temp );
/* Can't use PostMessage() here, because the string is on the stack */
- SetDlgItemTextA( hDlg, idStatic, temp );
+ SetDlgItemTextW( hDlg, idStatic, temp );
}
if (orig_spec && (spec != orig_spec))
{
/* Update the original file spec */
- char *p = spec;
+ WCHAR *p = spec;
while ((*orig_spec++ = *p++));
}
@@ -1283,26 +1252,24 @@
}
/**********************************************************************
- * DIALOG_DlgDirListW
+ * DIALOG_DlgDirListA
*
- * Helper function for DlgDirList*W
- */
-static INT DIALOG_DlgDirListW( HWND hDlg, LPWSTR spec, INT idLBox,
- INT idStatic, UINT attrib, BOOL combo )
+ * Helper function for DlgDirList*A
+ */
+static INT DIALOG_DlgDirListA( HWND hDlg, LPSTR spec, INT idLBox,
+ INT idStatic, UINT attrib, BOOL combo )
{
if (spec)
{
- LPSTR specA;
- INT ret;
-
- HEAP_strdupWtoA ( &specA, spec, lstrlenW(spec) );
- ret = DIALOG_DlgDirList( hDlg, specA, idLBox, idStatic,
- attrib, combo );
- MultiByteToWideChar( CP_ACP, 0, specA, -1, spec, 0x7fffffff );
- HEAP_free( specA );
+ INT ret, len = MultiByteToWideChar( CP_ACP, 0, spec, -1, NULL, 0 );
+ LPWSTR specW = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
+ MultiByteToWideChar( CP_ACP, 0, spec, -1, specW, len );
+ ret = DIALOG_DlgDirListW( hDlg, specW, idLBox, idStatic, attrib, combo );
+ WideCharToMultiByte( CP_ACP, 0, specW, -1, spec, 0x7fffffff, NULL, NULL );
+ HeapFree( GetProcessHeap(), 0, specW );
return ret;
}
- return DIALOG_DlgDirList( hDlg, NULL, idLBox, idStatic, attrib, combo );
+ return DIALOG_DlgDirListW( hDlg, NULL, idLBox, idStatic, attrib, combo );
}
/**********************************************************************
@@ -1310,10 +1277,10 @@
*
* Helper function for DlgDirSelect*
*/
-static BOOL DIALOG_DlgDirSelect( HWND hwnd, LPSTR str, INT len,
+static BOOL DIALOG_DlgDirSelect( HWND hwnd, LPWSTR str, INT len,
INT id, BOOL unicode, BOOL combo )
{
- char *buffer, *ptr;
+ WCHAR *buffer, *ptr;
INT item, size;
BOOL ret;
HWND listbox = GetDlgItem( hwnd, id );
@@ -1321,14 +1288,14 @@
DPRINT("%p '%s' %d\n", hwnd, str, id );
if (!listbox) return FALSE;
- item = SendMessageA(listbox, combo ? CB_GETCURSEL : LB_GETCURSEL, 0, 0 );
+ item = SendMessageW(listbox, combo ? CB_GETCURSEL : LB_GETCURSEL, 0, 0 );
if (item == LB_ERR) return FALSE;
- size = SendMessageA(listbox, combo ? CB_GETLBTEXTLEN : LB_GETTEXTLEN, 0, 0 );
+ size = SendMessageW(listbox, combo ? CB_GETLBTEXTLEN : LB_GETTEXTLEN, 0, 0 );
if (size == LB_ERR) return FALSE;
if (!(buffer = HeapAlloc( GetProcessHeap(), 0, size+1 ))) return FALSE;
- SendMessageA( listbox, combo ? CB_GETLBTEXT : LB_GETTEXT, item, (LPARAM)buffer );
+ SendMessageW( listbox, combo ? CB_GETLBTEXT : LB_GETTEXT, item, (LPARAM)buffer );
if ((ret = (buffer[0] == '['))) /* drive or directory */
{
@@ -1340,7 +1307,7 @@
}
else
{
- buffer[strlen(buffer)-1] = '\\';
+ buffer[strlenW(buffer)-1] = '\\';
ptr = buffer + 1;
}
}
@@ -1348,10 +1315,10 @@
if (unicode)
{
- if (len > 0 && !MultiByteToWideChar( CP_ACP, 0, ptr, -1, (LPWSTR)str,
len ))
- ((LPWSTR)str)[len-1] = 0;
- }
- else lstrcpynA( str, ptr, len );
+ if (len > 0 && !WideCharToMultiByte( CP_ACP, 0, ptr, -1, (LPSTR)str,
len, 0, 0 ))
+ ((LPSTR)str)[len-1] = 0;
+ }
+ else lstrcpynW( str, ptr, len );
HeapFree( GetProcessHeap(), 0, buffer );
DPRINT("Returning %d '%s'\n", ret, str );
return ret;
@@ -1375,6 +1342,28 @@
/* FUNCTIONS *****************************************************************/
+
+/*
+ * @implemented
+ */
+HWND
+STDCALL
+CreateDialogIndirectParamAorW(
+ HINSTANCE hInstance,
+ LPCDLGTEMPLATE lpTemplate,
+ HWND hWndParent,
+ DLGPROC lpDialogFunc,
+ LPARAM lParamInit,
+ DWORD Flags)
+{
+/* FIXME:
+ * This function might be obsolete since I don't think it is exported by NT
+ * Also wine has one more parameter identifying weather it should call
+ * the function with unicode or not
+ */
+ return DIALOG_CreateIndirect( hInstance, lpTemplate, hWndParent, lpDialogFunc,
lParamInit , !Flags, FALSE );
+}
+
/*
* @implemented
@@ -1388,28 +1377,7 @@
DLGPROC lpDialogFunc,
LPARAM lParamInit)
{
- return DIALOG_CreateIndirect( hInstance, lpTemplate, hWndParent, lpDialogFunc,
lParamInit, FALSE, FALSE );
-}
-
-
-/*
- * @unimplemented
- */
-HWND
-STDCALL
-CreateDialogIndirectParamAorW(
- HINSTANCE hInstance,
- LPCDLGTEMPLATE lpTemplate,
- HWND hWndParent,
- DLGPROC lpDialogFunc,
- LPARAM lParamInit)
-{
- /* FIXME:
- This function might be obsolete since I don't think it is exported by NT
- Also wine has one more parameter identifying weather it should call
- the function with unicode or not */
- UNIMPLEMENTED;
- return (HWND)0;
+ return CreateDialogIndirectParamAorW( hInstance, lpTemplate, hWndParent, lpDialogFunc,
lParamInit, 2 );
}
@@ -1425,7 +1393,7 @@
DLGPROC lpDialogFunc,
LPARAM lParamInit)
{
- return DIALOG_CreateIndirect( hInstance, lpTemplate, hWndParent, lpDialogFunc,
lParamInit, TRUE, FALSE );
+ return CreateDialogIndirectParamAorW( hInstance, lpTemplate, hWndParent, lpDialogFunc,
lParamInit, 0);
}
@@ -1490,9 +1458,9 @@
if (!(dlgInfo = GETDLGINFO(hDlg)))
return DefWindowProcA( hDlg, Msg, wParam, lParam );
- SetWindowLongW( hDlg, DWL_MSGRESULT, 0 );
-
- if ((dlgproc = (WNDPROC)GetWindowLongA( hDlg, DWL_DLGPROC )))
+ SetWindowLongPtrW( hDlg, DWLP_MSGRESULT, 0 );
+
+ if ((dlgproc = (WNDPROC)GetWindowLongPtrW( hDlg, DWLP_DLGPROC )))
{
/* Call dialog procedure */
result = CallWindowProcA( dlgproc, hDlg, Msg, wParam, lParam );
@@ -1551,9 +1519,9 @@
if (!(dlgInfo = GETDLGINFO(hDlg)))
return DefWindowProcW( hDlg, Msg, wParam, lParam );
- SetWindowLongW( hDlg, DWL_MSGRESULT, 0 );
-
- if ((dlgproc = (WNDPROC)GetWindowLongW( hDlg, DWL_DLGPROC )))
+ SetWindowLongPtrW( hDlg, DWLP_MSGRESULT, 0 );
+
+ if ((dlgproc = (WNDPROC)GetWindowLongPtrW( hDlg, DWLP_DLGPROC )))
{
/* Call dialog procedure */
result = CallWindowProcW( dlgproc, hDlg, Msg, wParam, lParam );
@@ -1598,6 +1566,30 @@
*/
INT_PTR
STDCALL
+DialogBoxIndirectParamAorW(
+ HINSTANCE hInstance,
+ LPCDLGTEMPLATE hDialogTemplate,
+ HWND hWndParent,
+ DLGPROC lpDialogFunc,
+ LPARAM dwInitParam,
+ DWORD Flags)
+{
+/* FIXME:
+ * This function might be obsolete since I don't think it is exported by NT
+ * Also wine has one more parameter identifying weather it should call
+ * the function with unicode or not
+ */
+ HWND hWnd = DIALOG_CreateIndirect( hInstance, hDialogTemplate, hWndParent,
lpDialogFunc, dwInitParam, !Flags, TRUE );
+ if (hWnd) return DIALOG_DoDialogBox( hWnd, hWndParent );
+ return -1;
+}
+
+
+/*
+ * @implemented
+ */
+INT_PTR
+STDCALL
DialogBoxIndirectParamA(
HINSTANCE hInstance,
LPCDLGTEMPLATE hDialogTemplate,
@@ -1605,30 +1597,7 @@
DLGPROC lpDialogFunc,
LPARAM dwInitParam)
{
- HWND hwnd = DIALOG_CreateIndirect( hInstance, hDialogTemplate, hWndParent,
lpDialogFunc, dwInitParam, FALSE, TRUE );
- if (hwnd) return DIALOG_DoDialogBox( hwnd, hWndParent );
- return -1;
-}
-
-
-/*
- * @unimplemented
- */
-INT_PTR
-STDCALL
-DialogBoxIndirectParamAorW(
- HINSTANCE hInstance,
- LPCDLGTEMPLATE hDialogTemplate,
- HWND hWndParent,
- DLGPROC lpDialogFunc,
- LPARAM dwInitParam)
-{
- /* FIXME:
- This function might be obsolete since I don't think it is exported by NT
- Also wine has one more parameter identifying weather it should call
- the function with unicode or not */
- UNIMPLEMENTED;
- return (INT_PTR)NULL;
+ return DialogBoxIndirectParamAorW( hInstance, hDialogTemplate, hWndParent,
lpDialogFunc, dwInitParam, 2);
}
@@ -1644,9 +1613,7 @@
DLGPROC lpDialogFunc,
LPARAM dwInitParam)
{
- HWND hwnd = DIALOG_CreateIndirect( hInstance, hDialogTemplate, hWndParent,
lpDialogFunc, dwInitParam, TRUE, TRUE );
- if (hwnd) return DIALOG_DoDialogBox( hwnd, hWndParent );
- return -1;
+ return DialogBoxIndirectParamAorW( hInstance, hDialogTemplate, hWndParent,
lpDialogFunc, dwInitParam, 0);
}
@@ -1666,8 +1633,8 @@
HRSRC hrsrc;
LPCDLGTEMPLATE ptr;
- if (!(hrsrc = FindResourceA( hInstance, lpTemplateName, (LPCSTR)RT_DIALOG ))) return 0;
- if (!(ptr = (LPCDLGTEMPLATE)LoadResource(hInstance, hrsrc))) return 0;
+ if (!(hrsrc = FindResourceA( hInstance, lpTemplateName, (LPCSTR)RT_DIALOG ))) return
0;
+ if (!(ptr = (LPCDLGTEMPLATE)LoadResource(hInstance, hrsrc))) return 0;
hwnd = DIALOG_CreateIndirect(hInstance, ptr, hWndParent, lpDialogFunc, dwInitParam,
FALSE, TRUE);
if (hwnd) return DIALOG_DoDialogBox(hwnd, hWndParent);
return -1;
@@ -1690,8 +1657,8 @@
HRSRC hrsrc;
LPCDLGTEMPLATE ptr;
- if (!(hrsrc = FindResourceW( hInstance, lpTemplateName, (LPCWSTR)RT_DIALOG ))) return
0;
- if (!(ptr = (LPCDLGTEMPLATE)LoadResource(hInstance, hrsrc))) return 0;
+ if (!(hrsrc = FindResourceW( hInstance, lpTemplateName, (LPCWSTR)RT_DIALOG ))) return
0;
+ if (!(ptr = (LPCDLGTEMPLATE)LoadResource(hInstance, hrsrc))) return 0;
hwnd = DIALOG_CreateIndirect(hInstance, ptr, hWndParent, lpDialogFunc, dwInitParam,
TRUE, TRUE);
if (hwnd) return DIALOG_DoDialogBox(hwnd, hWndParent);
return -1;
@@ -1710,12 +1677,12 @@
int nIDStaticPath,
UINT uFileType)
{
- return DIALOG_DlgDirList( hDlg, lpPathSpec, nIDListBox, nIDStaticPath, uFileType,
FALSE );
-}
-
-
-/*
- * @unimplemented
+ return DIALOG_DlgDirListA( hDlg, lpPathSpec, nIDListBox, nIDStaticPath, uFileType,
FALSE );
+}
+
+
+/*
+ * @implemented
*/
int
STDCALL
@@ -1726,13 +1693,12 @@
int nIDStaticPath,
UINT uFiletype)
{
- UNIMPLEMENTED;
- return 0;
-}
-
-
-/*
- * @unimplemented
+ return DIALOG_DlgDirListA( hDlg, lpPathSpec, nIDComboBox, nIDStaticPath, uFiletype,
TRUE );
+}
+
+
+/*
+ * @implemented
*/
int
STDCALL
@@ -1743,8 +1709,7 @@
int nIDStaticPath,
UINT uFiletype)
{
- UNIMPLEMENTED;
- return 0;
+ return DIALOG_DlgDirListW( hDlg, lpPathSpec, nIDComboBox, nIDStaticPath, uFiletype,
TRUE );
}
@@ -1760,12 +1725,12 @@
int nIDStaticPath,
UINT uFileType)
{
- return DIALOG_DlgDirListW( hDlg, lpPathSpec, nIDListBox, nIDStaticPath, uFileType,
FALSE );
-}
-
-
-/*
- * @unimplemented
+ return DIALOG_DlgDirListW( hDlg, lpPathSpec, nIDListBox, nIDStaticPath, uFileType,
FALSE );
+}
+
+
+/*
+ * @implemented
*/
BOOL
STDCALL
@@ -1775,13 +1740,12 @@
int nCount,
int nIDComboBox)
{
- UNIMPLEMENTED;
- return FALSE;
-}
-
-
-/*
- * @unimplemented
+ return DIALOG_DlgDirSelect( hDlg, (LPWSTR)lpString, nCount, nIDComboBox, FALSE, TRUE
);
+}
+
+
+/*
+ * @implemented
*/
BOOL
STDCALL
@@ -1791,8 +1755,7 @@
int nCount,
int nIDComboBox)
{
- UNIMPLEMENTED;
- return FALSE;
+ return DIALOG_DlgDirSelect( hDlg, (LPWSTR)lpString, nCount, nIDComboBox, TRUE, TRUE );
}
@@ -1807,7 +1770,7 @@
int nCount,
int nIDListBox)
{
- return DIALOG_DlgDirSelect( hDlg, lpString, nCount, nIDListBox, FALSE, FALSE );
+ return DIALOG_DlgDirSelect( hDlg, (LPWSTR)lpString, nCount, nIDListBox, FALSE, FALSE
);
}
@@ -1822,7 +1785,7 @@
int nCount,
int nIDListBox)
{
- return DIALOG_DlgDirSelect( hDlg, (LPSTR)lpString, nCount, nIDListBox, TRUE, FALSE
);
+ return DIALOG_DlgDirSelect( hDlg, lpString, nCount, nIDListBox, TRUE, FALSE );
}
@@ -1859,6 +1822,8 @@
SetWindowPos(hDlg, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE
| SWP_NOZORDER | SWP_NOACTIVATE | SWP_HIDEWINDOW);
+ if (hDlg == GetActiveWindow()) WinPosActivateOtherWindow( hDlg );
+
/* unblock dialog loop */
PostMessageA(hDlg, WM_NULL, 0, 0);
return TRUE;
@@ -1898,7 +1863,7 @@
GetDlgCtrlID(
HWND hwndCtl)
{
- return GetWindowLongW( hwndCtl, GWL_ID );
+ return GetWindowLongPtrW( hwndCtl, GWLP_ID );
}
@@ -2223,6 +2188,8 @@
if (CallMsgFilterW( lpMsg, MSGF_DIALOGBOX )) return TRUE;
if ((hDlg != lpMsg->hwnd) && !IsChild( hDlg, lpMsg->hwnd )) return
FALSE;
+
+ if (hDlg == GetDesktopWindow()) return FALSE;
hDlg = DIALOG_FindMsgDestination(hDlg);
@@ -2278,7 +2245,6 @@
return FALSE;
}
return TRUE;
-
}
break;
@@ -2354,7 +2320,7 @@
HWND hDlg,
int nIDButton)
{
- return (UINT)SendDlgItemMessageA( hDlg, nIDButton, BM_GETCHECK, 0, 0 );
+ return (UINT)SendDlgItemMessageW( hDlg, nIDButton, BM_GETCHECK, 0, 0 );
}
@@ -2471,13 +2437,13 @@
int nIDButton,
UINT uCheck)
{
- SendDlgItemMessageA( hDlg, nIDButton, BM_SETCHECK, uCheck, 0 );
+ SendDlgItemMessageW( hDlg, nIDButton, BM_SETCHECK, uCheck, 0 );
return TRUE;
}
static BOOL CALLBACK CheckRB(HWND hwnd, LPARAM lParam)
{
- LONG lChildID = GetWindowLongW(hwnd, GWL_ID);
+ LONG lChildID = GetWindowLongPtrW(hwnd, GWLP_ID);
RADIOGROUP *lpRadioGroup = (RADIOGROUP *)lParam;
if((lChildID >= lpRadioGroup->firstID) &&
Modified: trunk/reactos/dll/win32/user32/windows/winpos.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/windows/w…
==============================================================================
--- trunk/reactos/dll/win32/user32/windows/winpos.c (original)
+++ trunk/reactos/dll/win32/user32/windows/winpos.c Wed Aug 2 01:14:45 2006
@@ -16,6 +16,59 @@
#include <wine/debug.h>
/* FUNCTIONS *****************************************************************/
+
+/*******************************************************************
+ * can_activate_window
+ *
+ * Check if we can activate the specified window.
+ */
+static BOOL can_activate_window( HWND hwnd )
+{
+ LONG style;
+
+ if (!hwnd) return FALSE;
+ style = GetWindowLongW( hwnd, GWL_STYLE );
+ if (!(style & WS_VISIBLE)) return FALSE;
+ if ((style & (WS_POPUP|WS_CHILD)) == WS_CHILD) return FALSE;
+ return !(style & WS_DISABLED);
+}
+
+
+/*******************************************************************
+ * WINPOS_ActivateOtherWindow
+ *
+ * Activates window other than pWnd.
+ */
+void
+STDCALL
+WinPosActivateOtherWindow(HWND hwnd)
+{
+ HWND hwndTo, fg;
+
+ if ((GetWindowLongW( hwnd, GWL_STYLE ) & WS_POPUP) && (hwndTo =
GetWindow( hwnd, GW_OWNER )))
+ {
+ hwndTo = GetAncestor( hwndTo, GA_ROOT );
+ if (can_activate_window( hwndTo )) goto done;
+ }
+
+ hwndTo = hwnd;
+ for (;;)
+ {
+ if (!(hwndTo = GetWindow( hwndTo, GW_HWNDNEXT ))) break;
+ if (can_activate_window( hwndTo )) break;
+ }
+
+ done:
+ fg = GetForegroundWindow();
+ TRACE("win = %p fg = %p\n", hwndTo, fg);
+ if (!fg || (hwnd == fg))
+ {
+ if (SetForegroundWindow( hwndTo )) return;
+ }
+ if (!SetActiveWindow( hwndTo )) SetActiveWindow(0);
+}
+
+
UINT STDCALL
WinPosGetMinMaxInfo(HWND hWnd, POINT* MaxSize, POINT* MaxPos,