WindowList.cpp 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #include "WindowList.h"
  2. #include <LibGUI/GEventLoop.h>
  3. #include <WindowServer/WSAPITypes.h>
  4. WindowList& WindowList::the()
  5. {
  6. static WindowList* s_the;
  7. if (!s_the)
  8. s_the = new WindowList;
  9. return *s_the;
  10. }
  11. Window* WindowList::window(const WindowIdentifier& identifier)
  12. {
  13. auto it = m_windows.find(identifier);
  14. if (it != m_windows.end())
  15. return it->value;
  16. return nullptr;
  17. }
  18. Window& WindowList::ensure_window(const WindowIdentifier& identifier)
  19. {
  20. auto it = m_windows.find(identifier);
  21. if (it != m_windows.end())
  22. return *it->value;
  23. auto window = make<Window>(identifier);
  24. window->set_button(aid_create_button(identifier));
  25. window->button()->on_click = [window = window.ptr(), identifier](GButton&) {
  26. WSAPI_ClientMessage message;
  27. if (window->is_minimized() || !window->is_active()) {
  28. message.type = WSAPI_ClientMessage::Type::WM_SetActiveWindow;
  29. } else {
  30. message.type = WSAPI_ClientMessage::Type::WM_SetWindowMinimized;
  31. message.wm.minimized = true;
  32. }
  33. message.wm.client_id = identifier.client_id();
  34. message.wm.window_id = identifier.window_id();
  35. bool success = GEventLoop::post_message_to_server(message);
  36. ASSERT(success);
  37. };
  38. auto& window_ref = *window;
  39. m_windows.set(identifier, move(window));
  40. return window_ref;
  41. }
  42. void WindowList::remove_window(const WindowIdentifier& identifier)
  43. {
  44. m_windows.remove(identifier);
  45. }