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