summaryrefslogtreecommitdiffstats
path: root/chrome/browser/tabs/tab.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/tabs/tab.cc')
-rw-r--r--chrome/browser/tabs/tab.cc41
1 files changed, 41 insertions, 0 deletions
diff --git a/chrome/browser/tabs/tab.cc b/chrome/browser/tabs/tab.cc
index 4482079..f855701 100644
--- a/chrome/browser/tabs/tab.cc
+++ b/chrome/browser/tabs/tab.cc
@@ -6,6 +6,8 @@
#include "base/gfx/size.h"
#include "chrome/views/view_container.h"
+#include "chrome/common/gfx/chrome_canvas.h"
+#include "chrome/common/gfx/path.h"
#include "chrome/common/resource_bundle.h"
#include "chrome/views/chrome_menu.h"
#include "chrome/views/tooltip_manager.h"
@@ -13,6 +15,10 @@
const std::string Tab::kTabClassName = "browser/tabs/Tab";
+static const SkScalar kTabCapWidth = 15;
+static const SkScalar kTabTopCurveWidth = 4;
+static const SkScalar kTabBottomCurveWidth = 3;
+
class TabContextMenuController : public ChromeViews::MenuDelegate {
public:
explicit TabContextMenuController(Tab* tab)
@@ -120,6 +126,13 @@ bool Tab::IsSelected() const {
///////////////////////////////////////////////////////////////////////////////
// Tab, ChromeViews::View overrides:
+bool Tab::HitTest(const CPoint &l) const {
+ gfx::Path path;
+ MakePathForTab(&path);
+ ScopedHRGN rgn(path.CreateHRGN());
+ return !!PtInRegion(rgn, l.x, l.y);
+}
+
bool Tab::OnMousePressed(const ChromeViews::MouseEvent& event) {
if (event.IsOnlyLeftMouseButton()) {
// Store whether or not we were selected just now... we only want to be
@@ -198,3 +211,31 @@ void Tab::ButtonPressed(ChromeViews::BaseButton* sender) {
delegate_->CloseTab(this);
}
+///////////////////////////////////////////////////////////////////////////////
+// Tab, private:
+
+void Tab::MakePathForTab(gfx::Path* path) const {
+ DCHECK(path);
+
+ SkScalar h = SkIntToScalar(GetHeight());
+ SkScalar w = SkIntToScalar(GetWidth());
+
+ path->moveTo(0, h);
+
+ // Left end cap.
+ path->lineTo(kTabBottomCurveWidth, h - kTabBottomCurveWidth);
+ path->lineTo(kTabCapWidth - kTabTopCurveWidth, kTabTopCurveWidth);
+ path->lineTo(kTabCapWidth, 0);
+
+ // Connect to the right cap.
+ path->lineTo(w - kTabCapWidth, 0);
+
+ // Right end cap.
+ path->lineTo(w - kTabCapWidth - kTabTopCurveWidth, kTabTopCurveWidth);
+ path->lineTo(w - kTabBottomCurveWidth, h - kTabBottomCurveWidth);
+ path->lineTo(w, h);
+
+ // Close out the path.
+ path->lineTo(0, h);
+ path->close();
+}