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