Index: ash/wm/workspace/workspace_event_handler.cc |
diff --git a/ash/wm/workspace/workspace_event_handler.cc b/ash/wm/workspace/workspace_event_handler.cc |
index bfc8104637be1816082754434f77c2f6ae228dc0..bba3f76160b94b5bf99495d81c3450a9f51c3e6c 100644 |
--- a/ash/wm/workspace/workspace_event_handler.cc |
+++ b/ash/wm/workspace/workspace_event_handler.cc |
@@ -15,16 +15,26 @@ |
namespace ash { |
-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 = |
@@ -40,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; |
@@ -60,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( |