| // 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 |