HIDManagement.h 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /*
  2. * Copyright (c) 2021, Liav A. <liavalb@hotmail.co.il>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Atomic.h>
  8. #include <AK/CircularQueue.h>
  9. #include <AK/NonnullRefPtrVector.h>
  10. #include <AK/RefPtr.h>
  11. #include <AK/Time.h>
  12. #include <AK/Types.h>
  13. #include <Kernel/API/KResult.h>
  14. #include <Kernel/API/KeyCode.h>
  15. #include <Kernel/API/MousePacket.h>
  16. #include <Kernel/Locking/Spinlock.h>
  17. #include <Kernel/UnixTypes.h>
  18. #include <LibKeyboard/CharacterMap.h>
  19. namespace Kernel {
  20. extern Atomic<bool> g_caps_lock_remapped_to_ctrl;
  21. class HIDDevice;
  22. class I8042Controller;
  23. class MouseDevice;
  24. class KeyboardDevice;
  25. class KeyboardClient;
  26. class HIDManagement {
  27. friend class KeyboardDevice;
  28. friend class MouseDevice;
  29. AK_MAKE_ETERNAL;
  30. public:
  31. HIDManagement();
  32. static void initialize();
  33. static HIDManagement& the();
  34. void enumerate();
  35. const String& keymap_name() const { return m_character_map.character_map_name(); }
  36. const Keyboard::CharacterMapData& character_maps() const { return m_character_map.character_map_data(); }
  37. const Keyboard::CharacterMap& character_map() const { return m_character_map; }
  38. void set_client(KeyboardClient* client) { m_client = client; }
  39. void set_maps(const Keyboard::CharacterMapData& character_map, const String& character_map_name);
  40. private:
  41. size_t generate_minor_device_number_for_mouse();
  42. size_t generate_minor_device_number_for_keyboard();
  43. size_t m_mouse_minor_number { 0 };
  44. size_t m_keyboard_minor_number { 0 };
  45. Keyboard::CharacterMap m_character_map;
  46. KeyboardClient* m_client { nullptr };
  47. RefPtr<I8042Controller> m_i8042_controller;
  48. NonnullRefPtrVector<HIDDevice> m_hid_devices;
  49. };
  50. class KeyboardClient {
  51. public:
  52. virtual ~KeyboardClient() = default;
  53. virtual void on_key_pressed(KeyEvent) = 0;
  54. };
  55. }