mirror of
https://github.com/rad4day/Waybar.git
synced 2023-12-21 10:22:59 +01:00
Compare commits
25 Commits
Author | SHA1 | Date | |
---|---|---|---|
3f2eb0b492 | |||
4f773ea268 | |||
047473e5a4 | |||
ed3e4b1395 | |||
16b01e1059 | |||
1ae490c8f7 | |||
0d0a3be483 | |||
a1c4b9bb0c | |||
a55a1ae866 | |||
07d8dfb3d6 | |||
5010227e6b | |||
e8f3c1c6b3 | |||
7e6c701659 | |||
adc38c3dfe | |||
b10907ee44 | |||
0c9699b076 | |||
63e86fbe9e | |||
f20441fa92 | |||
3f269ff463 | |||
fd76e98552 | |||
9fae5efc06 | |||
7f1f217d84 | |||
1ea0c1f9dd | |||
4626cbef63 | |||
85f845ca43 |
@ -7,6 +7,7 @@
|
||||
**Current features**
|
||||
- Sway Workspaces
|
||||
- Sway focused window name
|
||||
- Tray (Beta) [#21](https://github.com/Alexays/Waybar/issues/21)
|
||||
- Local time
|
||||
- Battery
|
||||
- Network
|
||||
|
@ -9,7 +9,9 @@
|
||||
#include "modules/battery.hpp"
|
||||
#include "modules/memory.hpp"
|
||||
#include "modules/cpu.hpp"
|
||||
#ifdef HAVE_DBUSMENU
|
||||
#include "modules/sni/tray.hpp"
|
||||
#endif
|
||||
#ifdef HAVE_LIBNL
|
||||
#include "modules/network.hpp"
|
||||
#endif
|
||||
|
@ -24,6 +24,7 @@ class Battery : public ALabel {
|
||||
void worker();
|
||||
|
||||
util::SleeperThread thread_;
|
||||
util::SleeperThread threadTimer_;
|
||||
std::vector<fs::path> batteries_;
|
||||
int fd_;
|
||||
};
|
||||
|
@ -1,7 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <gtkmm.h>
|
||||
|
||||
#include <json/json.h>
|
||||
#include <tuple>
|
||||
#include <dbus-status-notifier-watcher.h>
|
||||
#include "modules/sni/sni.hpp"
|
||||
@ -10,7 +10,7 @@ namespace waybar::modules::SNI {
|
||||
|
||||
class Host {
|
||||
public:
|
||||
Host(Glib::Dispatcher*);
|
||||
Host(Glib::Dispatcher*, const Json::Value&);
|
||||
std::vector<Item> items;
|
||||
private:
|
||||
static void busAcquired(GDBusConnection*, const gchar*, gpointer);
|
||||
@ -19,10 +19,8 @@ class Host {
|
||||
static void nameVanished(GDBusConnection*, const gchar*, gpointer);
|
||||
static void proxyReady(GObject*, GAsyncResult*, gpointer);
|
||||
static void registerHost(GObject*, GAsyncResult*, gpointer);
|
||||
static void itemRegistered(SnOrgKdeStatusNotifierWatcher*, const gchar*,
|
||||
gpointer);
|
||||
static void itemUnregistered(SnOrgKdeStatusNotifierWatcher*, const gchar*,
|
||||
gpointer);
|
||||
static void itemRegistered(SnWatcher*, const gchar*, gpointer);
|
||||
static void itemUnregistered(SnWatcher*, const gchar*, gpointer);
|
||||
|
||||
std::tuple<std::string, std::string> getBusNameAndObjectPath(const gchar*);
|
||||
void addRegisteredItem(const gchar* service);
|
||||
@ -33,7 +31,8 @@ class Host {
|
||||
std::string object_path_;
|
||||
Glib::Dispatcher* dp_;
|
||||
GCancellable* cancellable_ = nullptr;
|
||||
SnOrgKdeStatusNotifierWatcher* watcher_ = nullptr;
|
||||
SnWatcher* watcher_ = nullptr;
|
||||
const Json::Value &config_;
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -2,12 +2,14 @@
|
||||
|
||||
#include <dbus-status-notifier-item.h>
|
||||
#include <gtkmm.h>
|
||||
#include <json/json.h>
|
||||
#include <filesystem>
|
||||
|
||||
namespace waybar::modules::SNI {
|
||||
|
||||
class Item {
|
||||
public:
|
||||
Item(std::string, std::string, Glib::Dispatcher *);
|
||||
Item(std::string, std::string, Glib::Dispatcher*, Json::Value);
|
||||
|
||||
std::string bus_name;
|
||||
std::string object_path;
|
||||
@ -39,13 +41,15 @@ private:
|
||||
static void handleSecondaryActivate(GObject *, GAsyncResult *, gpointer);
|
||||
|
||||
void updateImage();
|
||||
void updateMenu();
|
||||
Glib::RefPtr<Gdk::Pixbuf> extractPixBuf(GVariant *variant);
|
||||
Glib::RefPtr<Gdk::Pixbuf> getIconByName(std::string name, int size);
|
||||
bool handleClick(GdkEventButton *const & /*ev*/);
|
||||
|
||||
Glib::Dispatcher *dp_;
|
||||
GCancellable *cancellable_ = nullptr;
|
||||
SnOrgKdeStatusNotifierItem *proxy_ = nullptr;
|
||||
SnItem *proxy_ = nullptr;
|
||||
Json::Value config_;
|
||||
};
|
||||
|
||||
} // namespace waybar::modules::SNI
|
||||
|
@ -34,13 +34,13 @@ private:
|
||||
static void nameVanished(GDBusConnection *connection, const char *name,
|
||||
gpointer data);
|
||||
|
||||
void updateRegisteredItems(SnOrgKdeStatusNotifierWatcher *obj);
|
||||
void updateRegisteredItems(SnWatcher *obj);
|
||||
|
||||
uint32_t bus_name_id_;
|
||||
uint32_t watcher_id_;
|
||||
GSList *hosts_ = nullptr;
|
||||
GSList *items_ = nullptr;
|
||||
SnOrgKdeStatusNotifierWatcher *watcher_ = nullptr;
|
||||
SnWatcher *watcher_ = nullptr;
|
||||
};
|
||||
|
||||
} // namespace waybar::modules::SNI
|
||||
|
@ -1,6 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <iostream>
|
||||
#include <cstring>
|
||||
#include <unistd.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/un.h>
|
||||
|
@ -1,6 +1,6 @@
|
||||
project(
|
||||
'waybar', 'cpp', 'c',
|
||||
version: '0.1.0',
|
||||
version: '0.1.3',
|
||||
license: 'MIT',
|
||||
default_options : [
|
||||
'cpp_std=c++17',
|
||||
@ -33,6 +33,7 @@ wayland_protos = dependency('wayland-protocols')
|
||||
wlroots = dependency('wlroots', fallback: ['wlroots', 'wlroots'])
|
||||
gtkmm = dependency('gtkmm-3.0')
|
||||
dbusmenu_gtk = dependency('dbusmenu-gtk3-0.4', required: get_option('dbusmenu-gtk'))
|
||||
giounix = dependency('gio-unix-2.0', required: get_option('dbusmenu-gtk'))
|
||||
jsoncpp = dependency('jsoncpp')
|
||||
sigcpp = dependency('sigc++-2.0')
|
||||
libnl = dependency('libnl-3.0', required: get_option('libnl'))
|
||||
@ -98,6 +99,7 @@ executable(
|
||||
wayland_cursor,
|
||||
gtkmm,
|
||||
dbusmenu_gtk,
|
||||
giounix,
|
||||
libnl,
|
||||
libnlgen,
|
||||
libpulse
|
||||
@ -109,7 +111,7 @@ executable(
|
||||
install_data(
|
||||
'./resources/config',
|
||||
'./resources/style.css',
|
||||
install_dir: '/etc/xdg/waybar',
|
||||
install_dir: join_paths(get_option('out'), 'etc/xdg/waybar')
|
||||
)
|
||||
|
||||
clangtidy = find_program('clang-tidy', required: false)
|
||||
|
@ -1,3 +1,4 @@
|
||||
option('libnl', type: 'feature', value: 'auto', description: 'Enable libnl support for network related features')
|
||||
option('pulseaudio', type: 'feature', value: 'auto', description: 'Enable support for pulseaudio')
|
||||
option('dbusmenu-gtk', type: 'feature', value: 'auto', description: 'Enable support for tray')
|
||||
option('dbusmenu-gtk', type: 'feature', value: 'auto', description: 'Enable support for tray')
|
||||
option('out', type: 'string', value : '/', description: 'output prefix directory')
|
||||
|
@ -2,6 +2,7 @@
|
||||
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
|
||||
<node>
|
||||
<interface name="org.kde.StatusNotifierItem">
|
||||
<annotation name="org.gtk.GDBus.C.Name" value="Item" />
|
||||
<property name="Category" type="s" access="read"/>
|
||||
<property name="Id" type="s" access="read"/>
|
||||
<property name="Title" type="s" access="read"/>
|
||||
|
@ -1,24 +1,30 @@
|
||||
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
|
||||
<node>
|
||||
<interface name="org.kde.StatusNotifierWatcher">
|
||||
<annotation name="org.gtk.GDBus.C.Name" value="Watcher" />
|
||||
|
||||
<!-- methods -->
|
||||
<method name="RegisterStatusNotifierItem">
|
||||
<arg name="service" type="s" direction="in"/>
|
||||
<annotation name="org.gtk.GDBus.C.Name" value="RegisterItem" />
|
||||
<arg name="service" type="s" direction="in"/>
|
||||
</method>
|
||||
|
||||
<method name="RegisterStatusNotifierHost">
|
||||
<arg name="service" type="s" direction="in"/>
|
||||
<annotation name="org.gtk.GDBus.C.Name" value="RegisterHost" />
|
||||
<arg name="service" type="s" direction="in"/>
|
||||
</method>
|
||||
|
||||
|
||||
<!-- properties -->
|
||||
|
||||
<property name="RegisteredStatusNotifierItems" type="as" access="read">
|
||||
<annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QStringList"/>
|
||||
<annotation name="org.gtk.GDBus.C.Name" value="RegisteredItems" />
|
||||
<annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QStringList"/>
|
||||
</property>
|
||||
|
||||
<property name="IsStatusNotifierHostRegistered" type="b" access="read"/>
|
||||
<property name="IsStatusNotifierHostRegistered" type="b" access="read">
|
||||
<annotation name="org.gtk.GDBus.C.Name" value="IsHostRegistered" />
|
||||
</property>
|
||||
|
||||
<property name="ProtocolVersion" type="i" access="read"/>
|
||||
|
||||
@ -26,17 +32,21 @@
|
||||
<!-- signals -->
|
||||
|
||||
<signal name="StatusNotifierItemRegistered">
|
||||
<arg type="s"/>
|
||||
<annotation name="org.gtk.GDBus.C.Name" value="ItemRegistered" />
|
||||
<arg type="s" direction="out" name="service" />
|
||||
</signal>
|
||||
|
||||
<signal name="StatusNotifierItemUnregistered">
|
||||
<arg type="s"/>
|
||||
<annotation name="org.gtk.GDBus.C.Name" value="ItemUnregistered" />
|
||||
<arg type="s" direction="out" name="service" />
|
||||
</signal>
|
||||
|
||||
<signal name="StatusNotifierHostRegistered">
|
||||
<annotation name="org.gtk.GDBus.C.Name" value="HostRegistered" />
|
||||
</signal>
|
||||
|
||||
<signal name="StatusNotifierHostUnregistered">
|
||||
<annotation name="org.gtk.GDBus.C.Name" value="HostUnregistered" />
|
||||
</signal>
|
||||
</interface>
|
||||
</node>
|
@ -36,14 +36,16 @@ foreach p : client_protocols
|
||||
client_protos_headers += wayland_scanner_client.process(xml)
|
||||
endforeach
|
||||
|
||||
gdbus_codegen = find_program('gdbus-codegen')
|
||||
|
||||
gdbus_code = generator(
|
||||
find_program('gdbus-codegen'),
|
||||
gdbus_codegen,
|
||||
output: '@BASENAME@.c',
|
||||
arguments: ['--c-namespace', 'Sn', '--body', '--output', '@OUTPUT@', '@INPUT@']
|
||||
)
|
||||
|
||||
gdbus_header = generator(
|
||||
find_program('gdbus-codegen'),
|
||||
gdbus_codegen,
|
||||
output: '@BASENAME@.h',
|
||||
arguments: ['--c-namespace', 'Sn', '--header', '--output', '@OUTPUT@', '@INPUT@']
|
||||
)
|
||||
@ -60,7 +62,7 @@ client_protos_headers += gdbus_header.process('./dbus-menu.xml')
|
||||
lib_client_protos = static_library(
|
||||
'client_protos',
|
||||
client_protos_src + client_protos_headers,
|
||||
dependencies: [wayland_client, gtkmm],
|
||||
dependencies: [wayland_client, gtkmm, giounix],
|
||||
include_directories: include_directories('..'),
|
||||
) # for the include directory
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
// Choose the order of the modules
|
||||
"modules-left": ["sway/workspaces", "custom/spotify"],
|
||||
"modules-center": ["sway/window"],
|
||||
"modules-right": ["pulseaudio", "network", "cpu", "memory", "battery", "clock", "tray"],
|
||||
"modules-right": ["pulseaudio", "network", "cpu", "memory", "battery", "battery#bat2", "clock", "tray"],
|
||||
// Modules configuration
|
||||
// "sway/workspaces": {
|
||||
// "disable-scroll": true,
|
||||
@ -26,6 +26,10 @@
|
||||
"sway/window": {
|
||||
"max-length": 50
|
||||
},
|
||||
"tray": {
|
||||
// "icon-size": 21,
|
||||
"spacing": 10
|
||||
},
|
||||
"clock": {
|
||||
"format-alt": "{:%Y-%m-%d}"
|
||||
},
|
||||
@ -39,6 +43,9 @@
|
||||
"format": "{capacity}% {icon}",
|
||||
"format-icons": ["", "", "", "", ""]
|
||||
},
|
||||
"battery#bat2": {
|
||||
"bat": "BAT2"
|
||||
},
|
||||
"network": {
|
||||
// "interface": "wlp2s0", // (Optional) To force the use of this interface
|
||||
"format-wifi": "{essid} ({signalStrength}%) ",
|
||||
|
@ -93,4 +93,4 @@ window#waybar {
|
||||
|
||||
#tray {
|
||||
background-color: #2980b9;
|
||||
}
|
||||
}
|
@ -4,15 +4,15 @@
|
||||
|
||||
waybar::ALabel::ALabel(const Json::Value& config, const std::string format)
|
||||
: config_(config),
|
||||
format_(config_["format"] ? config_["format"].asString() : format),
|
||||
format_(config_["format"].isString() ? config_["format"].asString() : format),
|
||||
default_format_(format_)
|
||||
{
|
||||
event_box_.add(label_);
|
||||
if (config_["max-length"]) {
|
||||
if (config_["max-length"].isUInt()) {
|
||||
label_.set_max_width_chars(config_["max-length"].asUInt());
|
||||
label_.set_ellipsize(Pango::EllipsizeMode::ELLIPSIZE_END);
|
||||
}
|
||||
if (config_["format-alt"]) {
|
||||
if (config_["format-alt"].isString()) {
|
||||
event_box_.add_events(Gdk::BUTTON_PRESS_MASK);
|
||||
event_box_.signal_button_press_event()
|
||||
.connect(sigc::mem_fun(*this, &ALabel::handleToggle));
|
||||
@ -40,7 +40,7 @@ std::string waybar::ALabel::getIcon(uint16_t percentage, const std::string& alt)
|
||||
{
|
||||
auto format_icons = config_["format-icons"];
|
||||
if (format_icons.isObject()) {
|
||||
if (!alt.empty() && format_icons[alt]) {
|
||||
if (!alt.empty() && format_icons[alt].isString()) {
|
||||
format_icons = format_icons[alt];
|
||||
} else {
|
||||
format_icons = format_icons["default"];
|
||||
|
@ -53,8 +53,8 @@ waybar::Bar::Bar(const Client& client,
|
||||
anchor |= ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP;
|
||||
}
|
||||
|
||||
auto height = config_["height"] ? config_["height"].asUInt() : height_;
|
||||
auto width = config_["width"] ? config_["width"].asUInt() : width_;
|
||||
auto height = config_["height"].isUInt() ? config_["height"].asUInt() : height_;
|
||||
auto width = config_["width"].isUInt() ? config_["width"].asUInt() : width_;
|
||||
zwlr_layer_surface_v1_set_anchor(layer_surface, anchor);
|
||||
zwlr_layer_surface_v1_set_exclusive_zone(layer_surface, height);
|
||||
zwlr_layer_surface_v1_set_size(layer_surface, width, height);
|
||||
@ -163,7 +163,7 @@ auto waybar::Bar::setupCss() -> void
|
||||
|
||||
void waybar::Bar::getModules(const Factory& factory, const std::string& pos)
|
||||
{
|
||||
if (config_[pos]) {
|
||||
if (config_[pos].isArray()) {
|
||||
for (const auto &name : config_[pos]) {
|
||||
try {
|
||||
auto module = factory.makeModule(name.asString());
|
||||
|
@ -7,43 +7,44 @@ waybar::Factory::Factory(Bar& bar, const Json::Value& config)
|
||||
waybar::IModule* waybar::Factory::makeModule(const std::string &name) const
|
||||
{
|
||||
try {
|
||||
if (name == "battery") {
|
||||
auto ref = name.substr(0, name.find("#"));
|
||||
if (ref == "battery") {
|
||||
return new waybar::modules::Battery(config_[name]);
|
||||
}
|
||||
#ifdef HAVE_SWAY
|
||||
if (name == "sway/workspaces") {
|
||||
if (ref == "sway/workspaces") {
|
||||
return new waybar::modules::sway::Workspaces(bar_, config_[name]);
|
||||
}
|
||||
if (name == "sway/window") {
|
||||
if (ref == "sway/window") {
|
||||
return new waybar::modules::sway::Window(bar_, config_[name]);
|
||||
}
|
||||
#endif
|
||||
if (name == "memory") {
|
||||
if (ref == "memory") {
|
||||
return new waybar::modules::Memory(config_[name]);
|
||||
}
|
||||
if (name == "cpu") {
|
||||
if (ref == "cpu") {
|
||||
return new waybar::modules::Cpu(config_[name]);
|
||||
}
|
||||
if (name == "clock") {
|
||||
if (ref == "clock") {
|
||||
return new waybar::modules::Clock(config_[name]);
|
||||
}
|
||||
#ifdef HAVE_DBUSMENU
|
||||
if (name == "tray") {
|
||||
if (ref == "tray") {
|
||||
return new waybar::modules::SNI::Tray(config_[name]);
|
||||
}
|
||||
#endif
|
||||
#ifdef HAVE_LIBNL
|
||||
if (name == "network") {
|
||||
if (ref == "network") {
|
||||
return new waybar::modules::Network(config_[name]);
|
||||
}
|
||||
#endif
|
||||
#ifdef HAVE_LIBPULSE
|
||||
if (name == "pulseaudio") {
|
||||
if (ref == "pulseaudio") {
|
||||
return new waybar::modules::Pulseaudio(config_[name]);
|
||||
}
|
||||
#endif
|
||||
if (name.compare(0, 7, "custom/") == 0 && name.size() > 7) {
|
||||
return new waybar::modules::Custom(name.substr(7), config_[name]);
|
||||
if (ref.compare(0, 7, "custom/") == 0 && ref.size() > 7) {
|
||||
return new waybar::modules::Custom(ref.substr(7), config_[name]);
|
||||
}
|
||||
} catch (const std::exception& e) {
|
||||
auto err = fmt::format("Disabling module \"{}\", {}", name, e.what());
|
||||
|
@ -4,16 +4,27 @@ waybar::modules::Battery::Battery(const Json::Value& config)
|
||||
: ALabel(config, "{capacity}%")
|
||||
{
|
||||
try {
|
||||
for (auto const& node : fs::directory_iterator(data_dir_)) {
|
||||
if (fs::is_directory(node) && fs::exists(node / "capacity")
|
||||
&& fs::exists(node / "status") && fs::exists(node / "uevent")) {
|
||||
batteries_.push_back(node);
|
||||
if (config_["bat"].isString()) {
|
||||
auto dir = data_dir_ / config_["bat"].asString();
|
||||
if (fs::is_directory(dir) && fs::exists(dir / "capacity")
|
||||
&& fs::exists(dir / "status") && fs::exists(dir / "uevent")) {
|
||||
batteries_.push_back(dir);
|
||||
}
|
||||
} else {
|
||||
for (auto const& node : fs::directory_iterator(data_dir_)) {
|
||||
if (fs::is_directory(node) && fs::exists(node / "capacity")
|
||||
&& fs::exists(node / "status") && fs::exists(node / "uevent")) {
|
||||
batteries_.push_back(node);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (fs::filesystem_error &e) {
|
||||
throw std::runtime_error(e.what());
|
||||
}
|
||||
if (batteries_.empty()) {
|
||||
if (config_["bat"].isString()) {
|
||||
throw std::runtime_error("No battery named " + config_["bat"].asString());
|
||||
}
|
||||
throw std::runtime_error("No batteries.");
|
||||
}
|
||||
fd_ = inotify_init1(IN_CLOEXEC);
|
||||
@ -36,12 +47,18 @@ void waybar::modules::Battery::worker()
|
||||
{
|
||||
// Trigger first values
|
||||
update();
|
||||
uint32_t interval = config_["interval"].isUInt() ? config_["interval"].asUInt() : 60;
|
||||
threadTimer_ = [this, interval] {
|
||||
thread_.sleep_for(chrono::seconds(interval));
|
||||
dp.emit();
|
||||
};
|
||||
thread_ = [this] {
|
||||
struct inotify_event event = {0};
|
||||
int nbytes = read(fd_, &event, sizeof(event));
|
||||
if (nbytes != sizeof(event)) {
|
||||
return;
|
||||
}
|
||||
threadTimer_.stop();
|
||||
dp.emit();
|
||||
};
|
||||
}
|
||||
@ -71,7 +88,7 @@ auto waybar::modules::Battery::update() -> void
|
||||
} else {
|
||||
label_.get_style_context()->remove_class("charging");
|
||||
}
|
||||
auto critical = config_["critical"] ? config_["critical"].asUInt() : 15;
|
||||
auto critical = config_["critical"].isUInt() ? config_["critical"].asUInt() : 15;
|
||||
if (capacity <= critical && !charging) {
|
||||
label_.get_style_context()->add_class("warning");
|
||||
} else {
|
||||
|
@ -4,7 +4,7 @@ waybar::modules::Clock::Clock(const Json::Value& config)
|
||||
: ALabel(config, "{:%H:%M}")
|
||||
{
|
||||
label_.set_name("clock");
|
||||
uint32_t interval = config_["interval"] ? config_["interval"].asUInt() : 60;
|
||||
uint32_t interval = config_["interval"].isUInt() ? config_["interval"].asUInt() : 60;
|
||||
thread_ = [this, interval] {
|
||||
auto now = waybar::chrono::clock::now();
|
||||
dp.emit();
|
||||
|
@ -4,7 +4,7 @@ waybar::modules::Cpu::Cpu(const Json::Value& config)
|
||||
: ALabel(config, "{}%")
|
||||
{
|
||||
label_.set_name("cpu");
|
||||
uint32_t interval = config_["interval"] ? config_["interval"].asUInt() : 10;
|
||||
uint32_t interval = config_["interval"].isUInt() ? config_["interval"].asUInt() : 10;
|
||||
thread_ = [this, interval] {
|
||||
dp.emit();
|
||||
thread_.sleep_for(chrono::seconds(interval));
|
||||
|
@ -4,10 +4,10 @@ waybar::modules::Custom::Custom(const std::string name,
|
||||
const Json::Value& config)
|
||||
: ALabel(config, "{}"), name_(name)
|
||||
{
|
||||
if (!config_["exec"]) {
|
||||
if (!config_["exec"].isString()) {
|
||||
throw std::runtime_error(name_ + " has no exec path.");
|
||||
}
|
||||
if (config_["interval"]) {
|
||||
if (config_["interval"].isUInt()) {
|
||||
delayWorker();
|
||||
} else {
|
||||
continuousWorker();
|
||||
@ -19,7 +19,7 @@ void waybar::modules::Custom::delayWorker()
|
||||
auto interval = config_["interval"].asUInt();
|
||||
thread_ = [this, interval] {
|
||||
bool can_update = true;
|
||||
if (config_["exec-if"]) {
|
||||
if (config_["exec-if"].isString()) {
|
||||
auto res = waybar::util::command::exec(config_["exec-if"].asString());
|
||||
if (res.exit_code != 0) {
|
||||
can_update = false;
|
||||
|
@ -4,7 +4,7 @@ waybar::modules::Memory::Memory(const Json::Value& config)
|
||||
: ALabel(config, "{}%")
|
||||
{
|
||||
label_.set_name("memory");
|
||||
uint32_t interval = config_["interval"] ? config_["interval"].asUInt() : 30;
|
||||
uint32_t interval = config_["interval"].isUInt() ? config_["interval"].asUInt() : 30;
|
||||
thread_ = [this, interval] {
|
||||
dp.emit();
|
||||
thread_.sleep_for(chrono::seconds(interval));
|
||||
|
@ -14,7 +14,7 @@ waybar::modules::Network::Network(const Json::Value& config)
|
||||
sizeof(nladdr_)) != 0) {
|
||||
throw std::runtime_error("Can't bind network socket");
|
||||
}
|
||||
if (config_["interface"]) {
|
||||
if (config_["interface"].isString()) {
|
||||
ifid_ = if_nametoindex(config_["interface"].asCString());
|
||||
ifname_ = config_["interface"].asString();
|
||||
if (ifid_ <= 0) {
|
||||
@ -56,7 +56,7 @@ waybar::modules::Network::Network(const Json::Value& config)
|
||||
}
|
||||
}
|
||||
}
|
||||
if (ifid_ <= 0 && !config_["interface"]) {
|
||||
if (ifid_ <= 0 && !config_["interface"].isString()) {
|
||||
// Need to wait before get external interface
|
||||
thread_.sleep_for(std::chrono::seconds(1));
|
||||
ifid_ = getExternalInterface();
|
||||
@ -84,15 +84,15 @@ auto waybar::modules::Network::update() -> void
|
||||
{
|
||||
auto format = format_;
|
||||
if (ifid_ <= 0) {
|
||||
format = config_["format-disconnected"]
|
||||
format = config_["format-disconnected"].isString()
|
||||
? config_["format-disconnected"].asString() : format;
|
||||
label_.get_style_context()->add_class("disconnected");
|
||||
} else {
|
||||
if (essid_.empty()) {
|
||||
format = config_["format-ethernet"]
|
||||
format = config_["format-ethernet"].isString()
|
||||
? config_["format-ethernet"].asString() : format;
|
||||
} else {
|
||||
format = config_["format-wifi"]
|
||||
format = config_["format-wifi"].isString()
|
||||
? config_["format-wifi"].asString() : format;
|
||||
}
|
||||
label_.get_style_context()->remove_class("disconnected");
|
||||
|
@ -86,10 +86,10 @@ void waybar::modules::Pulseaudio::sinkInfoCb(pa_context* /*context*/,
|
||||
float volume = static_cast<float>(pa_cvolume_avg(&(i->volume)))
|
||||
/ float{PA_VOLUME_NORM};
|
||||
pa->sink_idx_ = i->index;
|
||||
pa->volume_ = volume * 100.0f;
|
||||
pa->volume_ = std::round(volume * 100.0f);
|
||||
pa->muted_ = i->mute != 0;
|
||||
pa->desc_ = i->description;
|
||||
pa->port_name_ = i->active_port->name;
|
||||
pa->port_name_ = i->active_port ? i->active_port->name : "Unknown";
|
||||
pa->dp.emit();
|
||||
}
|
||||
}
|
||||
@ -131,10 +131,10 @@ auto waybar::modules::Pulseaudio::update() -> void
|
||||
auto format = format_;
|
||||
if (muted_) {
|
||||
format =
|
||||
config_["format-muted"] ? config_["format-muted"].asString() : format;
|
||||
config_["format-muted"].isString() ? config_["format-muted"].asString() : format;
|
||||
label_.get_style_context()->add_class("muted");
|
||||
} else if (port_name_.find("a2dp_sink") != std::string::npos) {
|
||||
format = config_["format-bluetooth"]
|
||||
format = config_["format-bluetooth"].isString()
|
||||
? config_["format-bluetooth"].asString() : format;
|
||||
label_.get_style_context()->add_class("bluetooth");
|
||||
} else {
|
||||
|
@ -4,8 +4,8 @@
|
||||
|
||||
using namespace waybar::modules::SNI;
|
||||
|
||||
Host::Host(Glib::Dispatcher* dp)
|
||||
: dp_(dp)
|
||||
Host::Host(Glib::Dispatcher* dp, const Json::Value &config)
|
||||
: dp_(dp), config_(config)
|
||||
{
|
||||
GBusNameOwnerFlags flags = static_cast<GBusNameOwnerFlags>(
|
||||
G_BUS_NAME_OWNER_FLAGS_NONE);
|
||||
@ -32,10 +32,10 @@ void Host::nameAppeared(GDBusConnection* connection,
|
||||
{
|
||||
auto host = static_cast<SNI::Host *>(data);
|
||||
if (host->cancellable_ != nullptr) {
|
||||
std::cout << "WTF" << std::endl;
|
||||
// TODO
|
||||
}
|
||||
host->cancellable_ = g_cancellable_new();
|
||||
sn_org_kde_status_notifier_watcher_proxy_new(
|
||||
sn_watcher_proxy_new(
|
||||
connection,
|
||||
G_DBUS_PROXY_FLAGS_NONE,
|
||||
"org.kde.StatusNotifierWatcher",
|
||||
@ -57,8 +57,7 @@ void Host::proxyReady(GObject* src, GAsyncResult* res,
|
||||
gpointer data)
|
||||
{
|
||||
GError* error = nullptr;
|
||||
SnOrgKdeStatusNotifierWatcher* watcher =
|
||||
sn_org_kde_status_notifier_watcher_proxy_new_finish(res, &error);
|
||||
SnWatcher* watcher = sn_watcher_proxy_new_finish(res, &error);
|
||||
if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
|
||||
std::cerr << error->message << std::endl;
|
||||
g_error_free(error);
|
||||
@ -71,7 +70,7 @@ void Host::proxyReady(GObject* src, GAsyncResult* res,
|
||||
g_error_free(error);
|
||||
return;
|
||||
}
|
||||
sn_org_kde_status_notifier_watcher_call_register_status_notifier_host(
|
||||
sn_watcher_call_register_host(
|
||||
host->watcher_, host->object_path_.c_str(), host->cancellable_,
|
||||
&Host::registerHost, data);
|
||||
}
|
||||
@ -80,8 +79,7 @@ void Host::registerHost(GObject* src, GAsyncResult* res,
|
||||
gpointer data)
|
||||
{
|
||||
GError* error = nullptr;
|
||||
sn_org_kde_status_notifier_watcher_call_register_status_notifier_host_finish(
|
||||
SN_ORG_KDE_STATUS_NOTIFIER_WATCHER(src), res, &error);
|
||||
sn_watcher_call_register_host_finish(SN_WATCHER(src), res, &error);
|
||||
if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
|
||||
std::cerr << error->message << std::endl;
|
||||
g_error_free(error);
|
||||
@ -93,12 +91,11 @@ void Host::registerHost(GObject* src, GAsyncResult* res,
|
||||
g_error_free(error);
|
||||
return;
|
||||
}
|
||||
g_signal_connect(host->watcher_, "status-notifier-item-registered",
|
||||
g_signal_connect(host->watcher_, "item-registered",
|
||||
G_CALLBACK(&Host::itemRegistered), data);
|
||||
g_signal_connect(host->watcher_, "status-notifier-item-unregistered",
|
||||
g_signal_connect(host->watcher_, "item-unregistered",
|
||||
G_CALLBACK(&Host::itemUnregistered), data);
|
||||
auto items =
|
||||
sn_org_kde_status_notifier_watcher_dup_registered_status_notifier_items(host->watcher_);
|
||||
auto items = sn_watcher_dup_registered_items(host->watcher_);
|
||||
if (items) {
|
||||
for (uint32_t i = 0; items[i] != nullptr; i += 1) {
|
||||
host->addRegisteredItem(items[i]);
|
||||
@ -108,22 +105,20 @@ void Host::registerHost(GObject* src, GAsyncResult* res,
|
||||
}
|
||||
|
||||
void Host::itemRegistered(
|
||||
SnOrgKdeStatusNotifierWatcher* watcher, const gchar* service, gpointer data)
|
||||
SnWatcher* watcher, const gchar* service, gpointer data)
|
||||
{
|
||||
std::cout << "Item registered" << std::endl;
|
||||
auto host = static_cast<SNI::Host *>(data);
|
||||
host->addRegisteredItem(service);
|
||||
}
|
||||
|
||||
void Host::itemUnregistered(
|
||||
SnOrgKdeStatusNotifierWatcher* watcher, const gchar* service, gpointer data)
|
||||
SnWatcher* watcher, const gchar* service, gpointer data)
|
||||
{
|
||||
auto host = static_cast<SNI::Host *>(data);
|
||||
auto [bus_name, object_path] = host->getBusNameAndObjectPath(service);
|
||||
for (auto it = host->items.begin(); it != host->items.end(); ++it) {
|
||||
if (it->bus_name == bus_name && it->object_path == object_path) {
|
||||
host->items.erase(it);
|
||||
std::cout << "Item Unregistered" << std::endl;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -151,5 +146,5 @@ std::tuple<std::string, std::string> Host::getBusNameAndObjectPath(
|
||||
void Host::addRegisteredItem(const gchar* service)
|
||||
{
|
||||
auto [bus_name, object_path] = getBusNameAndObjectPath(service);
|
||||
items.emplace_back(bus_name, object_path, dp_);
|
||||
items.emplace_back(bus_name, object_path, dp_, config_);
|
||||
}
|
||||
|
@ -4,15 +4,19 @@
|
||||
#include <libdbusmenu-gtk/dbusmenu-gtk.h>
|
||||
|
||||
waybar::modules::SNI::Item::Item(std::string bn, std::string op,
|
||||
Glib::Dispatcher *dp)
|
||||
Glib::Dispatcher *dp, Json::Value config)
|
||||
: bus_name(bn), object_path(op), event_box(), icon_size(16),
|
||||
effective_icon_size(0), image(Gtk::manage(new Gtk::Image())), dp_(dp) {
|
||||
effective_icon_size(0), image(Gtk::manage(new Gtk::Image())),
|
||||
dp_(dp), config_(config) {
|
||||
if (config_["icon-size"].isUInt()) {
|
||||
icon_size = config_["icon-size"].asUInt();
|
||||
}
|
||||
event_box.add(*image);
|
||||
event_box.add_events(Gdk::BUTTON_PRESS_MASK);
|
||||
event_box.signal_button_press_event().connect(
|
||||
sigc::mem_fun(*this, &Item::handleClick));
|
||||
cancellable_ = g_cancellable_new();
|
||||
sn_org_kde_status_notifier_item_proxy_new_for_bus(
|
||||
sn_item_proxy_new_for_bus(
|
||||
G_BUS_TYPE_SESSION, G_DBUS_PROXY_FLAGS_NONE, bus_name.c_str(),
|
||||
object_path.c_str(), cancellable_, &Item::proxyReady, this);
|
||||
}
|
||||
@ -20,8 +24,7 @@ waybar::modules::SNI::Item::Item(std::string bn, std::string op,
|
||||
void waybar::modules::SNI::Item::proxyReady(GObject *obj, GAsyncResult *res,
|
||||
gpointer data) {
|
||||
GError *error = nullptr;
|
||||
SnOrgKdeStatusNotifierItem *proxy =
|
||||
sn_org_kde_status_notifier_item_proxy_new_for_bus_finish(res, &error);
|
||||
SnItem *proxy = sn_item_proxy_new_for_bus_finish(res, &error);
|
||||
if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
|
||||
g_error_free(error);
|
||||
return;
|
||||
@ -113,6 +116,7 @@ void waybar::modules::SNI::Item::getAll(GObject *obj, GAsyncResult *res,
|
||||
item->icon_theme_path.c_str());
|
||||
}
|
||||
item->updateImage();
|
||||
item->updateMenu();
|
||||
item->dp_->emit();
|
||||
// TODO: handle change
|
||||
}
|
||||
@ -165,45 +169,50 @@ waybar::modules::SNI::Item::extractPixBuf(GVariant *variant) {
|
||||
return Glib::RefPtr<Gdk::Pixbuf>{};
|
||||
}
|
||||
|
||||
void waybar::modules::SNI::Item::updateMenu()
|
||||
{
|
||||
event_box.set_tooltip_text(title);
|
||||
if (!menu.empty()) {
|
||||
auto *dbmenu = dbusmenu_gtkmenu_new(bus_name.data(), menu.data());
|
||||
if (dbmenu) {
|
||||
gtk_menu = Glib::wrap(GTK_MENU(dbmenu), false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void waybar::modules::SNI::Item::updateImage()
|
||||
{
|
||||
image->set_from_icon_name("image-missing", Gtk::ICON_SIZE_MENU);
|
||||
image->set_pixel_size(icon_size);
|
||||
if (!icon_name.empty()) {
|
||||
auto pixbuf = getIconByName(icon_name, icon_size);
|
||||
if (pixbuf->gobj() == nullptr) {
|
||||
try {
|
||||
// Try to find icons specified by path and filename
|
||||
try {
|
||||
pixbuf = Gdk::Pixbuf::create_from_file(icon_name);
|
||||
if (std::filesystem::exists(icon_name)) {
|
||||
auto pixbuf = Gdk::Pixbuf::create_from_file(icon_name);
|
||||
if (pixbuf->gobj() != nullptr) {
|
||||
// An icon specified by path and filename may be the wrong size for
|
||||
// the tray
|
||||
pixbuf->scale_simple(icon_size - 2, icon_size - 2,
|
||||
Gdk::InterpType::INTERP_BILINEAR);
|
||||
pixbuf = pixbuf->scale_simple(icon_size, icon_size,
|
||||
Gdk::InterpType::INTERP_BILINEAR);
|
||||
image->set(pixbuf);
|
||||
}
|
||||
} catch (Glib::Error &e) {
|
||||
std::cerr << "Exception: " << e.what() << std::endl;
|
||||
pixbuf = getIconByName("image-missing", icon_size);
|
||||
} else {
|
||||
image->set(getIconByName(icon_name, icon_size));
|
||||
}
|
||||
} catch (Glib::Error &e) {
|
||||
std::cerr << "Exception: " << e.what() << std::endl;
|
||||
}
|
||||
if (pixbuf->gobj() == nullptr) {
|
||||
pixbuf = getIconByName("image-missing", icon_size);
|
||||
}
|
||||
image->set(pixbuf);
|
||||
} else if (icon_pixmap) {
|
||||
// An icon extracted may be the wrong size for the tray
|
||||
icon_pixmap = icon_pixmap->scale_simple(icon_size, icon_size,
|
||||
Gdk::InterpType::INTERP_BILINEAR);
|
||||
image->set(icon_pixmap);
|
||||
} else {
|
||||
image->set_from_icon_name("image-missing", Gtk::ICON_SIZE_MENU);
|
||||
image->set_pixel_size(icon_size);
|
||||
}
|
||||
if (!menu.empty()) {
|
||||
auto *dbmenu = dbusmenu_gtkmenu_new(bus_name.data(), menu.data());
|
||||
if (dbmenu)
|
||||
gtk_menu = Glib::wrap(GTK_MENU(dbmenu), false);
|
||||
}
|
||||
}
|
||||
|
||||
Glib::RefPtr<Gdk::Pixbuf>
|
||||
waybar::modules::SNI::Item::getIconByName(std::string name, int request_size) {
|
||||
int icon_size = 0;
|
||||
int tmp_size = 0;
|
||||
Glib::RefPtr<Gtk::IconTheme> icon_theme = Gtk::IconTheme::get_default();
|
||||
icon_theme->rescan_if_needed();
|
||||
auto sizes = icon_theme->get_icon_sizes(name.c_str());
|
||||
@ -211,32 +220,30 @@ waybar::modules::SNI::Item::getIconByName(std::string name, int request_size) {
|
||||
for (auto const &size : sizes) {
|
||||
// -1 == scalable
|
||||
if (size == request_size || size == -1) {
|
||||
icon_size = request_size;
|
||||
tmp_size = request_size;
|
||||
break;
|
||||
} else if (size < request_size || size > icon_size) {
|
||||
icon_size = size;
|
||||
} else if (size < request_size || size > tmp_size) {
|
||||
tmp_size = size;
|
||||
}
|
||||
}
|
||||
if (icon_size == 0) {
|
||||
icon_size = request_size;
|
||||
if (tmp_size == 0) {
|
||||
tmp_size = request_size;
|
||||
}
|
||||
return icon_theme->load_icon(name.c_str(), icon_size,
|
||||
return icon_theme->load_icon(name.c_str(), tmp_size,
|
||||
Gtk::IconLookupFlags::ICON_LOOKUP_FORCE_SIZE);
|
||||
}
|
||||
|
||||
void waybar::modules::SNI::Item::handleActivate(GObject *src, GAsyncResult *res,
|
||||
gpointer data) {
|
||||
auto item = static_cast<SNI::Item *>(data);
|
||||
sn_org_kde_status_notifier_item_call_activate_finish(item->proxy_, res,
|
||||
nullptr);
|
||||
sn_item_call_activate_finish(item->proxy_, res, nullptr);
|
||||
}
|
||||
|
||||
void waybar::modules::SNI::Item::handleSecondaryActivate(GObject *src,
|
||||
GAsyncResult *res,
|
||||
gpointer data) {
|
||||
auto item = static_cast<SNI::Item *>(data);
|
||||
sn_org_kde_status_notifier_item_call_secondary_activate_finish(item->proxy_,
|
||||
res, nullptr);
|
||||
sn_item_call_secondary_activate_finish(item->proxy_, res, nullptr);
|
||||
}
|
||||
|
||||
bool waybar::modules::SNI::Item::handleClick(GdkEventButton *const &ev) {
|
||||
@ -247,11 +254,11 @@ bool waybar::modules::SNI::Item::handleClick(GdkEventButton *const &ev) {
|
||||
}
|
||||
gtk_menu->popup(ev->button, ev->time);
|
||||
} else {
|
||||
sn_org_kde_status_notifier_item_call_activate(
|
||||
sn_item_call_activate(
|
||||
proxy_, ev->x, ev->y, nullptr, &Item::handleActivate, this);
|
||||
}
|
||||
} else if (ev->type == GDK_2BUTTON_PRESS) {
|
||||
sn_org_kde_status_notifier_item_call_secondary_activate(
|
||||
sn_item_call_secondary_activate(
|
||||
proxy_, ev->x, ev->y, nullptr, &Item::handleSecondaryActivate, this);
|
||||
} else {
|
||||
return false;
|
||||
|
@ -12,7 +12,8 @@ Watcher::Watcher()
|
||||
bus_name_id_ = g_bus_own_name(G_BUS_TYPE_SESSION,
|
||||
"org.kde.StatusNotifierWatcher", flags,
|
||||
&Watcher::busAcquired, nullptr, nullptr, this, nullptr);
|
||||
watcher_ = sn_org_kde_status_notifier_watcher_skeleton_new();
|
||||
watcher_ = sn_watcher_skeleton_new();
|
||||
sn_watcher_set_protocol_version(watcher_, 1);
|
||||
}
|
||||
|
||||
Watcher::~Watcher()
|
||||
@ -31,16 +32,10 @@ void Watcher::busAcquired(GDBusConnection* connection, const gchar* name,
|
||||
g_error_free(error);
|
||||
return;
|
||||
}
|
||||
g_signal_connect_swapped(host->watcher_,
|
||||
"handle-register-status-notifier-item",
|
||||
g_signal_connect_swapped(host->watcher_, "handle-register-item",
|
||||
G_CALLBACK(&Watcher::handleRegisterItem), data);
|
||||
g_signal_connect_swapped(host->watcher_,
|
||||
"handle-register-status-notifier-host",
|
||||
g_signal_connect_swapped(host->watcher_, "handle-register-host",
|
||||
G_CALLBACK(&Watcher::handleRegisterHost), data);
|
||||
sn_org_kde_status_notifier_watcher_set_protocol_version(host->watcher_, 0);
|
||||
sn_org_kde_status_notifier_watcher_set_is_status_notifier_host_registered(
|
||||
host->watcher_, TRUE);
|
||||
std::cout << "Bus aquired" << std::endl;
|
||||
}
|
||||
|
||||
gboolean Watcher::handleRegisterHost(Watcher* obj,
|
||||
@ -67,15 +62,11 @@ gboolean Watcher::handleRegisterHost(Watcher* obj,
|
||||
}
|
||||
watch = gfWatchNew(GF_WATCH_TYPE_HOST, service, bus_name, object_path, obj);
|
||||
obj->hosts_ = g_slist_prepend(obj->hosts_, watch);
|
||||
sn_org_kde_status_notifier_watcher_set_is_status_notifier_host_registered(
|
||||
obj->watcher_, TRUE);
|
||||
if (g_slist_length(obj->hosts_)) {
|
||||
sn_org_kde_status_notifier_watcher_emit_status_notifier_host_registered(
|
||||
obj->watcher_);
|
||||
if (!sn_watcher_get_is_host_registered(obj->watcher_)) {
|
||||
sn_watcher_set_is_host_registered(obj->watcher_, TRUE);
|
||||
sn_watcher_emit_host_registered(obj->watcher_);
|
||||
}
|
||||
sn_org_kde_status_notifier_watcher_complete_register_status_notifier_host(
|
||||
obj->watcher_, invocation);
|
||||
std::cout << "Host registered: " << bus_name << std::endl;
|
||||
sn_watcher_complete_register_host(obj->watcher_, invocation);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -98,19 +89,16 @@ gboolean Watcher::handleRegisterItem(Watcher* obj,
|
||||
if (watch != nullptr) {
|
||||
g_warning("Status Notifier Item with bus name '%s' and object path '%s' is already registered",
|
||||
bus_name, object_path);
|
||||
sn_org_kde_status_notifier_watcher_complete_register_status_notifier_item(
|
||||
obj->watcher_, invocation);
|
||||
sn_watcher_complete_register_item(obj->watcher_, invocation);
|
||||
return TRUE;
|
||||
}
|
||||
watch = gfWatchNew(GF_WATCH_TYPE_ITEM, service, bus_name, object_path, obj);
|
||||
obj->items_ = g_slist_prepend(obj->items_, watch);
|
||||
obj->updateRegisteredItems(obj->watcher_);
|
||||
gchar* tmp = g_strdup_printf("%s%s", bus_name, object_path);
|
||||
sn_org_kde_status_notifier_watcher_emit_status_notifier_item_registered(
|
||||
obj->watcher_, tmp);
|
||||
sn_watcher_emit_item_registered(obj->watcher_, tmp);
|
||||
g_free(tmp);
|
||||
sn_org_kde_status_notifier_watcher_complete_register_status_notifier_item(
|
||||
obj->watcher_, invocation);
|
||||
sn_watcher_complete_register_item(obj->watcher_, invocation);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -149,22 +137,19 @@ void Watcher::nameVanished(GDBusConnection* connection, const char* name,
|
||||
if (watch->type == GF_WATCH_TYPE_HOST) {
|
||||
watch->watcher->hosts_ = g_slist_remove(watch->watcher->hosts_, watch);
|
||||
if (watch->watcher->hosts_ == nullptr) {
|
||||
sn_org_kde_status_notifier_watcher_set_is_status_notifier_host_registered(
|
||||
watch->watcher->watcher_, FALSE);
|
||||
sn_org_kde_status_notifier_watcher_emit_status_notifier_host_registered(
|
||||
watch->watcher->watcher_);
|
||||
sn_watcher_set_is_host_registered(watch->watcher->watcher_, FALSE);
|
||||
sn_watcher_emit_host_registered(watch->watcher->watcher_);
|
||||
}
|
||||
} else if (watch->type == GF_WATCH_TYPE_ITEM) {
|
||||
watch->watcher->items_ = g_slist_remove(watch->watcher->items_, watch);
|
||||
watch->watcher->updateRegisteredItems(watch->watcher->watcher_);
|
||||
gchar* tmp = g_strdup_printf("%s%s", watch->bus_name, watch->object_path);
|
||||
sn_org_kde_status_notifier_watcher_emit_status_notifier_item_unregistered(
|
||||
watch->watcher->watcher_, tmp);
|
||||
sn_watcher_emit_item_unregistered(watch->watcher->watcher_, tmp);
|
||||
g_free(tmp);
|
||||
}
|
||||
}
|
||||
|
||||
void Watcher::updateRegisteredItems(SnOrgKdeStatusNotifierWatcher* obj)
|
||||
void Watcher::updateRegisteredItems(SnWatcher* obj)
|
||||
{
|
||||
GVariantBuilder builder;
|
||||
g_variant_builder_init(&builder, G_VARIANT_TYPE("as"));
|
||||
@ -176,8 +161,7 @@ void Watcher::updateRegisteredItems(SnOrgKdeStatusNotifierWatcher* obj)
|
||||
}
|
||||
GVariant* variant = g_variant_builder_end(&builder);
|
||||
const gchar** items = g_variant_get_strv(variant, nullptr);
|
||||
sn_org_kde_status_notifier_watcher_set_registered_status_notifier_items(
|
||||
obj, items);
|
||||
sn_watcher_set_registered_items(obj, items);
|
||||
g_variant_unref(variant);
|
||||
g_free(items);
|
||||
}
|
@ -3,11 +3,17 @@
|
||||
#include <iostream>
|
||||
|
||||
waybar::modules::SNI::Tray::Tray(const Json::Value &config)
|
||||
: config_(config), watcher_(), host_(&dp) {}
|
||||
: config_(config), watcher_(), host_(&dp, config)
|
||||
{
|
||||
if (config_["spacing"].isUInt()) {
|
||||
box_.set_spacing(config_["spacing"].asUInt());
|
||||
}
|
||||
}
|
||||
|
||||
auto waybar::modules::SNI::Tray::update() -> void {
|
||||
auto childrens = box_.get_children();
|
||||
childrens.erase(childrens.begin(), childrens.end());
|
||||
for (auto &item : host_.items) {
|
||||
item.event_box.set_tooltip_text(item.title);
|
||||
box_.pack_start(item.event_box);
|
||||
}
|
||||
if (box_.get_children().size() > 0) {
|
||||
@ -18,4 +24,6 @@ auto waybar::modules::SNI::Tray::update() -> void {
|
||||
}
|
||||
}
|
||||
|
||||
waybar::modules::SNI::Tray::operator Gtk::Widget &() { return box_; }
|
||||
waybar::modules::SNI::Tray::operator Gtk::Widget &() {
|
||||
return box_;
|
||||
}
|
||||
|
@ -79,7 +79,7 @@ auto waybar::modules::sway::Workspaces::update() -> void
|
||||
box_.reorder_child(button, node["num"].asInt());
|
||||
}
|
||||
auto icon = getIcon(node["name"].asString(), node);
|
||||
if (config_["format"]) {
|
||||
if (config_["format"].isString()) {
|
||||
auto format = config_["format"].asString();
|
||||
button.set_label(fmt::format(format, fmt::arg("icon", icon),
|
||||
fmt::arg("name", node["name"].asString()),
|
||||
@ -98,7 +98,7 @@ auto waybar::modules::sway::Workspaces::update() -> void
|
||||
void waybar::modules::sway::Workspaces::addWorkspace(Json::Value node)
|
||||
{
|
||||
auto icon = getIcon(node["name"].asString(), node);
|
||||
auto format = config_["format"]
|
||||
auto format = config_["format"].isString()
|
||||
? fmt::format(config_["format"].asString(), fmt::arg("icon", icon),
|
||||
fmt::arg("name", node["name"].asString()),
|
||||
fmt::arg("index", node["num"].asString()))
|
||||
@ -141,10 +141,10 @@ std::string waybar::modules::sway::Workspaces::getIcon(std::string name,
|
||||
name, "urgent", "focused", "visible", "default"};
|
||||
for (auto const& key : keys) {
|
||||
if (key == "focused" || key == "visible" || key == "urgent") {
|
||||
if (config_["format-icons"][key] && node[key].asBool()) {
|
||||
if (config_["format-icons"][key].isString() && node[key].asBool()) {
|
||||
return config_["format-icons"][key].asString();
|
||||
}
|
||||
} else if (config_["format-icons"][key]) {
|
||||
} else if (config_["format-icons"][key].isString()) {
|
||||
return config_["format-icons"][key].asString();
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user