summaryrefslogtreecommitdiffstats
path: root/ui/views/bubble
diff options
context:
space:
mode:
authorsky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-31 08:10:10 +0000
committersky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-31 08:10:10 +0000
commit77e346ff48a03c556e0f80810a2662b1f88a56ac (patch)
tree4d64fd2127d55cd804305eaafa1944e9203ff61e /ui/views/bubble
parenta0e54b7cc76a061cda211d9d4632b5f5d75daa9e (diff)
downloadchromium_src-77e346ff48a03c556e0f80810a2662b1f88a56ac.zip
chromium_src-77e346ff48a03c556e0f80810a2662b1f88a56ac.tar.gz
chromium_src-77e346ff48a03c556e0f80810a2662b1f88a56ac.tar.bz2
Makes events outside display region of new style dialogs fall though.
https://codereview.chromium.org/20755006/ makes new style dialogs display the right thing, but mouse events on parts of the dialog that are not drawn still end up going to the dialog. This patch makes it so that we end up setting a region on the HWND so that events can fall through too. BUG=241653 TEST=none R=ben@chromium.org, msw@chromium.org Review URL: https://chromiumcodereview.appspot.com/21145002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@214630 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/views/bubble')
-rw-r--r--ui/views/bubble/bubble_frame_view.cc29
1 files changed, 20 insertions, 9 deletions
diff --git a/ui/views/bubble/bubble_frame_view.cc b/ui/views/bubble/bubble_frame_view.cc
index 8f63405..c2e7a5f 100644
--- a/ui/views/bubble/bubble_frame_view.cc
+++ b/ui/views/bubble/bubble_frame_view.cc
@@ -11,6 +11,7 @@
#include "ui/base/resource/resource_bundle.h"
#include "ui/gfx/path.h"
#include "ui/gfx/screen.h"
+#include "ui/gfx/skia_util.h"
#include "ui/views/bubble/bubble_border.h"
#include "ui/views/controls/button/label_button.h"
#include "ui/views/widget/widget.h"
@@ -113,20 +114,30 @@ int BubbleFrameView::NonClientHitTest(const gfx::Point& point) {
void BubbleFrameView::GetWindowMask(const gfx::Size& size,
gfx::Path* window_mask) {
- if (bubble_border_->shadow() != BubbleBorder::NO_SHADOW_OPAQUE_BORDER)
+ // NOTE: this only provides implementations for the types used by dialogs.
+ if ((bubble_border_->arrow() != BubbleBorder::NONE &&
+ bubble_border_->arrow() != BubbleBorder::FLOAT) ||
+ (bubble_border_->shadow() != BubbleBorder::SMALL_SHADOW &&
+ bubble_border_->shadow() != BubbleBorder::NO_SHADOW_OPAQUE_BORDER))
return;
// Use a window mask roughly matching the border in the image assets.
static const int kBorderStrokeSize = 1;
static const SkScalar kCornerRadius = SkIntToScalar(6);
- gfx::Insets border_insets = bubble_border_->GetInsets();
- const SkRect rect = { SkIntToScalar(border_insets.left() - kBorderStrokeSize),
- SkIntToScalar(border_insets.top() - kBorderStrokeSize),
- SkIntToScalar(size.width() - border_insets.right() +
- kBorderStrokeSize),
- SkIntToScalar(size.height() - border_insets.bottom() +
- kBorderStrokeSize) };
- window_mask->addRoundRect(rect, kCornerRadius, kCornerRadius);
+ const gfx::Insets border_insets = bubble_border_->GetInsets();
+ SkRect rect = { SkIntToScalar(border_insets.left() - kBorderStrokeSize),
+ SkIntToScalar(border_insets.top() - kBorderStrokeSize),
+ SkIntToScalar(size.width() - border_insets.right() +
+ kBorderStrokeSize),
+ SkIntToScalar(size.height() - border_insets.bottom() +
+ kBorderStrokeSize) };
+ if (bubble_border_->shadow() == BubbleBorder::NO_SHADOW_OPAQUE_BORDER) {
+ window_mask->addRoundRect(rect, kCornerRadius, kCornerRadius);
+ } else {
+ static const int kBottomBorderShadowSize = 2;
+ rect.fBottom += SkIntToScalar(kBottomBorderShadowSize);
+ window_mask->addRect(rect);
+ }
}
void BubbleFrameView::ResetWindowControls() {}