| Index: views/mouse_watcher.cc
|
| diff --git a/views/mouse_watcher.cc b/views/mouse_watcher.cc
|
| deleted file mode 100644
|
| index d0748605ef64fb54f86d9898f456c0309cbec1ec..0000000000000000000000000000000000000000
|
| --- a/views/mouse_watcher.cc
|
| +++ /dev/null
|
| @@ -1,211 +0,0 @@
|
| -// Copyright (c) 2011 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 "views/mouse_watcher.h"
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/compiler_specific.h"
|
| -#include "base/event_types.h"
|
| -#include "base/memory/weak_ptr.h"
|
| -#include "base/message_loop.h"
|
| -#include "ui/base/events.h"
|
| -#include "ui/gfx/screen.h"
|
| -#include "ui/views/widget/widget.h"
|
| -#include "views/view.h"
|
| -
|
| -namespace views {
|
| -
|
| -// Amount of time between when the mouse moves outside the view's zone and when
|
| -// the listener is notified.
|
| -const int kNotifyListenerTimeMs = 300;
|
| -
|
| -class MouseWatcher::Observer : public MessageLoopForUI::Observer {
|
| - public:
|
| - explicit Observer(MouseWatcher* mouse_watcher)
|
| - : mouse_watcher_(mouse_watcher),
|
| - ALLOW_THIS_IN_INITIALIZER_LIST(notify_listener_factory_(this)) {
|
| - MessageLoopForUI::current()->AddObserver(this);
|
| - }
|
| -
|
| - ~Observer() {
|
| - MessageLoopForUI::current()->RemoveObserver(this);
|
| - }
|
| -
|
| - // MessageLoop::Observer implementation:
|
| -#if defined(OS_WIN)
|
| - virtual base::EventStatus WillProcessEvent(
|
| - const base::NativeEvent& event) OVERRIDE {
|
| - return base::EVENT_CONTINUE;
|
| - }
|
| -
|
| - virtual void DidProcessEvent(const base::NativeEvent& event) OVERRIDE {
|
| - // We spy on three different Windows messages here to see if the mouse has
|
| - // moved out of the bounds of the view. The messages are:
|
| - //
|
| - // WM_MOUSEMOVE:
|
| - // For when the mouse moves from the view into the rest of the browser UI,
|
| - // i.e. within the bounds of the same windows HWND.
|
| - // WM_MOUSELEAVE:
|
| - // For when the mouse moves out of the bounds of the view's HWND.
|
| - // WM_NCMOUSELEAVE:
|
| - // For notification when the mouse leaves the _non-client_ area.
|
| - //
|
| - switch (event.message) {
|
| - case WM_MOUSEMOVE:
|
| - HandleGlobalMouseMoveEvent(false);
|
| - break;
|
| - case WM_MOUSELEAVE:
|
| - case WM_NCMOUSELEAVE:
|
| - HandleGlobalMouseMoveEvent(true);
|
| - break;
|
| - }
|
| - }
|
| -#elif defined(USE_WAYLAND)
|
| - virtual MessageLoopForUI::Observer::EventStatus WillProcessEvent(
|
| - base::wayland::WaylandEvent* event) OVERRIDE {
|
| - switch (event->type) {
|
| - case base::wayland::WAYLAND_MOTION:
|
| - HandleGlobalMouseMoveEvent(false);
|
| - break;
|
| - case base::wayland::WAYLAND_POINTER_FOCUS:
|
| - if (!event->pointer_focus.state)
|
| - HandleGlobalMouseMoveEvent(true);
|
| - break;
|
| - default:
|
| - break;
|
| - }
|
| - return EVENT_CONTINUE;
|
| - }
|
| -#elif defined(USE_AURA)
|
| - virtual base::EventStatus WillProcessEvent(
|
| - const base::NativeEvent& event) OVERRIDE {
|
| - return base::EVENT_CONTINUE;
|
| - }
|
| - virtual void DidProcessEvent(const base::NativeEvent& event) OVERRIDE {
|
| - switch (ui::EventTypeFromNative(event)) {
|
| - case ui::ET_MOUSE_MOVED:
|
| - case ui::ET_MOUSE_DRAGGED:
|
| - // DRAGGED is a special case of MOVED. See events_win.cc/events_x.cc.
|
| - HandleGlobalMouseMoveEvent(false);
|
| - break;
|
| - case ui::ET_MOUSE_EXITED:
|
| - HandleGlobalMouseMoveEvent(true);
|
| - break;
|
| - default:
|
| - break;
|
| - }
|
| - }
|
| -#elif defined(TOOLKIT_USES_GTK)
|
| - virtual void WillProcessEvent(GdkEvent* event) OVERRIDE {
|
| - }
|
| -
|
| - virtual void DidProcessEvent(GdkEvent* event) OVERRIDE {
|
| - switch (event->type) {
|
| - case GDK_MOTION_NOTIFY:
|
| - HandleGlobalMouseMoveEvent(false);
|
| - break;
|
| - case GDK_LEAVE_NOTIFY:
|
| - HandleGlobalMouseMoveEvent(true);
|
| - break;
|
| - default:
|
| - break;
|
| - }
|
| - }
|
| -#endif
|
| -
|
| - private:
|
| - View* view() const { return mouse_watcher_->host_; }
|
| -
|
| - // 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 IsCursorInViewZone() {
|
| - 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() - mouse_watcher_->hot_zone_insets_.left(),
|
| - view_topleft.y() - mouse_watcher_->hot_zone_insets_.top(),
|
| - bounds.width() + mouse_watcher_->hot_zone_insets_.width(),
|
| - bounds.height() + mouse_watcher_->hot_zone_insets_.height());
|
| -
|
| - gfx::Point cursor_point = gfx::Screen::GetCursorScreenPoint();
|
| -
|
| - return bounds.Contains(cursor_point.x(), cursor_point.y());
|
| - }
|
| -
|
| - // Returns true if the mouse is over the view's window.
|
| - bool IsMouseOverWindow() {
|
| - Widget* widget = view()->GetWidget();
|
| - if (!widget)
|
| - return false;
|
| -
|
| - return gfx::Screen::GetWindowAtCursorScreenPoint() ==
|
| - widget->GetNativeWindow();
|
| - }
|
| -
|
| - // Called from the message loop observer when a mouse movement has occurred.
|
| - void HandleGlobalMouseMoveEvent(bool check_window) {
|
| - bool in_view = IsCursorInViewZone();
|
| - if (!in_view || (check_window && !IsMouseOverWindow())) {
|
| - // Mouse moved outside the view's zone, start a timer to notify the
|
| - // listener.
|
| - if (!notify_listener_factory_.HasWeakPtrs()) {
|
| - MessageLoop::current()->PostDelayedTask(
|
| - FROM_HERE,
|
| - base::Bind(&Observer::NotifyListener,
|
| - notify_listener_factory_.GetWeakPtr()),
|
| - !in_view ? kNotifyListenerTimeMs :
|
| - mouse_watcher_->notify_on_exit_time_ms_);
|
| - }
|
| - } else {
|
| - // Mouse moved quickly out of the view and then into it again, so cancel
|
| - // the timer.
|
| - notify_listener_factory_.InvalidateWeakPtrs();
|
| - }
|
| - }
|
| -
|
| - void NotifyListener() {
|
| - mouse_watcher_->NotifyListener();
|
| - // WARNING: we've been deleted.
|
| - }
|
| -
|
| - private:
|
| - MouseWatcher* mouse_watcher_;
|
| -
|
| - // A factory that is used to construct a delayed callback to the listener.
|
| - base::WeakPtrFactory<Observer> notify_listener_factory_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(Observer);
|
| -};
|
| -
|
| -MouseWatcherListener::~MouseWatcherListener() {
|
| -}
|
| -
|
| -MouseWatcher::MouseWatcher(View* host,
|
| - MouseWatcherListener* listener,
|
| - const gfx::Insets& hot_zone_insets)
|
| - : host_(host),
|
| - listener_(listener),
|
| - hot_zone_insets_(hot_zone_insets),
|
| - notify_on_exit_time_ms_(kNotifyListenerTimeMs) {
|
| -}
|
| -
|
| -MouseWatcher::~MouseWatcher() {
|
| -}
|
| -
|
| -void MouseWatcher::Start() {
|
| - if (!is_observing())
|
| - observer_.reset(new Observer(this));
|
| -}
|
| -
|
| -void MouseWatcher::Stop() {
|
| - observer_.reset(NULL);
|
| -}
|
| -
|
| -void MouseWatcher::NotifyListener() {
|
| - observer_.reset(NULL);
|
| - listener_->MouseMovedOutOfView();
|
| -}
|
| -
|
| -} // namespace views
|
|
|