#pragma once #include "arch/Keyboard.h" #include "fs/devices/DeviceRegistry.h" #include #include class ConsoleDevice : public Device { public: // Initializer for DeviceRegistry. static Result create(); Result read(u8*, usize, usize) const override; Result write(const u8*, usize, usize) override; static void did_press_or_release_key(u8 scancode); bool will_block_if_read() const override; Result ioctl(int request, void* arg) override; StringView device_path() const override { return "console"; } Result isatty() const override { return 1; } virtual ~ConsoleDevice() = default; private: struct termios m_settings; mutable Buffer m_input_buffer; Option m_foreground_process_group {}; Vector m_line_buffer; mutable Keyboard::KeyboardState m_kb_state; static Vector> m_console_devices; void process_key_event(u8 scancode); mutable bool m_may_read_without_blocking { false }; inline bool is_canonical() const { return m_settings.c_lflag & ICANON; } Result handle_background_process_group(bool can_succeed, int signo) const; };