/* * Copyright (c) 2021, Liav A. * Copyright (c) 2021, Edwin Hoksberg * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include namespace Kernel { class KeyboardDevice : public HIDDevice { public: using Event = KeyEvent; virtual ~KeyboardDevice() override; // ^CharacterDevice virtual ErrorOr read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override; virtual bool can_read(OpenFileDescription const&, u64) const override; virtual ErrorOr write(OpenFileDescription&, u64, UserOrKernelBuffer const&, size_t) override { return EINVAL; } virtual bool can_write(OpenFileDescription const&, u64) const override { return true; } // ^HIDDevice virtual Type instrument_type() const override { return Type::Keyboard; } // ^File virtual ErrorOr ioctl(OpenFileDescription&, unsigned request, Userspace arg) override; void update_modifier(u8 modifier, bool state) { if (state) m_modifiers |= modifier; else m_modifiers &= ~modifier; } protected: KeyboardDevice(); mutable Spinlock m_queue_lock; CircularQueue m_queue; // ^CharacterDevice virtual StringView class_name() const override { return "KeyboardDevice"sv; } u8 m_modifiers { 0 }; bool m_caps_lock_to_ctrl_pressed { false }; bool m_caps_lock_on { false }; bool m_num_lock_on { false }; bool m_has_e0_prefix { false }; bool m_left_shift_pressed { false }; bool m_right_shift_pressed { false }; bool m_left_super_pressed { false }; bool m_right_super_pressed { false }; void key_state_changed(u8 raw, bool pressed); }; }