blob: bc293e8c4b5b0405e8b050c44c0c973484cbbcfa [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