[PATCH] user32: Fix dialogs for 64-bits wine
mlankhorst
mlankhorst at dhcp-172-29-61-127.smo.corp.google.com
Mon Dec 1 16:04:09 CST 2008
---
dlls/user32/controls.h | 5 +----
dlls/user32/defdlg.c | 38 ++++++++++++++++++++++----------------
dlls/user32/dialog16.c | 2 +-
dlls/user32/win.h | 2 ++
4 files changed, 26 insertions(+), 21 deletions(-)
diff --git a/dlls/user32/controls.h b/dlls/user32/controls.h
index a16d166..974cf5b 100644
--- a/dlls/user32/controls.h
+++ b/dlls/user32/controls.h
@@ -150,7 +150,7 @@ typedef struct
extern BOOL COMBO_FlipListbox( LPHEADCOMBO, BOOL, BOOL ) DECLSPEC_HIDDEN;
/* Dialog info structure */
-typedef struct
+typedef struct tagDIALOGINFO
{
HWND hwndFocus; /* Current control with focus */
HFONT hUserFont; /* Dialog font */
@@ -165,9 +165,6 @@ typedef struct
#define DF_END 0x0001
#define DF_OWNERENABLED 0x0002
-/* offset of DIALOGINFO ptr in dialog extra bytes */
-#define DWLP_WINE_DIALOGINFO (DWLP_USER+sizeof(ULONG_PTR))
-
extern DIALOGINFO *DIALOG_get_info( HWND hwnd, BOOL create ) DECLSPEC_HIDDEN;
extern void DIALOG_EnableOwner( HWND hOwner ) DECLSPEC_HIDDEN;
extern BOOL DIALOG_DisableOwner( HWND hOwner ) DECLSPEC_HIDDEN;
diff --git a/dlls/user32/defdlg.c b/dlls/user32/defdlg.c
index d2305e0..ee1b58e 100644
--- a/dlls/user32/defdlg.c
+++ b/dlls/user32/defdlg.c
@@ -230,8 +230,10 @@ static LRESULT DEFDLG_Proc( HWND hwnd, UINT msg, WPARAM wParam,
return 1;
}
case WM_NCDESTROY:
- if ((dlgInfo = (DIALOGINFO *)SetWindowLongPtrW( hwnd, DWLP_WINE_DIALOGINFO, 0 )))
+ if (dlgInfo)
{
+ WND *wndPtr;
+
/* Free dialog heap (if created) */
if (dlgInfo->hDialogHeap)
{
@@ -241,6 +243,10 @@ static LRESULT DEFDLG_Proc( HWND hwnd, UINT msg, WPARAM wParam,
if (dlgInfo->hUserFont) DeleteObject( dlgInfo->hUserFont );
if (dlgInfo->hMenu) DestroyMenu( dlgInfo->hMenu );
HeapFree( GetProcessHeap(), 0, dlgInfo );
+
+ wndPtr = WIN_GetPtr( hwnd );
+ wndPtr->dlgInfo = NULL;
+ WIN_ReleasePtr( wndPtr );
}
/* Window clean-up */
return DefWindowProcA( hwnd, msg, wParam, lParam );
@@ -335,11 +341,18 @@ static LRESULT DEFDLG_Epilog(HWND hwnd, UINT msg, BOOL fResult)
DIALOGINFO *DIALOG_get_info( HWND hwnd, BOOL create )
{
WND* wndPtr;
- DIALOGINFO* dlgInfo = (DIALOGINFO *)GetWindowLongPtrW( hwnd, DWLP_WINE_DIALOGINFO );
+ DIALOGINFO* dlgInfo;
- if(!dlgInfo && create)
+ wndPtr = WIN_GetPtr( hwnd );
+ if (!wndPtr || wndPtr == WND_OTHER_PROCESS || wndPtr == WND_DESKTOP)
+ return NULL;
+
+ dlgInfo = wndPtr->dlgInfo;
+
+ if (!dlgInfo && create)
{
- if (!(dlgInfo = HeapAlloc( GetProcessHeap(), 0, sizeof(*dlgInfo) ))) return NULL;
+ if (!(dlgInfo = HeapAlloc( GetProcessHeap(), 0, sizeof(*dlgInfo) )))
+ goto out;
dlgInfo->hwndFocus = 0;
dlgInfo->hUserFont = 0;
dlgInfo->hMenu = 0;
@@ -348,19 +361,12 @@ DIALOGINFO *DIALOG_get_info( HWND hwnd, BOOL create )
dlgInfo->idResult = 0;
dlgInfo->flags = 0;
dlgInfo->hDialogHeap = 0;
- wndPtr = WIN_GetPtr( hwnd );
- if (wndPtr && wndPtr != WND_OTHER_PROCESS && wndPtr != WND_DESKTOP)
- {
- wndPtr->flags |= WIN_ISDIALOG;
- WIN_ReleasePtr( wndPtr );
- SetWindowLongPtrW( hwnd, DWLP_WINE_DIALOGINFO, (ULONG_PTR)dlgInfo );
- }
- else
- {
- HeapFree( GetProcessHeap(), 0, dlgInfo );
- return NULL;
- }
+ wndPtr->dlgInfo = dlgInfo;
+ wndPtr->flags |= WIN_ISDIALOG;
}
+
+out:
+ WIN_ReleasePtr( wndPtr );
return dlgInfo;
}
diff --git a/dlls/user32/dialog16.c b/dlls/user32/dialog16.c
index 6850d35..4fcbef4 100644
--- a/dlls/user32/dialog16.c
+++ b/dlls/user32/dialog16.c
@@ -434,9 +434,9 @@ static HWND DIALOG_CreateIndirect16( HINSTANCE16 hInst, LPCVOID dlgTemplate,
}
wndPtr = WIN_GetPtr( hwnd );
wndPtr->flags |= WIN_ISDIALOG;
+ wndPtr->dlgInfo = dlgInfo;
WIN_ReleasePtr( wndPtr );
- SetWindowLongPtrW( hwnd, DWLP_WINE_DIALOGINFO, (LONG_PTR)dlgInfo );
SetWindowLong16( HWND_16(hwnd), DWLP_DLGPROC, (LONG)dlgProc );
if (dlgInfo->hUserFont)
diff --git a/dlls/user32/win.h b/dlls/user32/win.h
index bc024f4..447f4fd 100644
--- a/dlls/user32/win.h
+++ b/dlls/user32/win.h
@@ -31,6 +31,7 @@
#define WND_MAGIC 0x444e4957 /* 'WIND' */
struct tagCLASS;
+struct tagDIALOGINFO;
typedef struct tagWND
{
@@ -60,6 +61,7 @@ typedef struct tagWND
HMENU hSysMenu; /* window's copy of System Menu */
HICON hIcon; /* window's icon */
HICON hIconSmall; /* window's small icon */
+ struct tagDIALOGINFO *dlgInfo;/* Dialog additional info (dialogs only) */
int cbWndExtra; /* class cbWndExtra at window creation */
DWORD_PTR userdata; /* User private data */
DWORD wExtra[1]; /* Window extra bytes */
--
1.5.6.5
--------------060808010906060508090103--
More information about the wine-patches
mailing list