diff options
author | thakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-07 22:56:32 +0000 |
---|---|---|
committer | thakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-07 22:56:32 +0000 |
commit | 3766238379caee23c192b3d1896f3cc76e0d86b4 (patch) | |
tree | a36e5677097debb2d04b4e2e20ad96ee5434ecd8 /chrome/browser/cocoa | |
parent | a1c62688a8dc650f9a564e9cd86d9f26ec890d8d (diff) | |
download | chromium_src-3766238379caee23c192b3d1896f3cc76e0d86b4.zip chromium_src-3766238379caee23c192b3d1896f3cc76e0d86b4.tar.gz chromium_src-3766238379caee23c192b3d1896f3cc76e0d86b4.tar.bz2 |
Mac: Fix window shadow when compositor is active.
BUG=53382
TEST=Enable compositor. Window shadow should look normal, even after resizing the window. The shadow of other windows (prefs, bubbles, etc) should look like it did before.
Review URL: http://codereview.chromium.org/3360014
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@58770 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/cocoa')
-rw-r--r-- | chrome/browser/cocoa/browser_frame_view.mm | 55 |
1 files changed, 52 insertions, 3 deletions
diff --git a/chrome/browser/cocoa/browser_frame_view.mm b/chrome/browser/cocoa/browser_frame_view.mm index 7914435..96e3542 100644 --- a/chrome/browser/cocoa/browser_frame_view.mm +++ b/chrome/browser/cocoa/browser_frame_view.mm @@ -24,6 +24,7 @@ static BOOL gCanGetCornerRadius = NO; - (void)drawRectOriginal:(NSRect)rect; - (BOOL)_mouseInGroup:(NSButton*)widget; - (void)updateTrackingAreas; +- (NSUInteger)_shadowFlagsOriginal; @end // Undocumented APIs. They are really on NSGrayFrame rather than @@ -33,6 +34,7 @@ static BOOL gCanGetCornerRadius = NO; - (float)roundedCornerRadius; - (CGRect)_titlebarTitleRect; - (void)_drawTitleStringIn:(struct CGRect)arg1 withColor:(id)color; +- (NSUInteger)_shadowFlags; @end @@ -49,7 +51,7 @@ static BOOL gCanGetCornerRadius = NO; DCHECK(grayFrameClass); if (!grayFrameClass) return; - // Exchange draw rect + // Exchange draw rect. Method m0 = class_getInstanceMethod([self class], @selector(drawRect:)); DCHECK(m0); if (m0) { @@ -69,7 +71,7 @@ static BOOL gCanGetCornerRadius = NO; } } - // Add _mouseInGroup + // Add _mouseInGroup. m0 = class_getInstanceMethod([self class], @selector(_mouseInGroup:)); DCHECK(m0); if (m0) { @@ -79,7 +81,7 @@ static BOOL gCanGetCornerRadius = NO; method_getTypeEncoding(m0)); DCHECK(didAdd); } - // Add updateTrackingArea + // Add updateTrackingArea. m0 = class_getInstanceMethod([self class], @selector(updateTrackingAreas)); DCHECK(m0); if (m0) { @@ -98,6 +100,31 @@ static BOOL gCanGetCornerRadius = NO; gCanGetCornerRadius = [grayFrameClass instancesRespondToSelector:@selector(roundedCornerRadius)]; + + // Add _shadowFlags. This is a method on NSThemeFrame, not on NSGrayFrame. + // NSThemeFrame is NSGrayFrame's superclass. + Class themeFrameClass = NSClassFromString(@"NSThemeFrame"); + DCHECK(themeFrameClass); + if (!themeFrameClass) return; + m0 = class_getInstanceMethod([self class], @selector(_shadowFlags)); + DCHECK(m0); + if (m0) { + BOOL didAdd = class_addMethod(themeFrameClass, + @selector(_shadowFlagsOriginal), + method_getImplementation(m0), + method_getTypeEncoding(m0)); + DCHECK(didAdd); + if (didAdd) { + Method m1 = class_getInstanceMethod(themeFrameClass, + @selector(_shadowFlags)); + Method m2 = class_getInstanceMethod(themeFrameClass, + @selector(_shadowFlagsOriginal)); + DCHECK(m1 && m2); + if (m1 && m2) { + method_exchangeImplementations(m1, m2); + } + } + } } - (id)initWithFrame:(NSRect)frame { @@ -347,4 +374,26 @@ static BOOL gCanGetCornerRadius = NO; } } +// When the compositor is active, the whole content area is transparent (with +// an OpenGL surface behind it), so Cocoa draws the shadow only around the +// toolbar area. +// Tell the window server that we want a shadow as if none of the content +// area is transparent. +- (NSUInteger)_shadowFlags { + // A slightly less intrusive hack would be to call + // _setContentHasShadow:NO on the window. That seems to be what Terminal.app + // is doing. However, it leads to this function returning 'code | 64', which + // doesn't do what we want. For some reason, it does the right thing in + // Terminal.app. + // TODO(thakis): Figure out why -_setContentHasShadow: works in Terminal.app + // and use that technique instead. http://crbug.com/53382 + + // If this isn't the window class we expect, then pass it on to the + // original implementation. + if (![[self window] isKindOfClass:[FramedBrowserWindow class]]) + return [self _shadowFlagsOriginal]; + + return [self _shadowFlagsOriginal] | 128; +} + @end |