Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / ash / wm / workspace / workspace_event_handler.cc
index 65a8841..bba3f76 100644 (file)
 #include "ui/base/hit_test.h"
 
 namespace ash {
-namespace internal {
 
-WorkspaceEventHandler::WorkspaceEventHandler() {
+WorkspaceEventHandler::WorkspaceEventHandler()
+    : click_component_(HTNOWHERE) {
 }
 
 WorkspaceEventHandler::~WorkspaceEventHandler() {
 }
 
 void WorkspaceEventHandler::OnMouseEvent(ui::MouseEvent* event) {
+  aura::Window* target = static_cast<aura::Window*>(event->target());
+  if (event->type() == ui::ET_MOUSE_PRESSED &&
+      event->IsOnlyLeftMouseButton() &&
+      ((event->flags() &
+          (ui::EF_IS_DOUBLE_CLICK | ui::EF_IS_TRIPLE_CLICK)) == 0)) {
+    click_component_ = target->delegate()->
+        GetNonClientComponent(event->location());
+  }
+
   if (event->handled())
     return;
-  aura::Window* target = static_cast<aura::Window*>(event->target());
+
   switch (event->type()) {
     case ui::ET_MOUSE_MOVED: {
       int component =
@@ -41,16 +50,29 @@ void WorkspaceEventHandler::OnMouseEvent(ui::MouseEvent* event) {
       break;
     case ui::ET_MOUSE_PRESSED: {
       wm::WindowState* target_state = wm::GetWindowState(target);
-      if (event->flags() & ui::EF_IS_DOUBLE_CLICK &&
-          event->IsOnlyLeftMouseButton() &&
-          target->delegate()->GetNonClientComponent(event->location()) ==
-          HTCAPTION) {
-        ash::Shell::GetInstance()->metrics()->RecordUserMetricsAction(
-            ash::UMA_TOGGLE_MAXIMIZE_CAPTION_CLICK);
-        const wm::WMEvent wm_event(wm::WM_EVENT_TOGGLE_MAXIMIZE_CAPTION);
-        target_state->OnWMEvent(&wm_event);
-        event->StopPropagation();
+
+      if (event->IsOnlyLeftMouseButton()) {
+        if (event->flags() & ui::EF_IS_DOUBLE_CLICK) {
+          int component = target->delegate()->
+              GetNonClientComponent(event->location());
+          if (component == HTCAPTION &&
+              component == click_component_) {
+            ash::Shell::GetInstance()->metrics()->RecordUserMetricsAction(
+                ash::UMA_TOGGLE_MAXIMIZE_CAPTION_CLICK);
+            const wm::WMEvent wm_event(wm::WM_EVENT_TOGGLE_MAXIMIZE_CAPTION);
+            target_state->OnWMEvent(&wm_event);
+            event->StopPropagation();
+          }
+          // WindowEventHandler can receive each event up to two times. Once a
+          // double-click has been received clear the target. Otherwise a
+          // duplicate of the event will be checking target history against
+          // itself.
+          click_component_ = HTNOWHERE;
+        }
+      } else {
+        click_component_ = HTNOWHERE;
       }
+
       multi_window_resize_controller_.Hide();
       HandleVerticalResizeDoubleClick(target_state, event);
       break;
@@ -61,29 +83,36 @@ void WorkspaceEventHandler::OnMouseEvent(ui::MouseEvent* event) {
 }
 
 void WorkspaceEventHandler::OnGestureEvent(ui::GestureEvent* event) {
-  if (event->handled())
+  if (event->handled() || event->type() != ui::ET_GESTURE_TAP)
     return;
+
   aura::Window* target = static_cast<aura::Window*>(event->target());
-  if (event->type() == ui::ET_GESTURE_TAP &&
-      target->delegate()->GetNonClientComponent(event->location()) ==
-      HTCAPTION) {
-    if (event->details().tap_count() == 2) {
-      ash::Shell::GetInstance()->metrics()->RecordUserMetricsAction(
-          ash::UMA_TOGGLE_MAXIMIZE_CAPTION_GESTURE);
-      // Note: TouchUMA::GESTURE_FRAMEVIEW_TAP is counted twice each time
-      // TouchUMA::GESTURE_MAXIMIZE_DOUBLETAP is counted once.
-      TouchUMA::GetInstance()->RecordGestureAction(
-          TouchUMA::GESTURE_MAXIMIZE_DOUBLETAP);
-      const wm::WMEvent wm_event(wm::WM_EVENT_TOGGLE_MAXIMIZE_CAPTION);
-      wm::GetWindowState(target)->OnWMEvent(&wm_event);
-      event->StopPropagation();
-      return;
-    } else {
-      // Note: TouchUMA::GESTURE_FRAMEVIEW_TAP is counted twice for each tap.
-      TouchUMA::GetInstance()->RecordGestureAction(
-          TouchUMA::GESTURE_FRAMEVIEW_TAP);
-    }
+  int previous_target_component = click_component_;
+  click_component_ = target->delegate()->
+      GetNonClientComponent(event->location());
+
+  if (click_component_ != HTCAPTION)
+    return;
+
+  if (event->details().tap_count() != 2) {
+    // Note: TouchUMA::GESTURE_FRAMEVIEW_TAP is counted twice for each tap.
+    TouchUMA::GetInstance()->
+        RecordGestureAction(TouchUMA::GESTURE_FRAMEVIEW_TAP);
+    return;
+  }
+
+  if (click_component_ == previous_target_component) {
+    ash::Shell::GetInstance()->metrics()->RecordUserMetricsAction(
+        ash::UMA_TOGGLE_MAXIMIZE_CAPTION_GESTURE);
+    // Note: TouchUMA::GESTURE_FRAMEVIEW_TAP is counted twice each time
+    // TouchUMA::GESTURE_MAXIMIZE_DOUBLETAP is counted once.
+    TouchUMA::GetInstance()->RecordGestureAction(
+        TouchUMA::GESTURE_MAXIMIZE_DOUBLETAP);
+    const wm::WMEvent wm_event(wm::WM_EVENT_TOGGLE_MAXIMIZE_CAPTION);
+    wm::GetWindowState(target)->OnWMEvent(&wm_event);
+    event->StopPropagation();
   }
+  click_component_ = HTNOWHERE;
 }
 
 void WorkspaceEventHandler::HandleVerticalResizeDoubleClick(
@@ -109,5 +138,4 @@ void WorkspaceEventHandler::HandleVerticalResizeDoubleClick(
   }
 }
 
-}  // namespace internal
 }  // namespace ash