diff --git a/dlls/user32/defwnd.c b/dlls/user32/defwnd.c index 244e544b153..e62f0214352 100644 --- a/dlls/user32/defwnd.c +++ b/dlls/user32/defwnd.c @@ -572,12 +572,7 @@ static LRESULT DEFWND_DefWinProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPa break; case WM_ISACTIVEICON: - { - WND *wndPtr = WIN_GetPtr( hwnd ); - BOOL ret = (wndPtr->flags & WIN_NCACTIVATED) != 0; - WIN_ReleasePtr( wndPtr ); - return ret; - } + return (win_get_flags( hwnd ) & WIN_NCACTIVATED) != 0; case WM_NOTIFYFORMAT: if (IsWindowUnicode(hwnd)) return NFR_UNICODE; diff --git a/dlls/user32/mdi.c b/dlls/user32/mdi.c index 665610d73ca..c23a670a15d 100644 --- a/dlls/user32/mdi.c +++ b/dlls/user32/mdi.c @@ -1054,12 +1054,7 @@ LRESULT MDIClientWndProc_common( HWND hwnd, UINT message, WPARAM wParam, LPARAM if (!(ci = get_client_info( hwnd ))) { - if (message == WM_NCCREATE) - { - WND *wndPtr = WIN_GetPtr( hwnd ); - wndPtr->flags |= WIN_ISMDICLIENT; - WIN_ReleasePtr( wndPtr ); - } + if (message == WM_NCCREATE) win_set_flags( hwnd, WIN_ISMDICLIENT, 0 ); return unicode ? DefWindowProcW( hwnd, message, wParam, lParam ) : DefWindowProcA( hwnd, message, wParam, lParam ); } diff --git a/dlls/user32/nonclient.c b/dlls/user32/nonclient.c index a9de8126de6..4516aa01150 100644 --- a/dlls/user32/nonclient.c +++ b/dlls/user32/nonclient.c @@ -1126,20 +1126,13 @@ LRESULT NC_HandleNCPaint( HWND hwnd , HRGN clip) */ LRESULT NC_HandleNCActivate( HWND hwnd, WPARAM wParam, LPARAM lParam ) { - HWND parent; - WND* wndPtr = WIN_GetPtr( hwnd ); - - if (!wndPtr || wndPtr == WND_OTHER_PROCESS) return FALSE; - /* Lotus Notes draws menu descriptions in the caption of its main * window. When it wants to restore original "system" view, it just * sends WM_NCACTIVATE message to itself. Any optimizations here in * attempt to minimize redrawings lead to a not restored caption. */ - if (wParam) wndPtr->flags |= WIN_NCACTIVATED; - else wndPtr->flags &= ~WIN_NCACTIVATED; - parent = wndPtr->parent; - WIN_ReleasePtr( wndPtr ); + if (wParam) win_set_flags( hwnd, WIN_NCACTIVATED, 0 ); + else win_set_flags( hwnd, 0, WIN_NCACTIVATED ); /* This isn't documented but is reproducible in at least XP SP2 and * Outlook 2007 depends on it @@ -1151,8 +1144,8 @@ LRESULT NC_HandleNCActivate( HWND hwnd, WPARAM wParam, LPARAM lParam ) else NC_DoNCPaint( hwnd, (HRGN)1 ); - if (parent == GetDesktopWindow()) - PostMessageW( parent, WM_PARENTNOTIFY, WM_NCACTIVATE, (LPARAM)hwnd ); + if (GetAncestor( hwnd, GA_PARENT ) == GetDesktopWindow()) + PostMessageW( GetDesktopWindow(), WM_PARENTNOTIFY, WM_NCACTIVATE, (LPARAM)hwnd ); } return TRUE; diff --git a/dlls/user32/win.c b/dlls/user32/win.c index 463602ac086..9051f7a344b 100644 --- a/dlls/user32/win.c +++ b/dlls/user32/win.c @@ -663,6 +663,24 @@ HWND WIN_IsCurrentThread( HWND hwnd ) } +/*********************************************************************** + * win_set_flags + * + * Set the flags of a window and return the previous value. + */ +UINT win_set_flags( HWND hwnd, UINT set_mask, UINT clear_mask ) +{ + UINT ret; + WND *ptr = WIN_GetPtr( hwnd ); + + if (!ptr || ptr == WND_OTHER_PROCESS || ptr == WND_DESKTOP) return 0; + ret = ptr->flags; + ptr->flags = (ret & ~clear_mask) | set_mask; + WIN_ReleasePtr( ptr ); + return ret; +} + + /*********************************************************************** * WIN_GetFullHandle * @@ -1323,16 +1341,7 @@ HWND WIN_CreateWindowEx( CREATESTRUCTW *cs, LPCWSTR className, HINSTANCE module, /* Fix the styles for MDI children */ if (cs->dwExStyle & WS_EX_MDICHILD) { - UINT flags = 0; - - wndPtr = WIN_GetPtr(cs->hwndParent); - if (wndPtr && wndPtr != WND_OTHER_PROCESS && wndPtr != WND_DESKTOP) - { - flags = wndPtr->flags; - WIN_ReleasePtr(wndPtr); - } - - if (!(flags & WIN_ISMDICLIENT)) + if (!(win_get_flags( cs->hwndParent ) & WIN_ISMDICLIENT)) { WARN("WS_EX_MDICHILD, but parent %p is not MDIClient\n", cs->hwndParent); return 0; @@ -1627,17 +1636,13 @@ HWND WIN_CreateWindowEx( CREATESTRUCTW *cs, LPCWSTR className, HINSTANCE module, /* send the size messages */ - if (!(wndPtr = WIN_GetPtr( hwnd )) || - wndPtr == WND_OTHER_PROCESS || wndPtr == WND_DESKTOP) return 0; - if (!(wndPtr->flags & WIN_NEED_SIZE)) + if (!(win_get_flags( hwnd ) & WIN_NEED_SIZE)) { - WIN_ReleasePtr( wndPtr ); WIN_GetRectangles( hwnd, COORDS_PARENT, NULL, &rect ); SendMessageW( hwnd, WM_SIZE, SIZE_RESTORED, MAKELONG(rect.right-rect.left, rect.bottom-rect.top)); SendMessageW( hwnd, WM_MOVE, 0, MAKELONG( rect.left, rect.top ) ); } - else WIN_ReleasePtr( wndPtr ); /* Show the window, maximizing or minimizing if needed */ @@ -3212,7 +3217,6 @@ HWND WINAPI GetWindow( HWND hwnd, UINT rel ) BOOL WINAPI ShowOwnedPopups( HWND owner, BOOL fShow ) { int count = 0; - WND *pWnd; HWND *win_array = WIN_ListChildren( GetDesktopWindow() ); if (!win_array) return TRUE; @@ -3221,35 +3225,24 @@ BOOL WINAPI ShowOwnedPopups( HWND owner, BOOL fShow ) while (--count >= 0) { if (GetWindow( win_array[count], GW_OWNER ) != owner) continue; - if (!(pWnd = WIN_GetPtr( win_array[count] ))) continue; - if (pWnd == WND_OTHER_PROCESS) continue; if (fShow) { - if (pWnd->flags & WIN_NEEDS_SHOW_OWNEDPOPUP) - { - WIN_ReleasePtr( pWnd ); + if (win_get_flags( win_array[count] ) & WIN_NEEDS_SHOW_OWNEDPOPUP) /* In Windows, ShowOwnedPopups(TRUE) generates * WM_SHOWWINDOW messages with SW_PARENTOPENING, * regardless of the state of the owner */ SendMessageW(win_array[count], WM_SHOWWINDOW, SW_SHOWNORMAL, SW_PARENTOPENING); - continue; - } } else { - if (pWnd->dwStyle & WS_VISIBLE) - { - WIN_ReleasePtr( pWnd ); + if (GetWindowLongW( win_array[count], GWL_STYLE ) & WS_VISIBLE) /* In Windows, ShowOwnedPopups(FALSE) generates * WM_SHOWWINDOW messages with SW_PARENTCLOSING, * regardless of the state of the owner */ SendMessageW(win_array[count], WM_SHOWWINDOW, SW_HIDE, SW_PARENTCLOSING); - continue; - } } - WIN_ReleasePtr( pWnd ); } HeapFree( GetProcessHeap(), 0, win_array ); return TRUE; diff --git a/dlls/user32/win.h b/dlls/user32/win.h index 8da9c247bb4..8739cadd3f6 100644 --- a/dlls/user32/win.h +++ b/dlls/user32/win.h @@ -88,6 +88,7 @@ extern WND *WIN_GetPtr( HWND hwnd ) DECLSPEC_HIDDEN; extern HWND WIN_GetFullHandle( HWND hwnd ) DECLSPEC_HIDDEN; extern HWND WIN_IsCurrentProcess( HWND hwnd ) DECLSPEC_HIDDEN; extern HWND WIN_IsCurrentThread( HWND hwnd ) DECLSPEC_HIDDEN; +extern UINT win_set_flags( HWND hwnd, UINT set_mask, UINT clear_mask ) DECLSPEC_HIDDEN; extern HWND WIN_SetOwner( HWND hwnd, HWND owner ) DECLSPEC_HIDDEN; extern ULONG WIN_SetStyle( HWND hwnd, ULONG set_bits, ULONG clear_bits ) DECLSPEC_HIDDEN; extern BOOL WIN_GetRectangles( HWND hwnd, enum coords_relative relative, RECT *rectWindow, RECT *rectClient ) DECLSPEC_HIDDEN; @@ -137,4 +138,9 @@ static inline void mirror_rect( const RECT *window_rect, RECT *rect ) rect->right = width - tmp; } +static inline UINT win_get_flags( HWND hwnd ) +{ + return win_set_flags( hwnd, 0, 0 ); +} + #endif /* __WINE_WIN_H */ diff --git a/dlls/user32/winpos.c b/dlls/user32/winpos.c index cf543293c53..993ec9bdcb0 100644 --- a/dlls/user32/winpos.c +++ b/dlls/user32/winpos.c @@ -940,7 +940,6 @@ static POINT WINPOS_FindIconPos( HWND hwnd, POINT pt ) */ UINT WINPOS_MinMaximize( HWND hwnd, UINT cmd, LPRECT rect ) { - WND *wndPtr; UINT swpFlags = 0; POINT size; LONG old_style; @@ -974,10 +973,8 @@ UINT WINPOS_MinMaximize( HWND hwnd, UINT cmd, LPRECT rect ) case SW_SHOWMINIMIZED: case SW_FORCEMINIMIZE: case SW_MINIMIZE: - if (!(wndPtr = WIN_GetPtr( hwnd )) || wndPtr == WND_OTHER_PROCESS) return 0; - if( wndPtr->dwStyle & WS_MAXIMIZE) wndPtr->flags |= WIN_RESTORE_MAX; - else wndPtr->flags &= ~WIN_RESTORE_MAX; - WIN_ReleasePtr( wndPtr ); + if (IsZoomed( hwnd )) win_set_flags( hwnd, WIN_RESTORE_MAX, 0 ); + else win_set_flags( hwnd, 0, WIN_RESTORE_MAX ); old_style = WIN_SetStyle( hwnd, WS_MINIMIZE, WS_MAXIMIZE ); @@ -999,11 +996,7 @@ UINT WINPOS_MinMaximize( HWND hwnd, UINT cmd, LPRECT rect ) old_style = WIN_SetStyle( hwnd, WS_MAXIMIZE, WS_MINIMIZE ); if (old_style & WS_MINIMIZE) { - if ((wndPtr = WIN_GetPtr( hwnd )) && wndPtr != WND_OTHER_PROCESS) - { - wndPtr->flags |= WIN_RESTORE_MAX; - WIN_ReleasePtr( wndPtr ); - } + win_set_flags( hwnd, WIN_RESTORE_MAX, 0 ); WINPOS_ShowIconTitle( hwnd, FALSE ); } @@ -1013,11 +1006,7 @@ UINT WINPOS_MinMaximize( HWND hwnd, UINT cmd, LPRECT rect ) break; case SW_SHOWNOACTIVATE: - if ((wndPtr = WIN_GetPtr( hwnd )) && wndPtr != WND_OTHER_PROCESS) - { - wndPtr->flags &= ~WIN_RESTORE_MAX; - WIN_ReleasePtr( wndPtr ); - } + win_set_flags( hwnd, 0, WIN_RESTORE_MAX ); /* fall through */ case SW_SHOWNORMAL: case SW_RESTORE: @@ -1025,14 +1014,8 @@ UINT WINPOS_MinMaximize( HWND hwnd, UINT cmd, LPRECT rect ) old_style = WIN_SetStyle( hwnd, 0, WS_MINIMIZE | WS_MAXIMIZE ); if (old_style & WS_MINIMIZE) { - BOOL restore_max; - WINPOS_ShowIconTitle( hwnd, FALSE ); - - if (!(wndPtr = WIN_GetPtr( hwnd )) || wndPtr == WND_OTHER_PROCESS) return 0; - restore_max = (wndPtr->flags & WIN_RESTORE_MAX) != 0; - WIN_ReleasePtr( wndPtr ); - if (restore_max) + if (win_get_flags( hwnd ) & WIN_RESTORE_MAX) { /* Restore to maximized position */ WINPOS_GetMinMaxInfo( hwnd, &size, &wpl.ptMaxPosition, NULL, NULL); @@ -1454,14 +1437,7 @@ static BOOL WINPOS_SetPlacement( HWND hwnd, const WINDOWPLACEMENT *wndpl, UINT f /* SDK: ...valid only the next time... */ if( wndpl->flags & WPF_RESTORETOMAXIMIZED ) - { - pWnd = WIN_GetPtr( hwnd ); - if (pWnd && pWnd != WND_OTHER_PROCESS) - { - pWnd->flags |= WIN_RESTORE_MAX; - WIN_ReleasePtr( pWnd ); - } - } + win_set_flags( hwnd, WIN_RESTORE_MAX, 0 ); } return TRUE; }