Luna/kernel/src/fs/devices/Keyboard.cpp
apio da61e3648f Kernel: Implement blocking reads
This is a huge step forward!! bc actually runs now, without echo or backspace, but it runs!!
2022-10-21 21:26:19 +02:00

51 lines
1.3 KiB
C++

#define MODULE "kbd"
#include "fs/devices/Keyboard.h"
#include "config.h"
#include "log/Log.h"
#include "render/TextRenderer.h"
#include "std/stdio.h"
#include "std/stdlib.h"
#include "std/string.h"
char* kbd_buffer = nullptr;
uint64_t kbd_bufsize = 0;
int KeyboardDevice::would_block(VFS::Node*)
{
return kbd_bufsize == 0;
}
VFS::Node* KeyboardDevice::create_new(const char* devname)
{
VFS::Node* dev = new VFS::Node;
dev->read_func = KeyboardDevice::read;
dev->block_func = KeyboardDevice::would_block;
dev->inode = 0;
dev->length = 0;
dev->type = VFS_DEVICE;
dev->flags = 0;
dev->tty = 1;
strncpy(dev->name, devname, sizeof(dev->name));
return dev;
}
ssize_t KeyboardDevice::read(VFS::Node* node, size_t, size_t size, char* buffer)
{
if (!node) return -1;
if (!kbd_buffer) return 0;
if (size > kbd_bufsize) size = kbd_bufsize;
memcpy(buffer, kbd_buffer, size);
memmove(kbd_buffer, kbd_buffer + size, kbd_bufsize - size);
kbd_bufsize -= size;
kbd_buffer = (char*)krealloc(kbd_buffer, kbd_bufsize);
return (ssize_t)size;
}
void KeyboardDevice::append(char c)
{
kbd_bufsize++;
kbd_buffer = (char*)krealloc(
kbd_buffer, kbd_bufsize); // FIXME: We should probably not be calling realloc every time a key is pressed.
kbd_buffer[kbd_bufsize - 1] = c;
}