Add sqgipkg release packaging#141
Conversation
Add adwaita-icon-theme-legacy and elementary-icon-theme packages and stage the app hicolor icon set (incl. @2 HiDPI and scalable.svg) for the Windows build, matching the Linux file mappings.
The Windows block pins gtk_icon_theme so the staging writes a settings.ini that lets GTK resolve bundled symbolic icons. The AppImage path reads the top-level gtk_icon_theme via write_linux_gtk_settings, but it was only set inside the windows block, so the AppImage pinned no icon theme and UI icons went missing. Set a top-level gtk_icon_theme=Adwaita to mirror the Windows behaviour.
The app forces gtk_icon_theme_name = "elementary" at runtime (Application.vala). Toolbar icons (list-add, open-menu, etc.) are compiled into GTK4 so they always render, but the emoji button uses random face-*-symbolic emotes which are not built in and only exist in the elementary icon theme. The Linux AppImage only bundled adwaita/hicolor, so those emotes could not be resolved and the button appeared blank. Add elementary-icon-theme to both Linux deb package lists and pin the top-level gtk_icon_theme to elementary to match what the app actually uses (mirrors the Windows build, which already bundles mingw-w64-x86_64-elementary-icon-theme).
The 'new emoji' button cycles through face-*-symbolic icons that only exist in the elementary icon theme. In distributed builds (AppImage, Windows) where that theme may be absent or not resolved, the button rendered blank. Vendor the 21 emote symbolics into the app's own GResource under icons/scalable/emotes/. GtkApplication automatically registers <resource_base_path>/icons as a resource icon path, so GTK resolves these icons by name regardless of the active icon theme. Verified the icons resolve to resource:///... even with no icon theme present. Icons sourced from elementary-icon-theme (GPL-3.0-or-later), compatible with Jorts' license.
There was a problem hiding this comment.
I have some questions about this
Jorts forces the elementary icons and theme, because everytime it did not i would end up with a savage mess that doesnt really look good
icons missing is fine-ish, that kind of workaround works peachy, but i now worry about the app not being consistent by platform, and if icons are missing then the theme is, too?...
There was a problem hiding this comment.
I have realised some icons were missing and I have resolved that in the latest commit.
I will look into the theme. I don't see any reason why theme could not be staged and packaged for both AppImage and Windows NSIS builds.
There was a problem hiding this comment.
elementary OS theme is packaged, normally, for msys2
| on: | ||
| push: | ||
| tags: | ||
| - 'v*' |
There was a problem hiding this comment.
versioning doesnt use a 'v' prefix. It is always x.y.z
| 'gresource', | ||
| gresource_file, | ||
| source_dir: '.' | ||
| glib_compile_resources = find_program('glib-compile-resources', native: true) |
There was a problem hiding this comment.
this block confuses me. Is it to avoid using gnome.compile_resources? Why?
There was a problem hiding this comment.
yeah, this one is to avoid gnome.compile_resources. it breaks in the sqgipkg mingw cross-build.
what happens is meson’s gnome module tries to find glib-compile-resources via gio-2.0.pc. in the windows cross environment, that resolves through the msys2 gio-2.0.pc, which points at glib-compile-resources without .exe. msys2 actually ships glib-compile-resources.exe, so meson falls over during setup.
for gresources we only need the build-machine tool anyway. it generates gresource.c, then that c file is compiled for the windows target.
so this uses:
find_program('glib-compile-resources', native: true)to explicitly use the host tool and avoid the broken mingw pkg-config tool path.
|
This is a really big PR at once, and i did not know you had your eyes on this repo??? there were windows installers a few versions back, but i broke it to overhaul how these are done (and because of not wanting to spin up a VM) |
It is a big PR. I was hoping to make this as non-invasive as possible and to just add an optional release path, however during the course of troubleshooting I've touched more than necessary. I'm going to revert all the unnecessary changes and clean up the history. |
|
The stuff to make it compatible with Ubuntu 24.04 like Jorts.Bin, the meson plumbing changes, maybe the icons failsafe, if all these do not break anything i would really appreciate if you can submit them in a separate PR? The Bin wrapper and granite versioning id like to add some stuff to the branch |
I’ve reworked this since the earlier version. I no longer need the Jorts.Bin compatibility changes, because I’ve added the required GTK/Granite versions as native projects in the packaging manifest and build them from source for the release build. That keeps the app-side changes much smaller. The remaining Meson changes are only there to support the Windows cross-compilation path. Would you still like those Meson/build changes split into a separate PR, or is it okay to keep them together with the optional sqgipkg packaging work? |
|
I have come across one issue that required code to touched. The elementary theme icons are broken on Windows. The SVG images are not properly rendered and I'm not sure why. The Adwaita icons work properly, and so forcing that theme on Windows builds seem like a fair work around. I have verified all builds, and all icons and themes work correctly. |
Nah should be fine you can leave it in
Ive banged my head so hard on those damn icons believe me. Had to do some crazy shenanigans by hand just to get 90% of it working. Lets just use the adwaita for now ugh note that in 4.22 currently even on linux the elementary icons are broken, because some symbolics use functions that the gtk 4.22 svg renderer dont support yet. It'll be fixed but not yet (i suspect, same thing for the gnome meson module, when i built installers for windows, the gschema had to be built by hand in the deploy...) |
|
Tried the Appimage. Works great! |
|
Tried the nsis installer Of note: the new installer is much faster in theres just one page. I like that. It is very ugly though |
| ], | ||
| "files": [ | ||
| "build-windows-x86_64/data/io.github.elly_code.jorts.gschema.xml=share/glib-2.0/schemas/io.github.elly_code.jorts.gschema.xml", | ||
| "windows/loaders.cache=lib/gdk-pixbuf-2.0/2.10.0/loaders.cache", |
There was a problem hiding this comment.
| "windows/loaders.cache=lib/gdk-pixbuf-2.0/2.10.0/loaders.cache", |
this was when i was doing some epic manual tattling to get icons to render, we can drop it
| "files": [ | ||
| "build-windows-x86_64/data/io.github.elly_code.jorts.gschema.xml=share/glib-2.0/schemas/io.github.elly_code.jorts.gschema.xml", | ||
| "windows/loaders.cache=lib/gdk-pixbuf-2.0/2.10.0/loaders.cache", | ||
| "data/fonts/RedactedScript-Regular.ttf=share/fonts/RedactedScript-Regular.ttf", |
There was a problem hiding this comment.
since we are not working on an nsis script, how could we handle the installation for windows?
I dont think Meson can do this, since it is then all bungled into an exe?
| "installer_name": "Jorts-Setup.exe", | ||
| "install_dir": "$LOCALAPPDATA\\Programs\\io.github.elly_code.jorts", | ||
| "request_execution_level": "user", | ||
| "icon": "windows/icons/icon.ico", |
There was a problem hiding this comment.
| "icon": "windows/icons/icon.ico", | |
| "icon": "windows/icons/install.ico", |
Summary
This PR adds optional sqgipkg packaging for Jorts.
The goal is to provide a repeatable release path for Linux AppImages and Windows installers while leaving the existing Meson/Flatpak/AppCenter workflow intact.
With the added sqgipkg.json manifest and GitHub Actions workflow, release tags can build:
The workflow only runs on version tag pushes or manual dispatch, so normal development pushes are not affected.
Why
I noticed the README mentions that Windows bundling/testing is a hassle. This is an attempt to make that path more repeatable by moving the packaging into a documented manifest and CI workflow.
sqgipkg handles the packaging setup, dependency staging, AppImage generation, Windows runtime bundling, and NSIS installer generation from the same release workflow.
Release flow
If you choose to use this workflow for releases, it can be triggered with a normal version tag, for example:
The workflow will then build the AppImages and Windows installer and attach them to the GitHub release.
Notes
This PR is intended as an optional packaging path. It does not replace the existing build system or distribution flow.
The Windows target uses the MinGW/MSYS2 environment and bundles the required GTK/Granite/runtime dependencies into the installer.
This PR also adds a small Jorts.Bin wrapper for Granite 7.4 compatibility.
The current code appears to rely on API available in newer Granite versions, but the Ubuntu 24.04/Noble CI environment provides Granite 7.4. The wrapper is intended as a minimal compatibility shim so the packaging workflow can build cleanly against the reference CI stack.
Testing
I ran sqgipkg --target all locally and verified that the expected artifacts were generated:
dist-linux-x86_64/Jorts.AppImage
dist-linux-aarch64/Jorts.AppImage
dist-windows-x86_64/Jorts-Setup.exe
I have tested the Windows installer and the application ran from the start menu as expected, but I am not completely certain that all resources are properly included.
I also ran the GitHub Actions workflow on my fork and verified the generated artifacts where possible.
Happy to adjust the packaging setup if you’d prefer it handled differently.