/* * Copyright (c) 2020, the SerenityOS developers. * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include namespace Line { class Editor; struct Key { enum Modifier : int { None = 0, Alt = 1, }; int modifiers { None }; unsigned key { 0 }; Key(unsigned c) : modifiers(None) , key(c) {}; Key(unsigned c, int modifiers) : modifiers(modifiers) , key(c) { } bool operator==(const Key& other) const { return other.key == key && other.modifiers == modifiers; } bool operator!=(const Key& other) const { return !(*this == other); } }; struct KeyCallback { KeyCallback(Function cb) : callback(move(cb)) { } Function callback; }; class KeyCallbackMachine { public: void register_key_input_callback(Vector, Function callback); void key_pressed(Editor&, Key); void interrupted(Editor&); bool should_process_last_pressed_key() const { return m_should_process_this_key; } private: HashMap, NonnullOwnPtr> m_key_callbacks; Vector> m_current_matching_keys; size_t m_sequence_length { 0 }; bool m_should_process_this_key { true }; }; } namespace AK { template<> struct Traits : public GenericTraits { static constexpr bool is_trivial() { return true; } static unsigned hash(Line::Key k) { return pair_int_hash(k.key, k.modifiers); } }; template<> struct Traits> : public GenericTraits> { static constexpr bool is_trivial() { return false; } static unsigned hash(const Vector& ks) { unsigned h = 0; for (auto& k : ks) h ^= Traits::hash(k); return h; } }; }