DisplayLink.cpp 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. /*
  2. * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <AK/Badge.h>
  7. #include <AK/Function.h>
  8. #include <AK/HashMap.h>
  9. #include <LibGUI/DisplayLink.h>
  10. #include <LibGUI/WindowServerConnection.h>
  11. namespace GUI {
  12. class DisplayLinkCallback : public RefCounted<DisplayLinkCallback> {
  13. public:
  14. DisplayLinkCallback(i32 link_id, Function<void(i32)> callback)
  15. : m_link_id(link_id)
  16. , m_callback(move(callback))
  17. {
  18. }
  19. void invoke()
  20. {
  21. m_callback(m_link_id);
  22. }
  23. private:
  24. i32 m_link_id { 0 };
  25. Function<void(i32)> m_callback;
  26. };
  27. static HashMap<i32, RefPtr<DisplayLinkCallback>>& callbacks()
  28. {
  29. static HashMap<i32, RefPtr<DisplayLinkCallback>>* map;
  30. if (!map)
  31. map = new HashMap<i32, RefPtr<DisplayLinkCallback>>;
  32. return *map;
  33. }
  34. static i32 s_next_callback_id = 1;
  35. i32 DisplayLink::register_callback(Function<void(i32)> callback)
  36. {
  37. if (callbacks().is_empty())
  38. WindowServerConnection::the().async_enable_display_link();
  39. i32 callback_id = s_next_callback_id++;
  40. callbacks().set(callback_id, adopt_ref(*new DisplayLinkCallback(callback_id, move(callback))));
  41. return callback_id;
  42. }
  43. bool DisplayLink::unregister_callback(i32 callback_id)
  44. {
  45. VERIFY(callbacks().contains(callback_id));
  46. callbacks().remove(callback_id);
  47. if (callbacks().is_empty())
  48. WindowServerConnection::the().async_disable_display_link();
  49. return true;
  50. }
  51. void DisplayLink::notify(Badge<WindowServerConnection>)
  52. {
  53. auto copy_of_callbacks = callbacks();
  54. for (auto& it : copy_of_callbacks)
  55. it.value->invoke();
  56. }
  57. }