1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
|
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/glic/glic_hotkey.h"
#include "base/functional/bind.h"
#include "base/functional/callback_helpers.h"
#include "base/strings/string_split.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/background/glic/glic_launcher_configuration.h"
#include "ui/base/accelerators/command.h"
namespace glic {
namespace {
std::string GetHotkeyStringWithMapping(
base::RepeatingCallback<void(std::u16string&)> token_mapping) {
std::vector<std::u16string> hotkey_tokens =
glic::GlicLauncherConfiguration::GetGlobalHotkey()
.GetShortcutVectorRepresentation();
// If the hotkey is unset, return an empty string as its representation.
if (hotkey_tokens.empty()) {
return "";
}
// Format the accelerator string so that it can be passed to the glic WebUI
// as a URL query parameter. Specifically, each component of the accelerator
// will be demarked with the '<' and '>' characters, and all components will
// then be joined with the '-' character.
for (std::u16string& token : hotkey_tokens) {
token_mapping.Run(token);
token = u"<" + token + u">";
}
// Build the formatted string starting with the first token. There should
// always be at least two tokens in the accelerator.
return base::UTF16ToUTF8(base::JoinString(hotkey_tokens, u"-"));
}
} // namespace
std::string GetHotkeyString() {
// No mapping used for base implementation.
return GetHotkeyStringWithMapping(base::DoNothing());
}
#if BUILDFLAG(IS_MAC)
std::string GetLongFormMacHotkeyString() {
return GetHotkeyStringWithMapping(
base::BindRepeating([](std::u16string& token) {
// Accelerator code returns hotkeys on Mac represented by their
// respective symbols (i.e. ⌘) rather than their spelled forms (i.e.
// Cmd). Map the former to the latter, as that is what is preferred by
// the glic UI.
if (token == u"⌃") {
token = u"Ctrl";
} else if (token == u"⌥") {
token = u"Option";
} else if (token == u"⇧") {
token = u"Shift";
} else if (token == u"⌘") {
token = u"Cmd";
}
}));
}
#endif
} // namespace glic
|