From c7cb5ebf94d8824a4a445c8959b02784a24414d7 Mon Sep 17 00:00:00 2001
From: patrick96
Date: Sat, 23 Sep 2017 16:50:57 +0200
Subject: [PATCH] fix(renderer): Handle nested actions events properly
For nested actions, the inner action should override the outer action.
But because the list of actions was not iterated in reverse the outer
action was matched first.
Fixes #760
---
src/components/bar.cpp | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/src/components/bar.cpp b/src/components/bar.cpp
index 6e7dfbe0..6e0c304b 100644
--- a/src/components/bar.cpp
+++ b/src/components/bar.cpp
@@ -689,13 +689,20 @@ void bar::handle(const evt::button_press& evt) {
m_buttonpress_pos = evt->event_x;
const auto deferred_fn = [&](size_t) {
- for (auto&& action : m_renderer->actions()) {
- if (action.button == m_buttonpress_btn && !action.active && action.test(m_buttonpress_pos)) {
+ /*
+ * Iterate over all defined actions in reverse order until matching action is found
+ * To properly handle nested actions we iterate in reverse because nested actions are added later than their
+ * surrounding action block
+ */
+ auto actions = m_renderer->actions();
+ for (auto action = actions.rbegin(); action != actions.rend(); action++) {
+ if (action->button == m_buttonpress_btn && !action->active && action->test(m_buttonpress_pos)) {
m_log.trace("Found matching input area");
- m_sig.emit(button_press{string{action.command}});
+ m_sig.emit(button_press{string{action->command}});
return;
}
}
+
for (auto&& action : m_opts.actions) {
if (action.button == m_buttonpress_btn && !action.command.empty()) {
m_log.trace("Found matching fallback handler");