Skip to content

Commit 19bb517

Browse files
committed
feat: Modify to conditionally compile platform code
1 parent 8bf4721 commit 19bb517

15 files changed

+292
-219
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
.idea/
2+
.vs/
3+
.vscode/
24
build/
35
cmake-build-debug/

examples/screen_info/main.cpp

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
#include <iostream>
2-
#include "libnativeapi.h"
2+
#include "nativeapi.h"
3+
4+
using nativeapi::Display;
5+
using nativeapi::Point;
6+
using nativeapi::ScreenEventType;
7+
using nativeapi::ScreenRetriever;
38

49
int main() {
5-
auto screenRetriever = nativeapi::ScreenRetriever::Create();
10+
ScreenRetriever screenRetriever = ScreenRetriever();
611

712
// Get primary display information
8-
nativeapi::Display primaryDisplay = screenRetriever->GetPrimaryDisplay();
13+
Display primaryDisplay = screenRetriever.GetPrimaryDisplay();
914
std::cout << "Primary Display Information:" << std::endl;
1015
std::cout << "ID: " << primaryDisplay.id << std::endl;
1116
std::cout << "Name: " << primaryDisplay.name << std::endl;
@@ -19,10 +24,10 @@ int main() {
1924
std::cout << std::endl;
2025

2126
// Get all displays information
22-
nativeapi::DisplayList allDisplays = screenRetriever->GetAllDisplays();
27+
std::vector<Display> allDisplays = screenRetriever.GetAllDisplays();
2328
std::cout << "All Displays Information:" << std::endl;
24-
for (int i = 0; i < allDisplays.count; i++) {
25-
nativeapi::Display& display = allDisplays.displays[i];
29+
for (int i = 0; i < allDisplays.size(); i++) {
30+
Display& display = allDisplays[i];
2631
std::cout << "Display " << (i + 1) << ":" << std::endl;
2732
std::cout << "ID: " << display.id << std::endl;
2833
std::cout << "Name: " << display.name << std::endl;
@@ -34,17 +39,11 @@ int main() {
3439
std::cout << "Visible Size: " << display.visibleSizeWidth << "x"
3540
<< display.visibleSizeHeight << std::endl;
3641
std::cout << std::endl;
37-
}
42+
}
3843

3944
// Get cursor position
40-
nativeapi::Point cursorPoint = screenRetriever->GetCursorScreenPoint();
45+
Point cursorPoint = screenRetriever.GetCursorScreenPoint();
4146
std::cout << "Current Cursor Position: (" << cursorPoint.x << ", "
4247
<< cursorPoint.y << ")" << std::endl;
43-
44-
// Clean up memory
45-
delete[] allDisplays.displays;
46-
delete[] primaryDisplay.id;
47-
delete[] primaryDisplay.name;
48-
4948
return 0;
5049
}

include/nativeapi.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#pragma once
2+
3+
#include "../src/display.h"
4+
#include "../src/geometry.h"
5+
#include "../src/screen_retriever.h"

src/CMakeLists.txt

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,31 +14,35 @@ endif()
1414
set(CMAKE_CXX_STANDARD 11)
1515
set(CMAKE_CXX_STANDARD_REQUIRED ON)
1616

17+
# Common source files
18+
file(GLOB COMMON_SOURCES "*.cpp")
19+
list(FILTER COMMON_SOURCES EXCLUDE REGEX "linux.*|macos.*|windows.*")
20+
1721
# Platform-specific source files
1822
if(LINUX)
19-
set(PLATFORM_SOURCES "screen_retriever_linux.cpp")
23+
file(GLOB PLATFORM_SOURCES "*_linux.cpp")
2024
elseif(APPLE)
21-
set(PLATFORM_SOURCES "screen_retriever_macos.mm")
25+
file(GLOB PLATFORM_SOURCES "*_macos.mm")
2226
elseif(WIN32)
23-
set(PLATFORM_SOURCES "screen_retriever_windows.cpp")
27+
file(GLOB PLATFORM_SOURCES "*_windows.cpp")
2428
else()
2529
set(PLATFORM_SOURCES "")
2630
endif()
2731

2832
# Add library target
2933
add_library(libnativeapi STATIC
30-
"screen_retriever.cpp"
34+
${COMMON_SOURCES}
3135
${PLATFORM_SOURCES}
3236
)
3337

3438
# Set library properties
3539
set_target_properties(libnativeapi PROPERTIES
36-
PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/libnativeapi/src/**/*.h"
40+
PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/../include/**/*.h"
3741
)
3842

3943
# Set library include directories
4044
target_include_directories(libnativeapi PUBLIC
41-
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
45+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../include>
4246
$<INSTALL_INTERFACE:include>
4347
)
4448

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1+
#pragma once
2+
#include <string>
3+
14
namespace nativeapi {
25

36
// Representation of a display
47
struct Display {
5-
char* id;
6-
char* name;
8+
std::string id;
9+
std::string name;
710
double width;
811
double height;
912
double visiblePositionX;
@@ -13,10 +16,4 @@ struct Display {
1316
double scaleFactor;
1417
};
1518

16-
// Representation of a list of displays
17-
struct DisplayList {
18-
Display* displays;
19-
int count;
20-
};
21-
2219
} // namespace nativeapi

src/ui/geometry.h renamed to src/geometry.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ struct Point {
2020
double y;
2121
};
2222

23-
// /**
24-
// * Size is a 2D size in the coordinate system.
25-
// */
26-
// struct Size {
27-
// double height;
28-
// double width;
29-
// };
23+
/**
24+
* Size is a 2D size in the coordinate system.
25+
*/
26+
struct Size {
27+
double height;
28+
double width;
29+
};
3030

3131
} // namespace nativeapi

src/libnativeapi.h

Lines changed: 0 additions & 7 deletions
This file was deleted.

src/screen_retriever.cpp

Lines changed: 56 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,62 @@
1+
#include <cstring>
2+
#include <iostream>
3+
#include <string>
14
#include "screen_retriever.h"
25

3-
// Forward declarations for platform-specific implementations
4-
#ifdef __APPLE__
5-
#include "screen_retriever_macos.h"
6-
#elif defined(_WIN32)
7-
#include "screen_retriever_windows.h"
8-
#else
9-
#include "screen_retriever_linux.h"
10-
#endif
11-
126
namespace nativeapi {
137

14-
std::unique_ptr<ScreenRetriever> ScreenRetriever::Create() {
15-
#ifdef __APPLE__
16-
return std::unique_ptr<ScreenRetriever>(new ScreenRetrieverMacOS());
17-
#elif defined(_WIN32)
18-
return std::unique_ptr<ScreenRetriever>(new ScreenRetrieverWindows());
19-
#else
20-
return std::unique_ptr<ScreenRetriever>(new ScreenRetrieverLinux());
21-
#endif
8+
void ScreenRetriever::AddEventListener(ScreenEventType event_type,
9+
std::function<void(const void*)> listener) {
10+
std::cout << "\nAdd!" << std::endl;
11+
12+
listeners_[event_type].push_back(listener);
2213
}
2314

24-
} // namespace nativeapi
15+
void ScreenRetriever::RemoveEventListener(ScreenEventType event_type,
16+
std::function<void(const void*)> listener) {
17+
// Note: This is a simplified implementation that removes all listeners for the event type
18+
listeners_[event_type].clear();
19+
}
20+
21+
22+
void ScreenRetriever::HandleDisplayChange() {
23+
auto new_displays = GetAllDisplays();
24+
25+
// Find added displays
26+
for (const auto& new_display : new_displays) {
27+
bool found = false;
28+
for (const auto& current_display : current_displays_) {
29+
if (new_display.id == current_display.id) {
30+
found = true;
31+
break;
32+
}
33+
}
34+
if (!found) {
35+
// This is a new display
36+
for (const auto& listener : listeners_[ScreenEventType::DisplayAdded]) {
37+
listener(&new_display);
38+
}
39+
}
40+
}
41+
42+
// Find removed displays
43+
for (const auto& current_display : current_displays_) {
44+
bool found = false;
45+
for (const auto& new_display : new_displays) {
46+
if (current_display.id == new_display.id) {
47+
found = true;
48+
break;
49+
}
50+
}
51+
if (!found) {
52+
// This display was removed
53+
for (const auto& listener : listeners_[ScreenEventType::DisplayRemoved]) {
54+
listener(&current_display);
55+
}
56+
}
57+
}
58+
59+
// Update current display list
60+
current_displays_ = std::move(new_displays);
61+
}
62+
} // namespace nativeapi

src/screen_retriever.h

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,52 @@
11
#pragma once
22

3-
#include <memory>
3+
#include <functional>
4+
#include <map>
45
#include <vector>
56

6-
#include "ui/display.h"
7-
#include "ui/geometry.h"
7+
#include "display.h"
8+
#include "geometry.h"
89

910
namespace nativeapi {
11+
12+
// Event types that can be listened to
13+
enum class ScreenEventType : uint8_t {
14+
DisplayAdded = 0x01, // New display connected
15+
DisplayRemoved = 0x02, // Display disconnected
16+
};
17+
1018
// Abstract base class for ScreenRetriever
1119
class ScreenRetriever {
1220
public:
13-
virtual ~ScreenRetriever() = default;
14-
15-
// Static factory method to create platform-specific instance
16-
static std::unique_ptr<ScreenRetriever> Create();
21+
ScreenRetriever();
22+
virtual ~ScreenRetriever();
1723

1824
// Get the current cursor screen point
19-
virtual Point GetCursorScreenPoint() = 0;
25+
Point GetCursorScreenPoint();
2026

2127
// Get the primary display information
22-
virtual Display GetPrimaryDisplay() = 0;
28+
Display GetPrimaryDisplay();
2329

2430
// Get all displays information
25-
virtual DisplayList GetAllDisplays() = 0;
31+
std::vector<Display> GetAllDisplays();
32+
33+
// Add event listener for specific event type
34+
void AddEventListener(ScreenEventType event_type,
35+
std::function<void(const void*)> listener);
36+
37+
// Remove event listener for specific event type
38+
void RemoveEventListener(ScreenEventType event_type,
39+
std::function<void(const void*)> listener);
40+
41+
private:
42+
// Store current displays to detect changes
43+
std::vector<Display> current_displays_;
44+
45+
// Event listeners storage
46+
std::map<ScreenEventType, std::vector<std::function<void(const void*)>>>
47+
listeners_;
48+
49+
void HandleDisplayChange();
2650
};
2751

2852
} // namespace nativeapi

src/screen_retriever_linux.cpp

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,27 @@
1-
#include "screen_retriever_linux.h"
21
#include <iostream>
2+
#include "screen_retriever.h"
33

44
namespace nativeapi {
55

6-
ScreenRetrieverLinux::ScreenRetrieverLinux() {
6+
ScreenRetriever::ScreenRetriever() {
77
// Constructor implementation
8-
std::cout << "ScreenRetrieverLinux initialized" << std::endl;
8+
std::cout << "ScreenRetriever initialized" << std::endl;
99
}
1010

11-
ScreenRetrieverLinux::~ScreenRetrieverLinux() {
11+
ScreenRetriever::~ScreenRetriever() {
1212
// Destructor implementation
13-
std::cout << "ScreenRetrieverLinux destroyed" << std::endl;
13+
std::cout << "ScreenRetriever destroyed" << std::endl;
1414
}
1515

16-
Point ScreenRetrieverLinux::GetCursorScreenPoint() {
16+
Point ScreenRetriever::GetCursorScreenPoint() {
1717
// Empty implementation
1818
Point point;
1919
point.x = 0.0;
2020
point.y = 0.0;
2121
return point;
2222
}
2323

24-
Display ScreenRetrieverLinux::GetPrimaryDisplay() {
24+
Display ScreenRetriever::GetPrimaryDisplay() {
2525
// Empty implementation
2626
Display display;
2727
display.id = "display-1";
@@ -36,12 +36,10 @@ Display ScreenRetrieverLinux::GetPrimaryDisplay() {
3636
return display;
3737
}
3838

39-
DisplayList ScreenRetrieverLinux::GetAllDisplays() {
39+
std::vector<Display> ScreenRetriever::GetAllDisplays() {
4040
// Empty implementation
41-
DisplayList displayList;
42-
displayList.displays = new Display[1];
43-
displayList.displays[0] = GetPrimaryDisplay();
44-
displayList.count = 1;
41+
std::vector<Display> displayList;
42+
displayList.push_back(GetPrimaryDisplay());
4543
return displayList;
4644
}
4745

0 commit comments

Comments
 (0)