This is a huge step forward!! bc actually runs now, without echo or backspace, but it runs!!
51 lines
1.3 KiB
C++
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;
|
|
} |