10 Commits

Author SHA1 Message Date
Uyanide cf73b12996 feat: quitOnSelected default to true
Release / Build ArchLinux Package (push) Successful in 1m0s
Release / Publish to Gitea Release (push) Successful in 3s
Release / Publish to AUR (push) Successful in 9s
2026-04-03 09:09:40 +02:00
Uyanide 9a6fa483a5 ⬆️ bump to v2.1.0
Release / Build ArchLinux Package (push) Successful in 1m3s
Release / Publish to Gitea Release (push) Successful in 3s
Release / Publish to AUR (push) Successful in 8s
2026-04-03 08:54:39 +02:00
Uyanide 5db3650184 🐛 fix: remove unused config 'printPreview' 2026-04-03 08:52:56 +02:00
Uyanide 0524f26f97 🐛 fix: forgot to implement 'printSelected' 😒 2026-04-03 08:48:49 +02:00
Uyanide 740411f194 🐛 fix: correct behaviour of --disable-actions
Release / Build ArchLinux Package (push) Successful in 1m0s
Release / Publish to Gitea Release (push) Successful in 3s
Release / Publish to AUR (push) Successful in 9s
2026-03-24 12:48:01 +01:00
Uyanide 1a2daec165 🚀 CD: refactor release workflow 2026-03-24 11:42:41 +01:00
Uyanide 524b53b7b2 CD: rename workflow to Release 2026-03-24 11:23:10 +01:00
Uyanide b5ea96bb8b 🚀 CD: add MAKEFLAGS to optimize local build process 2026-03-24 11:14:08 +01:00
Uyanide 470bb1620a 🚀 CD: 😡
CI/CD / Package (push) Successful in 2m26s
CI/CD / Publish (push) Successful in 10s
2026-03-24 11:10:24 +01:00
Uyanide b1372cacd7 🚀 CD: change license to 0BSD
CI/CD / Package (push) Successful in 59s
CI/CD / Publish (push) Successful in 10s
2026-03-24 10:40:22 +01:00
14 changed files with 163 additions and 119 deletions
+41 -17
View File
@@ -1,4 +1,4 @@
name: CI/CD
name: Release
on:
push:
@@ -6,8 +6,8 @@ on:
- 'v*'
jobs:
build:
name: Package
build-arch:
name: Build ArchLinux Package
runs-on: ubuntu-latest
steps:
- name: Checkout Code
@@ -33,13 +33,14 @@ jobs:
url="https://git.uyani.de/Uyanide/WallReel"
license=('MIT')
depends=('qt6-base' 'qt6-declarative' 'gcc-libs' 'glibc')
makedepends=('cmake' 'ninja')
makedepends=('cmake')
options=('!debug')
source=("${pkgname}-${pkgver}.tar.gz::https://git.uyani.de/Uyanide/WallReel/archive/v${pkgver}.tar.gz")
sha256sums=('INSERT_SHA256_HERE')
build() {
cd "wallreel"
cmake -B build -S . -G Ninja \
cmake -B build -S . \
-DCMAKE_BUILD_TYPE='Release' \
-DCMAKE_INSTALL_PREFIX='/usr' \
-Wno-dev
@@ -64,7 +65,9 @@ jobs:
pacman-key --init && pacman-key --populate
pacman -Sy --noconfirm archlinux-keyring
pacman -Su --noconfirm base-devel cmake ninja qt6-base qt6-declarative sudo
pacman -Su --noconfirm base-devel cmake qt6-base qt6-declarative sudo
echo 'MAKEFLAGS="-j$(nproc)"' >> /etc/makepkg.conf
useradd -m builduser
chown -R builduser:builduser /workspace
@@ -72,32 +75,31 @@ jobs:
su - builduser -c 'cd /workspace && makepkg -sf --noconfirm'
su - builduser -c 'cd /workspace && makepkg --printsrcinfo' > SRCINFO.txt
tar -cf - *.pkg.tar.zst PKGBUILD LICENSE SRCINFO.txt >&3
tar -cf - *.pkg.tar.zst PKGBUILD SRCINFO.txt >&3
" | tar -xf -
- name: Upload Artifacts
- name: Upload Arch Artifacts
uses: actions/upload-artifact@v3
with:
name: release-artifacts
name: arch-artifacts
path: |
*.pkg.tar.zst
PKGBUILD
LICENSE
SRCINFO.txt
release:
name: Publish
needs: build
publish-gitea:
name: Publish to Gitea Release
needs: [build-arch]
runs-on: ubuntu-latest
steps:
- name: Extract Version
run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV
- name: Download Artifacts
- name: Download Arch Artifacts
uses: actions/download-artifact@v3
with:
name: release-artifacts
name: arch-artifacts
path: .
- name: Publish to Gitea Release
@@ -110,6 +112,20 @@ jobs:
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
publish-aur:
name: Publish to AUR
needs: [build-arch]
runs-on: ubuntu-latest
steps:
- name: Extract Version
run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV
- name: Download Arch Artifacts
uses: actions/download-artifact@v3
with:
name: arch-artifacts
path: .
- name: Publish to AUR
env:
AUR_KEY: ${{ secrets.AUR_SSH_PRIVATE_KEY }}
@@ -129,10 +145,18 @@ jobs:
git config --global user.email "me@uyani.de"
git clone ssh://aur@aur.archlinux.org/wallreel.git aur-repo
cp PKGBUILD LICENSE aur-repo/
cp PKGBUILD aur-repo/
cp SRCINFO.txt aur-repo/.SRCINFO
cd aur-repo
cat << 'EOF' > LICENSE
Copyright (C) 2026 by Uyanide me@uyani.de
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
EOF
git add PKGBUILD LICENSE .SRCINFO
git commit -m "Release v${{ env.VERSION }}"
git push origin master
+1 -1
View File
@@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 3.16)
project(WallReel VERSION 2.0.0 LANGUAGES CXX)
project(WallReel VERSION 2.1.0 LANGUAGES CXX)
set(EXECUTABLE_NAME "wallreel")
set(CORELIB_NAME "wallreel-core")
+1 -2
View File
@@ -117,12 +117,11 @@ Configures system commands to execute on specific events mapping to your window
| :-------------------- | :--------------- | :------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `previewDebounceTime` | Integer | `300` | Debounce time (ms) for triggering the preview action. |
| `printSelected` | Boolean | `true` | Print selected wallpaper path to stdout on confirm. |
| `printPreview` | Boolean | `false` | Print previewed wallpaper path to stdout on preview. |
| `onSelected` | String | `""` | Command to execute when a wallpaper is confirmed. |
| `onPreview` | String | `""` | Command to execute when a wallpaper is previewed. |
| `saveState` | Array of Objects | `[]` | Commands to fetch system states before changing wallpapers. Each object defines: `key`, `fallback` (fallback value), `command` (stdout mapping), and `timeout` (ms). |
| `onRestore` | String | `""` | Command to execute on restore. Extracted states from `saveState` can be injected using `{{ key }}`. |
| `quitOnSelected` | Boolean | `false` | Quit the application after a selection is made. |
| `quitOnSelected` | Boolean | `true` | Quit the application after a selection is made. |
| `restoreOnClose` | Boolean | `true` | Run `onRestore` command if the application is closed without making a final selection. |
Available placeholders for `onSelected`, `onPreview` commands:
+10 -10
View File
@@ -1,6 +1,6 @@
.\" Automatically generated by Pandoc 3.5
.\" Automatically generated by Pandoc 3.9.0.2
.\"
.TH "WALLREEL" "1" "2026\-03\-24" "WallReel 2.0.0" "User Commands"
.TH "WALLREEL" "1" "2026\-03\-24" "WallReel 2.0.2" "User Commands"
.SH NAME
wallreel \- Choose and set desktop wallpapers with customizable themes
and actions
@@ -42,20 +42,20 @@ In this mode, the configuration is still parsed.
Action placeholders are resolved from the selected image and any
captured state values.
.SH BEHAVIOR NOTES
.IP \[bu] 2
.IP \(bu 2
CLI options are generally optional; configuration is the preferred
customization path.
.IP \[bu] 2
.IP \(bu 2
Some options are mutually exclusive (for example \f[CR]\-\-verbose\f[R]
and \f[CR]\-\-quiet\f[R]).
.IP \[bu] 2
.IP \(bu 2
With \f[CR]\-\-apply\f[R], WallReel executes configured selection
actions without opening the UI.
.SH FILES
\f[CR]\[ti]/.config/wallreel/config.json\f[R] : Default configuration
\f[CR]\(ti/.config/wallreel/config.json\f[R] : Default configuration
file location.
.PP
\f[CR]\[ti]/.cache/wallreel/\f[R] : Runtime cache location.
\f[CR]\(ti/.cache/wallreel/\f[R] : Runtime cache location.
.SH EXAMPLES
Run with default configuration:
.IP
@@ -66,19 +66,19 @@ wallreel
Use a custom configuration file:
.IP
.EX
wallreel \-\-config\-file \[ti]/.config/wallreel/config.json
wallreel \-\-config\-file \(ti/.config/wallreel/config.json
.EE
.PP
Append additional search directories:
.IP
.EX
wallreel \-\-append\-dir \[ti]/Pictures/Wallpapers \-\-append\-dir \[ti]/Art
wallreel \-\-append\-dir \(ti/Pictures/Wallpapers \-\-append\-dir \(ti/Art
.EE
.PP
Apply a wallpaper and exit:
.IP
.EX
wallreel \-\-apply \[ti]/Pictures/wallpaper.jpg
wallreel \-\-apply \(ti/Pictures/wallpaper.jpg
.EE
.SH EXIT STATUS
Returns \f[CR]0\f[R] on success.
+61 -64
View File
@@ -1,22 +1,22 @@
.\" Automatically generated by Pandoc 3.5
.\" Automatically generated by Pandoc 3.9.0.2
.\"
.TH "WALLREEL" "5" "2026\-03\-24" "WallReel 2.0.0" "File Formats Manual"
.TH "WALLREEL" "5" "2026\-03\-24" "WallReel 2.0.2" "File Formats Manual"
.SH NAME
wallreel\-config \- configuration format for wallreel
.SH SYNOPSIS
\f[CR]\[ti]/.config/wallreel/config.json\f[R]
\f[CR]\(ti/.config/wallreel/config.json\f[R]
.SH DESCRIPTION
WallReel reads configuration from a JSON document.
The root object is divided into five sections:
.IP \[bu] 2
.IP \(bu 2
\f[CR]wallpaper\f[R]
.IP \[bu] 2
.IP \(bu 2
\f[CR]theme\f[R]
.IP \[bu] 2
.IP \(bu 2
\f[CR]action\f[R]
.IP \[bu] 2
.IP \(bu 2
\f[CR]style\f[R]
.IP \[bu] 2
.IP \(bu 2
\f[CR]cache\f[R]
.PP
For complete machine\-readable validation details, refer to
@@ -25,7 +25,7 @@ For complete machine\-readable validation details, refer to
Defines where WallReel looks for images and what to exclude.
.PP
If both \f[CR]paths\f[R] and \f[CR]dirs\f[R] are empty or omitted,
WallReel defaults to recursively scanning the user\[aq]s Pictures
WallReel defaults to recursively scanning the user\(aqs Pictures
directory and treating all supported image files as wallpaper
candidates.
.PP
@@ -36,9 +36,9 @@ to specific image files.
to scan for images.
.PP
Each item has:
.IP \[bu] 2
.IP \(bu 2
\f[CR]path\f[R] (string)
.IP \[bu] 2
.IP \(bu 2
\f[CR]recursive\f[R] (boolean)
.PP
\f[CR]excludes\f[R] (array of string, default: \f[CR][]\f[R]) : Exclude
@@ -54,16 +54,16 @@ the primary color.
palette definitions.
.PP
Each palette has:
.IP \[bu] 2
.IP \(bu 2
\f[CR]name\f[R] (string)
.IP \[bu] 2
.IP \(bu 2
\f[CR]colors\f[R] (array)
.PP
Each color item has:
.IP \[bu] 2
.IP \(bu 2
\f[CR]name\f[R] (string)
.IP \[bu] 2
\f[CR]value\f[R] (hex string, for example \f[CR]\[dq]#89b4fa\[dq]\f[R])
.IP \(bu 2
\f[CR]value\f[R] (hex string, for example \f[CR]\(dq#89b4fa\(dq\f[R])
.SH ACTION SECTION
Configures commands executed for preview, selection, and restore
behavior.
@@ -74,33 +74,30 @@ Debounce interval in milliseconds for preview actions.
\f[CR]printSelected\f[R] (boolean, default: \f[CR]true\f[R]) : Print
selected wallpaper path to stdout on confirmation.
.PP
\f[CR]printPreview\f[R] (boolean, default: \f[CR]false\f[R]) : Print
previewed wallpaper path to stdout on preview.
.PP
\f[CR]onSelected\f[R] (string, default: \f[CR]\[dq]\[dq]\f[R]) : Command
\f[CR]onSelected\f[R] (string, default: \f[CR]\(dq\(dq\f[R]) : Command
executed when a wallpaper is confirmed.
.PP
\f[CR]onPreview\f[R] (string, default: \f[CR]\[dq]\[dq]\f[R]) : Command
\f[CR]onPreview\f[R] (string, default: \f[CR]\(dq\(dq\f[R]) : Command
executed when a wallpaper is previewed.
.PP
\f[CR]saveState\f[R] (array of object, default: \f[CR][]\f[R]) :
Commands for capturing system values before changing wallpaper.
.PP
Each item has:
.IP \[bu] 2
.IP \(bu 2
\f[CR]key\f[R] (placeholder key)
.IP \[bu] 2
.IP \(bu 2
\f[CR]fallback\f[R] (default value)
.IP \[bu] 2
.IP \(bu 2
\f[CR]command\f[R] (stdout\-mapped command)
.IP \[bu] 2
.IP \(bu 2
\f[CR]timeout\f[R] (milliseconds)
.PP
\f[CR]onRestore\f[R] (string, default: \f[CR]\[dq]\[dq]\f[R]) : Command
\f[CR]onRestore\f[R] (string, default: \f[CR]\(dq\(dq\f[R]) : Command
executed on restore.
Saved state keys are usable as placeholders.
.PP
\f[CR]quitOnSelected\f[R] (boolean, default: \f[CR]false\f[R]) : Exit
\f[CR]quitOnSelected\f[R] (boolean, default: \f[CR]true\f[R]) : Exit
application immediately after confirming a selection.
.PP
\f[CR]restoreOnClose\f[R] (boolean, default: \f[CR]true\f[R]) : Run
@@ -117,13 +114,13 @@ The following placeholders are available in \f[CR]onSelected\f[R],
wallpaper.
.PP
\f[CR]{{ palette }}\f[R] : Selected palette name
(\f[CR]\[dq]null\[dq]\f[R] if none).
(\f[CR]\(dqnull\(dq\f[R] if none).
.PP
\f[CR]{{ colorName }}\f[R] : Chosen primary color name
(\f[CR]\[dq]null\[dq]\f[R] if none).
(\f[CR]\(dqnull\(dq\f[R] if none).
.PP
\f[CR]{{ colorHex }}\f[R] : Chosen primary color hex
(\f[CR]\[dq]null\[dq]\f[R] if none).
(\f[CR]\(dqnull\(dq\f[R] if none).
.PP
\f[CR]{{ domColorHex }}\f[R] : Dominant color hex extracted from the
wallpaper.
@@ -162,54 +159,54 @@ Older entries are evicted.
.IP
.EX
{
\[dq]$schema\[dq]: \[dq]https://raw.githubusercontent.com/Uyanide/WallReel/refs/heads/master/config.schema.json\[dq],
\[dq]wallpaper\[dq]: {
\[dq]paths\[dq]: [\[dq]/home/user/Pictures/favorite.jpg\[dq]],
\[dq]dirs\[dq]: [
\(dq$schema\(dq: \(dqhttps://raw.githubusercontent.com/Uyanide/WallReel/refs/heads/master/config.schema.json\(dq,
\(dqwallpaper\(dq: {
\(dqpaths\(dq: [\(dq/home/user/Pictures/favorite.jpg\(dq],
\(dqdirs\(dq: [
{
\[dq]path\[dq]: \[dq]/home/user/Pictures/Wallpapers\[dq],
\[dq]recursive\[dq]: \f[B]true\f[R]
\(dqpath\(dq: \(dq/home/user/Pictures/Wallpapers\(dq,
\(dqrecursive\(dq: \f[B]true\f[R]
}
],
\[dq]excludes\[dq]: [\[dq]\[rs]\[rs].gif$\[dq]]
\(dqexcludes\(dq: [\(dq\(rs\(rs.gif$\(dq]
},
\[dq]theme\[dq]: {
\[dq]palettes\[dq]: [
\(dqtheme\(dq: {
\(dqpalettes\(dq: [
{
\[dq]name\[dq]: \[dq]Dark\[dq],
\[dq]colors\[dq]: [
{ \[dq]name\[dq]: \[dq]blue\[dq], \[dq]value\[dq]: \[dq]#89b4fa\[dq] },
{ \[dq]name\[dq]: \[dq]red\[dq], \[dq]value\[dq]: \[dq]#f38ba8\[dq] }
\(dqname\(dq: \(dqDark\(dq,
\(dqcolors\(dq: [
{ \(dqname\(dq: \(dqblue\(dq, \(dqvalue\(dq: \(dq#89b4fa\(dq },
{ \(dqname\(dq: \(dqred\(dq, \(dqvalue\(dq: \(dq#f38ba8\(dq }
]
}
]
},
\[dq]action\[dq]: {
\[dq]previewDebounceTime\[dq]: 500,
\[dq]quitOnSelected\[dq]: \f[B]true\f[R],
\[dq]onPreview\[dq]: \[dq]swww img {{ path }}\[dq],
\[dq]onSelected\[dq]: \[dq]cp {{ path }} \[ti]/.config/wallpaper/current/ && swww img {{ path }}\[dq],
\[dq]saveState\[dq]: [
\(dqaction\(dq: {
\(dqpreviewDebounceTime\(dq: 500,
\(dqquitOnSelected\(dq: \f[B]true\f[R],
\(dqonPreview\(dq: \(dqswww img {{ path }}\(dq,
\(dqonSelected\(dq: \(dqcp {{ path }} \(ti/.config/wallpaper/current/ && swww img {{ path }}\(dq,
\(dqsaveState\(dq: [
{
\[dq]key\[dq]: \[dq]current_wp\[dq],
\[dq]fallback\[dq]: \[dq]/home/user/Pictures/default.jpg\[dq],
\[dq]command\[dq]: \[dq]find \[ti]/.config/wallpaper/current \-type f | head \-n 1\[dq],
\[dq]timeout\[dq]: 1000
\(dqkey\(dq: \(dqcurrent_wp\(dq,
\(dqfallback\(dq: \(dq/home/user/Pictures/default.jpg\(dq,
\(dqcommand\(dq: \(dqfind \(ti/.config/wallpaper/current \-type f | head \-n 1\(dq,
\(dqtimeout\(dq: 1000
}
],
\[dq]onRestore\[dq]: \[dq]swww img {{ current_wp }}\[dq]
\(dqonRestore\(dq: \(dqswww img {{ current_wp }}\(dq
},
\[dq]style\[dq]: {
\[dq]image_width\[dq]: 640,
\[dq]image_height\[dq]: 400,
\[dq]image_focus_scale\[dq]: 1.2,
\[dq]window_width\[dq]: 1280,
\[dq]window_height\[dq]: 720
\(dqstyle\(dq: {
\(dqimage_width\(dq: 640,
\(dqimage_height\(dq: 400,
\(dqimage_focus_scale\(dq: 1.2,
\(dqwindow_width\(dq: 1280,
\(dqwindow_height\(dq: 720
},
\[dq]cache\[dq]: {
\[dq]saveSortMethod\[dq]: \f[B]true\f[R],
\[dq]savePalette\[dq]: \f[B]true\f[R],
\[dq]maxImageEntries\[dq]: 300
\(dqcache\(dq: {
\(dqsaveSortMethod\(dq: \f[B]true\f[R],
\(dqsavePalette\(dq: \f[B]true\f[R],
\(dqmaxImageEntries\(dq: 300
}
}
.EE
+2 -4
View File
@@ -27,7 +27,6 @@
//
// action.previewDebounceTime number 300 Debounce time for preview action in milliseconds
// action.printSelected boolean true Whether to print the selected wallpaper path to stdout on confirm
// action.printPreview boolean false Whether to print the previewed wallpaper path to stdout on preview
// action.onSelected string "" Command to execute on confirmation
// action.onPreview string "" Command to execute on preview
// action.saveState array [] Useful for restore command
@@ -36,7 +35,7 @@
// action.saveState[].command string "" Command that outputs(to stdout) the value to save when executed
// action.saveState[].timeout number 3000 Timeout for executing "command" in milliseconds. 0 or negative means no timeout
// action.onRestore string "" Command to execute on restore ({{ key }} -> value defined or obtained in saveState)
// action.quitOnSelected boolean false Whether to quit the application after confirming a wallpaper
// action.quitOnSelected boolean true Whether to quit the application after confirming a wallpaper
// action.restoreOnClose boolean true Whether to run the restore command after closing the application without confirming a wallpaper
//
// style.image_width number 320 Width of each image
@@ -126,8 +125,7 @@ struct ActionConfigItems {
QString onRestore;
int previewDebounceTime = 300; // milliseconds
bool printSelected = true;
bool printPreview = false;
bool quitOnSelected = false;
bool quitOnSelected = true;
bool restoreOnClose = true;
};
+9 -7
View File
@@ -26,8 +26,9 @@ Manager::Manager(
const QDir& picturesDir,
const QStringList& searchDirs,
const QString& configPath,
bool disableActions,
QObject* parent)
: QObject(parent), m_configDir(configDir) {
: QObject(parent), m_configDir(configDir), m_disableActions(disableActions) {
connect(this, &Manager::stateCaptured, this, [this]() {
m_stateCaptured = true;
WR_INFO("State capture completed");
@@ -202,12 +203,6 @@ void Manager::_loadActionConfig(const QJsonObject& root) {
m_actionConfig.printSelected = val.toBool();
}
}
if (config.contains("printPreview")) {
const auto& val = config["printPreview"];
if (val.isBool()) {
m_actionConfig.printPreview = val.toBool();
}
}
if (config.contains("saveState") && config["saveState"].isArray()) {
const QJsonArray& arr = config["saveState"].toArray();
for (const auto& item : arr) {
@@ -398,6 +393,13 @@ void Manager::captureState() {
if (m_stateCaptured) {
WR_DEBUG("State already captured, skipping capture");
emit stateCaptured();
return;
}
if (m_disableActions) {
WR_DEBUG("Actions are disabled, skipping state capture");
emit stateCaptured();
return;
}
if (m_pendingCaptures > 0) {
+4
View File
@@ -27,6 +27,7 @@ class Manager : public QObject {
* @param searchDirs Additional directories to search for wallpapers (not recursive)
* @param configPath Optional path to a specific configuration file (overrides the default config path)
* @param picturesDir The pictures directory (default location for user wallpapers)
* @param disableActions Whether to disable actions
* @param parent QObject parent
*
* @note The constructor will load the configuration and scan for wallpapers immediately.
@@ -36,6 +37,7 @@ class Manager : public QObject {
const QDir& picturesDir,
const QStringList& searchDirs = {},
const QString& configPath = "",
bool disableActions = false,
QObject* parent = nullptr);
~Manager();
@@ -88,6 +90,8 @@ class Manager : public QObject {
private:
const QDir m_configDir;
bool m_disableActions = false;
WallpaperConfigItems m_wallpaperConfig;
ThemeConfigItems m_themeConfig;
ActionConfigItems m_actionConfig;
+9 -2
View File
@@ -18,12 +18,13 @@ class Bootstrap {
friend class Carousel;
public:
Bootstrap(const AppOptions& options) {
Bootstrap(const AppOptions& options) : options(options) {
configMgr = new Config::Manager(
Utils::getConfigDir(),
Utils::getPicturesDir(),
options.appendDirs,
options.configPath);
options.configPath,
options.disableActions);
cacheMgr = new Cache::Manager(
Utils::getCacheDir(),
@@ -58,6 +59,11 @@ class Bootstrap {
}
bool apply(const QString& path) {
if (options.disableActions) {
Logger::warn("Bootstrap", "Actions are disabled, cannot apply wallpaper");
return false;
}
QEventLoop loop;
bool successFlag = false;
@@ -122,6 +128,7 @@ class Bootstrap {
}
private:
const AppOptions& options;
Cache::Manager* cacheMgr{};
Config::Manager* configMgr{};
Image::Manager* imageMgr{};
+3
View File
@@ -1,5 +1,6 @@
#include "manager.hpp"
#include "Utils/misc.hpp"
#include "Utils/texttemplate.hpp"
#include "logger.hpp"
@@ -61,6 +62,8 @@ void Manager::selectWallpaper(const QString& id) {
return;
}
Utils::printPath(data->getFullPath());
const auto command = _renderCommand(m_actionConfig.onSelected, _generateVariables(*data));
m_wallpaperService->select(command);
}
+18
View File
@@ -179,6 +179,24 @@ inline QDir getPicturesDir() {
return QDir(picturesDir);
}
inline void printPath(const QString& path, std::FILE* out = stdout) {
if (path.isEmpty()) {
return;
}
const QByteArray bytes = QFile::encodeName(path);
const size_t n = static_cast<size_t>(bytes.size());
if (std::fwrite(bytes.constData(), 1, n, out) != n) {
return;
}
if (std::fputc('\n', out) == EOF) {
return;
}
std::fflush(out);
return;
}
} // namespace WallReel::Core::Utils
#endif // WALLREEL_MISC_HPP
+1 -6
View File
@@ -96,11 +96,6 @@
"default": true,
"description": "Whether to print the selected wallpaper path to stdout on confirm"
},
"printPreview": {
"type": "boolean",
"default": false,
"description": "Whether to print the previewed wallpaper path to stdout on preview"
},
"onSelected": {
"type": "string",
"default": "",
@@ -148,7 +143,7 @@
},
"quitOnSelected": {
"type": "boolean",
"default": false,
"default": true,
"description": "Whether to quit the application after confirming a wallpaper"
},
"restoreOnClose": {
+1 -1
View File
@@ -2,7 +2,7 @@
title: WALLREEL
section: 1
header: User Commands
footer: WallReel 2.0.0
footer: WallReel 2.0.2
date: 2026-03-24
---
+2 -5
View File
@@ -2,7 +2,7 @@
title: WALLREEL
section: 5
header: File Formats Manual
footer: WallReel 2.0.0
footer: WallReel 2.0.2
date: 2026-03-24
---
@@ -79,9 +79,6 @@ Configures commands executed for preview, selection, and restore behavior.
`printSelected` (boolean, default: `true`)
: Print selected wallpaper path to stdout on confirmation.
`printPreview` (boolean, default: `false`)
: Print previewed wallpaper path to stdout on preview.
`onSelected` (string, default: `""`)
: Command executed when a wallpaper is confirmed.
@@ -101,7 +98,7 @@ Each item has:
`onRestore` (string, default: `""`)
: Command executed on restore. Saved state keys are usable as placeholders.
`quitOnSelected` (boolean, default: `false`)
`quitOnSelected` (boolean, default: `true`)
: Exit application immediately after confirming a selection.
`restoreOnClose` (boolean, default: `true`)