workspace_event_handler.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/workspace/workspace_event_handler.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ash/metrics/user_metrics_recorder.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ash/touch/touch_uma.h"
1068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ash/wm/window_state.h"
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/wm/wm_event.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window_delegate.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/hit_test.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)WorkspaceEventHandler::WorkspaceEventHandler() {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WorkspaceEventHandler::~WorkspaceEventHandler() {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WorkspaceEventHandler::OnMouseEvent(ui::MouseEvent* event) {
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (event->handled())
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window* target = static_cast<aura::Window*>(event->target());
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (event->type()) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_MOUSE_MOVED: {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int component =
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          target->delegate()->GetNonClientComponent(event->location());
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      multi_window_resize_controller_.Show(target, component,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           event->location());
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_MOUSE_ENTERED:
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_MOUSE_CAPTURE_CHANGED:
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_MOUSE_EXITED:
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_MOUSE_PRESSED: {
4368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      wm::WindowState* target_state = wm::GetWindowState(target);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (event->flags() & ui::EF_IS_DOUBLE_CLICK &&
453240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch          event->IsOnlyLeftMouseButton() &&
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          target->delegate()->GetNonClientComponent(event->location()) ==
474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          HTCAPTION) {
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ash::Shell::GetInstance()->metrics()->RecordUserMetricsAction(
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ash::UMA_TOGGLE_MAXIMIZE_CAPTION_CLICK);
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        const wm::WMEvent wm_event(wm::WM_EVENT_TOGGLE_MAXIMIZE_CAPTION);
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        target_state->OnWMEvent(&wm_event);
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        event->StopPropagation();
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      multi_window_resize_controller_.Hide();
5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      HandleVerticalResizeDoubleClick(target_state, event);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WorkspaceEventHandler::OnGestureEvent(ui::GestureEvent* event) {
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (event->handled())
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window* target = static_cast<aura::Window*>(event->target());
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (event->type() == ui::ET_GESTURE_TAP &&
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target->delegate()->GetNonClientComponent(event->location()) ==
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HTCAPTION) {
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (event->details().tap_count() == 2) {
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ash::Shell::GetInstance()->metrics()->RecordUserMetricsAction(
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          ash::UMA_TOGGLE_MAXIMIZE_CAPTION_GESTURE);
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      // Note: TouchUMA::GESTURE_FRAMEVIEW_TAP is counted twice each time
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      // TouchUMA::GESTURE_MAXIMIZE_DOUBLETAP is counted once.
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      TouchUMA::GetInstance()->RecordGestureAction(
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          TouchUMA::GESTURE_MAXIMIZE_DOUBLETAP);
77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const wm::WMEvent wm_event(wm::WM_EVENT_TOGGLE_MAXIMIZE_CAPTION);
78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      wm::GetWindowState(target)->OnWMEvent(&wm_event);
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      event->StopPropagation();
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      return;
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    } else {
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      // Note: TouchUMA::GESTURE_FRAMEVIEW_TAP is counted twice for each tap.
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      TouchUMA::GetInstance()->RecordGestureAction(
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          TouchUMA::GESTURE_FRAMEVIEW_TAP);
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WorkspaceEventHandler::HandleVerticalResizeDoubleClick(
9068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    wm::WindowState* target_state,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::MouseEvent* event) {
9268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  aura::Window* target = target_state->window();
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (event->flags() & ui::EF_IS_DOUBLE_CLICK) {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int component =
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        target->delegate()->GetNonClientComponent(event->location());
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (component == HTBOTTOM || component == HTTOP) {
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Shell::GetInstance()->metrics()->RecordUserMetricsAction(
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          UMA_TOGGLE_SINGLE_AXIS_MAXIMIZE_BORDER_CLICK);
99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const wm::WMEvent wm_event(wm::WM_EVENT_TOGGLE_VERTICAL_MAXIMIZE);
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      target_state->OnWMEvent(&wm_event);
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      event->StopPropagation();
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (component == HTLEFT || component == HTRIGHT) {
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Shell::GetInstance()->metrics()->RecordUserMetricsAction(
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          UMA_TOGGLE_SINGLE_AXIS_MAXIMIZE_BORDER_CLICK);
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const wm::WMEvent wm_event(wm::WM_EVENT_TOGGLE_HORIZONTAL_MAXIMIZE);
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      target_state->OnWMEvent(&wm_event);
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      event->StopPropagation();
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace internal
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
114