Index: athena/screen/screen_accelerator_handler.cc |
diff --git a/athena/screen/screen_accelerator_handler.cc b/athena/screen/screen_accelerator_handler.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..031a039dc68a2e1ecdc83b557a307da41deb522c |
--- /dev/null |
+++ b/athena/screen/screen_accelerator_handler.cc |
@@ -0,0 +1,96 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "athena/screen/screen_accelerator_handler.h" |
+ |
+#include "athena/input/public/accelerator_manager.h" |
+#include "ui/aura/window.h" |
+#include "ui/aura/window_event_dispatcher.h" |
+#include "ui/aura/window_tree_host.h" |
+#include "ui/compositor/debug_utils.h" |
+#include "ui/wm/public/activation_client.h" |
+ |
+namespace athena { |
+namespace { |
+ |
+enum Command { |
+ CMD_PRINT_LAYER_HIERARCHY, |
+ CMD_PRINT_WINDOW_HIERARCHY, |
+}; |
+ |
+const int EF_ALL_DOWN = |
+ ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN; |
+ |
+const AcceleratorData accelerator_data[] = { |
+ {TRIGGER_ON_PRESS, ui::VKEY_L, EF_ALL_DOWN, CMD_PRINT_LAYER_HIERARCHY, |
+ AF_DEBUG}, |
+ {TRIGGER_ON_PRESS, ui::VKEY_W, EF_ALL_DOWN, CMD_PRINT_WINDOW_HIERARCHY, |
+ AF_DEBUG}, |
+}; |
+ |
+void PrintLayerHierarchy(aura::Window* root_window) { |
+ ui::PrintLayerHierarchy( |
+ root_window->layer(), |
+ root_window->GetHost()->dispatcher()->GetLastMouseLocationInRoot()); |
+} |
+ |
+void PrintWindowHierarchy(aura::Window* window, |
+ aura::Window* active, |
+ int indent, |
+ std::ostringstream* out) { |
+ std::string indent_str(indent, ' '); |
+ std::string name(window->name()); |
+ if (name.empty()) |
+ name = "\"\""; |
+ *out << indent_str << name << " (" << window << ")" |
+ << " type=" << window->type() |
+ << ((window == active) ? " [active] " : " ") |
+ << (window->IsVisible() ? " visible " : " ") |
+ << window->bounds().ToString() << '\n'; |
+ |
+ for (size_t i = 0; i < window->children().size(); ++i) |
+ PrintWindowHierarchy(window->children()[i], active, indent + 3, out); |
+} |
+ |
+void HandlePrintWindowHierarchy(aura::Window* root_window) { |
+ aura::Window* active = |
+ aura::client::GetActivationClient(root_window)->GetActiveWindow(); |
+ std::ostringstream out; |
+ out << "RootWindow :\n"; |
+ PrintWindowHierarchy(root_window, active, 0, &out); |
+ // Error so logs can be collected from end-users. |
+ LOG(ERROR) << out.str(); |
+} |
+ |
+} // namespace |
+ |
+// static |
+ScreenAcceleratorHandler::ScreenAcceleratorHandler(aura::Window* root_window) |
+ : root_window_(root_window) { |
+ AcceleratorManager::Get()->RegisterAccelerators( |
+ accelerator_data, arraysize(accelerator_data), this); |
+} |
+ |
+ScreenAcceleratorHandler::~ScreenAcceleratorHandler() { |
+} |
+ |
+bool ScreenAcceleratorHandler::IsCommandEnabled(int command_id) const { |
+ return true; |
+} |
+ |
+bool ScreenAcceleratorHandler::OnAcceleratorFired( |
+ int command_id, |
+ const ui::Accelerator& accelerator) { |
+ switch (command_id) { |
+ case CMD_PRINT_LAYER_HIERARCHY: |
+ PrintLayerHierarchy(root_window_); |
+ return true; |
+ case CMD_PRINT_WINDOW_HIERARCHY: |
+ HandlePrintWindowHierarchy(root_window_); |
+ return true; |
+ } |
+ return false; |
+} |
+ |
+} // namesapce athena |