Skip to content

Commit 5b6fd6b

Browse files
committed
Refactor EventEmitter to use Emit instead of EmitSync
Replaces all usages of EmitSync with Emit in EventEmitter and across platform-specific event emission code for Linux, macOS, and Windows. Removes unused callback listener storage and event definition macros from EventEmitter. Also updates window procedure delegate handling to avoid holding locks during delegate execution and improves tray icon window handle acquisition on Windows.
1 parent f6725b4 commit 5b6fd6b

16 files changed

+87
-148
lines changed

src/foundation/event_emitter.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,9 @@ void EventEmitter::RemoveAllListeners(std::type_index event_type) {
5252
void EventEmitter::RemoveAllListeners() {
5353
std::lock_guard<std::mutex> lock(listeners_mutex_);
5454
listeners_.clear();
55-
callback_listeners_.clear();
5655
}
5756

58-
void EventEmitter::EmitSync(const Event& event) {
57+
void EventEmitter::Emit(const Event& event) {
5958
std::type_index event_type = typeid(event);
6059
std::vector<EventListenerBase*> listeners_copy;
6160

@@ -175,9 +174,9 @@ void EventEmitter::ProcessAsyncEvents() {
175174

176175
// Dispatch the event if we have one
177176
if (event) {
178-
EmitSync(*event);
177+
Emit(*event);
179178
}
180179
}
181180
}
182181

183-
} // namespace nativeapi
182+
} // namespace nativeapi

src/foundation/event_emitter.h

