mirror of
https://github.com/rad4day/Waybar.git
synced 2023-12-21 10:22:59 +01:00
Compare commits
20 Commits
Author | SHA1 | Date | |
---|---|---|---|
7f74de977c | |||
028b184f7b | |||
564fdcb369 | |||
3c9b533997 | |||
ec75be0bc3 | |||
c2e9ed6091 | |||
a37b4687ff | |||
ee29a35aa5 | |||
0be8e200ce | |||
46e5dd93d4 | |||
2ee4a51546 | |||
91996a85c1 | |||
460d25ac45 | |||
648eecdd83 | |||
f04ff38567 | |||
d20a586734 | |||
1962caf144 | |||
9dbf057f58 | |||
918146c16b | |||
0b01b35c76 |
@ -2,7 +2,8 @@
|
||||
|
||||
> 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
|
||||
[AUR](https://aur.archlinux.org/packages/waybar-git/) and [openSUSE](https://build.opensuse.org/package/show/X11:Wayland/waybar)
|
||||
[AUR](https://aur.archlinux.org/packages/waybar-git/) and [openSUSE](https://build.opensuse.org/package/show/X11:Wayland/waybar)<br>
|
||||
> *Waybar [examples](https://github.com/Alexays/Waybar/wiki/Examples)*
|
||||
|
||||
**Current features**
|
||||
- Sway (Workspaces, Binding mode, Focused window name)
|
||||
@ -42,6 +43,7 @@ $ waybar
|
||||
gtkmm3
|
||||
jsoncpp
|
||||
libinput
|
||||
|
||||
libsigc++
|
||||
fmt
|
||||
wayland
|
||||
|
@ -29,6 +29,8 @@ class Window : public ALabel, public sigc::trackable {
|
||||
std::string window_;
|
||||
int windowId_;
|
||||
std::string app_id_;
|
||||
std::string old_app_id_;
|
||||
std::size_t app_nb_;
|
||||
util::JsonParser parser_;
|
||||
|
||||
util::SleeperThread thread_;
|
||||
|
@ -33,7 +33,7 @@ inline int close(FILE* fp, pid_t pid) {
|
||||
fclose(fp);
|
||||
while (waitpid(pid, &stat, 0) == -1) {
|
||||
if (errno != EINTR) {
|
||||
stat = -1;
|
||||
stat = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -90,6 +90,8 @@ inline int32_t forkExec(std::string cmd) {
|
||||
setpgid(pid, pid);
|
||||
execl("/bin/sh", "sh", "-c", cmd.c_str(), (char*)0);
|
||||
exit(0);
|
||||
} else {
|
||||
signal(SIGCHLD,SIG_IGN);
|
||||
}
|
||||
|
||||
return pid;
|
||||
|
@ -14,7 +14,10 @@ class SleeperThread {
|
||||
|
||||
SleeperThread(std::function<void()> func)
|
||||
: thread_{[this, func] {
|
||||
while (do_run_) func();
|
||||
while (do_run_) {
|
||||
signal_ = false;
|
||||
func();
|
||||
}
|
||||
}} {}
|
||||
|
||||
SleeperThread& operator=(std::function<void()> func) {
|
||||
@ -42,7 +45,10 @@ class SleeperThread {
|
||||
}
|
||||
|
||||
auto wake_up() {
|
||||
signal_ = true;
|
||||
{
|
||||
std::lock_guard<std::mutex> lck(mutex_);
|
||||
signal_ = true;
|
||||
}
|
||||
condvar_.notify_all();
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
project(
|
||||
'waybar', 'cpp', 'c',
|
||||
version: '0.6.7',
|
||||
version: '0.6.9',
|
||||
license: 'MIT',
|
||||
default_options : [
|
||||
'cpp_std=c++17',
|
||||
|
@ -7,10 +7,10 @@
|
||||
}
|
||||
|
||||
window#waybar {
|
||||
background: rgba(43, 48, 59, 0.5);
|
||||
background-color: rgba(43, 48, 59, 0.5);
|
||||
border-bottom: 3px solid rgba(100, 114, 125, 0.5);
|
||||
color: #ffffff;
|
||||
transition-property: background, background-color;
|
||||
transition-property: background-color;
|
||||
transition-duration: .5s;
|
||||
}
|
||||
|
||||
@ -20,10 +20,10 @@ window#waybar.hidden {
|
||||
|
||||
/*
|
||||
window#waybar.empty {
|
||||
background: transparent;
|
||||
background-color: transparent;
|
||||
}
|
||||
window#waybar.solo {
|
||||
background: #FFFFFF;
|
||||
background-color: #FFFFFF;
|
||||
}
|
||||
*/
|
||||
|
||||
@ -39,13 +39,13 @@ window#waybar.chromium {
|
||||
/* https://github.com/Alexays/Waybar/wiki/FAQ#the-workspace-buttons-have-a-strange-hover-effect */
|
||||
#workspaces button {
|
||||
padding: 0 5px;
|
||||
background: transparent;
|
||||
background-color: transparent;
|
||||
color: #ffffff;
|
||||
border-bottom: 3px solid transparent;
|
||||
}
|
||||
|
||||
#workspaces button.focused {
|
||||
background: #64727D;
|
||||
background-color: #64727D;
|
||||
border-bottom: 3px solid #ffffff;
|
||||
}
|
||||
|
||||
@ -54,7 +54,7 @@ window#waybar.chromium {
|
||||
}
|
||||
|
||||
#mode {
|
||||
background: #64727D;
|
||||
background-color: #64727D;
|
||||
border-bottom: 3px solid #ffffff;
|
||||
}
|
||||
|
||||
@ -86,7 +86,7 @@ window#waybar.chromium {
|
||||
}
|
||||
|
||||
#battery.critical:not(.charging) {
|
||||
background: #f53c3c;
|
||||
background-color: #f53c3c;
|
||||
color: #ffffff;
|
||||
animation-name: blink;
|
||||
animation-duration: 0.5s;
|
||||
@ -100,56 +100,56 @@ label:focus {
|
||||
}
|
||||
|
||||
#cpu {
|
||||
background: #2ecc71;
|
||||
background-color: #2ecc71;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
#memory {
|
||||
background: #9b59b6;
|
||||
background-color: #9b59b6;
|
||||
}
|
||||
|
||||
#backlight {
|
||||
background: #90b1b1;
|
||||
background-color: #90b1b1;
|
||||
}
|
||||
|
||||
#network {
|
||||
background: #2980b9;
|
||||
background-color: #2980b9;
|
||||
}
|
||||
|
||||
#network.disconnected {
|
||||
background: #f53c3c;
|
||||
background-color: #f53c3c;
|
||||
}
|
||||
|
||||
#pulseaudio {
|
||||
background: #f1c40f;
|
||||
background-color: #f1c40f;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
#pulseaudio.muted {
|
||||
background: #90b1b1;
|
||||
background-color: #90b1b1;
|
||||
color: #2a5c45;
|
||||
}
|
||||
|
||||
#custom-media {
|
||||
background: #66cc99;
|
||||
background-color: #66cc99;
|
||||
color: #2a5c45;
|
||||
min-width: 100px;
|
||||
}
|
||||
|
||||
.custom-spotify {
|
||||
background: #66cc99;
|
||||
#custom-media.custom-spotify {
|
||||
background-color: #66cc99;
|
||||
}
|
||||
|
||||
.custom-vlc {
|
||||
background: #ffa000;
|
||||
#custom-media.custom-vlc {
|
||||
background-color: #ffa000;
|
||||
}
|
||||
|
||||
#temperature {
|
||||
background: #f0932b;
|
||||
background-color: #f0932b;
|
||||
}
|
||||
|
||||
#temperature.critical {
|
||||
background: #eb4d4b;
|
||||
background-color: #eb4d4b;
|
||||
}
|
||||
|
||||
#tray {
|
||||
@ -166,18 +166,18 @@ label:focus {
|
||||
}
|
||||
|
||||
#mpd {
|
||||
background: #66cc99;
|
||||
background-color: #66cc99;
|
||||
color: #2a5c45;
|
||||
}
|
||||
|
||||
#mpd.disconnected {
|
||||
background: #f53c3c;
|
||||
background-color: #f53c3c;
|
||||
}
|
||||
|
||||
#mpd.stopped {
|
||||
background: #90b1b1;
|
||||
background-color: #90b1b1;
|
||||
}
|
||||
|
||||
#mpd.paused {
|
||||
background: #51a37a;
|
||||
background-color: #51a37a;
|
||||
}
|
||||
|
@ -17,6 +17,7 @@ waybar::Bar::Bar(struct waybar_output* w_output, const Json::Value& w_config)
|
||||
window.set_title("waybar");
|
||||
window.set_name("waybar");
|
||||
window.set_decorated(false);
|
||||
window.get_style_context()->add_class(output->name);
|
||||
|
||||
if (config["position"] == "right" || config["position"] == "left") {
|
||||
height_ = 0;
|
||||
|
@ -102,14 +102,14 @@ auto waybar::modules::Custom::update() -> void {
|
||||
} else {
|
||||
parseOutputRaw();
|
||||
}
|
||||
if (text_.empty()) {
|
||||
auto str = fmt::format(format_,
|
||||
text_,
|
||||
fmt::arg("alt", alt_),
|
||||
fmt::arg("icon", getIcon(percentage_, alt_)),
|
||||
fmt::arg("percentage", percentage_));
|
||||
if (str.empty()) {
|
||||
event_box_.hide();
|
||||
} else {
|
||||
auto str = fmt::format(format_,
|
||||
text_,
|
||||
fmt::arg("alt", alt_),
|
||||
fmt::arg("icon", getIcon(percentage_, alt_)),
|
||||
fmt::arg("percentage", percentage_));
|
||||
label_.set_markup(str);
|
||||
if (tooltipEnabled()) {
|
||||
if (text_ == tooltip_) {
|
||||
|
@ -128,6 +128,10 @@ void waybar::modules::Pulseaudio::subscribeCb(pa_context * conte
|
||||
pa_subscription_event_type_t type, uint32_t idx,
|
||||
void *data) {
|
||||
unsigned facility = type & PA_SUBSCRIPTION_EVENT_FACILITY_MASK;
|
||||
unsigned operation = type & PA_SUBSCRIPTION_EVENT_TYPE_MASK;
|
||||
if (operation != PA_SUBSCRIPTION_EVENT_CHANGE) {
|
||||
return;
|
||||
}
|
||||
if (facility == PA_SUBSCRIPTION_EVENT_SINK) {
|
||||
pa_context_get_sink_info_by_index(context, idx, sinkInfoCb, data);
|
||||
} else if (facility == PA_SUBSCRIPTION_EVENT_SOURCE) {
|
||||
|
@ -1,6 +1,6 @@
|
||||
#include "modules/sni/item.hpp"
|
||||
#include <glibmm/main.h>
|
||||
#include <spdlog/spdlog.h>
|
||||
#include "modules/sni/item.hpp"
|
||||
|
||||
template <>
|
||||
struct fmt::formatter<Glib::ustring> : formatter<std::string> {
|
||||
@ -334,7 +334,7 @@ void Item::makeMenu(GdkEventButton* const& ev) {
|
||||
bool Item::handleClick(GdkEventButton* const& ev) {
|
||||
auto parameters = Glib::VariantContainerBase::create_tuple(
|
||||
{Glib::Variant<int>::create(ev->x), Glib::Variant<int>::create(ev->y)});
|
||||
if ((ev->button == 1 && item_is_menu) || ev->button == 3) {
|
||||
if ((ev->button == 1 && (item_is_menu || !menu.empty())) || ev->button == 3) {
|
||||
makeMenu(ev);
|
||||
if (gtk_menu != nullptr) {
|
||||
#if GTK_CHECK_VERSION(3, 22, 0)
|
||||
|
@ -6,7 +6,6 @@ namespace waybar::modules::sway {
|
||||
Window::Window(const std::string& id, const Bar& bar, const Json::Value& config)
|
||||
: ALabel(config, "window", id, "{}"), bar_(bar), windowId_(-1) {
|
||||
if (label_.get_max_width_chars() == -1) {
|
||||
label_.set_hexpand(true);
|
||||
label_.set_ellipsize(Pango::EllipsizeMode::ELLIPSIZE_END);
|
||||
}
|
||||
ipc_.subscribe(R"(["window","workspace"])");
|
||||
@ -23,34 +22,9 @@ void Window::onEvent(const struct Ipc::ipc_response& res) { getTree(); }
|
||||
void Window::onCmd(const struct Ipc::ipc_response& res) {
|
||||
try {
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
auto payload = parser_.parse(res.payload);
|
||||
auto [nb, id, name, app_id] = getFocusedNode(payload);
|
||||
if (!app_id_.empty()) {
|
||||
bar_.window.get_style_context()->remove_class(app_id_);
|
||||
}
|
||||
if (nb == 0) {
|
||||
bar_.window.get_style_context()->remove_class("solo");
|
||||
if (!bar_.window.get_style_context()->has_class("empty")) {
|
||||
bar_.window.get_style_context()->add_class("empty");
|
||||
}
|
||||
} else if (nb == 1) {
|
||||
bar_.window.get_style_context()->remove_class("empty");
|
||||
if (!bar_.window.get_style_context()->has_class("solo")) {
|
||||
bar_.window.get_style_context()->add_class("solo");
|
||||
}
|
||||
if (!app_id.empty() && !bar_.window.get_style_context()->has_class(app_id)) {
|
||||
bar_.window.get_style_context()->add_class(app_id);
|
||||
}
|
||||
} else {
|
||||
bar_.window.get_style_context()->remove_class("solo");
|
||||
bar_.window.get_style_context()->remove_class("empty");
|
||||
}
|
||||
app_id_ = app_id;
|
||||
if (windowId_ != id || window_ != name) {
|
||||
windowId_ = id;
|
||||
window_ = name;
|
||||
dp.emit();
|
||||
}
|
||||
auto payload = parser_.parse(res.payload);
|
||||
std::tie(app_nb_, windowId_, window_, app_id_) = getFocusedNode(payload);
|
||||
dp.emit();
|
||||
} catch (const std::exception& e) {
|
||||
spdlog::error("Window: {}", e.what());
|
||||
}
|
||||
@ -67,6 +41,27 @@ void Window::worker() {
|
||||
}
|
||||
|
||||
auto Window::update() -> void {
|
||||
if (!old_app_id_.empty()) {
|
||||
bar_.window.get_style_context()->remove_class(old_app_id_);
|
||||
}
|
||||
if (app_nb_ == 0) {
|
||||
bar_.window.get_style_context()->remove_class("solo");
|
||||
if (!bar_.window.get_style_context()->has_class("empty")) {
|
||||
bar_.window.get_style_context()->add_class("empty");
|
||||
}
|
||||
} else if (app_nb_ == 1) {
|
||||
bar_.window.get_style_context()->remove_class("empty");
|
||||
if (!bar_.window.get_style_context()->has_class("solo")) {
|
||||
bar_.window.get_style_context()->add_class("solo");
|
||||
}
|
||||
if (!app_id_.empty() && !bar_.window.get_style_context()->has_class(app_id_)) {
|
||||
bar_.window.get_style_context()->add_class(app_id_);
|
||||
old_app_id_ = app_id_;
|
||||
}
|
||||
} else {
|
||||
bar_.window.get_style_context()->remove_class("solo");
|
||||
bar_.window.get_style_context()->remove_class("empty");
|
||||
}
|
||||
label_.set_markup(fmt::format(format_, window_));
|
||||
if (tooltipEnabled()) {
|
||||
label_.set_tooltip_text(window_);
|
||||
|
@ -80,6 +80,7 @@ void Workspaces::onCmd(const struct Ipc::ipc_response &res) {
|
||||
// Adding to all outputs
|
||||
Json::Value v;
|
||||
v["name"] = p_w_name;
|
||||
v["target_output"] = "";
|
||||
workspaces_.emplace_back(std::move(v));
|
||||
}
|
||||
}
|
||||
@ -154,6 +155,11 @@ auto Workspaces::update() -> void {
|
||||
} else {
|
||||
button.get_style_context()->remove_class("urgent");
|
||||
}
|
||||
if ((*it)["target_output"].isString()) {
|
||||
button.get_style_context()->add_class("persistant");
|
||||
} else {
|
||||
button.get_style_context()->remove_class("persistant");
|
||||
}
|
||||
if (needReorder) {
|
||||
box_.reorder_child(button, it - workspaces_.begin());
|
||||
}
|
||||
|
Reference in New Issue
Block a user