summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaakko Keränen <jaakko.keranen@iki.fi>2021-11-07 16:51:41 +0200
committerJaakko Keränen <jaakko.keranen@iki.fi>2021-11-07 16:51:41 +0200
commit7364e3e52e7bed9781493aedfb7be2a338146598 (patch)
tree7574144f6be79d489533e4bd3b551c80634e278e
parent159639b9f1d351a883127ff55ac93d814e430067 (diff)
macOS: Use Sparkle for automatic updates
-rw-r--r--CMakeLists.txt18
-rw-r--r--Depends.cmake21
-rw-r--r--res/MacOSXBundleInfo.plist.in4
-rw-r--r--src/macos.m22
-rw-r--r--src/updater.c76
5 files changed, 93 insertions, 48 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index b0d8f70c..21cf1c7d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -52,9 +52,10 @@ option (ENABLE_MPG123 "Use mpg123 for decoding MPEG audio" ON)
52option (ENABLE_POPUP_MENUS "Use popup windows for context menus (if OFF, menus are confined inside main window)" ON) 52option (ENABLE_POPUP_MENUS "Use popup windows for context menus (if OFF, menus are confined inside main window)" ON)
53option (ENABLE_RELATIVE_EMBED "Resources should always be found via relative path" OFF) 53option (ENABLE_RELATIVE_EMBED "Resources should always be found via relative path" OFF)
54option (ENABLE_RESIZE_DRAW "Force window to redraw during resizing" ${DEFAULT_RESIZE_DRAW}) 54option (ENABLE_RESIZE_DRAW "Force window to redraw during resizing" ${DEFAULT_RESIZE_DRAW})
55option (ENABLE_SPARKLE "Use Sparkle for automatic updates (macOS)" OFF)
55option (ENABLE_WEBP "Use libwebp to decode .webp images (via pkg-config)" ON) 56option (ENABLE_WEBP "Use libwebp to decode .webp images (via pkg-config)" ON)
56option (ENABLE_WINDOWPOS_FIX "Set position after showing window (workaround for SDL bug)" OFF) 57option (ENABLE_WINDOWPOS_FIX "Set position after showing window (workaround for SDL bug)" OFF)
57option (ENABLE_WINSPARKLE "Use WinSparkle for automatic updates" OFF) 58option (ENABLE_WINSPARKLE "Use WinSparkle for automatic updates (Windows)" OFF)
58option (ENABLE_X11_SWRENDER "Use software rendering (X11)" OFF) 59option (ENABLE_X11_SWRENDER "Use software rendering (X11)" OFF)
59 60
60include (BuildType.cmake) 61include (BuildType.cmake)
@@ -98,9 +99,8 @@ list (APPEND RESOURCES ${FONTS})
98if ((UNIX AND NOT APPLE) OR MSYS) 99if ((UNIX AND NOT APPLE) OR MSYS)
99 list (APPEND RESOURCES res/lagrange-64.png) 100 list (APPEND RESOURCES res/lagrange-64.png)
100endif () 101endif ()
101make_resources (${CMAKE_CURRENT_BINARY_DIR}/resources.lgr ${RESOURCES})
102
103set (EMB_BIN ${CMAKE_CURRENT_BINARY_DIR}/resources.lgr) 102set (EMB_BIN ${CMAKE_CURRENT_BINARY_DIR}/resources.lgr)
103make_resources (${EMB_BIN} ${RESOURCES})
104set_source_files_properties (${EMB_BIN} PROPERTIES MACOSX_PACKAGE_LOCATION Resources) 104set_source_files_properties (${EMB_BIN} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
105 105
106# Source files. 106# Source files.
@@ -150,7 +150,6 @@ set (SOURCES
150 src/stb_image.h 150 src/stb_image.h
151 src/stb_image_resize.h 151 src/stb_image_resize.h
152 src/stb_truetype.h 152 src/stb_truetype.h
153 src/updater.c
154 src/updater.h 153 src/updater.h
155 src/visited.c 154 src/visited.c
156 src/visited.h 155 src/visited.h
@@ -222,8 +221,11 @@ set (SOURCES
222 res/about/lagrange.gmi 221 res/about/lagrange.gmi
223 res/about/license.gmi 222 res/about/license.gmi
224 res/about/version.gmi 223 res/about/version.gmi
225 ${CMAKE_CURRENT_BINARY_DIR}/resources.lgr 224 ${EMB_BIN}
226) 225)
226if (NOT APPLE) # macos.m has Sparkle updater
227 list (APPEND SOURCES src/updater.c)
228endif ()
227if (ENABLE_IPC) 229if (ENABLE_IPC)
228 list (APPEND SOURCES 230 list (APPEND SOURCES
229 src/ipc.c 231 src/ipc.c
@@ -363,6 +365,9 @@ if (APPLE)
363 else () 365 else ()
364 target_link_libraries (app PUBLIC "-framework AppKit") 366 target_link_libraries (app PUBLIC "-framework AppKit")
365 endif () 367 endif ()
368 if (ENABLE_SPARKLE)
369 target_link_libraries (app PUBLIC sparkle)
370 endif ()
366 if (CMAKE_OSX_DEPLOYMENT_TARGET AND NOT IOS) 371 if (CMAKE_OSX_DEPLOYMENT_TARGET AND NOT IOS)
367 target_compile_options (app PUBLIC -mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}) 372 target_compile_options (app PUBLIC -mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET})
368 target_link_options (app PUBLIC -mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}) 373 target_link_options (app PUBLIC -mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET})
@@ -407,8 +412,7 @@ endif ()
407if (MSYS) 412if (MSYS)
408 target_link_libraries (app PUBLIC d2d1 uuid dwmapi) # querying DPI 413 target_link_libraries (app PUBLIC d2d1 uuid dwmapi) # querying DPI
409 if (ENABLE_WINSPARKLE) 414 if (ENABLE_WINSPARKLE)
410 target_link_libraries (app PUBLIC winsparkle) 415 target_link_libraries (app PUBLIC winsparkle)
411 target_compile_definitions (app PUBLIC LAGRANGE_ENABLE_WINSPARKLE=1)
412 endif () 416 endif ()
413endif () 417endif ()
414if (UNIX) 418if (UNIX)
diff --git a/Depends.cmake b/Depends.cmake
index 3faeca75..c6e4495f 100644
--- a/Depends.cmake
+++ b/Depends.cmake
@@ -146,15 +146,30 @@ else ()
146 endif () 146 endif ()
147endif () 147endif ()
148 148
149if (ENABLE_SPARKLE)
150 # macOS only.
151 add_library (sparkle INTERFACE)
152 set (SPARKLE_FRAMEWORK ${SPARKLE_DIR}/Sparkle.framework)
153 target_link_libraries (sparkle INTERFACE ${SPARKLE_FRAMEWORK})
154 target_compile_definitions (sparkle INTERFACE LAGRANGE_ENABLE_SPARKLE=1)
155 message (STATUS "Using Sparkle: ${SPARKLE_FRAMEWORK}")
156 if (NOT SPARKLE_ARCH)
157 message (FATAL_ERROR "Set SPARKLE_ARCH to a CPU architecture ID (e.g., arm64)")
158 endif ()
159endif ()
160
149if (ENABLE_WINSPARKLE) 161if (ENABLE_WINSPARKLE)
150 # We're assuming this is Windows. 162 # Windows only.
151 add_library (winsparkle INTERFACE) 163 add_library (winsparkle INTERFACE)
152 target_include_directories (winsparkle INTERFACE ${WINSPARKLE_DIR}/include) 164 target_include_directories (winsparkle INTERFACE ${WINSPARKLE_DIR}/include)
153 target_link_libraries (winsparkle INTERFACE ${WINSPARKLE_DIR}/x64/Release/WinSparkle.dll) 165 set (WINSPARKLE_DLL ${WINSPARKLE_DIR}/x64/Release/WinSparkle.dll)
166 target_link_libraries (winsparkle INTERFACE ${WINSPARKLE_DLL})
167 target_compile_definitions (winsparkle INTERFACE LAGRANGE_ENABLE_WINSPARKLE=1)
154 install ( 168 install (
155 PROGRAMS ${WINSPARKLE_DIR}/x64/Release/WinSparkle.dll 169 PROGRAMS ${WINSPARKLE_DLL}
156 DESTINATION . 170 DESTINATION .
157 ) 171 )
172 message (STATUS "Using WinSparkle: ${WINSPARKLE_DLL}")
158endif () 173endif ()
159 174
160find_package (PkgConfig REQUIRED) 175find_package (PkgConfig REQUIRED)
diff --git a/res/MacOSXBundleInfo.plist.in b/res/MacOSXBundleInfo.plist.in
index a17831ad..08907283 100644
--- a/res/MacOSXBundleInfo.plist.in
+++ b/res/MacOSXBundleInfo.plist.in
@@ -104,5 +104,9 @@
104 </array> 104 </array>
105 </dict> 105 </dict>
106 </array> 106 </array>
107 <key>SUFeedURL</key>
108 <string>https://etc.skyjake.fi/lagrange/appcast-${SPARKLE_ARCH}.xml</string>
109 <key>SUPublicEDKey</key>
110 <string>NK3VR3l8lypjm05VS4+Ry8A95rhmRzX+ftgQpzqYAy4=</string>
107</dict> 111</dict>
108</plist> 112</plist>
diff --git a/src/macos.m b/src/macos.m
index 35594b7b..cfbca488 100644
--- a/src/macos.m
+++ b/src/macos.m
@@ -709,3 +709,25 @@ iColor systemAccent_Color(void) {
709#endif 709#endif
710 return (iColor){ 255, 255, 255, 255 }; 710 return (iColor){ 255, 255, 255, 255 };
711} 711}
712
713#if defined (LAGRANGE_ENABLE_SPARKLE)
714#import <Sparkle/Sparkle.h>
715
716void init_Updater(void) {
717 SUUpdater *updater = [SUUpdater sharedUpdater];
718 /* Add it to the menu. */
719 NSMenu *appMenu = [[[NSApp mainMenu] itemAtIndex:0] submenu];
720 NSMenuItem *item = [appMenu insertItemWithTitle:@"Check for Updates…"
721 action:@selector(checkForUpdates:)
722 keyEquivalent:@""
723 atIndex:3];
724 item.target = updater;
725}
726
727#else
728/* dummy as a fallback */
729void init_Updater(void) {}
730#endif
731
732void deinit_Updater(void) {}
733void checkNow_Updater(void) {}
diff --git a/src/updater.c b/src/updater.c
index 6c5d6eae..706de31d 100644
--- a/src/updater.c
+++ b/src/updater.c
@@ -22,48 +22,48 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
22 22
23#include "updater.h" 23#include "updater.h"
24 24
25static const char *signaturePublicKeyPem_ =
26"-----BEGIN PUBLIC KEY-----\n"
27"MIIGRjCCBDkGByqGSM44BAEwggQsAoICAQC0jSisyaT6q6qqjmlWFfFDOs66EfC7\n"
28"78ATFlhl63otIed7oeyg2Q0BFB2bdGMpJbivu/jFjaZglz7YpKLhLHiUb3Fn10lz\n"
29"V3WwaXXmbdwSuYH1zceIptho6crWgkZcSwGer+/I3twDxIe0XhGEG7quh7ukJsh/\n"
30"hh9LgeIgNsVDdKRyJEs24ZQD44rQwb3hY19JCEzdd/S4FZwLbNeXwrPBPdzUO7JT\n"
31"KmhMJJbQbhb1iNyqClCl5VQM0w5cI3L+k3fcBcUgsEh2kJHsH8ezATDH8Ltmvkmz\n"
32"L8bhVLLHlGl0jvHfKHjINz9p/Ur+ifcFmwCWTmd61ZhEKcBpK0jEkE5ZwXzIZ3pJ\n"
33"AAen0Nr0Y6x7rK5AU630wkQbD7M6W5QOys+9FPuIGW/q0nk80TKFR4ElVc0CVF0t\n"
34"nOGa6lu6uaIkgKN+ePXUwSUFvYNOC/3ILURq9JnAPPGXwgIsOUTPtzPcBOfH24sy\n"
35"HhImEaAZPdsx2eTiJv2zFwF0k5H/kPHQgyr+5dPaYSt+9yeObF4zQ7S/raqCRE/d\n"
36"eT29MkwkGugXnljbSi0cjn1MCw9wQqLLwcea6KRWASzPmMMT8Ratrm1QWNvmPOaK\n"
37"nijP+EVMPztnU4G3BAei7lnw8G3us+z0GzZ6RBR7siR4RIi4C7bngXygOYI7ekPT\n"
38"WZui90VHORz3mQIhAJ7rakeaAPmDryZAHO9Ff2OmRibCO6WRrk16Z1m5lYU7AoIC\n"
39"AEh0FdkF6OWNK1F44o9CKvE+vOr9SXu/gJ9JLm30Cfq/LPQ3lgOl13hYzAje/F8p\n"
40"OATT0N0zkm3FmI7Kbw3ovUQ/Lot+UCvuv9ViIG98GZUldTyytKx3tRyuuRmXK3lS\n"
41"7ugvt+XXo5sA9a3t6TJWMFJJCBRO+uizUs0m4uxb+rWnWv+AAUKDL/etbHxxKzo+\n"
42"dIYRLgIaJtValVSkkik27Tw20+KEWKyy0H7EinIxn2iFVQ41j2jDwji931HJR5zI\n"
43"fX0JG5nqcyfNj4m6o36n0yshAs13dJqyZiB4Y6pWb8TJf9GgnceBTWCIXH2nlL/C\n"
44"UloCoVLfOTZ1hT4p1Wbou+5zlxwBS8/nZaiXecWm9srKDIwSB6zYLK9b2Eord197\n"
45"34R0LKW9PsyHxnJvkip0oN4Fp9CltuN9VFbkc1k1nEiZh+etnh+m4eWnC5tzBGRx\n"
46"Hh4GvKkVV43cIdIle4ht0Gt/6ex3bFAVmMmV4Z8767CnXJ9HPlksqQYRyLoolrJ0\n"
47"X6GQ+8jZFaY36f+ViejbS7pHUl8s3OESfCAYwbipjSQZyPz+kfLjueEp0Klh7BHa\n"
48"uRHHfM2FsxSkk+DO9fMUGNluC+5qvneccd7NvFfuPPgcD3OU9WBqKUfuKyXpkSMx\n"
49"W1Oo5SqXi1sHirs3r6GFXqtW2LR+PD9Ve78L3Yd5rv9mA4ICBQACggIAPsdNd6rA\n"
50"IlX1YI3OXyY+CVPJYBoAySWNa5H8JHEYC8ui4OB8gyge3S6utoF6m9lgU3evjqXy\n"
51"dRYI/st6Eb5NESFrKPn1eH4r+2kU/34hshEA0yGjNGWzoXnhDCusGWGiZwq+Rr3v\n"
52"Q5vI8T8lsnYuplCPGnoWJzq1niCPobVydog1lmZ396ARErGrPZxzM7ab8EY2BNSj\n"
53"pcA1wYwuGGJIvCRLDxqaUlTbIdTP/QzIKQAHoFCtJetOmS5ovCyz9Zr+4fC/SFtq\n"
54"G1BjTodIhQFrreGMwl3VtIOnrCUI430BxEPMsDWgZzgx5JgMwmgIVFul47MoulVE\n"
55"gcz6sNKVuRXYhRTq8V6hZOamOT1VqZQb+dqQqDZ5p265VOgz71z1CgTF9FnRV04z\n"
56"qhlWHHnxMEaQYZWlvw8zlXRNBqjHQyOHhOE9nsrNpTsFqnImBpO0s9UJxTRWNnf/\n"
57"hLrzuOBQoDlOcE4yBR1mRymJQ9xHFzEI4yxP9Vg7RTEkMhhk1vlqPWvuIyv4gCCm\n"
58"7btKMnYNL99cMAjhgyDyh7mAOfOWv5rAgzDIMViRO+U7EZ+ZRR+ovnuWMMn1OZAA\n"
59"aXDKDVffI0NSO+Aw3EDAL4LfZsOBkDS2N/2ESR+EoBtYqoI7YJ3iu1iEHp8WxCyA\n"
60"4YdR7KTyioKNHjvC5EG2bvHtYfw6ng6zSOY=\n"
61"-----END PUBLIC KEY-----";
62
63#if defined (LAGRANGE_ENABLE_WINSPARKLE) 25#if defined (LAGRANGE_ENABLE_WINSPARKLE)
64#include <time.h> 26#include <time.h>
65#include <winsparkle.h> 27#include <winsparkle.h>
66 28
29static const char *signaturePublicKeyPem_ =
30 "-----BEGIN PUBLIC KEY-----\n"
31 "MIIGRjCCBDkGByqGSM44BAEwggQsAoICAQC0jSisyaT6q6qqjmlWFfFDOs66EfC7\n"
32 "78ATFlhl63otIed7oeyg2Q0BFB2bdGMpJbivu/jFjaZglz7YpKLhLHiUb3Fn10lz\n"
33 "V3WwaXXmbdwSuYH1zceIptho6crWgkZcSwGer+/I3twDxIe0XhGEG7quh7ukJsh/\n"
34 "hh9LgeIgNsVDdKRyJEs24ZQD44rQwb3hY19JCEzdd/S4FZwLbNeXwrPBPdzUO7JT\n"
35 "KmhMJJbQbhb1iNyqClCl5VQM0w5cI3L+k3fcBcUgsEh2kJHsH8ezATDH8Ltmvkmz\n"
36 "L8bhVLLHlGl0jvHfKHjINz9p/Ur+ifcFmwCWTmd61ZhEKcBpK0jEkE5ZwXzIZ3pJ\n"
37 "AAen0Nr0Y6x7rK5AU630wkQbD7M6W5QOys+9FPuIGW/q0nk80TKFR4ElVc0CVF0t\n"
38 "nOGa6lu6uaIkgKN+ePXUwSUFvYNOC/3ILURq9JnAPPGXwgIsOUTPtzPcBOfH24sy\n"
39 "HhImEaAZPdsx2eTiJv2zFwF0k5H/kPHQgyr+5dPaYSt+9yeObF4zQ7S/raqCRE/d\n"
40 "eT29MkwkGugXnljbSi0cjn1MCw9wQqLLwcea6KRWASzPmMMT8Ratrm1QWNvmPOaK\n"
41 "nijP+EVMPztnU4G3BAei7lnw8G3us+z0GzZ6RBR7siR4RIi4C7bngXygOYI7ekPT\n"
42 "WZui90VHORz3mQIhAJ7rakeaAPmDryZAHO9Ff2OmRibCO6WRrk16Z1m5lYU7AoIC\n"
43 "AEh0FdkF6OWNK1F44o9CKvE+vOr9SXu/gJ9JLm30Cfq/LPQ3lgOl13hYzAje/F8p\n"
44 "OATT0N0zkm3FmI7Kbw3ovUQ/Lot+UCvuv9ViIG98GZUldTyytKx3tRyuuRmXK3lS\n"
45 "7ugvt+XXo5sA9a3t6TJWMFJJCBRO+uizUs0m4uxb+rWnWv+AAUKDL/etbHxxKzo+\n"
46 "dIYRLgIaJtValVSkkik27Tw20+KEWKyy0H7EinIxn2iFVQ41j2jDwji931HJR5zI\n"
47 "fX0JG5nqcyfNj4m6o36n0yshAs13dJqyZiB4Y6pWb8TJf9GgnceBTWCIXH2nlL/C\n"
48 "UloCoVLfOTZ1hT4p1Wbou+5zlxwBS8/nZaiXecWm9srKDIwSB6zYLK9b2Eord197\n"
49 "34R0LKW9PsyHxnJvkip0oN4Fp9CltuN9VFbkc1k1nEiZh+etnh+m4eWnC5tzBGRx\n"
50 "Hh4GvKkVV43cIdIle4ht0Gt/6ex3bFAVmMmV4Z8767CnXJ9HPlksqQYRyLoolrJ0\n"
51 "X6GQ+8jZFaY36f+ViejbS7pHUl8s3OESfCAYwbipjSQZyPz+kfLjueEp0Klh7BHa\n"
52 "uRHHfM2FsxSkk+DO9fMUGNluC+5qvneccd7NvFfuPPgcD3OU9WBqKUfuKyXpkSMx\n"
53 "W1Oo5SqXi1sHirs3r6GFXqtW2LR+PD9Ve78L3Yd5rv9mA4ICBQACggIAPsdNd6rA\n"
54 "IlX1YI3OXyY+CVPJYBoAySWNa5H8JHEYC8ui4OB8gyge3S6utoF6m9lgU3evjqXy\n"
55 "dRYI/st6Eb5NESFrKPn1eH4r+2kU/34hshEA0yGjNGWzoXnhDCusGWGiZwq+Rr3v\n"
56 "Q5vI8T8lsnYuplCPGnoWJzq1niCPobVydog1lmZ396ARErGrPZxzM7ab8EY2BNSj\n"
57 "pcA1wYwuGGJIvCRLDxqaUlTbIdTP/QzIKQAHoFCtJetOmS5ovCyz9Zr+4fC/SFtq\n"
58 "G1BjTodIhQFrreGMwl3VtIOnrCUI430BxEPMsDWgZzgx5JgMwmgIVFul47MoulVE\n"
59 "gcz6sNKVuRXYhRTq8V6hZOamOT1VqZQb+dqQqDZ5p265VOgz71z1CgTF9FnRV04z\n"
60 "qhlWHHnxMEaQYZWlvw8zlXRNBqjHQyOHhOE9nsrNpTsFqnImBpO0s9UJxTRWNnf/\n"
61 "hLrzuOBQoDlOcE4yBR1mRymJQ9xHFzEI4yxP9Vg7RTEkMhhk1vlqPWvuIyv4gCCm\n"
62 "7btKMnYNL99cMAjhgyDyh7mAOfOWv5rAgzDIMViRO+U7EZ+ZRR+ovnuWMMn1OZAA\n"
63 "aXDKDVffI0NSO+Aw3EDAL4LfZsOBkDS2N/2ESR+EoBtYqoI7YJ3iu1iEHp8WxCyA\n"
64 "4YdR7KTyioKNHjvC5EG2bvHtYfw6ng6zSOY=\n"
65 "-----END PUBLIC KEY-----";
66
67void init_Updater(void) { 67void init_Updater(void) {
68 win_sparkle_set_appcast_url("https://etc.skyjake.fi/lagrange/appcast-windows.xml"); 68 win_sparkle_set_appcast_url("https://etc.skyjake.fi/lagrange/appcast-windows.xml");
69 win_sparkle_set_dsa_pub_pem(signaturePublicKeyPem_); 69 win_sparkle_set_dsa_pub_pem(signaturePublicKeyPem_);