summaryrefslogtreecommitdiffstats
path: root/chrome/browser/ui/cocoa/browser_frame_view.h
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/ui/cocoa/browser_frame_view.h')
-rw-r--r--chrome/browser/ui/cocoa/browser_frame_view.h65
1 files changed, 65 insertions, 0 deletions
diff --git a/chrome/browser/ui/cocoa/browser_frame_view.h b/chrome/browser/ui/cocoa/browser_frame_view.h
new file mode 100644
index 0000000..42faa9b
--- /dev/null
+++ b/chrome/browser/ui/cocoa/browser_frame_view.h
@@ -0,0 +1,65 @@
+// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import <Cocoa/Cocoa.h>
+
+// BrowserFrameView is a class whose methods we swizzle into NSGrayFrame
+// (an AppKit framework class) so that we can support custom frame drawing, and
+// have the ability to move our window widgets (close, zoom, miniaturize) where
+// we want them.
+// This class is never to be instantiated on its own.
+// We explored a variety of ways to support custom frame drawing and custom
+// window widgets.
+// Our requirements were:
+// a) that we could fall back on standard system drawing at any time for the
+// "default theme"
+// b) We needed to be able to draw both a background pattern, and an overlay
+// graphic, and we need to be able to set the pattern phase of our background
+// window.
+// c) We had to be able to support "transparent" themes, so that you could see
+// through to the underlying windows in places without the system theme
+// getting in the way.
+// d) We had to support having the custom window controls moved down by a couple
+// of pixels and rollovers, accessibility, etc. all had to work.
+//
+// Since we want "A" we couldn't just do a transparent borderless window. At
+// least I couldn't find the right combination of HITheme calls to make it draw
+// nicely, and I don't trust that the HITheme calls are going to exist in future
+// system versions.
+// "C" precluded us from inserting a view between the system frame and the
+// the content frame in Z order. To get the transparency we actually need to
+// replace the drawing of the system frame.
+// "D" required us to override _mouseInGroup to get our custom widget rollovers
+// drawing correctly. The widgets call _mouseInGroup on their superview to
+// decide whether they should draw in highlight mode or not.
+// "B" precluded us from just setting a background color on the window.
+//
+// Originally we tried overriding the private API +frameViewForStyleMask: to
+// add our own subclass of NSGrayView to our window. Turns out that if you
+// subclass NSGrayView it does not draw correctly when you call NSGrayView's
+// drawRect. It appears that NSGrayView's drawRect: method (and that of its
+// superclasses) do lots of "isMemberOfClass/isKindOfClass" calls, and if your
+// class is NOT an instance of NSGrayView (as opposed to a subclass of
+// NSGrayView) then the system drawing will not work correctly.
+//
+// Given all of the above, we found swizzling drawRect, and adding an
+// implementation of _mouseInGroup and updateTrackingAreas, in _load to be the
+// easiest and safest method of achieving our goals. We do the best we can to
+// check that everything is safe, and attempt to fallback gracefully if it is
+// not.
+@interface BrowserFrameView : NSView
+
+// Draws the window theme into the specified rect. Returns whether a theme was
+// drawn (whether incognito or full pattern theme; an overlay image doesn't
+// count).
++ (BOOL)drawWindowThemeInDirtyRect:(NSRect)dirtyRect
+ forView:(NSView*)view
+ bounds:(NSRect)bounds
+ offset:(NSPoint)offset
+ forceBlackBackground:(BOOL)forceBlackBackground;
+
+// Gets the color to draw title text.
++ (NSColor*)titleColorForThemeView:(NSView*)view;
+
+@end