From 8697bb3a1aac88478c530ffedb759ef1c4e1a943 Mon Sep 17 00:00:00 2001 From: "joshmoz@gmail.com" Date: Mon, 18 Feb 2008 17:11:39 -0800 Subject: [PATCH] Aqua focus ring is cut off after form autocomplete goes away, second pass. Includes some code by hwaara from bug 392813. b=417124 r=hwaara sr=roc --- widget/src/cocoa/nsCocoaWindow.mm | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) 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)