blob: 0d05d66a5bc5258d32b1a80dcf1b452d60a783f8 [file] [log] [blame]
// Copyright 2017 The Fuchsia 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 "garnet/bin/ui/root_presenter/display_usage_switcher.h"
#include <array>
#include "garnet/bin/ui/root_presenter/presentation.h"
namespace root_presenter {
namespace {
// Global keyboard shortcut for switching display usage.
const uint32_t kGlobalShortcutKeyCodePoint = 61; // '=' key
const uint32_t kGlobalShortcutKeyHidUsage = 46; // '=' key
static const std::array<fuchsia::ui::policy::DisplayUsage, 5> kDisplayUsages = {
fuchsia::ui::policy::DisplayUsage::kHandheld,
fuchsia::ui::policy::DisplayUsage::kClose,
fuchsia::ui::policy::DisplayUsage::kNear,
fuchsia::ui::policy::DisplayUsage::kMidrange,
fuchsia::ui::policy::DisplayUsage::kFar};
} // namespace
std::string GetDisplayUsageAsString(fuchsia::ui::policy::DisplayUsage usage) {
switch (usage) {
case fuchsia::ui::policy::DisplayUsage::kUnknown:
return "kUnknown";
case fuchsia::ui::policy::DisplayUsage::kHandheld:
return "kHandheld";
case fuchsia::ui::policy::DisplayUsage::kClose:
return "kClose";
case fuchsia::ui::policy::DisplayUsage::kNear:
return "kNear";
case fuchsia::ui::policy::DisplayUsage::kMidrange:
return "kMidrange";
case fuchsia::ui::policy::DisplayUsage::kFar:
return "kFar";
}
}
DisplayUsageSwitcher::DisplayUsageSwitcher() {}
bool DisplayUsageSwitcher::OnEvent(const fuchsia::ui::input::InputEvent& event,
Presentation* presenter) {
if (event.is_keyboard()) {
const fuchsia::ui::input::KeyboardEvent& kbd = event.keyboard();
if ((kbd.modifiers & fuchsia::ui::input::kModifierAlt) &&
kbd.phase == fuchsia::ui::input::KeyboardEventPhase::PRESSED &&
kbd.code_point == kGlobalShortcutKeyCodePoint &&
kbd.hid_usage == kGlobalShortcutKeyHidUsage) {
// Switch to the next display usage value.
current_display_usage_index_ =
(current_display_usage_index_ + 1) % kDisplayUsages.size();
presenter->SetDisplayUsage(kDisplayUsages[current_display_usage_index_]);
return true;
}
}
return false;
}
} // namespace root_presenter