Bug 635691 - GetAttention() flashes the grandparent window although the parent window is in the forground. r=neil

This commit is contained in:
Brian R. Bondy 2011-10-09 10:19:24 -04:00
Родитель 9d5ab77010
Коммит f5c75ea9ff
2 изменённых файлов: 19 добавлений и 14 удалений

Просмотреть файл

@ -3116,21 +3116,16 @@ nsWindow::GetAttention(PRInt32 aCycleCount)
if (!mWnd) if (!mWnd)
return NS_ERROR_NOT_INITIALIZED; return NS_ERROR_NOT_INITIALIZED;
// Don't flash if the flash count is 0 or if the HWND flashWnd = GetTopLevelHWND(mWnd, false, false);
// top level window is already active.
HWND fgWnd = ::GetForegroundWindow(); 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; 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; DWORD defaultCycleCount = 0;
::SystemParametersInfo(SPI_GETFOREGROUNDFLASHCOUNT, 0, &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 // of GetTopLevelWindow method. Because this is checking whether the window
// is top level only in Win32 window system. Therefore, the result window // is top level only in Win32 window system. Therefore, the result window
// may not be managed by us. // 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 curWnd = aWnd;
HWND topWnd = NULL; HWND topWnd = NULL;
@ -8904,7 +8901,7 @@ HWND nsWindow::GetTopLevelHWND(HWND aWnd, bool aStopOnDialogOrPopup)
while (curWnd) { while (curWnd) {
topWnd = curWnd; topWnd = curWnd;
if (aStopOnDialogOrPopup) { if (aStopIfNotChild) {
DWORD_PTR style = ::GetWindowLongPtrW(curWnd, GWL_STYLE); DWORD_PTR style = ::GetWindowLongPtrW(curWnd, GWL_STYLE);
VERIFY_WINDOW_STYLE(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) 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; curWnd = upWnd;
} }

Просмотреть файл

@ -242,7 +242,9 @@ public:
*/ */
static void GlobalMsgWindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); static void GlobalMsgWindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
nsWindow* GetTopLevelWindow(bool aStopOnDialogOrPopup); 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; } HWND GetWindowHandle() { return mWnd; }
WNDPROC GetPrevWindowProc() { return mPrevWndProc; } WNDPROC GetPrevWindowProc() { return mPrevWndProc; }
static nsWindow* GetNSWindowPtr(HWND aWnd); static nsWindow* GetNSWindowPtr(HWND aWnd);