From fe4e18f3b5a0ea92254d06233df344de17c4126c Mon Sep 17 00:00:00 2001 From: Vyn Date: Wed, 5 Jun 2024 14:18:45 +0200 Subject: [PATCH] Add Swaylock support --- CMakeLists.txt | 3 ++- src/CliArguments.h | 2 +- src/{SwaybgProcess.cpp => Process.cpp} | 30 +++++++++++++++++--------- src/{SwaybgProcess.h => Process.h} | 12 ++++++----- src/main.cpp | 18 +++++++++++++--- src/makeProcess.cpp | 9 ++++++++ src/makeProcess.h | 7 ++++++ 7 files changed, 61 insertions(+), 20 deletions(-) rename src/{SwaybgProcess.cpp => Process.cpp} (56%) rename src/{SwaybgProcess.h => Process.h} (64%) create mode 100644 src/makeProcess.cpp create mode 100644 src/makeProcess.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 328950e..7f97fb6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,5 +12,6 @@ set(CMAKE_COMPILE_WARNING_AS_ERROR ON) add_executable(sway-wallpaper src/main.cpp src/Wallpapers.cpp - src/SwaybgProcess.cpp + src/Process.cpp + src/makeProcess.cpp ) diff --git a/src/CliArguments.h b/src/CliArguments.h index a72aa93..85695df 100644 --- a/src/CliArguments.h +++ b/src/CliArguments.h @@ -167,7 +167,7 @@ namespace CliArguments { } if (arguments_[argName.value()].type == Bool) { argumentsValue_[argName.value()] = "true"; - return; + continue; } ++i; if (i >= argc) { diff --git a/src/SwaybgProcess.cpp b/src/Process.cpp similarity index 56% rename from src/SwaybgProcess.cpp rename to src/Process.cpp index 972a1f9..303f824 100644 --- a/src/SwaybgProcess.cpp +++ b/src/Process.cpp @@ -1,9 +1,10 @@ -#include "SwaybgProcess.h" +#include "Process.h" #include +#include #include -std::vector processes; +std::vector processes; void signalHandler(int sig) { std::cout << "received signal: " << sig << std::endl; @@ -13,7 +14,12 @@ void signalHandler(int sig) { exit(1); } -SwaybgProcess::SwaybgProcess(const std::string& wallpaperPath, const std::string& output) : wallpaperPath(wallpaperPath), output(output) { +Process::Process(const std::string& execPath, const std::vector& args) : execPath(execPath) { + this->args.push_back(this->execPath.c_str()); + for (auto& arg : args) { + this->args.push_back(arg); + } + this->args.push_back(0); static bool signalHandlerCreated = false; if (!signalHandlerCreated) { signalHandlerCreated = true; @@ -22,9 +28,9 @@ SwaybgProcess::SwaybgProcess(const std::string& wallpaperPath, const std::string processes.push_back(this); } -SwaybgProcess::~SwaybgProcess() { processes.erase(std::ranges::find(processes, this)); } +Process::~Process() { processes.erase(std::ranges::find(processes, this)); } -void SwaybgProcess::exec() { +void Process::exec() { if (pipe(fds) == -1) { throw std::runtime_error("Can't create pipe"); } @@ -33,7 +39,8 @@ void SwaybgProcess::exec() { dup2(fds[1], STDOUT_FILENO); close(fds[0]); close(fds[1]); - execl("/bin/swaybg", "/bin/swaybg" , "-o", output.c_str(), "-i", wallpaperPath.c_str(), "-m", "fill", (char*)0) ; + //execv("/bin/swaybg", "/bin/swaybg" , "-o", output.c_str(), "-i", wallpaperPath.c_str(), "-m", "fill", (char*)0) ; + execvp(execPath.c_str(), const_cast(args.data())) ; } else if (pid > 0) { killed = false; close(fds[1]); @@ -44,14 +51,17 @@ void SwaybgProcess::exec() { } } -void SwaybgProcess::kill() { +void Process::kill() { if (killed) { return; } killed = true; ::kill(pid, SIGKILL); - int status; - ::waitpid(pid, &status, 0); + wait(); } - +int Process::wait() { + int status; + ::waitpid(pid, &status, 0); + return status; +} diff --git a/src/SwaybgProcess.h b/src/Process.h similarity index 64% rename from src/SwaybgProcess.h rename to src/Process.h index 5af2c21..9e088ac 100644 --- a/src/SwaybgProcess.h +++ b/src/Process.h @@ -5,24 +5,26 @@ #include #include #include +#include #define SWAYBGPROCESS_BUFFER_SIZE 4094 -class SwaybgProcess { +class Process { public: - SwaybgProcess(const std::string& wallpaperPath, const std::string& output); + Process(const std::string& execPath, const std::vector& args); - ~SwaybgProcess(); + ~Process(); void exec(); void kill(); + int wait(); private: - std::string wallpaperPath; - std::string output; + std::string execPath; + std::vector args; pid_t pid; bool killed = true; diff --git a/src/main.cpp b/src/main.cpp index cfcbaab..eb40ba8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,6 +1,7 @@ #include "CliArguments.h" +#include "Process.h" #include "Wallpapers.h" -#include "SwaybgProcess.h" +#include "makeProcess.h" #include #include #include @@ -35,6 +36,10 @@ int main(int argc, char** argv, char** envp) { .description = "if set, wallpapers order is based on the names of the files", .type = CliArguments::Bool, }}, + {"lock", { + .description = "Lock the screen using swaylock instead of applying a wallpaper", + .type = CliArguments::Bool, + }}, {"help", { .aliases = {"h"}, .description = "Show help", @@ -63,14 +68,21 @@ int main(int argc, char** argv, char** envp) { wallpapers.shuffle(); } - SwaybgProcess swayBgProcess(wallpapers.next(), output); + if (arguments.exists("lock")) { + Process swaylockProcess = makeSwaylockProcess(wallpapers.next()); + swaylockProcess.exec(); + swaylockProcess.wait(); + return 0; + } + + Process swayBgProcess = makeSwaybgProcess(wallpapers.next(), output); swayBgProcess.exec(); if (arguments.exists("interval")) { int interval = arguments.getInt("interval"); while (true) { sleep(interval); - SwaybgProcess newSwayBgProcess(wallpapers.next(), output); + Process newSwayBgProcess = makeSwaybgProcess(wallpapers.next(), output); newSwayBgProcess.exec(); sleep(1); swayBgProcess.kill(); diff --git a/src/makeProcess.cpp b/src/makeProcess.cpp new file mode 100644 index 0000000..6eeb3d5 --- /dev/null +++ b/src/makeProcess.cpp @@ -0,0 +1,9 @@ +#include "makeProcess.h" + +Process makeSwaybgProcess(const std::string& wallpaper, const std::string& output) { + return Process("swaybg", {"-o", output.c_str(), "-i", wallpaper.c_str(), "-m", "fill"}); +} + +Process makeSwaylockProcess(const std::string& wallpaper) { + return Process("swaylock", {"-i", wallpaper.c_str()}); +} diff --git a/src/makeProcess.h b/src/makeProcess.h new file mode 100644 index 0000000..8d15f44 --- /dev/null +++ b/src/makeProcess.h @@ -0,0 +1,7 @@ +#pragma once + +#include "Process.h" +#include + +Process makeSwaybgProcess(const std::string& wallpaper, const std::string& output); +Process makeSwaylockProcess(const std::string& wallpaper);