From b0c29d70133ee786654106f48571bc5b9607a824 Mon Sep 17 00:00:00 2001 From: Tim Ebbeke Date: Mon, 25 May 2026 01:58:05 +0200 Subject: [PATCH 1/2] Add ico for windows as app icon. --- .github/workflows/windows.yml | 1 + CMakeLists.txt | 16 +++++++++ _cmake/windows/icon.cmake | 25 ++++++++++++++ _cmake/windows/nui-sftp.rc.in | 34 +++++++++++++++++++ scripts/deploy.sh | 6 ++++ .../source/frontend/sections/platforms.cpp | 8 +++-- 6 files changed, 87 insertions(+), 3 deletions(-) create mode 100644 _cmake/windows/icon.cmake create mode 100644 _cmake/windows/nui-sftp.rc.in diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index c5bd338d..8d0ee567 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -51,6 +51,7 @@ jobs: mingw-w64-clang-x86_64-bzip2 mingw-w64-clang-x86_64-zstd mingw-w64-clang-x86_64-xz + mingw-w64-clang-x86_64-imagemagick - name: Workspace Path Fixup run: | diff --git a/CMakeLists.txt b/CMakeLists.txt index 6a0a3bed..5c3ed0c2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -69,6 +69,22 @@ add_subdirectory("${CMAKE_SOURCE_DIR}/dependencies/Nui" EXCLUDE_FROM_ALL) add_executable(${PROJECT_NAME}) target_link_libraries(${PROJECT_NAME} PUBLIC core-target) +if (WIN32) + include("${CMAKE_CURRENT_LIST_DIR}/_cmake/windows/icon.cmake") + file(TO_CMAKE_PATH "${NUI_SFTP_ICO}" NUI_SFTP_ICO_FORWARD) + configure_file( + "${CMAKE_CURRENT_LIST_DIR}/_cmake/windows/nui-sftp.rc.in" + "${CMAKE_BINARY_DIR}/generated/nui-sftp.rc" + @ONLY + ) + target_sources(${PROJECT_NAME} PRIVATE "${CMAKE_BINARY_DIR}/generated/nui-sftp.rc") + set_source_files_properties( + "${CMAKE_BINARY_DIR}/generated/nui-sftp.rc" + PROPERTIES OBJECT_DEPENDS "${NUI_SFTP_ICO}" + ) + add_dependencies(${PROJECT_NAME} nui-sftp-icon) +endif() + # Third-party license drift check: fails the build if a CMake-declared dep # is missing from licenses/third_party.spdx.json (or vice versa) or any # referenced license text file is empty / still a PLACEHOLDER. diff --git a/_cmake/windows/icon.cmake b/_cmake/windows/icon.cmake new file mode 100644 index 00000000..eca20397 --- /dev/null +++ b/_cmake/windows/icon.cmake @@ -0,0 +1,25 @@ +set(NUI_SFTP_SVG "${CMAKE_SOURCE_DIR}/static/assets/icons/nui-sftp-logo.svg") +set(NUI_SFTP_ICO "${CMAKE_BINARY_DIR}/generated/icons/nui-sftp.ico") + +find_program(MAGICK_EXECUTABLE + NAMES magick + DOC "ImageMagick CLI (used to rasterize SVG -> ICO for the Windows executable resource)" +) +if (NOT MAGICK_EXECUTABLE) + message(FATAL_ERROR + "ImageMagick (magick) is required on Windows to generate nui-sftp.ico from the SVG. " + "Install via MSYS2: pacman -S mingw-w64-clang-x86_64-imagemagick" + ) +endif() + +add_custom_command( + OUTPUT "${NUI_SFTP_ICO}" + COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_BINARY_DIR}/generated/icons" + COMMAND ${MAGICK_EXECUTABLE} -background none "${NUI_SFTP_SVG}" + -define "icon:auto-resize=256,128,64,48,32,24,16" + "${NUI_SFTP_ICO}" + DEPENDS "${NUI_SFTP_SVG}" + COMMENT "Generating nui-sftp.ico from ${NUI_SFTP_SVG}" + VERBATIM +) +add_custom_target(nui-sftp-icon DEPENDS "${NUI_SFTP_ICO}") diff --git a/_cmake/windows/nui-sftp.rc.in b/_cmake/windows/nui-sftp.rc.in new file mode 100644 index 00000000..d975a860 --- /dev/null +++ b/_cmake/windows/nui-sftp.rc.in @@ -0,0 +1,34 @@ +#include + +// Numeric ID 1 ensures Explorer / taskbar use this as the default exe icon +// (Windows picks the lowest-numbered ICON resource). +1 ICON "@NUI_SFTP_ICO_FORWARD@" + +VS_VERSION_INFO VERSIONINFO + FILEVERSION @SEMVER_MAJOR@,@SEMVER_MINOR@,@SEMVER_PATCH@,0 + PRODUCTVERSION @SEMVER_MAJOR@,@SEMVER_MINOR@,@SEMVER_PATCH@,0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS 0 + FILEOS VOS_NT_WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0 +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "CompanyName", "Tim Ebbeke" + VALUE "FileDescription", "nui-sftp - SSH & SFTP workbench" + VALUE "FileVersion", "@VERSION@" + VALUE "InternalName", "nui-sftp" + VALUE "LegalCopyright", "Copyright (C) Tim Ebbeke" + VALUE "OriginalFilename", "nui-sftp.exe" + VALUE "ProductName", "nui-sftp" + VALUE "ProductVersion", "@VERSION@" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 0x04B0 + END +END diff --git a/scripts/deploy.sh b/scripts/deploy.sh index af26a3a0..57076c04 100755 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -66,6 +66,12 @@ cp -r "${SOURCE_DIRECTORY}/static/assets/." "${INSTALL_TARGET}/assets" cp "${SOURCE_DIRECTORY}/static/assets/icons/file.png" "${INSTALL_TARGET}/assets/icons/" cp "${SOURCE_DIRECTORY}/static/assets/icons/nui-sftp-logo.svg" "${INSTALL_TARGET}/assets/icons/" +# Generated Windows .ico (only present on Windows builds; used by the Inno Setup +# installer as SetupIconFile and Start Menu shortcut icon). +if [ -f "${BUILD_DIRECTORY}/generated/icons/nui-sftp.ico" ]; then + cp "${BUILD_DIRECTORY}/generated/icons/nui-sftp.ico" "${INSTALL_TARGET}/assets/icons/" +fi + # Extra icons bundle (e.g. OS folder icons). if [ -n "${ICONS_SOURCE}" ] && [ -d "${ICONS_SOURCE}" ]; then cp -r "${ICONS_SOURCE}/." "${INSTALL_TARGET}/assets/icons/" diff --git a/webpage/frontend/source/frontend/sections/platforms.cpp b/webpage/frontend/source/frontend/sections/platforms.cpp index 4ca18bad..500a6d3f 100644 --- a/webpage/frontend/source/frontend/sections/platforms.cpp +++ b/webpage/frontend/source/frontend/sections/platforms.cpp @@ -57,7 +57,9 @@ namespace NuiSftpPage::Sections // "Windows 10 · 11 · x86_64" — middle dot U+00B7 std::string const versionLine = "Windows 10 " + Utf8::cp(0x00B7) + " 11 " + Utf8::cp(0x00B7) + " x86_64"; - std::string const description = "Download and unpack in the location of your choice."; + std::string const description = + "Pick the installer for a Start Menu entry and clean in-place upgrades, " + "or grab the portable zip and unpack anywhere."; return div{class_ = "platform-card glass shine"}( div{ @@ -73,8 +75,8 @@ namespace NuiSftpPage::Sections }(versionLine) )), p{style = "margin: 0; color: var(--ink-dim); font-size: 14px"}(description), - pkgRow("nui-sftp-portable.zip", ".zip"), - pkgRow("nui-sftp-setup.exe", ".exe", true), + pkgRow("nui-sftp-setup.exe", "installer"), + pkgRow("nui-sftp-portable.zip", "portable"), a{ class_ = "btn primary shine", href = "https://github.com/5cript/nui-sftp/releases", From ef0e7c527f15957f5986794928878f4b9f2439d3 Mon Sep 17 00:00:00 2001 From: Tim Ebbeke Date: Mon, 25 May 2026 02:16:51 +0200 Subject: [PATCH 2/2] Added missing dependency. --- .github/workflows/windows.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 8d0ee567..d0f223fb 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -52,6 +52,7 @@ jobs: mingw-w64-clang-x86_64-zstd mingw-w64-clang-x86_64-xz mingw-w64-clang-x86_64-imagemagick + mingw-w64-clang-x86_64-librsvg - name: Workspace Path Fixup run: |