actions: Separate data from action string
Modules now no longer need to manually parse the action string and extract data from it.
This commit is contained in:
parent
8acedeef87
commit
bc1b86c584
@ -49,9 +49,9 @@ class builder {
|
|||||||
void underline_close();
|
void underline_close();
|
||||||
void control(controltag tag);
|
void control(controltag tag);
|
||||||
void action(mousebtn index, string action);
|
void action(mousebtn index, string action);
|
||||||
void action(mousebtn btn, const modules::input_handler& handler, string action);
|
void action(mousebtn btn, const modules::input_handler& handler, string action, string data);
|
||||||
void action(mousebtn index, string action, const label_t& label);
|
void action(mousebtn index, string action, const label_t& label);
|
||||||
void action(mousebtn btn, const modules::input_handler& handler, string action, const label_t& label);
|
void action(mousebtn btn, const modules::input_handler& handler, string action, string data, const label_t& label);
|
||||||
void action_close();
|
void action_close();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -36,7 +36,7 @@ namespace modules {
|
|||||||
static constexpr auto EVENT_TOGGLE = "toggle";
|
static constexpr auto EVENT_TOGGLE = "toggle";
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool input(string&& action);
|
bool input(string&& action, string&& data);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static constexpr auto FORMAT_VOLUME = "format-volume";
|
static constexpr auto FORMAT_VOLUME = "format-volume";
|
||||||
|
@ -32,7 +32,7 @@ namespace modules {
|
|||||||
static constexpr const char* EVENT_DEC = "dec";
|
static constexpr const char* EVENT_DEC = "dec";
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool input(string&& cmd);
|
bool input(string&& cmd, string&& data);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static constexpr auto TAG_LABEL = "<label>";
|
static constexpr auto TAG_LABEL = "<label>";
|
||||||
|
@ -54,7 +54,7 @@ namespace modules {
|
|||||||
static constexpr auto EVENT_PREV = "prev";
|
static constexpr auto EVENT_PREV = "prev";
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool input(string&& action);
|
bool input(string&& action, string&& data);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool handle_status(string& data);
|
bool handle_status(string& data);
|
||||||
|
@ -21,7 +21,7 @@ namespace modules {
|
|||||||
static constexpr auto EVENT_TOGGLE = "toggle";
|
static constexpr auto EVENT_TOGGLE = "toggle";
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool input(string&& action);
|
bool input(string&& action, string&& data);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static constexpr auto TAG_LABEL = "<label>";
|
static constexpr auto TAG_LABEL = "<label>";
|
||||||
|
@ -58,7 +58,7 @@ namespace modules {
|
|||||||
static constexpr auto EVENT_PREV = "prev";
|
static constexpr auto EVENT_PREV = "prev";
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool input(string&& action);
|
bool input(string&& action, string&& data);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static string make_workspace_command(const string& workspace);
|
static string make_workspace_command(const string& workspace);
|
||||||
|
@ -28,7 +28,7 @@ namespace modules {
|
|||||||
static constexpr auto EVENT_CLOSE = "close";
|
static constexpr auto EVENT_CLOSE = "close";
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool input(string&& action);
|
bool input(string&& action, string&& data);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static constexpr auto TAG_LABEL_TOGGLE = "<label-toggle>";
|
static constexpr auto TAG_LABEL_TOGGLE = "<label-toggle>";
|
||||||
|
@ -137,7 +137,7 @@ namespace modules {
|
|||||||
void teardown();
|
void teardown();
|
||||||
string contents();
|
string contents();
|
||||||
|
|
||||||
bool input(string&& action);
|
bool input(string&& action, string&& data);
|
||||||
string input_handler_name() const;
|
string input_handler_name() const;
|
||||||
|
|
||||||
static constexpr auto TYPE = "";
|
static constexpr auto TYPE = "";
|
||||||
|
@ -104,7 +104,7 @@ namespace modules {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename Impl>
|
template <typename Impl>
|
||||||
bool module<Impl>::input(string&&) {
|
bool module<Impl>::input(string&&, string&&) {
|
||||||
// By default a module doesn't support inputs
|
// By default a module doesn't support inputs
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -9,11 +9,14 @@ namespace modules {
|
|||||||
public:
|
public:
|
||||||
virtual ~input_handler() {}
|
virtual ~input_handler() {}
|
||||||
/**
|
/**
|
||||||
* Handle action
|
* Handle action, possibly with data attached
|
||||||
|
*
|
||||||
|
* Any implementation is free to ignore the data, if the action does not
|
||||||
|
* require additional data.
|
||||||
*
|
*
|
||||||
* \returns true if the action is supported and false otherwise
|
* \returns true if the action is supported and false otherwise
|
||||||
*/
|
*/
|
||||||
virtual bool input(string&& action) = 0;
|
virtual bool input(string&& action, string&& data) = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The name of this input handler
|
* The name of this input handler
|
||||||
|
@ -38,7 +38,7 @@ namespace modules {
|
|||||||
static constexpr const char* EVENT_SEEK = "seek";
|
static constexpr const char* EVENT_SEEK = "seek";
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool input(string&& action);
|
bool input(string&& action, string&& data);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static constexpr const char* FORMAT_ONLINE{"format-online"};
|
static constexpr const char* FORMAT_ONLINE{"format-online"};
|
||||||
|
@ -29,7 +29,7 @@ namespace modules {
|
|||||||
static constexpr auto EVENT_TOGGLE = "toggle";
|
static constexpr auto EVENT_TOGGLE = "toggle";
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool input(string&& action);
|
bool input(string&& action, string&& data);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static constexpr auto FORMAT_VOLUME = "format-volume";
|
static constexpr auto FORMAT_VOLUME = "format-volume";
|
||||||
|
@ -24,7 +24,7 @@ namespace modules {
|
|||||||
static constexpr auto EVENT_TOGGLE = "toggle";
|
static constexpr auto EVENT_TOGGLE = "toggle";
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool input(string&& action);
|
bool input(string&& action, string&& data);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@ namespace modules {
|
|||||||
string input_handler_name() const { \
|
string input_handler_name() const { \
|
||||||
return ""; \
|
return ""; \
|
||||||
} \
|
} \
|
||||||
bool input(string&&) { \
|
bool input(string&&, string&&) { \
|
||||||
return false; \
|
return false; \
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,7 @@ namespace modules {
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
void handle(const evt::randr_notify& evt);
|
void handle(const evt::randr_notify& evt);
|
||||||
bool input(string&& action);
|
bool input(string&& action, string&& data);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static constexpr const char* TAG_LABEL{"<label>"};
|
static constexpr const char* TAG_LABEL{"<label>"};
|
||||||
|
@ -38,7 +38,7 @@ namespace modules {
|
|||||||
void handle(const evt::xkb_state_notify& evt);
|
void handle(const evt::xkb_state_notify& evt);
|
||||||
void handle(const evt::xkb_indicator_state_notify& evt);
|
void handle(const evt::xkb_indicator_state_notify& evt);
|
||||||
|
|
||||||
bool input(string&& action);
|
bool input(string&& action, string&& data);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static constexpr const char* TAG_LABEL_LAYOUT{"<label-layout>"};
|
static constexpr const char* TAG_LABEL_LAYOUT{"<label-layout>"};
|
||||||
|
@ -72,7 +72,7 @@ namespace modules {
|
|||||||
void rebuild_desktop_states();
|
void rebuild_desktop_states();
|
||||||
void set_desktop_urgent(xcb_window_t window);
|
void set_desktop_urgent(xcb_window_t window);
|
||||||
|
|
||||||
bool input(string&& action);
|
bool input(string&& action, string&& data);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static vector<string> get_desktop_names();
|
static vector<string> get_desktop_names();
|
||||||
|
@ -6,30 +6,7 @@
|
|||||||
POLYBAR_NS
|
POLYBAR_NS
|
||||||
|
|
||||||
namespace actions_util {
|
namespace actions_util {
|
||||||
/**
|
string get_action_string(const modules::input_handler& handler, string action, string data);
|
||||||
* Specifies how an action is routed
|
|
||||||
*
|
|
||||||
* A route consists of an input handler where the action should be delivered
|
|
||||||
* and the action itself.
|
|
||||||
*
|
|
||||||
* TODO maybe remove if redundant at the end
|
|
||||||
*/
|
|
||||||
struct route {
|
|
||||||
bool valid;
|
|
||||||
string handler_name;
|
|
||||||
string action;
|
|
||||||
|
|
||||||
explicit route();
|
|
||||||
explicit route(string handler_name, string action);
|
|
||||||
explicit route(const modules::input_handler& handler, string action);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs the full action string for this route
|
|
||||||
*/
|
|
||||||
string get_action_string() const;
|
|
||||||
};
|
|
||||||
|
|
||||||
string get_action_string(const modules::input_handler& handler, string action);
|
|
||||||
} // namespace actions_util
|
} // namespace actions_util
|
||||||
|
|
||||||
POLYBAR_NS_END
|
POLYBAR_NS_END
|
||||||
|
@ -442,8 +442,8 @@ void builder::action(mousebtn index, string action) {
|
|||||||
/**
|
/**
|
||||||
* Open action tag for the action of the given input_handler
|
* Open action tag for the action of the given input_handler
|
||||||
*/
|
*/
|
||||||
void builder::action(mousebtn btn, const modules::input_handler& handler, string action_name) {
|
void builder::action(mousebtn btn, const modules::input_handler& handler, string action_name, string data) {
|
||||||
action(btn, actions_util::get_action_string(handler, action_name));
|
action(btn, actions_util::get_action_string(handler, action_name, data));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -461,8 +461,8 @@ void builder::action(mousebtn index, string action_name, const label_t& label) {
|
|||||||
/**
|
/**
|
||||||
* Wrap label in module action tag
|
* Wrap label in module action tag
|
||||||
*/
|
*/
|
||||||
void builder::action(mousebtn btn, const modules::input_handler& handler, string action_name, const label_t& label) {
|
void builder::action(mousebtn btn, const modules::input_handler& handler, string action_name, string data, const label_t& label) {
|
||||||
action(btn, actions_util::get_action_string(handler, action_name), label);
|
action(btn, actions_util::get_action_string(handler, action_name, data), label);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -402,9 +402,11 @@ void controller::process_inputdata() {
|
|||||||
m_log.trace("controller: Processing inputdata: %s", cmd);
|
m_log.trace("controller: Processing inputdata: %s", cmd);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Module inputs have the following form (w/o the quotes): "#NAME#INPUT"
|
* Module inputs have the following form (w/o the quotes): "#NAME#ACTION[.DATA]"
|
||||||
* where 'NAME' is the name of the module (for which '#' is a forbidden
|
* where 'NAME' is the name of the module (for which '#' is a forbidden
|
||||||
* character) and 'INPUT' is the input that is sent to the module
|
* character) and 'ACTION' is the input that is sent to the module. 'DATA'
|
||||||
|
* is optional data that is attached to the action and is also sent to the
|
||||||
|
* module.
|
||||||
*/
|
*/
|
||||||
if (cmd.front() == '#') {
|
if (cmd.front() == '#') {
|
||||||
// Find the second delimiter '#'
|
// Find the second delimiter '#'
|
||||||
@ -417,15 +419,25 @@ void controller::process_inputdata() {
|
|||||||
|
|
||||||
auto handler_name = cmd.substr(1, end_pos - 1);
|
auto handler_name = cmd.substr(1, end_pos - 1);
|
||||||
auto action = cmd.substr(end_pos + 1);
|
auto action = cmd.substr(end_pos + 1);
|
||||||
|
string data;
|
||||||
|
|
||||||
m_log.info("Forwarding data to input handlers (name: %s, action: %s) ", handler_name, action);
|
// Find the '.' character that separates the data from the action name
|
||||||
|
auto data_sep_pos = action.find('.', 0);
|
||||||
|
|
||||||
|
// The action contains data
|
||||||
|
if (data_sep_pos != string::npos) {
|
||||||
|
data = action.substr(end_pos + 1);
|
||||||
|
action.erase(end_pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_log.info("Forwarding data to input handlers (name: '%s', action: '%s', data: '%s') ", handler_name, action, data);
|
||||||
|
|
||||||
int num_delivered = 0;
|
int num_delivered = 0;
|
||||||
|
|
||||||
// Forwards the action to all input handlers that match the name
|
// Forwards the action to all input handlers that match the name
|
||||||
for (auto&& handler : m_inputhandlers) {
|
for (auto&& handler : m_inputhandlers) {
|
||||||
if (handler->input_handler_name() == handler_name) {
|
if (handler->input_handler_name() == handler_name) {
|
||||||
if (!handler->input(std::forward<string>(action))) {
|
if (!handler->input(std::forward<string>(action), std::forward<string>(data))) {
|
||||||
m_log.err("The '%s' module does not support the '%s' action.", handler_name, action);
|
m_log.err("The '%s' module does not support the '%s' action.", handler_name, action);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -513,7 +525,7 @@ void controller::process_inputdata() {
|
|||||||
if (cmd.compare(0, key.length(), key) == 0) {
|
if (cmd.compare(0, key.length(), key) == 0) {
|
||||||
string type = entry.second.first;
|
string type = entry.second.first;
|
||||||
auto data = cmd.substr(key.length());
|
auto data = cmd.substr(key.length());
|
||||||
string action = entry.second.second + data;
|
string action = entry.second.second;
|
||||||
|
|
||||||
// Search for the first module that matches the type for this legacy action
|
// Search for the first module that matches the type for this legacy action
|
||||||
for (auto&& mod : m_modules) {
|
for (auto&& mod : m_modules) {
|
||||||
@ -522,9 +534,13 @@ void controller::process_inputdata() {
|
|||||||
auto handler_name = handler_ptr->input_handler_name();
|
auto handler_name = handler_ptr->input_handler_name();
|
||||||
// TODO make this message more descriptive and maybe link to some documentation
|
// TODO make this message more descriptive and maybe link to some documentation
|
||||||
// TODO use route to string methods to print action name that should be used.
|
// TODO use route to string methods to print action name that should be used.
|
||||||
m_log.warn("The action '%s' is deprecated, use '#%s#%s' instead!", cmd, handler_name, action);
|
if (data.empty()) {
|
||||||
m_log.info("Forwarding legacy action '%s' to module '%s' as '%s'", cmd, handler_name, action);
|
m_log.warn("The action '%s' is deprecated, use '#%s#%s' instead!", cmd, handler_name, action);
|
||||||
if (!handler_ptr->input(std::forward<string>(action))) {
|
} else {
|
||||||
|
m_log.warn("The action '%s' is deprecated, use '#%s#%s.%s' instead!", cmd, handler_name, action, data);
|
||||||
|
}
|
||||||
|
m_log.info("Forwarding legacy action '%s' to module '%s' as '%s' with data '%s'", cmd, handler_name, action, data);
|
||||||
|
if (!handler_ptr->input(std::forward<string>(action), std::forward<string>(data))) {
|
||||||
m_log.err("Failed to forward deprecated action to %s module", type);
|
m_log.err("Failed to forward deprecated action to %s module", type);
|
||||||
/*
|
/*
|
||||||
* Forward to shell if the module cannot accept the action to not break existing behavior.
|
* Forward to shell if the module cannot accept the action to not break existing behavior.
|
||||||
|
@ -191,9 +191,9 @@ namespace modules {
|
|||||||
string output{module::get_output()};
|
string output{module::get_output()};
|
||||||
|
|
||||||
if (m_handle_events) {
|
if (m_handle_events) {
|
||||||
m_builder->action(mousebtn::LEFT, *this, EVENT_TOGGLE);
|
m_builder->action(mousebtn::LEFT, *this, EVENT_TOGGLE, "");
|
||||||
m_builder->action(mousebtn::SCROLL_UP, *this, EVENT_INC);
|
m_builder->action(mousebtn::SCROLL_UP, *this, EVENT_INC, "");
|
||||||
m_builder->action(mousebtn::SCROLL_DOWN, *this, EVENT_DEC);
|
m_builder->action(mousebtn::SCROLL_DOWN, *this, EVENT_DEC, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
m_builder->append(output);
|
m_builder->append(output);
|
||||||
@ -218,7 +218,7 @@ namespace modules {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool alsa_module::input(string&& action) {
|
bool alsa_module::input(string&& action , string&&) {
|
||||||
if (!m_handle_events) {
|
if (!m_handle_events) {
|
||||||
return false;
|
return false;
|
||||||
} else if (!m_mixer[mixer::MASTER]) {
|
} else if (!m_mixer[mixer::MASTER]) {
|
||||||
|
@ -88,8 +88,8 @@ namespace modules {
|
|||||||
string output{module::get_output()};
|
string output{module::get_output()};
|
||||||
|
|
||||||
if (m_scroll) {
|
if (m_scroll) {
|
||||||
m_builder->action(mousebtn::SCROLL_UP, *this, EVENT_INC);
|
m_builder->action(mousebtn::SCROLL_UP, *this, EVENT_INC, "");
|
||||||
m_builder->action(mousebtn::SCROLL_DOWN, *this, EVENT_DEC);
|
m_builder->action(mousebtn::SCROLL_DOWN, *this, EVENT_DEC, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
m_builder->append(std::move(output));
|
m_builder->append(std::move(output));
|
||||||
@ -113,7 +113,7 @@ namespace modules {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool backlight_module::input(string&& cmd) {
|
bool backlight_module::input(string&& cmd, string&&) {
|
||||||
double value_mod{0.0};
|
double value_mod{0.0};
|
||||||
|
|
||||||
if (cmd == EVENT_INC) {
|
if (cmd == EVENT_INC) {
|
||||||
|
@ -396,8 +396,8 @@ namespace modules {
|
|||||||
size_t workspace_n{0U};
|
size_t workspace_n{0U};
|
||||||
|
|
||||||
if (m_scroll) {
|
if (m_scroll) {
|
||||||
builder->action(mousebtn::SCROLL_DOWN, *this, EVENT_PREV);
|
builder->action(mousebtn::SCROLL_DOWN, *this, EVENT_PREV, "");
|
||||||
builder->action(mousebtn::SCROLL_UP, *this, EVENT_NEXT);
|
builder->action(mousebtn::SCROLL_UP, *this, EVENT_NEXT, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto&& ws : m_monitors[m_index]->workspaces) {
|
for (auto&& ws : m_monitors[m_index]->workspaces) {
|
||||||
@ -409,7 +409,7 @@ namespace modules {
|
|||||||
workspace_n++;
|
workspace_n++;
|
||||||
|
|
||||||
if (m_click) {
|
if (m_click) {
|
||||||
builder->action(mousebtn::LEFT, *this, sstream() << EVENT_FOCUS << m_index << "+" << workspace_n, ws.second);
|
builder->action(mousebtn::LEFT, *this, EVENT_FOCUS, sstream() << m_index << "+" << workspace_n, ws.second);
|
||||||
} else {
|
} else {
|
||||||
builder->node(ws.second);
|
builder->node(ws.second);
|
||||||
}
|
}
|
||||||
@ -445,7 +445,7 @@ namespace modules {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool bspwm_module::input(string&& action) {
|
bool bspwm_module::input(string&& action, string&& data) {
|
||||||
auto send_command = [this](string payload_cmd, string log_info) {
|
auto send_command = [this](string payload_cmd, string log_info) {
|
||||||
try {
|
try {
|
||||||
auto ipc = bspwm_util::make_connection();
|
auto ipc = bspwm_util::make_connection();
|
||||||
@ -458,18 +458,16 @@ namespace modules {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if (action.compare(0, strlen(EVENT_FOCUS), EVENT_FOCUS) == 0) {
|
if (action == EVENT_FOCUS) {
|
||||||
action.erase(0, strlen(EVENT_FOCUS));
|
size_t separator{string_util::find_nth(data, 0, "+", 1)};
|
||||||
|
size_t monitor_n{std::strtoul(data.substr(0, separator).c_str(), nullptr, 10)};
|
||||||
size_t separator{string_util::find_nth(action, 0, "+", 1)};
|
string workspace_n{data.substr(separator + 1)};
|
||||||
size_t monitor_n{std::strtoul(action.substr(0, separator).c_str(), nullptr, 10)};
|
|
||||||
string workspace_n{action.substr(separator + 1)};
|
|
||||||
|
|
||||||
if (monitor_n < m_monitors.size()) {
|
if (monitor_n < m_monitors.size()) {
|
||||||
send_command("desktop -f " + m_monitors[monitor_n]->name + ":^" + workspace_n,
|
send_command("desktop -f " + m_monitors[monitor_n]->name + ":^" + workspace_n,
|
||||||
"Sending desktop focus command to ipc handler");
|
"Sending desktop focus command to ipc handler");
|
||||||
} else {
|
} else {
|
||||||
m_log.err("%s: Invalid monitor index in command: %s", name(), action);
|
m_log.err("%s: Invalid monitor index in command: %s", name(), data);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -72,7 +72,7 @@ namespace modules {
|
|||||||
bool date_module::build(builder* builder, const string& tag) const {
|
bool date_module::build(builder* builder, const string& tag) const {
|
||||||
if (tag == TAG_LABEL) {
|
if (tag == TAG_LABEL) {
|
||||||
if (!m_dateformat_alt.empty() || !m_timeformat_alt.empty()) {
|
if (!m_dateformat_alt.empty() || !m_timeformat_alt.empty()) {
|
||||||
builder->action(mousebtn::LEFT, *this, EVENT_TOGGLE, m_label);
|
builder->action(mousebtn::LEFT, *this, EVENT_TOGGLE, "", m_label);
|
||||||
} else {
|
} else {
|
||||||
builder->node(m_label);
|
builder->node(m_label);
|
||||||
}
|
}
|
||||||
@ -83,7 +83,7 @@ namespace modules {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool date_module::input(string&& action) {
|
bool date_module::input(string&& action, string&&) {
|
||||||
if (action != EVENT_TOGGLE) {
|
if (action != EVENT_TOGGLE) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -183,8 +183,8 @@ namespace modules {
|
|||||||
builder->node(m_modelabel);
|
builder->node(m_modelabel);
|
||||||
} else if (tag == TAG_LABEL_STATE && !m_workspaces.empty()) {
|
} else if (tag == TAG_LABEL_STATE && !m_workspaces.empty()) {
|
||||||
if (m_scroll) {
|
if (m_scroll) {
|
||||||
builder->action(mousebtn::SCROLL_DOWN, *this, EVENT_PREV);
|
builder->action(mousebtn::SCROLL_DOWN, *this, EVENT_PREV, "");
|
||||||
builder->action(mousebtn::SCROLL_UP, *this, EVENT_NEXT);
|
builder->action(mousebtn::SCROLL_UP, *this, EVENT_NEXT, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
bool first = true;
|
bool first = true;
|
||||||
@ -201,7 +201,7 @@ namespace modules {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (m_click) {
|
if (m_click) {
|
||||||
builder->action(mousebtn::LEFT, *this, string{EVENT_FOCUS} + ws->name, ws->label);
|
builder->action(mousebtn::LEFT, *this, EVENT_FOCUS, ws->name, ws->label);
|
||||||
} else {
|
} else {
|
||||||
builder->node(ws->label);
|
builder->node(ws->label);
|
||||||
}
|
}
|
||||||
@ -218,14 +218,13 @@ namespace modules {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool i3_module::input(string&& action) {
|
bool i3_module::input(string&& action, string&& data) {
|
||||||
try {
|
try {
|
||||||
const i3_util::connection_t conn{};
|
const i3_util::connection_t conn{};
|
||||||
|
|
||||||
if (action.compare(0, strlen(EVENT_FOCUS), EVENT_FOCUS) == 0) {
|
if (action == EVENT_FOCUS) {
|
||||||
action.erase(0, strlen(EVENT_FOCUS));
|
|
||||||
m_log.info("%s: Sending workspace focus command to ipc handler", name());
|
m_log.info("%s: Sending workspace focus command to ipc handler", name());
|
||||||
conn.send_command(make_workspace_command(action));
|
conn.send_command(make_workspace_command(data));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,7 +58,7 @@ namespace modules {
|
|||||||
m_log.trace("%s: Creating menu level item %i", name(), m_levels.back()->items.size());
|
m_log.trace("%s: Creating menu level item %i", name(), m_levels.back()->items.size());
|
||||||
auto item = factory_util::unique<menu_tree_item>();
|
auto item = factory_util::unique<menu_tree_item>();
|
||||||
item->label = load_label(m_conf, name(), item_param);
|
item->label = load_label(m_conf, name(), item_param);
|
||||||
item->exec = m_conf.get(name(), item_param + "-exec", actions_util::get_action_string(*this, EVENT_CLOSE));
|
item->exec = m_conf.get(name(), item_param + "-exec", actions_util::get_action_string(*this, EVENT_CLOSE, ""));
|
||||||
m_levels.back()->items.emplace_back(move(item));
|
m_levels.back()->items.emplace_back(move(item));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -66,9 +66,9 @@ namespace modules {
|
|||||||
|
|
||||||
bool menu_module::build(builder* builder, const string& tag) const {
|
bool menu_module::build(builder* builder, const string& tag) const {
|
||||||
if (tag == TAG_LABEL_TOGGLE && m_level == -1) {
|
if (tag == TAG_LABEL_TOGGLE && m_level == -1) {
|
||||||
builder->action(mousebtn::LEFT, *this, string(EVENT_OPEN) + "0", m_labelopen);
|
builder->action(mousebtn::LEFT, *this, string(EVENT_OPEN), "0", m_labelopen);
|
||||||
} else if (tag == TAG_LABEL_TOGGLE && m_level > -1) {
|
} else if (tag == TAG_LABEL_TOGGLE && m_level > -1) {
|
||||||
builder->action(mousebtn::LEFT, *this, EVENT_CLOSE, m_labelclose);
|
builder->action(mousebtn::LEFT, *this, EVENT_CLOSE, "", m_labelclose);
|
||||||
} else if (tag == TAG_MENU && m_level > -1) {
|
} else if (tag == TAG_MENU && m_level > -1) {
|
||||||
auto spacing = m_formatter->get(get_format())->spacing;
|
auto spacing = m_formatter->get(get_format())->spacing;
|
||||||
//Insert separator after menu-toggle and before menu-items for expand-right=true
|
//Insert separator after menu-toggle and before menu-items for expand-right=true
|
||||||
@ -96,7 +96,7 @@ namespace modules {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool menu_module::input(string&& action) {
|
bool menu_module::input(string&& action, string&& data) {
|
||||||
// TODO Figure out how to close menu when command is executed (maybe exec-N action)
|
// TODO Figure out how to close menu when command is executed (maybe exec-N action)
|
||||||
if (action.compare(0, 4, "menu") != 0 && m_level > -1) {
|
if (action.compare(0, 4, "menu") != 0 && m_level > -1) {
|
||||||
for (auto&& item : m_levels[m_level]->items) {
|
for (auto&& item : m_levels[m_level]->items) {
|
||||||
@ -109,8 +109,8 @@ namespace modules {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (action.compare(0, strlen(EVENT_OPEN), EVENT_OPEN) == 0) {
|
if (action == EVENT_OPEN) {
|
||||||
auto level = action.substr(strlen(EVENT_OPEN));
|
auto level = data;
|
||||||
|
|
||||||
if (level.empty()) {
|
if (level.empty()) {
|
||||||
level = "0";
|
level = "0";
|
||||||
|
@ -325,27 +325,27 @@ namespace modules {
|
|||||||
} else if (tag == TAG_LABEL_OFFLINE) {
|
} else if (tag == TAG_LABEL_OFFLINE) {
|
||||||
builder->node(m_label_offline);
|
builder->node(m_label_offline);
|
||||||
} else if (tag == TAG_ICON_RANDOM) {
|
} else if (tag == TAG_ICON_RANDOM) {
|
||||||
builder->action(mousebtn::LEFT, *this, EVENT_RANDOM, m_icons->get("random"));
|
builder->action(mousebtn::LEFT, *this, EVENT_RANDOM, "", m_icons->get("random"));
|
||||||
} else if (tag == TAG_ICON_REPEAT) {
|
} else if (tag == TAG_ICON_REPEAT) {
|
||||||
builder->action(mousebtn::LEFT, *this, EVENT_REPEAT, m_icons->get("repeat"));
|
builder->action(mousebtn::LEFT, *this, EVENT_REPEAT, "", m_icons->get("repeat"));
|
||||||
} else if (tag == TAG_ICON_REPEAT_ONE || tag == TAG_ICON_SINGLE) {
|
} else if (tag == TAG_ICON_REPEAT_ONE || tag == TAG_ICON_SINGLE) {
|
||||||
builder->action(mousebtn::LEFT, *this, EVENT_SINGLE, m_icons->get("single"));
|
builder->action(mousebtn::LEFT, *this, EVENT_SINGLE, "", m_icons->get("single"));
|
||||||
} else if (tag == TAG_ICON_CONSUME) {
|
} else if (tag == TAG_ICON_CONSUME) {
|
||||||
builder->action(mousebtn::LEFT, *this, EVENT_CONSUME, m_icons->get("consume"));
|
builder->action(mousebtn::LEFT, *this, EVENT_CONSUME, "", m_icons->get("consume"));
|
||||||
} else if (tag == TAG_ICON_PREV) {
|
} else if (tag == TAG_ICON_PREV) {
|
||||||
builder->action(mousebtn::LEFT, *this, EVENT_PREV, m_icons->get("prev"));
|
builder->action(mousebtn::LEFT, *this, EVENT_PREV, "", m_icons->get("prev"));
|
||||||
} else if ((tag == TAG_ICON_STOP || tag == TAG_TOGGLE_STOP) && (is_playing || is_paused)) {
|
} else if ((tag == TAG_ICON_STOP || tag == TAG_TOGGLE_STOP) && (is_playing || is_paused)) {
|
||||||
builder->action(mousebtn::LEFT, *this, EVENT_STOP, m_icons->get("stop"));
|
builder->action(mousebtn::LEFT, *this, EVENT_STOP, "", m_icons->get("stop"));
|
||||||
} else if ((tag == TAG_ICON_PAUSE || tag == TAG_TOGGLE) && is_playing) {
|
} else if ((tag == TAG_ICON_PAUSE || tag == TAG_TOGGLE) && is_playing) {
|
||||||
builder->action(mousebtn::LEFT, *this, EVENT_PAUSE, m_icons->get("pause"));
|
builder->action(mousebtn::LEFT, *this, EVENT_PAUSE, "", m_icons->get("pause"));
|
||||||
} else if ((tag == TAG_ICON_PLAY || tag == TAG_TOGGLE || tag == TAG_TOGGLE_STOP) && !is_playing) {
|
} else if ((tag == TAG_ICON_PLAY || tag == TAG_TOGGLE || tag == TAG_TOGGLE_STOP) && !is_playing) {
|
||||||
builder->action(mousebtn::LEFT, *this, EVENT_PLAY, m_icons->get("play"));
|
builder->action(mousebtn::LEFT, *this, EVENT_PLAY, "", m_icons->get("play"));
|
||||||
} else if (tag == TAG_ICON_NEXT) {
|
} else if (tag == TAG_ICON_NEXT) {
|
||||||
builder->action(mousebtn::LEFT, *this, EVENT_NEXT, m_icons->get("next"));
|
builder->action(mousebtn::LEFT, *this, EVENT_NEXT, "", m_icons->get("next"));
|
||||||
} else if (tag == TAG_ICON_SEEKB) {
|
} else if (tag == TAG_ICON_SEEKB) {
|
||||||
builder->action(mousebtn::LEFT, *this, EVENT_SEEK + "-5"s, m_icons->get("seekb"));
|
builder->action(mousebtn::LEFT, *this, EVENT_SEEK, "-5"s, m_icons->get("seekb"));
|
||||||
} else if (tag == TAG_ICON_SEEKF) {
|
} else if (tag == TAG_ICON_SEEKF) {
|
||||||
builder->action(mousebtn::LEFT, *this, EVENT_SEEK + "+5"s, m_icons->get("seekf"));
|
builder->action(mousebtn::LEFT, *this, EVENT_SEEK, "+5"s, m_icons->get("seekf"));
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -353,7 +353,7 @@ namespace modules {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool mpd_module::input(string&& action) {
|
bool mpd_module::input(string&& action, string&& data) {
|
||||||
m_log.info("%s: event: %s", name(), action);
|
m_log.info("%s: event: %s", name(), action);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -384,17 +384,16 @@ namespace modules {
|
|||||||
mpd->set_random(!status->random());
|
mpd->set_random(!status->random());
|
||||||
} else if (action == EVENT_CONSUME) {
|
} else if (action == EVENT_CONSUME) {
|
||||||
mpd->set_consume(!status->consume());
|
mpd->set_consume(!status->consume());
|
||||||
} else if (action.compare(0, strlen(EVENT_SEEK), EVENT_SEEK) == 0) {
|
} else if (action == EVENT_SEEK) {
|
||||||
auto s = action.substr(strlen(EVENT_SEEK));
|
|
||||||
int percentage = 0;
|
int percentage = 0;
|
||||||
if (s.empty()) {
|
if (data.empty()) {
|
||||||
return false;
|
return false;
|
||||||
} else if (s[0] == '+') {
|
} else if (data[0] == '+') {
|
||||||
percentage = status->get_elapsed_percentage() + std::strtol(s.substr(1).c_str(), nullptr, 10);
|
percentage = status->get_elapsed_percentage() + std::strtol(data.substr(1).c_str(), nullptr, 10);
|
||||||
} else if (s[0] == '-') {
|
} else if (data[0] == '-') {
|
||||||
percentage = status->get_elapsed_percentage() - std::strtol(s.substr(1).c_str(), nullptr, 10);
|
percentage = status->get_elapsed_percentage() - std::strtol(data.substr(1).c_str(), nullptr, 10);
|
||||||
} else {
|
} else {
|
||||||
percentage = std::strtol(s.c_str(), nullptr, 10);
|
percentage = std::strtol(data.c_str(), nullptr, 10);
|
||||||
}
|
}
|
||||||
mpd->seek(status->get_songid(), status->get_seek_position(percentage));
|
mpd->seek(status->get_songid(), status->get_seek_position(percentage));
|
||||||
} else {
|
} else {
|
||||||
|
@ -117,9 +117,9 @@ namespace modules {
|
|||||||
m_builder->action(mousebtn::RIGHT, click_right);
|
m_builder->action(mousebtn::RIGHT, click_right);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_builder->action(mousebtn::LEFT, *this, EVENT_TOGGLE);
|
m_builder->action(mousebtn::LEFT, *this, EVENT_TOGGLE, "");
|
||||||
m_builder->action(mousebtn::SCROLL_UP, *this, EVENT_INC);
|
m_builder->action(mousebtn::SCROLL_UP, *this, EVENT_INC, "");
|
||||||
m_builder->action(mousebtn::SCROLL_DOWN, *this, EVENT_DEC);
|
m_builder->action(mousebtn::SCROLL_DOWN, *this, EVENT_DEC, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
m_builder->append(output);
|
m_builder->append(output);
|
||||||
@ -142,7 +142,7 @@ namespace modules {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool pulseaudio_module::input(string&& action) {
|
bool pulseaudio_module::input(string&& action, string&&) {
|
||||||
if (!m_handle_events) {
|
if (!m_handle_events) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -41,7 +41,7 @@ namespace modules {
|
|||||||
*/
|
*/
|
||||||
bool systray_module::build(builder* builder, const string& tag) const {
|
bool systray_module::build(builder* builder, const string& tag) const {
|
||||||
if (tag == TAG_LABEL_TOGGLE) {
|
if (tag == TAG_LABEL_TOGGLE) {
|
||||||
builder->action(mousebtn::LEFT, *this, EVENT_TOGGLE, m_label);
|
builder->action(mousebtn::LEFT, *this, EVENT_TOGGLE, "", m_label);
|
||||||
} else if (tag == TAG_TRAY_CLIENTS && !m_hidden) {
|
} else if (tag == TAG_TRAY_CLIENTS && !m_hidden) {
|
||||||
builder->append(TRAY_PLACEHOLDER);
|
builder->append(TRAY_PLACEHOLDER);
|
||||||
} else {
|
} else {
|
||||||
@ -53,7 +53,7 @@ namespace modules {
|
|||||||
/**
|
/**
|
||||||
* Handle input event
|
* Handle input event
|
||||||
*/
|
*/
|
||||||
bool systray_module::input(string&& action) {
|
bool systray_module::input(string&& action, string&& data) {
|
||||||
if (action.find(EVENT_TOGGLE) != 0) {
|
if (action.find(EVENT_TOGGLE) != 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -116,8 +116,8 @@ namespace modules {
|
|||||||
string output{module::get_output()};
|
string output{module::get_output()};
|
||||||
|
|
||||||
if (m_scroll) {
|
if (m_scroll) {
|
||||||
m_builder->action(mousebtn::SCROLL_UP, *this, EVENT_INC);
|
m_builder->action(mousebtn::SCROLL_UP, *this, EVENT_INC, "");
|
||||||
m_builder->action(mousebtn::SCROLL_DOWN, *this, EVENT_DEC);
|
m_builder->action(mousebtn::SCROLL_DOWN, *this, EVENT_DEC, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
m_builder->append(output);
|
m_builder->append(output);
|
||||||
@ -147,7 +147,7 @@ namespace modules {
|
|||||||
/**
|
/**
|
||||||
* Process scroll events by changing backlight value
|
* Process scroll events by changing backlight value
|
||||||
*/
|
*/
|
||||||
bool xbacklight_module::input(string&& action) {
|
bool xbacklight_module::input(string&& action, string&&) {
|
||||||
double value_mod{0.0};
|
double value_mod{0.0};
|
||||||
|
|
||||||
if (action == EVENT_INC) {
|
if (action == EVENT_INC) {
|
||||||
|
@ -172,7 +172,7 @@ namespace modules {
|
|||||||
string output{module::get_output()};
|
string output{module::get_output()};
|
||||||
|
|
||||||
if (m_keyboard && m_keyboard->size() > 1) {
|
if (m_keyboard && m_keyboard->size() > 1) {
|
||||||
m_builder->action(mousebtn::LEFT, *this, EVENT_SWITCH);
|
m_builder->action(mousebtn::LEFT, *this, EVENT_SWITCH, "");
|
||||||
m_builder->append(output);
|
m_builder->append(output);
|
||||||
m_builder->action_close();
|
m_builder->action_close();
|
||||||
} else {
|
} else {
|
||||||
@ -207,7 +207,7 @@ namespace modules {
|
|||||||
/**
|
/**
|
||||||
* Handle input command
|
* Handle input command
|
||||||
*/
|
*/
|
||||||
bool xkeyboard_module::input(string&& action) {
|
bool xkeyboard_module::input(string&& action, string&&) {
|
||||||
if (action != EVENT_SWITCH) {
|
if (action != EVENT_SWITCH) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -324,8 +324,8 @@ namespace modules {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (m_scroll) {
|
if (m_scroll) {
|
||||||
m_builder->action(mousebtn::SCROLL_DOWN, *this, string{EVENT_PREV});
|
m_builder->action(mousebtn::SCROLL_DOWN, *this, EVENT_PREV, "");
|
||||||
m_builder->action(mousebtn::SCROLL_UP, *this, string{EVENT_NEXT});
|
m_builder->action(mousebtn::SCROLL_UP, *this, EVENT_NEXT, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
m_builder->append(output);
|
m_builder->append(output);
|
||||||
@ -352,7 +352,7 @@ namespace modules {
|
|||||||
for (auto&& desktop : m_viewports[m_index]->desktops) {
|
for (auto&& desktop : m_viewports[m_index]->desktops) {
|
||||||
if (desktop->label.get()) {
|
if (desktop->label.get()) {
|
||||||
if (m_click && desktop->state != desktop_state::ACTIVE) {
|
if (m_click && desktop->state != desktop_state::ACTIVE) {
|
||||||
builder->action(mousebtn::LEFT, *this, string{EVENT_FOCUS} + to_string(desktop->index), desktop->label);
|
builder->action(mousebtn::LEFT, *this, EVENT_FOCUS, to_string(desktop->index), desktop->label);
|
||||||
} else {
|
} else {
|
||||||
builder->node(desktop->label);
|
builder->node(desktop->label);
|
||||||
}
|
}
|
||||||
@ -368,7 +368,7 @@ namespace modules {
|
|||||||
/**
|
/**
|
||||||
* Handle user input event
|
* Handle user input event
|
||||||
*/
|
*/
|
||||||
bool xworkspaces_module::input(string&& action) {
|
bool xworkspaces_module::input(string&& action, string&& data) {
|
||||||
std::lock_guard<std::mutex> lock(m_workspace_mutex);
|
std::lock_guard<std::mutex> lock(m_workspace_mutex);
|
||||||
|
|
||||||
vector<unsigned int> indexes;
|
vector<unsigned int> indexes;
|
||||||
@ -383,14 +383,12 @@ namespace modules {
|
|||||||
unsigned int new_desktop{0};
|
unsigned int new_desktop{0};
|
||||||
unsigned int current_desktop{ewmh_util::get_current_desktop()};
|
unsigned int current_desktop{ewmh_util::get_current_desktop()};
|
||||||
|
|
||||||
size_t len;
|
if (action == EVENT_FOCUS) {
|
||||||
|
new_desktop = std::strtoul(data.c_str(), nullptr, 10);
|
||||||
if ((len = strlen(EVENT_FOCUS)) && action.compare(0, len, EVENT_FOCUS) == 0) {
|
} else if (action == EVENT_NEXT) {
|
||||||
new_desktop = std::strtoul(action.substr(len).c_str(), nullptr, 10);
|
|
||||||
} else if ((len = strlen(EVENT_NEXT)) && action.compare(0, len, EVENT_NEXT) == 0) {
|
|
||||||
new_desktop = math_util::min<unsigned int>(indexes.back(), current_desktop + 1);
|
new_desktop = math_util::min<unsigned int>(indexes.back(), current_desktop + 1);
|
||||||
new_desktop = new_desktop == current_desktop ? indexes.front() : new_desktop;
|
new_desktop = new_desktop == current_desktop ? indexes.front() : new_desktop;
|
||||||
} else if ((len = strlen(EVENT_PREV)) && action.compare(0, len, EVENT_PREV) == 0) {
|
} else if (action == EVENT_PREV) {
|
||||||
new_desktop = math_util::max<unsigned int>(indexes.front(), current_desktop - 1);
|
new_desktop = math_util::max<unsigned int>(indexes.front(), current_desktop - 1);
|
||||||
new_desktop = new_desktop == current_desktop ? indexes.back() : new_desktop;
|
new_desktop = new_desktop == current_desktop ? indexes.back() : new_desktop;
|
||||||
}
|
}
|
||||||
|
@ -5,21 +5,13 @@
|
|||||||
POLYBAR_NS
|
POLYBAR_NS
|
||||||
|
|
||||||
namespace actions_util {
|
namespace actions_util {
|
||||||
route::route() : valid(false), handler_name(""), action("") {}
|
string get_action_string(const modules::input_handler& handler, string action, string data) {
|
||||||
route::route(string handler_name, string action) : valid(true), handler_name(handler_name), action(action) {}
|
string str = "#" + handler.input_handler_name() + "#" + action;
|
||||||
route::route(const modules::input_handler& handler, string action)
|
if (!data.empty()) {
|
||||||
: valid(true), handler_name(handler.input_handler_name()), action(action) {}
|
str += "." + data;
|
||||||
|
|
||||||
string route::get_action_string() const {
|
|
||||||
if (!this->valid) {
|
|
||||||
return "";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return "#" + this->handler_name + "#" + this->action;
|
return str;
|
||||||
}
|
|
||||||
|
|
||||||
string get_action_string(const modules::input_handler& handler, string action) {
|
|
||||||
return route(handler, action).get_action_string();
|
|
||||||
}
|
}
|
||||||
} // namespace actions_util
|
} // namespace actions_util
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user