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
|
#ifndef SRDWM_EVENT_SYSTEM_H
#define SRDWM_EVENT_SYSTEM_H
#include <functional>
#include <map>
#include <vector>
#include <string>
#include <memory>
// Forward declarations
class SRDWindow;
class Monitor;
// Event types
enum class EventType {
WINDOW_CREATED,
WINDOW_DESTROYED,
WINDOW_MOVED,
WINDOW_RESIZED,
WINDOW_FOCUSED,
WINDOW_UNFOCUSED,
WINDOW_MINIMIZED,
WINDOW_MAXIMIZED,
WINDOW_RESTORED,
MONITOR_ADDED,
MONITOR_REMOVED,
MONITOR_CHANGED,
KEY_PRESSED,
KEY_RELEASED,
MOUSE_MOVED,
MOUSE_PRESSED,
MOUSE_RELEASED,
MOUSE_WHEEL,
CUSTOM_EVENT
};
// Base event class
class Event {
public:
virtual ~Event() = default;
EventType type;
Event(EventType t) : type(t) {}
};
// SRDWindow events
class SRDWindowEvent : public Event {
public:
SRDWindow* window;
SRDWindowEvent(EventType t, SRDWindow* w) : Event(t), window(w) {}
};
class SRDWindowCreatedEvent : public SRDWindowEvent {
public:
SRDWindowCreatedEvent(SRDWindow* w) : SRDWindowEvent(EventType::WINDOW_CREATED, w) {}
};
class SRDWindowDestroyedEvent : public SRDWindowEvent {
public:
SRDWindowDestroyedEvent(SRDWindow* w) : SRDWindowEvent(EventType::WINDOW_DESTROYED, w) {}
};
class SRDWindowMovedEvent : public SRDWindowEvent {
public:
int x, y;
SRDWindowMovedEvent(SRDWindow* w, int new_x, int new_y)
: SRDWindowEvent(EventType::WINDOW_MOVED, w), x(new_x), y(new_y) {}
};
class SRDWindowResizedEvent : public SRDWindowEvent {
public:
int width, height;
SRDWindowResizedEvent(SRDWindow* w, int new_width, int new_height)
: SRDWindowEvent(EventType::WINDOW_RESIZED, w), width(new_width), height(new_height) {}
};
// Input events
class KeyEvent : public Event {
public:
unsigned int keycode;
unsigned int modifiers;
KeyEvent(EventType t, unsigned int kc, unsigned int mods)
: Event(t), keycode(kc), modifiers(mods) {}
};
class MouseEvent : public Event {
public:
int x, y;
unsigned int button;
unsigned int modifiers;
MouseEvent(EventType t, int mouse_x, int mouse_y, unsigned int btn, unsigned int mods)
: Event(t), x(mouse_x), y(mouse_y), button(btn), modifiers(mods) {}
};
// Event handler function type
using EventHandler = std::function<void(const Event&)>;
// Event system class
class EventSystem {
public:
EventSystem();
~EventSystem();
// Register event handlers
void register_handler(EventType type, EventHandler handler);
void unregister_handler(EventType type, EventHandler handler);
// Emit events
void emit_event(const Event& event);
void emit_window_event(EventType type, SRDWindow* window);
void emit_key_event(EventType type, unsigned int keycode, unsigned int modifiers);
void emit_mouse_event(EventType type, int x, int y, unsigned int button, unsigned int modifiers);
// Process event queue
void process_events();
// Clear all handlers
void clear_handlers();
private:
std::map<EventType, std::vector<EventHandler>> handlers;
std::vector<std::unique_ptr<Event>> event_queue;
bool processing_events;
};
// Global event system instance
extern EventSystem g_event_system;
#endif // SRDWM_EVENT_SYSTEM_H
|