diff options
author | Andreas Kling <awesomekling@gmail.com> | 2018-11-02 14:06:48 +0100 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2018-11-02 14:06:48 +0100 |
commit | 10b666f69a610c0bdc5bd60efd1d7d2bf499707d (patch) | |
tree | 3c552bce003cd7b9a95f161fa12b7d73f902c088 /Kernel/Keyboard.h | |
parent | 621217ffeb9bddec866ad8895bd01973977f2848 (diff) | |
download | serenity-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.h | 27 |
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; +}; |