diff options
author | davemoore@chromium.org <davemoore@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-02-06 19:19:13 +0000 |
---|---|---|
committer | davemoore@chromium.org <davemoore@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-02-06 19:19:13 +0000 |
commit | 86b1dc18859817e039361c623e3b0e4074593367 (patch) | |
tree | bb9b4613b32597b9483ac5417c5b1b5f7815988e /ui/views/mouse_watcher_view_host.cc | |
parent | 9e49959b0e6e940c39359f5f05f9d5da6032a869 (diff) | |
download | chromium_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.cc | 56 |
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 |