chromium/chrome/browser/ash/sparky/keyboard_util.h

// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_ASH_SPARKY_KEYBOARD_UTIL_H_
#define CHROME_BROWSER_ASH_SPARKY_KEYBOARD_UTIL_H_

#include <optional>
#include <string>
#include <vector>

#include "ui/events/event.h"

namespace ash {

// Returns a pressed/released pair of KeyEvents for `key_code`, with some
// combination of control, alt, shift held down.
std::pair<ui::KeyEvent, ui::KeyEvent>
MakeKeyEventPair(ui::KeyboardCode key_code, bool control, bool alt, bool shift);

// Given some `text`, returns a vector of key events which simulate typing that
// text on a US keyboard. The returned vector contains a pressed/released
// pair of events for each character in `text`, and handles the modifiers
// for uppercase characters.
//
// This only works for characters typeable on a US keyboard. If any other
// character is encountered, it will return nullopt.
std::optional<std::vector<ui::KeyEvent>> KeyEventsForText(
    const std::string& text);

// Returns the KeyEvent corresponding to a subset of the key strings defined
// in https://www.w3.org/TR/uievents-key/, such as "Tab" and "Enter". Returns
// nullopt if `key` is invalid or unimplemented.
//
// This function is case insensitive.
std::optional<ui::KeyboardCode> KeyboardCodeForDOMString(
    const std::string& key);

}  // namespace ash

#endif  // CHROME_BROWSER_ASH_SPARKY_KEYBOARD_UTIL_H_