Lines changed: 4 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ namespace nativeapi {
2828
* public:
2929
* void DoSomething() {
3030
* // Emit an event synchronously
31-
* EmitSync<MyEvent>("some data");
31+
* Emit<MyEvent>("some data");
3232
*
3333
* // Or emit asynchronously
3434
* EmitAsync<MyEvent>("some data");
@@ -159,17 +159,17 @@ class EventEmitter {
159159
*
160160
* @param event The event to emit
161161
*/
162-
void EmitSync(const Event& event);
162+
void Emit(const Event& event);
163163

164164
protected:
165165
/**
166166
* Emit an event synchronously using perfect forwarding.
167167
* This creates the event object and emits it immediately.
168168
*/
169169
template <typename EventType, typename... Args>
170-
void EmitSync(Args&&... args) {
170+
void Emit(Args&&... args) {
171171
EventType event(std::forward<Args>(args)...);
172-
EmitSync(event);
172+
Emit(event);
173173
}
174174

175175
/**
@@ -213,9 +213,6 @@ class EventEmitter {
213213
mutable std::mutex listeners_mutex_;
214214
std::unordered_map<std::type_index, std::vector<ListenerInfo>> listeners_;
215215

216-
// Storage for callback listeners to manage their lifetime
217-
std::vector<std::unique_ptr<EventListenerBase>> callback_listeners_;
218-
219216
// Async event processing
220217
std::mutex queue_mutex_;
221218
std::queue<std::unique_ptr<Event>> event_queue_;
@@ -228,46 +225,4 @@ class EventEmitter {
228225
std::atomic<size_t> next_listener_id_;
229226
};
230227

231-
/**
232-
* Convenience macro to define a simple event class.
233-
*
234-
* Usage:
235-
* DEFINE_EVENT(MyEvent) {
236-
* std::string message;
237-
* int code;
238-
* std::string GetTypeName() const override { return "MyEvent"; }
239-
* };
240-
*/
241-
#define DEFINE_EVENT(EventName) class EventName : public Event
242-
243-
/**
244-
* Helper macro to begin defining an event with custom constructor.
245-
*
246-
* Usage:
247-
* DEFINE_EVENT_BEGIN(MyEvent)
248-
* std::string message;
249-
* int code;
250-
* MyEvent(std::string msg, int c) : message(std::move(msg)), code(c) {}
251-
* std::string GetTypeName() const override { return "MyEvent"; }
252-
* DEFINE_EVENT_END();
253-
*/
254-
#define DEFINE_EVENT_BEGIN(EventName) \
255-
class EventName : public Event { \
256-
public:
257-
258-
#define DEFINE_EVENT_END() \
259-
} \
260-
;
261-
262-
/**
263-
* Simpler macro for events with basic data members.
264-
* Creates a constructor that initializes all members.
265-
* Note: You must implement GetTypeName() in the class body.
266-
*/
267-
#define SIMPLE_EVENT(EventName, ...) \
268-
class EventName : public Event { \
269-
public: \
270-
__VA_ARGS__ \
271-
};
272-
273228
} // namespace nativeapi

src/platform/linux/keyboard_monitor_linux.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -162,16 +162,16 @@ void KeyboardMonitor::Impl::MonitoringLoop() {
162162

163163
if (xi_event->evtype == XI_KeyPress) {
164164
KeyPressedEvent key_event(xi_event->detail);
165-
monitor_->EmitSync(key_event);
165+
monitor_->Emit(key_event);
166166

167167
ModifierKeysChangedEvent modifier_event(GetModifierState());
168-
monitor_->EmitSync(modifier_event);
168+
monitor_->Emit(modifier_event);
169169
} else if (xi_event->evtype == XI_KeyRelease) {
170170
KeyReleasedEvent key_event(xi_event->detail);
171-
monitor_->EmitSync(key_event);
171+
monitor_->Emit(key_event);
172172

173173
ModifierKeysChangedEvent modifier_event(GetModifierState());
174-
monitor_->EmitSync(modifier_event);
174+
monitor_->Emit(modifier_event);
175175
}
176176

177177
XFreeEventData(display_, &event.xcookie);
@@ -224,4 +224,4 @@ bool KeyboardMonitor::IsMonitoring() const {
224224
return impl_->monitoring_;
225225
}
226226

227-
} // namespace nativeapi
227+
} // namespace nativeapi

src/platform/linux/menu_linux.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,23 +23,23 @@ static void OnGtkMenuItemActivate(GtkMenuItem* /*item*/, gpointer user_data) {
2323
if (auto label = menu_item->GetLabel(); label.has_value()) {
2424
text = *label;
2525
}
26-
menu_item->EmitSync(MenuItemClickedEvent(menu_item->id, text));
26+
menu_item->Emit(MenuItemClickedEvent(menu_item->id, text));
2727
}
2828

2929
static void OnGtkMenuShow(GtkWidget* /*menu*/, gpointer user_data) {
3030
Menu* menu_obj = static_cast<Menu*>(user_data);
3131
if (!menu_obj) {
3232
return;
3333
}
34-
menu_obj->EmitSync(MenuOpenedEvent(menu_obj->id));
34+
menu_obj->Emit(MenuOpenedEvent(menu_obj->id));
3535
}
3636

3737
static void OnGtkMenuHide(GtkWidget* /*menu*/, gpointer user_data) {
3838
Menu* menu_obj = static_cast<Menu*>(user_data);
3939
if (!menu_obj) {
4040
return;
4141
}
42-
menu_obj->EmitSync(MenuClosedEvent(menu_obj->id));
42+
menu_obj->Emit(MenuClosedEvent(menu_obj->id));
4343
}
4444

4545
static void OnGtkSubmenuShow(GtkWidget* /*submenu*/, gpointer user_data) {
@@ -48,7 +48,7 @@ static void OnGtkSubmenuShow(GtkWidget* /*submenu*/, gpointer user_data) {
4848
return;
4949
}
5050
// Emit submenu opened on the item
51-
menu_item->EmitSync(MenuItemSubmenuOpenedEvent(menu_item->id));
51+
menu_item->Emit(MenuItemSubmenuOpenedEvent(menu_item->id));
5252
}
5353

5454
static void OnGtkSubmenuHide(GtkWidget* /*submenu*/, gpointer user_data) {
@@ -57,7 +57,7 @@ static void OnGtkSubmenuHide(GtkWidget* /*submenu*/, gpointer user_data) {
5757
return;
5858
}
5959
// Emit submenu closed on the item
60-
menu_item->EmitSync(MenuItemSubmenuClosedEvent(menu_item->id));
60+
menu_item->Emit(MenuItemSubmenuClosedEvent(menu_item->id));
6161
}
6262

6363
// Private implementation class for MenuItem

src/platform/linux/window_manager_linux.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ void WindowManager::CleanupEventMonitoring() {
6565
}
6666

6767
void WindowManager::DispatchWindowEvent(const Event& event) {
68-
EmitSync(event);
68+
Emit(event);
6969
}
7070

7171
std::shared_ptr<Window> WindowManager::Get(WindowID id) {
@@ -255,4 +255,4 @@ bool WindowManager::Destroy(WindowID id) {
255255
return false;
256256
}
257257

258-
} // namespace nativeapi
258+
} // namespace nativeapi

src/platform/macos/display_manager_macos.mm

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ static Display CreateDisplayFromNSScreen(NSScreen* screen, bool isPrimary) {
3737
old_ids.insert(d.GetId());
3838
for (const auto& d : new_displays) {
3939
if (old_ids.find(d.GetId()) == old_ids.end()) {
40-
EmitSync<DisplayAddedEvent>(d);
40+
Emit<DisplayAddedEvent>(d);
4141
}
4242
}
4343

@@ -47,7 +47,7 @@ static Display CreateDisplayFromNSScreen(NSScreen* screen, bool isPrimary) {
4747
new_ids.insert(d.GetId());
4848
for (const auto& d : old_displays) {
4949
if (new_ids.find(d.GetId()) == new_ids.end()) {
50-
EmitSync<DisplayRemovedEvent>(d);
50+
Emit<DisplayRemovedEvent>(d);
5151
}
5252
}
5353

src/platform/macos/keyboard_monitor_macos.mm

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,10 @@ static CGEventRef keyboardEventCallback(CGEventTapProxy proxy,
3939

4040
if (type == kCGEventKeyDown) {
4141
KeyPressedEvent key_event(keyCode);
42-
event_emitter->EmitSync(key_event);
42+
event_emitter->Emit(key_event);
4343
} else if (type == kCGEventKeyUp) {
4444
KeyReleasedEvent key_event(keyCode);
45-
event_emitter->EmitSync(key_event);
45+
event_emitter->Emit(key_event);
4646
} else if (type == kCGEventFlagsChanged) {
4747
CGEventFlags flags = CGEventGetFlags(event);
4848
uint32_t modifier_keys = static_cast<uint32_t>(ModifierKey::None);
@@ -68,7 +68,7 @@ static CGEventRef keyboardEventCallback(CGEventTapProxy proxy,
6868
modifier_keys |= static_cast<uint32_t>(ModifierKey::NumLock);
6969
}
7070
ModifierKeysChangedEvent modifier_event(modifier_keys);
71-
event_emitter->EmitSync(modifier_event);
71+
event_emitter->Emit(modifier_event);
7272
}
7373
return event;
7474
}

src/platform/macos/menu_macos.mm

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ - (void)menuDidClose:(NSMenu*)menu {
280280
// 设置默认的 Block 处理器,直接发送事件
281281
pimpl_->ns_menu_item_target_.clickedBlock = ^(MenuItemId item_id, const std::string& item_text) {
282282
try {
283-
EmitSync<MenuItemClickedEvent>(item_id, item_text);
283+
Emit<MenuItemClickedEvent>(item_id, item_text);
284284
} catch (...) {
285285
// Protect against event emission exceptions
286286
}
@@ -298,7 +298,7 @@ - (void)menuDidClose:(NSMenu*)menu {
298298
// 设置默认的 Block 处理器,直接发送事件
299299
pimpl_->ns_menu_item_target_.clickedBlock = ^(MenuItemId item_id, const std::string& item_text) {
300300
try {
301-
EmitSync<MenuItemClickedEvent>(item_id, item_text);
301+
Emit<MenuItemClickedEvent>(item_id, item_text);
302302
} catch (...) {
303303
// Protect against event emission exceptions
304304
}
@@ -487,7 +487,7 @@ - (void)menuDidClose:(NSMenu*)menu {
487487
pimpl_->submenu_opened_listener_id_ = submenu->AddListener<MenuOpenedEvent>(
488488
[self, menu_item_id](const MenuOpenedEvent& event) {
489489
try {
490-
self->EmitSync<MenuItemSubmenuOpenedEvent>(menu_item_id);
490+
self->Emit<MenuItemSubmenuOpenedEvent>(menu_item_id);
491491
} catch (...) {
492492
// Protect against event emission exceptions
493493
}
@@ -496,7 +496,7 @@ - (void)menuDidClose:(NSMenu*)menu {
496496
pimpl_->submenu_closed_listener_id_ = submenu->AddListener<MenuClosedEvent>(
497497
[self, menu_item_id](const MenuClosedEvent& event) {
498498
try {
499-
self->EmitSync<MenuItemSubmenuClosedEvent>(menu_item_id);
499+
self->Emit<MenuItemSubmenuClosedEvent>(menu_item_id);
500500
} catch (...) {
501501
// Protect against event emission exceptions
502502
}
@@ -598,15 +598,15 @@ - (void)menuDidClose:(NSMenu*)menu {
598598
// 设置默认的 Block 处理器,直接发送事件
599599
pimpl_->delegate_.openedBlock = ^(MenuId menu_id) {
600600
try {
601-
EmitSync<MenuOpenedEvent>(menu_id);
601+
Emit<MenuOpenedEvent>(menu_id);
602602
} catch (...) {
603603
// Protect against event emission exceptions
604604
}
605605
};
606606

607607
pimpl_->delegate_.closedBlock = ^(MenuId menu_id) {
608608
try {
609-
EmitSync<MenuClosedEvent>(menu_id);
609+
Emit<MenuClosedEvent>(menu_id);
610610
} catch (...) {
611611
// Protect against event emission exceptions
612612
}
@@ -623,15 +623,15 @@ - (void)menuDidClose:(NSMenu*)menu {
623623
// 设置默认的 Block 处理器,直接发送事件
624624
pimpl_->delegate_.openedBlock = ^(MenuId menu_id) {
625625
try {
626-
EmitSync<MenuOpenedEvent>(menu_id);
626+
Emit<MenuOpenedEvent>(menu_id);
627627
} catch (...) {
628628
// Protect against event emission exceptions
629629
}
630630
};
631631

632632
pimpl_->delegate_.closedBlock = ^(MenuId menu_id) {
633633
try {
634-
EmitSync<MenuClosedEvent>(menu_id);
634+
Emit<MenuClosedEvent>(menu_id);
635635
} catch (...) {
636636
// Protect against event emission exceptions
637637
}

src/platform/macos/tray_icon_macos.mm

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,23 +136,23 @@ - (void)statusItemClicked:(id)sender;
136136
pimpl_->ns_status_bar_button_target_.leftClickedBlock =
137137
^(TrayIconId tray_icon_id, const std::string& button) {
138138
try {
139-
EmitSync<TrayIconClickedEvent>(tray_icon_id, button);
139+
Emit<TrayIconClickedEvent>(tray_icon_id, button);
140140
} catch (...) {
141141
// Protect against event emission exceptions
142142
}
143143
};
144144

145145
pimpl_->ns_status_bar_button_target_.rightClickedBlock = ^(TrayIconId tray_icon_id) {
146146
try {
147-
EmitSync<TrayIconRightClickedEvent>(tray_icon_id);
147+
Emit<TrayIconRightClickedEvent>(tray_icon_id);
148148
} catch (...) {
149149
// Protect against event emission exceptions
150150
}
151151
};
152152

153153
pimpl_->ns_status_bar_button_target_.doubleClickedBlock = ^(TrayIconId tray_icon_id) {
154154
try {
155-
EmitSync<TrayIconDoubleClickedEvent>(tray_icon_id);
155+
Emit<TrayIconDoubleClickedEvent>(tray_icon_id);
156156
} catch (...) {
157157
// Protect against event emission exceptions
158158
}

src/platform/macos/window_manager_macos.mm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ - (void)windowWillClose:(NSNotification*)notification {
193193
}
194194

195195
void WindowManager::DispatchWindowEvent(const Event& event) {
196-
EmitSync(event); // Use Dispatch instead of DispatchSync
196+
Emit(event); // Use Dispatch instead of DispatchSync
197197
}
198198

199199
// Create a new window with the given options.

0 commit comments

Comments
 (0)