Luna/kernel/src/fs/devices/ConsoleDevice.h
apio 187f0ff83e
All checks were successful
continuous-integration/drone/pr Build is passing
kernel: Rename Inode::blocking() to Inode::will_block_if_read()
2023-07-30 11:41:53 +02:00

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;
};