Merge branch 'master' of https://github.com/Alexays/Waybar into pr/anakael/add-name-to-taskbar
commit
12c42fc6e4
|
@ -1,4 +1,4 @@
|
||||||
# Waybar [![Travis](https://travis-ci.org/Alexays/Waybar.svg?branch=master)](https://travis-ci.org/Alexays/Waybar) [![Licence](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) [![Paypal Donate](https://img.shields.io/badge/Donate-Paypal-2244dd.svg)](https://paypal.me/ARouillard)<br>![Waybar](https://raw.githubusercontent.com/alexays/waybar/master/preview-2.png)
|
# Waybar [![Licence](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) [![Paypal Donate](https://img.shields.io/badge/Donate-Paypal-2244dd.svg)](https://paypal.me/ARouillard)<br>![Waybar](https://raw.githubusercontent.com/alexays/waybar/master/preview-2.png)
|
||||||
|
|
||||||
> Highly customizable Wayland bar for Sway and Wlroots based compositors.<br>
|
> Highly customizable Wayland bar for Sway and Wlroots based compositors.<br>
|
||||||
> Available in Arch [community](https://www.archlinux.org/packages/community/x86_64/waybar/) or
|
> Available in Arch [community](https://www.archlinux.org/packages/community/x86_64/waybar/) or
|
||||||
|
|
|
@ -18,6 +18,7 @@ class Tags : public waybar::AModule {
|
||||||
// Handlers for wayland events
|
// Handlers for wayland events
|
||||||
void handle_focused_tags(uint32_t tags);
|
void handle_focused_tags(uint32_t tags);
|
||||||
void handle_view_tags(struct wl_array *tags);
|
void handle_view_tags(struct wl_array *tags);
|
||||||
|
void handle_urgent_tags(uint32_t tags);
|
||||||
|
|
||||||
struct zriver_status_manager_v1 *status_manager_;
|
struct zriver_status_manager_v1 *status_manager_;
|
||||||
|
|
||||||
|
|
|
@ -5,13 +5,15 @@
|
||||||
#include <glibmm/refptr.h>
|
#include <glibmm/refptr.h>
|
||||||
#include <json/json.h>
|
#include <json/json.h>
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
|
#include "bar.hpp"
|
||||||
#include "modules/sni/item.hpp"
|
#include "modules/sni/item.hpp"
|
||||||
|
|
||||||
namespace waybar::modules::SNI {
|
namespace waybar::modules::SNI {
|
||||||
|
|
||||||
class Host {
|
class Host {
|
||||||
public:
|
public:
|
||||||
Host(const std::size_t id, const Json::Value&, const std::function<void(std::unique_ptr<Item>&)>&,
|
Host(const std::size_t id, const Json::Value&, const Bar&,
|
||||||
|
const std::function<void(std::unique_ptr<Item>&)>&,
|
||||||
const std::function<void(std::unique_ptr<Item>&)>&);
|
const std::function<void(std::unique_ptr<Item>&)>&);
|
||||||
~Host();
|
~Host();
|
||||||
|
|
||||||
|
@ -36,6 +38,7 @@ class Host {
|
||||||
GCancellable* cancellable_ = nullptr;
|
GCancellable* cancellable_ = nullptr;
|
||||||
SnWatcher* watcher_ = nullptr;
|
SnWatcher* watcher_ = nullptr;
|
||||||
const Json::Value& config_;
|
const Json::Value& config_;
|
||||||
|
const Bar& bar_;
|
||||||
const std::function<void(std::unique_ptr<Item>&)> on_add_;
|
const std::function<void(std::unique_ptr<Item>&)> on_add_;
|
||||||
const std::function<void(std::unique_ptr<Item>&)> on_remove_;
|
const std::function<void(std::unique_ptr<Item>&)> on_remove_;
|
||||||
};
|
};
|
||||||
|
|
|
@ -14,6 +14,8 @@
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <string_view>
|
#include <string_view>
|
||||||
|
|
||||||
|
#include "bar.hpp"
|
||||||
|
|
||||||
namespace waybar::modules::SNI {
|
namespace waybar::modules::SNI {
|
||||||
|
|
||||||
struct ToolTip {
|
struct ToolTip {
|
||||||
|
@ -23,7 +25,7 @@ struct ToolTip {
|
||||||
|
|
||||||
class Item : public sigc::trackable {
|
class Item : public sigc::trackable {
|
||||||
public:
|
public:
|
||||||
Item(const std::string&, const std::string&, const Json::Value&);
|
Item(const std::string&, const std::string&, const Json::Value&, const Bar&);
|
||||||
~Item() = default;
|
~Item() = default;
|
||||||
|
|
||||||
std::string bus_name;
|
std::string bus_name;
|
||||||
|
@ -56,6 +58,7 @@ class Item : public sigc::trackable {
|
||||||
bool item_is_menu = true;
|
bool item_is_menu = true;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void onConfigure(GdkEventConfigure* ev);
|
||||||
void proxyReady(Glib::RefPtr<Gio::AsyncResult>& result);
|
void proxyReady(Glib::RefPtr<Gio::AsyncResult>& result);
|
||||||
void setProperty(const Glib::ustring& name, Glib::VariantBase& value);
|
void setProperty(const Glib::ustring& name, Glib::VariantBase& value);
|
||||||
void setStatus(const Glib::ustring& value);
|
void setStatus(const Glib::ustring& value);
|
||||||
|
|
|
@ -21,10 +21,17 @@ class Language : public ALabel, public sigc::trackable {
|
||||||
auto update() -> void;
|
auto update() -> void;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
enum class DispayedShortFlag {
|
||||||
|
None = 0,
|
||||||
|
ShortName = 1,
|
||||||
|
ShortDescription = 1 << 1
|
||||||
|
};
|
||||||
|
|
||||||
struct Layout {
|
struct Layout {
|
||||||
std::string full_name;
|
std::string full_name;
|
||||||
std::string short_name;
|
std::string short_name;
|
||||||
std::string variant;
|
std::string variant;
|
||||||
|
std::string short_description;
|
||||||
};
|
};
|
||||||
|
|
||||||
class XKBContext {
|
class XKBContext {
|
||||||
|
@ -36,6 +43,7 @@ class Language : public ALabel, public sigc::trackable {
|
||||||
rxkb_context* context_ = nullptr;
|
rxkb_context* context_ = nullptr;
|
||||||
rxkb_layout* xkb_layout_ = nullptr;
|
rxkb_layout* xkb_layout_ = nullptr;
|
||||||
Layout* layout_ = nullptr;
|
Layout* layout_ = nullptr;
|
||||||
|
std::map<std::string, rxkb_layout*> base_layouts_by_name_;
|
||||||
};
|
};
|
||||||
|
|
||||||
void onEvent(const struct Ipc::ipc_response&);
|
void onEvent(const struct Ipc::ipc_response&);
|
||||||
|
@ -50,8 +58,8 @@ class Language : public ALabel, public sigc::trackable {
|
||||||
Layout layout_;
|
Layout layout_;
|
||||||
std::string tooltip_format_ = "";
|
std::string tooltip_format_ = "";
|
||||||
std::map<std::string, Layout> layouts_map_;
|
std::map<std::string, Layout> layouts_map_;
|
||||||
XKBContext xkb_context_;
|
|
||||||
bool is_variant_displayed;
|
bool is_variant_displayed;
|
||||||
|
std::byte displayed_short_flag = static_cast<std::byte>(DispayedShortFlag::None);
|
||||||
|
|
||||||
util::JsonParser parser_;
|
util::JsonParser parser_;
|
||||||
std::mutex mutex_;
|
std::mutex mutex_;
|
||||||
|
|
|
@ -20,6 +20,11 @@ The *cpu* module displays the current cpu utilization.
|
||||||
default: {usage}% ++
|
default: {usage}% ++
|
||||||
The format, how information should be displayed. On {} data gets inserted.
|
The format, how information should be displayed. On {} data gets inserted.
|
||||||
|
|
||||||
|
*format-icons*: ++
|
||||||
|
typeof: array/object ++
|
||||||
|
Based on the current usage, the corresponding icon gets selected. ++
|
||||||
|
The order is *low* to *high*. Or by the state if it is an object.
|
||||||
|
|
||||||
*max-length*: ++
|
*max-length*: ++
|
||||||
typeof: integer ++
|
typeof: integer ++
|
||||||
The maximum length in character the module should display.
|
The maximum length in character the module should display.
|
||||||
|
|
|
@ -22,6 +22,11 @@ Addressed by *memory*
|
||||||
default: {percentage}% ++
|
default: {percentage}% ++
|
||||||
The format, how information should be displayed.
|
The format, how information should be displayed.
|
||||||
|
|
||||||
|
*format-icons*: ++
|
||||||
|
typeof: array/object ++
|
||||||
|
Based on the current percentage, the corresponding icon gets selected. ++
|
||||||
|
The order is *low* to *high*. Or by the state if it is an object.
|
||||||
|
|
||||||
*rotate*: ++
|
*rotate*: ++
|
||||||
typeof: integer ++
|
typeof: integer ++
|
||||||
Positive value to rotate the text label.
|
Positive value to rotate the text label.
|
||||||
|
|
|
@ -15,7 +15,7 @@ Addressed by *river/tags*
|
||||||
*num-tags*: ++
|
*num-tags*: ++
|
||||||
typeof: uint ++
|
typeof: uint ++
|
||||||
default: 9 ++
|
default: 9 ++
|
||||||
The number of tags that should be displayed.
|
The number of tags that should be displayed. Max 32.
|
||||||
|
|
||||||
*tag-labels*: ++
|
*tag-labels*: ++
|
||||||
typeof: array ++
|
typeof: array ++
|
||||||
|
@ -34,8 +34,10 @@ Addressed by *river/tags*
|
||||||
- *#tags button*
|
- *#tags button*
|
||||||
- *#tags button.occupied*
|
- *#tags button.occupied*
|
||||||
- *#tags button.focused*
|
- *#tags button.focused*
|
||||||
|
- *#tags button.urgent*
|
||||||
|
|
||||||
Note that a tag can be both occupied and focused at the same time.
|
Note that occupied/focused/urgent status may overlap. That is, a tag may be
|
||||||
|
both occupied and focused at the same time.
|
||||||
|
|
||||||
# SEE ALSO
|
# SEE ALSO
|
||||||
|
|
||||||
|
|
|
@ -29,11 +29,13 @@ Addressed by *sway/language*
|
||||||
|
|
||||||
# FORMAT REPLACEMENTS
|
# FORMAT REPLACEMENTS
|
||||||
|
|
||||||
*{short}*: Short name of layout (e.g. "en"). Equals to {}.
|
*{short}*: Short name of layout (e.g. "us"). Equals to {}.
|
||||||
|
|
||||||
|
*{shortDescription}*: Short description of layout (e.g. "en").
|
||||||
|
|
||||||
*{long}*: Long name of layout (e.g. "English (Dvorak)").
|
*{long}*: Long name of layout (e.g. "English (Dvorak)").
|
||||||
|
|
||||||
*{variant}*: Variant of layout (e.g. "Dvorak").
|
*{variant}*: Variant of layout (e.g. "dvorak").
|
||||||
|
|
||||||
# EXAMPLES
|
# EXAMPLES
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
project(
|
project(
|
||||||
'waybar', 'cpp', 'c',
|
'waybar', 'cpp', 'c',
|
||||||
version: '0.9.7',
|
version: '0.9.8',
|
||||||
license: 'MIT',
|
license: 'MIT',
|
||||||
meson_version: '>= 0.49.0',
|
meson_version: '>= 0.49.0',
|
||||||
default_options : [
|
default_options : [
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<protocol name="river_status_unstable_v1">
|
<protocol name="river_status_unstable_v1">
|
||||||
<copyright>
|
<copyright>
|
||||||
Copyright 2020 Isaac Freund
|
Copyright 2020 The River Developers
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
Permission to use, copy, modify, and/or distribute this software for any
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
|
@ -16,7 +16,7 @@
|
||||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
</copyright>
|
</copyright>
|
||||||
|
|
||||||
<interface name="zriver_status_manager_v1" version="1">
|
<interface name="zriver_status_manager_v1" version="2">
|
||||||
<description summary="manage river status objects">
|
<description summary="manage river status objects">
|
||||||
A global factory for objects that receive status information specific
|
A global factory for objects that receive status information specific
|
||||||
to river. It could be used to implement, for example, a status bar.
|
to river. It could be used to implement, for example, a status bar.
|
||||||
|
@ -47,7 +47,7 @@
|
||||||
</request>
|
</request>
|
||||||
</interface>
|
</interface>
|
||||||
|
|
||||||
<interface name="zriver_output_status_v1" version="1">
|
<interface name="zriver_output_status_v1" version="2">
|
||||||
<description summary="track output tags and focus">
|
<description summary="track output tags and focus">
|
||||||
This interface allows clients to receive information about the current
|
This interface allows clients to receive information about the current
|
||||||
windowing state of an output.
|
windowing state of an output.
|
||||||
|
@ -75,12 +75,21 @@
|
||||||
</description>
|
</description>
|
||||||
<arg name="tags" type="array" summary="array of 32-bit bitfields"/>
|
<arg name="tags" type="array" summary="array of 32-bit bitfields"/>
|
||||||
</event>
|
</event>
|
||||||
|
|
||||||
|
<event name="urgent_tags" since="2">
|
||||||
|
<description summary="tags of the output with an urgent view">
|
||||||
|
Sent once on binding the interface and again whenever the set of
|
||||||
|
tags with at least one urgent view changes.
|
||||||
|
</description>
|
||||||
|
<arg name="tags" type="uint" summary="32-bit bitfield"/>
|
||||||
|
</event>
|
||||||
</interface>
|
</interface>
|
||||||
|
|
||||||
<interface name="zriver_seat_status_v1" version="1">
|
<interface name="zriver_seat_status_v1" version="1">
|
||||||
<description summary="track seat focus">
|
<description summary="track seat focus">
|
||||||
This interface allows clients to receive information about the current
|
This interface allows clients to receive information about the current
|
||||||
focus of a seat.
|
focus of a seat. Note that (un)focused_output events will only be sent
|
||||||
|
if the client has bound the relevant wl_output globals.
|
||||||
</description>
|
</description>
|
||||||
|
|
||||||
<request name="destroy" type="destructor">
|
<request name="destroy" type="destructor">
|
||||||
|
|
|
@ -26,9 +26,11 @@ auto waybar::modules::Cpu::update() -> void {
|
||||||
event_box_.hide();
|
event_box_.hide();
|
||||||
} else {
|
} else {
|
||||||
event_box_.show();
|
event_box_.show();
|
||||||
|
auto icons = std::vector<std::string>{state};
|
||||||
label_.set_markup(fmt::format(format,
|
label_.set_markup(fmt::format(format,
|
||||||
fmt::arg("load", cpu_load),
|
fmt::arg("load", cpu_load),
|
||||||
fmt::arg("usage", cpu_usage),
|
fmt::arg("usage", cpu_usage),
|
||||||
|
fmt::arg("icon", getIcon(cpu_usage, icons)),
|
||||||
fmt::arg("max_frequency", max_frequency),
|
fmt::arg("max_frequency", max_frequency),
|
||||||
fmt::arg("min_frequency", min_frequency),
|
fmt::arg("min_frequency", min_frequency),
|
||||||
fmt::arg("avg_frequency", avg_frequency)));
|
fmt::arg("avg_frequency", avg_frequency)));
|
||||||
|
|
|
@ -38,8 +38,10 @@ auto waybar::modules::Memory::update() -> void {
|
||||||
event_box_.hide();
|
event_box_.hide();
|
||||||
} else {
|
} else {
|
||||||
event_box_.show();
|
event_box_.show();
|
||||||
|
auto icons = std::vector<std::string>{state};
|
||||||
label_.set_markup(fmt::format(format,
|
label_.set_markup(fmt::format(format,
|
||||||
used_ram_percentage,
|
used_ram_percentage,
|
||||||
|
fmt::arg("icon", getIcon(used_ram_percentage, icons)),
|
||||||
fmt::arg("total", total_ram_gigabytes),
|
fmt::arg("total", total_ram_gigabytes),
|
||||||
fmt::arg("percentage", used_ram_percentage),
|
fmt::arg("percentage", used_ram_percentage),
|
||||||
fmt::arg("used", used_ram_gigabytes),
|
fmt::arg("used", used_ram_gigabytes),
|
||||||
|
|
|
@ -22,14 +22,24 @@ static void listen_view_tags(void *data, struct zriver_output_status_v1 *zriver_
|
||||||
static_cast<Tags *>(data)->handle_view_tags(tags);
|
static_cast<Tags *>(data)->handle_view_tags(tags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void listen_urgent_tags(void *data, struct zriver_output_status_v1 *zriver_output_status_v1,
|
||||||
|
uint32_t tags) {
|
||||||
|
static_cast<Tags *>(data)->handle_urgent_tags(tags);
|
||||||
|
}
|
||||||
|
|
||||||
static const zriver_output_status_v1_listener output_status_listener_impl{
|
static const zriver_output_status_v1_listener output_status_listener_impl{
|
||||||
.focused_tags = listen_focused_tags,
|
.focused_tags = listen_focused_tags,
|
||||||
.view_tags = listen_view_tags,
|
.view_tags = listen_view_tags,
|
||||||
|
.urgent_tags = listen_urgent_tags,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void handle_global(void *data, struct wl_registry *registry, uint32_t name,
|
static void handle_global(void *data, struct wl_registry *registry, uint32_t name,
|
||||||
const char *interface, uint32_t version) {
|
const char *interface, uint32_t version) {
|
||||||
if (std::strcmp(interface, zriver_status_manager_v1_interface.name) == 0) {
|
if (std::strcmp(interface, zriver_status_manager_v1_interface.name) == 0) {
|
||||||
|
version = std::min<uint32_t>(version, 2);
|
||||||
|
if (version < ZRIVER_OUTPUT_STATUS_V1_URGENT_TAGS_SINCE_VERSION) {
|
||||||
|
spdlog::warn("river server does not support urgent tags");
|
||||||
|
}
|
||||||
static_cast<Tags *>(data)->status_manager_ = static_cast<struct zriver_status_manager_v1 *>(
|
static_cast<Tags *>(data)->status_manager_ = static_cast<struct zriver_status_manager_v1 *>(
|
||||||
wl_registry_bind(registry, name, &zriver_status_manager_v1_interface, version));
|
wl_registry_bind(registry, name, &zriver_status_manager_v1_interface, version));
|
||||||
}
|
}
|
||||||
|
@ -64,8 +74,9 @@ Tags::Tags(const std::string &id, const waybar::Bar &bar, const Json::Value &con
|
||||||
}
|
}
|
||||||
event_box_.add(box_);
|
event_box_.add(box_);
|
||||||
|
|
||||||
// Default to 9 tags
|
// Default to 9 tags, cap at 32
|
||||||
const uint32_t num_tags = config["num-tags"].isUInt() ? config_["num-tags"].asUInt() : 9;
|
const uint32_t num_tags =
|
||||||
|
config["num-tags"].isUInt() ? std::min<uint32_t>(32, config_["num-tags"].asUInt()) : 9;
|
||||||
|
|
||||||
std::vector<std::string> tag_labels(num_tags);
|
std::vector<std::string> tag_labels(num_tags);
|
||||||
for (uint32_t tag = 0; tag < num_tags; ++tag) {
|
for (uint32_t tag = 0; tag < num_tags; ++tag) {
|
||||||
|
@ -129,4 +140,16 @@ void Tags::handle_view_tags(struct wl_array *view_tags) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Tags::handle_urgent_tags(uint32_t tags) {
|
||||||
|
uint32_t i = 0;
|
||||||
|
for (auto &button : buttons_) {
|
||||||
|
if ((1 << i) & tags) {
|
||||||
|
button.get_style_context()->add_class("urgent");
|
||||||
|
} else {
|
||||||
|
button.get_style_context()->remove_class("urgent");
|
||||||
|
}
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} /* namespace waybar::modules::river */
|
} /* namespace waybar::modules::river */
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
namespace waybar::modules::SNI {
|
namespace waybar::modules::SNI {
|
||||||
|
|
||||||
Host::Host(const std::size_t id, const Json::Value& config,
|
Host::Host(const std::size_t id, const Json::Value& config, const Bar& bar,
|
||||||
const std::function<void(std::unique_ptr<Item>&)>& on_add,
|
const std::function<void(std::unique_ptr<Item>&)>& on_add,
|
||||||
const std::function<void(std::unique_ptr<Item>&)>& on_remove)
|
const std::function<void(std::unique_ptr<Item>&)>& on_remove)
|
||||||
: bus_name_("org.kde.StatusNotifierHost-" + std::to_string(getpid()) + "-" +
|
: bus_name_("org.kde.StatusNotifierHost-" + std::to_string(getpid()) + "-" +
|
||||||
|
@ -13,6 +13,7 @@ Host::Host(const std::size_t id, const Json::Value& config,
|
||||||
bus_name_id_(Gio::DBus::own_name(Gio::DBus::BusType::BUS_TYPE_SESSION, bus_name_,
|
bus_name_id_(Gio::DBus::own_name(Gio::DBus::BusType::BUS_TYPE_SESSION, bus_name_,
|
||||||
sigc::mem_fun(*this, &Host::busAcquired))),
|
sigc::mem_fun(*this, &Host::busAcquired))),
|
||||||
config_(config),
|
config_(config),
|
||||||
|
bar_(bar),
|
||||||
on_add_(on_add),
|
on_add_(on_add),
|
||||||
on_remove_(on_remove) {}
|
on_remove_(on_remove) {}
|
||||||
|
|
||||||
|
@ -136,7 +137,7 @@ void Host::addRegisteredItem(std::string service) {
|
||||||
return bus_name == item->bus_name && object_path == item->object_path;
|
return bus_name == item->bus_name && object_path == item->object_path;
|
||||||
});
|
});
|
||||||
if (it == items_.end()) {
|
if (it == items_.end()) {
|
||||||
items_.emplace_back(new Item(bus_name, object_path, config_));
|
items_.emplace_back(new Item(bus_name, object_path, config_, bar_));
|
||||||
on_add_(items_.back());
|
on_add_(items_.back());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,7 +39,7 @@ namespace waybar::modules::SNI {
|
||||||
static const Glib::ustring SNI_INTERFACE_NAME = sn_item_interface_info()->name;
|
static const Glib::ustring SNI_INTERFACE_NAME = sn_item_interface_info()->name;
|
||||||
static const unsigned UPDATE_DEBOUNCE_TIME = 10;
|
static const unsigned UPDATE_DEBOUNCE_TIME = 10;
|
||||||
|
|
||||||
Item::Item(const std::string& bn, const std::string& op, const Json::Value& config)
|
Item::Item(const std::string& bn, const std::string& op, const Json::Value& config, const Bar& bar)
|
||||||
: bus_name(bn),
|
: bus_name(bn),
|
||||||
object_path(op),
|
object_path(op),
|
||||||
icon_size(16),
|
icon_size(16),
|
||||||
|
@ -54,6 +54,9 @@ Item::Item(const std::string& bn, const std::string& op, const Json::Value& conf
|
||||||
if (config["show-passive-items"].isBool()) {
|
if (config["show-passive-items"].isBool()) {
|
||||||
show_passive_ = config["show-passive-items"].asBool();
|
show_passive_ = config["show-passive-items"].asBool();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto &window = const_cast<Bar &>(bar).window;
|
||||||
|
window.signal_configure_event().connect_notify(sigc::mem_fun(*this, &Item::onConfigure));
|
||||||
event_box.add(image);
|
event_box.add(image);
|
||||||
event_box.add_events(Gdk::BUTTON_PRESS_MASK | Gdk::SCROLL_MASK | Gdk::SMOOTH_SCROLL_MASK);
|
event_box.add_events(Gdk::BUTTON_PRESS_MASK | Gdk::SCROLL_MASK | Gdk::SMOOTH_SCROLL_MASK);
|
||||||
event_box.signal_button_press_event().connect(sigc::mem_fun(*this, &Item::handleClick));
|
event_box.signal_button_press_event().connect(sigc::mem_fun(*this, &Item::handleClick));
|
||||||
|
@ -73,6 +76,10 @@ Item::Item(const std::string& bn, const std::string& op, const Json::Value& conf
|
||||||
interface);
|
interface);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Item::onConfigure(GdkEventConfigure* ev) {
|
||||||
|
this->updateImage();
|
||||||
|
}
|
||||||
|
|
||||||
void Item::proxyReady(Glib::RefPtr<Gio::AsyncResult>& result) {
|
void Item::proxyReady(Glib::RefPtr<Gio::AsyncResult>& result) {
|
||||||
try {
|
try {
|
||||||
this->proxy_ = Gio::DBus::Proxy::create_for_bus_finish(result);
|
this->proxy_ = Gio::DBus::Proxy::create_for_bus_finish(result);
|
||||||
|
|
|
@ -7,7 +7,7 @@ Tray::Tray(const std::string& id, const Bar& bar, const Json::Value& config)
|
||||||
: AModule(config, "tray", id),
|
: AModule(config, "tray", id),
|
||||||
box_(bar.vertical ? Gtk::ORIENTATION_VERTICAL : Gtk::ORIENTATION_HORIZONTAL, 0),
|
box_(bar.vertical ? Gtk::ORIENTATION_VERTICAL : Gtk::ORIENTATION_HORIZONTAL, 0),
|
||||||
watcher_(SNI::Watcher::getInstance()),
|
watcher_(SNI::Watcher::getInstance()),
|
||||||
host_(nb_hosts_, config, std::bind(&Tray::onAdd, this, std::placeholders::_1),
|
host_(nb_hosts_, config, bar, std::bind(&Tray::onAdd, this, std::placeholders::_1),
|
||||||
std::bind(&Tray::onRemove, this, std::placeholders::_1)) {
|
std::bind(&Tray::onRemove, this, std::placeholders::_1)) {
|
||||||
spdlog::warn(
|
spdlog::warn(
|
||||||
"For a functional tray you must have libappindicator-* installed and export "
|
"For a functional tray you must have libappindicator-* installed and export "
|
||||||
|
|
|
@ -20,6 +20,12 @@ const std::string Language::XKB_ACTIVE_LAYOUT_NAME_KEY = "xkb_active_layout_name
|
||||||
Language::Language(const std::string& id, const Json::Value& config)
|
Language::Language(const std::string& id, const Json::Value& config)
|
||||||
: ALabel(config, "language", id, "{}", 0, true) {
|
: ALabel(config, "language", id, "{}", 0, true) {
|
||||||
is_variant_displayed = format_.find("{variant}") != std::string::npos;
|
is_variant_displayed = format_.find("{variant}") != std::string::npos;
|
||||||
|
if (format_.find("{}") != std::string::npos || format_.find("{short}") != std::string::npos) {
|
||||||
|
displayed_short_flag |= static_cast<std::byte>(DispayedShortFlag::ShortName);
|
||||||
|
}
|
||||||
|
if (format_.find("{shortDescription}") != std::string::npos) {
|
||||||
|
displayed_short_flag |= static_cast<std::byte>(DispayedShortFlag::ShortDescription);
|
||||||
|
}
|
||||||
if (config.isMember("tooltip-format")) {
|
if (config.isMember("tooltip-format")) {
|
||||||
tooltip_format_ = config["tooltip-format"].asString();
|
tooltip_format_ = config["tooltip-format"].asString();
|
||||||
}
|
}
|
||||||
|
@ -88,8 +94,10 @@ void Language::onEvent(const struct Ipc::ipc_response& res) {
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Language::update() -> void {
|
auto Language::update() -> void {
|
||||||
|
std::lock_guard<std::mutex> lock(mutex_);
|
||||||
auto display_layout = trim(fmt::format(format_,
|
auto display_layout = trim(fmt::format(format_,
|
||||||
fmt::arg("short", layout_.short_name),
|
fmt::arg("short", layout_.short_name),
|
||||||
|
fmt::arg("shortDescription", layout_.short_description),
|
||||||
fmt::arg("long", layout_.full_name),
|
fmt::arg("long", layout_.full_name),
|
||||||
fmt::arg("variant", layout_.variant)));
|
fmt::arg("variant", layout_.variant)));
|
||||||
label_.set_markup(display_layout);
|
label_.set_markup(display_layout);
|
||||||
|
@ -97,10 +105,10 @@ auto Language::update() -> void {
|
||||||
if (tooltip_format_ != "") {
|
if (tooltip_format_ != "") {
|
||||||
auto tooltip_display_layout = trim(fmt::format(tooltip_format_,
|
auto tooltip_display_layout = trim(fmt::format(tooltip_format_,
|
||||||
fmt::arg("short", layout_.short_name),
|
fmt::arg("short", layout_.short_name),
|
||||||
|
fmt::arg("shortDescription", layout_.short_description),
|
||||||
fmt::arg("long", layout_.full_name),
|
fmt::arg("long", layout_.full_name),
|
||||||
fmt::arg("variant", layout_.variant)));
|
fmt::arg("variant", layout_.variant)));
|
||||||
label_.set_tooltip_markup(tooltip_display_layout);
|
label_.set_tooltip_markup(tooltip_display_layout);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
label_.set_tooltip_markup(display_layout);
|
label_.set_tooltip_markup(display_layout);
|
||||||
}
|
}
|
||||||
|
@ -118,8 +126,9 @@ auto Language::set_current_layout(std::string current_layout) -> void {
|
||||||
|
|
||||||
auto Language::init_layouts_map(const std::vector<std::string>& used_layouts) -> void {
|
auto Language::init_layouts_map(const std::vector<std::string>& used_layouts) -> void {
|
||||||
std::map<std::string, std::vector<Layout*>> found_by_short_names;
|
std::map<std::string, std::vector<Layout*>> found_by_short_names;
|
||||||
auto layout = xkb_context_.next_layout();
|
XKBContext xkb_context;
|
||||||
for (; layout != nullptr; layout = xkb_context_.next_layout()) {
|
auto layout = xkb_context.next_layout();
|
||||||
|
for (; layout != nullptr; layout = xkb_context.next_layout()) {
|
||||||
if (std::find(used_layouts.begin(), used_layouts.end(), layout->full_name) ==
|
if (std::find(used_layouts.begin(), used_layouts.end(), layout->full_name) ==
|
||||||
used_layouts.end()) {
|
used_layouts.end()) {
|
||||||
continue;
|
continue;
|
||||||
|
@ -145,7 +154,6 @@ auto Language::init_layouts_map(const std::vector<std::string>& used_layouts) ->
|
||||||
for (const auto& used_layout_name : used_layouts) {
|
for (const auto& used_layout_name : used_layouts) {
|
||||||
auto used_layout = &layouts_map_.find(used_layout_name)->second;
|
auto used_layout = &layouts_map_.find(used_layout_name)->second;
|
||||||
auto layouts_with_same_name_list = found_by_short_names[used_layout->short_name];
|
auto layouts_with_same_name_list = found_by_short_names[used_layout->short_name];
|
||||||
spdlog::info("SIZE: " + std::to_string(layouts_with_same_name_list.size()));
|
|
||||||
if (layouts_with_same_name_list.size() < 2) {
|
if (layouts_with_same_name_list.size() < 2) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -153,9 +161,15 @@ auto Language::init_layouts_map(const std::vector<std::string>& used_layouts) ->
|
||||||
if (short_name_to_number_map.count(used_layout->short_name) == 0) {
|
if (short_name_to_number_map.count(used_layout->short_name) == 0) {
|
||||||
short_name_to_number_map[used_layout->short_name] = 1;
|
short_name_to_number_map[used_layout->short_name] = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
used_layout->short_name =
|
if (displayed_short_flag != static_cast<std::byte>(0)) {
|
||||||
used_layout->short_name + std::to_string(short_name_to_number_map[used_layout->short_name]++);
|
int& number = short_name_to_number_map[used_layout->short_name];
|
||||||
|
used_layout->short_name =
|
||||||
|
used_layout->short_name + std::to_string(number);
|
||||||
|
used_layout->short_description =
|
||||||
|
used_layout->short_description + std::to_string(number);
|
||||||
|
++number;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -180,10 +194,22 @@ auto Language::XKBContext::next_layout() -> Layout* {
|
||||||
auto name = std::string(rxkb_layout_get_name(xkb_layout_));
|
auto name = std::string(rxkb_layout_get_name(xkb_layout_));
|
||||||
auto variant_ = rxkb_layout_get_variant(xkb_layout_);
|
auto variant_ = rxkb_layout_get_variant(xkb_layout_);
|
||||||
std::string variant = variant_ == nullptr ? "" : std::string(variant_);
|
std::string variant = variant_ == nullptr ? "" : std::string(variant_);
|
||||||
|
auto short_description_ = rxkb_layout_get_brief(xkb_layout_);
|
||||||
layout_ = new Layout{description, name, variant};
|
std::string short_description;
|
||||||
|
if (short_description_ != nullptr) {
|
||||||
|
short_description = std::string(short_description_);
|
||||||
|
base_layouts_by_name_.emplace(name, xkb_layout_);
|
||||||
|
} else {
|
||||||
|
auto base_layout = base_layouts_by_name_[name];
|
||||||
|
short_description = base_layout == nullptr ? "" : std::string(rxkb_layout_get_brief(base_layout));
|
||||||
|
}
|
||||||
|
delete layout_;
|
||||||
|
layout_ = new Layout{description, name, variant, short_description};
|
||||||
return layout_;
|
return layout_;
|
||||||
}
|
}
|
||||||
|
|
||||||
Language::XKBContext::~XKBContext() { rxkb_context_unref(context_); }
|
Language::XKBContext::~XKBContext() {
|
||||||
|
rxkb_context_unref(context_);
|
||||||
|
delete layout_;
|
||||||
|
}
|
||||||
} // namespace waybar::modules::sway
|
} // namespace waybar::modules::sway
|
||||||
|
|
Loading…
Reference in New Issue