summaryrefslogtreecommitdiff
path: root/athena/screen/screen_accelerator_handler.cc
diff options
context:
space:
mode:
Diffstat (limited to 'athena/screen/screen_accelerator_handler.cc')
-rw-r--r--athena/screen/screen_accelerator_handler.cc96
1 files changed, 96 insertions, 0 deletions
diff --git a/athena/screen/screen_accelerator_handler.cc b/athena/screen/screen_accelerator_handler.cc
new file mode 100644
index 0000000000..031a039dc6
--- /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