Merge pull request #2517 from an-prata/master
Lighter Weight Signal-Based Custom Modules
This commit is contained in:
commit
6997b34a81
|
@ -22,6 +22,7 @@ class Custom : public ALabel {
|
||||||
private:
|
private:
|
||||||
void delayWorker();
|
void delayWorker();
|
||||||
void continuousWorker();
|
void continuousWorker();
|
||||||
|
void waitingWorker();
|
||||||
void parseOutputRaw();
|
void parseOutputRaw();
|
||||||
void parseOutputJson();
|
void parseOutputJson();
|
||||||
void handleEvent();
|
void handleEvent();
|
||||||
|
|
|
@ -58,6 +58,12 @@ class SleeperThread {
|
||||||
|
|
||||||
bool isRunning() const { return do_run_; }
|
bool isRunning() const { return do_run_; }
|
||||||
|
|
||||||
|
auto sleep() {
|
||||||
|
std::unique_lock lk(mutex_);
|
||||||
|
CancellationGuard cancel_lock;
|
||||||
|
return condvar_.wait(lk);
|
||||||
|
}
|
||||||
|
|
||||||
auto sleep_for(std::chrono::system_clock::duration dur) {
|
auto sleep_for(std::chrono::system_clock::duration dur) {
|
||||||
std::unique_lock lk(mutex_);
|
std::unique_lock lk(mutex_);
|
||||||
CancellationGuard cancel_lock;
|
CancellationGuard cancel_lock;
|
||||||
|
|
|
@ -34,7 +34,8 @@ Addressed by *custom/<name>*
|
||||||
typeof: integer ++
|
typeof: integer ++
|
||||||
The interval (in seconds) in which the information gets polled. ++
|
The interval (in seconds) in which the information gets polled. ++
|
||||||
Use *once* if you want to execute the module only on startup. ++
|
Use *once* if you want to execute the module only on startup. ++
|
||||||
You can update it manually with a signal. If no *interval* is defined, it is assumed that the out script loops it self.
|
You can update it manually with a signal. If no *interval* or *signal* is defined, it is assumed that the out script loops it self. ++
|
||||||
|
If a *signal* is defined then the script will run once on startup and will will only update with a signal.
|
||||||
|
|
||||||
*restart-interval*: ++
|
*restart-interval*: ++
|
||||||
typeof: integer ++
|
typeof: integer ++
|
||||||
|
@ -45,7 +46,8 @@ Addressed by *custom/<name>*
|
||||||
*signal*: ++
|
*signal*: ++
|
||||||
typeof: integer ++
|
typeof: integer ++
|
||||||
The signal number used to update the module. ++
|
The signal number used to update the module. ++
|
||||||
The number is valid between 1 and N, where *SIGRTMIN+N* = *SIGRTMAX*.
|
The number is valid between 1 and N, where *SIGRTMIN+N* = *SIGRTMAX*. ++
|
||||||
|
If no interval is defined then a signal will be the only way to update the module.
|
||||||
|
|
||||||
*format*: ++
|
*format*: ++
|
||||||
typeof: string ++
|
typeof: string ++
|
||||||
|
|
|
@ -11,7 +11,9 @@ waybar::modules::Custom::Custom(const std::string& name, const std::string& id,
|
||||||
fp_(nullptr),
|
fp_(nullptr),
|
||||||
pid_(-1) {
|
pid_(-1) {
|
||||||
dp.emit();
|
dp.emit();
|
||||||
if (interval_.count() > 0) {
|
if (!config_["signal"].empty() && config_["interval"].empty()) {
|
||||||
|
waitingWorker();
|
||||||
|
} else if (interval_.count() > 0) {
|
||||||
delayWorker();
|
delayWorker();
|
||||||
} else if (config_["exec"].isString()) {
|
} else if (config_["exec"].isString()) {
|
||||||
continuousWorker();
|
continuousWorker();
|
||||||
|
@ -92,6 +94,26 @@ void waybar::modules::Custom::continuousWorker() {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void waybar::modules::Custom::waitingWorker() {
|
||||||
|
thread_ = [this] {
|
||||||
|
bool can_update = true;
|
||||||
|
if (config_["exec-if"].isString()) {
|
||||||
|
output_ = util::command::execNoRead(config_["exec-if"].asString());
|
||||||
|
if (output_.exit_code != 0) {
|
||||||
|
can_update = false;
|
||||||
|
dp.emit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (can_update) {
|
||||||
|
if (config_["exec"].isString()) {
|
||||||
|
output_ = util::command::exec(config_["exec"].asString());
|
||||||
|
}
|
||||||
|
dp.emit();
|
||||||
|
}
|
||||||
|
thread_.sleep();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
void waybar::modules::Custom::refresh(int sig) {
|
void waybar::modules::Custom::refresh(int sig) {
|
||||||
if (sig == SIGRTMIN + config_["signal"].asInt()) {
|
if (sig == SIGRTMIN + config_["signal"].asInt()) {
|
||||||
thread_.wake_up();
|
thread_.wake_up();
|
||||||
|
|
Loading…
Reference in New Issue