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