Merge branch 'master' into patch-1
commit
3e1c341933
|
@ -0,0 +1 @@
|
||||||
|
use flake
|
|
@ -9,7 +9,7 @@ jobs:
|
||||||
# https://github.com/actions/virtual-environments/issues/4060 - for lack of VirtualBox on MacOS 11 runners
|
# https://github.com/actions/virtual-environments/issues/4060 - for lack of VirtualBox on MacOS 11 runners
|
||||||
runs-on: macos-12
|
runs-on: macos-12
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
- name: Test in FreeBSD VM
|
- name: Test in FreeBSD VM
|
||||||
uses: vmactions/freebsd-vm@v0
|
uses: vmactions/freebsd-vm@v0
|
||||||
with:
|
with:
|
||||||
|
|
|
@ -6,7 +6,7 @@ jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
- uses: DoozyX/clang-format-lint-action@v0.13
|
- uses: DoozyX/clang-format-lint-action@v0.13
|
||||||
with:
|
with:
|
||||||
source: '.'
|
source: '.'
|
||||||
|
|
|
@ -13,16 +13,20 @@ jobs:
|
||||||
- fedora
|
- fedora
|
||||||
- opensuse
|
- opensuse
|
||||||
- gentoo
|
- gentoo
|
||||||
|
cpp_std: [c++17]
|
||||||
|
include:
|
||||||
|
- distro: fedora
|
||||||
|
cpp_std: c++20
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
container:
|
container:
|
||||||
image: alexays/waybar:${{ matrix.distro }}
|
image: alexays/waybar:${{ matrix.distro }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
- name: configure
|
- name: configure
|
||||||
run: meson -Dman-pages=enabled build
|
run: meson -Dman-pages=enabled -Dcpp_std=${{matrix.cpp_std}} build
|
||||||
- name: build
|
- name: build
|
||||||
run: ninja -C build
|
run: ninja -C build
|
||||||
- name: test
|
- name: test
|
||||||
run: meson test -C build --no-rebuild --print-errorlogs --suite waybar
|
run: make test
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
*~
|
*~
|
||||||
vgcore.*
|
vgcore.*
|
||||||
/.vscode
|
/.vscode
|
||||||
|
/.idea
|
||||||
|
/.cache
|
||||||
*.swp
|
*.swp
|
||||||
packagecache
|
packagecache
|
||||||
/subprojects/**/
|
/subprojects/**/
|
||||||
|
@ -41,3 +43,4 @@ packagecache
|
||||||
*.exe
|
*.exe
|
||||||
*.out
|
*.out
|
||||||
*.app
|
*.app
|
||||||
|
/.direnv/
|
||||||
|
|
|
@ -2,4 +2,4 @@
|
||||||
|
|
||||||
FROM alpine:latest
|
FROM alpine:latest
|
||||||
|
|
||||||
RUN apk add --no-cache git meson alpine-sdk libinput-dev wayland-dev wayland-protocols mesa-dev libxkbcommon-dev eudev-dev pixman-dev gtkmm3-dev jsoncpp-dev pugixml-dev libnl3-dev pulseaudio-dev libmpdclient-dev sndio-dev scdoc libxkbcommon tzdata
|
RUN apk add --no-cache git meson alpine-sdk libinput-dev wayland-dev wayland-protocols mesa-dev libxkbcommon-dev eudev-dev pixman-dev gtkmm3-dev jsoncpp-dev pugixml-dev libnl3-dev pulseaudio-dev libmpdclient-dev sndio-dev scdoc libxkbcommon tzdata playerctl-dev
|
||||||
|
|
|
@ -3,4 +3,5 @@
|
||||||
FROM archlinux:base-devel
|
FROM archlinux:base-devel
|
||||||
|
|
||||||
RUN pacman -Syu --noconfirm && \
|
RUN pacman -Syu --noconfirm && \
|
||||||
pacman -S git meson base-devel libinput wayland wayland-protocols pixman libxkbcommon mesa gtkmm3 jsoncpp pugixml scdoc libpulse libdbusmenu-gtk3 libmpdclient gobject-introspection --noconfirm libxkbcommon
|
pacman -S --noconfirm git meson base-devel libinput wayland wayland-protocols pixman libxkbcommon mesa gtkmm3 jsoncpp pugixml scdoc libpulse libdbusmenu-gtk3 libmpdclient gobject-introspection libxkbcommon playerctl && \
|
||||||
|
sed -Ei 's/#(en_(US|GB)\.UTF)/\1/' /etc/locale.gen && locale-gen
|
||||||
|
|
|
@ -3,5 +3,5 @@
|
||||||
FROM debian:sid
|
FROM debian:sid
|
||||||
|
|
||||||
RUN apt-get update && \
|
RUN apt-get update && \
|
||||||
apt-get install -y build-essential meson ninja-build git pkg-config libinput10 libpugixml-dev libinput-dev wayland-protocols libwayland-client0 libwayland-cursor0 libwayland-dev libegl1-mesa-dev libgles2-mesa-dev libgbm-dev libxkbcommon-dev libudev-dev libpixman-1-dev libgtkmm-3.0-dev libjsoncpp-dev scdoc libdbusmenu-gtk3-dev libnl-3-dev libnl-genl-3-dev libpulse-dev libmpdclient-dev gobject-introspection libgirepository1.0-dev libxkbcommon-dev libxkbregistry-dev libxkbregistry0 && \
|
apt-get install -y build-essential meson ninja-build git pkg-config libinput10 libpugixml-dev libinput-dev wayland-protocols libwayland-client0 libwayland-cursor0 libwayland-dev libegl1-mesa-dev libgles2-mesa-dev libgbm-dev libxkbcommon-dev libudev-dev libpixman-1-dev libgtkmm-3.0-dev libjsoncpp-dev scdoc libdbusmenu-gtk3-dev libnl-3-dev libnl-genl-3-dev libpulse-dev libmpdclient-dev gobject-introspection libgirepository1.0-dev libxkbcommon-dev libxkbregistry-dev libxkbregistry0 libplayerctl-dev && \
|
||||||
apt-get clean
|
apt-get clean
|
||||||
|
|
|
@ -2,11 +2,33 @@
|
||||||
|
|
||||||
FROM fedora:latest
|
FROM fedora:latest
|
||||||
|
|
||||||
RUN dnf install -y @c-development git-core meson scdoc 'pkgconfig(date)' \
|
RUN dnf install -y @c-development \
|
||||||
'pkgconfig(dbusmenu-gtk3-0.4)' 'pkgconfig(fmt)' 'pkgconfig(gdk-pixbuf-2.0)' \
|
git-core glibc-langpack-en meson scdoc \
|
||||||
'pkgconfig(gio-unix-2.0)' 'pkgconfig(gtk-layer-shell-0)' 'pkgconfig(gtkmm-3.0)' \
|
'pkgconfig(catch2)' \
|
||||||
'pkgconfig(jsoncpp)' 'pkgconfig(libinput)' 'pkgconfig(libmpdclient)' \
|
'pkgconfig(date)' \
|
||||||
'pkgconfig(libnl-3.0)' 'pkgconfig(libnl-genl-3.0)' 'pkgconfig(libpulse)' \
|
'pkgconfig(dbusmenu-gtk3-0.4)' \
|
||||||
'pkgconfig(libudev)' 'pkgconfig(pugixml)' 'pkgconfig(sigc++-2.0)' 'pkgconfig(spdlog)' \
|
'pkgconfig(fmt)' \
|
||||||
'pkgconfig(wayland-client)' 'pkgconfig(wayland-cursor)' 'pkgconfig(wayland-protocols)' 'pkgconfig(xkbregistry)' && \
|
'pkgconfig(gdk-pixbuf-2.0)' \
|
||||||
|
'pkgconfig(gio-unix-2.0)' \
|
||||||
|
'pkgconfig(gtk-layer-shell-0)' \
|
||||||
|
'pkgconfig(gtkmm-3.0)' \
|
||||||
|
'pkgconfig(jack)' \
|
||||||
|
'pkgconfig(jsoncpp)' \
|
||||||
|
'pkgconfig(libevdev)' \
|
||||||
|
'pkgconfig(libinput)' \
|
||||||
|
'pkgconfig(libmpdclient)' \
|
||||||
|
'pkgconfig(libnl-3.0)' \
|
||||||
|
'pkgconfig(libnl-genl-3.0)' \
|
||||||
|
'pkgconfig(libpulse)' \
|
||||||
|
'pkgconfig(libudev)' \
|
||||||
|
'pkgconfig(playerctl)' \
|
||||||
|
'pkgconfig(pugixml)' \
|
||||||
|
'pkgconfig(sigc++-2.0)' \
|
||||||
|
'pkgconfig(spdlog)' \
|
||||||
|
'pkgconfig(upower-glib)' \
|
||||||
|
'pkgconfig(wayland-client)' \
|
||||||
|
'pkgconfig(wayland-cursor)' \
|
||||||
|
'pkgconfig(wayland-protocols)' \
|
||||||
|
'pkgconfig(wireplumber-0.4)' \
|
||||||
|
'pkgconfig(xkbregistry)' && \
|
||||||
dnf clean all -y
|
dnf clean all -y
|
||||||
|
|
|
@ -6,6 +6,6 @@ RUN export FEATURES="-ipc-sandbox -network-sandbox -pid-sandbox -sandbox -usersa
|
||||||
emerge --sync && \
|
emerge --sync && \
|
||||||
eselect news read --quiet new 1>/dev/null 2>&1 && \
|
eselect news read --quiet new 1>/dev/null 2>&1 && \
|
||||||
emerge --verbose --update --deep --with-bdeps=y --backtrack=30 --newuse @world && \
|
emerge --verbose --update --deep --with-bdeps=y --backtrack=30 --newuse @world && \
|
||||||
USE="wayland gtk3 gtk -doc X" emerge dev-vcs/git dev-libs/wayland dev-libs/wayland-protocols =dev-cpp/gtkmm-3.24.6 x11-libs/libxkbcommon \
|
USE="wayland gtk3 gtk -doc X pulseaudio minimal" emerge dev-vcs/git dev-libs/wayland dev-libs/wayland-protocols =dev-cpp/gtkmm-3.24.6 x11-libs/libxkbcommon \
|
||||||
x11-libs/gtk+:3 dev-libs/libdbusmenu dev-libs/libnl sys-power/upower media-libs/libpulse dev-libs/libevdev media-libs/libmpdclient \
|
x11-libs/gtk+:3 dev-libs/libdbusmenu dev-libs/libnl sys-power/upower media-libs/libpulse dev-libs/libevdev media-libs/libmpdclient \
|
||||||
media-sound/sndio gui-libs/gtk-layer-shell app-text/scdoc
|
media-sound/sndio gui-libs/gtk-layer-shell app-text/scdoc media-sound/playerctl dev-libs/iniparser sci-libs/fftw
|
||||||
|
|
|
@ -6,4 +6,4 @@ RUN zypper -n up && \
|
||||||
zypper addrepo https://download.opensuse.org/repositories/X11:Wayland/openSUSE_Tumbleweed/X11:Wayland.repo | echo 'a' && \
|
zypper addrepo https://download.opensuse.org/repositories/X11:Wayland/openSUSE_Tumbleweed/X11:Wayland.repo | echo 'a' && \
|
||||||
zypper -n refresh && \
|
zypper -n refresh && \
|
||||||
zypper -n install -t pattern devel_C_C++ && \
|
zypper -n install -t pattern devel_C_C++ && \
|
||||||
zypper -n install git meson clang libinput10 libinput-devel pugixml-devel libwayland-client0 libwayland-cursor0 wayland-protocols-devel wayland-devel Mesa-libEGL-devel Mesa-libGLESv2-devel libgbm-devel libxkbcommon-devel libudev-devel libpixman-1-0-devel gtkmm3-devel jsoncpp-devel libxkbregistry-devel scdoc
|
zypper -n install git meson clang libinput10 libinput-devel pugixml-devel libwayland-client0 libwayland-cursor0 wayland-protocols-devel wayland-devel Mesa-libEGL-devel Mesa-libGLESv2-devel libgbm-devel libxkbcommon-devel libudev-devel libpixman-1-0-devel gtkmm3-devel jsoncpp-devel libxkbregistry-devel scdoc playerctl-devel
|
||||||
|
|
4
Makefile
4
Makefile
|
@ -19,5 +19,9 @@ run: build
|
||||||
debug-run: build-debug
|
debug-run: build-debug
|
||||||
./build/waybar --log-level debug
|
./build/waybar --log-level debug
|
||||||
|
|
||||||
|
test:
|
||||||
|
meson test -C build --no-rebuild --verbose --suite waybar
|
||||||
|
.PHONY: test
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rf build
|
rm -rf build
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# 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/extra/x86_64/waybar/) or
|
||||||
[AUR](https://aur.archlinux.org/packages/waybar-git/), [Gentoo](https://packages.gentoo.org/packages/gui-apps/waybar), [openSUSE](https://build.opensuse.org/package/show/X11:Wayland/waybar), and [Alpine Linux](https://pkgs.alpinelinux.org/packages?name=waybar).<br>
|
[AUR](https://aur.archlinux.org/packages/waybar-git/), [Gentoo](https://packages.gentoo.org/packages/gui-apps/waybar), [openSUSE](https://build.opensuse.org/package/show/X11:Wayland/waybar), and [Alpine Linux](https://pkgs.alpinelinux.org/packages?name=waybar).<br>
|
||||||
> *Waybar [examples](https://github.com/Alexays/Waybar/wiki/Examples)*
|
> *Waybar [examples](https://github.com/Alexays/Waybar/wiki/Examples)*
|
||||||
|
|
||||||
|
@ -9,6 +9,7 @@
|
||||||
- Sway (Workspaces, Binding mode, Focused window name)
|
- Sway (Workspaces, Binding mode, Focused window name)
|
||||||
- River (Mapping mode, Tags, Focused window name)
|
- River (Mapping mode, Tags, Focused window name)
|
||||||
- Hyprland (Focused window name)
|
- Hyprland (Focused window name)
|
||||||
|
- DWL (Tags) [requires dwl ipc patch](https://github.com/djpohly/dwl/wiki/ipc)
|
||||||
- Tray [#21](https://github.com/Alexays/Waybar/issues/21)
|
- Tray [#21](https://github.com/Alexays/Waybar/issues/21)
|
||||||
- Local time
|
- Local time
|
||||||
- Battery
|
- Battery
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
(import
|
||||||
|
(
|
||||||
|
let lock = builtins.fromJSON (builtins.readFile ./flake.lock); in
|
||||||
|
fetchTarball {
|
||||||
|
url = "https://github.com/edolstra/flake-compat/archive/${lock.nodes.flake-compat.locked.rev}.tar.gz";
|
||||||
|
sha256 = lock.nodes.flake-compat.locked.narHash;
|
||||||
|
}
|
||||||
|
)
|
||||||
|
{ src = ./.; }
|
||||||
|
).defaultNix
|
|
@ -0,0 +1,111 @@
|
||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"devshell": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": "flake-utils",
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1676293499,
|
||||||
|
"narHash": "sha256-uIOTlTxvrXxpKeTvwBI1JGDGtCxMXE3BI0LFwoQMhiQ=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "devshell",
|
||||||
|
"rev": "71e3022e3ab20bbf1342640547ef5bc14fb43bf4",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "devshell",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-compat": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1673956053,
|
||||||
|
"narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=",
|
||||||
|
"owner": "edolstra",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "edolstra",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-utils": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1642700792,
|
||||||
|
"narHash": "sha256-XqHrk7hFb+zBvRg6Ghl+AZDq03ov6OshJLiSWOoX5es=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "846b2ae0fc4cc943637d3d1def4454213e203cba",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-utils_2": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1676283394,
|
||||||
|
"narHash": "sha256-XX2f9c3iySLCw54rJ/CZs+ZK6IQy7GXNY4nSOyu2QG4=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "3db36a8b464d0c4532ba1c7dda728f4576d6d073",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1643381941,
|
||||||
|
"narHash": "sha256-pHTwvnN4tTsEKkWlXQ8JMY423epos8wUOhthpwJjtpc=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "5efc8ca954272c4376ac929f4c5ffefcc20551d5",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixpkgs-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs_2": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1676300157,
|
||||||
|
"narHash": "sha256-1HjRzfp6LOLfcj/HJHdVKWAkX9QRAouoh6AjzJiIerU=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "545c7a31e5dedea4a6d372712a18e00ce097d462",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"devshell": "devshell",
|
||||||
|
"flake-compat": "flake-compat",
|
||||||
|
"flake-utils": "flake-utils_2",
|
||||||
|
"nixpkgs": "nixpkgs_2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
|
@ -0,0 +1,93 @@
|
||||||
|
{
|
||||||
|
description = "Highly customizable Wayland bar for Sway and Wlroots based compositors.";
|
||||||
|
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||||
|
devshell.url = "github:numtide/devshell";
|
||||||
|
flake-utils.url = "github:numtide/flake-utils";
|
||||||
|
flake-compat = {
|
||||||
|
url = "github:edolstra/flake-compat";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = { self, flake-utils, devshell, nixpkgs, flake-compat }:
|
||||||
|
let
|
||||||
|
inherit (nixpkgs) lib;
|
||||||
|
genSystems = lib.genAttrs [
|
||||||
|
"x86_64-linux"
|
||||||
|
];
|
||||||
|
|
||||||
|
pkgsFor = genSystems (system:
|
||||||
|
import nixpkgs {
|
||||||
|
inherit system;
|
||||||
|
});
|
||||||
|
|
||||||
|
mkDate = longDate: (lib.concatStringsSep "-" [
|
||||||
|
(builtins.substring 0 4 longDate)
|
||||||
|
(builtins.substring 4 2 longDate)
|
||||||
|
(builtins.substring 6 2 longDate)
|
||||||
|
]);
|
||||||
|
in
|
||||||
|
{
|
||||||
|
overlays.default = _: prev: {
|
||||||
|
waybar = prev.callPackage ./nix/default.nix {
|
||||||
|
version = prev.waybar.version + "+date=" + (mkDate (self.lastModifiedDate or "19700101")) + "_" + (self.shortRev or "dirty");
|
||||||
|
};
|
||||||
|
};
|
||||||
|
packages = genSystems
|
||||||
|
(system:
|
||||||
|
(self.overlays.default null pkgsFor.${system})
|
||||||
|
// {
|
||||||
|
default = self.packages.${system}.waybar;
|
||||||
|
});
|
||||||
|
} //
|
||||||
|
flake-utils.lib.eachDefaultSystem (system: {
|
||||||
|
devShell =
|
||||||
|
let pkgs = import nixpkgs {
|
||||||
|
inherit system;
|
||||||
|
|
||||||
|
overlays = [ devshell.overlay ];
|
||||||
|
};
|
||||||
|
in
|
||||||
|
pkgs.devshell.mkShell {
|
||||||
|
imports = [ "${pkgs.devshell.extraModulesDir}/language/c.nix" ];
|
||||||
|
commands = [
|
||||||
|
{
|
||||||
|
package = pkgs.devshell.cli;
|
||||||
|
help = "Per project developer environments";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
devshell.packages = with pkgs; [
|
||||||
|
clang-tools
|
||||||
|
gdb
|
||||||
|
# from nativeBuildInputs
|
||||||
|
gnumake
|
||||||
|
meson
|
||||||
|
ninja
|
||||||
|
pkg-config
|
||||||
|
scdoc
|
||||||
|
] ++ (map lib.getDev [
|
||||||
|
# from buildInputs
|
||||||
|
wayland wlroots gtkmm3 libsigcxx jsoncpp spdlog gtk-layer-shell howard-hinnant-date libxkbcommon
|
||||||
|
# optional dependencies
|
||||||
|
gobject-introspection glib playerctl python3.pkgs.pygobject3
|
||||||
|
libevdev libinput libjack2 libmpdclient playerctl libnl
|
||||||
|
libpulseaudio sndio sway libdbusmenu-gtk3 udev upower wireplumber
|
||||||
|
|
||||||
|
# from propagated build inputs?
|
||||||
|
at-spi2-atk atkmm cairo cairomm catch2 fmt_8 fontconfig
|
||||||
|
gdk-pixbuf glibmm gtk3 harfbuzz pango pangomm wayland-protocols
|
||||||
|
]);
|
||||||
|
env = with pkgs; [
|
||||||
|
{ name = "CPLUS_INCLUDE_PATH"; prefix = "$DEVSHELL_DIR/include"; }
|
||||||
|
{ name = "PKG_CONFIG_PATH"; prefix = "$DEVSHELL_DIR/lib/pkgconfig"; }
|
||||||
|
{ name = "PKG_CONFIG_PATH"; prefix = "$DEVSHELL_DIR/share/pkgconfig"; }
|
||||||
|
{ name = "PATH"; prefix = "${wayland.bin}/bin"; }
|
||||||
|
{ name = "LIBRARY_PATH"; prefix = "${lib.getLib sndio}/lib"; }
|
||||||
|
{ name = "LIBRARY_PATH"; prefix = "${lib.getLib zlib}/lib"; }
|
||||||
|
{ name = "LIBRARY_PATH"; prefix = "${lib.getLib howard-hinnant-date}/lib"; }
|
||||||
|
];
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
|
@ -13,7 +13,7 @@ class AIconLabel : public ALabel {
|
||||||
const std::string &format, uint16_t interval = 0, bool ellipsize = false,
|
const std::string &format, uint16_t interval = 0, bool ellipsize = false,
|
||||||
bool enable_click = false, bool enable_scroll = false);
|
bool enable_click = false, bool enable_scroll = false);
|
||||||
virtual ~AIconLabel() = default;
|
virtual ~AIconLabel() = default;
|
||||||
virtual auto update() -> void;
|
auto update() -> void override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Gtk::Image image_;
|
Gtk::Image image_;
|
||||||
|
|
|
@ -14,7 +14,7 @@ class ALabel : public AModule {
|
||||||
uint16_t interval = 0, bool ellipsize = false, bool enable_click = false,
|
uint16_t interval = 0, bool ellipsize = false, bool enable_click = false,
|
||||||
bool enable_scroll = false);
|
bool enable_scroll = false);
|
||||||
virtual ~ALabel() = default;
|
virtual ~ALabel() = default;
|
||||||
virtual auto update() -> void;
|
auto update() -> void override;
|
||||||
virtual std::string getIcon(uint16_t, const std::string &alt = "", uint16_t max = 0);
|
virtual std::string getIcon(uint16_t, const std::string &alt = "", uint16_t max = 0);
|
||||||
virtual std::string getIcon(uint16_t, const std::vector<std::string> &alts, uint16_t max = 0);
|
virtual std::string getIcon(uint16_t, const std::vector<std::string> &alts, uint16_t max = 0);
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@ class ALabel : public AModule {
|
||||||
bool alt_ = false;
|
bool alt_ = false;
|
||||||
std::string default_format_;
|
std::string default_format_;
|
||||||
|
|
||||||
virtual bool handleToggle(GdkEventButton *const &e);
|
bool handleToggle(GdkEventButton *const &e) override;
|
||||||
virtual std::string getState(uint8_t value, bool lesser = false);
|
virtual std::string getState(uint8_t value, bool lesser = false);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -11,15 +11,20 @@ namespace waybar {
|
||||||
|
|
||||||
class AModule : public IModule {
|
class AModule : public IModule {
|
||||||
public:
|
public:
|
||||||
AModule(const Json::Value &, const std::string &, const std::string &, bool enable_click = false,
|
|
||||||
bool enable_scroll = false);
|
|
||||||
virtual ~AModule();
|
virtual ~AModule();
|
||||||
virtual auto update() -> void;
|
auto update() -> void override;
|
||||||
virtual operator Gtk::Widget &();
|
virtual auto refresh(int) -> void{};
|
||||||
|
operator Gtk::Widget &() override;
|
||||||
|
auto doAction(const std::string &name) -> void override;
|
||||||
|
|
||||||
Glib::Dispatcher dp;
|
Glib::Dispatcher dp;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
// Don't need to make an object directly
|
||||||
|
// Derived classes are able to use it
|
||||||
|
AModule(const Json::Value &, const std::string &, const std::string &, bool enable_click = false,
|
||||||
|
bool enable_scroll = false);
|
||||||
|
|
||||||
enum SCROLL_DIR { NONE, UP, DOWN, LEFT, RIGHT };
|
enum SCROLL_DIR { NONE, UP, DOWN, LEFT, RIGHT };
|
||||||
|
|
||||||
SCROLL_DIR getScrollDir(GdkEventScroll *e);
|
SCROLL_DIR getScrollDir(GdkEventScroll *e);
|
||||||
|
@ -36,6 +41,7 @@ class AModule : public IModule {
|
||||||
std::vector<int> pid_;
|
std::vector<int> pid_;
|
||||||
gdouble distance_scrolled_y_;
|
gdouble distance_scrolled_y_;
|
||||||
gdouble distance_scrolled_x_;
|
gdouble distance_scrolled_x_;
|
||||||
|
std::map<std::string, std::string> eventActionMap_;
|
||||||
static const inline std::map<std::pair<uint, GdkEventType>, std::string> eventMap_{
|
static const inline std::map<std::pair<uint, GdkEventType>, std::string> eventMap_{
|
||||||
{std::make_pair(1, GdkEventType::GDK_BUTTON_PRESS), "on-click"},
|
{std::make_pair(1, GdkEventType::GDK_BUTTON_PRESS), "on-click"},
|
||||||
{std::make_pair(1, GdkEventType::GDK_2BUTTON_PRESS), "on-double-click"},
|
{std::make_pair(1, GdkEventType::GDK_2BUTTON_PRESS), "on-double-click"},
|
||||||
|
|
|
@ -9,6 +9,7 @@ class IModule {
|
||||||
virtual ~IModule() = default;
|
virtual ~IModule() = default;
|
||||||
virtual auto update() -> void = 0;
|
virtual auto update() -> void = 0;
|
||||||
virtual operator Gtk::Widget&() = 0;
|
virtual operator Gtk::Widget&() = 0;
|
||||||
|
virtual auto doAction(const std::string& name) -> void = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace waybar
|
} // namespace waybar
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <json/json.h>
|
#include <json/json.h>
|
||||||
#ifdef HAVE_LIBDATE
|
#if defined(HAVE_CHRONO_TIMEZONES) || defined(HAVE_LIBDATE)
|
||||||
#include "modules/clock.hpp"
|
#include "modules/clock.hpp"
|
||||||
#else
|
#else
|
||||||
#include "modules/simpleclock.hpp"
|
#include "modules/simpleclock.hpp"
|
||||||
|
@ -18,14 +18,20 @@
|
||||||
#include "modules/wlr/workspace_manager.hpp"
|
#include "modules/wlr/workspace_manager.hpp"
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_RIVER
|
#ifdef HAVE_RIVER
|
||||||
|
#include "modules/river/layout.hpp"
|
||||||
#include "modules/river/mode.hpp"
|
#include "modules/river/mode.hpp"
|
||||||
#include "modules/river/tags.hpp"
|
#include "modules/river/tags.hpp"
|
||||||
#include "modules/river/window.hpp"
|
#include "modules/river/window.hpp"
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_DWL
|
||||||
|
#include "modules/dwl/tags.hpp"
|
||||||
|
#endif
|
||||||
#ifdef HAVE_HYPRLAND
|
#ifdef HAVE_HYPRLAND
|
||||||
#include "modules/hyprland/backend.hpp"
|
#include "modules/hyprland/backend.hpp"
|
||||||
#include "modules/hyprland/language.hpp"
|
#include "modules/hyprland/language.hpp"
|
||||||
|
#include "modules/hyprland/submap.hpp"
|
||||||
#include "modules/hyprland/window.hpp"
|
#include "modules/hyprland/window.hpp"
|
||||||
|
#include "modules/hyprland/workspaces.hpp"
|
||||||
#endif
|
#endif
|
||||||
#if defined(__FreeBSD__) || (defined(__linux__) && !defined(NO_FILESYSTEM))
|
#if defined(__FreeBSD__) || (defined(__linux__) && !defined(NO_FILESYSTEM))
|
||||||
#include "modules/battery.hpp"
|
#include "modules/battery.hpp"
|
||||||
|
@ -41,6 +47,9 @@
|
||||||
#ifdef HAVE_DBUSMENU
|
#ifdef HAVE_DBUSMENU
|
||||||
#include "modules/sni/tray.hpp"
|
#include "modules/sni/tray.hpp"
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_MPRIS
|
||||||
|
#include "modules/mpris/mpris.hpp"
|
||||||
|
#endif
|
||||||
#ifdef HAVE_LIBNL
|
#ifdef HAVE_LIBNL
|
||||||
#include "modules/network.hpp"
|
#include "modules/network.hpp"
|
||||||
#endif
|
#endif
|
||||||
|
@ -75,6 +84,9 @@
|
||||||
#ifdef HAVE_LIBWIREPLUMBER
|
#ifdef HAVE_LIBWIREPLUMBER
|
||||||
#include "modules/wireplumber.hpp"
|
#include "modules/wireplumber.hpp"
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_LIBCAVA
|
||||||
|
#include "modules/cava.hpp"
|
||||||
|
#endif
|
||||||
#include "bar.hpp"
|
#include "bar.hpp"
|
||||||
#include "modules/custom.hpp"
|
#include "modules/custom.hpp"
|
||||||
#include "modules/image.hpp"
|
#include "modules/image.hpp"
|
||||||
|
|
|
@ -12,10 +12,10 @@ namespace waybar {
|
||||||
|
|
||||||
class Group : public AModule {
|
class Group : public AModule {
|
||||||
public:
|
public:
|
||||||
Group(const std::string&, const Bar&, const Json::Value&);
|
Group(const std::string&, const std::string&, const Json::Value&, bool);
|
||||||
~Group() = default;
|
~Group() = default;
|
||||||
auto update() -> void;
|
auto update() -> void override;
|
||||||
operator Gtk::Widget&();
|
operator Gtk::Widget&() override;
|
||||||
Gtk::Box box;
|
Gtk::Box box;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "ALabel.hpp"
|
#include "ALabel.hpp"
|
||||||
|
#include "giomm/dbusproxy.h"
|
||||||
#include "util/json.hpp"
|
#include "util/json.hpp"
|
||||||
#include "util/sleeper_thread.hpp"
|
#include "util/sleeper_thread.hpp"
|
||||||
|
|
||||||
|
@ -39,8 +40,8 @@ class Backlight : public ALabel {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Backlight(const std::string &, const Json::Value &);
|
Backlight(const std::string &, const Json::Value &);
|
||||||
~Backlight();
|
virtual ~Backlight();
|
||||||
auto update() -> void;
|
auto update() -> void override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
template <class ForwardIt>
|
template <class ForwardIt>
|
||||||
|
@ -50,6 +51,8 @@ class Backlight : public ALabel {
|
||||||
template <class ForwardIt, class Inserter>
|
template <class ForwardIt, class Inserter>
|
||||||
static void enumerate_devices(ForwardIt first, ForwardIt last, Inserter inserter, udev *udev);
|
static void enumerate_devices(ForwardIt first, ForwardIt last, Inserter inserter, udev *udev);
|
||||||
|
|
||||||
|
bool handleScroll(GdkEventScroll *e) override;
|
||||||
|
|
||||||
const std::string preferred_device_;
|
const std::string preferred_device_;
|
||||||
static constexpr int EPOLL_MAX_EVENTS = 16;
|
static constexpr int EPOLL_MAX_EVENTS = 16;
|
||||||
|
|
||||||
|
@ -60,5 +63,7 @@ class Backlight : public ALabel {
|
||||||
std::vector<BacklightDev> devices_;
|
std::vector<BacklightDev> devices_;
|
||||||
// thread must destruct before shared data
|
// thread must destruct before shared data
|
||||||
util::SleeperThread udev_thread_;
|
util::SleeperThread udev_thread_;
|
||||||
|
|
||||||
|
Glib::RefPtr<Gio::DBus::Proxy> login_proxy_;
|
||||||
};
|
};
|
||||||
} // namespace waybar::modules
|
} // namespace waybar::modules
|
||||||
|
|
|
@ -29,8 +29,8 @@ namespace fs = std::filesystem;
|
||||||
class Battery : public ALabel {
|
class Battery : public ALabel {
|
||||||
public:
|
public:
|
||||||
Battery(const std::string&, const Json::Value&);
|
Battery(const std::string&, const Json::Value&);
|
||||||
~Battery();
|
virtual ~Battery();
|
||||||
auto update() -> void;
|
auto update() -> void override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static inline const fs::path data_dir_ = "/sys/class/power_supply/";
|
static inline const fs::path data_dir_ = "/sys/class/power_supply/";
|
||||||
|
|
|
@ -45,8 +45,8 @@ class Bluetooth : public ALabel {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Bluetooth(const std::string&, const Json::Value&);
|
Bluetooth(const std::string&, const Json::Value&);
|
||||||
~Bluetooth() = default;
|
virtual ~Bluetooth() = default;
|
||||||
auto update() -> void;
|
auto update() -> void override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static auto onInterfaceAddedOrRemoved(GDBusObjectManager*, GDBusObject*, GDBusInterface*,
|
static auto onInterfaceAddedOrRemoved(GDBusObjectManager*, GDBusObject*, GDBusInterface*,
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "ALabel.hpp"
|
||||||
|
#include "util/sleeper_thread.hpp"
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
#include <cava/common.h>
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace waybar::modules {
|
||||||
|
using namespace std::literals::chrono_literals;
|
||||||
|
|
||||||
|
class Cava final : public ALabel {
|
||||||
|
public:
|
||||||
|
Cava(const std::string&, const Json::Value&);
|
||||||
|
virtual ~Cava();
|
||||||
|
auto update() -> void override;
|
||||||
|
auto doAction(const std::string& name) -> void override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
util::SleeperThread thread_;
|
||||||
|
util::SleeperThread thread_fetch_input_;
|
||||||
|
|
||||||
|
struct error_s error_ {}; // cava errors
|
||||||
|
struct config_params prm_ {}; // cava parameters
|
||||||
|
struct audio_raw audio_raw_ {}; // cava handled raw audio data(is based on audio_data)
|
||||||
|
struct audio_data audio_data_ {}; // cava audio data
|
||||||
|
struct cava_plan* plan_; //{new cava_plan{}};
|
||||||
|
// Cava API to read audio source
|
||||||
|
ptr input_source_;
|
||||||
|
// Delay to handle audio source
|
||||||
|
std::chrono::milliseconds frame_time_milsec_{1s};
|
||||||
|
// Text to display
|
||||||
|
std::string text_{""};
|
||||||
|
int rePaint_{1};
|
||||||
|
std::chrono::seconds fetch_input_delay_{4};
|
||||||
|
std::chrono::seconds suspend_silence_delay_{0};
|
||||||
|
bool silence_{false};
|
||||||
|
int sleep_counter_{0};
|
||||||
|
// Cava method
|
||||||
|
void pause_resume();
|
||||||
|
// ModuleActionMap
|
||||||
|
static inline std::map<const std::string, void (waybar::modules::Cava::*const)()> actionMap_{
|
||||||
|
{"mode", &waybar::modules::Cava::pause_resume}};
|
||||||
|
};
|
||||||
|
} // namespace waybar::modules
|
|
@ -1,44 +1,72 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <date/tz.h>
|
|
||||||
|
|
||||||
#include "ALabel.hpp"
|
#include "ALabel.hpp"
|
||||||
|
#include "util/date.hpp"
|
||||||
#include "util/sleeper_thread.hpp"
|
#include "util/sleeper_thread.hpp"
|
||||||
|
|
||||||
namespace waybar {
|
namespace waybar::modules {
|
||||||
|
|
||||||
struct waybar_time;
|
|
||||||
|
|
||||||
namespace modules {
|
|
||||||
|
|
||||||
const std::string kCalendarPlaceholder = "calendar";
|
const std::string kCalendarPlaceholder = "calendar";
|
||||||
const std::string KTimezonedTimeListPlaceholder = "timezoned_time_list";
|
const std::string KTimezonedTimeListPlaceholder = "timezoned_time_list";
|
||||||
|
|
||||||
class Clock : public ALabel {
|
enum class WeeksSide {
|
||||||
|
LEFT,
|
||||||
|
RIGHT,
|
||||||
|
HIDDEN,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class CldMode { MONTH, YEAR };
|
||||||
|
|
||||||
|
class Clock final : public ALabel {
|
||||||
public:
|
public:
|
||||||
Clock(const std::string&, const Json::Value&);
|
Clock(const std::string&, const Json::Value&);
|
||||||
~Clock() = default;
|
virtual ~Clock() = default;
|
||||||
auto update() -> void;
|
auto update() -> void override;
|
||||||
|
auto doAction(const std::string& name) -> void override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
util::SleeperThread thread_;
|
util::SleeperThread thread_;
|
||||||
std::locale locale_;
|
std::locale locale_;
|
||||||
std::vector<const date::time_zone*> time_zones_;
|
std::vector<const date::time_zone*> time_zones_;
|
||||||
int current_time_zone_idx_;
|
int current_time_zone_idx_;
|
||||||
date::year_month_day calendar_cached_ymd_{date::January / 1 / 0};
|
|
||||||
date::months calendar_shift_{0}, calendar_shift_init_{0};
|
|
||||||
std::string calendar_cached_text_;
|
|
||||||
bool is_calendar_in_tooltip_;
|
bool is_calendar_in_tooltip_;
|
||||||
bool is_timezoned_list_in_tooltip_;
|
bool is_timezoned_list_in_tooltip_;
|
||||||
|
|
||||||
bool handleScroll(GdkEventScroll* e);
|
|
||||||
|
|
||||||
auto calendar_text(const waybar_time& wtime) -> std::string;
|
|
||||||
auto weekdays_header(const date::weekday& first_dow, std::ostream& os) -> void;
|
|
||||||
auto first_day_of_week() -> date::weekday;
|
auto first_day_of_week() -> date::weekday;
|
||||||
const date::time_zone* current_timezone();
|
const date::time_zone* current_timezone();
|
||||||
bool is_timezone_fixed();
|
bool is_timezone_fixed();
|
||||||
auto timezones_text(std::chrono::system_clock::time_point* now) -> std::string;
|
auto timezones_text(std::chrono::system_clock::time_point* now) -> std::string;
|
||||||
|
|
||||||
|
/*Calendar properties*/
|
||||||
|
WeeksSide cldWPos_{WeeksSide::HIDDEN};
|
||||||
|
std::map<int, std::string const> fmtMap_;
|
||||||
|
CldMode cldMode_{CldMode::MONTH};
|
||||||
|
uint cldMonCols_{3}; // Count of the month in the row
|
||||||
|
int cldMonColLen_{20}; // Length of the month column
|
||||||
|
int cldWnLen_{3}; // Length of the week number
|
||||||
|
date::year_month_day cldYearShift_;
|
||||||
|
date::year_month cldMonShift_;
|
||||||
|
date::months cldCurrShift_{0};
|
||||||
|
date::months cldShift_{0};
|
||||||
|
std::string cldYearCached_{};
|
||||||
|
std::string cldMonCached_{};
|
||||||
|
date::day cldBaseDay_{0};
|
||||||
|
/*Calendar functions*/
|
||||||
|
auto get_calendar(const date::zoned_seconds& now, const date::zoned_seconds& wtime)
|
||||||
|
-> std::string;
|
||||||
|
/*Clock actions*/
|
||||||
|
void cldModeSwitch();
|
||||||
|
void cldShift_up();
|
||||||
|
void cldShift_down();
|
||||||
|
void tz_up();
|
||||||
|
void tz_down();
|
||||||
|
|
||||||
|
// ModuleActionMap
|
||||||
|
static inline std::map<const std::string, void (waybar::modules::Clock::*const)()> actionMap_{
|
||||||
|
{"mode", &waybar::modules::Clock::cldModeSwitch},
|
||||||
|
{"shift_up", &waybar::modules::Clock::cldShift_up},
|
||||||
|
{"shift_down", &waybar::modules::Clock::cldShift_down},
|
||||||
|
{"tz_up", &waybar::modules::Clock::tz_up},
|
||||||
|
{"tz_down", &waybar::modules::Clock::tz_down}};
|
||||||
};
|
};
|
||||||
} // namespace modules
|
} // namespace waybar::modules
|
||||||
} // namespace waybar
|
|
||||||
|
|
|
@ -17,8 +17,8 @@ namespace waybar::modules {
|
||||||
class Cpu : public ALabel {
|
class Cpu : public ALabel {
|
||||||
public:
|
public:
|
||||||
Cpu(const std::string&, const Json::Value&);
|
Cpu(const std::string&, const Json::Value&);
|
||||||
~Cpu() = default;
|
virtual ~Cpu() = default;
|
||||||
auto update() -> void;
|
auto update() -> void override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
double getCpuLoad();
|
double getCpuLoad();
|
||||||
|
|
|
@ -15,9 +15,9 @@ namespace waybar::modules {
|
||||||
class Custom : public ALabel {
|
class Custom : public ALabel {
|
||||||
public:
|
public:
|
||||||
Custom(const std::string&, const std::string&, const Json::Value&);
|
Custom(const std::string&, const std::string&, const Json::Value&);
|
||||||
~Custom();
|
virtual ~Custom();
|
||||||
auto update() -> void;
|
auto update() -> void override;
|
||||||
void refresh(int /*signal*/);
|
void refresh(int /*signal*/) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void delayWorker();
|
void delayWorker();
|
||||||
|
@ -25,8 +25,8 @@ class Custom : public ALabel {
|
||||||
void parseOutputRaw();
|
void parseOutputRaw();
|
||||||
void parseOutputJson();
|
void parseOutputJson();
|
||||||
void handleEvent();
|
void handleEvent();
|
||||||
bool handleScroll(GdkEventScroll* e);
|
bool handleScroll(GdkEventScroll* e) override;
|
||||||
bool handleToggle(GdkEventButton* const& e);
|
bool handleToggle(GdkEventButton* const& e) override;
|
||||||
|
|
||||||
const std::string name_;
|
const std::string name_;
|
||||||
std::string text_;
|
std::string text_;
|
||||||
|
|
|
@ -14,8 +14,8 @@ namespace waybar::modules {
|
||||||
class Disk : public ALabel {
|
class Disk : public ALabel {
|
||||||
public:
|
public:
|
||||||
Disk(const std::string&, const Json::Value&);
|
Disk(const std::string&, const Json::Value&);
|
||||||
~Disk() = default;
|
virtual ~Disk() = default;
|
||||||
auto update() -> void;
|
auto update() -> void override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
util::SleeperThread thread_;
|
util::SleeperThread thread_;
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <gtkmm/button.h>
|
||||||
|
#include <wayland-client.h>
|
||||||
|
|
||||||
|
#include "AModule.hpp"
|
||||||
|
#include "bar.hpp"
|
||||||
|
#include "dwl-ipc-unstable-v2-client-protocol.h"
|
||||||
|
#include "xdg-output-unstable-v1-client-protocol.h"
|
||||||
|
|
||||||
|
namespace waybar::modules::dwl {
|
||||||
|
|
||||||
|
class Tags : public waybar::AModule {
|
||||||
|
public:
|
||||||
|
Tags(const std::string &, const waybar::Bar &, const Json::Value &);
|
||||||
|
virtual ~Tags();
|
||||||
|
|
||||||
|
// Handlers for wayland events
|
||||||
|
void handle_view_tags(uint32_t tag, uint32_t state, uint32_t clients, uint32_t focused);
|
||||||
|
|
||||||
|
void handle_primary_clicked(uint32_t tag);
|
||||||
|
bool handle_button_press(GdkEventButton *event_button, uint32_t tag);
|
||||||
|
|
||||||
|
struct zdwl_ipc_manager_v2 *status_manager_;
|
||||||
|
struct wl_seat *seat_;
|
||||||
|
|
||||||
|
private:
|
||||||
|
const waybar::Bar &bar_;
|
||||||
|
Gtk::Box box_;
|
||||||
|
std::vector<Gtk::Button> buttons_;
|
||||||
|
struct zdwl_ipc_output_v2 *output_status_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} /* namespace waybar::modules::dwl */
|
|
@ -18,8 +18,8 @@ namespace waybar::modules {
|
||||||
class Gamemode : public AModule {
|
class Gamemode : public AModule {
|
||||||
public:
|
public:
|
||||||
Gamemode(const std::string &, const Json::Value &);
|
Gamemode(const std::string &, const Json::Value &);
|
||||||
~Gamemode();
|
virtual ~Gamemode();
|
||||||
auto update() -> void;
|
auto update() -> void override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const std::string DEFAULT_ICON_NAME = "input-gaming-symbolic";
|
const std::string DEFAULT_ICON_NAME = "input-gaming-symbolic";
|
||||||
|
@ -39,7 +39,7 @@ class Gamemode : public AModule {
|
||||||
const Glib::VariantContainerBase &arguments);
|
const Glib::VariantContainerBase &arguments);
|
||||||
|
|
||||||
void getData();
|
void getData();
|
||||||
bool handleToggle(GdkEventButton *const &);
|
bool handleToggle(GdkEventButton *const &) override;
|
||||||
|
|
||||||
// Config
|
// Config
|
||||||
std::string format = DEFAULT_FORMAT;
|
std::string format = DEFAULT_FORMAT;
|
||||||
|
|
|
@ -6,6 +6,8 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
|
|
||||||
|
#include "util/json.hpp"
|
||||||
|
|
||||||
namespace waybar::modules::hyprland {
|
namespace waybar::modules::hyprland {
|
||||||
|
|
||||||
class EventHandler {
|
class EventHandler {
|
||||||
|
@ -22,12 +24,14 @@ class IPC {
|
||||||
void unregisterForIPC(EventHandler*);
|
void unregisterForIPC(EventHandler*);
|
||||||
|
|
||||||
std::string getSocket1Reply(const std::string& rq);
|
std::string getSocket1Reply(const std::string& rq);
|
||||||
|
Json::Value getSocket1JsonReply(const std::string& rq);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void startIPC();
|
void startIPC();
|
||||||
void parseIPC(const std::string&);
|
void parseIPC(const std::string&);
|
||||||
|
|
||||||
std::mutex callbackMutex;
|
std::mutex callbackMutex;
|
||||||
|
util::JsonParser parser_;
|
||||||
std::list<std::pair<std::string, EventHandler*>> callbacks;
|
std::list<std::pair<std::string, EventHandler*>> callbacks;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -10,20 +10,29 @@ namespace waybar::modules::hyprland {
|
||||||
class Language : public waybar::ALabel, public EventHandler {
|
class Language : public waybar::ALabel, public EventHandler {
|
||||||
public:
|
public:
|
||||||
Language(const std::string&, const waybar::Bar&, const Json::Value&);
|
Language(const std::string&, const waybar::Bar&, const Json::Value&);
|
||||||
~Language();
|
virtual ~Language();
|
||||||
|
|
||||||
auto update() -> void;
|
auto update() -> void override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void onEvent(const std::string&);
|
void onEvent(const std::string&) override;
|
||||||
|
|
||||||
void initLanguage();
|
void initLanguage();
|
||||||
std::string getShortFrom(const std::string&);
|
|
||||||
|
struct Layout {
|
||||||
|
std::string full_name;
|
||||||
|
std::string short_name;
|
||||||
|
std::string variant;
|
||||||
|
std::string short_description;
|
||||||
|
};
|
||||||
|
|
||||||
|
auto getLayout(const std::string&) -> Layout;
|
||||||
|
|
||||||
std::mutex mutex_;
|
std::mutex mutex_;
|
||||||
const Bar& bar_;
|
const Bar& bar_;
|
||||||
util::JsonParser parser_;
|
util::JsonParser parser_;
|
||||||
std::string layoutName_;
|
|
||||||
|
Layout layout_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace waybar::modules::hyprland
|
} // namespace waybar::modules::hyprland
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
#include <fmt/format.h>
|
||||||
|
|
||||||
|
#include "ALabel.hpp"
|
||||||
|
#include "bar.hpp"
|
||||||
|
#include "modules/hyprland/backend.hpp"
|
||||||
|
#include "util/json.hpp"
|
||||||
|
|
||||||
|
namespace waybar::modules::hyprland {
|
||||||
|
|
||||||
|
class Submap : public waybar::ALabel, public EventHandler {
|
||||||
|
public:
|
||||||
|
Submap(const std::string&, const waybar::Bar&, const Json::Value&);
|
||||||
|
virtual ~Submap();
|
||||||
|
|
||||||
|
auto update() -> void override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void onEvent(const std::string&) override;
|
||||||
|
|
||||||
|
std::mutex mutex_;
|
||||||
|
const Bar& bar_;
|
||||||
|
util::JsonParser parser_;
|
||||||
|
std::string submap_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace waybar::modules::hyprland
|
|
@ -1,7 +1,5 @@
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
|
|
||||||
#include <tuple>
|
|
||||||
|
|
||||||
#include "ALabel.hpp"
|
#include "ALabel.hpp"
|
||||||
#include "bar.hpp"
|
#include "bar.hpp"
|
||||||
#include "modules/hyprland/backend.hpp"
|
#include "modules/hyprland/backend.hpp"
|
||||||
|
@ -12,20 +10,37 @@ namespace waybar::modules::hyprland {
|
||||||
class Window : public waybar::ALabel, public EventHandler {
|
class Window : public waybar::ALabel, public EventHandler {
|
||||||
public:
|
public:
|
||||||
Window(const std::string&, const waybar::Bar&, const Json::Value&);
|
Window(const std::string&, const waybar::Bar&, const Json::Value&);
|
||||||
~Window();
|
virtual ~Window();
|
||||||
|
|
||||||
auto update() -> void;
|
auto update() -> void override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int getActiveWorkspaceID(std::string);
|
struct Workspace {
|
||||||
std::string getLastWindowTitle(int);
|
int id;
|
||||||
void onEvent(const std::string&);
|
int windows;
|
||||||
|
std::string last_window;
|
||||||
|
std::string last_window_title;
|
||||||
|
|
||||||
|
static auto parse(const Json::Value&) -> Workspace;
|
||||||
|
};
|
||||||
|
|
||||||
|
auto getActiveWorkspace(const std::string&) -> Workspace;
|
||||||
|
auto getActiveWorkspace() -> Workspace;
|
||||||
|
void onEvent(const std::string&) override;
|
||||||
|
void queryActiveWorkspace();
|
||||||
|
void setClass(const std::string&, bool enable);
|
||||||
|
|
||||||
bool separate_outputs;
|
bool separate_outputs;
|
||||||
std::mutex mutex_;
|
std::mutex mutex_;
|
||||||
const Bar& bar_;
|
const Bar& bar_;
|
||||||
util::JsonParser parser_;
|
util::JsonParser parser_;
|
||||||
std::string lastView;
|
std::string last_title_;
|
||||||
|
Workspace workspace_;
|
||||||
|
std::string solo_class_;
|
||||||
|
std::string last_solo_class_;
|
||||||
|
bool solo_;
|
||||||
|
bool all_floating_;
|
||||||
|
bool fullscreen_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace waybar::modules::hyprland
|
} // namespace waybar::modules::hyprland
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
#include <gtkmm/button.h>
|
||||||
|
#include <gtkmm/label.h>
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
#include "AModule.hpp"
|
||||||
|
#include "bar.hpp"
|
||||||
|
#include "modules/hyprland/backend.hpp"
|
||||||
|
|
||||||
|
namespace waybar::modules::hyprland {
|
||||||
|
|
||||||
|
struct WorkspaceDto {
|
||||||
|
int id;
|
||||||
|
|
||||||
|
static WorkspaceDto parse(const Json::Value& value);
|
||||||
|
};
|
||||||
|
|
||||||
|
class Workspace {
|
||||||
|
public:
|
||||||
|
Workspace(int id);
|
||||||
|
Workspace(WorkspaceDto dto);
|
||||||
|
int id() const { return id_; };
|
||||||
|
int active() const { return active_; };
|
||||||
|
std::string& select_icon(std::map<std::string, std::string>& icons_map);
|
||||||
|
void set_active(bool value = true) { active_ = value; };
|
||||||
|
Gtk::Button& button() { return button_; };
|
||||||
|
|
||||||
|
void update(const std::string& format, const std::string& icon);
|
||||||
|
|
||||||
|
private:
|
||||||
|
int id_;
|
||||||
|
bool active_;
|
||||||
|
|
||||||
|
Gtk::Button button_;
|
||||||
|
Gtk::Box content_;
|
||||||
|
Gtk::Label label_;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Workspaces : public AModule, public EventHandler {
|
||||||
|
public:
|
||||||
|
Workspaces(const std::string&, const waybar::Bar&, const Json::Value&);
|
||||||
|
virtual ~Workspaces();
|
||||||
|
void update() override;
|
||||||
|
void init();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void onEvent(const std::string&) override;
|
||||||
|
void sort_workspaces();
|
||||||
|
void create_workspace(int id);
|
||||||
|
void remove_workspace(int id);
|
||||||
|
|
||||||
|
std::string format_;
|
||||||
|
std::map<std::string, std::string> icons_map_;
|
||||||
|
bool with_icon_;
|
||||||
|
int active_workspace_id;
|
||||||
|
std::vector<std::unique_ptr<Workspace>> workspaces_;
|
||||||
|
std::vector<int> workspaces_to_create_;
|
||||||
|
std::vector<int> workspaces_to_remove_;
|
||||||
|
std::mutex mutex_;
|
||||||
|
const Bar& bar_;
|
||||||
|
Gtk::Box box_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace waybar::modules::hyprland
|
|
@ -13,13 +13,13 @@ class IdleInhibitor : public ALabel {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
IdleInhibitor(const std::string&, const waybar::Bar&, const Json::Value&);
|
IdleInhibitor(const std::string&, const waybar::Bar&, const Json::Value&);
|
||||||
~IdleInhibitor();
|
virtual ~IdleInhibitor();
|
||||||
auto update() -> void;
|
auto update() -> void override;
|
||||||
static std::list<waybar::AModule*> modules;
|
static std::list<waybar::AModule*> modules;
|
||||||
static bool status;
|
static bool status;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool handleToggle(GdkEventButton* const& e);
|
bool handleToggle(GdkEventButton* const& e) override;
|
||||||
void toggleStatus();
|
void toggleStatus();
|
||||||
|
|
||||||
const Bar& bar_;
|
const Bar& bar_;
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include "ALabel.hpp"
|
#include "ALabel.hpp"
|
||||||
|
#include "gtkmm/box.h"
|
||||||
#include "util/command.hpp"
|
#include "util/command.hpp"
|
||||||
#include "util/json.hpp"
|
#include "util/json.hpp"
|
||||||
#include "util/sleeper_thread.hpp"
|
#include "util/sleeper_thread.hpp"
|
||||||
|
@ -15,18 +16,23 @@ namespace waybar::modules {
|
||||||
|
|
||||||
class Image : public AModule {
|
class Image : public AModule {
|
||||||
public:
|
public:
|
||||||
Image(const std::string&, const std::string&, const Json::Value&);
|
Image(const std::string&, const Json::Value&);
|
||||||
auto update() -> void;
|
virtual ~Image() = default;
|
||||||
void refresh(int /*signal*/);
|
auto update() -> void override;
|
||||||
|
void refresh(int /*signal*/) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void delayWorker();
|
void delayWorker();
|
||||||
void handleEvent();
|
void handleEvent();
|
||||||
|
void parseOutputRaw();
|
||||||
|
|
||||||
Gtk::Image image_;
|
Gtk::Box box_;
|
||||||
|
Gtk::Image image_;
|
||||||
std::string path_;
|
std::string path_;
|
||||||
int size_;
|
std::string tooltip_;
|
||||||
int interval_;
|
int size_;
|
||||||
|
int interval_;
|
||||||
|
util::command::res output_;
|
||||||
|
|
||||||
util::SleeperThread thread_;
|
util::SleeperThread thread_;
|
||||||
};
|
};
|
||||||
|
|
|
@ -12,12 +12,12 @@ namespace waybar::modules {
|
||||||
class Inhibitor : public ALabel {
|
class Inhibitor : public ALabel {
|
||||||
public:
|
public:
|
||||||
Inhibitor(const std::string&, const waybar::Bar&, const Json::Value&);
|
Inhibitor(const std::string&, const waybar::Bar&, const Json::Value&);
|
||||||
~Inhibitor() override;
|
virtual ~Inhibitor();
|
||||||
auto update() -> void;
|
auto update() -> void override;
|
||||||
auto activated() -> bool;
|
auto activated() -> bool;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
auto handleToggle(::GdkEventButton* const& e) -> bool;
|
auto handleToggle(::GdkEventButton* const& e) -> bool override;
|
||||||
|
|
||||||
const std::unique_ptr<::GDBusConnection, void (*)(::GDBusConnection*)> dbus_;
|
const std::unique_ptr<::GDBusConnection, void (*)(::GDBusConnection*)> dbus_;
|
||||||
const std::string inhibitors_;
|
const std::string inhibitors_;
|
||||||
|
|
|
@ -14,8 +14,8 @@ namespace waybar::modules {
|
||||||
class JACK : public ALabel {
|
class JACK : public ALabel {
|
||||||
public:
|
public:
|
||||||
JACK(const std::string &, const Json::Value &);
|
JACK(const std::string &, const Json::Value &);
|
||||||
~JACK() = default;
|
virtual ~JACK() = default;
|
||||||
auto update() -> void;
|
auto update() -> void override;
|
||||||
|
|
||||||
int bufSize(jack_nframes_t size);
|
int bufSize(jack_nframes_t size);
|
||||||
int sampleRate(jack_nframes_t rate);
|
int sampleRate(jack_nframes_t rate);
|
||||||
|
|
|
@ -19,8 +19,8 @@ namespace waybar::modules {
|
||||||
class KeyboardState : public AModule {
|
class KeyboardState : public AModule {
|
||||||
public:
|
public:
|
||||||
KeyboardState(const std::string&, const waybar::Bar&, const Json::Value&);
|
KeyboardState(const std::string&, const waybar::Bar&, const Json::Value&);
|
||||||
~KeyboardState();
|
virtual ~KeyboardState();
|
||||||
auto update() -> void;
|
auto update() -> void override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
auto tryAddDevice(const std::string&) -> void;
|
auto tryAddDevice(const std::string&) -> void;
|
||||||
|
|
|
@ -13,8 +13,8 @@ namespace waybar::modules {
|
||||||
class Memory : public ALabel {
|
class Memory : public ALabel {
|
||||||
public:
|
public:
|
||||||
Memory(const std::string&, const Json::Value&);
|
Memory(const std::string&, const Json::Value&);
|
||||||
~Memory() = default;
|
virtual ~Memory() = default;
|
||||||
auto update() -> void;
|
auto update() -> void override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void parseMeminfo();
|
void parseMeminfo();
|
||||||
|
|
|
@ -37,7 +37,7 @@ class MPD : public ALabel {
|
||||||
public:
|
public:
|
||||||
MPD(const std::string&, const Json::Value&);
|
MPD(const std::string&, const Json::Value&);
|
||||||
virtual ~MPD() noexcept = default;
|
virtual ~MPD() noexcept = default;
|
||||||
auto update() -> void;
|
auto update() -> void override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string getTag(mpd_tag_type type, unsigned idx = 0) const;
|
std::string getTag(mpd_tag_type type, unsigned idx = 0) const;
|
||||||
|
|
|
@ -0,0 +1,88 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <optional>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "gtkmm/box.h"
|
||||||
|
#include "gtkmm/label.h"
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
#include <playerctl/playerctl.h>
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "ALabel.hpp"
|
||||||
|
#include "util/sleeper_thread.hpp"
|
||||||
|
|
||||||
|
namespace waybar::modules::mpris {
|
||||||
|
|
||||||
|
class Mpris : public ALabel {
|
||||||
|
public:
|
||||||
|
Mpris(const std::string&, const Json::Value&);
|
||||||
|
virtual ~Mpris();
|
||||||
|
auto update() -> void override;
|
||||||
|
bool handleToggle(GdkEventButton* const&) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
static auto onPlayerNameAppeared(PlayerctlPlayerManager*, PlayerctlPlayerName*, gpointer) -> void;
|
||||||
|
static auto onPlayerNameVanished(PlayerctlPlayerManager*, PlayerctlPlayerName*, gpointer) -> void;
|
||||||
|
static auto onPlayerPlay(PlayerctlPlayer*, gpointer) -> void;
|
||||||
|
static auto onPlayerPause(PlayerctlPlayer*, gpointer) -> void;
|
||||||
|
static auto onPlayerStop(PlayerctlPlayer*, gpointer) -> void;
|
||||||
|
static auto onPlayerMetadata(PlayerctlPlayer*, GVariant*, gpointer) -> void;
|
||||||
|
|
||||||
|
struct PlayerInfo {
|
||||||
|
std::string name;
|
||||||
|
PlayerctlPlaybackStatus status;
|
||||||
|
std::string status_string;
|
||||||
|
|
||||||
|
std::optional<std::string> artist;
|
||||||
|
std::optional<std::string> album;
|
||||||
|
std::optional<std::string> title;
|
||||||
|
std::optional<std::string> length; // as HH:MM:SS
|
||||||
|
std::optional<std::string> position; // same format
|
||||||
|
};
|
||||||
|
|
||||||
|
auto getPlayerInfo() -> std::optional<PlayerInfo>;
|
||||||
|
auto getIconFromJson(const Json::Value&, const std::string&) -> std::string;
|
||||||
|
auto getArtistStr(const PlayerInfo&, bool) -> std::string;
|
||||||
|
auto getAlbumStr(const PlayerInfo&, bool) -> std::string;
|
||||||
|
auto getTitleStr(const PlayerInfo&, bool) -> std::string;
|
||||||
|
auto getLengthStr(const PlayerInfo&, bool) -> std::string;
|
||||||
|
auto getPositionStr(const PlayerInfo&, bool) -> std::string;
|
||||||
|
auto getDynamicStr(const PlayerInfo&, bool, bool) -> std::string;
|
||||||
|
|
||||||
|
// config
|
||||||
|
std::string format_playing_;
|
||||||
|
std::string format_paused_;
|
||||||
|
std::string format_stopped_;
|
||||||
|
|
||||||
|
std::string tooltip_;
|
||||||
|
std::string tooltip_playing_;
|
||||||
|
std::string tooltip_paused_;
|
||||||
|
std::string tooltip_stopped_;
|
||||||
|
|
||||||
|
int artist_len_;
|
||||||
|
int album_len_;
|
||||||
|
int title_len_;
|
||||||
|
int dynamic_len_;
|
||||||
|
std::string dynamic_separator_;
|
||||||
|
std::vector<std::string> dynamic_order_;
|
||||||
|
std::vector<std::string> dynamic_prio_;
|
||||||
|
bool truncate_hours_;
|
||||||
|
bool tooltip_len_limits_;
|
||||||
|
std::string ellipsis_;
|
||||||
|
|
||||||
|
std::string player_;
|
||||||
|
std::vector<std::string> ignored_players_;
|
||||||
|
|
||||||
|
PlayerctlPlayerManager* manager;
|
||||||
|
PlayerctlPlayer* player;
|
||||||
|
std::string lastStatus;
|
||||||
|
std::string lastPlayer;
|
||||||
|
|
||||||
|
util::SleeperThread thread_;
|
||||||
|
std::chrono::time_point<std::chrono::system_clock> last_update_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace waybar::modules::mpris
|
|
@ -21,8 +21,8 @@ namespace waybar::modules {
|
||||||
class Network : public ALabel {
|
class Network : public ALabel {
|
||||||
public:
|
public:
|
||||||
Network(const std::string&, const Json::Value&);
|
Network(const std::string&, const Json::Value&);
|
||||||
~Network();
|
virtual ~Network();
|
||||||
auto update() -> void;
|
auto update() -> void override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static const uint8_t MAX_RETRY = 5;
|
static const uint8_t MAX_RETRY = 5;
|
||||||
|
@ -62,6 +62,7 @@ class Network : public ALabel {
|
||||||
bool want_link_dump_;
|
bool want_link_dump_;
|
||||||
bool want_addr_dump_;
|
bool want_addr_dump_;
|
||||||
bool dump_in_progress_;
|
bool dump_in_progress_;
|
||||||
|
bool is_p2p_;
|
||||||
|
|
||||||
unsigned long long bandwidth_down_total_;
|
unsigned long long bandwidth_down_total_;
|
||||||
unsigned long long bandwidth_up_total_;
|
unsigned long long bandwidth_up_total_;
|
||||||
|
@ -77,7 +78,6 @@ class Network : public ALabel {
|
||||||
int32_t signal_strength_dbm_;
|
int32_t signal_strength_dbm_;
|
||||||
uint8_t signal_strength_;
|
uint8_t signal_strength_;
|
||||||
std::string signal_strength_app_;
|
std::string signal_strength_app_;
|
||||||
float frequency_;
|
|
||||||
uint32_t route_priority;
|
uint32_t route_priority;
|
||||||
|
|
||||||
util::SleeperThread thread_;
|
util::SleeperThread thread_;
|
||||||
|
@ -85,6 +85,7 @@ class Network : public ALabel {
|
||||||
#ifdef WANT_RFKILL
|
#ifdef WANT_RFKILL
|
||||||
util::Rfkill rfkill_;
|
util::Rfkill rfkill_;
|
||||||
#endif
|
#endif
|
||||||
|
float frequency_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace waybar::modules
|
} // namespace waybar::modules
|
||||||
|
|
|
@ -14,8 +14,8 @@ namespace waybar::modules {
|
||||||
class Pulseaudio : public ALabel {
|
class Pulseaudio : public ALabel {
|
||||||
public:
|
public:
|
||||||
Pulseaudio(const std::string&, const Json::Value&);
|
Pulseaudio(const std::string&, const Json::Value&);
|
||||||
~Pulseaudio();
|
virtual ~Pulseaudio();
|
||||||
auto update() -> void;
|
auto update() -> void override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static void subscribeCb(pa_context*, pa_subscription_event_type_t, uint32_t, void*);
|
static void subscribeCb(pa_context*, pa_subscription_event_type_t, uint32_t, void*);
|
||||||
|
@ -25,7 +25,7 @@ class Pulseaudio : public ALabel {
|
||||||
static void serverInfoCb(pa_context*, const pa_server_info*, void*);
|
static void serverInfoCb(pa_context*, const pa_server_info*, void*);
|
||||||
static void volumeModifyCb(pa_context*, int, void*);
|
static void volumeModifyCb(pa_context*, int, void*);
|
||||||
|
|
||||||
bool handleScroll(GdkEventScroll* e);
|
bool handleScroll(GdkEventScroll* e) override;
|
||||||
const std::vector<std::string> getPulseIcon() const;
|
const std::vector<std::string> getPulseIcon() const;
|
||||||
|
|
||||||
pa_threaded_mainloop* mainloop_;
|
pa_threaded_mainloop* mainloop_;
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <wayland-client.h>
|
||||||
|
|
||||||
|
#include "ALabel.hpp"
|
||||||
|
#include "bar.hpp"
|
||||||
|
#include "river-status-unstable-v1-client-protocol.h"
|
||||||
|
|
||||||
|
namespace waybar::modules::river {
|
||||||
|
|
||||||
|
class Layout : public waybar::ALabel {
|
||||||
|
public:
|
||||||
|
Layout(const std::string &, const waybar::Bar &, const Json::Value &);
|
||||||
|
virtual ~Layout();
|
||||||
|
|
||||||
|
// Handlers for wayland events
|
||||||
|
void handle_name(const char *name);
|
||||||
|
void handle_clear();
|
||||||
|
void handle_focused_output(struct wl_output *output);
|
||||||
|
void handle_unfocused_output(struct wl_output *output);
|
||||||
|
|
||||||
|
struct zriver_status_manager_v1 *status_manager_;
|
||||||
|
struct wl_seat *seat_;
|
||||||
|
|
||||||
|
private:
|
||||||
|
const waybar::Bar &bar_;
|
||||||
|
struct wl_output *output_; // stores the output this module belongs to
|
||||||
|
struct wl_output *focused_output_; // stores the currently focused output
|
||||||
|
struct zriver_output_status_v1 *output_status_;
|
||||||
|
struct zriver_seat_status_v1 *seat_status_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} /* namespace waybar::modules::river */
|
|
@ -11,7 +11,7 @@ namespace waybar::modules::river {
|
||||||
class Mode : public waybar::ALabel {
|
class Mode : public waybar::ALabel {
|
||||||
public:
|
public:
|
||||||
Mode(const std::string &, const waybar::Bar &, const Json::Value &);
|
Mode(const std::string &, const waybar::Bar &, const Json::Value &);
|
||||||
~Mode();
|
virtual ~Mode();
|
||||||
|
|
||||||
// Handlers for wayland events
|
// Handlers for wayland events
|
||||||
void handle_mode(const char *mode);
|
void handle_mode(const char *mode);
|
||||||
|
|
|
@ -14,7 +14,7 @@ namespace waybar::modules::river {
|
||||||
class Tags : public waybar::AModule {
|
class Tags : public waybar::AModule {
|
||||||
public:
|
public:
|
||||||
Tags(const std::string &, const waybar::Bar &, const Json::Value &);
|
Tags(const std::string &, const waybar::Bar &, const Json::Value &);
|
||||||
~Tags();
|
virtual ~Tags();
|
||||||
|
|
||||||
// Handlers for wayland events
|
// Handlers for wayland events
|
||||||
void handle_focused_tags(uint32_t tags);
|
void handle_focused_tags(uint32_t tags);
|
||||||
|
|
|
@ -13,7 +13,7 @@ namespace waybar::modules::river {
|
||||||
class Window : public waybar::ALabel {
|
class Window : public waybar::ALabel {
|
||||||
public:
|
public:
|
||||||
Window(const std::string &, const waybar::Bar &, const Json::Value &);
|
Window(const std::string &, const waybar::Bar &, const Json::Value &);
|
||||||
~Window();
|
virtual ~Window();
|
||||||
|
|
||||||
// Handlers for wayland events
|
// Handlers for wayland events
|
||||||
void handle_focused_view(const char *title);
|
void handle_focused_view(const char *title);
|
||||||
|
|
|
@ -10,8 +10,8 @@ namespace waybar::modules {
|
||||||
class Clock : public ALabel {
|
class Clock : public ALabel {
|
||||||
public:
|
public:
|
||||||
Clock(const std::string&, const Json::Value&);
|
Clock(const std::string&, const Json::Value&);
|
||||||
~Clock() = default;
|
virtual ~Clock() = default;
|
||||||
auto update() -> void;
|
auto update() -> void override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
util::SleeperThread thread_;
|
util::SleeperThread thread_;
|
||||||
|
|
|
@ -12,12 +12,12 @@ namespace waybar::modules {
|
||||||
class Sndio : public ALabel {
|
class Sndio : public ALabel {
|
||||||
public:
|
public:
|
||||||
Sndio(const std::string &, const Json::Value &);
|
Sndio(const std::string &, const Json::Value &);
|
||||||
~Sndio();
|
virtual ~Sndio();
|
||||||
auto update() -> void;
|
auto update() -> void override;
|
||||||
auto set_desc(struct sioctl_desc *, unsigned int) -> void;
|
auto set_desc(struct sioctl_desc *, unsigned int) -> void;
|
||||||
auto put_val(unsigned int, unsigned int) -> void;
|
auto put_val(unsigned int, unsigned int) -> void;
|
||||||
bool handleScroll(GdkEventScroll *);
|
bool handleScroll(GdkEventScroll *) override;
|
||||||
bool handleToggle(GdkEventButton *const &);
|
bool handleToggle(GdkEventButton *const &) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
auto connect_to_sndio() -> void;
|
auto connect_to_sndio() -> void;
|
||||||
|
|
|
@ -13,8 +13,8 @@ namespace waybar::modules::SNI {
|
||||||
class Tray : public AModule {
|
class Tray : public AModule {
|
||||||
public:
|
public:
|
||||||
Tray(const std::string&, const Bar&, const Json::Value&);
|
Tray(const std::string&, const Bar&, const Json::Value&);
|
||||||
~Tray() = default;
|
virtual ~Tray() = default;
|
||||||
auto update() -> void;
|
auto update() -> void override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void onAdd(std::unique_ptr<Item>& item);
|
void onAdd(std::unique_ptr<Item>& item);
|
||||||
|
|
|
@ -8,6 +8,8 @@
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
#include "ipc.hpp"
|
#include "ipc.hpp"
|
||||||
#include "util/sleeper_thread.hpp"
|
#include "util/sleeper_thread.hpp"
|
||||||
|
|
|
@ -17,8 +17,8 @@ namespace waybar::modules::sway {
|
||||||
class Language : public ALabel, public sigc::trackable {
|
class Language : public ALabel, public sigc::trackable {
|
||||||
public:
|
public:
|
||||||
Language(const std::string& id, const Json::Value& config);
|
Language(const std::string& id, const Json::Value& config);
|
||||||
~Language() = default;
|
virtual ~Language() = default;
|
||||||
auto update() -> void;
|
auto update() -> void override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
enum class DispayedShortFlag { None = 0, ShortName = 1, ShortDescription = 1 << 1 };
|
enum class DispayedShortFlag { None = 0, ShortName = 1, ShortDescription = 1 << 1 };
|
||||||
|
|
|
@ -13,8 +13,8 @@ namespace waybar::modules::sway {
|
||||||
class Mode : public ALabel, public sigc::trackable {
|
class Mode : public ALabel, public sigc::trackable {
|
||||||
public:
|
public:
|
||||||
Mode(const std::string&, const Json::Value&);
|
Mode(const std::string&, const Json::Value&);
|
||||||
~Mode() = default;
|
virtual ~Mode() = default;
|
||||||
auto update() -> void;
|
auto update() -> void override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void onEvent(const struct Ipc::ipc_response&);
|
void onEvent(const struct Ipc::ipc_response&);
|
||||||
|
|
|
@ -15,8 +15,8 @@ namespace waybar::modules::sway {
|
||||||
class Scratchpad : public ALabel {
|
class Scratchpad : public ALabel {
|
||||||
public:
|
public:
|
||||||
Scratchpad(const std::string&, const Json::Value&);
|
Scratchpad(const std::string&, const Json::Value&);
|
||||||
~Scratchpad() = default;
|
virtual ~Scratchpad() = default;
|
||||||
auto update() -> void;
|
auto update() -> void override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
auto getTree() -> void;
|
auto getTree() -> void;
|
||||||
|
|
|
@ -15,14 +15,15 @@ namespace waybar::modules::sway {
|
||||||
class Window : public AIconLabel, public sigc::trackable {
|
class Window : public AIconLabel, public sigc::trackable {
|
||||||
public:
|
public:
|
||||||
Window(const std::string&, const waybar::Bar&, const Json::Value&);
|
Window(const std::string&, const waybar::Bar&, const Json::Value&);
|
||||||
~Window() = default;
|
virtual ~Window() = default;
|
||||||
auto update() -> void;
|
auto update() -> void override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void setClass(std::string classname, bool enable);
|
||||||
void onEvent(const struct Ipc::ipc_response&);
|
void onEvent(const struct Ipc::ipc_response&);
|
||||||
void onCmd(const struct Ipc::ipc_response&);
|
void onCmd(const struct Ipc::ipc_response&);
|
||||||
std::tuple<std::size_t, int, std::string, std::string, std::string, std::string> getFocusedNode(
|
std::tuple<std::size_t, int, int, std::string, std::string, std::string, std::string, std::string>
|
||||||
const Json::Value& nodes, std::string& output);
|
getFocusedNode(const Json::Value& nodes, std::string& output);
|
||||||
void getTree();
|
void getTree();
|
||||||
void updateAppIconName();
|
void updateAppIconName();
|
||||||
void updateAppIcon();
|
void updateAppIcon();
|
||||||
|
@ -32,12 +33,14 @@ class Window : public AIconLabel, public sigc::trackable {
|
||||||
int windowId_;
|
int windowId_;
|
||||||
std::string app_id_;
|
std::string app_id_;
|
||||||
std::string app_class_;
|
std::string app_class_;
|
||||||
|
std::string layout_;
|
||||||
std::string old_app_id_;
|
std::string old_app_id_;
|
||||||
std::size_t app_nb_;
|
std::size_t app_nb_;
|
||||||
std::string shell_;
|
std::string shell_;
|
||||||
unsigned app_icon_size_{24};
|
unsigned app_icon_size_{24};
|
||||||
bool update_app_icon_{true};
|
bool update_app_icon_{true};
|
||||||
std::string app_icon_name_;
|
std::string app_icon_name_;
|
||||||
|
int floating_count_;
|
||||||
util::JsonParser parser_;
|
util::JsonParser parser_;
|
||||||
std::mutex mutex_;
|
std::mutex mutex_;
|
||||||
Ipc ipc_;
|
Ipc ipc_;
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#include <gtkmm/button.h>
|
#include <gtkmm/button.h>
|
||||||
#include <gtkmm/label.h>
|
#include <gtkmm/label.h>
|
||||||
|
|
||||||
|
#include <string_view>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
|
||||||
#include "AModule.hpp"
|
#include "AModule.hpp"
|
||||||
|
@ -17,11 +18,13 @@ namespace waybar::modules::sway {
|
||||||
class Workspaces : public AModule, public sigc::trackable {
|
class Workspaces : public AModule, public sigc::trackable {
|
||||||
public:
|
public:
|
||||||
Workspaces(const std::string&, const waybar::Bar&, const Json::Value&);
|
Workspaces(const std::string&, const waybar::Bar&, const Json::Value&);
|
||||||
~Workspaces() = default;
|
virtual ~Workspaces() = default;
|
||||||
auto update() -> void;
|
auto update() -> void override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static inline const std::string workspace_switch_cmd_ = "workspace {} \"{}\"";
|
static constexpr std::string_view workspace_switch_cmd_ = "workspace {} \"{}\"";
|
||||||
|
static constexpr std::string_view persistent_workspace_switch_cmd_ =
|
||||||
|
R"(workspace {} "{}"; move workspace to output "{}"; workspace {} "{}")";
|
||||||
|
|
||||||
static int convertWorkspaceNameToNum(std::string name);
|
static int convertWorkspaceNameToNum(std::string name);
|
||||||
|
|
||||||
|
@ -34,7 +37,7 @@ class Workspaces : public AModule, public sigc::trackable {
|
||||||
const std::string getCycleWorkspace(std::vector<Json::Value>::iterator, bool prev) const;
|
const std::string getCycleWorkspace(std::vector<Json::Value>::iterator, bool prev) const;
|
||||||
uint16_t getWorkspaceIndex(const std::string& name) const;
|
uint16_t getWorkspaceIndex(const std::string& name) const;
|
||||||
std::string trimWorkspaceName(std::string);
|
std::string trimWorkspaceName(std::string);
|
||||||
bool handleScroll(GdkEventScroll*);
|
bool handleScroll(GdkEventScroll*) override;
|
||||||
|
|
||||||
const Bar& bar_;
|
const Bar& bar_;
|
||||||
std::vector<Json::Value> workspaces_;
|
std::vector<Json::Value> workspaces_;
|
||||||
|
|
|
@ -12,8 +12,8 @@ namespace waybar::modules {
|
||||||
class Temperature : public ALabel {
|
class Temperature : public ALabel {
|
||||||
public:
|
public:
|
||||||
Temperature(const std::string&, const Json::Value&);
|
Temperature(const std::string&, const Json::Value&);
|
||||||
~Temperature() = default;
|
virtual ~Temperature() = default;
|
||||||
auto update() -> void;
|
auto update() -> void override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
float getTemperature();
|
float getTemperature();
|
||||||
|
|
|
@ -19,8 +19,8 @@ namespace waybar::modules::upower {
|
||||||
class UPower : public AModule {
|
class UPower : public AModule {
|
||||||
public:
|
public:
|
||||||
UPower(const std::string &, const Json::Value &);
|
UPower(const std::string &, const Json::Value &);
|
||||||
~UPower();
|
virtual ~UPower();
|
||||||
auto update() -> void;
|
auto update() -> void override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
typedef std::unordered_map<std::string, UpDevice *> Devices;
|
typedef std::unordered_map<std::string, UpDevice *> Devices;
|
||||||
|
@ -45,7 +45,7 @@ class UPower : public AModule {
|
||||||
void resetDevices();
|
void resetDevices();
|
||||||
void removeDevices();
|
void removeDevices();
|
||||||
bool show_tooltip_callback(int, int, bool, const Glib::RefPtr<Gtk::Tooltip> &tooltip);
|
bool show_tooltip_callback(int, int, bool, const Glib::RefPtr<Gtk::Tooltip> &tooltip);
|
||||||
bool handleToggle(GdkEventButton *const &);
|
bool handleToggle(GdkEventButton *const &) override;
|
||||||
std::string timeToString(gint64 time);
|
std::string timeToString(gint64 time);
|
||||||
|
|
||||||
const std::string getDeviceStatus(UpDeviceState &state);
|
const std::string getDeviceStatus(UpDeviceState &state);
|
||||||
|
@ -74,6 +74,7 @@ class UPower : public AModule {
|
||||||
bool showAltText;
|
bool showAltText;
|
||||||
bool upowerRunning;
|
bool upowerRunning;
|
||||||
guint upowerWatcher_id;
|
guint upowerWatcher_id;
|
||||||
|
std::string nativePath_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace waybar::modules::upower
|
} // namespace waybar::modules::upower
|
||||||
|
|
|
@ -24,7 +24,7 @@ class UPowerTooltip : public Gtk::Window {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
UPowerTooltip(uint iconSize, uint tooltipSpacing, uint tooltipPadding);
|
UPowerTooltip(uint iconSize, uint tooltipSpacing, uint tooltipPadding);
|
||||||
~UPowerTooltip();
|
virtual ~UPowerTooltip();
|
||||||
|
|
||||||
uint updateTooltip(Devices& devices);
|
uint updateTooltip(Devices& devices);
|
||||||
};
|
};
|
||||||
|
|
|
@ -11,8 +11,8 @@ namespace waybar::modules {
|
||||||
class User : public AIconLabel {
|
class User : public AIconLabel {
|
||||||
public:
|
public:
|
||||||
User(const std::string&, const Json::Value&);
|
User(const std::string&, const Json::Value&);
|
||||||
~User() = default;
|
virtual ~User() = default;
|
||||||
auto update() -> void;
|
auto update() -> void override;
|
||||||
|
|
||||||
bool handleToggle(GdkEventButton* const& e) override;
|
bool handleToggle(GdkEventButton* const& e) override;
|
||||||
|
|
||||||
|
|
|
@ -13,25 +13,32 @@ namespace waybar::modules {
|
||||||
class Wireplumber : public ALabel {
|
class Wireplumber : public ALabel {
|
||||||
public:
|
public:
|
||||||
Wireplumber(const std::string&, const Json::Value&);
|
Wireplumber(const std::string&, const Json::Value&);
|
||||||
~Wireplumber();
|
virtual ~Wireplumber();
|
||||||
auto update() -> void;
|
auto update() -> void override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void loadRequiredApiModules();
|
void loadRequiredApiModules();
|
||||||
void prepare();
|
void prepare();
|
||||||
void activatePlugins();
|
void activatePlugins();
|
||||||
static void updateVolume(waybar::modules::Wireplumber* self);
|
static void updateVolume(waybar::modules::Wireplumber* self, uint32_t id);
|
||||||
static void updateNodeName(waybar::modules::Wireplumber* self);
|
static void updateNodeName(waybar::modules::Wireplumber* self, uint32_t id);
|
||||||
static uint32_t getDefaultNodeId(waybar::modules::Wireplumber* self);
|
|
||||||
static void onPluginActivated(WpObject* p, GAsyncResult* res, waybar::modules::Wireplumber* self);
|
static void onPluginActivated(WpObject* p, GAsyncResult* res, waybar::modules::Wireplumber* self);
|
||||||
static void onObjectManagerInstalled(waybar::modules::Wireplumber* self);
|
static void onObjectManagerInstalled(waybar::modules::Wireplumber* self);
|
||||||
|
static void onMixerChanged(waybar::modules::Wireplumber* self, uint32_t id);
|
||||||
|
static void onDefaultNodesApiChanged(waybar::modules::Wireplumber* self);
|
||||||
|
|
||||||
|
bool handleScroll(GdkEventScroll* e) override;
|
||||||
|
|
||||||
WpCore* wp_core_;
|
WpCore* wp_core_;
|
||||||
GPtrArray* apis_;
|
GPtrArray* apis_;
|
||||||
WpObjectManager* om_;
|
WpObjectManager* om_;
|
||||||
|
WpPlugin* mixer_api_;
|
||||||
|
WpPlugin* def_nodes_api_;
|
||||||
|
gchar* default_node_name_;
|
||||||
uint32_t pending_plugins_;
|
uint32_t pending_plugins_;
|
||||||
bool muted_;
|
bool muted_;
|
||||||
double volume_;
|
double volume_;
|
||||||
|
double min_step_;
|
||||||
uint32_t node_id_{0};
|
uint32_t node_id_{0};
|
||||||
std::string node_name_;
|
std::string node_name_;
|
||||||
};
|
};
|
||||||
|
|
|
@ -40,6 +40,8 @@ class Task {
|
||||||
FULLSCREEN = (1 << 3),
|
FULLSCREEN = (1 << 3),
|
||||||
INVALID = (1 << 4)
|
INVALID = (1 << 4)
|
||||||
};
|
};
|
||||||
|
// made public so TaskBar can reorder based on configuration.
|
||||||
|
Gtk::Button button;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static uint32_t global_id;
|
static uint32_t global_id;
|
||||||
|
@ -53,7 +55,6 @@ class Task {
|
||||||
|
|
||||||
uint32_t id_;
|
uint32_t id_;
|
||||||
|
|
||||||
Gtk::Button button_;
|
|
||||||
Gtk::Box content_;
|
Gtk::Box content_;
|
||||||
Gtk::Image icon_;
|
Gtk::Image icon_;
|
||||||
Gtk::Label text_before_;
|
Gtk::Label text_before_;
|
||||||
|
|
|
@ -22,7 +22,7 @@ class WorkspaceGroup;
|
||||||
class Workspace {
|
class Workspace {
|
||||||
public:
|
public:
|
||||||
Workspace(const waybar::Bar &bar, const Json::Value &config, WorkspaceGroup &workspace_group,
|
Workspace(const waybar::Bar &bar, const Json::Value &config, WorkspaceGroup &workspace_group,
|
||||||
zext_workspace_handle_v1 *workspace, uint32_t id);
|
zext_workspace_handle_v1 *workspace, uint32_t id, std::string name);
|
||||||
~Workspace();
|
~Workspace();
|
||||||
auto update() -> void;
|
auto update() -> void;
|
||||||
|
|
||||||
|
@ -30,11 +30,15 @@ class Workspace {
|
||||||
auto is_active() const -> bool { return state_ & static_cast<uint32_t>(State::ACTIVE); }
|
auto is_active() const -> bool { return state_ & static_cast<uint32_t>(State::ACTIVE); }
|
||||||
auto is_urgent() const -> bool { return state_ & static_cast<uint32_t>(State::URGENT); }
|
auto is_urgent() const -> bool { return state_ & static_cast<uint32_t>(State::URGENT); }
|
||||||
auto is_hidden() const -> bool { return state_ & static_cast<uint32_t>(State::HIDDEN); }
|
auto is_hidden() const -> bool { return state_ & static_cast<uint32_t>(State::HIDDEN); }
|
||||||
|
auto is_empty() const -> bool { return state_ & static_cast<uint32_t>(State::EMPTY); }
|
||||||
|
auto is_persistent() const -> bool { return persistent_; }
|
||||||
// wlr stuff
|
// wlr stuff
|
||||||
auto handle_name(const std::string &name) -> void;
|
auto handle_name(const std::string &name) -> void;
|
||||||
auto handle_coordinates(const std::vector<uint32_t> &coordinates) -> void;
|
auto handle_coordinates(const std::vector<uint32_t> &coordinates) -> void;
|
||||||
auto handle_state(const std::vector<uint32_t> &state) -> void;
|
auto handle_state(const std::vector<uint32_t> &state) -> void;
|
||||||
auto handle_remove() -> void;
|
auto handle_remove() -> void;
|
||||||
|
auto make_persistent() -> void;
|
||||||
|
auto handle_duplicate() -> void;
|
||||||
|
|
||||||
auto handle_done() -> void;
|
auto handle_done() -> void;
|
||||||
auto handle_clicked(GdkEventButton *bt) -> bool;
|
auto handle_clicked(GdkEventButton *bt) -> bool;
|
||||||
|
@ -48,6 +52,7 @@ class Workspace {
|
||||||
ACTIVE = (1 << 0),
|
ACTIVE = (1 << 0),
|
||||||
URGENT = (1 << 1),
|
URGENT = (1 << 1),
|
||||||
HIDDEN = (1 << 2),
|
HIDDEN = (1 << 2),
|
||||||
|
EMPTY = (1 << 3),
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -67,6 +72,7 @@ class Workspace {
|
||||||
static std::map<std::string, std::string> icons_map_;
|
static std::map<std::string, std::string> icons_map_;
|
||||||
std::string format_;
|
std::string format_;
|
||||||
bool with_icon_ = false;
|
bool with_icon_ = false;
|
||||||
|
bool persistent_ = false;
|
||||||
|
|
||||||
Gtk::Button button_;
|
Gtk::Button button_;
|
||||||
Gtk::Box content_;
|
Gtk::Box content_;
|
||||||
|
@ -87,11 +93,14 @@ class WorkspaceGroup {
|
||||||
auto active_only() const -> bool;
|
auto active_only() const -> bool;
|
||||||
auto creation_delayed() const -> bool;
|
auto creation_delayed() const -> bool;
|
||||||
auto workspaces() -> std::vector<std::unique_ptr<Workspace>> & { return workspaces_; }
|
auto workspaces() -> std::vector<std::unique_ptr<Workspace>> & { return workspaces_; }
|
||||||
|
auto persistent_workspaces() -> std::vector<std::string> & { return persistent_workspaces_; }
|
||||||
|
|
||||||
auto sort_workspaces() -> void;
|
auto sort_workspaces() -> void;
|
||||||
auto set_need_to_sort() -> void { need_to_sort = true; }
|
auto set_need_to_sort() -> void { need_to_sort = true; }
|
||||||
auto add_button(Gtk::Button &button) -> void;
|
auto add_button(Gtk::Button &button) -> void;
|
||||||
auto remove_button(Gtk::Button &button) -> void;
|
auto remove_button(Gtk::Button &button) -> void;
|
||||||
|
auto fill_persistent_workspaces() -> void;
|
||||||
|
auto create_persistent_workspaces() -> void;
|
||||||
|
|
||||||
// wlr stuff
|
// wlr stuff
|
||||||
auto handle_workspace_create(zext_workspace_handle_v1 *workspace_handle) -> void;
|
auto handle_workspace_create(zext_workspace_handle_v1 *workspace_handle) -> void;
|
||||||
|
@ -115,6 +124,8 @@ class WorkspaceGroup {
|
||||||
uint32_t id_;
|
uint32_t id_;
|
||||||
std::vector<std::unique_ptr<Workspace>> workspaces_;
|
std::vector<std::unique_ptr<Workspace>> workspaces_;
|
||||||
bool need_to_sort = false;
|
bool need_to_sort = false;
|
||||||
|
std::vector<std::string> persistent_workspaces_;
|
||||||
|
bool persistent_created_ = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
class WorkspaceManager : public AModule {
|
class WorkspaceManager : public AModule {
|
||||||
|
|
|
@ -989,7 +989,7 @@ struct Help : Opt {
|
||||||
showHelpFlag = flag;
|
showHelpFlag = flag;
|
||||||
return ParserResult::ok(ParseResultType::ShortCircuitAll);
|
return ParserResult::ok(ParseResultType::ShortCircuitAll);
|
||||||
}) {
|
}) {
|
||||||
static_cast<Opt &> (*this)("display usage information")["-?"]["-h"]["--help"].optional();
|
static_cast<Opt &>(*this)("display usage information")["-?"]["-h"]["--help"].optional();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <fcntl.h>
|
||||||
#include <giomm.h>
|
#include <giomm.h>
|
||||||
#include <spdlog/spdlog.h>
|
#include <spdlog/spdlog.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
|
@ -68,7 +69,11 @@ inline int close(FILE* fp, pid_t pid) {
|
||||||
inline FILE* open(const std::string& cmd, int& pid) {
|
inline FILE* open(const std::string& cmd, int& pid) {
|
||||||
if (cmd == "") return nullptr;
|
if (cmd == "") return nullptr;
|
||||||
int fd[2];
|
int fd[2];
|
||||||
if (pipe(fd) != 0) {
|
// Open the pipe with the close-on-exec flag set, so it will not be inherited
|
||||||
|
// by any other subprocesses launched by other threads (which could result in
|
||||||
|
// the pipe staying open after this child dies, causing us to hang when trying
|
||||||
|
// to read from it)
|
||||||
|
if (pipe2(fd, O_CLOEXEC) != 0) {
|
||||||
spdlog::error("Unable to pipe fd");
|
spdlog::error("Unable to pipe fd");
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
@ -77,6 +82,8 @@ inline FILE* open(const std::string& cmd, int& pid) {
|
||||||
|
|
||||||
if (child_pid < 0) {
|
if (child_pid < 0) {
|
||||||
spdlog::error("Unable to exec cmd {}, error {}", cmd.c_str(), strerror(errno));
|
spdlog::error("Unable to exec cmd {}, error {}", cmd.c_str(), strerror(errno));
|
||||||
|
::close(fd[0]);
|
||||||
|
::close(fd[1]);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <fmt/format.h>
|
||||||
|
|
||||||
|
#if HAVE_CHRONO_TIMEZONES
|
||||||
|
#include <chrono>
|
||||||
|
#include <format>
|
||||||
|
|
||||||
|
/* Compatibility layer for <date/tz.h> on top of C++20 <chrono> */
|
||||||
|
namespace date {
|
||||||
|
|
||||||
|
using namespace std::chrono;
|
||||||
|
|
||||||
|
namespace literals {
|
||||||
|
using std::chrono::last;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline auto format(const std::string& spec, const auto& ztime) {
|
||||||
|
return spec.empty() ? "" : std::vformat("{:L" + spec + "}", std::make_format_args(ztime));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline auto format(const std::locale& loc, const std::string& spec, const auto& ztime) {
|
||||||
|
return spec.empty() ? "" : std::vformat(loc, "{:L" + spec + "}", std::make_format_args(ztime));
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace date
|
||||||
|
|
||||||
|
#else
|
||||||
|
#include <date/tz.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
template <typename Duration, typename TimeZonePtr>
|
||||||
|
struct fmt::formatter<date::zoned_time<Duration, TimeZonePtr>> {
|
||||||
|
std::string_view specs;
|
||||||
|
|
||||||
|
template <typename ParseContext>
|
||||||
|
constexpr auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {
|
||||||
|
auto it = ctx.begin();
|
||||||
|
if (it != ctx.end() && *it == ':') {
|
||||||
|
++it;
|
||||||
|
}
|
||||||
|
auto end = it;
|
||||||
|
while (end != ctx.end() && *end != '}') {
|
||||||
|
++end;
|
||||||
|
}
|
||||||
|
if (end != it) {
|
||||||
|
specs = {it, std::string_view::size_type(end - it)};
|
||||||
|
}
|
||||||
|
return end;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename FormatContext>
|
||||||
|
auto format(const date::zoned_time<Duration, TimeZonePtr>& ztime, FormatContext& ctx) {
|
||||||
|
if (ctx.locale()) {
|
||||||
|
const auto loc = ctx.locale().template get<std::locale>();
|
||||||
|
return fmt::format_to(ctx.out(), "{}", date::format(loc, fmt::to_string(specs), ztime));
|
||||||
|
}
|
||||||
|
return fmt::format_to(ctx.out(), "{}", date::format(fmt::to_string(specs), ztime));
|
||||||
|
}
|
||||||
|
};
|
|
@ -66,9 +66,9 @@ struct formatter<pow_format> {
|
||||||
std::string string;
|
std::string string;
|
||||||
switch (spec) {
|
switch (spec) {
|
||||||
case '>':
|
case '>':
|
||||||
return format_to(ctx.out(), "{:>{}}", fmt::format("{}", s), max_width);
|
return fmt::format_to(ctx.out(), "{:>{}}", fmt::format("{}", s), max_width);
|
||||||
case '<':
|
case '<':
|
||||||
return format_to(ctx.out(), "{:<{}}", fmt::format("{}", s), max_width);
|
return fmt::format_to(ctx.out(), "{:<{}}", fmt::format("{}", s), max_width);
|
||||||
case '=':
|
case '=':
|
||||||
format = "{coefficient:<{number_width}.1f}{padding}{prefix}{unit}";
|
format = "{coefficient:<{number_width}.1f}{padding}{prefix}{unit}";
|
||||||
break;
|
break;
|
||||||
|
@ -77,8 +77,8 @@ struct formatter<pow_format> {
|
||||||
format = "{coefficient:.1f}{prefix}{unit}";
|
format = "{coefficient:.1f}{prefix}{unit}";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return format_to(
|
return fmt::format_to(
|
||||||
ctx.out(), format, fmt::arg("coefficient", fraction),
|
ctx.out(), fmt::runtime(format), fmt::arg("coefficient", fraction),
|
||||||
fmt::arg("number_width", number_width),
|
fmt::arg("number_width", number_width),
|
||||||
fmt::arg("prefix", std::string() + units[pow] + ((s.binary_ && pow) ? "i" : "")),
|
fmt::arg("prefix", std::string() + units[pow] + ((s.binary_ && pow) ? "i" : "")),
|
||||||
fmt::arg("unit", s.unit_),
|
fmt::arg("unit", s.unit_),
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
#pragma once
|
||||||
|
#include <gtkmm/icontheme.h>
|
||||||
|
|
||||||
|
#include <mutex>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
class DefaultGtkIconThemeWrapper {
|
||||||
|
private:
|
||||||
|
static std::mutex default_theme_mutex;
|
||||||
|
|
||||||
|
public:
|
||||||
|
static bool has_icon(const std::string&);
|
||||||
|
static Glib::RefPtr<Gdk::Pixbuf> load_icon(const char*, int, Gtk::IconLookupFlags);
|
||||||
|
};
|
|
@ -0,0 +1,9 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "SafeSignal.hpp"
|
||||||
|
|
||||||
|
namespace waybar::util {
|
||||||
|
|
||||||
|
// Get a signal emited with value true when entering sleep, and false when exiting
|
||||||
|
SafeSignal<bool>& prepare_for_sleep();
|
||||||
|
} // namespace waybar::util
|
|
@ -4,5 +4,5 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
namespace waybar::util {
|
namespace waybar::util {
|
||||||
std::string rewriteTitle(const std::string&, const Json::Value&);
|
std::string rewriteString(const std::string&, const Json::Value&);
|
||||||
}
|
}
|
|
@ -6,6 +6,8 @@
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
|
|
||||||
|
#include "prepare_for_sleep.h"
|
||||||
|
|
||||||
namespace waybar::util {
|
namespace waybar::util {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -33,7 +35,11 @@ class SleeperThread {
|
||||||
signal_ = false;
|
signal_ = false;
|
||||||
func();
|
func();
|
||||||
}
|
}
|
||||||
}} {}
|
}} {
|
||||||
|
connection_ = prepare_for_sleep().connect([this](bool sleep) {
|
||||||
|
if (not sleep) wake_up();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
SleeperThread& operator=(std::function<void()> func) {
|
SleeperThread& operator=(std::function<void()> func) {
|
||||||
thread_ = std::thread([this, func] {
|
thread_ = std::thread([this, func] {
|
||||||
|
@ -42,6 +48,11 @@ class SleeperThread {
|
||||||
func();
|
func();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
if (connection_.empty()) {
|
||||||
|
connection_ = prepare_for_sleep().connect([this](bool sleep) {
|
||||||
|
if (not sleep) wake_up();
|
||||||
|
});
|
||||||
|
}
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,7 +72,7 @@ class SleeperThread {
|
||||||
return condvar_.wait_until(lk, time_point, [this] { return signal_ || !do_run_; });
|
return condvar_.wait_until(lk, time_point, [this] { return signal_ || !do_run_; });
|
||||||
}
|
}
|
||||||
|
|
||||||
auto wake_up() {
|
void wake_up() {
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lck(mutex_);
|
std::lock_guard<std::mutex> lck(mutex_);
|
||||||
signal_ = true;
|
signal_ = true;
|
||||||
|
@ -96,6 +107,7 @@ class SleeperThread {
|
||||||
std::mutex mutex_;
|
std::mutex mutex_;
|
||||||
bool do_run_ = true;
|
bool do_run_ = true;
|
||||||
bool signal_ = false;
|
bool signal_ = false;
|
||||||
|
sigc::connection connection_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace waybar::util
|
} // namespace waybar::util
|
||||||
|
|
|
@ -1,39 +0,0 @@
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <date/tz.h>
|
|
||||||
#include <fmt/format.h>
|
|
||||||
|
|
||||||
namespace waybar {
|
|
||||||
|
|
||||||
struct waybar_time {
|
|
||||||
std::locale locale;
|
|
||||||
date::zoned_seconds ztime;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace waybar
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct fmt::formatter<waybar::waybar_time> {
|
|
||||||
std::string_view specs;
|
|
||||||
|
|
||||||
template <typename ParseContext>
|
|
||||||
constexpr auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {
|
|
||||||
auto it = ctx.begin();
|
|
||||||
if (it != ctx.end() && *it == ':') {
|
|
||||||
++it;
|
|
||||||
}
|
|
||||||
auto end = it;
|
|
||||||
while (end != ctx.end() && *end != '}') {
|
|
||||||
++end;
|
|
||||||
}
|
|
||||||
if (end != it) {
|
|
||||||
specs = {it, std::string_view::size_type(end - it)};
|
|
||||||
}
|
|
||||||
return end;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename FormatContext>
|
|
||||||
auto format(const waybar::waybar_time& t, FormatContext& ctx) {
|
|
||||||
return format_to(ctx.out(), "{}", date::format(t.locale, fmt::to_string(specs), t.ztime));
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -58,16 +58,25 @@ The *backlight* module displays the current backlight level.
|
||||||
|
|
||||||
*on-scroll-up*: ++
|
*on-scroll-up*: ++
|
||||||
typeof: string ++
|
typeof: string ++
|
||||||
Command to execute when performing a scroll up on the module.
|
Command to execute when performing a scroll up on the module. This replaces the default behaviour of brightness control.
|
||||||
|
|
||||||
*on-scroll-down*: ++
|
*on-scroll-down*: ++
|
||||||
typeof: string
|
typeof: string
|
||||||
Command to execute when performing a scroll down on the module.
|
Command to execute when performing a scroll down on the module. This replaces the default behaviour of brightness control.
|
||||||
|
|
||||||
*smooth-scrolling-threshold*: ++
|
*smooth-scrolling-threshold*: ++
|
||||||
typeof: double
|
typeof: double
|
||||||
Threshold to be used when scrolling.
|
Threshold to be used when scrolling.
|
||||||
|
|
||||||
|
*reverse-scrolling*: ++
|
||||||
|
typeof: bool ++
|
||||||
|
Option to reverse the scroll direction.
|
||||||
|
|
||||||
|
*scroll-step*: ++
|
||||||
|
typeof: float ++
|
||||||
|
default: 1.0 ++
|
||||||
|
The speed in which to change the brightness when scrolling.
|
||||||
|
|
||||||
# EXAMPLE:
|
# EXAMPLE:
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
|
@ -1,105 +1,167 @@
|
||||||
waybar-clock(5)
|
waybar-clock(5) "waybar-clock" "User Manual"
|
||||||
|
|
||||||
# NAME
|
# NAME
|
||||||
|
|
||||||
waybar - clock module
|
clock
|
||||||
|
|
||||||
# DESCRIPTION
|
# DESCRIPTION
|
||||||
|
|
||||||
The *clock* module displays the current date and time.
|
*clock* module displays current date and time
|
||||||
|
|
||||||
|
# FILES
|
||||||
|
|
||||||
|
$XDG_CONFIG_HOME/waybar/config ++
|
||||||
|
Per user configuration file
|
||||||
|
|
||||||
# CONFIGURATION
|
# CONFIGURATION
|
||||||
|
|
||||||
*interval*: ++
|
1. Addressed by *clock*
|
||||||
typeof: integer ++
|
[- *Option*
|
||||||
default: 60 ++
|
:- *Typeof*
|
||||||
The interval in which the information gets polled.
|
:- *Default*
|
||||||
|
:- *Description*
|
||||||
|
|[ *interval*
|
||||||
|
:[ integer
|
||||||
|
:[ 60
|
||||||
|
:[ The interval in which the information gets polled
|
||||||
|
|[ *format*
|
||||||
|
:[ string
|
||||||
|
:[ *{:%H:%M}*
|
||||||
|
:[ The format, how the date and time should be displayed. See format options below
|
||||||
|
|[ *timezone*
|
||||||
|
:[ string
|
||||||
|
:[
|
||||||
|
:[ The timezone to display the time in, e.g. America/New_York. "" represents
|
||||||
|
the system's local timezone. See Wikipedia's unofficial list of timezones <https://en.wikipedia.org/wiki/List_of_tz_database_time_zones>
|
||||||
|
|[ *timezones*
|
||||||
|
:[ list of strings
|
||||||
|
:[
|
||||||
|
:[ A list of timezones (as in *timezone*) to use for time display, changed using
|
||||||
|
the scroll wheel. Do not specify *timezone* option when *timezones* is specified.
|
||||||
|
"" represents the system's local timezone
|
||||||
|
|[ *locale*
|
||||||
|
:[ string
|
||||||
|
:[
|
||||||
|
:[ A locale to be used to display the time. Intended to render times in custom
|
||||||
|
timezones with the proper language and format
|
||||||
|
|[ *max-length*
|
||||||
|
:[ integer
|
||||||
|
:[
|
||||||
|
:[ The maximum length in character the module should display
|
||||||
|
|[ *rotate*
|
||||||
|
:[ integer
|
||||||
|
:[
|
||||||
|
:[ Positive value to rotate the text label
|
||||||
|
|[ *on-click*
|
||||||
|
:[ string
|
||||||
|
:[
|
||||||
|
:[ Command to execute when clicked on the module
|
||||||
|
|[ *on-click-middle*
|
||||||
|
:[ string
|
||||||
|
:[
|
||||||
|
:[ Command to execute when you middle clicked on the module using mousewheel
|
||||||
|
|[ *on-click-right*
|
||||||
|
:[ string
|
||||||
|
:[
|
||||||
|
:[ Command to execute when you right clicked on the module
|
||||||
|
|[ *on-scroll-up*
|
||||||
|
:[ string
|
||||||
|
:[
|
||||||
|
:[ Command to execute when scrolling up on the module
|
||||||
|
|[ *on-scroll-down*
|
||||||
|
:[ string
|
||||||
|
:[
|
||||||
|
:[ Command to execute when scrolling down on the module
|
||||||
|
|[ *smooth-scrolling-threshold*
|
||||||
|
:[ double
|
||||||
|
:[
|
||||||
|
:[ Threshold to be used when scrolling
|
||||||
|
|[ *tooltip*
|
||||||
|
:[ bool
|
||||||
|
:[ true
|
||||||
|
:[ Option to enable tooltip on hover
|
||||||
|
|[ *tooltip-format*
|
||||||
|
:[ string
|
||||||
|
:[ same as format
|
||||||
|
:[ Tooltip on hover
|
||||||
|
|
||||||
*format*: ++
|
View all valid format options in *strftime(3)* or have a look <https://fmt.dev/latest/syntax.html#chrono-specs>
|
||||||
typeof: string ++
|
|
||||||
default: {:%H:%M} ++
|
|
||||||
The format, how the date and time should be displayed. ++
|
|
||||||
It uses the format of the date library. See https://howardhinnant.github.io/date/date.html#to_stream_formatting for details.
|
|
||||||
|
|
||||||
*timezone*: ++
|
2. Addressed by *clock: calendar*
|
||||||
typeof: string ++
|
[- *Option*
|
||||||
default: inferred local timezone ++
|
:- *Typeof*
|
||||||
The timezone to display the time in, e.g. America/New_York. ++
|
:- *Default*
|
||||||
This field will be ignored if *timezones* field is set and have at least one value.
|
:- *Description*
|
||||||
|
|[ *mode*
|
||||||
|
:[ string
|
||||||
|
:[ month
|
||||||
|
:[ Calendar view mode. Possible values: year|month
|
||||||
|
|[ *mode-mon-col*
|
||||||
|
:[ integer
|
||||||
|
:[ 3
|
||||||
|
:[ Relevant for *mode=year*. Count of months per row
|
||||||
|
|[ *weeks-pos*
|
||||||
|
:[ integer
|
||||||
|
:[
|
||||||
|
:[ The position where week numbers should be displayed. Disabled when is empty.
|
||||||
|
Possible values: left|right
|
||||||
|
|[ *on-scroll*
|
||||||
|
:[ integer
|
||||||
|
:[ 1
|
||||||
|
:[ Value to scroll months/years forward/backward. Can be negative. Is
|
||||||
|
configured under *on-scroll* option
|
||||||
|
|
||||||
*timezones*: ++
|
3. Adressed by *clock: calendar: format*
|
||||||
typeof: list of strings ++
|
[- *Option*
|
||||||
A list of timezones to use for time display, changed using the scroll wheel. ++
|
:- *Typeof*
|
||||||
Use "" to represent the system's local timezone. Using %Z in the format or tooltip format is useful to track which time zone is currently displayed.
|
:- *Default*
|
||||||
|
:- *Description*
|
||||||
|
|[ *months*
|
||||||
|
:[ string
|
||||||
|
:[
|
||||||
|
:[ Format is applied to months header(January, February,...etc.)
|
||||||
|
|[ *days*
|
||||||
|
:[ string
|
||||||
|
:[
|
||||||
|
:[ Format is applied to days
|
||||||
|
|[ *weeks*
|
||||||
|
:[ string
|
||||||
|
:[ *{:%U}*
|
||||||
|
:[ Format is applied to week numbers. When weekday format is not provided then
|
||||||
|
is used default format: '{:%W}' when week starts with Monday, '{:%U}' otherwise
|
||||||
|
|[ *weekdays*
|
||||||
|
:[ string
|
||||||
|
:[
|
||||||
|
:[ Format is applied to weeks header(Su,Mo,...etc.)
|
||||||
|
|[ *today*
|
||||||
|
:[ string
|
||||||
|
:[ *<b><u>{}</u></b>*
|
||||||
|
:[ Format is applied to Today
|
||||||
|
|
||||||
*locale*: ++
|
## Actions
|
||||||
typeof: string ++
|
|
||||||
default: inferred from current locale ++
|
|
||||||
A locale to be used to display the time. Intended to render times in custom timezones with the proper language and format.
|
|
||||||
|
|
||||||
*today-format*: ++
|
[- *String*
|
||||||
typeof: string ++
|
:- *Action*
|
||||||
default: <b><u>{}</u></b> ++
|
|[ *mode*
|
||||||
The format of today's date in the calendar.
|
:[ Switch calendar mode between year/month
|
||||||
|
|[ *tz_up*
|
||||||
*max-length*: ++
|
:[ Switch to the next provided time zone
|
||||||
typeof: integer ++
|
|[ *tz_down*
|
||||||
The maximum length in character the module should display.
|
:[ Switch to the previous provided time zone
|
||||||
|
|[ *shift_up*
|
||||||
*min-length*: ++
|
:[ Switch to the next calendar month/year
|
||||||
typeof: integer ++
|
|[ *shift_down*
|
||||||
The minimum length in characters the module should take up.
|
:[ Switch to the previous calendar month/year
|
||||||
|
|
||||||
*align*: ++
|
|
||||||
typeof: float ++
|
|
||||||
The alignment of the text, where 0 is left-aligned and 1 is right-aligned. If the module is rotated, it will follow the flow of the text.
|
|
||||||
|
|
||||||
*rotate*: ++
|
|
||||||
typeof: integer ++
|
|
||||||
Positive value to rotate the text label.
|
|
||||||
|
|
||||||
*on-click*: ++
|
|
||||||
typeof: string ++
|
|
||||||
Command to execute when clicked on the module.
|
|
||||||
|
|
||||||
*on-click-middle*: ++
|
|
||||||
typeof: string ++
|
|
||||||
Command to execute when middle-clicked on the module using mousewheel.
|
|
||||||
|
|
||||||
*on-click-right*: ++
|
|
||||||
typeof: string ++
|
|
||||||
Command to execute when you right clicked on the module.
|
|
||||||
|
|
||||||
*on-update*: ++
|
|
||||||
typeof: string ++
|
|
||||||
Command to execute when the module is updated.
|
|
||||||
|
|
||||||
*on-scroll-up*: ++
|
|
||||||
typeof: string ++
|
|
||||||
Command to execute when scrolling up on the module.
|
|
||||||
|
|
||||||
*on-scroll-down*: ++
|
|
||||||
typeof: string ++
|
|
||||||
Command to execute when scrolling down on the module.
|
|
||||||
|
|
||||||
*smooth-scrolling-threshold*: ++
|
|
||||||
typeof: double ++
|
|
||||||
Threshold to be used when scrolling.
|
|
||||||
|
|
||||||
*tooltip*: ++
|
|
||||||
typeof: bool ++
|
|
||||||
default: true ++
|
|
||||||
Option to disable tooltip on hover.
|
|
||||||
|
|
||||||
View all valid format options in *strftime(3)*.
|
|
||||||
|
|
||||||
# FORMAT REPLACEMENTS
|
# FORMAT REPLACEMENTS
|
||||||
|
|
||||||
*{calendar}*: Current month calendar
|
- *{calendar}*: Current month calendar
|
||||||
*{timezoned_time_list}*: List of time in the rest timezones, if more than one timezone is set in the config
|
- *{timezoned_time_list}*: List of time in the rest timezones, if more than one timezone is set in the config
|
||||||
|
|
||||||
# EXAMPLES
|
# EXAMPLES
|
||||||
|
|
||||||
|
1. General
|
||||||
|
|
||||||
```
|
```
|
||||||
"clock": {
|
"clock": {
|
||||||
"interval": 60,
|
"interval": 60,
|
||||||
|
@ -108,6 +170,101 @@ View all valid format options in *strftime(3)*.
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
2. Calendar
|
||||||
|
|
||||||
|
```
|
||||||
|
"clock": {
|
||||||
|
"format": "{:%H:%M} ",
|
||||||
|
"format-alt": "{:%A, %B %d, %Y (%R)} ",
|
||||||
|
"tooltip-format": "<tt><small>{calendar}</small></tt>",
|
||||||
|
"calendar": {
|
||||||
|
"mode" : "year",
|
||||||
|
"mode-mon-col" : 3,
|
||||||
|
"weeks-pos" : "right",
|
||||||
|
"on-scroll" : 1,
|
||||||
|
"on-click-right": "mode",
|
||||||
|
"format": {
|
||||||
|
"months": "<span color='#ffead3'><b>{}</b></span>",
|
||||||
|
"days": "<span color='#ecc6d9'><b>{}</b></span>",
|
||||||
|
"weeks": "<span color='#99ffdd'><b>W{}</b></span>",
|
||||||
|
"weekdays": "<span color='#ffcc66'><b>{}</b></span>",
|
||||||
|
"today": "<span color='#ff6699'><b><u>{}</u></b></span>"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"actions": {
|
||||||
|
"on-click-right": "mode",
|
||||||
|
"on-click-forward": "tz_up",
|
||||||
|
"on-click-backward": "tz_down",
|
||||||
|
"on-scroll-up": "shift_up",
|
||||||
|
"on-scroll-down": "shift_down"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Full date on hover
|
||||||
|
|
||||||
|
```
|
||||||
|
"clock": {
|
||||||
|
"interval": 60,
|
||||||
|
"tooltip": true,
|
||||||
|
"format": "{:%H.%M}",
|
||||||
|
"tooltip-format": "{:%Y-%m-%d}",
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
# STYLE
|
# STYLE
|
||||||
|
|
||||||
- *#clock*
|
- *#clock*
|
||||||
|
|
||||||
|
# Troubleshooting
|
||||||
|
|
||||||
|
If clock module is disabled at startup with locale::facet::\_S\_create\_c\_locale ++
|
||||||
|
name not valid error message try one of the followings:
|
||||||
|
|
||||||
|
- check if LC_TIME is set properly (glibc)
|
||||||
|
- set locale to C in the config file (musl)
|
||||||
|
|
||||||
|
The locale option must be set for {calendar} to use the correct start-of-week, regardless of system locale.
|
||||||
|
|
||||||
|
## Calendar in Chinese. Alignment
|
||||||
|
|
||||||
|
In order to have aligned Chinese calendar there are some useful recommendations:
|
||||||
|
|
||||||
|
. Use "WenQuanYi Zen Hei Mono" which is provided in most Linux distributions
|
||||||
|
. Try different font sizes and find best for you. size = 9pt should be fine
|
||||||
|
. In case when "WenQuanYi Zen Hei Mono" font is used disable monospace font pango tag
|
||||||
|
|
||||||
|
Example of working config
|
||||||
|
|
||||||
|
```
|
||||||
|
"clock": {
|
||||||
|
"format": "{:%H:%M} ",
|
||||||
|
"format-alt": "{:%A, %B %d, %Y (%R)} ",
|
||||||
|
"tooltip-format": "\n<span size='9pt' font='WenQuanYi Zen Hei Mono'>{calendar}</span>",
|
||||||
|
"calendar": {
|
||||||
|
"mode" : "year",
|
||||||
|
"mode-mon-col" : 3,
|
||||||
|
"weeks-pos" : "right",
|
||||||
|
"on-scroll" : 1,
|
||||||
|
"on-click-right": "mode",
|
||||||
|
"format": {
|
||||||
|
"months": "<span color='#ffead3'><b>{}</b></span>",
|
||||||
|
"days": "<span color='#ecc6d9'><b>{}</b></span>",
|
||||||
|
"weeks": "<span color='#99ffdd'><b>W{}</b></span>",
|
||||||
|
"weekdays": "<span color='#ffcc66'><b>{}</b></span>",
|
||||||
|
"today": "<span color='#ff6699'><b><u>{}</u></b></span>"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"actions": {
|
||||||
|
"on-click-right": "mode",
|
||||||
|
"on-click-forward": "tz_up",
|
||||||
|
"on-click-backward": "tz_down",
|
||||||
|
"on-scroll-up": "shift_up",
|
||||||
|
"on-scroll-down": "shift_down"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
```
|
||||||
|
|
||||||
|
# AUTHOR
|
||||||
|
|
||||||
|
Alexis Rouillard <contact@arouillard.fr>
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
waybar-dwl-tags(5)
|
||||||
|
|
||||||
|
# NAME
|
||||||
|
|
||||||
|
waybar - dwl tags module
|
||||||
|
|
||||||
|
# DESCRIPTION
|
||||||
|
|
||||||
|
The *tags* module displays the current state of tags in dwl.
|
||||||
|
|
||||||
|
# CONFIGURATION
|
||||||
|
|
||||||
|
Addressed by *dwl/tags*
|
||||||
|
|
||||||
|
*num-tags*: ++
|
||||||
|
typeof: uint ++
|
||||||
|
default: 9 ++
|
||||||
|
The number of tags that should be displayed. Max 32.
|
||||||
|
|
||||||
|
*tag-labels*: ++
|
||||||
|
typeof: array ++
|
||||||
|
The label to display for each tag.
|
||||||
|
|
||||||
|
*disable-click*: ++
|
||||||
|
typeof: bool ++
|
||||||
|
default: false ++
|
||||||
|
If set to false, you can left click to set focused tag. Right click to toggle tag focus. If set to true this behaviour is disabled.
|
||||||
|
|
||||||
|
# EXAMPLE
|
||||||
|
|
||||||
|
```
|
||||||
|
"dwl/tags": {
|
||||||
|
"num-tags": 5
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
# STYLE
|
||||||
|
|
||||||
|
- *#tags button*
|
||||||
|
- *#tags button.occupied*
|
||||||
|
- *#tags button.focused*
|
||||||
|
- *#tags button.urgent*
|
||||||
|
|
||||||
|
Note that occupied/focused/urgent status may overlap. That is, a tag may be
|
||||||
|
both occupied and focused at the same time.
|
||||||
|
|
||||||
|
# SEE ALSO
|
||||||
|
|
||||||
|
waybar(5), dwl(1)
|
|
@ -15,7 +15,7 @@ Addressed by *hyprland/language*
|
||||||
*format*: ++
|
*format*: ++
|
||||||
typeof: string ++
|
typeof: string ++
|
||||||
default: {} ++
|
default: {} ++
|
||||||
The format, how information should be displayed. On {} the currently selected language is displayed.
|
The format, how information should be displayed.
|
||||||
|
|
||||||
*format-<lang>* ++
|
*format-<lang>* ++
|
||||||
typeof: string++
|
typeof: string++
|
||||||
|
@ -23,18 +23,28 @@ Addressed by *hyprland/language*
|
||||||
|
|
||||||
*keyboard-name*: ++
|
*keyboard-name*: ++
|
||||||
typeof: string ++
|
typeof: string ++
|
||||||
Specifies which keyboard to use from hyprctl devices output. Using the option that begins with "AT Translated set..." is recommended.
|
Specifies which keyboard to use from hyprctl devices output. Using the option that begins with "at-translated-set..." is recommended.
|
||||||
|
|
||||||
|
|
||||||
|
# FORMAT REPLACEMENTS
|
||||||
|
|
||||||
|
*{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)").
|
||||||
|
|
||||||
|
*{variant}*: Variant of layout (e.g. "dvorak").
|
||||||
|
|
||||||
|
|
||||||
# EXAMPLES
|
# EXAMPLES
|
||||||
|
|
||||||
```
|
```
|
||||||
"hyprland/language": {
|
"hyprland/language": {
|
||||||
"format": "Lang: {}"
|
"format": "Lang: {long}"
|
||||||
"format-us": "AMERICA, HELL YEAH!" // For American English
|
"format-en": "AMERICA, HELL YEAH!"
|
||||||
"format-tr": "As bayrakları" // For Turkish
|
"format-tr": "As bayrakları"
|
||||||
"keyboard-name": "AT Translated Set 2 keyboard"
|
"keyboard-name": "at-translated-set-2-keyboard"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,82 @@
|
||||||
|
waybar-hyprland-submap(5)
|
||||||
|
|
||||||
|
# NAME
|
||||||
|
|
||||||
|
waybar - hyprland submap module
|
||||||
|
|
||||||
|
# DESCRIPTION
|
||||||
|
|
||||||
|
The *submap* module displays the currently active submap similar to *sway/mode*.
|
||||||
|
|
||||||
|
# CONFIGURATION
|
||||||
|
|
||||||
|
Addressed by *hyprland/submap*
|
||||||
|
|
||||||
|
*format*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: {} ++
|
||||||
|
The format, how information should be displayed. On {} the currently active submap is displayed.
|
||||||
|
|
||||||
|
*rotate*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
Positive value to rotate the text label.
|
||||||
|
|
||||||
|
*max-length*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
The maximum length in character the module should display.
|
||||||
|
|
||||||
|
*min-length*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
The minimum length in characters the module should take up.
|
||||||
|
|
||||||
|
*align*: ++
|
||||||
|
typeof: float ++
|
||||||
|
The alignment of the text, where 0 is left-aligned and 1 is right-aligned. If the module is rotated, it will follow the flow of the text.
|
||||||
|
|
||||||
|
*on-click*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when clicked on the module.
|
||||||
|
|
||||||
|
*on-click-middle*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when middle-clicked on the module using mousewheel.
|
||||||
|
|
||||||
|
*on-click-right*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when you right clicked on the module.
|
||||||
|
|
||||||
|
*on-update*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when the module is updated.
|
||||||
|
|
||||||
|
*on-scroll-up*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when scrolling up on the module.
|
||||||
|
|
||||||
|
*on-scroll-down*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when scrolling down on the module.
|
||||||
|
|
||||||
|
*smooth-scrolling-threshold*: ++
|
||||||
|
typeof: double ++
|
||||||
|
Threshold to be used when scrolling.
|
||||||
|
|
||||||
|
*tooltip*: ++
|
||||||
|
typeof: bool ++
|
||||||
|
default: true ++
|
||||||
|
Option to disable tooltip on hover.
|
||||||
|
|
||||||
|
|
||||||
|
# EXAMPLES
|
||||||
|
|
||||||
|
```
|
||||||
|
"hyprland/submap": {
|
||||||
|
"format": "✌️ {}",
|
||||||
|
"max-length": 8,
|
||||||
|
"tooltip": false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
# STYLE
|
||||||
|
|
||||||
|
- *#submap*
|
|
@ -0,0 +1,59 @@
|
||||||
|
waybar-wlr-workspaces(5)
|
||||||
|
|
||||||
|
# NAME
|
||||||
|
|
||||||
|
waybar - hyprland workspaces module
|
||||||
|
|
||||||
|
# DESCRIPTION
|
||||||
|
|
||||||
|
The *workspaces* module displays the currently used workspaces in hyprland compositor.
|
||||||
|
|
||||||
|
# CONFIGURATION
|
||||||
|
|
||||||
|
Addressed by *hyprland/workspaces*
|
||||||
|
|
||||||
|
*format*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: {id} ++
|
||||||
|
The format, how information should be displayed.
|
||||||
|
|
||||||
|
*format-icons*: ++
|
||||||
|
typeof: array ++
|
||||||
|
Based on the workspace id and state, the corresponding icon gets selected. See *icons*.
|
||||||
|
|
||||||
|
# FORMAT REPLACEMENTS
|
||||||
|
|
||||||
|
*{id}*: id of workspace assigned by compositor
|
||||||
|
|
||||||
|
*{icon}*: Icon, as defined in *format-icons*.
|
||||||
|
|
||||||
|
# ICONS
|
||||||
|
|
||||||
|
Additional to workspace name matching, the following *format-icons* can be set.
|
||||||
|
|
||||||
|
- *default*: Will be shown, when no string match is found.
|
||||||
|
- *active*: Will be shown, when workspace is active
|
||||||
|
|
||||||
|
# EXAMPLES
|
||||||
|
|
||||||
|
```
|
||||||
|
"wlr/workspaces": {
|
||||||
|
"format": "{name}: {icon}",
|
||||||
|
"format-icons": {
|
||||||
|
"1": "",
|
||||||
|
"2": "",
|
||||||
|
"3": "",
|
||||||
|
"4": "",
|
||||||
|
"5": "",
|
||||||
|
"active": "",
|
||||||
|
"default": ""
|
||||||
|
},
|
||||||
|
"sort-by-number": true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
# Style
|
||||||
|
|
||||||
|
- *#workspaces*
|
||||||
|
- *#workspaces button*
|
||||||
|
- *#workspaces button.active*
|
|
@ -1,4 +1,4 @@
|
||||||
waybar-custom(5)
|
waybar-image(5)
|
||||||
|
|
||||||
# NAME
|
# NAME
|
||||||
|
|
||||||
|
@ -10,12 +10,13 @@ The *image* module displays an image from a path.
|
||||||
|
|
||||||
# CONFIGURATION
|
# CONFIGURATION
|
||||||
|
|
||||||
Addressed by *custom/<name>*
|
|
||||||
|
|
||||||
*path*: ++
|
*path*: ++
|
||||||
typeof: string ++
|
typeof: string ++
|
||||||
The path to the image.
|
The path to the image.
|
||||||
|
*exec*: ++
|
||||||
|
typeof: string ++
|
||||||
|
The path to the script, which should return image path file
|
||||||
|
it will only execute if the path is not set
|
||||||
*size*: ++
|
*size*: ++
|
||||||
typeof: integer ++
|
typeof: integer ++
|
||||||
The width/height to render the image.
|
The width/height to render the image.
|
||||||
|
@ -56,17 +57,31 @@ Addressed by *custom/<name>*
|
||||||
typeof: double ++
|
typeof: double ++
|
||||||
Threshold to be used when scrolling.
|
Threshold to be used when scrolling.
|
||||||
|
|
||||||
# EXAMPLES
|
*tooltip*: ++
|
||||||
|
typeof: bool ++
|
||||||
|
default: true ++
|
||||||
|
Option to enable tooltip on hover.
|
||||||
|
|
||||||
## Spotify:
|
# SCRIPT OUTPUT
|
||||||
|
|
||||||
## mpd:
|
Similar to the *custom* module, output values of the script is *newline* separated.
|
||||||
|
The following is the output format:
|
||||||
|
|
||||||
```
|
```
|
||||||
"image/album-art": {
|
$path\\n$tooltip
|
||||||
|
```
|
||||||
|
|
||||||
|
# EXAMPLES
|
||||||
|
|
||||||
|
```
|
||||||
|
"image#album-art": {
|
||||||
"path": "/tmp/mpd_art",
|
"path": "/tmp/mpd_art",
|
||||||
"size": 32,
|
"size": 32,
|
||||||
"interval": 5,
|
"interval": 5,
|
||||||
"on-click": "mpc toggle"
|
"on-click": "mpc toggle"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
# STYLE
|
||||||
|
|
||||||
|
- *#image*
|
||||||
|
|
|
@ -74,20 +74,20 @@ Addressed by *mpd*
|
||||||
Tooltip information displayed when the MPD server can't be reached.
|
Tooltip information displayed when the MPD server can't be reached.
|
||||||
|
|
||||||
*artist-len*: ++
|
*artist-len*: ++
|
||||||
typeof: integer ++
|
typeof: integer ++
|
||||||
Maximum length of the Artist tag.
|
Maximum length of the Artist tag.
|
||||||
|
|
||||||
*album-len*: ++
|
*album-len*: ++
|
||||||
typeof: integer ++
|
typeof: integer ++
|
||||||
Maximum length of the Album tag.
|
Maximum length of the Album tag.
|
||||||
|
|
||||||
*album-artist-len*: ++
|
*album-artist-len*: ++
|
||||||
typeof: integer ++
|
typeof: integer ++
|
||||||
Maximum length of the Album Artist tag.
|
Maximum length of the Album Artist tag.
|
||||||
|
|
||||||
*title-len*: ++
|
*title-len*: ++
|
||||||
typeof: integer ++
|
typeof: integer ++
|
||||||
Maximum length of the Title tag.
|
Maximum length of the Title tag.
|
||||||
|
|
||||||
*rotate*: ++
|
*rotate*: ++
|
||||||
typeof: integer ++
|
typeof: integer ++
|
||||||
|
@ -98,12 +98,12 @@ Addressed by *mpd*
|
||||||
The maximum length in character the module should display.
|
The maximum length in character the module should display.
|
||||||
|
|
||||||
*min-length*: ++
|
*min-length*: ++
|
||||||
typeof: integer ++
|
typeof: integer ++
|
||||||
The minimum length in characters the module should take up.
|
The minimum length in characters the module should take up.
|
||||||
|
|
||||||
*align*: ++
|
*align*: ++
|
||||||
typeof: float ++
|
typeof: float ++
|
||||||
The alignment of the text, where 0 is left-aligned and 1 is right-aligned. If the module is rotated, it will follow the flow of the text.
|
The alignment of the text, where 0 is left-aligned and 1 is right-aligned. If the module is rotated, it will follow the flow of the text.
|
||||||
|
|
||||||
*on-click*: ++
|
*on-click*: ++
|
||||||
typeof: string ++
|
typeof: string ++
|
||||||
|
|
|
@ -0,0 +1,197 @@
|
||||||
|
waybar-mpris(5)
|
||||||
|
|
||||||
|
# NAME
|
||||||
|
|
||||||
|
waybar - MPRIS module
|
||||||
|
|
||||||
|
# DESCRIPTION
|
||||||
|
|
||||||
|
The *mpris* module displays currently playing media via libplayerctl.
|
||||||
|
|
||||||
|
# CONFIGURATION
|
||||||
|
|
||||||
|
*player*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: playerctld ++
|
||||||
|
Name of the MPRIS player to attach to. Using the default value always
|
||||||
|
follows the currenly active player.
|
||||||
|
|
||||||
|
*ignored-players*: ++
|
||||||
|
typeof: []string ++
|
||||||
|
Ignore updates of the listed players, when using playerctld.
|
||||||
|
|
||||||
|
*interval*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
Refresh MPRIS information on a timer.
|
||||||
|
|
||||||
|
*format*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: {player} ({status}) {dynamic} ++
|
||||||
|
The text format.
|
||||||
|
|
||||||
|
*format-[status]*: ++
|
||||||
|
typeof: string ++
|
||||||
|
The status-specific text format.
|
||||||
|
|
||||||
|
*tooltip*: ++
|
||||||
|
typeof: bool ++
|
||||||
|
default: true ++
|
||||||
|
Option to disable tooltip on hover.
|
||||||
|
|
||||||
|
*tooltip-format*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: {player} ({status}) {dynamic} ++
|
||||||
|
The tooltip text format.
|
||||||
|
|
||||||
|
*tooltip-format-[status]*: ++
|
||||||
|
typeof: string ++
|
||||||
|
The status-specific tooltip format.
|
||||||
|
|
||||||
|
*artist-len*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
Maximum length of the Artist tag (Wide/Fullwidth Unicode characters
|
||||||
|
count as two). Set to zero to hide the artist in `{dynamic}` tag.
|
||||||
|
|
||||||
|
*album-len*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
Maximum length of the Album tag (Wide/Fullwidth Unicode characters count
|
||||||
|
as two). Set to zero to hide the album in `{dynamic}` tag.
|
||||||
|
|
||||||
|
*title-len*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
Maximum length of the Title tag (Wide/Fullwidth Unicode characters count
|
||||||
|
as two). Set to zero to hide the title in `{dynamic}` tag.
|
||||||
|
|
||||||
|
*dynamic-len*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
Maximum length of the Dynamic tag (Wide/Fullwidth Unicode characters ++
|
||||||
|
count as two). The dynamic tag will not truncate any tags beyond their ++
|
||||||
|
set length limits, instead, it will attempt to fit as much of the ++
|
||||||
|
available tags as possible. It is recommended you set title-len to ++
|
||||||
|
something less than or equal to this value, so the title will always be ++
|
||||||
|
displayed.
|
||||||
|
|
||||||
|
*dynamic-order*: ++
|
||||||
|
typeof: []string ++
|
||||||
|
default: ["title", "artist", "album", "position", "length"] ++
|
||||||
|
Order of the tags shown by Dynamic tag. The position and length tags ++
|
||||||
|
will always be combined in the format [{position}/{length}]. The order ++
|
||||||
|
of these tags in relation to other tags will be determined based on the ++
|
||||||
|
declaration of the first among the two tags. Absence in this list means ++
|
||||||
|
force exclusion.
|
||||||
|
|
||||||
|
*dynamic-importance-order*: ++
|
||||||
|
typeof: []string ++
|
||||||
|
default: ["title", "artist", "album", "position", "length"] ++
|
||||||
|
Priority of the tags when truncating the Dynamic tag. The final ones ++
|
||||||
|
will be the first to be truncated. Absence in this list means force ++
|
||||||
|
inclusion.
|
||||||
|
|
||||||
|
*dynamic-separator*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: " - " ++
|
||||||
|
These characters will be used to separate two different tags, except ++
|
||||||
|
when one of these tags is position and length.
|
||||||
|
|
||||||
|
*truncate-hours*: ++
|
||||||
|
typeof: bool ++
|
||||||
|
default: true ++
|
||||||
|
Whether to hide hours when media duration is less than an hour long.
|
||||||
|
|
||||||
|
*enable-tooltip-len-limits*: ++
|
||||||
|
typeof: bool ++
|
||||||
|
default: false ++
|
||||||
|
Option to enable the length limits for the tooltip as well. By default
|
||||||
|
the tooltip ignores all length limits.
|
||||||
|
|
||||||
|
*ellipsis*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: "…" ++
|
||||||
|
This character will be used when any of the tags exceed their maximum
|
||||||
|
length. If you don't want to use an ellipsis, set this to empty string.
|
||||||
|
|
||||||
|
*rotate*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
Positive value to rotate the text label.
|
||||||
|
|
||||||
|
*max-length*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
The maximum length in character the module should display.
|
||||||
|
|
||||||
|
*min-length*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
The minimum length in characters the module should take up.
|
||||||
|
|
||||||
|
*align*: ++
|
||||||
|
typeof: float ++
|
||||||
|
The alignment of the text, where 0 is left-aligned and 1 is right-aligned.
|
||||||
|
If the module is rotated, it will follow the flow of the text.
|
||||||
|
|
||||||
|
*on-click*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: play-pause ++
|
||||||
|
Overwrite default action toggles.
|
||||||
|
|
||||||
|
*on-middle-click*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: previous track ++
|
||||||
|
Overwrite default action toggles.
|
||||||
|
|
||||||
|
*on-right-click*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: next track ++
|
||||||
|
Overwrite default action toggles.
|
||||||
|
|
||||||
|
*player-icons*: ++
|
||||||
|
typeof: map[string]string ++
|
||||||
|
Allows setting _{player-icon}_ based on player-name property.
|
||||||
|
|
||||||
|
*status-icons*: ++
|
||||||
|
typeof: map[string]string ++
|
||||||
|
Allows setting _{status-icon}_ based on player status (playing, paused,
|
||||||
|
stopped).
|
||||||
|
|
||||||
|
|
||||||
|
# FORMAT REPLACEMENTS
|
||||||
|
|
||||||
|
*{player}*: The name of the current media player
|
||||||
|
|
||||||
|
*{status}*: The current status (playing, paused, stopped)
|
||||||
|
|
||||||
|
*{artist}*: The artist of the current track
|
||||||
|
|
||||||
|
*{album}*: The album title of the current track
|
||||||
|
|
||||||
|
*{title}*: The title of the current track
|
||||||
|
|
||||||
|
*{length}*: Length of the track, formatted as HH:MM:SS
|
||||||
|
|
||||||
|
*{dynamic}*: Use _{artist}_, _{album}_, _{title}_ and _{length}_, automatically omit++
|
||||||
|
empty values
|
||||||
|
|
||||||
|
*{player_icon}*: Chooses an icon from _player-icons_ based on _{player}_
|
||||||
|
|
||||||
|
*{status_icon}*: Chooses an icon from _status-icons_ based on _{status}_
|
||||||
|
|
||||||
|
# EXAMPLES
|
||||||
|
|
||||||
|
```
|
||||||
|
"mpris": {
|
||||||
|
"format": "{player_icon} {dynamic}",
|
||||||
|
"format-paused": "{status_icon} <i>{dynamic}</i>",
|
||||||
|
"player-icons": {
|
||||||
|
"default": "▶",
|
||||||
|
"mpv": "🎵"
|
||||||
|
},
|
||||||
|
"status-icons": {
|
||||||
|
"paused": "⏸"
|
||||||
|
},
|
||||||
|
// "ignored-players": ["firefox"]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
# STYLE
|
||||||
|
|
||||||
|
- *#mpris*
|
||||||
|
- *#mpris.${status}*
|
||||||
|
- *#mpris.${player}*
|
|
@ -51,12 +51,12 @@ Additionally you can control the volume by scrolling *up* or *down* while the cu
|
||||||
The maximum length in character the module should display.
|
The maximum length in character the module should display.
|
||||||
|
|
||||||
*min-length*: ++
|
*min-length*: ++
|
||||||
typeof: integer ++
|
typeof: integer ++
|
||||||
The minimum length in characters the module should take up.
|
The minimum length in characters the module should take up.
|
||||||
|
|
||||||
*align*: ++
|
*align*: ++
|
||||||
typeof: float ++
|
typeof: float ++
|
||||||
The alignment of the text, where 0 is left-aligned and 1 is right-aligned. If the module is rotated, it will follow the flow of the text.
|
The alignment of the text, where 0 is left-aligned and 1 is right-aligned. If the module is rotated, it will follow the flow of the text.
|
||||||
|
|
||||||
*scroll-step*: ++
|
*scroll-step*: ++
|
||||||
typeof: float ++
|
typeof: float ++
|
||||||
|
@ -91,6 +91,10 @@ Additionally you can control the volume by scrolling *up* or *down* while the cu
|
||||||
typeof: double ++
|
typeof: double ++
|
||||||
Threshold to be used when scrolling.
|
Threshold to be used when scrolling.
|
||||||
|
|
||||||
|
*reverse-scrolling*: ++
|
||||||
|
typeof: bool ++
|
||||||
|
Option to reverse the scroll direction.
|
||||||
|
|
||||||
*tooltip*: ++
|
*tooltip*: ++
|
||||||
typeof: bool ++
|
typeof: bool ++
|
||||||
default: true ++
|
default: true ++
|
||||||
|
|
|
@ -0,0 +1,67 @@
|
||||||
|
waybar-river-layout(5)
|
||||||
|
|
||||||
|
# NAME
|
||||||
|
|
||||||
|
waybar - river layout module
|
||||||
|
|
||||||
|
# DESCRIPTION
|
||||||
|
|
||||||
|
The *layout* module displays the current layout in river.
|
||||||
|
|
||||||
|
It may not be set until a layout is first applied.
|
||||||
|
|
||||||
|
# CONFIGURATION
|
||||||
|
|
||||||
|
Addressed by *river/layout*
|
||||||
|
|
||||||
|
*format*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: {} ++
|
||||||
|
The format, how information should be displayed. On {} data gets inserted.
|
||||||
|
|
||||||
|
*rotate*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
Positive value to rotate the text label.
|
||||||
|
|
||||||
|
*max-length*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
The maximum length in character the module should display.
|
||||||
|
|
||||||
|
*min-length*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
The minimum length in characters the module should take up.
|
||||||
|
|
||||||
|
*align*: ++
|
||||||
|
typeof: float ++
|
||||||
|
The alignment of the text, where 0 is left-aligned and 1 is right-aligned. If the module is rotated, it will follow the flow of the text.
|
||||||
|
|
||||||
|
*on-click*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when clicked on the module.
|
||||||
|
|
||||||
|
*on-click-middle*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when middle-clicked on the module using mousewheel.
|
||||||
|
|
||||||
|
*on-click-right*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when you right clicked on the module.
|
||||||
|
|
||||||
|
# EXAMPLE
|
||||||
|
|
||||||
|
```
|
||||||
|
"river/layout": {
|
||||||
|
"format": "{}",
|
||||||
|
"min-length": 4,
|
||||||
|
"align": "right"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
# STYLE
|
||||||
|
|
||||||
|
- *#layout*
|
||||||
|
- *#layout.focused* Applied when the output this module's bar belongs to is focused.
|
||||||
|
|
||||||
|
# SEE ALSO
|
||||||
|
|
||||||
|
waybar(5), river(1)
|
|
@ -66,9 +66,28 @@ Addressed by *sway/window*
|
||||||
default: true ++
|
default: true ++
|
||||||
Option to disable tooltip on hover.
|
Option to disable tooltip on hover.
|
||||||
|
|
||||||
|
*all-outputs*: ++
|
||||||
|
typeof: bool ++
|
||||||
|
default: false ++
|
||||||
|
Option to show the focused window along with its workspace styles on all outputs.
|
||||||
|
|
||||||
|
*offscreen-css*: ++
|
||||||
|
typeof: bool ++
|
||||||
|
default: false ++
|
||||||
|
Only effective when all-outputs is true. Adds style according to present windows on unfocused outputs instead of showing the focused window and style.
|
||||||
|
|
||||||
|
*offscreen-css-text*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Only effective when both all-outputs and offscreen-style are true. On screens currently not focused, show the given text along with that workspaces styles.
|
||||||
|
|
||||||
|
*show-focused-workspace-name*: ++
|
||||||
|
typeof: bool ++
|
||||||
|
default: false ++
|
||||||
|
If the workspace itself is focused and the workspace contains nodes or floating_nodes, show the workspace name. If not set, text remains empty but styles according to nodes in the workspace are still applied.
|
||||||
|
|
||||||
*rewrite*: ++
|
*rewrite*: ++
|
||||||
typeof: object ++
|
typeof: object ++
|
||||||
Rules to rewrite window title. See *rewrite rules*.
|
Rules to rewrite the module format output. See *rewrite rules*.
|
||||||
|
|
||||||
*icon*: ++
|
*icon*: ++
|
||||||
typeof: bool ++
|
typeof: bool ++
|
||||||
|
@ -97,7 +116,7 @@ captures of the expression.
|
||||||
|
|
||||||
Regular expression and replacement follow ECMA-script rules.
|
Regular expression and replacement follow ECMA-script rules.
|
||||||
|
|
||||||
If no expression matches, the title is left unchanged.
|
If no expression matches, the format output is left unchanged.
|
||||||
|
|
||||||
Invalid expressions (e.g., mismatched parentheses) are skipped.
|
Invalid expressions (e.g., mismatched parentheses) are skipped.
|
||||||
|
|
||||||
|
@ -117,6 +136,10 @@ Invalid expressions (e.g., mismatched parentheses) are skipped.
|
||||||
# STYLE
|
# STYLE
|
||||||
|
|
||||||
- *#window*
|
- *#window*
|
||||||
- *window#waybar.empty* When no windows is in the workspace
|
- *window#waybar.empty* When no windows are in the workspace, or screen is not focused and offscreen-css option is not set
|
||||||
- *window#waybar.solo* When one window is in the workspace
|
- *window#waybar.solo* When one tiled window is in the workspace
|
||||||
|
- *window#waybar.floating* When there are only floating windows in the workspace
|
||||||
|
- *window#waybar.stacked* When there is more than one window in the workspace and the workspace layout is stacked
|
||||||
|
- *window#waybar.tabbed* When there is more than one window in the workspace and the workspace layout is tabbed
|
||||||
|
- *window#waybar.tiled* When there is more than one window in the workspace and the workspace layout is splith or splitv
|
||||||
- *window#waybar.<app_id>* Where *app_id* is the app_id or *instance* name like (*chromium*) of the only window in the workspace
|
- *window#waybar.<app_id>* Where *app_id* is the app_id or *instance* name like (*chromium*) of the only window in the workspace
|
||||||
|
|
|
@ -73,6 +73,15 @@ Addressed by *sway/workspaces*
|
||||||
typeof: bool ++
|
typeof: bool ++
|
||||||
Whether to disable *workspace_auto_back_and_forth* when clicking on workspaces. If this is set to *true*, clicking on a workspace you are already on won't do anything, even if *workspace_auto_back_and_forth* is enabled in the Sway configuration.
|
Whether to disable *workspace_auto_back_and_forth* when clicking on workspaces. If this is set to *true*, clicking on a workspace you are already on won't do anything, even if *workspace_auto_back_and_forth* is enabled in the Sway configuration.
|
||||||
|
|
||||||
|
*alphabetical_sort*: ++
|
||||||
|
typeof: bool ++
|
||||||
|
Whether to sort workspaces alphabetically. Please note this can make "swaymsg workspace prev/next" move to workspaces inconsistent with the ordering shown in Waybar.
|
||||||
|
|
||||||
|
warp-on-scroll: ++
|
||||||
|
typeof: bool ++
|
||||||
|
default: true ++
|
||||||
|
If set to false, you can scroll to cycle through workspaces without mouse warping being enabled. If set to true this behaviour is disabled.
|
||||||
|
|
||||||
# FORMAT REPLACEMENTS
|
# FORMAT REPLACEMENTS
|
||||||
|
|
||||||
*{value}*: Name of the workspace, as defined by sway.
|
*{value}*: Name of the workspace, as defined by sway.
|
||||||
|
@ -83,6 +92,8 @@ Addressed by *sway/workspaces*
|
||||||
|
|
||||||
*{index}*: Index of the workspace.
|
*{index}*: Index of the workspace.
|
||||||
|
|
||||||
|
*{output}*: Output where the workspace is located.
|
||||||
|
|
||||||
# ICONS
|
# ICONS
|
||||||
|
|
||||||
Additional to workspace name matching, the following *format-icons* can be set.
|
Additional to workspace name matching, the following *format-icons* can be set.
|
||||||
|
|
|
@ -19,6 +19,8 @@ Addressed by *temperature*
|
||||||
*hwmon-path*: ++
|
*hwmon-path*: ++
|
||||||
typeof: string ++
|
typeof: string ++
|
||||||
The temperature path to use, e.g. */sys/class/hwmon/hwmon2/temp1_input* instead of one in */sys/class/thermal/*.
|
The temperature path to use, e.g. */sys/class/hwmon/hwmon2/temp1_input* instead of one in */sys/class/thermal/*.
|
||||||
|
This can also be an array of strings. In this case, waybar will check each item in the array and use the first valid one.
|
||||||
|
This is suitable if you want to share the same configuration file among different machines with different hardware configurations.
|
||||||
|
|
||||||
*hwmon-path-abs*: ++
|
*hwmon-path-abs*: ++
|
||||||
typeof: string ++
|
typeof: string ++
|
||||||
|
@ -117,7 +119,7 @@ Addressed by *temperature*
|
||||||
```
|
```
|
||||||
"temperature": {
|
"temperature": {
|
||||||
// "thermal-zone": 2,
|
// "thermal-zone": 2,
|
||||||
// "hwmon-path": "/sys/class/hwmon/hwmon2/temp1_input",
|
// "hwmon-path": ["/sys/class/hwmon/hwmon2/temp1_input", "/sys/class/thermal/thermal_zone0/temp"],
|
||||||
// "critical-threshold": 80,
|
// "critical-threshold": 80,
|
||||||
// "format-critical": "{temperatureC}°C ",
|
// "format-critical": "{temperatureC}°C ",
|
||||||
"format": "{temperatureC}°C "
|
"format": "{temperatureC}°C "
|
||||||
|
|
|
@ -11,6 +11,12 @@ compatible devices in the tooltip.
|
||||||
|
|
||||||
# CONFIGURATION
|
# CONFIGURATION
|
||||||
|
|
||||||
|
*native-path*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: ++
|
||||||
|
The battery to monitor. Refer to the https://upower.freedesktop.org/docs/UpDevice.html#UpDevice--native-path ++
|
||||||
|
Can be obtained using `upower --dump`
|
||||||
|
|
||||||
*icon-size*: ++
|
*icon-size*: ++
|
||||||
typeof: integer ++
|
typeof: integer ++
|
||||||
default: 20 ++
|
default: 20 ++
|
||||||
|
@ -68,6 +74,25 @@ depending on the charging state.
|
||||||
"tooltip-spacing": 20
|
"tooltip-spacing": 20
|
||||||
}
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
```
|
||||||
|
"upower": {
|
||||||
|
"native-path": "/org/bluez/hci0/dev_D4_AE_41_38_D0_EF",
|
||||||
|
"icon-size": 20,
|
||||||
|
"hide-if-empty": true,
|
||||||
|
"tooltip": true,
|
||||||
|
"tooltip-spacing": 20
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
```
|
||||||
|
"upower": {
|
||||||
|
"native-path": "battery_sony_controller_battery_d0o27o88o32ofcoee",
|
||||||
|
"icon-size": 20,
|
||||||
|
"hide-if-empty": true,
|
||||||
|
"tooltip": true,
|
||||||
|
"tooltip-spacing": 20
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
# STYLE
|
# STYLE
|
||||||
|
|
|
@ -11,59 +11,77 @@ The *wireplumber* module displays the current volume reported by WirePlumber.
|
||||||
# CONFIGURATION
|
# CONFIGURATION
|
||||||
|
|
||||||
*format*: ++
|
*format*: ++
|
||||||
typeof: string ++
|
typeof: string ++
|
||||||
default: *{volume}%* ++
|
default: *{volume}%* ++
|
||||||
The format, how information should be displayed. This format is used when other formats aren't specified.
|
The format, how information should be displayed. This format is used when other formats aren't specified.
|
||||||
|
|
||||||
*format-muted*: ++
|
*format-muted*: ++
|
||||||
typeof: string ++
|
typeof: string ++
|
||||||
This format is used when the sound is muted.
|
This format is used when the sound is muted.
|
||||||
|
|
||||||
*tooltip*: ++
|
*tooltip*: ++
|
||||||
typeof: bool ++
|
typeof: bool ++
|
||||||
default: *true* ++
|
default: *true* ++
|
||||||
Option to disable tooltip on hover.
|
Option to disable tooltip on hover.
|
||||||
|
|
||||||
*tooltip-format*: ++
|
*tooltip-format*: ++
|
||||||
typeof: string ++
|
typeof: string ++
|
||||||
default: *{node_name}* ++
|
default: *{node_name}* ++
|
||||||
The format of information displayed in the tooltip.
|
The format of information displayed in the tooltip.
|
||||||
|
|
||||||
*rotate*: ++
|
*rotate*: ++
|
||||||
typeof: integer ++
|
typeof: integer ++
|
||||||
Positive value to rotate the text label.
|
Positive value to rotate the text label.
|
||||||
|
|
||||||
*states*: ++
|
*states*: ++
|
||||||
typeof: object ++
|
typeof: object ++
|
||||||
A number of volume states which get activated on certain volume levels. See *waybar-states(5)*.
|
A number of volume states which get activated on certain volume levels. See *waybar-states(5)*.
|
||||||
|
|
||||||
*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.
|
||||||
|
|
||||||
*min-length*: ++
|
*min-length*: ++
|
||||||
typeof: integer ++
|
typeof: integer ++
|
||||||
The minimum length in characters the module should take up.
|
The minimum length in characters the module should take up.
|
||||||
|
|
||||||
*align*: ++
|
*align*: ++
|
||||||
typeof: float ++
|
typeof: float ++
|
||||||
The alignment of the text, where 0 is left-aligned and 1 is right-aligned. If the module is rotated, it will follow the flow of the text.
|
The alignment of the text, where 0 is left-aligned and 1 is right-aligned. If the module is rotated, it will follow the flow of the text.
|
||||||
|
|
||||||
|
*scroll-step*: ++
|
||||||
|
typeof: float ++
|
||||||
|
default: 1.0 ++
|
||||||
|
The speed in which to change the volume when scrolling.
|
||||||
|
|
||||||
*on-click*: ++
|
*on-click*: ++
|
||||||
typeof: string ++
|
typeof: string ++
|
||||||
Command to execute when clicked on the module.
|
Command to execute when clicked on the module.
|
||||||
|
|
||||||
*on-click-middle*: ++
|
*on-click-middle*: ++
|
||||||
typeof: string ++
|
typeof: string ++
|
||||||
Command to execute when middle-clicked on the module using mousewheel.
|
Command to execute when middle-clicked on the module using mousewheel.
|
||||||
|
|
||||||
*on-click-right*: ++
|
*on-click-right*: ++
|
||||||
typeof: string ++
|
typeof: string ++
|
||||||
Command to execute when you right clicked on the module.
|
Command to execute when you right clicked on the module.
|
||||||
|
|
||||||
*on-update*: ++
|
*on-update*: ++
|
||||||
typeof: string ++
|
typeof: string ++
|
||||||
Command to execute when the module is updated.
|
Command to execute when the module is updated.
|
||||||
|
|
||||||
|
*on-scroll-up*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when scrolling up on the module. This replaces the default behaviour of volume control.
|
||||||
|
|
||||||
|
*on-scroll-down*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when scrolling down on the module. This replaces the default behaviour of volume control.
|
||||||
|
|
||||||
|
*max-volume*: ++
|
||||||
|
typeof: float ++
|
||||||
|
default: 100 ++
|
||||||
|
The maximum volume that can be set, in percentage.
|
||||||
|
|
||||||
# FORMAT REPLACEMENTS
|
# FORMAT REPLACEMENTS
|
||||||
|
|
||||||
|
|
|
@ -52,6 +52,11 @@ Addressed by *wlr/taskbar*
|
||||||
default: false ++
|
default: false ++
|
||||||
If set to true, always reorder the tasks in the taskbar so that the currently active one is first. Otherwise don't reorder.
|
If set to true, always reorder the tasks in the taskbar so that the currently active one is first. Otherwise don't reorder.
|
||||||
|
|
||||||
|
*sort-by-app-id*: ++
|
||||||
|
typeof: bool ++
|
||||||
|
default: false ++
|
||||||
|
If set to true, group tasks by their app_id. Cannot be used with 'active-first'.
|
||||||
|
|
||||||
*on-click*: ++
|
*on-click*: ++
|
||||||
typeof: string ++
|
typeof: string ++
|
||||||
The action which should be triggered when clicking on the application button with the left mouse button.
|
The action which should be triggered when clicking on the application button with the left mouse button.
|
||||||
|
@ -76,6 +81,10 @@ Addressed by *wlr/taskbar*
|
||||||
typeof: object ++
|
typeof: object ++
|
||||||
Dictionary of app_id to be replaced with
|
Dictionary of app_id to be replaced with
|
||||||
|
|
||||||
|
*rewrite*: ++
|
||||||
|
typeof: object ++
|
||||||
|
Rules to rewrite the module format output. See *rewrite rules*.
|
||||||
|
|
||||||
# FORMAT REPLACEMENTS
|
# FORMAT REPLACEMENTS
|
||||||
|
|
||||||
*{icon}*: The icon of the application.
|
*{icon}*: The icon of the application.
|
||||||
|
@ -104,6 +113,18 @@ Addressed by *wlr/taskbar*
|
||||||
|
|
||||||
*close*: Close the application.
|
*close*: Close the application.
|
||||||
|
|
||||||
|
# REWRITE RULES
|
||||||
|
|
||||||
|
*rewrite* is an object where keys are regular expressions and values are
|
||||||
|
rewrite rules if the expression matches. Rules may contain references to
|
||||||
|
captures of the expression.
|
||||||
|
|
||||||
|
Regular expression and replacement follow ECMA-script rules.
|
||||||
|
|
||||||
|
If no expression matches, the format output is left unchanged.
|
||||||
|
|
||||||
|
Invalid expressions (e.g., mismatched parentheses) are skipped.
|
||||||
|
|
||||||
# EXAMPLES
|
# EXAMPLES
|
||||||
|
|
||||||
```
|
```
|
||||||
|
@ -119,6 +140,10 @@ Addressed by *wlr/taskbar*
|
||||||
],
|
],
|
||||||
"app_ids-mapping": {
|
"app_ids-mapping": {
|
||||||
"firefoxdeveloperedition": "firefox-developer-edition"
|
"firefoxdeveloperedition": "firefox-developer-edition"
|
||||||
|
},
|
||||||
|
"rewrite": {
|
||||||
|
"Firefox Web Browser": "Firefox",
|
||||||
|
"Foot Server": "Terminal"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
|
@ -65,7 +65,7 @@ Addressed by *wlr/workspaces*
|
||||||
Additional to workspace name matching, the following *format-icons* can be set.
|
Additional to workspace name matching, the following *format-icons* can be set.
|
||||||
|
|
||||||
- *default*: Will be shown, when no string match is found.
|
- *default*: Will be shown, when no string match is found.
|
||||||
- *focused*: Will be shown, when workspace is focused
|
- *active*: Will be shown, when workspace is active
|
||||||
|
|
||||||
# EXAMPLES
|
# EXAMPLES
|
||||||
|
|
||||||
|
@ -78,7 +78,7 @@ Additional to workspace name matching, the following *format-icons* can be set.
|
||||||
"3": "",
|
"3": "",
|
||||||
"4": "",
|
"4": "",
|
||||||
"5": "",
|
"5": "",
|
||||||
"focused": "",
|
"active": "",
|
||||||
"default": ""
|
"default": ""
|
||||||
},
|
},
|
||||||
"sort-by-number": true
|
"sort-by-number": true
|
||||||
|
|
|
@ -31,6 +31,7 @@ Also a minimal example configuration can be found on the at the bottom of this m
|
||||||
typeof: string|array ++
|
typeof: string|array ++
|
||||||
Specifies on which screen this bar will be displayed. Exclamation mark(*!*) can be used to exclude specific output.
|
Specifies on which screen this bar will be displayed. Exclamation mark(*!*) can be used to exclude specific output.
|
||||||
Output specification follows sway's and can either be the output port such as "HDMI-A-1" or a string consisting of the make, model and serial such as "Some Company ABC123 0x00000000". See *sway-output(5)* for details.
|
Output specification follows sway's and can either be the output port such as "HDMI-A-1" or a string consisting of the make, model and serial such as "Some Company ABC123 0x00000000". See *sway-output(5)* for details.
|
||||||
|
In an array, star '*\**' can be used at the end to accept all outputs, in case all previous entries are exclusions.
|
||||||
|
|
||||||
*position* ++
|
*position* ++
|
||||||
typeof: string ++
|
typeof: string ++
|
||||||
|
@ -78,7 +79,12 @@ Also a minimal example configuration can be found on the at the bottom of this m
|
||||||
Selects one of the preconfigured display modes. This is an equivalent of the sway-bar(5) *mode* command and supports the same values: *dock*, *hide*, *invisible*, *overlay*. ++
|
Selects one of the preconfigured display modes. This is an equivalent of the sway-bar(5) *mode* command and supports the same values: *dock*, *hide*, *invisible*, *overlay*. ++
|
||||||
Note: *hide* and *invisible* modes may be not as useful without Sway IPC.
|
Note: *hide* and *invisible* modes may be not as useful without Sway IPC.
|
||||||
|
|
||||||
modifier-reset ++
|
*start_hidden* ++
|
||||||
|
typeof: bool ++
|
||||||
|
default: *false* ++
|
||||||
|
Option to start the bar hidden.
|
||||||
|
|
||||||
|
*modifier-reset* ++
|
||||||
typeof: string ++
|
typeof: string ++
|
||||||
default: *press*
|
default: *press*
|
||||||
Defines the timing of modifier key to reset the bar visibility.
|
Defines the timing of modifier key to reset the bar visibility.
|
||||||
|
@ -243,6 +249,7 @@ A module group is defined by specifying a module named "group/some-group-name".
|
||||||
"modules-right": ["group/hardware", "clock"],
|
"modules-right": ["group/hardware", "clock"],
|
||||||
|
|
||||||
"group/hardware": {
|
"group/hardware": {
|
||||||
|
"orientation": "vertical",
|
||||||
"modules": [
|
"modules": [
|
||||||
"cpu",
|
"cpu",
|
||||||
"memory",
|
"memory",
|
||||||
|
@ -254,6 +261,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
|
# SUPPORTED MODULES
|
||||||
|
|
||||||
- *waybar-backlight(5)*
|
- *waybar-backlight(5)*
|
||||||
|
@ -264,19 +273,23 @@ A module group is defined by specifying a module named "group/some-group-name".
|
||||||
- *waybar-custom(5)*
|
- *waybar-custom(5)*
|
||||||
- *waybar-disk(5)*
|
- *waybar-disk(5)*
|
||||||
- *waybar-idle-inhibitor(5)*
|
- *waybar-idle-inhibitor(5)*
|
||||||
|
- *waybar-image(5)*
|
||||||
- *waybar-keyboard-state(5)*
|
- *waybar-keyboard-state(5)*
|
||||||
- *waybar-memory(5)*
|
- *waybar-memory(5)*
|
||||||
- *waybar-mpd(5)*
|
- *waybar-mpd(5)*
|
||||||
|
- *waybar-mpris(5)*
|
||||||
- *waybar-network(5)*
|
- *waybar-network(5)*
|
||||||
- *waybar-pulseaudio(5)*
|
- *waybar-pulseaudio(5)*
|
||||||
- *waybar-river-mode(5)*
|
- *waybar-river-mode(5)*
|
||||||
- *waybar-river-tags(5)*
|
- *waybar-river-tags(5)*
|
||||||
- *waybar-river-window(5)*
|
- *waybar-river-window(5)*
|
||||||
|
- *waybar-river-layout(5)*
|
||||||
- *waybar-states(5)*
|
- *waybar-states(5)*
|
||||||
- *waybar-sway-mode(5)*
|
- *waybar-sway-mode(5)*
|
||||||
- *waybar-sway-scratchpad(5)*
|
- *waybar-sway-scratchpad(5)*
|
||||||
- *waybar-sway-window(5)*
|
- *waybar-sway-window(5)*
|
||||||
- *waybar-sway-workspaces(5)*
|
- *waybar-sway-workspaces(5)*
|
||||||
|
- *waybar-wireplumber(5)*
|
||||||
- *waybar-wlr-taskbar(5)*
|
- *waybar-wlr-taskbar(5)*
|
||||||
- *waybar-wlr-workspaces(5)*
|
- *waybar-wlr-workspaces(5)*
|
||||||
- *waybar-temperature(5)*
|
- *waybar-temperature(5)*
|
||||||
|
|
75
meson.build
75
meson.build
|
@ -1,8 +1,8 @@
|
||||||
project(
|
project(
|
||||||
'waybar', 'cpp', 'c',
|
'waybar', 'cpp', 'c',
|
||||||
version: '0.9.16',
|
version: '0.9.18',
|
||||||
license: 'MIT',
|
license: 'MIT',
|
||||||
meson_version: '>= 0.49.0',
|
meson_version: '>= 0.50.0',
|
||||||
default_options : [
|
default_options : [
|
||||||
'cpp_std=c++17',
|
'cpp_std=c++17',
|
||||||
'buildtype=release',
|
'buildtype=release',
|
||||||
|
@ -86,7 +86,10 @@ wayland_cursor = dependency('wayland-cursor')
|
||||||
wayland_protos = dependency('wayland-protocols')
|
wayland_protos = dependency('wayland-protocols')
|
||||||
gtkmm = dependency('gtkmm-3.0', version : ['>=3.22.0'])
|
gtkmm = dependency('gtkmm-3.0', version : ['>=3.22.0'])
|
||||||
dbusmenu_gtk = dependency('dbusmenu-gtk3-0.4', required: get_option('dbusmenu-gtk'))
|
dbusmenu_gtk = dependency('dbusmenu-gtk3-0.4', required: get_option('dbusmenu-gtk'))
|
||||||
giounix = dependency('gio-unix-2.0', required: (get_option('dbusmenu-gtk').enabled() or get_option('logind').enabled() or get_option('upower_glib').enabled()))
|
giounix = dependency('gio-unix-2.0', required: (get_option('dbusmenu-gtk').enabled() or
|
||||||
|
get_option('logind').enabled() or
|
||||||
|
get_option('upower_glib').enabled() or
|
||||||
|
get_option('mpris').enabled()))
|
||||||
jsoncpp = dependency('jsoncpp', version : ['>=1.9.2'], fallback : ['jsoncpp', 'jsoncpp_dep'])
|
jsoncpp = dependency('jsoncpp', version : ['>=1.9.2'], fallback : ['jsoncpp', 'jsoncpp_dep'])
|
||||||
sigcpp = dependency('sigc++-2.0')
|
sigcpp = dependency('sigc++-2.0')
|
||||||
libinotify = dependency('libinotify', required: false)
|
libinotify = dependency('libinotify', required: false)
|
||||||
|
@ -95,6 +98,7 @@ libinput = dependency('libinput', required: get_option('libinput'))
|
||||||
libnl = dependency('libnl-3.0', required: get_option('libnl'))
|
libnl = dependency('libnl-3.0', required: get_option('libnl'))
|
||||||
libnlgen = dependency('libnl-genl-3.0', required: get_option('libnl'))
|
libnlgen = dependency('libnl-genl-3.0', required: get_option('libnl'))
|
||||||
upower_glib = dependency('upower-glib', required: get_option('upower_glib'))
|
upower_glib = dependency('upower-glib', required: get_option('upower_glib'))
|
||||||
|
playerctl = dependency('playerctl', version : ['>=2.0.0'], required: get_option('mpris'))
|
||||||
libpulse = dependency('libpulse', required: get_option('pulseaudio'))
|
libpulse = dependency('libpulse', required: get_option('pulseaudio'))
|
||||||
libudev = dependency('libudev', required: get_option('libudev'))
|
libudev = dependency('libudev', required: get_option('libudev'))
|
||||||
libevdev = dependency('libevdev', required: get_option('libevdev'))
|
libevdev = dependency('libevdev', required: get_option('libevdev'))
|
||||||
|
@ -119,11 +123,18 @@ gtk_layer_shell = dependency('gtk-layer-shell-0',
|
||||||
required: get_option('gtk-layer-shell'),
|
required: get_option('gtk-layer-shell'),
|
||||||
fallback : ['gtk-layer-shell', 'gtk_layer_shell_dep'])
|
fallback : ['gtk-layer-shell', 'gtk_layer_shell_dep'])
|
||||||
systemd = dependency('systemd', required: get_option('systemd'))
|
systemd = dependency('systemd', required: get_option('systemd'))
|
||||||
tz_dep = dependency('date',
|
|
||||||
required: false,
|
cpp_lib_chrono = compiler.compute_int('__cpp_lib_chrono', prefix : '#include <chrono>')
|
||||||
default_options : [ 'use_system_tzdb=true' ],
|
have_chrono_timezones = cpp_lib_chrono >= 201907
|
||||||
modules : [ 'date::date', 'date::date-tz' ],
|
if have_chrono_timezones
|
||||||
fallback: [ 'date', 'tz_dep' ])
|
tz_dep = declare_dependency()
|
||||||
|
else
|
||||||
|
tz_dep = dependency('date',
|
||||||
|
required: false,
|
||||||
|
default_options : [ 'use_system_tzdb=true' ],
|
||||||
|
modules : [ 'date::date', 'date::date-tz' ],
|
||||||
|
fallback: [ 'date', 'tz_dep' ])
|
||||||
|
endif
|
||||||
|
|
||||||
prefix = get_option('prefix')
|
prefix = get_option('prefix')
|
||||||
sysconfdir = get_option('sysconfdir')
|
sysconfdir = get_option('sysconfdir')
|
||||||
|
@ -159,11 +170,15 @@ src_files = files(
|
||||||
'src/client.cpp',
|
'src/client.cpp',
|
||||||
'src/config.cpp',
|
'src/config.cpp',
|
||||||
'src/group.cpp',
|
'src/group.cpp',
|
||||||
|
'src/util/prepare_for_sleep.cpp',
|
||||||
'src/util/ustring_clen.cpp',
|
'src/util/ustring_clen.cpp',
|
||||||
'src/util/sanitize_str.cpp',
|
'src/util/sanitize_str.cpp',
|
||||||
'src/util/rewrite_title.cpp'
|
'src/util/rewrite_string.cpp',
|
||||||
|
'src/util/gtk_icon.cpp'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
inc_dirs = ['include']
|
||||||
|
|
||||||
if is_linux
|
if is_linux
|
||||||
add_project_arguments('-DHAVE_CPU_LINUX', language: 'cpp')
|
add_project_arguments('-DHAVE_CPU_LINUX', language: 'cpp')
|
||||||
add_project_arguments('-DHAVE_MEMORY_LINUX', language: 'cpp')
|
add_project_arguments('-DHAVE_MEMORY_LINUX', language: 'cpp')
|
||||||
|
@ -213,6 +228,12 @@ if true
|
||||||
src_files += 'src/modules/river/mode.cpp'
|
src_files += 'src/modules/river/mode.cpp'
|
||||||
src_files += 'src/modules/river/tags.cpp'
|
src_files += 'src/modules/river/tags.cpp'
|
||||||
src_files += 'src/modules/river/window.cpp'
|
src_files += 'src/modules/river/window.cpp'
|
||||||
|
src_files += 'src/modules/river/layout.cpp'
|
||||||
|
endif
|
||||||
|
|
||||||
|
if true
|
||||||
|
add_project_arguments('-DHAVE_DWL', language: 'cpp')
|
||||||
|
src_files += 'src/modules/dwl/tags.cpp'
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if true
|
if true
|
||||||
|
@ -220,6 +241,8 @@ if true
|
||||||
src_files += 'src/modules/hyprland/backend.cpp'
|
src_files += 'src/modules/hyprland/backend.cpp'
|
||||||
src_files += 'src/modules/hyprland/window.cpp'
|
src_files += 'src/modules/hyprland/window.cpp'
|
||||||
src_files += 'src/modules/hyprland/language.cpp'
|
src_files += 'src/modules/hyprland/language.cpp'
|
||||||
|
src_files += 'src/modules/hyprland/submap.cpp'
|
||||||
|
src_files += 'src/modules/hyprland/workspaces.cpp'
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if libnl.found() and libnlgen.found()
|
if libnl.found() and libnlgen.found()
|
||||||
|
@ -238,6 +261,11 @@ if (upower_glib.found() and giounix.found() and not get_option('logind').disable
|
||||||
src_files += 'src/modules/upower/upower_tooltip.cpp'
|
src_files += 'src/modules/upower/upower_tooltip.cpp'
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
if (playerctl.found() and giounix.found() and not get_option('logind').disabled())
|
||||||
|
add_project_arguments('-DHAVE_MPRIS', language: 'cpp')
|
||||||
|
src_files += 'src/modules/mpris/mpris.cpp'
|
||||||
|
endif
|
||||||
|
|
||||||
if libpulse.found()
|
if libpulse.found()
|
||||||
add_project_arguments('-DHAVE_LIBPULSE', language: 'cpp')
|
add_project_arguments('-DHAVE_LIBPULSE', language: 'cpp')
|
||||||
src_files += 'src/modules/pulseaudio.cpp'
|
src_files += 'src/modules/pulseaudio.cpp'
|
||||||
|
@ -302,7 +330,10 @@ if get_option('rfkill').enabled() and is_linux
|
||||||
)
|
)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if tz_dep.found()
|
if have_chrono_timezones
|
||||||
|
add_project_arguments('-DHAVE_CHRONO_TIMEZONES', language: 'cpp')
|
||||||
|
src_files += 'src/modules/clock.cpp'
|
||||||
|
elif tz_dep.found()
|
||||||
add_project_arguments('-DHAVE_LIBDATE', language: 'cpp')
|
add_project_arguments('-DHAVE_LIBDATE', language: 'cpp')
|
||||||
src_files += 'src/modules/clock.cpp'
|
src_files += 'src/modules/clock.cpp'
|
||||||
else
|
else
|
||||||
|
@ -313,6 +344,17 @@ if get_option('experimental')
|
||||||
add_project_arguments('-DUSE_EXPERIMENTAL', language: 'cpp')
|
add_project_arguments('-DUSE_EXPERIMENTAL', language: 'cpp')
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
cava = dependency('cava',
|
||||||
|
version : '>=0.8.4',
|
||||||
|
required: get_option('cava'),
|
||||||
|
fallback : ['cava', 'cava_dep'],
|
||||||
|
not_found_message: 'cava is not found. Building waybar without cava')
|
||||||
|
|
||||||
|
if cava.found()
|
||||||
|
add_project_arguments('-DHAVE_LIBCAVA', language: 'cpp')
|
||||||
|
src_files += 'src/modules/cava.cpp'
|
||||||
|
endif
|
||||||
|
|
||||||
subdir('protocol')
|
subdir('protocol')
|
||||||
|
|
||||||
executable(
|
executable(
|
||||||
|
@ -334,6 +376,7 @@ executable(
|
||||||
libnl,
|
libnl,
|
||||||
libnlgen,
|
libnlgen,
|
||||||
upower_glib,
|
upower_glib,
|
||||||
|
playerctl,
|
||||||
libpulse,
|
libpulse,
|
||||||
libjack,
|
libjack,
|
||||||
libwireplumber,
|
libwireplumber,
|
||||||
|
@ -345,9 +388,10 @@ executable(
|
||||||
gtk_layer_shell,
|
gtk_layer_shell,
|
||||||
libsndio,
|
libsndio,
|
||||||
tz_dep,
|
tz_dep,
|
||||||
xkbregistry
|
xkbregistry,
|
||||||
|
cava
|
||||||
],
|
],
|
||||||
include_directories: [include_directories('include')],
|
include_directories: inc_dirs,
|
||||||
install: true,
|
install: true,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -384,14 +428,17 @@ if scdoc.found()
|
||||||
'waybar-disk.5.scd',
|
'waybar-disk.5.scd',
|
||||||
'waybar-gamemode.5.scd',
|
'waybar-gamemode.5.scd',
|
||||||
'waybar-idle-inhibitor.5.scd',
|
'waybar-idle-inhibitor.5.scd',
|
||||||
|
'waybar-image.5.scd',
|
||||||
'waybar-keyboard-state.5.scd',
|
'waybar-keyboard-state.5.scd',
|
||||||
'waybar-memory.5.scd',
|
'waybar-memory.5.scd',
|
||||||
'waybar-mpd.5.scd',
|
'waybar-mpd.5.scd',
|
||||||
|
'waybar-mpris.5.scd',
|
||||||
'waybar-network.5.scd',
|
'waybar-network.5.scd',
|
||||||
'waybar-pulseaudio.5.scd',
|
'waybar-pulseaudio.5.scd',
|
||||||
'waybar-river-mode.5.scd',
|
'waybar-river-mode.5.scd',
|
||||||
'waybar-river-tags.5.scd',
|
'waybar-river-tags.5.scd',
|
||||||
'waybar-river-window.5.scd',
|
'waybar-river-window.5.scd',
|
||||||
|
'waybar-river-layout.5.scd',
|
||||||
'waybar-sway-language.5.scd',
|
'waybar-sway-language.5.scd',
|
||||||
'waybar-sway-mode.5.scd',
|
'waybar-sway-mode.5.scd',
|
||||||
'waybar-sway-scratchpad.5.scd',
|
'waybar-sway-scratchpad.5.scd',
|
||||||
|
@ -405,6 +452,8 @@ if scdoc.found()
|
||||||
'waybar-bluetooth.5.scd',
|
'waybar-bluetooth.5.scd',
|
||||||
'waybar-sndio.5.scd',
|
'waybar-sndio.5.scd',
|
||||||
'waybar-upower.5.scd',
|
'waybar-upower.5.scd',
|
||||||
|
'waybar-wireplumber.5.scd',
|
||||||
|
'waybar-dwl-tags.5.scd',
|
||||||
]
|
]
|
||||||
|
|
||||||
if (giounix.found() and not get_option('logind').disabled())
|
if (giounix.found() and not get_option('logind').disabled())
|
||||||
|
@ -435,7 +484,7 @@ endif
|
||||||
|
|
||||||
catch2 = dependency(
|
catch2 = dependency(
|
||||||
'catch2',
|
'catch2',
|
||||||
version: '>=3.0.0',
|
version: '>=2.0.0',
|
||||||
fallback: ['catch2', 'catch2_dep'],
|
fallback: ['catch2', 'catch2_dep'],
|
||||||
required: get_option('tests'),
|
required: get_option('tests'),
|
||||||
)
|
)
|
||||||
|
|
|
@ -5,6 +5,7 @@ option('libudev', type: 'feature', value: 'auto', description: 'Enable libudev s
|
||||||
option('libevdev', type: 'feature', value: 'auto', description: 'Enable libevdev support for evdev related features')
|
option('libevdev', type: 'feature', value: 'auto', description: 'Enable libevdev support for evdev related features')
|
||||||
option('pulseaudio', type: 'feature', value: 'auto', description: 'Enable support for pulseaudio')
|
option('pulseaudio', type: 'feature', value: 'auto', description: 'Enable support for pulseaudio')
|
||||||
option('upower_glib', type: 'feature', value: 'auto', description: 'Enable support for upower')
|
option('upower_glib', type: 'feature', value: 'auto', description: 'Enable support for upower')
|
||||||
|
option('mpris', type: 'feature', value: 'auto', description: 'Enable support for mpris')
|
||||||
option('systemd', type: 'feature', value: 'auto', description: 'Install systemd user service unit')
|
option('systemd', type: 'feature', value: 'auto', description: 'Install systemd user service unit')
|
||||||
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('man-pages', type: 'feature', value: 'auto', description: 'Generate and install man pages')
|
option('man-pages', type: 'feature', value: 'auto', description: 'Generate and install man pages')
|
||||||
|
@ -17,3 +18,4 @@ option('tests', type: 'feature', value: 'auto', description: 'Enable tests')
|
||||||
option('experimental', type : 'boolean', value : false, description: 'Enable experimental features')
|
option('experimental', type : 'boolean', value : false, description: 'Enable experimental features')
|
||||||
option('jack', type: 'feature', value: 'auto', description: 'Enable support for JACK')
|
option('jack', type: 'feature', value: 'auto', description: 'Enable support for JACK')
|
||||||
option('wireplumber', type: 'feature', value: 'auto', description: 'Enable support for WirePlumber')
|
option('wireplumber', type: 'feature', value: 'auto', description: 'Enable support for WirePlumber')
|
||||||
|
option('cava', type: 'feature', value: 'auto', description: 'Enable support for Cava')
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
{ lib
|
||||||
|
, waybar
|
||||||
|
, version
|
||||||
|
}:
|
||||||
|
|
||||||
|
waybar.overrideAttrs (prev: {
|
||||||
|
inherit version;
|
||||||
|
# version = "0.9.17";
|
||||||
|
|
||||||
|
src = lib.cleanSourceWith {
|
||||||
|
filter = name: type:
|
||||||
|
let
|
||||||
|
baseName = baseNameOf (toString name);
|
||||||
|
in
|
||||||
|
! (
|
||||||
|
lib.hasSuffix ".nix" baseName
|
||||||
|
);
|
||||||
|
src = lib.cleanSource ../.;
|
||||||
|
};
|
||||||
|
})
|
|
@ -0,0 +1,166 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
This is largely ripped from somebar's ipc patchset; just with some personal modifications.
|
||||||
|
I would probably just submit raphi's patchset but I don't think that would be polite.
|
||||||
|
-->
|
||||||
|
<protocol name="dwl_ipc_unstable_v2">
|
||||||
|
<description summary="inter-proccess-communication about dwl's state">
|
||||||
|
This protocol allows clients to update and get updates from dwl.
|
||||||
|
|
||||||
|
Warning! The protocol described in this file is experimental and
|
||||||
|
backward incompatible changes may be made. Backward compatible
|
||||||
|
changes may be added together with the corresponding interface
|
||||||
|
version bump.
|
||||||
|
Backward incompatible changes are done by bumping the version
|
||||||
|
number in the protocol and interface names and resetting the
|
||||||
|
interface version. Once the protocol is to be declared stable,
|
||||||
|
the 'z' prefix and the version number in the protocol and
|
||||||
|
interface names are removed and the interface version number is
|
||||||
|
reset.
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<interface name="zdwl_ipc_manager_v2" version="1">
|
||||||
|
<description summary="manage dwl state">
|
||||||
|
This interface is exposed as a global in wl_registry.
|
||||||
|
|
||||||
|
Clients can use this interface to get a dwl_ipc_output.
|
||||||
|
After binding the client will recieve the dwl_ipc_manager.tags and dwl_ipc_manager.layout events.
|
||||||
|
The dwl_ipc_manager.tags and dwl_ipc_manager.layout events expose tags and layouts to the client.
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<request name="release" type="destructor">
|
||||||
|
<description summary="release dwl_ipc_manager">
|
||||||
|
Indicates that the client will not the dwl_ipc_manager object anymore.
|
||||||
|
Objects created through this instance are not affected.
|
||||||
|
</description>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="get_output">
|
||||||
|
<description summary="get a dwl_ipc_outout for a wl_output">
|
||||||
|
Get a dwl_ipc_outout for the specified wl_output.
|
||||||
|
</description>
|
||||||
|
<arg name="id" type="new_id" interface="zdwl_ipc_output_v2"/>
|
||||||
|
<arg name="output" type="object" interface="wl_output"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<event name="tags">
|
||||||
|
<description summary="Announces tag amount">
|
||||||
|
This event is sent after binding.
|
||||||
|
A roundtrip after binding guarantees the client recieved all tags.
|
||||||
|
</description>
|
||||||
|
<arg name="amount" type="uint"/>
|
||||||
|
</event>
|
||||||
|
|
||||||
|
<event name="layout">
|
||||||
|
<description summary="Announces a layout">
|
||||||
|
This event is sent after binding.
|
||||||
|
A roundtrip after binding guarantees the client recieved all layouts.
|
||||||
|
</description>
|
||||||
|
<arg name="name" type="string"/>
|
||||||
|
</event>
|
||||||
|
</interface>
|
||||||
|
|
||||||
|
<interface name="zdwl_ipc_output_v2" version="1">
|
||||||
|
<description summary="control dwl output">
|
||||||
|
Observe and control a dwl output.
|
||||||
|
|
||||||
|
Events are double-buffered:
|
||||||
|
Clients should cache events and redraw when a dwl_ipc_output.frame event is sent.
|
||||||
|
|
||||||
|
Request are not double-buffered:
|
||||||
|
The compositor will update immediately upon request.
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<enum name="tag_state">
|
||||||
|
<entry name="none" value="0" summary="no state"/>
|
||||||
|
<entry name="active" value="1" summary="tag is active"/>
|
||||||
|
<entry name="urgent" value="2" summary="tag has at least one urgent client"/>
|
||||||
|
</enum>
|
||||||
|
|
||||||
|
<request name="release" type="destructor">
|
||||||
|
<description summary="release dwl_ipc_outout">
|
||||||
|
Indicates to that the client no longer needs this dwl_ipc_output.
|
||||||
|
</description>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<event name="toggle_visibility">
|
||||||
|
<description summary="Toggle client visibilty">
|
||||||
|
Indicates the client should hide or show themselves.
|
||||||
|
If the client is visible then hide, if hidden then show.
|
||||||
|
</description>
|
||||||
|
</event>
|
||||||
|
|
||||||
|
<event name="active">
|
||||||
|
<description summary="Update the selected output.">
|
||||||
|
Indicates if the output is active. Zero is invalid, nonzero is valid.
|
||||||
|
</description>
|
||||||
|
<arg name="active" type="uint"/>
|
||||||
|
</event>
|
||||||
|
|
||||||
|
<event name="tag">
|
||||||
|
<description summary="Update the state of a tag.">
|
||||||
|
Indicates that a tag has been updated.
|
||||||
|
</description>
|
||||||
|
<arg name="tag" type="uint" summary="Index of the tag"/>
|
||||||
|
<arg name="state" type="uint" enum="tag_state" summary="The state of the tag."/>
|
||||||
|
<arg name="clients" type="uint" summary="The number of clients in the tag."/>
|
||||||
|
<arg name="focused" type="uint" summary="If there is a focused client. Nonzero being valid, zero being invalid."/>
|
||||||
|
</event>
|
||||||
|
|
||||||
|
<event name="layout">
|
||||||
|
<description summary="Update the layout.">
|
||||||
|
Indicates a new layout is selected.
|
||||||
|
</description>
|
||||||
|
<arg name="layout" type="uint" summary="Index of the layout."/>
|
||||||
|
</event>
|
||||||
|
|
||||||
|
<event name="title">
|
||||||
|
<description summary="Update the title.">
|
||||||
|
Indicates the title has changed.
|
||||||
|
</description>
|
||||||
|
<arg name="title" type="string" summary="The new title name."/>
|
||||||
|
</event>
|
||||||
|
|
||||||
|
<event name="appid" since="1">
|
||||||
|
<description summary="Update the appid.">
|
||||||
|
Indicates the appid has changed.
|
||||||
|
</description>
|
||||||
|
<arg name="appid" type="string" summary="The new appid."/>
|
||||||
|
</event>
|
||||||
|
|
||||||
|
<event name="layout_symbol" since="1">
|
||||||
|
<description summary="Update the current layout symbol">
|
||||||
|
Indicates the layout has changed. Since layout symbols are dynamic.
|
||||||
|
As opposed to the zdwl_ipc_manager.layout event, this should take precendence when displaying.
|
||||||
|
You can ignore the zdwl_ipc_output.layout event.
|
||||||
|
</description>
|
||||||
|
<arg name="layout" type="string" summary="The new layout"/>
|
||||||
|
</event>
|
||||||
|
|
||||||
|
<event name="frame">
|
||||||
|
<description summary="The update sequence is done.">
|
||||||
|
Indicates that a sequence of status updates have finished and the client should redraw.
|
||||||
|
</description>
|
||||||
|
</event>
|
||||||
|
|
||||||
|
<request name="set_tags">
|
||||||
|
<description summary="Set the active tags of this output"/>
|
||||||
|
<arg name="tagmask" type="uint" summary="bitmask of the tags that should be set."/>
|
||||||
|
<arg name="toggle_tagset" type="uint" summary="toggle the selected tagset, zero for invalid, nonzero for valid."/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="set_client_tags">
|
||||||
|
<description summary="Set the tags of the focused client.">
|
||||||
|
The tags are updated as follows:
|
||||||
|
new_tags = (current_tags AND and_tags) XOR xor_tags
|
||||||
|
</description>
|
||||||
|
<arg name="and_tags" type="uint"/>
|
||||||
|
<arg name="xor_tags" type="uint"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="set_layout">
|
||||||
|
<description summary="Set the layout of this output"/>
|
||||||
|
<arg name="index" type="uint" summary="index of a layout recieved by dwl_ipc_manager.layout"/>
|
||||||
|
</request>
|
||||||
|
</interface>
|
||||||
|
</protocol>
|
|
@ -30,6 +30,7 @@ client_protocols = [
|
||||||
['ext-workspace-unstable-v1.xml'],
|
['ext-workspace-unstable-v1.xml'],
|
||||||
['river-status-unstable-v1.xml'],
|
['river-status-unstable-v1.xml'],
|
||||||
['river-control-unstable-v1.xml'],
|
['river-control-unstable-v1.xml'],
|
||||||
|
['dwl-ipc-unstable-v2.xml'],
|
||||||
]
|
]
|
||||||
|
|
||||||
client_protos_src = []
|
client_protos_src = []
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue