diff --git a/widget/src/windows/nsWindow.cpp b/widget/src/windows/nsWindow.cpp index d89638bc032..3be9e377fa6 100644 --- a/widget/src/windows/nsWindow.cpp +++ b/widget/src/windows/nsWindow.cpp @@ -3116,21 +3116,16 @@ nsWindow::GetAttention(PRInt32 aCycleCount) if (!mWnd) return NS_ERROR_NOT_INITIALIZED; - // Don't flash if the flash count is 0 or if the - // top level window is already active. + HWND flashWnd = GetTopLevelHWND(mWnd, false, false); HWND fgWnd = ::GetForegroundWindow(); - if (aCycleCount == 0 || fgWnd == GetTopLevelHWND(mWnd)) + // Don't flash if the flash count is 0 or if the foreground window is our + // window handle or that of our owned-most window. + if (aCycleCount == 0 || + flashWnd == fgWnd || + flashWnd == GetTopLevelHWND(fgWnd, false, false)) { return NS_OK; - - HWND flashWnd = mWnd; - while (HWND ownerWnd = ::GetWindow(flashWnd, GW_OWNER)) { - flashWnd = ownerWnd; } - // Don't flash if the owner window is active either. - if (fgWnd == flashWnd) - return NS_OK; - DWORD defaultCycleCount = 0; ::SystemParametersInfo(SPI_GETFOREGROUNDFLASHCOUNT, 0, &defaultCycleCount, 0); @@ -8895,7 +8890,9 @@ nsWindow* nsWindow::GetTopLevelWindow(bool aStopOnDialogOrPopup) // of GetTopLevelWindow method. Because this is checking whether the window // is top level only in Win32 window system. Therefore, the result window // may not be managed by us. -HWND nsWindow::GetTopLevelHWND(HWND aWnd, bool aStopOnDialogOrPopup) +HWND nsWindow::GetTopLevelHWND(HWND aWnd, + bool aStopIfNotChild, + bool aStopIfNotPopup) { HWND curWnd = aWnd; HWND topWnd = NULL; @@ -8904,7 +8901,7 @@ HWND nsWindow::GetTopLevelHWND(HWND aWnd, bool aStopOnDialogOrPopup) while (curWnd) { topWnd = curWnd; - if (aStopOnDialogOrPopup) { + if (aStopIfNotChild) { DWORD_PTR style = ::GetWindowLongPtrW(curWnd, GWL_STYLE); VERIFY_WINDOW_STYLE(style); @@ -8914,6 +8911,12 @@ HWND nsWindow::GetTopLevelHWND(HWND aWnd, bool aStopOnDialogOrPopup) } upWnd = ::GetParent(curWnd); // Parent or owner (if has no parent) + + // GetParent will only return the owner if the passed in window + // has the WS_POPUP style. + if (!upWnd && !aStopIfNotPopup) { + upWnd = ::GetWindow(curWnd, GW_OWNER); + } curWnd = upWnd; } diff --git a/widget/src/windows/nsWindow.h b/widget/src/windows/nsWindow.h index 947c5372ecd..15f34f08c9a 100644 --- a/widget/src/windows/nsWindow.h +++ b/widget/src/windows/nsWindow.h @@ -242,7 +242,9 @@ public: */ static void GlobalMsgWindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); nsWindow* GetTopLevelWindow(bool aStopOnDialogOrPopup); - static HWND GetTopLevelHWND(HWND aWnd, bool aStopOnDialogOrPopup = false); + static HWND GetTopLevelHWND(HWND aWnd, + bool aStopIfNotChild = false, + bool aStopIfNotPopup = true); HWND GetWindowHandle() { return mWnd; } WNDPROC GetPrevWindowProc() { return mPrevWndProc; } static nsWindow* GetNSWindowPtr(HWND aWnd);