diff --git a/include/util/command.hpp b/include/util/command.hpp index 3d98f72e..c99df126 100644 --- a/include/util/command.hpp +++ b/include/util/command.hpp @@ -1,9 +1,10 @@ #pragma once #include -#include #include +#include #include + #include namespace waybar::util::command { @@ -51,7 +52,7 @@ inline int close(FILE* fp, pid_t pid) { return stat; } -inline FILE* open(const std::string cmd, int& pid) { +inline FILE* open(const std::string& cmd, int& pid) { if (cmd == "") return nullptr; int fd[2]; pipe(fd); @@ -76,7 +77,7 @@ inline FILE* open(const std::string cmd, int& pid) { return fdopen(fd[0], "r"); } -inline struct res exec(std::string cmd) { +inline struct res exec(const std::string& cmd) { int pid; auto fp = command::open(cmd, pid); if (!fp) return {-1, ""}; @@ -85,7 +86,7 @@ inline struct res exec(std::string cmd) { return {WEXITSTATUS(stat), output}; } -inline struct res execNoRead(std::string cmd) { +inline struct res execNoRead(const std::string& cmd) { int pid; auto fp = command::open(cmd, pid); if (!fp) return {-1, ""}; @@ -93,7 +94,7 @@ inline struct res execNoRead(std::string cmd) { return {WEXITSTATUS(stat), ""}; } -inline int32_t forkExec(std::string cmd) { +inline int32_t forkExec(const std::string& cmd) { if (cmd == "") return -1; int32_t pid = fork(); @@ -110,7 +111,7 @@ inline int32_t forkExec(std::string cmd) { execl("/bin/sh", "sh", "-c", cmd.c_str(), (char*)0); exit(0); } else { - signal(SIGCHLD,SIG_IGN); + signal(SIGCHLD, SIG_IGN); } return pid; diff --git a/src/modules/custom.cpp b/src/modules/custom.cpp index f20c2306..728d1146 100644 --- a/src/modules/custom.cpp +++ b/src/modules/custom.cpp @@ -50,7 +50,7 @@ void waybar::modules::Custom::continuousWorker() { if (!fp_) { throw std::runtime_error("Unable to open " + cmd); } - thread_ = [&] { + thread_ = [this, cmd] { char* buff = nullptr; size_t len = 0; bool restart = false; @@ -67,25 +67,26 @@ void waybar::modules::Custom::continuousWorker() { } if (config_["restart-interval"].isUInt()) { restart = true; + pid_ = -1; + fp_ = util::command::open(cmd, pid_); + if (!fp_) { + throw std::runtime_error("Unable to open " + cmd); + } } else { thread_.stop(); return; } - } - std::string output = buff; + } else { + std::string output = buff; - // Remove last newline - if (!output.empty() && output[output.length() - 1] == '\n') { - output.erase(output.length() - 1); - } - output_ = {0, output}; - dp.emit(); - if (restart) { - pid_ = -1; - fp_ = util::command::open(cmd, pid_); - if (!fp_) { - throw std::runtime_error("Unable to open " + cmd); + // Remove last newline + if (!output.empty() && output[output.length() - 1] == '\n') { + output.erase(output.length() - 1); } + output_ = {0, output}; + dp.emit(); + } + if (restart) { thread_.sleep_for(std::chrono::seconds(config_["restart-interval"].asUInt())); } };