Chromium Code Reviews| 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..54a7d50d17d18dc938e1edf22e8bebc00375539f 100644 |
| --- a/ash/wm/workspace/workspace_event_handler.cc |
| +++ b/ash/wm/workspace/workspace_event_handler.cc |
| @@ -15,7 +15,8 @@ |
| namespace ash { |
| -WorkspaceEventHandler::WorkspaceEventHandler() { |
| +WorkspaceEventHandler::WorkspaceEventHandler() |
| + : double_click_component_(HTNOWHERE) { |
| } |
| WorkspaceEventHandler::~WorkspaceEventHandler() { |
| @@ -24,6 +25,7 @@ WorkspaceEventHandler::~WorkspaceEventHandler() { |
| void WorkspaceEventHandler::OnMouseEvent(ui::MouseEvent* event) { |
| if (event->handled()) |
| return; |
| + |
| aura::Window* target = static_cast<aura::Window*>(event->target()); |
| switch (event->type()) { |
| case ui::ET_MOUSE_MOVED: { |
| @@ -38,18 +40,43 @@ void WorkspaceEventHandler::OnMouseEvent(ui::MouseEvent* event) { |
| case ui::ET_MOUSE_CAPTURE_CHANGED: |
| case ui::ET_MOUSE_EXITED: |
| break; |
| + case ui::ET_MOUSE_RELEASED: |
| + // WindowEventHandler is not guaranteed to get paired ET_MOUSE_PRESSED |
| + // and ET_MOUSE_RELEASED events. |
|
flackr
2014/04/08 21:11:39
So it can not get the first released event but sti
jonross
2014/04/08 22:29:08
Make a fix at the source: topleve_window_event_han
|
| + if (event->IsOnlyLeftMouseButton()) { |
| + double_click_component_ = target->delegate()-> |
| + GetNonClientComponent(event->location()); |
|
flackr
2014/04/08 21:11:39
nit: indent 4
|
| + } else { |
| + double_click_component_ = HTNOWHERE; |
| + } |
| + 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(); |
| + int component = target->delegate()-> |
| + GetNonClientComponent(event->location()); |
|
flackr
2014/04/08 21:11:39
nit: move these to scopes where used.
jonross
2014/04/08 22:29:08
Done.
|
| + |
| + if (event->IsOnlyLeftMouseButton()) { |
| + if (event->flags() & ui::EF_IS_DOUBLE_CLICK) { |
| + if (component == HTCAPTION && |
| + component == double_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 |
|
flackr
2014/04/08 21:11:39
May i ask why? If different targeting phases we sh
jonross
2014/04/08 22:29:08
We can see this event during both pre and post dis
|
| + // double-click has been received clear the target. Otherwise a |
| + // duplicate of the event will be checking target history against |
| + // itself. |
| + double_click_component_ = HTNOWHERE; |
| + } else { |
| + double_click_component_ = component; |
| + } |
| + } else { |
| + double_click_component_ = HTNOWHERE; |
| } |
| + |
| multi_window_resize_controller_.Hide(); |
| HandleVerticalResizeDoubleClick(target_state, event); |
| break; |
| @@ -60,13 +87,19 @@ 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) { |
| + int previous_target_component = double_click_component_; |
| + double_click_component_ = target->delegate()-> |
| + GetNonClientComponent(event->location()); |
| + |
| + if (double_click_component_ != HTCAPTION) |
| + return; |
| + |
| + if (event->details().tap_count() == 2) { |
|
flackr
2014/04/08 21:11:39
How about an early return when tap count is not ye
jonross
2014/04/08 22:29:08
Done.
|
| + if (double_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 |
| @@ -76,13 +109,12 @@ void WorkspaceEventHandler::OnGestureEvent(ui::GestureEvent* event) { |
| 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); |
| } |
| + double_click_component_ = HTNOWHERE; |
| + return; |
| } |
| + // Note: TouchUMA::GESTURE_FRAMEVIEW_TAP is counted twice for each tap. |
| + TouchUMA::GetInstance()->RecordGestureAction(TouchUMA::GESTURE_FRAMEVIEW_TAP); |
| } |
| void WorkspaceEventHandler::HandleVerticalResizeDoubleClick( |