From 174daa3e02c622b1d3070aa90cb7c1c89c43d98c Mon Sep 17 00:00:00 2001 From: Bananymous Date: Tue, 13 Dec 2022 16:14:41 +0200 Subject: [PATCH] Kernel: Keyboard event callback can now be registered later --- kernel/include/kernel/Keyboard.h | 4 +++- kernel/kernel/Keyboard.cpp | 13 +++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/kernel/include/kernel/Keyboard.h b/kernel/include/kernel/Keyboard.h index 729f58744..9c5f6f53a 100644 --- a/kernel/include/kernel/Keyboard.h +++ b/kernel/include/kernel/Keyboard.h @@ -37,9 +37,11 @@ namespace Keyboard bool pressed; }; - bool initialize(void (*callback)(KeyEvent)); + bool initialize(); void update_keyboard(); + void register_key_event_callback(void(*callback)(KeyEvent)); + char key_event_to_ascii(KeyEvent); void led_disco(); diff --git a/kernel/kernel/Keyboard.cpp b/kernel/kernel/Keyboard.cpp index d38858ce8..189c3bbc0 100644 --- a/kernel/kernel/Keyboard.cpp +++ b/kernel/kernel/Keyboard.cpp @@ -83,7 +83,7 @@ namespace Keyboard static uint8_t s_led_states = 0b000; static uint8_t s_modifiers = 0x00; - static void (*s_key_callback)(KeyEvent) = nullptr; + static void (*s_key_event_callback)(KeyEvent) = nullptr; static char s_key_to_char[] { @@ -185,7 +185,8 @@ namespace Keyboard while (!s_key_event_queue.Empty()) { - s_key_callback(s_key_event_queue.Front()); + if (s_key_event_callback) + s_key_event_callback(s_key_event_queue.Front()); s_key_event_queue.Pop(); } } @@ -354,7 +355,7 @@ namespace Keyboard } } - bool initialize(void (*callback)(KeyEvent)) + bool initialize() { // https://wiki.osdev.org/%228042%22_PS/2_Controller @@ -424,13 +425,17 @@ namespace Keyboard })); // Register callback and IRQ - s_key_callback = callback; IDT::register_irq_handler(KEYBOARD_IRQ, keyboard_irq_handler); PIC::unmask(KEYBOARD_IRQ); return true; } + void register_key_event_callback(void(*callback)(KeyEvent)) + { + s_key_event_callback = callback; + } + char key_event_to_ascii(KeyEvent event) { char res = s_key_to_char[static_cast(event.key)];