WSWindowManager.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. #pragma once
  2. #include <SharedGraphics/Rect.h>
  3. #include <SharedGraphics/Color.h>
  4. #include <SharedGraphics/Painter.h>
  5. #include <AK/HashTable.h>
  6. #include <AK/InlineLinkedList.h>
  7. #include <AK/WeakPtr.h>
  8. #include <AK/Lock.h>
  9. #include <AK/HashMap.h>
  10. #include "WSMessageReceiver.h"
  11. #include "WSMenuBar.h"
  12. #include <WindowServer/WSWindowType.h>
  13. class WSScreen;
  14. class WSMenuBar;
  15. class WSMouseEvent;
  16. class WSClientWantsToPaintMessage;
  17. class WSWindow;
  18. class CharacterBitmap;
  19. class GraphicsBitmap;
  20. class WSWindowManager : public WSMessageReceiver {
  21. public:
  22. static WSWindowManager& the();
  23. void add_window(WSWindow&);
  24. void remove_window(WSWindow&);
  25. void notify_title_changed(WSWindow&);
  26. void notify_rect_changed(WSWindow&, const Rect& oldRect, const Rect& newRect);
  27. WSWindow* active_window() { return m_active_window.ptr(); }
  28. void move_to_front(WSWindow&);
  29. void invalidate_cursor();
  30. void draw_cursor();
  31. void draw_menubar();
  32. Rect menubar_rect() const;
  33. WSMenuBar* current_menubar() { return m_current_menubar; }
  34. void set_current_menubar(WSMenuBar*);
  35. WSMenu* current_menu() { return m_current_menu; }
  36. void set_current_menu(WSMenu*);
  37. void invalidate(const WSWindow&);
  38. void invalidate(const WSWindow&, const Rect&);
  39. void invalidate(const Rect&);
  40. void invalidate();
  41. void flush(const Rect&);
  42. Font& font() { return *m_font; }
  43. const Font& font() const { return *m_font; }
  44. void close_menu(WSMenu&);
  45. Color menu_selection_color() const { return m_menu_selection_color; }
  46. int api$menubar_create();
  47. int api$menubar_destroy(int menubar_id);
  48. int api$menubar_add_menu(int menubar_id, int menu_id);
  49. int api$menu_create(String&&);
  50. int api$menu_destroy(int menu_id);
  51. int api$menu_add_separator(int menu_id);
  52. int api$menu_add_item(int menu_id, unsigned identifier, String&& text);
  53. int api$app_set_menubar(int menubar_id);
  54. void destroy_all_menus(Process&);
  55. private:
  56. WSWindowManager();
  57. virtual ~WSWindowManager() override;
  58. void process_mouse_event(WSMouseEvent&);
  59. void handle_menu_mouse_event(WSMenu&, WSMouseEvent&);
  60. void handle_menubar_mouse_event(WSMenuBar&, WSMouseEvent&);
  61. void handle_titlebar_mouse_event(WSWindow&, WSMouseEvent&);
  62. void handle_close_button_mouse_event(WSWindow&, WSMouseEvent&);
  63. void set_active_window(WSWindow*);
  64. template<typename Callback> void for_each_visible_window_of_type(WSWindowType, Callback);
  65. template<typename Callback> void for_each_active_menubar_menu(Callback);
  66. void close_current_menu();
  67. WSMenu& create_menu(String&& name);
  68. virtual void on_message(WSMessage&) override;
  69. void compose();
  70. void paint_window_frame(WSWindow&);
  71. void flip_buffers();
  72. WSScreen& m_screen;
  73. Rect m_screen_rect;
  74. Color m_background_color;
  75. Color m_active_window_border_color;
  76. Color m_active_window_border_color2;
  77. Color m_active_window_title_color;
  78. Color m_inactive_window_border_color;
  79. Color m_inactive_window_border_color2;
  80. Color m_inactive_window_title_color;
  81. Color m_dragging_window_border_color;
  82. Color m_dragging_window_border_color2;
  83. Color m_dragging_window_title_color;
  84. HashTable<WSWindow*> m_windows;
  85. InlineLinkedList<WSWindow> m_windows_in_order;
  86. WeakPtr<WSWindow> m_active_window;
  87. WeakPtr<WSWindow> m_drag_window;
  88. Point m_drag_origin;
  89. Point m_drag_window_origin;
  90. Rect m_last_drag_rect;
  91. Rect m_drag_start_rect;
  92. Rect m_drag_end_rect;
  93. Rect m_last_cursor_rect;
  94. unsigned m_compose_count { 0 };
  95. unsigned m_flush_count { 0 };
  96. RetainPtr<GraphicsBitmap> m_front_bitmap;
  97. RetainPtr<GraphicsBitmap> m_back_bitmap;
  98. Vector<Rect> m_dirty_rects;
  99. bool m_pending_compose_event { false };
  100. RetainPtr<CharacterBitmap> m_cursor_bitmap_inner;
  101. RetainPtr<CharacterBitmap> m_cursor_bitmap_outer;
  102. OwnPtr<Painter> m_back_painter;
  103. OwnPtr<Painter> m_front_painter;
  104. RetainPtr<Font> m_font;
  105. Lockable<String> m_wallpaper_path;
  106. RetainPtr<GraphicsBitmap> m_wallpaper;
  107. mutable Lock m_lock;
  108. Lockable<bool> m_flash_flush;
  109. bool m_buffers_are_flipped { false };
  110. int m_next_menubar_id = 100;
  111. int m_next_menu_id = 900;
  112. OwnPtr<WSMenu> m_system_menu;
  113. Color m_menu_selection_color;
  114. WSMenuBar* m_current_menubar { nullptr };
  115. WSMenu* m_current_menu { nullptr };
  116. HashMap<int, OwnPtr<WSMenuBar>> m_menubars;
  117. HashMap<int, OwnPtr<WSMenu>> m_menus;
  118. };