Skip to content

Commit 5543ebb

Browse files
committed
UI module
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
1 parent dacecb9 commit 5543ebb

File tree

6 files changed

+102
-2
lines changed

6 files changed

+102
-2
lines changed

include/modules/ui.hpp

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#pragma once
2+
3+
#include "AModule.hpp"
4+
5+
namespace waybar::modules {
6+
7+
class UI final : public AModule {
8+
public:
9+
UI(const std::string&, const std::string&, const Json::Value&);
10+
virtual ~UI() = default;
11+
};
12+
13+
} // namespace waybar::modules

meson.build

+7-1
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,8 @@ src_files = files(
183183
'src/util/rewrite_string.cpp',
184184
'src/util/gtk_icon.cpp',
185185
'src/util/regex_collection.cpp',
186-
'src/util/css_reload_helper.cpp'
186+
'src/util/css_reload_helper.cpp',
187+
'src/modules/ui.cpp'
187188
)
188189

189190
man_files = files(
@@ -543,6 +544,11 @@ install_data(
543544
install_dir: sysconfdir / 'xdg/waybar'
544545
)
545546

547+
install_subdir(
548+
'resources/ui',
549+
install_dir: sysconfdir / 'xdg/waybar'
550+
)
551+
546552
scdoc = dependency('scdoc', version: '>=1.9.2', native: true, required: get_option('man-pages'))
547553

548554
if scdoc.found()

resources/ui/ui-power.xml

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<interface>
3+
<requires lib="gtk+" version="3.22"/>
4+
<menu id='waybar-power-menu'>
5+
<section>
6+
<item>
7+
<attribute name='label' translatable='yes'>Suspend</attribute>
8+
<attribute name='action'>ui-power.doAction</attribute>
9+
<attribute name='target'>Suspend</attribute>
10+
</item>
11+
<item>
12+
<attribute name='label' translatable='yes'>Hibernate</attribute>
13+
<attribute name='action'>ui-power.doAction</attribute>
14+
<attribute name='target'>Hibernate</attribute>
15+
</item>
16+
<item>
17+
<attribute name='label' translatable='yes'>Shutdown</attribute>
18+
<attribute name='action'>ui-power.doAction</attribute>
19+
<attribute name='target'>Shutdown</attribute>
20+
</item>
21+
</section>
22+
<section>
23+
<item>
24+
<attribute name='label' translatable='yes'>Reboot</attribute>
25+
<attribute name='action'>ui-power.doAction</attribute>
26+
<attribute name='target'>Reboot</attribute>
27+
</item>
28+
</section>
29+
</menu>
30+
31+
<object class="GtkMenuButton" id="ui-power">
32+
<property name="menu-model">waybar-power-menu</property>
33+
<property name="tooltip-text" translatable="yes">Power menu</property>
34+
<property name="label">⏻</property>
35+
<property name="visible">true</property>
36+
<property name="direction">GTK_ARROW_NONE</property>
37+
<property name="use-popover">false</property>
38+
</object>
39+
</interface>

src/factory.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@
113113
#include "modules/custom.hpp"
114114
#include "modules/image.hpp"
115115
#include "modules/temperature.hpp"
116+
#include "modules/ui.hpp"
116117
#include "modules/user.hpp"
117118

118119
waybar::Factory::Factory(const Bar& bar, const Json::Value& config) : bar_(bar), config_(config) {}
@@ -341,6 +342,9 @@ waybar::AModule* waybar::Factory::makeModule(const std::string& name,
341342
if (ref.compare(0, 5, "cffi/") == 0 && ref.size() > 5) {
342343
return new waybar::modules::CFFI(ref.substr(5), id, config_[name]);
343344
}
345+
if (ref.compare(0, 3, "ui/") == 0 && ref.size() > 3) {
346+
return new waybar::modules::UI(ref.substr(3), id, config_[name]);
347+
}
344348
} catch (const std::exception& e) {
345349
auto err = fmt::format("Disabling module \"{}\", {}", name, e.what());
346350
throw std::runtime_error(err);

src/main.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ int main(int argc, char* argv[]) {
109109

110110
std::signal(SIGUSR1, SIG_IGN);
111111
std::signal(SIGUSR2, SIG_IGN);
112-
std::signal(SIGINT, SIG_IGN);
112+
std::signal(SIGINT, SIG_IGN);
113113

114114
delete client;
115115
return ret;

src/modules/ui.cpp

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#include "modules/ui.hpp"
2+
3+
#include <gtkmm/builder.h>
4+
#include <spdlog/spdlog.h>
5+
6+
#include <util/command.hpp>
7+
8+
waybar::modules::UI::UI(const std::string& name, const std::string& id, const Json::Value& config)
9+
: AModule(config, "ui-" + name, id, false, false) {
10+
if (config_["file-path"].isString()) {
11+
Glib::RefPtr<Gtk::Builder> builder{
12+
Gtk::Builder::create_from_file(config_["file-path"].asString())};
13+
Glib::RefPtr<Gtk::Widget> uiWg{
14+
Glib::RefPtr<Gtk::Widget>::cast_dynamic(builder->get_object(name_))};
15+
16+
if (uiWg) {
17+
uiWg->set_name(name_);
18+
if (!id.empty()) {
19+
uiWg->get_style_context()->add_class(id);
20+
}
21+
uiWg->get_style_context()->add_class(MODULE_CLASS);
22+
23+
Glib::RefPtr<Gio::SimpleActionGroup> actionGroup{Gio::SimpleActionGroup::create()};
24+
Glib::RefPtr<Gio::SimpleAction> action{actionGroup->add_action_with_parameter(
25+
"doAction", Glib::VARIANT_TYPE_STRING, [this](const Glib::VariantBase& param) {
26+
assert(param.is_of_type(Glib::VARIANT_TYPE_STRING));
27+
waybar::util::command::res res = waybar::util::command::exec(
28+
Glib::VariantBase::cast_dynamic<Glib::Variant<Glib::ustring>>(param).get(), "TLP");
29+
})};
30+
31+
uiWg->insert_action_group(name_, actionGroup);
32+
event_box_.add(*uiWg.get());
33+
} else {
34+
spdlog::error("UI: object id \"{}\" is not found at \"{}\"", name_,
35+
config_["file-path"].asString());
36+
}
37+
}
38+
}

0 commit comments

Comments
 (0)