summaryrefslogtreecommitdiffstats
path: root/chrome/browser/cocoa
diff options
context:
space:
mode:
authorthakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-07 22:56:32 +0000
committerthakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-07 22:56:32 +0000
commit3766238379caee23c192b3d1896f3cc76e0d86b4 (patch)
treea36e5677097debb2d04b4e2e20ad96ee5434ecd8 /chrome/browser/cocoa
parenta1c62688a8dc650f9a564e9cd86d9f26ec890d8d (diff)
downloadchromium_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.mm55
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