summaryrefslogtreecommitdiff
path: root/Kernel/Keyboard.h
diff options
context:
space:
mode:
authorAndreas Kling <awesomekling@gmail.com>2018-11-02 14:06:48 +0100
committerAndreas Kling <awesomekling@gmail.com>2018-11-02 14:06:48 +0100
commit10b666f69a610c0bdc5bd60efd1d7d2bf499707d (patch)
tree3c552bce003cd7b9a95f161fa12b7d73f902c088 /Kernel/Keyboard.h
parent621217ffeb9bddec866ad8895bd01973977f2848 (diff)
downloadserenity-10b666f69a610c0bdc5bd60efd1d7d2bf499707d.zip
Basic ^C interrupt implementation.
For testing, I made cat put itself into a new process group. This should eventually be done by sh between fork() and exec().
Diffstat (limited to 'Kernel/Keyboard.h')
-rw-r--r--Kernel/Keyboard.h27
1 files changed, 21 insertions, 6 deletions
diff --git a/Kernel/Keyboard.h b/Kernel/Keyboard.h
index 7f374b840a..923c3ab9aa 100644
--- a/Kernel/Keyboard.h
+++ b/Kernel/Keyboard.h
@@ -6,15 +6,25 @@
#include <VirtualFileSystem/CharacterDevice.h>
#include "IRQHandler.h"
-class KeyboardClient {
-public:
- virtual ~KeyboardClient();
- virtual void onKeyPress(byte) = 0;
-};
+class KeyboardClient;
class Keyboard final : public IRQHandler, public CharacterDevice {
AK_MAKE_ETERNAL
public:
+ enum Modifier {
+ Mod_Alt = 0x01,
+ Mod_Ctrl = 0x02,
+ Mod_Shift = 0x04,
+ };
+
+ struct Key {
+ byte character { 0 };
+ byte modifiers { 0 };
+ bool alt() { return modifiers & Mod_Alt; }
+ bool ctrl() { return modifiers & Mod_Ctrl; }
+ bool shift() { return modifiers & Mod_Shift; }
+ };
+
static Keyboard& the() PURE;
virtual ~Keyboard() override;
@@ -34,7 +44,12 @@ private:
void emit(byte);
KeyboardClient* m_client { nullptr };
- CircularQueue<byte, 16> m_queue;
+ CircularQueue<Key, 16> m_queue;
byte m_modifiers { 0 };
};
+class KeyboardClient {
+public:
+ virtual ~KeyboardClient();
+ virtual void onKeyPress(Keyboard::Key) = 0;
+};