2016-11-02 19:22:45 +00:00
|
|
|
#include "modules/script.hpp"
|
2016-12-03 20:07:40 +00:00
|
|
|
#include "drawtypes/label.hpp"
|
2016-11-02 19:22:45 +00:00
|
|
|
|
2016-11-20 22:04:31 +00:00
|
|
|
#include "modules/meta/base.inl"
|
|
|
|
|
2016-11-19 05:22:44 +00:00
|
|
|
POLYBAR_NS
|
2016-11-02 19:22:45 +00:00
|
|
|
|
|
|
|
namespace modules {
|
2016-11-20 22:04:31 +00:00
|
|
|
template class module<script_module>;
|
|
|
|
|
2016-12-21 07:00:09 +00:00
|
|
|
script_module::script_module(const bar_settings& bar, string name_) : event_module<script_module>(bar, move(name_)) {
|
2016-12-30 22:32:05 +00:00
|
|
|
m_exec = m_conf.get(name(), "exec", m_exec);
|
|
|
|
m_tail = m_conf.get(name(), "tail", m_tail);
|
|
|
|
m_maxlen = m_conf.get(name(), "maxlen", m_maxlen);
|
|
|
|
m_ellipsis = m_conf.get(name(), "ellipsis", m_ellipsis);
|
2016-12-31 02:04:01 +00:00
|
|
|
m_interval = m_conf.get<decltype(m_interval)>(name(), "interval", m_tail ? 0s : 5s);
|
2016-11-02 19:22:45 +00:00
|
|
|
|
2016-12-03 20:07:40 +00:00
|
|
|
m_conf.warn_deprecated(
|
|
|
|
name(), "maxlen", "\"format = <label>\" and \"label = %output:0:" + to_string(m_maxlen) + "%\"");
|
|
|
|
|
2016-12-30 22:32:05 +00:00
|
|
|
m_actions[mousebtn::LEFT] = m_conf.get(name(), "click-left", ""s);
|
|
|
|
m_actions[mousebtn::MIDDLE] = m_conf.get(name(), "click-middle", ""s);
|
|
|
|
m_actions[mousebtn::RIGHT] = m_conf.get(name(), "click-right", ""s);
|
|
|
|
m_actions[mousebtn::SCROLL_UP] = m_conf.get(name(), "scroll-up", ""s);
|
|
|
|
m_actions[mousebtn::SCROLL_DOWN] = m_conf.get(name(), "scroll-down", ""s);
|
2016-12-03 20:07:40 +00:00
|
|
|
|
2016-12-04 21:09:57 +00:00
|
|
|
m_formatter->add(DEFAULT_FORMAT, TAG_LABEL, {TAG_OUTPUT, TAG_LABEL});
|
2016-12-03 20:07:40 +00:00
|
|
|
|
|
|
|
if (m_formatter->has(TAG_LABEL)) {
|
|
|
|
m_label = load_optional_label(m_conf, name(), "label", "%output%");
|
|
|
|
} else if (m_formatter->has(TAG_OUTPUT)) {
|
|
|
|
m_log.warn("%s: The format tag <output> is deprecated, use <label> instead", name());
|
|
|
|
}
|
2016-11-02 19:22:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void script_module::stop() {
|
2016-12-31 13:08:44 +00:00
|
|
|
m_updatelock.unlock();
|
|
|
|
event_module::stop();
|
|
|
|
|
2016-11-02 19:22:45 +00:00
|
|
|
if (m_command && m_command->is_running()) {
|
|
|
|
m_log.warn("%s: Stopping shell command", name());
|
|
|
|
m_command->terminate();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void script_module::idle() {
|
2016-11-25 12:55:15 +00:00
|
|
|
if (!m_tail) {
|
2016-11-02 19:22:45 +00:00
|
|
|
sleep(m_interval);
|
2016-11-25 12:55:15 +00:00
|
|
|
} else if (!m_command || !m_command->is_running()) {
|
2016-11-02 19:22:45 +00:00
|
|
|
sleep(m_interval);
|
2016-11-25 12:55:15 +00:00
|
|
|
}
|
2016-11-02 19:22:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
bool script_module::has_event() {
|
2016-11-25 12:55:15 +00:00
|
|
|
if (!m_tail) {
|
2016-11-02 19:22:45 +00:00
|
|
|
return true;
|
2016-12-31 13:08:44 +00:00
|
|
|
} else if (!m_command || !m_command->is_running()) {
|
|
|
|
try {
|
|
|
|
string exec{string_util::replace_all(m_exec, "%counter%", to_string(++m_counter))};
|
|
|
|
m_log.info("%s: Invoking shell command: \"%s\"", name(), exec);
|
|
|
|
m_command = command_util::make_command(move(exec));
|
2016-11-02 19:22:45 +00:00
|
|
|
m_command->exec(false);
|
2016-12-31 13:08:44 +00:00
|
|
|
} catch (const std::exception& err) {
|
|
|
|
m_log.err("%s: %s", name(), err.what());
|
|
|
|
throw module_error("Failed to execute tail command, stopping module...");
|
2016-11-02 19:22:45 +00:00
|
|
|
}
|
2016-11-25 12:55:15 +00:00
|
|
|
}
|
2016-11-02 19:22:45 +00:00
|
|
|
|
2016-12-31 13:08:44 +00:00
|
|
|
if (!m_command || (m_output = m_command->readline()) == m_prev) {
|
2016-11-02 19:22:45 +00:00
|
|
|
return false;
|
2016-11-25 12:55:15 +00:00
|
|
|
}
|
2016-11-02 19:22:45 +00:00
|
|
|
|
|
|
|
m_prev = m_output;
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool script_module::update() {
|
2016-11-25 12:55:15 +00:00
|
|
|
if (m_tail) {
|
2016-11-02 19:22:45 +00:00
|
|
|
return true;
|
2016-11-25 12:55:15 +00:00
|
|
|
}
|
2016-11-02 19:22:45 +00:00
|
|
|
|
|
|
|
try {
|
|
|
|
auto exec = string_util::replace_all(m_exec, "%counter%", to_string(++m_counter));
|
2016-12-03 19:52:42 +00:00
|
|
|
m_log.info("%s: Executing \"%s\"", name(), exec);
|
2016-11-02 19:22:45 +00:00
|
|
|
m_command = command_util::make_command(exec);
|
|
|
|
m_command->exec();
|
|
|
|
m_command->tail([&](string output) { m_output = output; });
|
|
|
|
} catch (const std::exception& err) {
|
|
|
|
m_log.err("%s: %s", name(), err.what());
|
|
|
|
throw module_error("Failed to execute command, stopping module...");
|
|
|
|
}
|
|
|
|
|
2016-11-25 12:55:15 +00:00
|
|
|
if (m_output == m_prev) {
|
2016-11-02 19:22:45 +00:00
|
|
|
return false;
|
2016-11-25 12:55:15 +00:00
|
|
|
}
|
2016-11-02 19:22:45 +00:00
|
|
|
|
|
|
|
m_prev = m_output;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
string script_module::get_output() {
|
2016-11-25 12:55:15 +00:00
|
|
|
if (m_output.empty()) {
|
2016-11-02 19:22:45 +00:00
|
|
|
return " ";
|
2016-12-03 20:07:40 +00:00
|
|
|
}
|
2016-11-02 19:22:45 +00:00
|
|
|
|
2016-12-03 20:07:40 +00:00
|
|
|
if (m_label) {
|
|
|
|
m_label->reset_tokens();
|
|
|
|
m_label->replace_token("%output%", m_output);
|
2016-11-25 12:55:15 +00:00
|
|
|
}
|
2016-12-03 20:07:40 +00:00
|
|
|
|
2016-11-02 19:22:45 +00:00
|
|
|
if (m_maxlen > 0 && m_output.length() > m_maxlen) {
|
|
|
|
m_output.erase(m_maxlen);
|
|
|
|
m_output += m_ellipsis ? "..." : "";
|
|
|
|
}
|
|
|
|
|
|
|
|
auto counter_str = to_string(m_counter);
|
2016-12-05 04:32:10 +00:00
|
|
|
string output{module::get_output()};
|
|
|
|
|
2016-11-02 19:22:45 +00:00
|
|
|
OUTPUT_ACTION(mousebtn::LEFT);
|
|
|
|
OUTPUT_ACTION(mousebtn::MIDDLE);
|
|
|
|
OUTPUT_ACTION(mousebtn::RIGHT);
|
|
|
|
OUTPUT_ACTION(mousebtn::SCROLL_UP);
|
|
|
|
OUTPUT_ACTION(mousebtn::SCROLL_DOWN);
|
2016-12-05 04:32:10 +00:00
|
|
|
|
|
|
|
m_builder->append(output);
|
2016-11-02 19:22:45 +00:00
|
|
|
|
|
|
|
return m_builder->flush();
|
|
|
|
}
|
|
|
|
|
2016-11-25 12:55:15 +00:00
|
|
|
bool script_module::build(builder* builder, const string& tag) const {
|
2016-11-02 19:22:45 +00:00
|
|
|
if (tag == TAG_OUTPUT) {
|
|
|
|
builder->node(m_output);
|
2016-12-03 20:07:40 +00:00
|
|
|
} else if (tag == TAG_LABEL) {
|
|
|
|
builder->node(m_label);
|
2016-11-02 19:22:45 +00:00
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
2016-12-03 20:07:40 +00:00
|
|
|
|
|
|
|
return true;
|
2016-11-02 19:22:45 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-11-19 05:22:44 +00:00
|
|
|
POLYBAR_NS_END
|