1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
|
#pragma once
#include <SharedGraphics/Point.h>
#include <SharedGraphics/Rect.h>
#include <AK/AKString.h>
#include <AK/Types.h>
class WSMessage {
public:
enum Type {
Invalid = 0,
WM_ClientWantsToPaint,
WM_ClientFinishedPaint,
WM_SetWindowTitle,
WM_SetWindowRect,
WM_DeferredCompose,
WM_DestroyWindow,
MouseMove,
MouseDown,
MouseUp,
KeyDown,
KeyUp,
WindowActivated,
WindowDeactivated,
WindowCloseRequest,
};
WSMessage() { }
explicit WSMessage(Type type) : m_type(type) { }
virtual ~WSMessage() { }
Type type() const { return m_type; }
bool is_mouse_event() const { return m_type == MouseMove || m_type == MouseDown || m_type == MouseUp; }
bool is_key_event() const { return m_type == KeyUp || m_type == KeyDown; }
private:
Type m_type { Invalid };
};
class WSClientFinishedPaintMessage final : public WSMessage {
public:
explicit WSClientFinishedPaintMessage(const Rect& rect = Rect())
: WSMessage(WSMessage::WM_ClientFinishedPaint)
, m_rect(rect)
{
}
const Rect& rect() const { return m_rect; }
private:
Rect m_rect;
};
class WSSetWindowTitleMessage final : public WSMessage {
public:
explicit WSSetWindowTitleMessage(String&& title)
: WSMessage(WSMessage::WM_SetWindowTitle)
, m_title(move(title))
{
}
String title() const { return m_title; }
private:
String m_title;
};
class WSSetWindowRectMessage final : public WSMessage {
public:
explicit WSSetWindowRectMessage(const Rect& rect)
: WSMessage(WSMessage::WM_SetWindowRect)
, m_rect(rect)
{
}
Rect rect() const { return m_rect; }
private:
Rect m_rect;
};
class WSClientWantsToPaintMessage final : public WSMessage {
public:
explicit WSClientWantsToPaintMessage(const Rect& rect = Rect())
: WSMessage(WSMessage::WM_ClientWantsToPaint)
, m_rect(rect)
{
}
const Rect& rect() const { return m_rect; }
private:
friend class WSWindowManager;
Rect m_rect;
};
enum class MouseButton : byte {
None = 0,
Left = 1,
Right = 2,
Middle = 4,
};
class WSKeyEvent final : public WSMessage {
public:
WSKeyEvent(Type type, int key, char character)
: WSMessage(type)
, m_key(key)
, m_character(character)
{
}
int key() const { return m_key; }
bool ctrl() const { return m_ctrl; }
bool alt() const { return m_alt; }
bool shift() const { return m_shift; }
char character() const { return m_character; }
private:
friend class WSMessageLoop;
friend class WSScreen;
int m_key { 0 };
bool m_ctrl { false };
bool m_alt { false };
bool m_shift { false };
char m_character { 0 };
};
class WSMouseEvent final : public WSMessage {
public:
WSMouseEvent(Type type, const Point& position, unsigned buttons, MouseButton button = MouseButton::None)
: WSMessage(type)
, m_position(position)
, m_buttons(buttons)
, m_button(button)
{
}
Point position() const { return m_position; }
int x() const { return m_position.x(); }
int y() const { return m_position.y(); }
MouseButton button() const { return m_button; }
unsigned buttons() const { return m_buttons; }
private:
Point m_position;
unsigned m_buttons { 0 };
MouseButton m_button { MouseButton::None };
};
|