From a42bb50ae2812244664e0a2c73f40f6b10dbeb79 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 26 Aug 2025 23:08:26 +0000 Subject: [PATCH 1/3] Initial plan From c55484ea6f4323777026c14aa6c5ac4e60415d68 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 26 Aug 2025 23:17:01 +0000 Subject: [PATCH 2/3] Fix Windows compilation errors - string encoding, API calls, and syntax Co-authored-by: lijy91 <3889523+lijy91@users.noreply.github.com> --- src/keyboard_monitor.h | 1 + .../windows/accessibility_manager_windows.cpp | 5 +++++ .../windows/display_manager_windows.cpp | 6 +++--- src/platform/windows/menu_windows.cpp | 14 ++++++------- src/platform/windows/tray_windows.cpp | 21 +++++++++---------- .../windows/window_manager_windows.cpp | 2 +- src/platform/windows/window_windows.cpp | 8 ++++--- 7 files changed, 32 insertions(+), 25 deletions(-) diff --git a/src/keyboard_monitor.h b/src/keyboard_monitor.h index 4e4892a..52c1486 100644 --- a/src/keyboard_monitor.h +++ b/src/keyboard_monitor.h @@ -64,6 +64,7 @@ class KeyboardMonitor { private: class Impl; + friend class Impl; // Allow Impl class to access private members std::unique_ptr impl_; KeyboardEventHandler* event_handler_; }; diff --git a/src/platform/windows/accessibility_manager_windows.cpp b/src/platform/windows/accessibility_manager_windows.cpp index 4ac6b36..44e8aba 100644 --- a/src/platform/windows/accessibility_manager_windows.cpp +++ b/src/platform/windows/accessibility_manager_windows.cpp @@ -3,6 +3,11 @@ #include #include +// SM_SCREENREADER is not defined in all Windows SDK versions +#ifndef SM_SCREENREADER +#define SM_SCREENREADER 40 +#endif + namespace nativeapi { void AccessibilityManager::Enable() { diff --git a/src/platform/windows/display_manager_windows.cpp b/src/platform/windows/display_manager_windows.cpp index 4441bcb..36b3310 100644 --- a/src/platform/windows/display_manager_windows.cpp +++ b/src/platform/windows/display_manager_windows.cpp @@ -13,7 +13,7 @@ UINT GetMonitorDpi(HMONITOR monitor) { typedef HRESULT(WINAPI* GetDpiForMonitorFunc)(HMONITOR, int, UINT*, UINT*); // Try to load GetDpiForMonitor from Shcore.dll (Windows 8.1+) - HMODULE shcore = LoadLibrary(L"Shcore.dll"); + HMODULE shcore = LoadLibraryW(L"Shcore.dll"); if (shcore) { GetDpiForMonitorFunc getDpiForMonitor = (GetDpiForMonitorFunc)GetProcAddress(shcore, "GetDpiForMonitor"); @@ -54,7 +54,7 @@ Display CreateDisplayFromMonitor(HMONITOR monitor, bool isPrimary) { UINT dpi = GetMonitorDpi(monitor); Display display; - display.name = WideStringToString(std::wstring(info.szDevice)); + display.name = std::string(info.szDevice); display.scaleFactor = static_cast(dpi) / kBaseDpi; display.isPrimary = isPrimary; @@ -74,7 +74,7 @@ Display CreateDisplayFromMonitor(HMONITOR monitor, bool isPrimary) { DISPLAY_DEVICE displayDevice; displayDevice.cb = sizeof(DISPLAY_DEVICE); if (EnumDisplayDevices(info.szDevice, 0, &displayDevice, 0)) { - display.id = WideStringToString(std::wstring(displayDevice.DeviceID)); + display.id = std::string(displayDevice.DeviceID); // Get display settings DEVMODE devMode; diff --git a/src/platform/windows/menu_windows.cpp b/src/platform/windows/menu_windows.cpp index d9289ec..3f569bf 100644 --- a/src/platform/windows/menu_windows.cpp +++ b/src/platform/windows/menu_windows.cpp @@ -83,7 +83,7 @@ void MenuItem::SetIcon(std::string icon) { } else if (!icon.empty()) { // Load icon from file path std::wstring wicon(icon.begin(), icon.end()); - HICON hIcon = (HICON)LoadImage(nullptr, wicon.c_str(), IMAGE_ICON, 16, 16, LR_LOADFROMFILE); + HICON hIcon = (HICON)LoadImageW(nullptr, wicon.c_str(), IMAGE_ICON, 16, 16, LR_LOADFROMFILE); if (hIcon) { // Convert HICON to HBITMAP HDC hdc = GetDC(nullptr); @@ -151,8 +151,8 @@ void Menu::AddItem(MenuItem item) { // Store the item to keep it alive pimpl_->items_.push_back(item); - MENUITEMINFO mii = {}; - mii.cbSize = sizeof(MENUITEMINFO); + MENUITEMINFOW mii = {}; + mii.cbSize = sizeof(MENUITEMINFOW); mii.fMask = MIIM_ID | MIIM_STRING | MIIM_DATA; mii.wID = item.pimpl_->menu_id_; @@ -167,7 +167,7 @@ void Menu::AddItem(MenuItem item) { mii.hbmpItem = item.pimpl_->icon_bitmap_; } - InsertMenuItem(pimpl_->hmenu_, GetMenuItemCount(pimpl_->hmenu_), TRUE, &mii); + InsertMenuItemW(pimpl_->hmenu_, GetMenuItemCount(pimpl_->hmenu_), TRUE, &mii); } void Menu::RemoveItem(MenuItem item) { @@ -188,12 +188,12 @@ void Menu::RemoveItem(MenuItem item) { void Menu::AddSeparator() { if (!pimpl_->hmenu_) return; - MENUITEMINFO mii = {}; - mii.cbSize = sizeof(MENUITEMINFO); + MENUITEMINFOW mii = {}; + mii.cbSize = sizeof(MENUITEMINFOW); mii.fMask = MIIM_FTYPE; mii.fType = MFT_SEPARATOR; - InsertMenuItem(pimpl_->hmenu_, GetMenuItemCount(pimpl_->hmenu_), TRUE, &mii); + InsertMenuItemW(pimpl_->hmenu_, GetMenuItemCount(pimpl_->hmenu_), TRUE, &mii); } MenuItem Menu::CreateItem(std::string title) { diff --git a/src/platform/windows/tray_windows.cpp b/src/platform/windows/tray_windows.cpp index bf84684..b4f7553 100644 --- a/src/platform/windows/tray_windows.cpp +++ b/src/platform/windows/tray_windows.cpp @@ -99,16 +99,16 @@ class Tray::Impl { // Register window class if not already registered static bool class_registered = false; if (!class_registered) { - WNDCLASS wc = {}; + WNDCLASSW wc = {}; wc.lpfnWndProc = TrayWindowProc; wc.hInstance = GetModuleHandle(nullptr); wc.lpszClassName = TRAY_WINDOW_CLASS; - RegisterClass(&wc); + RegisterClassW(&wc); class_registered = true; } // Create hidden window for tray messages - hwnd_ = CreateWindow( + hwnd_ = CreateWindowW( TRAY_WINDOW_CLASS, L"TrayWindow", WS_OVERLAPPED, @@ -122,13 +122,13 @@ class Tray::Impl { void InitializeTrayIcon() { if (!hwnd_) return; - nid_.cbSize = sizeof(NOTIFYICONDATA); + nid_.cbSize = sizeof(NOTIFYICONDATAW); nid_.hWnd = hwnd_; nid_.uID = tray_uid_; nid_.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; nid_.uCallbackMessage = g_tray_message; nid_.hIcon = LoadIcon(nullptr, IDI_APPLICATION); // Default icon - wcscpy_s(nid_.szTip, L"Tray Icon"); + wcscpy_s(nid_.szTip, sizeof(nid_.szTip)/sizeof(wchar_t), L"Tray Icon"); // Store tray pointer in window SetWindowLongPtr(hwnd_, GWLP_USERDATA, reinterpret_cast(tray_ptr_)); @@ -153,15 +153,14 @@ class Tray::Impl { if (!hwnd_) return; std::wstring wtooltip = StringToWideString(tooltip); - wcsncpy_s(nid_.szTip, wtooltip.c_str(), sizeof(nid_.szTip) / sizeof(wchar_t) - 1); - nid_.szTip[sizeof(nid_.szTip) / sizeof(wchar_t) - 1] = L'\0'; + wcsncpy_s(nid_.szTip, sizeof(nid_.szTip) / sizeof(wchar_t), wtooltip.c_str(), _TRUNCATE); Shell_NotifyIcon(NIM_MODIFY, &nid_); } HWND hwnd_; UINT tray_uid_; - NOTIFYICONDATA nid_; + NOTIFYICONDATAW nid_; HICON icon_; std::string title_; std::string tooltip_; @@ -200,7 +199,7 @@ void Tray::SetIcon(std::string icon) { } else if (!icon.empty()) { // Load icon from file path std::wstring wicon = StringToWideString(icon); - pimpl_->icon_ = (HICON)LoadImage( + pimpl_->icon_ = (HICON)LoadImageW( nullptr, wicon.c_str(), IMAGE_ICON, @@ -246,9 +245,9 @@ Rectangle Tray::GetBounds() { if (pimpl_->hwnd_) { // Get the position of the notification area - HWND hTray = FindWindow(L"Shell_TrayWnd", nullptr); + HWND hTray = FindWindowW(L"Shell_TrayWnd", nullptr); if (hTray) { - HWND hNotify = FindWindowEx(hTray, nullptr, L"TrayNotifyWnd", nullptr); + HWND hNotify = FindWindowExW(hTray, nullptr, L"TrayNotifyWnd", nullptr); if (hNotify) { RECT rect; GetWindowRect(hNotify, &rect); diff --git a/src/platform/windows/window_manager_windows.cpp b/src/platform/windows/window_manager_windows.cpp index c1a4450..7b24579 100644 --- a/src/platform/windows/window_manager_windows.cpp +++ b/src/platform/windows/window_manager_windows.cpp @@ -42,7 +42,7 @@ BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) { if (!(exStyle & WS_EX_TOOLWINDOW)) { // Check if window has a title wchar_t title[256]; - if (GetWindowText(hwnd, title, sizeof(title) / sizeof(wchar_t)) > 0) { + if (GetWindowTextW(hwnd, title, sizeof(title) / sizeof(wchar_t)) > 0) { windows->push_back(hwnd); } } diff --git a/src/platform/windows/window_windows.cpp b/src/platform/windows/window_windows.cpp index 73bb269..b21eb96 100644 --- a/src/platform/windows/window_windows.cpp +++ b/src/platform/windows/window_windows.cpp @@ -442,7 +442,7 @@ Point Window::GetPosition() { void Window::SetTitle(std::string title) { if (pimpl_->hwnd_) { std::wstring wtitle = StringToWideString(title); - SetWindowText(pimpl_->hwnd_, wtitle.c_str()); + SetWindowTextW(pimpl_->hwnd_, wtitle.c_str()); } } @@ -451,7 +451,7 @@ std::string Window::GetTitle() { int length = GetWindowTextLength(pimpl_->hwnd_); if (length > 0) { std::wstring wtitle(length + 1, L'\0'); - GetWindowText(pimpl_->hwnd_, &wtitle[0], length + 1); + GetWindowTextW(pimpl_->hwnd_, &wtitle[0], length + 1); wtitle.resize(length); return WideStringToString(wtitle); } @@ -571,4 +571,6 @@ void Window::StartResizing() { void* Window::GetNSWindow() const { // This method name suggests macOS compatibility - return HWND instead return pimpl_->hwnd_; -} \ No newline at end of file +} + +} // namespace nativeapi \ No newline at end of file From 65f7ddc93ffa7fc42dc42b782b60b99e670fc160 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 26 Aug 2025 23:19:31 +0000 Subject: [PATCH 3/3] Complete Windows API fixes - Shell_NotifyIconW, GetMenuItemInfoW, and strdup Co-authored-by: lijy91 <3889523+lijy91@users.noreply.github.com> --- src/capi/display_manager_c.cpp | 14 ++++++++++---- src/platform/windows/tray_windows.cpp | 8 ++++---- src/platform/windows/window_windows.cpp | 8 ++++---- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/capi/display_manager_c.cpp b/src/capi/display_manager_c.cpp index 63acf32..e0f2905 100644 --- a/src/capi/display_manager_c.cpp +++ b/src/capi/display_manager_c.cpp @@ -2,6 +2,12 @@ #include #include +#ifdef _WIN32 +#define STRDUP _strdup +#else +#define STRDUP strdup +#endif + #include "../display.h" #include "../display_manager.h" @@ -31,13 +37,13 @@ native_display_t to_native_display(const Display& raw_display) { native_display_t display = {}; // Allocate and copy strings - display.id = strdup(raw_display.id.c_str()); - display.name = strdup(raw_display.name.c_str()); + display.id = STRDUP(raw_display.id.c_str()); + display.name = STRDUP(raw_display.name.c_str()); display.manufacturer = raw_display.manufacturer.empty() ? nullptr - : strdup(raw_display.manufacturer.c_str()); + : STRDUP(raw_display.manufacturer.c_str()); display.model = - raw_display.model.empty() ? nullptr : strdup(raw_display.model.c_str()); + raw_display.model.empty() ? nullptr : STRDUP(raw_display.model.c_str()); display.serial_number = nullptr; // Not available in the C++ API // Copy position diff --git a/src/platform/windows/tray_windows.cpp b/src/platform/windows/tray_windows.cpp index b4f7553..e294023 100644 --- a/src/platform/windows/tray_windows.cpp +++ b/src/platform/windows/tray_windows.cpp @@ -133,19 +133,19 @@ class Tray::Impl { // Store tray pointer in window SetWindowLongPtr(hwnd_, GWLP_USERDATA, reinterpret_cast(tray_ptr_)); - Shell_NotifyIcon(NIM_ADD, &nid_); + Shell_NotifyIconW(NIM_ADD, &nid_); } void RemoveTrayIcon() { if (hwnd_) { - Shell_NotifyIcon(NIM_DELETE, &nid_); + Shell_NotifyIconW(NIM_DELETE, &nid_); } } void UpdateIcon() { if (hwnd_ && icon_) { nid_.hIcon = icon_; - Shell_NotifyIcon(NIM_MODIFY, &nid_); + Shell_NotifyIconW(NIM_MODIFY, &nid_); } } @@ -155,7 +155,7 @@ class Tray::Impl { std::wstring wtooltip = StringToWideString(tooltip); wcsncpy_s(nid_.szTip, sizeof(nid_.szTip) / sizeof(wchar_t), wtooltip.c_str(), _TRUNCATE); - Shell_NotifyIcon(NIM_MODIFY, &nid_); + Shell_NotifyIconW(NIM_MODIFY, &nid_); } HWND hwnd_; diff --git a/src/platform/windows/window_windows.cpp b/src/platform/windows/window_windows.cpp index b21eb96..bcc164a 100644 --- a/src/platform/windows/window_windows.cpp +++ b/src/platform/windows/window_windows.cpp @@ -390,10 +390,10 @@ bool Window::IsClosable() const { if (pimpl_->hwnd_) { HMENU hMenu = GetSystemMenu(pimpl_->hwnd_, FALSE); if (hMenu) { - MENUITEMINFO mii = {}; - mii.cbSize = sizeof(MENUITEMINFO); + MENUITEMINFOW mii = {}; + mii.cbSize = sizeof(MENUITEMINFOW); mii.fMask = MIIM_STATE; - if (GetMenuItemInfo(hMenu, SC_CLOSE, FALSE, &mii)) { + if (GetMenuItemInfoW(hMenu, SC_CLOSE, FALSE, &mii)) { return !(mii.fState & MFS_GRAYED); } } @@ -448,7 +448,7 @@ void Window::SetTitle(std::string title) { std::string Window::GetTitle() { if (pimpl_->hwnd_) { - int length = GetWindowTextLength(pimpl_->hwnd_); + int length = GetWindowTextLengthW(pimpl_->hwnd_); if (length > 0) { std::wstring wtitle(length + 1, L'\0'); GetWindowTextW(pimpl_->hwnd_, &wtitle[0], length + 1);