From f5a24d12e564fb5da5228d188476fadedaffdb50 Mon Sep 17 00:00:00 2001 From: Bao Trinh Date: Mon, 13 Jun 2022 14:17:17 -0500 Subject: [PATCH] group module: configurable orientation currently, the orientation of group modules is always the opposite of the bar. Change it so that: * the default orientation of the group module is always the opposite of its parent, even for nested groups * the orientation can be overridden in the config * css ID and class are set for the group element --- include/group.hpp | 2 +- man/waybar.5.scd.in | 3 +++ src/bar.cpp | 12 +++++++++--- src/group.cpp | 27 ++++++++++++++++++++++++--- 4 files changed, 37 insertions(+), 7 deletions(-) diff --git a/include/group.hpp b/include/group.hpp index 5e828677..60801c71 100644 --- a/include/group.hpp +++ b/include/group.hpp @@ -12,7 +12,7 @@ namespace waybar { class Group : public AModule { public: - Group(const std::string&, const Bar&, const Json::Value&); + Group(const std::string&, const std::string&, const Json::Value&, bool); ~Group() = default; auto update() -> void; operator Gtk::Widget&(); diff --git a/man/waybar.5.scd.in b/man/waybar.5.scd.in index fafc2b36..ea724478 100644 --- a/man/waybar.5.scd.in +++ b/man/waybar.5.scd.in @@ -242,6 +242,7 @@ A module group is defined by specifying a module named "group/some-group-name". "modules-right": ["group/hardware", "clock"], "group/hardware": { + "orientation": "vertical", "modules": [ "cpu", "memory", @@ -253,6 +254,8 @@ A module group is defined by specifying a module named "group/some-group-name". } ``` +Valid options for the (optional) "orientation" property are: "horizontal", "vertical", "inherit", and "orthogonal" (default). + # SUPPORTED MODULES - *waybar-backlight(5)* diff --git a/src/bar.cpp b/src/bar.cpp index f46b7d0f..67e97d1f 100644 --- a/src/bar.cpp +++ b/src/bar.cpp @@ -742,7 +742,13 @@ void waybar::Bar::getModules(const Factory& factory, const std::string& pos, AModule* module; if (ref.compare(0, 6, "group/") == 0 && ref.size() > 6) { - auto group_module = new waybar::Group(ref, *this, config[ref]); + auto hash_pos = ref.find('#'); + auto id_name = ref.substr(6, hash_pos - 6); + auto class_name = hash_pos != std::string::npos ? ref.substr(hash_pos + 1) : ""; + + auto parent = group ? group : &this->box_; + auto vertical = parent->get_orientation() == Gtk::ORIENTATION_VERTICAL; + auto group_module = new waybar::Group(id_name, class_name, config[ref], vertical); getModules(factory, ref, &group_module->box); module = group_module; } else { @@ -764,11 +770,11 @@ void waybar::Bar::getModules(const Factory& factory, const std::string& pos, modules_right_.emplace_back(module_sp); } } - module->dp.connect([module, name] { + module->dp.connect([module, ref] { try { module->update(); } catch (const std::exception& e) { - spdlog::error("{}: {}", name.asString(), e.what()); + spdlog::error("{}: {}", ref, e.what()); } }); } catch (const std::exception& e) { diff --git a/src/group.cpp b/src/group.cpp index 83243654..548fb0da 100644 --- a/src/group.cpp +++ b/src/group.cpp @@ -6,9 +6,30 @@ namespace waybar { -Group::Group(const std::string& name, const Bar& bar, const Json::Value& config) - : AModule(config, name, "", false, false), - box{bar.vertical ? Gtk::ORIENTATION_HORIZONTAL : Gtk::ORIENTATION_VERTICAL, 0} {} +Group::Group(const std::string& name, const std::string& id, const Json::Value& config, + bool vertical) + : AModule(config, name, id, false, false), + box{vertical ? Gtk::ORIENTATION_VERTICAL : Gtk::ORIENTATION_HORIZONTAL, 0} { + box.set_name(name_); + if (!id.empty()) { + box.get_style_context()->add_class(id); + } + + // default orientation: orthogonal to parent + auto orientation = + config_["orientation"].empty() ? "orthogonal" : config_["orientation"].asString(); + if (orientation == "inherit") { + // keep orientation passed + } else if (orientation == "orthogonal") { + box.set_orientation(vertical ? Gtk::ORIENTATION_HORIZONTAL : Gtk::ORIENTATION_VERTICAL); + } else if (orientation == "vertical") { + box.set_orientation(Gtk::ORIENTATION_VERTICAL); + } else if (orientation == "horizontal") { + box.set_orientation(Gtk::ORIENTATION_HORIZONTAL); + } else { + throw std::runtime_error("Invalid orientation value: " + orientation); + } +} auto Group::update() -> void { // noop