From 077114d844df3ddac82615c909d2930292040b66 Mon Sep 17 00:00:00 2001 From: Jim Mathies Date: Mon, 28 Jun 2010 01:04:20 -0500 Subject: [PATCH] Bug 575044 - Fix busted windows styles and disable chromemargins for fullscreen mode. r=robarnold. --- widget/src/windows/nsWindow.cpp | 81 +++++++++++++++++++-------------- widget/src/windows/nsWindow.h | 1 + 2 files changed, 48 insertions(+), 34 deletions(-) diff --git a/widget/src/windows/nsWindow.cpp b/widget/src/windows/nsWindow.cpp index e3cd3284664..0bd6fc7d0af 100644 --- a/widget/src/windows/nsWindow.cpp +++ b/widget/src/windows/nsWindow.cpp @@ -378,6 +378,7 @@ nsWindow::nsWindow() : nsBaseWidget() mWindowType = eWindowType_child; mBorderStyle = eBorderStyle_default; mPopupType = ePopupTypeAny; + mOldSizeMode = nsSizeMode_Normal; mLastPoint.x = 0; mLastPoint.y = 0; mLastSize.width = 0; @@ -1139,10 +1140,6 @@ NS_METHOD nsWindow::Show(PRBool bState) break; // use default for nsSizeMode_Minimized on Windows CE #else - case nsSizeMode_Fullscreen: - ::ShowWindow(mWnd, SW_SHOWMAXIMIZED); - break; - case nsSizeMode_Maximized : ::ShowWindow(mWnd, SW_SHOWMAXIMIZED); break; @@ -1560,7 +1557,7 @@ NS_IMETHODIMP nsWindow::SetSizeMode(PRInt32 aMode) { switch (aMode) { case nsSizeMode_Fullscreen : - mode = SW_MAXIMIZE; + mode = SW_RESTORE; break; case nsSizeMode_Maximized : @@ -2373,6 +2370,9 @@ NS_IMETHODIMP nsWindow::HideWindowChrome(PRBool aShouldHide) return NS_ERROR_FAILURE; } + if (mHideChrome == aShouldHide) + return NS_OK; + DWORD_PTR style, exStyle; mHideChrome = aShouldHide; if (aShouldHide) { @@ -2508,6 +2508,19 @@ nsWindow::MakeFullScreen(PRBool aFullScreen) #else + if (aFullScreen) { + if (mSizeMode != nsSizeMode_Fullscreen) + mOldSizeMode = mSizeMode; + SetSizeMode(nsSizeMode_Fullscreen); + } else { + SetSizeMode(mOldSizeMode); + } + + UpdateNonClientMargins(); + + // Will call hide chrome, reposition window. Note this will + // also cache dimensions for restoration, so it should only + // be called once per fullscreen request. return nsBaseWidget::MakeFullScreen(aFullScreen); #endif } @@ -4915,8 +4928,6 @@ PRBool nsWindow::ProcessMessage(UINT msg, WPARAM &wParam, LPARAM &lParam, #else *aRetValue = 0; #endif - if (mSizeMode == nsSizeMode_Fullscreen) - MakeFullScreen(TRUE); } } #ifdef WINCE_WINDOWS_MOBILE @@ -5727,7 +5738,7 @@ void nsWindow::OnWindowPosChanged(WINDOWPOS *wp, PRBool& result) #endif // Handle window size mode changes - if (wp->flags & SWP_FRAMECHANGED) { + if (wp->flags & SWP_FRAMECHANGED && mSizeMode != nsSizeMode_Fullscreen) { nsSizeModeEvent event(PR_TRUE, NS_SIZEMODE, this); WINDOWPLACEMENT pl; @@ -5883,7 +5894,9 @@ void nsWindow::OnWindowPosChanging(LPWINDOWPOS& info) { // Update non-client margins if the frame size is changing, and let the // browser know we are changing size modes, so alternative css can kick in. - if (info->flags & SWP_FRAMECHANGED) { + // If we're going into fullscreen mode, ignore this, since it'll reset + // margins to normal mode. + if (info->flags & SWP_FRAMECHANGED && mSizeMode != nsSizeMode_Fullscreen) { WINDOWPLACEMENT pl; pl.length = sizeof(pl); ::GetWindowPlacement(mWnd, &pl); @@ -7413,43 +7426,43 @@ void nsWindow::SetWindowTranslucencyInner(nsTransparencyMode aMode) if (aMode == mTransparencyMode) return; + // stop on dialogs and popups! HWND hWnd = GetTopLevelHWND(mWnd, PR_TRUE); - nsWindow* topWindow = GetNSWindowPtr(hWnd); + nsWindow* parent = GetNSWindowPtr(hWnd); - if (!topWindow) + if (!parent) { NS_WARNING("Trying to use transparent chrome in an embedded context"); return; } - LONG_PTR style = 0, exStyle = 0; - switch(aMode) { - case eTransparencyTransparent: - exStyle |= WS_EX_LAYERED; - case eTransparencyOpaque: - case eTransparencyGlass: - topWindow->mTransparencyMode = aMode; - break; + if (parent != this) { + NS_WARNING("Setting SetWindowTranslucencyInner on a parent this is not us!"); } - // Hide chrome supports caching old styles, so this can be - // flipped back and forth - //topWindow->HideWindowChrome(aMode == eTransparencyTransparent); - - style |= topWindow->WindowStyle(); - exStyle |= topWindow->WindowExStyle(); - if (aMode == eTransparencyTransparent) { - style &= ~(WS_CAPTION | WS_THICKFRAME | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX); - exStyle &= ~(WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE); + // If we're switching to the use of a transparent window, hide the chrome + // on our parent. + HideWindowChrome(PR_TRUE); + } else if (mHideChrome && mTransparencyMode == eTransparencyTransparent) { + // if we're switching out of transparent, re-enable our parent's chrome. + HideWindowChrome(PR_FALSE); } - if (topWindow->mIsVisible) - style |= WS_VISIBLE; - if (topWindow->mSizeMode == nsSizeMode_Maximized) - style |= WS_MAXIMIZE; - else if (topWindow->mSizeMode == nsSizeMode_Minimized) - style |= WS_MINIMIZE; + LONG_PTR style = ::GetWindowLongPtrW(hWnd, GWL_STYLE), + exStyle = ::GetWindowLongPtr(hWnd, GWL_EXSTYLE); + + if (parent->mIsVisible) + style |= WS_VISIBLE; + if (parent->mSizeMode == nsSizeMode_Maximized) + style |= WS_MAXIMIZE; + else if (parent->mSizeMode == nsSizeMode_Minimized) + style |= WS_MINIMIZE; + + if (aMode == eTransparencyTransparent) + exStyle |= WS_EX_LAYERED; + else + exStyle &= ~WS_EX_LAYERED; VERIFY_WINDOW_STYLE(style); ::SetWindowLongPtrW(hWnd, GWL_STYLE, style); diff --git a/widget/src/windows/nsWindow.h b/widget/src/windows/nsWindow.h index b33f4479942..ed73ff20413 100644 --- a/widget/src/windows/nsWindow.h +++ b/widget/src/windows/nsWindow.h @@ -456,6 +456,7 @@ protected: nsPopupType mPopupType; PRPackedBool mDisplayPanFeedback; PRPackedBool mHideChrome; + nsSizeMode mOldSizeMode; WindowHook mWindowHook; static PRUint32 sInstanceCount; static TriStateBool sCanQuit;