summaryrefslogtreecommitdiffstats
path: root/ui/views/mouse_watcher_view_host.cc
diff options
context:
space:
mode:
authordavemoore@chromium.org <davemoore@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-02-06 19:19:13 +0000
committerdavemoore@chromium.org <davemoore@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-02-06 19:19:13 +0000
commit86b1dc18859817e039361c623e3b0e4074593367 (patch)
treebb9b4613b32597b9483ac5417c5b1b5f7815988e /ui/views/mouse_watcher_view_host.cc
parent9e49959b0e6e940c39359f5f05f9d5da6032a869 (diff)
downloadchromium_src-86b1dc18859817e039361c623e3b0e4074593367.zip
chromium_src-86b1dc18859817e039361c623e3b0e4074593367.tar.gz
chromium_src-86b1dc18859817e039361c623e3b0e4074593367.tar.bz2
Refactored MouseWatcher to allow regions other than Views to
be monitored. BUG=None TEST=None Review URL: https://chromiumcodereview.appspot.com/9309110 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@120583 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/views/mouse_watcher_view_host.cc')
-rw-r--r--ui/views/mouse_watcher_view_host.cc56
1 files changed, 56 insertions, 0 deletions
diff --git a/ui/views/mouse_watcher_view_host.cc b/ui/views/mouse_watcher_view_host.cc
new file mode 100644
index 0000000..a2a917a
--- /dev/null
+++ b/ui/views/mouse_watcher_view_host.cc
@@ -0,0 +1,56 @@
+// Copyright (c) 2012 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.
+
+#include "ui/views/mouse_watcher_view_host.h"
+
+#include "ui/gfx/screen.h"
+#include "ui/views/view.h"
+#include "ui/views/widget/widget.h"
+
+namespace views {
+
+MouseWatcherViewHost::MouseWatcherViewHost(View* view,
+ const gfx::Insets& hot_zone_insets)
+ : view_(view),
+ hot_zone_insets_(hot_zone_insets) {
+}
+
+MouseWatcherViewHost::~MouseWatcherViewHost() {
+}
+
+bool MouseWatcherViewHost::Contains(
+ const gfx::Point& screen_point,
+ MouseEventType type) {
+ bool in_view = IsCursorInViewZone(screen_point);
+ if (!in_view || (type == MOUSE_EXIT && !IsMouseOverWindow()))
+ return false;
+ return true;
+}
+
+// Returns whether or not the cursor is currently in the view's "zone" which
+// is defined as a slightly larger region than the view.
+bool MouseWatcherViewHost::IsCursorInViewZone(const gfx::Point& screen_point) {
+ gfx::Rect bounds = view_->GetLocalBounds();
+ gfx::Point view_topleft(bounds.origin());
+ View::ConvertPointToScreen(view_, &view_topleft);
+ bounds.set_origin(view_topleft);
+ bounds.SetRect(view_topleft.x() - hot_zone_insets_.left(),
+ view_topleft.y() - hot_zone_insets_.top(),
+ bounds.width() + hot_zone_insets_.width(),
+ bounds.height() + hot_zone_insets_.height());
+
+ return bounds.Contains(screen_point.x(), screen_point.y());
+}
+
+// Returns true if the mouse is over the view's window.
+bool MouseWatcherViewHost::IsMouseOverWindow() {
+ Widget* widget = view_->GetWidget();
+ if (!widget)
+ return false;
+
+ return gfx::Screen::GetWindowAtCursorScreenPoint() ==
+ widget->GetNativeWindow();
+}
+
+} // namespace views