From 5906d1b78e7eabb8eb8778694b18d6cf3a307f20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Dzi=C4=99giel?= Date: Mon, 13 Jan 2025 21:17:19 +0100 Subject: [PATCH 1/5] clapper-app: Add Windows icon --- src/bin/clapper-app/meson.build | 1 + .../clapper-app/windows/clapper.exe.manifest | 30 ++++++++++ src/bin/clapper-app/windows/clapper.ico | Bin 0 -> 145849 bytes src/bin/clapper-app/windows/clapper.rc.in | 56 ++++++++++++++++++ src/bin/clapper-app/windows/meson.build | 20 +++++++ 5 files changed, 107 insertions(+) create mode 100644 src/bin/clapper-app/windows/clapper.exe.manifest create mode 100644 src/bin/clapper-app/windows/clapper.ico create mode 100644 src/bin/clapper-app/windows/clapper.rc.in create mode 100644 src/bin/clapper-app/windows/meson.build diff --git a/src/bin/clapper-app/meson.build b/src/bin/clapper-app/meson.build index c63b5bb2..83f3946c 100644 --- a/src/bin/clapper-app/meson.build +++ b/src/bin/clapper-app/meson.build @@ -94,6 +94,7 @@ if is_windows clapperapp_deps += winmm_dep clapperapp_c_args += ['-DHAVE_WIN_TIME_API'] endif + subdir('windows') endif executable( diff --git a/src/bin/clapper-app/windows/clapper.exe.manifest b/src/bin/clapper-app/windows/clapper.exe.manifest new file mode 100644 index 00000000..0f4c5895 --- /dev/null +++ b/src/bin/clapper-app/windows/clapper.exe.manifest @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + diff --git a/src/bin/clapper-app/windows/clapper.ico b/src/bin/clapper-app/windows/clapper.ico new file mode 100644 index 0000000000000000000000000000000000000000..6119915922be333c381172a907f0766a3927fd0b GIT binary patch literal 145849 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 s``rU6QJ3DyLUtsq#q@*dn$)p%>kR7r7Vq + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include + +#define VER_CLAPPERVERSION @VER_CLAPPERVERSION@ +#define VER_NONE 0x0L + +MAIN_ICON ICON "clapper.ico" + +VS_VERSION_INFO VERSIONINFO +FILEVERSION VER_CLAPPERVERSION +PRODUCTVERSION VER_CLAPPERVERSION +FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +FILEFLAGS VER_NONE +FILEOS VOS__WINDOWS32 +FILETYPE VFT_APP +FILESUBTYPE VER_NONE +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + BEGIN + VALUE "CompanyName", "Rafostar" + VALUE "FileDescription", @CLAPPER_APP_NAME@ + VALUE "FileVersion", @PACKAGE_VERSION@ + VALUE "InternalName", @PACKAGE@ + VALUE "LegalCopyright", "Copyright (C) Rafal Dziegiel" + VALUE "OriginalFilename", @CLAPPER_EXE@ + VALUE "ProductName", @CLAPPER_APP_NAME@ + VALUE "ProductVersion", @PACKAGE_VERSION@ + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#ifdef __MINGW32__ +CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "clapper.exe.manifest" +#endif diff --git a/src/bin/clapper-app/windows/meson.build b/src/bin/clapper-app/windows/meson.build new file mode 100644 index 00000000..14bccb92 --- /dev/null +++ b/src/bin/clapper-app/windows/meson.build @@ -0,0 +1,20 @@ +rc_conf = configuration_data() +rc_conf.set('VER_CLAPPERVERSION', clapper_version.replace('.', ',') + ',0') +rc_conf.set_quoted('PACKAGE', meson.project_name()) +rc_conf.set_quoted('PACKAGE_VERSION', meson.project_version()) +rc_conf.set_quoted('PACKAGE_ORIGIN', 'https://github.com/Rafostar/clapper') +rc_conf.set_quoted('CLAPPER_APP_NAME', 'Clapper') +rc_conf.set_quoted('CLAPPER_EXE', meson.project_name() + '.exe') + +clapperapp_rc = configure_file( + input: 'clapper.rc.in', + output: 'clapper.rc', + configuration: rc_conf, +) + +windres = find_program('windres', required: true) +clapperapp_sources += custom_target('clapper.o', + input: clapperapp_rc, + output: 'clapper.o', + command: [windres, '-I', '@CURRENT_SOURCE_DIR@', '-o', '@OUTPUT@', '@INPUT@'] +) From 21417a1ae7181ca39ffb6f564a20616e00081577 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Dzi=C4=99giel?= Date: Fri, 17 Jan 2025 13:54:52 +0100 Subject: [PATCH 2/5] pkgs: Generate Inno Setup based Windows installer --- meson.build | 1 + pkgs/meson.build | 5 +++ pkgs/windows-installer/clapper.iss.in | 31 +++++++++++++++++++ pkgs/windows-installer/meson.build | 44 +++++++++++++++++++++++++++ 4 files changed, 81 insertions(+) create mode 100644 pkgs/meson.build create mode 100644 pkgs/windows-installer/clapper.iss.in create mode 100644 pkgs/windows-installer/meson.build diff --git a/meson.build b/meson.build index 1d5298f3..c5e7a9dc 100644 --- a/meson.build +++ b/meson.build @@ -130,6 +130,7 @@ endif subdir('src') subdir('doc') +subdir('pkgs') meson.add_devenv(devenv) diff --git a/pkgs/meson.build b/pkgs/meson.build new file mode 100644 index 00000000..a44c9a8f --- /dev/null +++ b/pkgs/meson.build @@ -0,0 +1,5 @@ +is_windows = ['windows'].contains(host_machine.system()) + +if is_windows + subdir('windows-installer') +endif diff --git a/pkgs/windows-installer/clapper.iss.in b/pkgs/windows-installer/clapper.iss.in new file mode 100644 index 00000000..79e6d768 --- /dev/null +++ b/pkgs/windows-installer/clapper.iss.in @@ -0,0 +1,31 @@ +[Setup] +AppName=Clapper +AppVersion=@CLAPPER_APP_VERSION@ +AppVerName=Clapper @CLAPPER_APP_VERSION@ +VersionInfoVersion=@CLAPPER_APP_VERSION@.0 +ArchitecturesAllowed=x64compatible +ArchitecturesInstallIn64BitMode=x64compatible +WizardStyle=modern +DefaultDirName={autopf}\Clapper +DefaultGroupName=Clapper +DisableProgramGroupPage=yes +ChangesAssociations=yes +Compression=lzma2 +SolidCompression=yes +OutputDir=InstallerOutput +OutputBaseFilename=Clapper_@CLAPPER_APP_VERSION@ +SetupIconFile=@PROJECT_ROOT@\src\bin\clapper-app\windows\clapper.ico +LicenseFile=@PROJECT_ROOT@\COPYING-GPL + +[Tasks] +Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked + +[Files] +Source: "@CLAPPER_APP_DEST@\*"; DestDir: "{app}"; Flags: recursesubdirs replacesameversion + +[Icons] +Name: "{autoprograms}\Clapper"; Filename: "{app}\bin\clapper.exe" +Name: "{autodesktop}\Clapper"; Filename: "{app}\bin\clapper.exe"; Tasks: desktopicon + +[Registry] +@CLAPPER_APP_REG_ENTRIES@ diff --git a/pkgs/windows-installer/meson.build b/pkgs/windows-installer/meson.build new file mode 100644 index 00000000..cd2a59c8 --- /dev/null +++ b/pkgs/windows-installer/meson.build @@ -0,0 +1,44 @@ +# Same as "clapper-app-utils.c" +# FIXME: Have these in one place only +win_extensions = [ + 'avi', 'claps', 'm2ts', 'mkv', 'mov', + 'mp4', 'webm', 'wmv' +] +reg_entries = [] + +foreach ext : win_extensions + ext_id = 'Clapper.' + ext + exe_path = '{app}\\bin\\clapper.exe' + + subkey = 'Software\\Classes\\.' + ext + '\\OpenWithProgids' + reg_entries += 'Root: HKA; Subkey: "@0@"; ValueType: string; ValueName: "@1@"; ValueData: ""; Flags: uninsdeletevalue'.format(subkey, ext_id) + + subkey = 'Software\\Classes\\' + ext_id + reg_entries += 'Root: HKA; Subkey: "@0@"; ValueType: string; ValueName: ""; ValueData: "@1@"; Flags: uninsdeletekey'.format(subkey, ext) + + subkey = 'Software\\Classes\\' + ext_id + '\\DefaultIcon' + reg_entries += 'Root: HKA; Subkey: "@0@"; ValueType: string; ValueName: ""; ValueData: "@1@,0"'.format(subkey, exe_path) + + subkey = 'Software\\Classes\\' + ext_id + '\\shell\\open\\command' + reg_entries += 'Root: HKA; Subkey: "@0@"; ValueType: string; ValueName: ""; ValueData: """@1@"" ""%1"""'.format(subkey, exe_path) + + reg_entries += '' # Empty line for clarity +endforeach + +# NOTE: In meson replacing "@@" vars after "\" sign does not work. +# For this reason we do not pass app name here. +iss_conf = configuration_data() +iss_conf.set('CLAPPER_APP_VERSION', meson.project_version()) +iss_conf.set('CLAPPER_APP_REG_ENTRIES', '\n'.join(reg_entries)) +iss_conf.set('PROJECT_ROOT', meson.project_source_root()) + +# NOTE: We also need to package other dependencies, hence using whole prefix. +# Workaround to reduce package size is to set prefix to some custom dir, install, +# then determine the rest with "ldd" and copy remaining files manually there. +iss_conf.set('CLAPPER_APP_DEST', prefix.replace('/', '\\')) + +configure_file( + input: 'clapper.iss.in', + output: 'clapper.iss', + configuration: iss_conf, +) From 228ef3e556d686289fc9d868864c07730445c0f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Dzi=C4=99giel?= Date: Fri, 17 Jan 2025 13:56:45 +0100 Subject: [PATCH 3/5] workflows: windows: Create installer instead of portable It makes things much easier for the user, such as automatically associating video files with Clapper, makes menu entries, optional desktop icon and takes care of eventual uninstall and/or update later. --- .github/workflows/windows.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index b9a6aae7..16b3ee9d 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -82,9 +82,14 @@ jobs: find $BUILD_PREFIX/lib/clapper-0.0/ -name '*\.dll' -type f -exec ldd "{}" \; | grep '\/mingw.*\.dll' -o | xargs -I{} cp -n "{}" $BUILD_PREFIX/bin find $BUILD_PREFIX/lib/gstreamer-1.0/ -name '*\.dll' -type f -exec ldd "{}" \; | grep '\/mingw.*\.dll' -o | xargs -I{} cp -n "{}" $BUILD_PREFIX/bin find $BUILD_PREFIX/lib/gio/ -name '*\.dll' -type f -exec ldd "{}" \; | grep '\/mingw.*\.dll' -o | xargs -I{} cp -n "{}" $BUILD_PREFIX/bin + - name: Installer + uses: Minionguyjpro/Inno-Setup-Action@v1.2.5 + with: + path: builddir/pkgs/windows-installer/clapper.iss + options: /O+ - name: Upload uses: actions/upload-artifact@v4 with: name: clapper-win-${{ matrix.arch }} - path: clapper-win-${{ matrix.arch }} + path: builddir/pkgs/windows-installer/InstallerOutput/Clapper*.exe if-no-files-found: error From 2225cc68c482768333a8d186fdaa5d2397340bfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Dzi=C4=99giel?= Date: Fri, 17 Jan 2025 16:59:41 +0100 Subject: [PATCH 4/5] workflows: windows: Add cleanup step Removal of things that will not be used in an installed app --- .github/workflows/windows.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 16b3ee9d..4ce39e3d 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -82,6 +82,12 @@ jobs: find $BUILD_PREFIX/lib/clapper-0.0/ -name '*\.dll' -type f -exec ldd "{}" \; | grep '\/mingw.*\.dll' -o | xargs -I{} cp -n "{}" $BUILD_PREFIX/bin find $BUILD_PREFIX/lib/gstreamer-1.0/ -name '*\.dll' -type f -exec ldd "{}" \; | grep '\/mingw.*\.dll' -o | xargs -I{} cp -n "{}" $BUILD_PREFIX/bin find $BUILD_PREFIX/lib/gio/ -name '*\.dll' -type f -exec ldd "{}" \; | grep '\/mingw.*\.dll' -o | xargs -I{} cp -n "{}" $BUILD_PREFIX/bin + - name: Cleanup + run: | + BUILD_PREFIX="$GITHUB_WORKSPACE/clapper-win-${{ matrix.arch }}" + + rm -rf $BUILD_PREFIX/include + rm -rf $BUILD_PREFIX/lib/pkgconfig - name: Installer uses: Minionguyjpro/Inno-Setup-Action@v1.2.5 with: From 3513c37f978777fbc41a617c20c2fdbeefba0eda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Dzi=C4=99giel?= Date: Fri, 17 Jan 2025 17:05:57 +0100 Subject: [PATCH 5/5] clapper-app: Fix declaration-after-statement warning --- src/bin/clapper-app/clapper-app-utils.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/bin/clapper-app/clapper-app-utils.c b/src/bin/clapper-app/clapper-app-utils.c index 202e4255..74b1308e 100644 --- a/src/bin/clapper-app/clapper-app-utils.c +++ b/src/bin/clapper-app/clapper-app-utils.c @@ -61,9 +61,10 @@ clapper_app_utils_win_enforce_hi_res_clock (void) { #ifdef HAVE_WIN_PROCESS_THREADS_API PROCESS_POWER_THROTTLING_STATE PowerThrottling; - RtlZeroMemory (&PowerThrottling, sizeof (PowerThrottling)); gboolean success; + RtlZeroMemory (&PowerThrottling, sizeof (PowerThrottling)); + PowerThrottling.Version = PROCESS_POWER_THROTTLING_CURRENT_VERSION; PowerThrottling.ControlMask = PROCESS_POWER_THROTTLING_IGNORE_TIMER_RESOLUTION; PowerThrottling.StateMask = 0; // Always honor timer resolution requests