diff --git a/include/util/command.hpp b/include/util/command.hpp index a52e9865..3d98f72e 100644 --- a/include/util/command.hpp +++ b/include/util/command.hpp @@ -34,6 +34,8 @@ inline int close(FILE* fp, pid_t pid) { fclose(fp); do { + waitpid(pid, &stat, WCONTINUED | WUNTRACED); + if (WIFEXITED(stat)) { spdlog::debug("%s exited with code %d", WEXITSTATUS(stat)); } else if (WIFSIGNALED(stat)) { @@ -83,6 +85,14 @@ inline struct res exec(std::string cmd) { return {WEXITSTATUS(stat), output}; } +inline struct res execNoRead(std::string cmd) { + int pid; + auto fp = command::open(cmd, pid); + if (!fp) return {-1, ""}; + auto stat = command::close(fp, pid); + return {WEXITSTATUS(stat), ""}; +} + inline int32_t forkExec(std::string cmd) { if (cmd == "") return -1; diff --git a/src/modules/custom.cpp b/src/modules/custom.cpp index 921296e0..fad10a6f 100644 --- a/src/modules/custom.cpp +++ b/src/modules/custom.cpp @@ -4,14 +4,13 @@ waybar::modules::Custom::Custom(const std::string& name, const std::string& id, const Json::Value& config) : ALabel(config, "custom-" + name, id, "{}"), name_(name), fp_(nullptr), pid_(-1) { - if (config_["exec"].isString()) { - if (interval_.count() > 0) { - delayWorker(); - } else { - continuousWorker(); - } + if (interval_.count() > 0) { + delayWorker(); + } else if (config_["exec"].isString()) { + continuousWorker(); + } else { + dp.emit(); } - dp.emit(); } waybar::modules::Custom::~Custom() { @@ -25,14 +24,16 @@ void waybar::modules::Custom::delayWorker() { thread_ = [this] { bool can_update = true; if (config_["exec-if"].isString()) { - auto res = util::command::exec(config_["exec-if"].asString()); - if (res.exit_code != 0) { + output_ = util::command::execNoRead(config_["exec-if"].asString()); + if (output_.exit_code != 0) { can_update = false; event_box_.hide(); } } if (can_update) { - output_ = util::command::exec(config_["exec"].asString()); + if (config_["exec"].isString()) { + output_ = util::command::exec(config_["exec"].asString()); + } dp.emit(); } thread_.sleep_for(interval_);