summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-13 02:33:33 +0000
committersadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-13 02:33:33 +0000
commit272a6de6ad9fc50b0cadc299b11280b44d3c2a59 (patch)
treeaeb35a4b9ce805680c82a08c229f3ec6f657fa24
parent3d26235f0e2c5f41fd999b8b363e9547cff03514 (diff)
downloadchromium_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.cc58
-rw-r--r--views/desktop/desktop_window_manager.h6
-rw-r--r--views/desktop/desktop_window_view.cc10
-rw-r--r--views/widget/window_manager.cc5
-rw-r--r--views/widget/window_manager.h9
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;