diff --git a/widget/src/cocoa/nsCocoaWindow.mm b/widget/src/cocoa/nsCocoaWindow.mm index ebbee8db47e8..7531bc04743f 100644 --- a/widget/src/cocoa/nsCocoaWindow.mm +++ b/widget/src/cocoa/nsCocoaWindow.mm @@ -413,7 +413,7 @@ nsresult nsCocoaWindow::StandardCreate(nsIWidget *aParent, } else { mWindow = (NSWindow*)aNativeWindow; - mVisible = PR_TRUE; + mVisible = [mWindow isVisible]; } return NS_OK; @@ -509,6 +509,9 @@ NS_IMETHODIMP nsCocoaWindow::SetModal(PRBool aState) // Hide or show this window NS_IMETHODIMP nsCocoaWindow::Show(PRBool bState) { + if (mVisible == bState) + return NS_OK; + nsIWidget* parentWidget = mParent; nsCOMPtr piParentWidget(do_QueryInterface(parentWidget)); NSWindow* nativeParentWindow = (parentWidget) ? @@ -678,8 +681,22 @@ NS_IMETHODIMP nsCocoaWindow::Show(PRBool bState) // the NSApplication class (in header files generated using class-dump). // This workaround was "borrowed" from the Java Embedding Plugin (which // uses it for a different purpose). - if (mWindowType == eWindowType_popup) + if (mWindowType == eWindowType_popup) { [NSApp _removeWindowFromCache:mWindow]; + // Apple's focus ring APIs sometimes clip themselves when they draw under + // other windows. Redraw the window that was likely under the popup to + // get focus rings to draw correctly. Sometimes the window is not properly + // the parent of the popup, so we can't just tell the parent to redraw. + // We only have this problem on 10.4. See bug 417124. + if (!nsToolkit::OnLeopardOrLater()) { + NSWindow* keyWindow = [NSApp keyWindow]; + if (keyWindow) + [keyWindow display]; + NSWindow* mainWindow = [NSApp mainWindow]; + if (mainWindow && mainWindow != keyWindow) + [mainWindow display]; + } + } // it's very important to turn off mouse moved events when hiding a window, otherwise // the windows' tracking rects will interfere with each other. (bug 356528)