55 lines
1.2 KiB
C++
55 lines
1.2 KiB
C++
#pragma once
|
|
#include "arch/Keyboard.h"
|
|
#include "fs/devices/DeviceRegistry.h"
|
|
#include <bits/termios.h>
|
|
#include <luna/Buffer.h>
|
|
|
|
class ConsoleDevice : public Device
|
|
{
|
|
public:
|
|
// Initializer for DeviceRegistry.
|
|
static Result<void> create();
|
|
|
|
Result<usize> read(u8*, usize, usize) const override;
|
|
|
|
Result<usize> write(const u8*, usize, usize) override;
|
|
|
|
static void did_press_or_release_key(u8 scancode);
|
|
|
|
bool will_block_if_read() const override;
|
|
|
|
Result<u64> ioctl(int request, void* arg) override;
|
|
|
|
StringView device_path() const override
|
|
{
|
|
return "console";
|
|
}
|
|
|
|
Result<u64> isatty() const override
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
virtual ~ConsoleDevice() = default;
|
|
|
|
private:
|
|
struct termios m_settings;
|
|
mutable Buffer m_input_buffer;
|
|
Option<pid_t> m_foreground_process_group {};
|
|
Vector<u8> m_line_buffer;
|
|
mutable Keyboard::KeyboardState m_kb_state;
|
|
|
|
static Vector<SharedPtr<ConsoleDevice>> 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<void> handle_background_process_group(bool can_succeed, int signo) const;
|
|
};
|