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