Skip to content

Commit 2b82084

Browse files
Copilotlijy91
andauthored
Fix Linux compilation errors in platform-specific code (#20)
* Initial plan * Fix Linux compilation errors in platform-specific code Co-authored-by: lijy91 <[email protected]> --------- Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: lijy91 <[email protected]>
1 parent 1f40084 commit 2b82084

File tree

5 files changed

+40
-89
lines changed

5 files changed

+40
-89
lines changed

src/platform/linux/display_manager_linux.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ DisplayManager::DisplayManager() {
3838
std::cout << "DisplayManager initialized" << std::endl;
3939
}
4040

41+
DisplayManager::~DisplayManager() {
42+
// Destructor implementation
43+
}
44+
4145
std::vector<Display> DisplayManager::GetAll() {
4246
// Empty implementation
4347
std::vector<Display> displayList;

src/platform/linux/keyboard_monitor_linux.cpp

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class KeyboardMonitor::Impl {
3737
uint32_t GetModifierState();
3838
};
3939

40-
KeyboardMonitor::KeyboardMonitor() : impl_(std::make_unique<Impl>(this)), event_dispatcher_() {}
40+
KeyboardMonitor::KeyboardMonitor() : impl_(std::make_unique<Impl>(this)) {}
4141

4242
KeyboardMonitor::~KeyboardMonitor() {
4343
Stop();
@@ -156,16 +156,16 @@ void KeyboardMonitor::Impl::MonitoringLoop() {
156156

157157
if (xi_event->evtype == XI_KeyPress) {
158158
KeyPressedEvent key_event(xi_event->detail);
159-
monitor_->DispatchEvent(key_event);
159+
monitor_->EmitSync(key_event);
160160

161161
ModifierKeysChangedEvent modifier_event(GetModifierState());
162-
monitor_->DispatchEvent(modifier_event);
162+
monitor_->EmitSync(modifier_event);
163163
} else if (xi_event->evtype == XI_KeyRelease) {
164164
KeyReleasedEvent key_event(xi_event->detail);
165-
monitor_->DispatchEvent(key_event);
165+
monitor_->EmitSync(key_event);
166166

167167
ModifierKeysChangedEvent modifier_event(GetModifierState());
168-
monitor_->DispatchEvent(modifier_event);
168+
monitor_->EmitSync(modifier_event);
169169
}
170170

171171
XFreeEventData(display_, &event.xcookie);
@@ -216,8 +216,4 @@ bool KeyboardMonitor::IsMonitoring() const {
216216
return impl_->monitoring_;
217217
}
218218

219-
void KeyboardMonitor::DispatchEvent(const Event& event) {
220-
event_dispatcher_.DispatchSync(event);
221-
}
222-
223219
} // namespace nativeapi

src/platform/linux/menu_linux.cpp

Lines changed: 17 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -16,49 +16,36 @@ class MenuItem::Impl {
1616
std::string tooltip_;
1717
};
1818

19-
MenuItem::MenuItem() : pimpl_(new Impl(nullptr)) {
20-
id = -1;
21-
}
22-
2319
MenuItem::MenuItem(void* menu_item) : pimpl_(new Impl((GtkWidget*)menu_item)) {
24-
id = -1;
2520
}
2621

2722
MenuItem::~MenuItem() {
28-
delete pimpl_;
2923
}
3024

31-
void MenuItem::SetIcon(std::string icon) {
25+
void MenuItem::SetIcon(const std::string& icon) {
3226
pimpl_->icon_ = icon;
3327
// TODO: Implement icon setting for GTK menu item
3428
}
3529

36-
std::string MenuItem::GetIcon() {
30+
std::string MenuItem::GetIcon() const {
3731
return pimpl_->icon_;
3832
}
3933

40-
void MenuItem::SetTitle(std::string title) {
41-
pimpl_->title_ = title;
42-
if (pimpl_->gtk_menu_item_) {
43-
gtk_menu_item_set_label(GTK_MENU_ITEM(pimpl_->gtk_menu_item_), title.c_str());
44-
}
45-
}
46-
47-
std::string MenuItem::GetTitle() {
48-
return pimpl_->title_;
49-
}
50-
51-
void MenuItem::SetTooltip(std::string tooltip) {
34+
void MenuItem::SetTooltip(const std::string& tooltip) {
5235
pimpl_->tooltip_ = tooltip;
5336
if (pimpl_->gtk_menu_item_) {
5437
gtk_widget_set_tooltip_text(pimpl_->gtk_menu_item_, tooltip.c_str());
5538
}
5639
}
5740

58-
std::string MenuItem::GetTooltip() {
41+
std::string MenuItem::GetTooltip() const {
5942
return pimpl_->tooltip_;
6043
}
6144

45+
void* MenuItem::GetNativeItem() const {
46+
return (void*)pimpl_->gtk_menu_item_;
47+
}
48+
6249
// Private implementation class for Menu
6350
class Menu::Impl {
6451
public:
@@ -67,54 +54,30 @@ class Menu::Impl {
6754
GtkWidget* gtk_menu_;
6855
};
6956

70-
Menu::Menu() : pimpl_(new Impl(gtk_menu_new())) {
71-
id = -1;
72-
}
73-
7457
Menu::Menu(void* menu) : pimpl_(new Impl((GtkWidget*)menu)) {
75-
id = -1;
7658
}
7759

7860
Menu::~Menu() {
7961
if (pimpl_->gtk_menu_) {
8062
g_object_unref(pimpl_->gtk_menu_);
8163
}
82-
delete pimpl_;
83-
}
84-
85-
void Menu::AddItem(MenuItem item) {
86-
if (pimpl_->gtk_menu_ && item.pimpl_->gtk_menu_item_) {
87-
gtk_menu_shell_append(GTK_MENU_SHELL(pimpl_->gtk_menu_), item.pimpl_->gtk_menu_item_);
88-
}
8964
}
9065

91-
void Menu::RemoveItem(MenuItem item) {
92-
if (pimpl_->gtk_menu_ && item.pimpl_->gtk_menu_item_) {
93-
gtk_container_remove(GTK_CONTAINER(pimpl_->gtk_menu_), item.pimpl_->gtk_menu_item_);
66+
void Menu::AddItem(std::shared_ptr<MenuItem> item) {
67+
if (pimpl_->gtk_menu_ && item && item->GetNativeItem()) {
68+
gtk_menu_shell_append(GTK_MENU_SHELL(pimpl_->gtk_menu_), (GtkWidget*)item->GetNativeItem());
9469
}
9570
}
9671

97-
void Menu::AddSeparator() {
98-
if (pimpl_->gtk_menu_) {
99-
GtkWidget* separator = gtk_separator_menu_item_new();
100-
gtk_menu_shell_append(GTK_MENU_SHELL(pimpl_->gtk_menu_), separator);
72+
bool Menu::RemoveItem(std::shared_ptr<MenuItem> item) {
73+
if (pimpl_->gtk_menu_ && item && item->GetNativeItem()) {
74+
gtk_container_remove(GTK_CONTAINER(pimpl_->gtk_menu_), (GtkWidget*)item->GetNativeItem());
75+
return true;
10176
}
77+
return false;
10278
}
10379

104-
MenuItem Menu::CreateItem(std::string title) {
105-
GtkWidget* menu_item = gtk_menu_item_new_with_label(title.c_str());
106-
MenuItem item(menu_item);
107-
item.SetTitle(title);
108-
return item;
109-
}
110-
111-
MenuItem Menu::CreateItem(std::string title, std::string icon) {
112-
MenuItem item = CreateItem(title);
113-
item.SetIcon(icon);
114-
return item;
115-
}
116-
117-
void* Menu::GetNativeMenu() {
80+
void* Menu::GetNativeMenu() const {
11881
return (void*)pimpl_->gtk_menu_;
11982
}
12083

src/platform/linux/tray_icon_linux.cpp

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ namespace nativeapi {
1212
// Private implementation class
1313
class TrayIcon::Impl {
1414
public:
15-
Impl(GtkStatusIcon* tray) : gtk_status_icon_(tray), title_(""), tooltip_("") {}
15+
Impl(GtkStatusIcon* tray) : gtk_status_icon_(tray), title_(""), tooltip_(""), context_menu_(nullptr) {}
1616

1717
GtkStatusIcon* gtk_status_icon_;
18-
Menu context_menu_; // Store menu object to keep it alive
18+
std::shared_ptr<Menu> context_menu_; // Store menu shared_ptr to keep it alive
1919
std::string title_; // GTK StatusIcon doesn't have title, so we store it
2020
std::string tooltip_;
2121
};
@@ -113,15 +113,15 @@ std::string TrayIcon::GetTooltip() {
113113
}
114114

115115
void TrayIcon::SetContextMenu(std::shared_ptr<Menu> menu) {
116-
// Store the menu object to keep it alive
117-
pimpl_->context_menu_ = *menu;
116+
// Store the menu shared_ptr to keep it alive
117+
pimpl_->context_menu_ = menu;
118118

119119
// Note: Full GTK integration would need to connect popup-menu signal
120120
// and show the GTK menu from the Menu object's GetNativeMenu()
121121
}
122122

123123
std::shared_ptr<Menu> TrayIcon::GetContextMenu() {
124-
return std::make_shared<Menu>(pimpl_->context_menu_);
124+
return pimpl_->context_menu_;
125125
}
126126

127127
Rectangle TrayIcon::GetBounds() {
@@ -166,20 +166,8 @@ bool TrayIcon::IsVisible() {
166166
return false;
167167
}
168168

169-
void TrayIcon::SetOnLeftClick(std::function<void()> callback) {
170-
// This method is deprecated - use event listeners instead
171-
}
172-
173-
void TrayIcon::SetOnRightClick(std::function<void()> callback) {
174-
// This method is deprecated - use event listeners instead
175-
}
176-
177-
void TrayIcon::SetOnDoubleClick(std::function<void()> callback) {
178-
// This method is deprecated - use event listeners instead
179-
}
180-
181169
bool TrayIcon::ShowContextMenu(double x, double y) {
182-
if (!pimpl_->context_menu_.GetNativeMenu()) {
170+
if (!pimpl_->context_menu_ || !pimpl_->context_menu_->GetNativeMenu()) {
183171
return false;
184172
}
185173

@@ -189,7 +177,7 @@ bool TrayIcon::ShowContextMenu(double x, double y) {
189177
}
190178

191179
bool TrayIcon::ShowContextMenu() {
192-
if (!pimpl_->context_menu_.GetNativeMenu()) {
180+
if (!pimpl_->context_menu_ || !pimpl_->context_menu_->GetNativeMenu()) {
193181
return false;
194182
}
195183

src/platform/linux/window_manager_linux.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@
1212
namespace nativeapi {
1313

1414
// Private implementation for Linux (stub for now)
15-
class WindowManager::WindowManagerImpl {
15+
class WindowManager::Impl {
1616
public:
17-
WindowManagerImpl(WindowManager* manager) : manager_(manager) {}
18-
~WindowManagerImpl() {}
17+
Impl(WindowManager* manager) : manager_(manager) {}
18+
~Impl() {}
1919

2020
void SetupEventMonitoring() {
2121
// TODO: Implement Linux-specific event monitoring using GTK signals
@@ -29,7 +29,7 @@ class WindowManager::WindowManagerImpl {
2929
WindowManager* manager_;
3030
};
3131

32-
WindowManager::WindowManager() : impl_(std::make_unique<WindowManagerImpl>(this)) {
32+
WindowManager::WindowManager() : pimpl_(std::make_unique<Impl>(this)) {
3333
// Try to initialize GTK if not already initialized
3434
// In headless environments, this may fail, which is acceptable
3535
if (!gdk_display_get_default()) {
@@ -56,15 +56,15 @@ WindowManager::~WindowManager() {
5656
}
5757

5858
void WindowManager::SetupEventMonitoring() {
59-
impl_->SetupEventMonitoring();
59+
pimpl_->SetupEventMonitoring();
6060
}
6161

6262
void WindowManager::CleanupEventMonitoring() {
63-
impl_->CleanupEventMonitoring();
63+
pimpl_->CleanupEventMonitoring();
6464
}
6565

6666
void WindowManager::DispatchWindowEvent(const Event& event) {
67-
event_dispatcher_.DispatchSync(event);
67+
EmitSync(event);
6868
}
6969

7070
std::shared_ptr<Window> WindowManager::Get(WindowID id) {

0 commit comments

Comments
 (0)