diff options
author | sadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-13 02:33:33 +0000 |
---|---|---|
committer | sadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-13 02:33:33 +0000 |
commit | 272a6de6ad9fc50b0cadc299b11280b44d3c2a59 (patch) | |
tree | aeb35a4b9ce805680c82a08c229f3ec6f657fa24 | |
parent | 3d26235f0e2c5f41fd999b8b363e9547cff03514 (diff) | |
download | chromium_src-272a6de6ad9fc50b0cadc299b11280b44d3c2a59.zip chromium_src-272a6de6ad9fc50b0cadc299b11280b44d3c2a59.tar.gz chromium_src-272a6de6ad9fc50b0cadc299b11280b44d3c2a59.tar.bz2 |
views desktop wm: Activate a window when it is touched.
BUG=none
TEST=manually
Review URL: http://codereview.chromium.org/7796040
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@100842 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | views/desktop/desktop_window_manager.cc | 58 | ||||
-rw-r--r-- | views/desktop/desktop_window_manager.h | 6 | ||||
-rw-r--r-- | views/desktop/desktop_window_view.cc | 10 | ||||
-rw-r--r-- | views/widget/window_manager.cc | 5 | ||||
-rw-r--r-- | views/widget/window_manager.h | 9 |
5 files changed, 69 insertions, 19 deletions
diff --git a/views/desktop/desktop_window_manager.cc b/views/desktop/desktop_window_manager.cc index 8dec7c8..1a3db58 100644 --- a/views/desktop/desktop_window_manager.cc +++ b/views/desktop/desktop_window_manager.cc @@ -167,21 +167,18 @@ bool DesktopWindowManager::HandleKeyEvent( bool DesktopWindowManager::HandleMouseEvent( views::Widget* widget, const views::MouseEvent& event) { - if (event.type() == ui::ET_MOUSE_PRESSED) { - View* target = - widget->GetRootView()->GetEventHandlerForPoint(event.location()); - - if (target->GetClassName() == internal::NativeWidgetView::kViewClassName) { - internal::NativeWidgetView* native_widget_view = - static_cast<internal::NativeWidgetView*>(target); - views::Widget* target_widget = native_widget_view->GetAssociatedWidget(); - if (target_widget->CanActivate()) - Activate(target_widget); - } - } else if (event.type() == ui::ET_MOUSEWHEEL && active_widget_) { - return active_widget_->OnMouseEvent(event); + if (mouse_capture_) { + views::MouseEvent translated(event, widget->GetRootView(), + mouse_capture_->GetRootView()); + mouse_capture_->OnMouseEvent(translated); + return true; } + if (event.type() == ui::ET_MOUSE_PRESSED) + ActivateWidgetAtLocation(widget, event.location()); + else if (event.type() == ui::ET_MOUSEWHEEL && active_widget_) + return active_widget_->OnMouseEvent(event); + if (window_controller_.get()) { if (!window_controller_->OnMouseEvent(event)) { ReleaseMouseCapture(); @@ -190,13 +187,23 @@ bool DesktopWindowManager::HandleMouseEvent( return true; } + return false; +} + +ui::TouchStatus DesktopWindowManager::HandleTouchEvent(Widget* widget, + const TouchEvent& event) { + // If there is a widget capturing mouse events, the widget should also receive + // touch events. if (mouse_capture_) { - views::MouseEvent translated(event, widget->GetRootView(), + views::TouchEvent translated(event, widget->GetRootView(), mouse_capture_->GetRootView()); - mouse_capture_->OnMouseEvent(translated); - return true; + return mouse_capture_->OnTouchEvent(translated); } - return false; + if (event.type() == ui::ET_TOUCH_PRESSED && + ActivateWidgetAtLocation(widget, event.location())) + return ui::TOUCH_STATUS_END; + + return ui::TOUCH_STATUS_UNKNOWN; } void DesktopWindowManager::Register(Widget* widget) { @@ -262,5 +269,22 @@ void DesktopWindowManager::Activate(Widget* widget) { } } +bool DesktopWindowManager::ActivateWidgetAtLocation(Widget* widget, + const gfx::Point& point) { + View* target = widget->GetRootView()->GetEventHandlerForPoint(point); + + if (target->GetClassName() == internal::NativeWidgetView::kViewClassName) { + internal::NativeWidgetView* native_widget_view = + static_cast<internal::NativeWidgetView*>(target); + views::Widget* target_widget = native_widget_view->GetAssociatedWidget(); + if (!target_widget->IsActive() && target_widget->CanActivate()) { + Activate(target_widget); + return true; + } + } + + return false; +} + } // namespace desktop } // namespace views diff --git a/views/desktop/desktop_window_manager.h b/views/desktop/desktop_window_manager.h index 6466816..2acf893 100644 --- a/views/desktop/desktop_window_manager.h +++ b/views/desktop/desktop_window_manager.h @@ -44,6 +44,8 @@ class DesktopWindowManager : public views::WindowManager, const views::KeyEvent& event) OVERRIDE; virtual bool HandleMouseEvent(views::Widget* widget, const views::MouseEvent& event) OVERRIDE; + virtual ui::TouchStatus HandleTouchEvent(views::Widget* widget, + const views::TouchEvent& event) OVERRIDE; virtual void Register(Widget* widget) OVERRIDE; @@ -59,6 +61,10 @@ class DesktopWindowManager : public views::WindowManager, void Activate(Widget* widget); + // Returns true if a deactivated widget at the location was activated. Returns + // false otherwise. + bool ActivateWidgetAtLocation(Widget* widget, const gfx::Point& point); + views::Widget* desktop_; views::Widget* mouse_capture_; views::Widget* active_widget_; diff --git a/views/desktop/desktop_window_view.cc b/views/desktop/desktop_window_view.cc index f3033b2..c2beb21 100644 --- a/views/desktop/desktop_window_view.cc +++ b/views/desktop/desktop_window_view.cc @@ -42,11 +42,19 @@ class DesktopWindow : public Widget { return WindowManager::Get()->HandleKeyEvent(this, event); } - virtual bool OnMouseEvent(const MouseEvent& event) { + virtual bool OnMouseEvent(const MouseEvent& event) OVERRIDE { return WindowManager::Get()->HandleMouseEvent(this, event) || Widget::OnMouseEvent(event); } + virtual ui::TouchStatus OnTouchEvent(const TouchEvent& event) OVERRIDE { + ui::TouchStatus status = WindowManager::Get()-> + HandleTouchEvent(this, event); + if (status == ui::TOUCH_STATUS_UNKNOWN) + status = Widget::OnTouchEvent(event); + return status; + } + DesktopWindowView* desktop_window_view_; DISALLOW_COPY_AND_ASSIGN(DesktopWindow); diff --git a/views/widget/window_manager.cc b/views/widget/window_manager.cc index 3030fdb..679332d 100644 --- a/views/widget/window_manager.cc +++ b/views/widget/window_manager.cc @@ -64,6 +64,11 @@ class NullWindowManager : public views::WindowManager { return false; } + virtual ui::TouchStatus HandleTouchEvent(views::Widget* widget, + const views::TouchEvent& event) OVERRIDE { + return ui::TOUCH_STATUS_UNKNOWN; + } + void Register(views::Widget* widget) OVERRIDE {} private: diff --git a/views/widget/window_manager.h b/views/widget/window_manager.h index 02015cc..ff1e319 100644 --- a/views/widget/window_manager.h +++ b/views/widget/window_manager.h @@ -7,6 +7,7 @@ #pragma once #include "base/basictypes.h" +#include "ui/base/events.h" #include "views/views_export.h" namespace gfx { @@ -16,6 +17,7 @@ class Point; namespace views { class KeyEvent; class MouseEvent; +class TouchEvent; class Widget; // A interface to WindowManager. @@ -50,10 +52,15 @@ class VIEWS_EXPORT WindowManager { // or send the event to widget that has mouse capture. virtual bool HandleKeyEvent(Widget* widget, const KeyEvent& event) = 0; - // WindowManager handles mouse event first. It may reisze/move window, + // WindowManager handles mouse event first. It may resize/move window, // or send the event to widget that has mouse capture. virtual bool HandleMouseEvent(Widget* widget, const MouseEvent& event) = 0; + // WindowManager handles touch event first. It is currently used only to + // activate windows. But it can also be used to move/resize windows. + virtual ui::TouchStatus HandleTouchEvent(Widget* widget, + const TouchEvent& event) = 0; + // Register widget to the window manager. virtual void Register(Widget* widget) = 0; |