Keyboard.h 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #pragma once
  2. #include <AK/Types.h>
  3. #include <AK/DoublyLinkedList.h>
  4. #include <AK/CircularQueue.h>
  5. #include <VirtualFileSystem/CharacterDevice.h>
  6. #include "IRQHandler.h"
  7. class KeyboardClient;
  8. class Keyboard final : public IRQHandler, public CharacterDevice {
  9. AK_MAKE_ETERNAL
  10. public:
  11. enum Modifier {
  12. Mod_Alt = 0x01,
  13. Mod_Ctrl = 0x02,
  14. Mod_Shift = 0x04,
  15. };
  16. struct Key {
  17. byte character { 0 };
  18. byte modifiers { 0 };
  19. bool alt() { return modifiers & Mod_Alt; }
  20. bool ctrl() { return modifiers & Mod_Ctrl; }
  21. bool shift() { return modifiers & Mod_Shift; }
  22. };
  23. static Keyboard& the() PURE;
  24. virtual ~Keyboard() override;
  25. Keyboard();
  26. void set_client(KeyboardClient* client) { m_client = client; }
  27. // ^CharacterDevice
  28. virtual ssize_t read(Process&, byte* buffer, size_t) override;
  29. virtual bool can_read(Process&) const override;
  30. virtual ssize_t write(Process&, const byte* buffer, size_t) override;
  31. virtual bool can_write(Process&) const override { return true; }
  32. private:
  33. // ^IRQHandler
  34. virtual void handle_irq() override;
  35. void emit(byte);
  36. KeyboardClient* m_client { nullptr };
  37. CircularQueue<Key, 16> m_queue;
  38. byte m_modifiers { 0 };
  39. };
  40. class KeyboardClient {
  41. public:
  42. virtual ~KeyboardClient();
  43. virtual void on_key_pressed(Keyboard::Key) = 0;
  44. };