Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -144,13 +144,18 @@ jobs:
-DCMAKE_C_COMPILER=cl -DCMAKE_CXX_COMPILER=cl `
-DCMAKE_BUILD_TYPE=Release `
-DELEMENT_ENABLE_ASIO=ON `
-DELEMENT_ENABLE_UPDATER=ON `
-DELEMENT_BUILD_PLUGINS=ON
env:
BOOST_ROOT: ${{ steps.install-boost-windows.outputs.BOOST_ROOT }}

- name: Configure CMake (Unix)
if: runner.os != 'Windows'
run: cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DELEMENT_BUILD_PLUGINS=ON
run: |
cmake -B build -G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DELEMENT_ENABLE_UPDATER=${{ runner.os == 'macOS' && 'ON' || 'OFF' }} \
-DELEMENT_BUILD_PLUGINS=ON
env:
BOOST_ROOT: ${{ steps.install-boost-linux.outputs.BOOST_ROOT || steps.install-boost-macos.outputs.BOOST_ROOT }}

Expand Down
24 changes: 19 additions & 5 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,12 @@ set(PROJECT_VERSION_SUFFIX "b2")
set(PROJECT_VERSION_FULL "${PROJECT_VERSION}${PROJECT_VERSION_SUFFIX}")

include(cmake/Element.cmake)
if(APPLE AND ELEMENT_ENABLE_UPDATER)
include(cmake/FindSparkle.cmake)
if(ELEMENT_ENABLE_UPDATER)
if(APPLE)
include(cmake/FindSparkle.cmake)
elseif(WIN32)
include(cmake/FindWinSparkle.cmake)
endif()
endif()
include(cmake/FindJack.cmake)
include(cmake/FindSol2.cmake)
Expand Down Expand Up @@ -74,9 +78,7 @@ juce_add_gui_app(element_app
target_sources(element_app PRIVATE src/main.cc)
target_link_libraries(element_app PRIVATE kv::element)

if(NOT APPLE)
install(TARGETS element_app DESTINATION ${CMAKE_INSTALL_BINDIR})
else()
if(APPLE)
if(ELEMENT_ENABLE_UPDATER)
target_compile_options(element_app PRIVATE "-F${sparkle_SOURCE_DIR}")
target_link_options(element_app PRIVATE "-F${sparkle_SOURCE_DIR}" -framework Sparkle)
Expand All @@ -96,6 +98,18 @@ else()
install(TARGETS element_app
BUNDLE DESTINATION "Applications"
COMPONENT "Standalone")
elseif(WIN32)
if(ELEMENT_ENABLE_UPDATER)
target_link_libraries(element_app PRIVATE WinSparkle::WinSparkle)
target_sources(element_app PRIVATE src/winsparkle.cc)
add_custom_command(TARGET element_app POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${WIN_SPARKLE_DLL}" "$<TARGET_FILE_DIR:element_app>")
install(FILES "${WIN_SPARKLE_DLL}" DESTINATION ${CMAKE_INSTALL_BINDIR})
endif()
install(TARGETS element_app DESTINATION ${CMAKE_INSTALL_BINDIR})
else()
install(TARGETS element_app DESTINATION ${CMAKE_INSTALL_BINDIR})
endif()

if(ELEMENT_BUILD_PLUGINS)
Expand Down
31 changes: 31 additions & 0 deletions cmake/FindWinSparkle.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# SPDX-FileCopyrightText: 2026 Kushview, LLC
# SPDX-License-Identifier: GPL-3.0-or-later

set(WIN_SPARKLE_VERSION "0.9.2" CACHE STRING "WinSparkle version to download")

set(WIN_SPARKLE_FEED_URL "http://localhost:8000/appcast.xml"
CACHE STRING "The WinSparkle feed url to use")
set(WIN_SPARKLE_PUBLIC_KEY "+3pPKr274O3KL4lTWaEs/ukVk3Ayvnc7BkdS45zOnE4="
CACHE STRING "The WinSparkle eDSA public key to use")

FetchContent_Declare(
winsparkle
URL https://github.com/vslavik/winsparkle/releases/download/v${WIN_SPARKLE_VERSION}/WinSparkle-${WIN_SPARKLE_VERSION}.zip
DOWNLOAD_EXTRACT_TIMESTAMP TRUE
)

FetchContent_MakeAvailable(winsparkle)

message(STATUS "Searching for Sparkle in: ${winsparkle_SOURCE_DIR}")

set(WIN_SPARKLE_DLL "${winsparkle_SOURCE_DIR}/x64/Release/WinSparkle.dll")

add_library(WinSparkle::WinSparkle SHARED IMPORTED)
set_target_properties(WinSparkle::WinSparkle PROPERTIES
IMPORTED_LOCATION "${winsparkle_SOURCE_DIR}/x64/Release/WinSparkle.dll"
IMPORTED_IMPLIB "${winsparkle_SOURCE_DIR}/x64/Release/WinSparkle.lib"
INTERFACE_INCLUDE_DIRECTORIES "${winsparkle_SOURCE_DIR}/include"
)

message(STATUS "WinSparkle library: ${winsparkle_SOURCE_DIR}/x64/Release/WinSparkle.lib")
message(STATUS "WinSparkle include: ${winsparkle_SOURCE_DIR}/include")
48 changes: 48 additions & 0 deletions src/winsparkle.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
// SPDX-FileCopyrightText: 2026 Kushview, LLC
// SPDX-License-Identifier: ISC

#include <iostream>

#include <winsparkle.h>

#include <element/version.h>
#include <element/juce/core.hpp>
#include <element/ui/updater.hpp>

namespace element {

class WinSparkleUpdater : public Updater
{
public:
WinSparkleUpdater()
{
std::string ver = ELEMENT_VERSION_STRING;
std::wstring wver (ver.begin(), ver.end());
win_sparkle_set_app_details (L"Kushview", L"Element", wver.c_str());
win_sparkle_set_app_build_version (L"100");
win_sparkle_set_appcast_url ("http://localhost:8080/appcast.xml");
win_sparkle_set_automatic_check_for_updates (0);
win_sparkle_set_eddsa_public_key ("pubkey");
}

void check (bool async) override
{
juce::ignoreUnused (async);
if (! _initialized) {
win_sparkle_init();
_initialized = true;
}

// win_sparkle_check_update_without_ui();
win_sparkle_check_update_with_ui();
}
private:
bool _initialized { false };
};

std::unique_ptr<Updater> Updater::create()
{
return std::make_unique<WinSparkleUpdater>();
}

} // namespace element
Loading