1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file. 4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "athena/screen/screen_accelerator_handler.h" 6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "athena/input/public/accelerator_manager.h" 86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "athena/screen/public/screen_manager.h" 9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/aura/window.h" 10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h" 11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/aura/window_tree_host.h" 12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/compositor/debug_utils.h" 136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "ui/gfx/display.h" 146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "ui/gfx/screen.h" 15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/wm/public/activation_client.h" 16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace athena { 18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace { 19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)enum Command { 21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) CMD_PRINT_LAYER_HIERARCHY, 22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) CMD_PRINT_WINDOW_HIERARCHY, 236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) CMD_ROTATE_SCREEN, 24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}; 25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)const int EF_ALL_DOWN = 27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN; 28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)const AcceleratorData accelerator_data[] = { 30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) {TRIGGER_ON_PRESS, ui::VKEY_L, EF_ALL_DOWN, CMD_PRINT_LAYER_HIERARCHY, 31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) AF_DEBUG}, 32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) {TRIGGER_ON_PRESS, ui::VKEY_W, EF_ALL_DOWN, CMD_PRINT_WINDOW_HIERARCHY, 33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) AF_DEBUG}, 346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) {TRIGGER_ON_PRESS, ui::VKEY_F3, 356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN, 366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) CMD_ROTATE_SCREEN, AF_NONE}, 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}; 38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void PrintLayerHierarchy(aura::Window* root_window) { 40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ui::PrintLayerHierarchy( 41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) root_window->layer(), 42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) root_window->GetHost()->dispatcher()->GetLastMouseLocationInRoot()); 43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void PrintWindowHierarchy(aura::Window* window, 46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) aura::Window* active, 47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int indent, 48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::ostringstream* out) { 49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string indent_str(indent, ' '); 50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string name(window->name()); 51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (name.empty()) 52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) name = "\"\""; 53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) *out << indent_str << name << " (" << window << ")" 54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) << " type=" << window->type() 55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) << ((window == active) ? " [active] " : " ") 56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) << (window->IsVisible() ? " visible " : " ") 57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) << window->bounds().ToString() << '\n'; 58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (size_t i = 0; i < window->children().size(); ++i) 60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PrintWindowHierarchy(window->children()[i], active, indent + 3, out); 61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void HandlePrintWindowHierarchy(aura::Window* root_window) { 64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) aura::Window* active = 65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) aura::client::GetActivationClient(root_window)->GetActiveWindow(); 66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::ostringstream out; 67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) out << "RootWindow :\n"; 68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PrintWindowHierarchy(root_window, active, 0, &out); 69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Error so logs can be collected from end-users. 70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) LOG(ERROR) << out.str(); 71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void HandleRotateScreen() { 746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ScreenManager* screen_manager = ScreenManager::Get(); 756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) gfx::Display::Rotation current_rotation = 766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().rotation(); 776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (current_rotation == gfx::Display::ROTATE_0) 786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) screen_manager->SetRotation(gfx::Display::ROTATE_90); 796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) else if (current_rotation == gfx::Display::ROTATE_90) 806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) screen_manager->SetRotation(gfx::Display::ROTATE_180); 816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) else if (current_rotation == gfx::Display::ROTATE_180) 826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) screen_manager->SetRotation(gfx::Display::ROTATE_270); 836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) else if (current_rotation == gfx::Display::ROTATE_270) 846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) screen_manager->SetRotation(gfx::Display::ROTATE_0); 856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} // namespace 88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// static 90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)ScreenAcceleratorHandler::ScreenAcceleratorHandler(aura::Window* root_window) 91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) : root_window_(root_window) { 92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) AcceleratorManager::Get()->RegisterAccelerators( 93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) accelerator_data, arraysize(accelerator_data), this); 94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)ScreenAcceleratorHandler::~ScreenAcceleratorHandler() { 97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool ScreenAcceleratorHandler::IsCommandEnabled(int command_id) const { 100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return true; 101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool ScreenAcceleratorHandler::OnAcceleratorFired( 104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int command_id, 105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const ui::Accelerator& accelerator) { 106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) switch (command_id) { 107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case CMD_PRINT_LAYER_HIERARCHY: 108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PrintLayerHierarchy(root_window_); 109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return true; 110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case CMD_PRINT_WINDOW_HIERARCHY: 111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) HandlePrintWindowHierarchy(root_window_); 112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return true; 1136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) case CMD_ROTATE_SCREEN: 1146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) HandleRotateScreen(); 1156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return true; 116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return false; 118f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 119f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 120f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} // namesapce athena 121