Skip to content

Commit 5bea6ba

Browse files
Copilotlijy91
andcommitted
Refactor DisplayManager to use generic event system while maintaining backward compatibility #14
* Initial plan * Refactor DisplayManager to use generic event system - core implementation Co-authored-by: lijy91 <[email protected]> * Complete DisplayManager event system refactoring with documentation and validation Co-authored-by: lijy91 <[email protected]> --------- Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: lijy91 <[email protected]>
1 parent bdc2c44 commit 5bea6ba

File tree

3 files changed

+78
-11
lines changed

3 files changed

+78
-11
lines changed

src/display_manager.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,26 @@ void DisplayManager::NotifyListeners(
1919
}
2020
}
2121

22+
void DisplayManager::DispatchDisplayAddedEvent(const Display& display) {
23+
// Dispatch through the new event system
24+
event_dispatcher_.DispatchSync<DisplayAddedEvent>(display);
25+
26+
// Also notify old-style listeners for backward compatibility
27+
NotifyListeners([&display](DisplayListener* listener) {
28+
listener->OnDisplayAdded(display);
29+
});
30+
}
31+
32+
void DisplayManager::DispatchDisplayRemovedEvent(const Display& display) {
33+
// Dispatch through the new event system
34+
event_dispatcher_.DispatchSync<DisplayRemovedEvent>(display);
35+
36+
// Also notify old-style listeners for backward compatibility
37+
NotifyListeners([&display](DisplayListener* listener) {
38+
listener->OnDisplayRemoved(display);
39+
});
40+
}
41+
2242
DisplayEventHandler::DisplayEventHandler(
2343
std::function<void(const Display&)> onDisplayAddedCallback,
2444
std::function<void(const Display&)> onDisplayRemovedCallback)

src/display_manager.h

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,33 @@
66
#include <vector>
77

88
#include "display.h"
9+
#include "event.h"
10+
#include "event_dispatcher.h"
911
#include "geometry.h"
1012

1113
namespace nativeapi {
1214

15+
// Event classes for display changes
16+
class DisplayAddedEvent : public TypedEvent<DisplayAddedEvent> {
17+
public:
18+
explicit DisplayAddedEvent(const Display& display) : display_(display) {}
19+
20+
const Display& GetDisplay() const { return display_; }
21+
22+
private:
23+
Display display_;
24+
};
25+
26+
class DisplayRemovedEvent : public TypedEvent<DisplayRemovedEvent> {
27+
public:
28+
explicit DisplayRemovedEvent(const Display& display) : display_(display) {}
29+
30+
const Display& GetDisplay() const { return display_; }
31+
32+
private:
33+
Display display_;
34+
};
35+
1336
// DisplayListener is an interface that can be implemented by classes that want
1437
// to listen for display events.
1538
class DisplayListener {
@@ -39,10 +62,34 @@ class DisplayManager {
3962
// Remove a listener from the display manager
4063
void RemoveListener(DisplayListener* listener);
4164

65+
// Event dispatcher methods for the new system
66+
template <typename EventType>
67+
size_t AddEventListener(TypedEventListener<EventType>* listener) {
68+
return event_dispatcher_.AddListener<EventType>(listener);
69+
}
70+
71+
template <typename EventType>
72+
size_t AddEventListener(std::function<void(const EventType&)> callback) {
73+
return event_dispatcher_.AddListener<EventType>(std::move(callback));
74+
}
75+
76+
bool RemoveEventListener(size_t listener_id) {
77+
return event_dispatcher_.RemoveListener(listener_id);
78+
}
79+
80+
// Get the event dispatcher (for advanced usage)
81+
EventDispatcher& GetEventDispatcher() { return event_dispatcher_; }
82+
4283
private:
4384
std::vector<Display> displays_;
44-
std::vector<DisplayListener*> listeners_;
85+
std::vector<DisplayListener*> listeners_; // For backward compatibility
86+
EventDispatcher event_dispatcher_; // New event system
87+
4588
void NotifyListeners(std::function<void(DisplayListener*)> callback);
89+
90+
// New event dispatch methods
91+
void DispatchDisplayAddedEvent(const Display& display);
92+
void DispatchDisplayRemovedEvent(const Display& display);
4693
};
4794

4895
// DisplayEventHandler is an implementation of DisplayListener that uses

src/platform/macos/display_manager_macos.mm

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ static Display CreateDisplayFromNSScreen(NSScreen* screen, bool isPrimary) {
4040
// Set position and size using geometry types
4141
display.position = {frame.origin.x, frame.origin.y};
4242
display.size = {frame.size.width, frame.size.height};
43-
display.workArea = {visibleFrame.origin.x, visibleFrame.origin.y,
44-
visibleFrame.size.height, visibleFrame.size.width};
43+
display.workArea = {visibleFrame.origin.x, visibleFrame.origin.y, visibleFrame.size.height,
44+
visibleFrame.size.width};
4545
display.scaleFactor = scaleFactor;
4646
display.isPrimary = isPrimary;
4747

@@ -56,7 +56,7 @@ static Display CreateDisplayFromNSScreen(NSScreen* screen, bool isPrimary) {
5656
CGDisplayModeRef displayMode = CGDisplayCopyDisplayMode(displayID);
5757
if (displayMode) {
5858
double refreshRate = CGDisplayModeGetRefreshRate(displayMode);
59-
display.refreshRate = refreshRate > 0 ? (int)refreshRate : 60; // Default to 60Hz if unknown
59+
display.refreshRate = refreshRate > 0 ? (int)refreshRate : 60; // Default to 60Hz if unknown
6060
CGDisplayModeRelease(displayMode);
6161
}
6262

@@ -81,11 +81,13 @@ static Display CreateDisplayFromNSScreen(NSScreen* screen, bool isPrimary) {
8181

8282
// Use display name as model for now
8383
display.model = display.name;
84-
display.serialNumber = ""; // Not easily available without deprecated APIs
84+
display.serialNumber = ""; // Not easily available without deprecated APIs
8585

8686
// Set default values if hardware info couldn't be retrieved
87-
if (display.manufacturer.empty()) display.manufacturer = "Unknown";
88-
if (display.model.empty()) display.model = "Unknown";
87+
if (display.manufacturer.empty())
88+
display.manufacturer = "Unknown";
89+
if (display.model.empty())
90+
display.model = "Unknown";
8991

9092
return display;
9193
}
@@ -109,8 +111,7 @@ static Display CreateDisplayFromNSScreen(NSScreen* screen, bool isPrimary) {
109111
old_ids.insert(d.id);
110112
for (const auto& d : new_displays) {
111113
if (old_ids.find(d.id) == old_ids.end()) {
112-
NotifyListeners(
113-
[d](DisplayListener* listener) { listener->OnDisplayAdded(d); });
114+
DispatchDisplayAddedEvent(d);
114115
}
115116
}
116117

@@ -120,8 +121,7 @@ static Display CreateDisplayFromNSScreen(NSScreen* screen, bool isPrimary) {
120121
new_ids.insert(d.id);
121122
for (const auto& d : old_displays) {
122123
if (new_ids.find(d.id) == new_ids.end()) {
123-
NotifyListeners(
124-
[d](DisplayListener* listener) { listener->OnDisplayRemoved(d); });
124+
DispatchDisplayRemovedEvent(d);
125125
}
126126
}
127127

0 commit comments

Comments
 (0)