2018-10-11 17:52:40 +03:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "Object.h"
|
2018-10-12 02:03:22 +03:00
|
|
|
#include "Rect.h"
|
2018-10-12 02:48:18 +03:00
|
|
|
#include "Color.h"
|
2018-10-11 17:52:40 +03:00
|
|
|
#include <AK/HashTable.h>
|
2019-01-09 05:16:58 +03:00
|
|
|
#include <AK/InlineLinkedList.h>
|
2018-10-13 18:00:45 +03:00
|
|
|
#include <AK/WeakPtr.h>
|
2018-10-11 17:52:40 +03:00
|
|
|
|
2018-10-12 02:20:06 +03:00
|
|
|
class MouseEvent;
|
2018-10-12 02:48:18 +03:00
|
|
|
class PaintEvent;
|
2018-10-12 02:10:16 +03:00
|
|
|
class Widget;
|
|
|
|
class Window;
|
2019-01-12 05:42:50 +03:00
|
|
|
class GraphicsBitmap;
|
2018-10-12 02:10:16 +03:00
|
|
|
|
2018-10-11 17:52:40 +03:00
|
|
|
class WindowManager : public Object {
|
|
|
|
public:
|
2018-10-12 02:48:18 +03:00
|
|
|
static WindowManager& the();
|
2018-10-12 02:03:22 +03:00
|
|
|
void addWindow(Window&);
|
2018-10-13 15:26:37 +03:00
|
|
|
void removeWindow(Window&);
|
2018-10-11 17:52:40 +03:00
|
|
|
|
2018-10-12 02:03:22 +03:00
|
|
|
void notifyTitleChanged(Window&);
|
|
|
|
void notifyRectChanged(Window&, const Rect& oldRect, const Rect& newRect);
|
2018-10-11 17:52:40 +03:00
|
|
|
|
2018-10-13 18:42:24 +03:00
|
|
|
Window* activeWindow() { return m_activeWindow.ptr(); }
|
|
|
|
void setActiveWindow(Window*);
|
|
|
|
|
2018-10-14 02:23:01 +03:00
|
|
|
bool isVisible(Window&) const;
|
|
|
|
|
2019-01-09 04:06:04 +03:00
|
|
|
void did_paint(Window&);
|
|
|
|
|
2019-01-09 05:16:58 +03:00
|
|
|
void move_to_front(Window&);
|
2018-10-14 02:23:01 +03:00
|
|
|
|
2019-01-11 01:19:29 +03:00
|
|
|
static void initialize();
|
|
|
|
|
2019-01-11 05:52:09 +03:00
|
|
|
void redraw_cursor();
|
|
|
|
|
2019-01-12 04:57:14 +03:00
|
|
|
void invalidate(const Window&);
|
|
|
|
void invalidate(const Rect&);
|
|
|
|
void invalidate();
|
2019-01-12 08:39:34 +03:00
|
|
|
void flush(const Rect&);
|
2019-01-12 04:57:14 +03:00
|
|
|
|
2018-10-11 17:52:40 +03:00
|
|
|
private:
|
|
|
|
WindowManager();
|
2019-01-12 04:57:14 +03:00
|
|
|
virtual ~WindowManager() override;
|
2018-10-11 17:52:40 +03:00
|
|
|
|
2018-10-12 02:20:06 +03:00
|
|
|
void processMouseEvent(MouseEvent&);
|
2018-10-12 02:48:18 +03:00
|
|
|
void handleTitleBarMouseEvent(Window&, MouseEvent&);
|
2018-10-12 20:39:48 +03:00
|
|
|
|
2018-10-12 02:10:16 +03:00
|
|
|
virtual void event(Event&) override;
|
2018-10-11 17:52:40 +03:00
|
|
|
|
2018-10-13 18:42:24 +03:00
|
|
|
Color m_activeWindowBorderColor;
|
|
|
|
Color m_activeWindowTitleColor;
|
|
|
|
|
|
|
|
Color m_inactiveWindowBorderColor;
|
|
|
|
Color m_inactiveWindowTitleColor;
|
2018-10-12 02:48:18 +03:00
|
|
|
|
2019-01-12 04:57:14 +03:00
|
|
|
void compose();
|
2018-10-12 02:10:16 +03:00
|
|
|
void paintWindowFrame(Window&);
|
2018-10-12 02:03:22 +03:00
|
|
|
HashTable<Window*> m_windows;
|
2019-01-09 05:16:58 +03:00
|
|
|
InlineLinkedList<Window> m_windows_in_order;
|
2018-10-12 03:24:05 +03:00
|
|
|
|
2018-10-13 18:42:24 +03:00
|
|
|
WeakPtr<Window> m_activeWindow;
|
|
|
|
|
2018-10-13 18:00:45 +03:00
|
|
|
WeakPtr<Window> m_dragWindow;
|
|
|
|
|
2018-10-12 03:24:05 +03:00
|
|
|
Point m_dragOrigin;
|
|
|
|
Point m_dragWindowOrigin;
|
|
|
|
Rect m_lastDragRect;
|
2018-10-12 20:39:48 +03:00
|
|
|
Rect m_dragStartRect;
|
|
|
|
Rect m_dragEndRect;
|
2019-01-09 06:18:28 +03:00
|
|
|
|
2019-01-12 08:39:34 +03:00
|
|
|
Rect m_last_cursor_rect;
|
2019-01-11 05:52:09 +03:00
|
|
|
|
2019-01-09 06:18:28 +03:00
|
|
|
unsigned m_recompose_count { 0 };
|
2019-01-12 04:57:14 +03:00
|
|
|
|
2019-01-12 08:39:34 +03:00
|
|
|
RetainPtr<GraphicsBitmap> m_front_bitmap;
|
|
|
|
RetainPtr<GraphicsBitmap> m_back_bitmap;
|
2019-01-12 05:42:50 +03:00
|
|
|
|
2019-01-12 04:57:14 +03:00
|
|
|
Vector<Rect> m_invalidated_rects;
|
2019-01-12 08:47:55 +03:00
|
|
|
|
|
|
|
bool m_pending_compose_event { false };
|
2018-10-11 17:52:40 +03:00
|
|
|
};
|