diff --git a/include/group.hpp b/include/group.hpp index 5e82867..60801c7 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 fafc2b3..ea72447 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 f46b7d0..67e97d1 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 8324365..548fb0d 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