Compare commits

..

1020 Commits

Author SHA1 Message Date
fd417c0805 chore: 0.9.15 2022-11-03 09:43:05 +01:00
afa590f781 Merge pull request #1758 from Alexays/revert-1687-fix-custom-module-markup
Revert "Escape text in custom module"
2022-11-02 06:00:00 +01:00
df36ac3408 Revert "Escape text in custom module" 2022-11-02 05:59:50 +01:00
ebdf575d45 fix: lint 2022-10-28 14:44:48 +02:00
a4d27ea806 fix: checking router id in handleEvent function 2022-10-28 14:44:04 +02:00
a10266ceee fix: add power to tooltip format 2022-10-28 14:35:18 +02:00
c374c412d3 chore: remove unwanted file 2022-10-27 10:00:38 +02:00
2fec1d4907 fix: typo 2022-10-27 09:14:07 +02:00
be28ee3d7e fix(#1707): hide module when no controller found 2022-10-27 09:00:31 +02:00
2d7e21ed7d fix: lint 2022-10-26 17:26:15 +02:00
930a3e168b Merge pull request #1747 from bi4k8/taskbar-task-reorder 2022-10-26 17:25:55 +02:00
7948d03d25 Merge pull request #1744 from Quantenzitrone/master 2022-10-26 17:14:58 +02:00
ff61e7bf4e taskbar: implement drag-and-drop task reordering 2022-10-25 19:39:23 +00:00
64849f52c9 fixed memory module not rounding numbers 2022-10-22 02:31:14 +02:00
1374b0fce4 Merge pull request #1740 from ErikReider/gamemode-segfault-fix 2022-10-20 13:09:50 +02:00
1ceaff27c2 Fixed gamemode module segfaulting when disconnecting monitor 2022-10-20 12:38:52 +02:00
527017baca chore: update date wrap 2022-10-20 11:05:19 +02:00
f330e51472 fix: typo 2022-10-20 10:57:27 +02:00
411c6f4b4b chore: update catch 2022-10-20 10:56:47 +02:00
e8e8ccb6cf Merge pull request #1661 from asas1asas200/zeng-feat-improve_keyboard 2022-10-20 10:50:35 +02:00
a24f2d72a7 Merge pull request #1730 from herlev/hyprland-window-rewrite 2022-10-20 10:48:57 +02:00
ffa458223d Merge pull request #1724 from llyyr/fix-build-with-catch2 2022-10-20 10:47:52 +02:00
aa8bd51952 Merge pull request #1738 from pinselimo/fix-button-padding 2022-10-20 10:46:08 +02:00
05dbfe261a style: Revert set default minimal width of buttons to zero #1737 2022-10-20 10:34:20 +02:00
1f591e36f1 button: Hardcode min-width property set to zero
Buttons come with an intrinsic min-width but lack a method to alter this
property. Setting the requested size to zero has also no effect on it.
The only way found to work is to hard code the CSS into the button.
2022-10-20 10:31:11 +02:00
d0677c1801 Merge pull request #1737 from pinselimo/fix-button-padding 2022-10-19 14:59:49 +02:00
c18c6b080a Set default minimal width of buttons to zero
Even if all margins, padding and borders of buttons are removed the
label inside the buttons may still be padded if they are too short.
Setting the minimal width of buttons to zero fixes this issue.
2022-10-19 14:48:56 +02:00
7240611d87 Merge pull request #1736 from pinselimo/fix-battery-module 2022-10-19 13:39:20 +02:00
e1045381fe Fix linter 2022-10-19 13:30:28 +02:00
e660a3634d Fix linter 2022-10-19 13:29:05 +02:00
54e04b5a30 Refactor rewriteTitle 2022-10-19 13:25:08 +02:00
662a250705 Fix battery indicator crash on linux
A pre-processor flag was misspelled and is now corrected.
2022-10-19 13:15:21 +02:00
f72c1a54d3 Merge branch 'Alexays:master' into hyprland-window-rewrite 2022-10-19 12:18:22 +02:00
6b221133c2 Merge pull request #1703 from lbartoletti/freebsd_battery 2022-10-19 09:08:47 +02:00
d01fda6fae Merge pull request #1721 from herlev/sort-workspaces-by-number 2022-10-19 09:08:03 +02:00
692b90c995 fix build 2022-10-19 08:36:15 +02:00
dea2d721eb Merge pull request #1733 from ItsDrike/master 2022-10-18 19:45:42 +02:00
72a2ada82c remove clang-format lines 2022-10-18 19:30:43 +02:00
6156a62294 fix time_remaining. FreeBSD sysctl returns minutes and not hours 2022-10-18 19:30:43 +02:00
d4d35e2f89 apply clang-format 2022-10-18 19:30:43 +02:00
a58988ea9d Battery: replace #else by #elif defined(__linux__)
Cannot use #else here when inotify_init1() is hidden behind #if defined(__Linux__).

Co-authored-by: Jan Beich <jbeich@FreeBSD.org>
2022-10-18 19:30:43 +02:00
0ada5ac8b0 Battery::getAdapterStatus: better code format 2022-10-18 19:30:41 +02:00
1421163df3 remove useless include <sys/types.h> 2022-10-18 19:30:23 +02:00
9d5f0e45c0 Add test if there is battery 2022-10-18 19:30:23 +02:00
45e44e03bd Apply jbeich suggestion for if defined(__linux__) 2022-10-18 19:30:21 +02:00
830c5cd5d0 FreeBSD: Add support to battery
This commit aims to propose a FreeBSD to gain battery support using sysctl on hw.acpi.battery.*
2022-10-18 19:30:04 +02:00
90f206f92a Fix crash on quickly switching workspaces
The hyprland/window widget had an assertion ensuring that the output
from hyprctl matched the currently selected workspace id. However this
assertion fails if workspaces are switched too quickly, causing the
selected workspace to differ in id from the one in hyprctl, failing this
assertion which then crashes the entire program.

This fix simply changes this assertion into an if statement, and if a
mismatch is found, empty string is returned as the window name.
2022-10-18 18:36:00 +02:00
59e7f1974c Document hyprland/window rewrite option 2022-10-18 13:21:20 +02:00
97ae2ff343 Add rewrite option to hyprland/window 2022-10-18 13:18:43 +02:00
3d63080346 Document sort-by-number option in man page 2022-10-18 12:25:22 +02:00
cb842d9d50 Merge branch 'Alexays:master' into sort-workspaces-by-number 2022-10-18 12:19:00 +02:00
a7e6330078 Merge pull request #1729 from pinselimo/use_gtk_button_v2 2022-10-18 11:27:17 +02:00
93807b0b3e resources: Remove border effect on hover
Moves the ``border = none;`` attribute from workspace buttons to the
global scope. The hover effects on all buttons are now consistent in the
default stylesheet.
2022-10-18 11:25:20 +02:00
6e73c58e60 fix: lint 2022-10-18 09:01:45 +02:00
209225e381 Merge pull request #1701 from Dordovel/master 2022-10-18 09:01:00 +02:00
7746328daa Merge pull request #1667 from asas1asas200/zeng-feat-sway_scratchpad 2022-10-18 09:00:31 +02:00
c7d475ee86 Merge pull request #1728 from lilydjwg/fixpa 2022-10-18 08:45:45 +02:00
4ed13df092 Merge branch 'Alexays:master' into master 2022-10-17 19:00:21 +03:00
33c3ab35a8 Fix linter error (formatting) 2022-10-17 10:13:37 +02:00
4dfea72db0 Merge branch 'Alexays:master' into sort-workspaces-by-number 2022-10-17 10:01:12 +02:00
504132dc55 Merge pull request #1719 from herlev/master 2022-10-17 09:53:05 +02:00
debbfccf07 Merge pull request #1705 from lbartoletti/freebsd_temperature_use_thermal-zone_config 2022-10-17 09:52:54 +02:00
56ec72c31c Merge branch 'master' into master 2022-10-17 09:44:17 +02:00
27c6c96b37 Merge branch 'master' into freebsd_temperature_use_thermal-zone_config 2022-10-17 09:34:06 +02:00
8551c4bbe3 fix: lint 2022-10-17 09:19:00 +02:00
58362abfaf Merge pull request #1630 from duxovni/pow_format 2022-10-17 09:16:47 +02:00
2abeba2b52 Merge pull request #1679 from tomcharnock/master 2022-10-17 09:10:54 +02:00
bfa3adcfd6 Merge pull request #1120 from pinselimo/use_gtk_button_v2 2022-10-17 09:09:12 +02:00
2db6fc8b1b Merge pull request #1687 from sespiros/fix-custom-module-markup 2022-10-17 09:08:01 +02:00
c2dd296d31 Merge pull request #1704 from gunslingerfry/master 2022-10-17 09:07:26 +02:00
5b0c5ea9ce Merge pull request #1720 from IanManske/inhibitor-default-state 2022-10-17 09:06:26 +02:00
c7bb0ae0af Merge pull request #1636 from IsaacWoods/master 2022-10-17 09:05:03 +02:00
b2f90dffe1 Merge pull request #1710 from m-braunschweig/filename 2022-10-17 09:04:21 +02:00
f86dff60e6 utils: add sanitize_str to encode '&' etc.
gtk requires some chars (<>&"') to be encoded for them to render
properly. `sanitize_str` sanitizes raw strings that have such chars and
returns a properly encoded string
2022-10-17 00:31:19 +02:00
1db3c55b48 Fix build with catch2>=3.0.0 2022-10-16 19:21:43 +05:30
35254ee834 pulseaudio: disconnect on destruction 2022-10-16 15:24:17 +08:00
9a0013cb10 Add option to wlr/workspaces to sort workspaces by number 2022-10-15 01:44:58 +02:00
cca5227210 Add config value for inhibitor default state. 2022-10-13 21:47:57 -04:00
cf9d98a0be remove <optional> dependency 2022-10-13 23:49:41 +02:00
015409acaf Allow hyprland/window to show active window on a per monitor basis 2022-10-13 23:41:56 +02:00
2b735f44bc modules: Set tooltip on button
Mouse-over tooltips set on the label only appear once the mouse hovers
over exactly the label. Other apps (e.g. firefox) show the tooltip once
the pointer hovers the button. Not solely its label. With this commit we
get the same behaviour.
2022-10-12 10:25:30 +02:00
8fa5d9b838 modules: Set style-context on button
Fixes issue where the class parameters in style.css would have no
effect.

The CSS now references the GtkButton instead of the GtkLabel. Removing
all style-classes from the custom module GtkButton however removes
any properties set via style.css. Thus, the default classes 'flat' and
'text-button' are added on every update of these modules.
2022-10-12 10:25:30 +02:00
0012bcbd74 resources: Set button hover effects globally
Since now modules as well as workspaces are buttons, the fix for
the 'strange hover effects' has to be applied on a global level.
In return there is a nice hover effect also on the modules.
2022-10-12 10:25:30 +02:00
b8322c4b4b button: Add AButton class
The AButton class is designed as full a substitute to ALabel. The
GtkButton attribute 'button_' is initialized with a label. This
label can the be referenced by the subsequent inheritors of AButton
instead of the GtkLabel attribute 'label_' of ALabel.
For convenience a GtkLabel* 'label_' attribute is added to AButton.

If the button cannot be clicked it is disabled, effectively acting
like its label predecessor.

GtkButton seems to catch one-click mouse events regardless of the
flags set on it. Therefore, 'signal_pressed' is connected to a
function creating a fake GdkEventButton* and calling 'handleToggle'
(for details on this possible bug in GTK see:
https://stackoverflow.com/questions/45334911 )

In accordance with other GtkButtons (i.e. the sway/workspace ones)
set_relief(Gtk::RELIEF_NONE) is called on the 'button_' instance.
2022-10-12 10:25:29 +02:00
07050cf354 Merge branch 'Alexays:master' into master 2022-10-04 15:37:36 +03:00
ddf3e11240 remove clang-format lines 2022-10-04 11:28:32 +02:00
1ca660460a apply clang-format 2022-10-04 08:03:54 +02:00
0898236586 remove useless include <sys/types.h> 2022-10-04 07:37:05 +02:00
c3e91cd228 [FreeBSD] Use thermal-zone
The zone was hardcoded in #1702.
This commit allows to use the "thermal-zone"
variable.

Follow up #1702
2022-10-04 07:29:16 +02:00
c500c7d9a1 Fixed pulseaudio max-volume configuration. Fixed issue where volume stepping would cause the max volume to go above the max and never reach 0. 2022-09-30 15:25:12 -06:00
5da45ece9d Merge pull request #1702 from lbartoletti/freebsd_temperature 2022-09-30 21:24:05 +02:00
024777a5bc FreeBSD: Add support to temperature
This commit aims to propose a FreeBSD to gain temperature support using
sysctl on hw.acpi.thermal.tz0.temperature.
2022-09-30 21:12:28 +02:00
9758833027 added user module 2022-09-30 14:33:23 +03:00
9a958f6848 Merge branch 'master' of https://github.com/Alexays/Waybar 2022-09-22 09:52:45 +02:00
9e03bb61c7 Escape text in custom module 2022-09-16 01:19:44 +03:00
710f89599e Merge pull request #1686 from Alexays/revert-1685-master 2022-09-15 15:47:20 +02:00
d1700bf202 Revert "added checking router id in handleEvent function, because module does…" 2022-09-15 15:47:14 +02:00
e1b31db42b Merge pull request #1685 from Dordovel/master 2022-09-15 13:10:54 +02:00
52e9f624be added checking router id in handleEvent function, because module doesn't update state 2022-09-15 14:03:32 +03:00
e75eafcb34 Merge branch 'master' of https://github.com/tomcharnock/Waybar 2022-09-09 07:19:12 +00:00
6558a156b3 Add man entry for the ignored-sinks option 2022-09-09 00:54:32 +01:00
faf8954712 Add config option to ignore Pulseaudio Sinks
Fixes #1347
2022-09-09 00:51:25 +01:00
e58f1fd3e0 Merge pull request #1412 from eigenbrot/battery_zero_pad_minutes
Add battery format-time option for zero-padded minutes
2022-09-07 16:54:28 +02:00
6b83360e76 Add "{m}" battery format-time option for zero-pad minutes 2022-09-07 08:53:07 -06:00
03ca8de6d7 Update config.cpp 2022-09-07 10:33:57 +02:00
ac193ae669 Merge pull request #1646 from LukashonakV/ISSUE#1545
Issue#1545. Calendar scrolling opportunity
2022-09-07 09:16:59 +02:00
38d2815425 Merge pull request #1678 from asas1asas200/zeng-feat-idle_inhibitor_tooltip
feat(idle-inhibitor): add tooltip format
2022-09-05 17:52:27 +02:00
79f21c0d7b Merge pull request #1600 from leophys/master
Add support for reading the config path from env
2022-09-05 10:56:01 +02:00
0306c97173 Merge branch 'master' of https://github.com/Alexays/Waybar 2022-09-05 09:54:04 +02:00
8a82cdff16 Merge pull request #1659 from TheRealLorenz/master
Add 'max-volume' option to pulseaudio
2022-09-05 09:13:01 +02:00
29bdff5314 Merge pull request #1657 from vaxerski/hyprlandLanguage
Added a basic hyprland/language module
2022-09-05 09:12:17 +02:00
eb017347b8 Add support for reading the config path from env
This commit adds support to reading the config base path from the
environment variable `WAYBAR_CONFIG_DIR`. If it is set, but no
configuration is found there, it falls back to the previous mechanism
of using the default paths, without erroring.
2022-09-05 08:21:36 +02:00
912d7f8588 Making calculations uint64_t 2022-09-03 18:08:26 +02:00
5647146ac0 Added Discharging clause and corrected typo 2022-09-03 17:52:11 +02:00
af2a3f8bda Added alternative calculations for time remaining 2022-09-03 16:06:13 +02:00
55e83f90d1 feat(idle-inhibitor): add tooltip format 2022-09-03 19:21:32 +08:00
0d94853613 Added alternative variable calculations 2022-09-02 15:37:23 +02:00
120c68e014 Updated logic in battery module 2022-09-02 11:42:46 +02:00
4deb6d812d Merge pull request #1653 from kennypm/dsp
add JACK module
2022-09-02 08:12:57 +02:00
bc201fd0eb doc(sway/scratchpad): add man page 2022-08-31 16:27:25 +08:00
d2ff116c92 feat(sway/scratchpad): add some configs
Add some configs for displaying.
Remove draft codes.
2022-08-31 16:27:25 +08:00
e3342467fc feat(sway/scratchpad): add basic counter 2022-08-31 16:27:25 +08:00
ce10ce0d5e Merge pull request #1672 from asas1asas200/zeng-style-lint 2022-08-31 10:06:43 +02:00
4a929240df style(lint): fix some files lint 2022-08-31 15:51:50 +08:00
33d13af6d1 Merge pull request #1670 from akliuxingyuan/master 2022-08-30 20:43:51 +02:00
90878a5c98 Merge pull request #1669 from asas1asas200/zeng-fix-network 2022-08-30 20:43:03 +02:00
0d27949f0a scale icons for HiDPI monitor 2022-08-30 23:13:38 +08:00
f6322d2dd1 fix(network): dont escape essid in tooltip
Like #1256 , but escape by calling `set_tooltip_markup()`, because the
label text uses `set_markup()`.
2022-08-30 23:05:34 +08:00
330d166c82 Merge pull request #1668 from alex-courtis/1591-river-escape-window-and-mode 2022-08-29 08:26:40 +02:00
5f2dd99e6d #1591 river escape window and mode 2022-08-29 16:22:08 +10:00
8b03e38594 fix(keyboard): correct device-path config behavior 2022-08-24 14:08:34 +08:00
5944989a8a doc(keyboard): add deprecated warning 2022-08-24 02:41:12 +08:00
58a399b9af chore(ci, meson): add inotify dependency for BSD 2022-08-24 02:22:40 +08:00
dcd75b3b40 feat(keybaord): enable hotplug support
Use inotify listening devices path changes to implement hotplug support.
The new hotplug thread is also an event loop, so the interval value has
no effect.
The evdev is now open on demand.

Fix libinput_interface object life-time.
2022-08-23 23:30:16 +08:00
17f91391b6 Merge branch 'Alexays:master' into ISSUE#1545 2022-08-23 09:00:08 +00:00
061f4550f4 feat(keyboard): improve keyboard response time
Use libinput event for keyboard state updates.
The state will update when CAPS_LOCK, NUM_LOCK or SCROLL_LOCK has been
released,
`interval` will have no effect after this change.
2022-08-22 22:49:59 +08:00
fd24d7bcf6 Merge pull request #1660 from asas1asas200/master 2022-08-21 08:09:35 +02:00
51670f0506 Fix typo 2022-08-21 12:35:33 +08:00
4e930ba50a Add 'max-volume' option to pulseaudio. Fixes #1607 2022-08-20 22:21:57 +02:00
8839a86afe Merge branch 'Alexays:master' into ISSUE#1545 2022-08-19 13:52:52 +00:00
f4bfe777d9 oops 2022-08-18 20:56:26 -04:00
59e57ab9a0 man page and adjust default format 2022-08-18 17:05:04 -04:00
f00f30a5ae Merge pull request #5 from NotAShelf/hyprlandLanguage
Add man docs for Hyprland language module
2022-08-18 19:23:06 +02:00
40bc2e96db wording 2022-08-18 20:21:14 +03:00
9ac9dc368e Merge branch 'hyprlandLanguage' of https://github.com/vaxerski/Waybar into hyprlandLanguage 2022-08-18 20:16:42 +03:00
39c170bf10 remove one comment that I forgot to 2022-08-18 19:13:24 +02:00
5fea01300c Merge branch 'hyprlandLanguage' of github.com:NotAShelf/Waybar into hyprlandLanguage 2022-08-18 20:12:44 +03:00
b181cd04b6 update man docs for format-<lang> option 2022-08-18 20:11:44 +03:00
d786f9a0e6 Merge branch 'vaxerski:hyprlandLanguage' into hyprlandLanguage 2022-08-18 20:10:31 +03:00
c5910ae19a Merge branch 'hyprlandLanguage' of https://github.com/vaxerski/Waybar into hyprlandLanguage 2022-08-18 20:09:34 +03:00
ed6467e785 fix linter 2022-08-18 19:02:46 +02:00
43c3ca1d38 added the thing i was talking about 2022-08-18 18:59:34 +02:00
97f0d6fa42 remove redundant formatting 2022-08-18 19:35:40 +03:00
b8a68b8085 man documentation for hl language module 2022-08-18 19:32:26 +03:00
8881b9a6ef fix linter the most 2022-08-18 18:06:34 +02:00
e8942feefc fix linter more 2022-08-18 18:05:40 +02:00
a23d58e900 fix linter 2022-08-18 18:04:39 +02:00
16d5619f3b added a basic hyprland/language module 2022-08-18 18:00:27 +02:00
bcee4e15d3 fix: lint files 2022-08-18 15:22:25 +02:00
b7bd06ad8f Update window.cpp 2022-08-18 15:21:50 +02:00
e50c246601 Merge pull request #1651 from TheRealLorenz/master
Feature: sway/window can show 'shell' parameter
2022-08-18 15:21:09 +02:00
ee504b826d Update README.md 2022-08-18 15:16:28 +02:00
848ae1f818 Merge pull request #1656 from vaxerski/hyprland
Added a Hyprland backend and a Window module
2022-08-18 15:15:45 +02:00
406eb0ee9a Merge pull request #4 from NotAShelf/hyprland
Init man documentation
2022-08-18 15:10:42 +02:00
112d481ae7 Init man documentation 2022-08-18 15:59:00 +03:00
872cd6083d Merge pull request #3 from vaxerski/revert-2-master
Revert "init man documentation"
2022-08-18 14:54:30 +02:00
8dc78e4e40 Revert "init man documentation" 2022-08-18 14:54:20 +02:00
e662b8c624 Merge pull request #2 from NotAShelf/master
init man documentation
2022-08-18 14:53:15 +02:00
e0451816e2 init man documentation 2022-08-18 15:29:59 +03:00
e2e59a52df make the linter happy 2022-08-17 22:03:49 +02:00
123ed36739 remove workspaces module as its buggy and unnecessary 2022-08-17 21:58:33 +02:00
c64058c947 stabilize window module 2022-08-17 21:54:23 +02:00
56d46e62c1 add samplerate callback since pipewire supports dynamic samplerate changes 2022-08-12 11:30:12 -04:00
89a57f6722 simplify build option description 2022-08-11 18:35:33 -04:00
4336f10b29 Merge branch 'dsp' of https://github.com/kennypm/Waybar into dsp 2022-08-11 17:26:45 -04:00
a7979a3e56 add locks and refactor for clarity 2022-08-11 17:26:27 -04:00
bfed2114e4 jack_client_close working properly now 2022-08-11 15:49:24 -04:00
f65a372855 Merge branch 'Alexays:master' into dsp 2022-08-11 07:46:20 +00:00
6f3fe6d339 Update waybar-sway-window.5.scd 2022-08-11 08:41:10 +02:00
c287b0c82b Update manpage for sway/window 2022-08-10 22:24:48 +02:00
5b1cd65e20 Fix: better formatting 2022-08-10 10:41:18 +02:00
99ed2bb7fa Feature: sway/window can show 'shell' parameter 2022-08-10 10:34:51 +02:00
ddd5b4e157 refactor 2022-08-07 15:29:42 -04:00
e9e5780aae Calendar scrolling opportunity 2022-08-06 13:55:20 +03:00
061ad13082 Bug: tripple click uses wrong event type 2022-08-06 13:52:00 +03:00
77bea7c182 Merge pull request #1631 from m-braunschweig/filename
mpd: add filename formatter
2022-08-04 10:05:14 +02:00
c2ab2e6d19 Merge pull request #1627 from datMaffin/master
sni: Use the pixmap if for the given icon name an icon could not be found
2022-08-04 10:04:48 +02:00
11239a4900 mpd: add filename formatter 2022-08-03 20:52:18 +02:00
95b5348c24 sni: change missing icon in theme logging from info to trace 2022-08-03 17:34:34 +02:00
9616df58da Merge branch 'Alexays:master' into dsp 2022-08-01 03:30:45 +00:00
7b115913de Merge pull request #1638 from ErikReider/master 2022-07-31 21:27:05 +02:00
4029c5423f Added UPower to README 2022-07-31 10:56:42 +02:00
3996764880 Merge pull request #1637 from jbeich/ci 2022-07-30 09:09:26 +02:00
60821257ac chore(ci): adjust FreeBSD to follow upstream recommendations
- use macos-12 as macos-10.15 will be removed on 2022-08-30
- use major version to transparently pick up updates
2022-07-29 20:05:24 +00:00
e14005a6aa Fix binary pow formatting for values between 1000 and 1024 2022-07-21 16:37:43 -04:00
15dbe8965e fix Linter error 2022-07-19 22:36:59 -04:00
decc5bcd68 namespace cleanup 2022-07-19 22:34:35 -04:00
92870cab2a namespace cleanup 2022-07-19 22:30:42 -04:00
4cb2cc9f21 fix Linter errors 2022-07-19 21:54:36 -04:00
02df861829 fix Linter errors 2022-07-19 21:53:32 -04:00
23eaffc04b fix Linter errors 2022-07-19 21:49:56 -04:00
714451e4f9 cleanup 2022-07-19 19:40:23 -04:00
4cd6024f07 move issue from comment to Issues 2022-07-19 19:36:48 -04:00
8b5f42d934 remove unnecessary libprocps dependency 2022-07-19 19:27:39 -04:00
b65c976bc1 fix build type 2022-07-19 01:41:32 -04:00
5e7c9378df update fork 2022-07-19 01:40:05 -04:00
a9569e7d5c Merge branch 'dsp' of https://github.com/kennypm/Waybar into dsp 2022-07-19 01:39:19 -04:00
318a6e0969 fix segfault when stopping JACK2 server 2022-07-19 01:38:56 -04:00
a1d046b2e7 Update README.md 2022-07-19 01:38:56 -04:00
c7b09eea11 changed callbacks to use static_cast 2022-07-19 01:38:56 -04:00
bc8517fd08 fix callbacks 2022-07-19 01:38:56 -04:00
9439e4183c fix callbacks 2022-07-19 01:38:56 -04:00
8fc8bb40bf Initial commit for Waybar JACK monitoring module
-DSP load
  -xruns
  -connected/disconnected state
  -only tested with Pipewire so far but should work with JACK2 as well

 On branch dsp
 Changes to be committed:
	modified:   include/factory.hpp
	new file:   include/modules/jack.hpp
	modified:   meson.build
	modified:   meson_options.txt
	modified:   src/factory.cpp
	new file:   src/modules/jack.cpp
2022-07-19 01:38:35 -04:00
d906080f26 Merge pull request #1617 from alebastr/fmt-9
fix: adapt to fmt 9.0.0 breaking changes
2022-07-18 10:00:46 +02:00
04d66de866 sni: remove unnecesary parameter 2022-07-17 22:20:24 +02:00
699f732146 sni: Remove unnecessary getIconByName call 2022-07-17 22:15:14 +02:00
f437bf96e3 sni: Prefer system icons over pixmap 2022-07-17 22:15:12 +02:00
fc9a390977 sni: Use the given pixmap even if there is a name given 2022-07-17 22:14:57 +02:00
56a45e962b Merge pull request #1628 from carlosV2/master 2022-07-17 18:15:23 +02:00
48d2759df5 add layout as class to language module 2022-07-17 16:13:32 +01:00
1116ff0d67 Merge pull request #1624 from ersen0/fix-man
battery: fix wrong definition for "format"
2022-07-15 10:44:09 +02:00
0c04aea108 battery: fix wrong definition for "format" 2022-07-15 11:01:14 +03:00
a44622aa9f fix: fmt 9.x deprecation warning for implicit enum conversions 2022-07-13 22:36:37 -07:00
3117aefdf3 fix: drop conditionals for ancient fmt versions 2022-07-13 22:36:33 -07:00
24a8332b62 fix: adapt to fmt 9.0.0 breaking changes 2022-07-13 22:36:32 -07:00
84e7689521 Merge pull request #1621 from jbeich/ci 2022-07-14 07:33:06 +02:00
0708573fa4 chore(ci): upgrade FreeBSD to 13.1
FreeBSD doesn't support /latest and /quarterly package repos on EOL
versions. 13.0 reaches EOL on 2022-08-31, so avoid CI breakage.
2022-07-13 21:26:45 +00:00
08d472d1b1 Merge pull request #1612 from LukashonakV/Gentoo_CI
New Gentoo CI
2022-07-12 16:24:10 +02:00
c35f91ed7a Update linux.yml
New Gentoo CI container
2022-07-06 09:50:21 +00:00
9c3af1b6ad Gentoo docker file 2022-07-06 09:47:24 +00:00
17b60bc737 minor changes 2022-07-01 15:35:25 +02:00
c1f92d2a3c added workspaces 2022-07-01 15:16:54 +02:00
72f478c195 added backend and hyprland/window 2022-07-01 12:46:28 +02:00
5128a5d9f3 Merge pull request #1599 from LukashonakV/ISSUE#1565
Last weekday applies Unix fmt
2022-06-27 10:18:12 +02:00
36aa22189b Last weekday applies Unix fmt 2022-06-24 16:44:06 +03:00
d10d9b8202 Merge pull request #1590 from qubidt/pulseaudio-fix
pulseaudio: avoid retaining outdated form factor
2022-06-15 09:15:50 +02:00
e57899c0c5 pulseaudio: avoid retaining outdated form factor
when the module fails to get the pulseaudio device form factor, the
module persists the existing value, resulting in the incorrect
format-icon being used to format the label on device changes.

reset the form factor value so that the icon lookup properly falls back
to "default" when missing
2022-06-14 13:57:03 -05:00
249c0aad73 fix: lint 2022-06-14 09:17:40 +02:00
18a4f87a59 Merge pull request #1588 from qubidt/custom-module-class
Retain instance name css class for custom modules
2022-06-14 09:15:42 +02:00
458c03bf95 retain instance name css class for custom modules
When adding a custom module with a name, e.g.:

```jsonc
{
  ...,
  "custom/foo#bar": { },
  ...
}
```

The custom module does not retain the `bar` class as it should, because
all the classes are replaced with the runtime output:

1b4a7b02f4/src/modules/custom.cpp (L141-L147)

Avoid removing the module instance name class so css class behavior is
consistent between all modules.
2022-06-13 16:10:41 -05:00
1b4a7b02f4 Merge pull request #1575 from cosandr/bandwidth-update
Add total bandwidth formatting options
2022-06-11 11:45:18 +02:00
fb2ac8a765 Merge pull request #1580 from tiosgz/river-mode-readme
README.md: add river/mode to feature list
2022-06-02 16:48:46 +02:00
13100326b0 README.md: add river/mode to feature list 2022-06-02 14:36:18 +00:00
ca0d35286d Merge pull request #1579 from tiosgz/river-mode
river/mode: new module
2022-06-02 14:22:21 +02:00
f3a049c6df river/mode: new module
This module shows river's current mapping mode (e.g. normal, locked).
2022-06-01 15:35:08 +00:00
074b7c4b99 Merge pull request #1578 from NickHastings/readme-river
Advertise river modules
2022-06-01 10:18:03 +02:00
b24fd35add Advertise river modules 2022-06-01 09:10:26 +09:00
c27dab9379 Merge pull request #1576 from daangoossens22/fix_bluetooth 2022-05-28 15:28:20 +02:00
6857691679 style(bluetooth): apply project style 2022-05-28 12:58:37 +02:00
a475be7cf7 feat(bluetooth): add format-icons 2022-05-28 12:35:33 +02:00
00c11c64ca fix(bluetooth): tooltip-format-connected-battery 2022-05-28 12:33:47 +02:00
4e2305639b Add option for displaying total bandwidth 2022-05-28 10:54:10 +02:00
e0f29dbf71 Add bandwidth in bytes to 5 waybar-network 2022-05-28 10:39:43 +02:00
36d3d511d6 Merge pull request #1571 from daangoossens22/position_bar
fix: vertical bar not anchored when width is set
2022-05-25 16:42:20 +02:00
ae9fb57790 fix: vertical bar not anchored when width is set 2022-05-25 16:09:21 +02:00
b8ee448e71 Merge pull request #1567 from jbeich/freebsd 2022-05-23 20:47:45 +02:00
632058a4f6 chore(ci): test upower module on freebsd 2022-05-23 16:33:48 +00:00
d25278f710 fix(upower): add missing include for libc++
In file included from src/modules/upower/upower.cpp:1:
include/modules/upower/upower.hpp:25:16: error: no template named 'unordered_map' in namespace 'std'
  typedef std::unordered_map<std::string, UpDevice *> Devices;
          ~~~~~^
In file included from src/modules/upower/upower_tooltip.cpp:1:
include/modules/upower/upower_tooltip.hpp:13:16: error: no template named 'unordered_map' in namespace 'std'
  typedef std::unordered_map<std::string, UpDevice*> Devices;
          ~~~~~^
2022-05-23 16:27:32 +00:00
2dfd64e1c9 Merge pull request #1566 from ErikReider/master
Added gamemode man file to meson
2022-05-23 14:43:58 +02:00
3c182c9ca9 Added gamemode man file to meson 2022-05-23 14:13:30 +02:00
aa5f55bbe3 chore: v0.9.13 2022-05-23 13:54:24 +02:00
7ab9a560ae fix: lint 2022-05-23 13:47:14 +02:00
a5299af3c2 Merge pull request #1562 from trevnels/river-window
River Window Module
2022-05-23 13:43:28 +02:00
4d1aeb7eb8 Merge pull request #1525 from FlexW/feature/icon-heuristics
sway/window: Add heuristics for finding icons
2022-05-23 13:42:26 +02:00
38a846ae51 Merge pull request #1555 from LukashonakV/ISSUE#1552
Calendar module: localization issue #1552
2022-05-23 13:40:48 +02:00
03bbc9df64 Merge pull request #1554 from ErikReider/gamemode-module
Gamemode Module
2022-05-23 13:40:09 +02:00
1e4fe0bee8 Merge pull request #1557 from LukashonakV/ISSUE#1556
Issue#1556. Battery module: a lot of warnings when battery dissapears
2022-05-23 13:39:23 +02:00
5e2067d51f Merge pull request #1563 from groknull/crash-on-empty-cpuvec
Prevent segfault in getCpuFrequency
2022-05-23 13:38:53 +02:00
7ea0a2348b Man page example now uses default values 2022-05-21 12:08:05 +02:00
fd306e184a Added man page 2022-05-21 12:06:45 +02:00
f4f2989e85 Added tooltip-format 2022-05-21 12:02:45 +02:00
8d4c7176f8 Renamed not-running-bide to hide-not-running 2022-05-21 12:02:35 +02:00
7abcbe80e5 Prevent segfault in getCpuFrequency
When parseCpuFrequencies returns an empty vector, getCpuFrequency
would attempt to dereference an invalid iterator.

Return early from getCpuFrequency when parseCpuFrequencies returns an
empty vector.

Resolves a segfault when waybar is run within a VM on apple silicon.
2022-05-19 20:01:57 -04:00
165c5a861d manpage fixes 2022-05-19 16:41:05 -04:00
d84c0f13e6 forgot to commit meson build 2022-05-19 16:33:50 -04:00
01ffe2c290 add inherited ALabel options to river window manpage 2022-05-19 15:53:25 -04:00
b900c01381 add manpage and make format option work 2022-05-19 15:32:10 -04:00
e2b676b800 add river/window module 2022-05-19 15:20:04 -04:00
7f995507fe std::filesystem::path is a string representation 2022-05-14 17:10:44 +03:00
b39a8ede6c Issue#1556. Battery module: wrong string comparison
1. battery.hpp - added local bool variable. Force to print warnings the
only once in order to warn user about wrong battery configuraion. And
does not bring a mess when the battery is turned off (gamepads, etc.)
2. dir_name is an object which takes a part in comparison. So converted to the string.
2022-05-14 16:56:46 +03:00
315ea991bc Calendar module: localization issue #1552 Linter #60 2022-05-13 23:56:08 +03:00
bd0f6128d3 Revert "Waybar. Issue#1552. Calendar module, LC_TIME variable"
This reverts commit 7b7ee41e13.
2022-05-13 22:58:38 +03:00
5a014305ec Revert "Issue#1552. Calendar module, LC_TIME variable"
This reverts commit 448b413eca.
2022-05-13 22:58:00 +03:00
3411236697 Initial implementation 2022-05-13 21:30:45 +02:00
e615612bf4 Calendar module: localization issue #1552 2022-05-13 18:51:32 +03:00
448b413eca Issue#1552. Calendar module, LC_TIME variable 2022-05-13 12:54:18 +03:00
7b7ee41e13 Waybar. Issue#1552. Calendar module, LC_TIME variable 2022-05-12 19:04:45 +03:00
9bc821bdac Merge pull request #1551 from loserMcloser/keyboard-state-css-classes
Add classes to individual keyboard state labels
2022-05-12 13:55:32 +02:00
bfcb936d87 Add classes to individual keyboard state labels 2022-05-11 08:08:28 -06:00
3d023a0421 Merge pull request #1540 from daangoossens22/bluetooth
feat: extend bluetooth module
2022-05-11 09:26:38 +02:00
e235f48245 feat: hide module if empty 2022-05-07 13:42:27 +02:00
3043d42a89 style: apply projects clang-format 2022-05-06 17:01:43 +02:00
733fb8c62a docs: update + add experimental section 2022-05-06 16:43:53 +02:00
954bed3f5e refactor: adapter renamed to controller
Since it is also called controller in bluetoothctl
2022-05-06 16:37:48 +02:00
13df878bc3 refactor: logic for enumerating devices in tooltip 2022-05-06 16:37:40 +02:00
4592dd4a6c Merge pull request #1527 from siikamiika/network-current-iface-bandwidth
network: calculate bandwidth for current interface
2022-05-05 09:44:44 +02:00
794610a1ca feat: display all connected devices in tooltip 2022-05-04 19:27:39 +02:00
7bbf7c99a3 fix: lint 2022-05-04 17:29:08 +02:00
eec0a8255f Merge pull request #1454 from Psykar/idle_inhibitor_timeout
Add a config to set a timeout for the idle_inhibitor module
2022-05-04 17:27:21 +02:00
638b4e6573 feat: extend bluetooth module 2022-05-02 18:11:21 +02:00
caee2e611f Merge pull request #1530 from qubidt/backlight-fix
Backlight: avoid crash on getting brightness fails
2022-04-22 09:17:54 +02:00
96746142d2 Backlight: don't reset value when failing to read
Avoids the brightness percentage resetting to 0 on intermittent failures
2022-04-21 22:19:05 -05:00
1af7191740 Backlight: avoid crash on getting brightness fails
Reading brightness value for backlight device can fail intermittently
(particularly when using ddcci-driver-linux). Handle this more
gracefully rather than crashing
2022-04-21 22:02:45 -05:00
89be55b00b Merge pull request #1510 from towoe/sway-bar-show
Show hidden bar
2022-04-20 05:13:53 +02:00
23369aa14c Merge pull request #1500 from RobertMueller2/clock-thread-sleep
Replace sleep_until with sleep_for to prevent clock from getting stuck with system time adjustment
2022-04-20 05:11:49 +02:00
a16e54573e Merge pull request #1524 from berbiche/fix/gtk-layer-shell-anchors
bar: don't set layer-shell anchor for edges when width is not 'auto'
2022-04-20 05:09:36 +02:00
7231c47244 network: calculate bandwidth for current interface 2022-04-18 13:56:30 +03:00
6184e43c84 Merge pull request #1523 from FlexW/feature/icon-size
sway/window: Allow the user to change the size of the app icon
2022-04-18 08:59:36 +02:00
3f123d9c4e sway/window: Add heuristics for finding icons
This adds heuristics for finding the applications icon.
2022-04-18 03:09:25 +02:00
6851e26450 bar: don't set layer-shell anchor for edges
Don't set the anchor for certain edges when the width or the height
is not set to a value of 'auto' (1).

When the bar is vertical, the top and bottom edges are not anchored
otherwise the left and right edges are not anchored.

This resolves an issue wherein the width and height set for the
layer-shell were ignored because the layer was set to anchor to all
edges.
2022-04-17 18:19:36 -04:00
fc6f5741b1 sway/window: Allow the user to change the size of the app icon
Fixes #1461
2022-04-17 23:57:57 +02:00
264e2c3983 Merge pull request #1522 from FlexW/bugfix/app-icon 2022-04-17 23:32:59 +02:00
45988b3dbb Sway/window: Only update icon from main thread
If Gtk objects get updated from other threads than the main thread GTK
can get confused. This is a regression of bcadf64031.

Fixes #1464, #1474
2022-04-17 22:55:58 +02:00
4e3f91d237 Issue 1226/1497: align updates with times divisible by interval 2022-04-16 14:21:28 +02:00
e5d05baba3 Issue 1226/1497: Replace sleep_until with sleep_for to prevent clock from getting stuck with system time adjustment 2022-04-16 14:21:28 +02:00
7763d50691 Add reset behaviour of modifier key
Add an option to change the behaviour of the modifier key to reset the
visibility.
2022-04-15 20:04:58 +02:00
5a0e42cc76 Limit visibility updates
Prevent visibility updates to occur for inactive modules.
Check active modules and subscribe to only those events.
2022-04-15 20:04:56 +02:00
1dcd36b06c Show bar on sway mode
Display the bar if the sway mode is not the default mode.
2022-04-15 19:58:50 +02:00
93f9b3d213 Clear urgency hint with modifier press
If the modifier is pressed and release without another event, the
intended behaviour is to clear an urgency hint and hide the bar again.

Note that if multiple workspaces have the urgency hint set, the bar is
hidden again and an urgent workspace is focused, the bar does not stay
hidden anymore.
2022-04-15 19:55:06 +02:00
54b1df69a9 fix: lint clock 2022-04-15 14:39:13 +02:00
73cd156a7a Merge pull request #1492 from LukashonakV/master
#1315. Add option to display week number on calendar
2022-04-15 14:37:46 +02:00
e3700b924e Show bar if a workspace becomes urgent
Add a second reason to show the bar besides visible by modifier.
Update the visibility based on changes in the workspace urgency.
Check all workspaces for urgency and keep the bar visible if at least
one has an urgency hint.
2022-04-14 19:08:11 +02:00
d87cf8a8f2 Merge pull request #1518 from towoe/bluetooth-format
Add disabled bluetooth style
2022-04-12 10:35:54 +02:00
e8b022c096 Add disabled bluetooth style
Allow to set a different style if the bluetooth adapter is disabled.
2022-04-12 10:31:20 +02:00
503fe9a7ea Merge pull request #1516 from alebastr/ipc-enum-type
refactor: change `enum ipc_command_type` to uint32_t
2022-04-11 08:49:43 +02:00
b812596080 Update lint.yml 2022-04-11 08:49:20 +02:00
13fdbc13c3 refactor: change enum ipc_command_type to uint32_t
As we always use the enum to compare or initialize uint32_t values, it
would be better to declare it with the right type. This way we could
avoid `-Wnarrowing` warnings or unnecessary type casts.
2022-04-10 12:52:46 -07:00
1071b9f7c5 Add a config to set a timeout for the idle_inhibitor module 2022-04-10 22:47:52 +09:30
6ad1f6b853 Merge branch 'master' into master 2022-04-10 09:54:50 +00:00
a1129c4c87 fix: bsd 2022-04-06 14:55:08 +02:00
2e12ea6a81 fix: add missing include 2022-04-06 08:43:31 +02:00
f2fcadbf62 refactor: lint 2022-04-06 08:37:19 +02:00
168ba2ca5b Create lint.yml 2022-04-06 08:27:52 +02:00
46f07d24dd Merge branch 'master' into master 2022-04-05 15:28:55 +00:00
ed3e2ffdc3 Merge pull request #1499 from LukashonakV/ISSUE#1068
Waybar. Issue#1068. Double/Triple events
2022-04-05 16:40:52 +02:00
d5b76bd8b5 Merge pull request #1495 from 0cc4m/master
Battery module support for rk817
2022-04-05 16:39:08 +02:00
1d03034fbb Merge pull request #1493 from ErikReider/upower-fixes
Upower fixes
2022-04-05 16:37:36 +02:00
e094480684 Very basic hypr window title module 2022-04-02 21:08:43 +02:00
f4cc088d2f Waybar. Issue#1068. Double/Triple events. Removed unnecessary including 2022-03-29 13:47:38 +03:00
b086e2f995 Waybar. Issue#1068. Double/Triple events 2022-03-29 12:26:05 +03:00
4a457648f9 Waybar. Clock module. Calendar - custom output formats 2022-03-27 11:15:56 +03:00
3a95f8f599 Add battery module fallback for batteries without capacity or with _avg instead of _cur files 2022-03-26 19:42:06 +01:00
a7ed1ed570 Don't call dp.emit() when UPower service active status changes 2022-03-25 17:35:37 +01:00
e0f0931e2d Hide module if UPower service isn't running 2022-03-25 17:27:36 +01:00
0140606226 Fixed segfault on upower service restart 2022-03-25 16:57:25 +01:00
1d2a381b5f Waybar. Clock module - weeknum fix for the left side 2022-03-25 18:51:59 +03:00
d1d73b5003 Added missing "fulL" and "empty" CSS classes 2022-03-25 14:57:04 +01:00
9dc09d2702 Added upower man page into man_files meson variable 2022-03-25 14:53:46 +01:00
2ca4dcac49 Set box widget name to "upower" 2022-03-25 14:52:12 +01:00
2d87bcb1ab https://github.com/Alexays/Waybar/issues/1315. Option to display week number on calendar 2022-03-24 15:41:50 +03:00
d4a07483b2 Merge pull request #1484 from ErikReider/upower-module
Upower module
2022-03-22 10:00:28 +01:00
84dc82e1c1 Added tooltip-padding 2022-03-21 13:50:46 +01:00
e06316c80b Only set label text if string doesn't only contain spaces 2022-03-20 00:36:53 +01:00
7b071567ea Removed goto in update method 2022-03-20 00:36:13 +01:00
2633ff3fb9 Fixed time_left string not being set properly 2022-03-19 23:10:15 +01:00
0764e9ad6e Added format and format-alt config properties 2022-03-19 21:15:48 +01:00
c4282cfacc Made tooltip getDeviceIcon return const string 2022-03-19 19:22:21 +01:00
05effad18b Added CSS status classes 2022-03-19 19:22:00 +01:00
5f19a54deb Added man page 2022-03-19 17:25:43 +01:00
7fac2afb85 Added custom tooltip with device icon, device name and battery status 2022-03-19 17:09:55 +01:00
4196e0d5d1 Unref all devices on destruct 2022-03-19 11:35:13 +01:00
14a2a7027f Moved upower into its own directory 2022-03-19 11:34:34 +01:00
2b2ac311d5 Fixed not visible when only battery is plugged in 2022-03-19 11:19:39 +01:00
d7a030daf3 Lowered default icon size to 20 2022-03-19 11:19:08 +01:00
7345918f84 Added mutex locking to resetDevices 2022-03-19 11:18:51 +01:00
105f1cefe1 Fixed device unrefed 2022-03-19 10:52:05 +01:00
175d82858b Merge branch 'upower-module' of github.com:ErikReider/Waybar into upower-module 2022-03-19 10:48:43 +01:00
c8d785071f Merge branch 'master' into upower-module 2022-03-19 10:48:02 +01:00
8c6063d181 Merge pull request #1485 from LukashonakV/master
Hide/Unhide temperature module when "format*" is empty.
2022-03-19 10:24:59 +01:00
799125fb73 Merge pull request #1489 from momokrono/master
feat: added network speed in Bytes
2022-03-19 10:24:26 +01:00
fcf93a6c45 feat: added network speed in Bytes 2022-03-18 10:35:19 +01:00
6946288053 PR #1485 review 2022-03-17 11:31:06 +03:00
2a563f54e7 Change name to upower 2022-03-16 15:33:39 +01:00
9f337db2d2 Hide/Unhide module when "format*" is empty. 2022-03-16 15:50:00 +03:00
136b47ce0d Fixed percentage not getting rounded 2022-03-15 23:03:13 +01:00
6eb187a23e Moved upower.*pp out of the upower directories 2022-03-15 23:00:09 +01:00
9b9e42fc5f use device variable instead of getting the device from the map 2022-03-15 22:50:11 +01:00
d47073ef13 Reload all devices after wake from suspend 2022-03-15 22:49:40 +01:00
5396ffb71f Added "icon-size" and "hide-if-empty" config options 2022-03-15 20:22:32 +01:00
5e9faeb2d0 Now shows the percentage and the correct icon 2022-03-15 20:22:04 +01:00
4ee81c8dea Added all callbacks 2022-03-15 17:54:06 +01:00
a37ef74fb1 Merge pull request #1479 from dorgnarg/master
Use user-defined mode when toggling visibility rather than resetting to default
2022-03-15 09:06:08 +01:00
07034d561c Merge pull request #1481 from LukashonakV/master
Battery module. Gamepads support
2022-03-14 17:42:26 +01:00
37d87be3c1 Add supporting of the gamepads batteries 2022-03-14 17:53:19 +03:00
8aee7492d4 Plug/Unplug batteries on hot(useful for gamepads) 2022-03-14 17:12:05 +03:00
5c1c07a035 Merge pull request #1480 from avdv/xkb-load-exotic-rules
sway/language: Load exotic xkb rules too
2022-03-13 22:32:00 +01:00
caa24f0647 sway/language: Load exotic xkb rules too 2022-03-13 09:40:32 +01:00
f4c6dfcddc Uses user-defined mode when toggling visibility rather than resetting to default mode 2022-03-12 13:32:08 -07:00
2b3fc3acff Merge pull request #1478 from Artturin/moonemoji 2022-03-12 16:03:50 +01:00
25536f70a4 use moon phases for backlight format-icons 2022-03-12 16:05:06 +02:00
74ca1a42c6 Merge pull request #1476 from Psykar/fix-bsd-action
Fix freebsd action
2022-03-10 15:00:32 +01:00
8b6bc215cc Fix freebsd action 2022-03-10 14:48:40 +01:00
3c1ba0a240 chore: v0.9.12 2022-03-10 09:53:25 +01:00
6c7acf18b5 Update network.cpp 2022-03-10 09:53:02 +01:00
ead1b2f0dc Merge pull request #1467 from Pound-Hash/docs
Edited README
2022-03-10 09:51:12 +01:00
115c6e36e6 chore: v0.9.11 2022-03-10 09:50:04 +01:00
210f4454f0 Update waybar-sway-window.5.scd 2022-03-10 09:49:14 +01:00
77d8376fef refactor: disable icon by default 2022-03-10 09:48:50 +01:00
0e580236ce Fixed English mechanics: grammar, punctuation, and styling. 2022-03-08 15:52:20 -08:00
1aa7587cac Merge pull request #1333 from dartkron/list_of_times
Feature Clock: show list of time in other timezones in a tooltip
2022-03-08 10:00:04 +01:00
b6655e475b Merge branch 'master' into list_of_times 2022-03-08 09:59:22 +01:00
903fc2b6a2 Merge pull request #1459 from grmat/master
man: document icon in sway/window module
2022-03-07 15:17:35 +01:00
50fc63b749 man: document icon in sway/window module
Default changed in bcadf64031 and it
wasn't documented.
2022-03-07 14:56:37 +01:00
383d999fec chore: v0.9.10 2022-03-06 14:54:48 +01:00
56ebb09e5f Merge pull request #1440 from TheDaemoness/patch-1
Add 1 to songPosition in the MPD module
2022-03-06 14:51:20 +01:00
35d6da3965 Merge pull request #1292 from FlexW/feature/sway-app-icon
Show application icon when using sway window module
2022-03-06 14:50:41 +01:00
be1d2a02ca Merge pull request #1422 from technic/fixes
minor string utils methods refactoring
2022-03-06 14:50:02 +01:00
5e7ba0c9e3 Merge pull request #1445 from GrantMoyer/keyboard_state_errors
Improve keyboard_state error messages
2022-03-06 14:49:38 +01:00
18717d4b12 Merge remote-tracking branch 'upstream/master' into keyboard_state_errors 2022-03-04 12:14:23 -05:00
4dc1989744 Merge pull request #1451 from euclio/use-after-free 2022-03-04 06:10:25 +01:00
54085dbde0 avoid use-after-free in lambda 2022-03-03 19:40:43 -05:00
4635e8c5f8 Merge pull request #1450 from Xiretza/style-css-use-fontawesome 2022-03-03 18:38:05 +01:00
adc67b6f75 style.css: add fontawesome to beginning of font list
If there is some other font installed that 1) matches the four existing
font families and 2) provides its own glyph in the private use area used
by Awesome, then that font's glyph will be used instead of the intended
icon.

For example, the following character (U+F001, "music"): 
...looks like a pair of musical notes in fontawesome, but DejaVu Sans
also provides a glyph, which looks like a couple of squares. DejaVu Sans
matches first when "sans-serif" is requested, so its (unrelated) glyph
is used.
2022-03-03 18:18:21 +01:00
ebe4424795 Fix remaining posix compatability issues in keyboard_state 2022-02-25 13:28:47 -05:00
e3f56b8110 Don't use gnu extensions which are too new for debian and ubuntu 2022-02-25 13:13:43 -05:00
8f3fbebede Make error messages portable 2022-02-25 12:56:22 -05:00
a595b61e0f Improve keyboard_state error messages 2022-02-25 12:27:08 -05:00
ccce2b700b fix segfault when stopping JACK2 server 2022-02-24 02:46:45 -05:00
91339f6ad4 Merge pull request #1444 from bd-g/feat/cpu-load-fix
CPU Load Formatting Fix
2022-02-23 09:12:53 +01:00
3c18c43b9a limit cpu load figure to 2 points 2022-02-22 16:33:33 -07:00
ac20428fdf Add 1 to songPosition in the MPD module 2022-02-18 17:41:33 -08:00
65c3f0a132 Merge branch 'dsp' of https://github.com/kennypm/Waybar into dsp 2022-02-18 02:14:51 -05:00
e6262b870c changed callbacks to use static_cast 2022-02-18 02:13:43 -05:00
ad5ea7ad2b Merge pull request #1436 from jbeich/ci 2022-02-13 18:13:42 +01:00
851508df5e ci: explicitly install wayland-protocols on FreeBSD
meson.build:86:0: ERROR: Dependency "wayland-protocols" not found, tried pkgconfig
2022-02-13 11:14:35 +00:00
fc818dd794 ci: update freebsd-vm to 0.1.6 2022-02-13 11:12:52 +00:00
823ed887ab Update README.md 2022-02-12 05:53:32 -05:00
3bf815f6de fix callbacks 2022-02-12 01:52:51 -05:00
c1cda1553a fix callbacks 2022-02-12 01:51:11 -05:00
f6ee90e5ba Merge branch 'dsp' of https://github.com/kennypm/Waybar into dsp 2022-02-12 01:49:14 -05:00
e066e3080e Merge pull request #1432 from DorianRudolph/fix-unplug
fix #1431: audio output does not update on unplug
2022-02-09 15:29:36 +01:00
1a93a6cfa5 fix #1431: audio output does not update on unplug 2022-02-09 14:20:09 +01:00
d5c400c0cc Initial commit for Waybar JACK monitoring module
-DSP load
  -xruns
  -connected/disconnected state
  -only tested with Pipewire so far but should work with JACK2 as well

 On branch dsp
 Changes to be committed:
	modified:   include/factory.hpp
	new file:   include/modules/jack.hpp
	modified:   meson.build
	modified:   meson_options.txt
	modified:   src/factory.cpp
	new file:   src/modules/jack.cpp
2022-02-09 02:53:52 -05:00
074b559da5 Merge pull request #1423 from technic/fmt-refactor
move Glib ustring format helper to utils
2022-02-08 18:25:55 +01:00
7a61a00fb3 Merge pull request #1421 from gemmelos/patch-2
Update man page clock module - tooltip
2022-02-08 18:25:13 +01:00
d4da04a750 move Glib ustring format helper to utils
this formatter is useful for other modules
which want to print Glib exceptions messages
2022-02-05 21:26:48 +01:00
f3819ee954 remove duplicated string manipulation methods 2022-02-05 21:02:58 +01:00
2697d432a4 ltrim and rtrim take argument by const-ref 2022-02-05 21:02:58 +01:00
061cb76fc4 make functions in header file inline
added header guard
now string utils can be used in any part of the project
2022-02-05 21:02:58 +01:00
6c188455a4 Update man page clock module - tooltip
Add tooltip documentation to the clock man page now that this is works.
2022-02-05 19:05:50 +01:00
12caae8fd2 Merge pull request #1410 from ErikReider/reverse-tray
Reverse the tray icon order
2022-02-02 12:56:25 +01:00
26ea6fae32 Merge pull request #1413 from snehrbass/patch-1
Fix typo in example for sway/mode man page
2022-02-02 12:55:34 +01:00
26419e45b7 Merge pull request #1418 from gemmelos/patch-1
Fix disabled tooltip on clock module
2022-02-02 12:55:10 +01:00
6be741afc9 Fix disabled tooltip on clock module
Seems like the tooltip text should only be set if both `if (tooltipEnabled())` and `if (config_["tooltip-format"].isString())` passes.
2022-02-02 12:41:06 +01:00
c80cc873af Update spotify example to work on copy paste 2022-02-02 00:01:18 -05:00
2b42872b6c Merge pull request #1417 from evyatark2/master 2022-02-01 22:00:29 +01:00
895bc878f8 Properly initialize distance_scrolled members.
When they were uninitialized it caused getScrollDir() to incorrectly return SCROLL_DIR::NONE in some circumstances
2022-02-01 22:42:03 +02:00
a0ee9e7fc1 Fix Typo in Example for sway/mode 2022-01-29 14:19:53 -05:00
941cf47693 Add config option "reverse-direction" 2022-01-28 19:14:46 +01:00
32d42749f9 use pack_end instead of pack_start 2022-01-28 18:42:52 +01:00
96caa9f094 Merge pull request #1406 from Spiffyk/language-segfault
sway/language: fix segmentation fault for layouts not found in XKBContext
2022-01-25 23:08:32 +01:00
f4f1267a71 sway/language: fix segmentation fault for layouts not found in XKBContext 2022-01-25 20:03:19 +01:00
bcadf64031 Show application icon when using sway window module
Signed-off-by: Felix Weilbach <felix.weilbach@t-online.de>
2022-01-24 17:37:51 +01:00
8974bbf7b4 Merge pull request #1312 from mazunki/master
Changed a setting to include {gwaddr} by default
2022-01-24 09:23:43 +01:00
1c08d26af0 Merge branch 'master' into master 2022-01-24 09:23:23 +01:00
c4cc7ae396 Update client.cpp 2022-01-24 09:22:47 +01:00
65dd245362 Update clock.cpp 2022-01-24 09:21:56 +01:00
667d0a45f4 Update command.hpp 2022-01-24 09:20:43 +01:00
53fc750fc3 Merge pull request #1404 from kevinoid/fix-issue-1139 2022-01-24 09:02:53 +01:00
27df7a9aa7 battery: read status with spaces
According to the [sysfs class power ABI],
/sys/class/power_supply/<supply_name>/status may contain "Not charging".
This is already handled by status_gt() and update() (where ' ' is
converted to '-' for use in config keys) but was not being read due to
skipws.  Read with std::getline() to handle this case.

[sysfs class power ABI]: https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-class-power

Fixes: #1139
Signed-off-by: Kevin Locke <kevin@kevinlocke.name>
2022-01-23 18:36:59 -07:00
d575646c2d Merge pull request #1394 from nullobsi/patch-1
fix: Use locale when formatting clock
2022-01-18 11:35:55 +01:00
3a6e5be59d Use locale when formatting clock 2022-01-14 10:36:24 -08:00
81f0bcb3a3 Merge pull request #1388 from ericonr/man2
fix(man): add missing newlines to wlr docs.
2022-01-12 11:09:09 +01:00
9ae99c2621 Merge pull request #1386 from Anakael/pr/anakael/add-swap-flags
[Memory] feat: Add swap flags
2022-01-12 11:08:50 +01:00
5abdecc402 fix(man): add missing newlines to wlr docs. 2022-01-11 17:29:17 -03:00
1540797cd9 chore: v0.9.9 2022-01-10 09:58:29 +01:00
5d8bc35476 Merge pull request #1385 from mvdan/css-checkboxes
resources: don't break tray icon checkboxes via CSS
2022-01-09 13:25:31 +01:00
5c574975b7 resources: don't break tray icon checkboxes via CSS
These three lines break checkboxes and other forms of UI in status
indicator dropdowns. For instance, they break checkboxes on
NetworkManager's "nm-applet --indicator" via libappindicator-gtk3.

First, disabling borders completely hides those UI elements,
as they seem to render entirely via borders.
Second, min-height makes checkboxes just flat lines.

When removed entirely, the border settings seem to have had an effect on
the workspaces widget, which now renders with round underline borders.
To undo that, re-add those two lines inside its section.

The min-height setting doesn't seem to affect anything that I can see.
Remove it entirely, for now.

Fixes #1148.
2022-01-09 10:32:16 +00:00
18cbd2aa1a Merge pull request #1380 from alebastr/fmt-build-fix
Fix build with fmt 8.1.0
2022-01-08 13:48:41 +01:00
ce404199de chore: add tzdata to the alpine builder
Fixes date formatting test execution on alpine.
2022-01-07 22:50:23 -08:00
7f6bef2049 fix(util): make waybar_time formatter compatible with fmt 8.1.0
Stop using private implementation details of the `formatter<std::tm>`.
We never needed anything from the class besides the format specifier,
which is easily obtainable with public API.
2022-01-07 22:34:00 -08:00
1489a539f8 chore: bump supported fmt ver to 7.0.0
Certain features we use were added only in 7.0 and the code no longer
compiles with any earlier versions.
2022-01-07 22:33:52 -08:00
766c8a1035 test: add tests for waybar_time formatter 2022-01-07 22:33:50 -08:00
8c41aaae04 refactor(test): use single executable 2022-01-07 19:21:51 -08:00
c0d84853ea refactor(clock): extract waybar_time to util/waybar_time.hpp 2022-01-07 18:09:44 -08:00
2301788a81 created a hotfix for libfmt-8.1.0 and above 2022-01-08 01:44:46 +01:00
d22d6a4522 Merge branch 'master' of github.com:Alexays/Waybar 2022-01-08 01:02:57 +01:00
d9b5c2595a Merge pull request #1376 from languitar/bugfix/sway-workspace-sorting
fix: match sway workspace order with sway one
2022-01-07 10:30:19 +01:00
4a85ec0f59 fix: match sway workspace order with sway one
Ensure that sway workspaces are always displayed in the same order as
used internally by sway. The previous sorting code always sorted
unnumbered workspaces lexicographically. This isn't the order used by
sway internally. Therefore, commands such as "workspace next" might have
jumped arbitrarily in waybar.

This commit reworks the sorting code such that the internal order is
always obeyed. Additionally, numbered persistent workspaces are inserted
at their natural position at the front of the workspace list while
unnumbered ones are appended. This should match the expectations of
workspace ordering known from sway's behavior.

The changes make the configuration property "numeric-first" unnecessary
as this will always be the case now. There's also no reasonable way
around this behavior now. Otherwise, persistent workspaces would jump
around in the visual representation as soon as they become known to
sway.

Fixes #802
2022-01-07 10:26:27 +01:00
621d686310 Merge pull request #1375 from Anakael/pr/anakael/fix-invisible-application
[wlr/taskbar] fix: Missing tasks
2022-01-05 13:49:31 +01:00
812832d38a fix: Missing tasks 2022-01-05 15:38:52 +03:00
19069482e2 Merge branch 'master' of https://github.com/Alexays/Waybar into pr/anakael/fix-invisible-application 2022-01-05 14:57:32 +03:00
1e560cf0c9 merge 2022-01-05 14:47:44 +03:00
0c9cdf7e0b Merge pull request #1370 from volucris1/patch-1 2022-01-04 09:00:28 +01:00
5a4f7a70ef fix indent 2022-01-04 14:53:59 +07:00
ce56a80792 Merge pull request #1353 from bd-g/master
Network Module Enhancements
2021-12-30 10:03:04 +01:00
db95644d26 Merge pull request #1364 from ilkecan/master
Add `fixed-center` option
2021-12-30 10:01:04 +01:00
548bd2ab1a Add fixed-center option
Resolves #957
2021-12-28 16:00:25 +03:00
7b9b10afc6 Merge branch 'master' into master 2021-12-26 20:14:26 -07:00
8ec321ddaf Merge pull request #1221 from Anakael/pr/anakael/add-name-to-taskbar
[Taskbar] feat: Add name format replacementf feat: Add app ids mapping (ready for review)
2021-12-23 23:01:21 +01:00
13d25d403e add to network module - signalStrengthApp shows what applications can run at current signal strength 2021-12-14 11:37:39 -07:00
3218612d3b change frequency to GHz 2021-12-14 11:36:46 -07:00
9bc86347be change signal strength to penalize overly strong signals 2021-12-14 11:34:15 -07:00
d1f8b42d22 add Debian build dependency to README 2021-12-14 11:28:13 -07:00
0e3be30e01 Merge pull request #1352 from fhost/fhost/inhibitor-man
man: Add waybar-inhibitor man page
2021-12-14 08:47:08 +01:00
795246263f man: Add waybar-inhibitor man page 2021-12-14 08:30:28 +01:00
89a8bd976e Merge pull request #1337 from 187Qrly/patch-1
Add Gentoo to README.md
2021-12-14 07:44:07 +01:00
9b399ea2bb Merge pull request #1334 from bd-g/master
Adjust max wifi strength that is possible
2021-12-14 07:43:41 +01:00
9608e0dabf Merge pull request #1341 from fhost/fhost/logind
Add logind feature, with its 'inhibitor' module
2021-12-14 07:43:15 +01:00
1d1cfda90d Merge pull request #1289 from aashu/master
Add reverse scrolling config option for pulseaudio module
2021-12-14 07:42:13 +01:00
ad20c0af2d Merge branch 'master' into master 2021-12-14 10:22:25 +05:30
eae65099d0 Add logind feature, with its 'inhibitor' module
The logind feature adds a new inhibitor module which allows to acquire
the inhibitor locks that logind presents.

Signed-off-by: Alexis Cellier <kernelserror@gmail.com>
2021-12-12 17:52:26 +01:00
39f42cdd7e Merge pull request #1338 from jfred9/master
bar: Fix crash when unplugging HDMI
2021-12-08 10:42:22 +01:00
f573e32d0b bar: Fix crash when unplugging HDMI
There is a double delete situation which causes a SIGSEGV to happen
during destruction of bar.

This was introduced by the group feature patch.

The same object pointer is stored in two different vectors of
unique_ptr<AModule> element. Replace with shared_ptr to handle
reference counting correctly and avoid double delete.
2021-12-05 10:55:07 +01:00
5cbbd65ac4 Add Gentoo 2021-12-03 20:11:25 +01:00
2240c79b1a Adjust max wifi strength that is possible 2021-12-01 18:24:35 -07:00
ece86c96d7 Feature Clock: show list of time in other timezones in a tooltip
Introducing new tooltip placeholder: {timezoned_time_list}. It will be replaced with the list of times in different time zones.
I've found it useful to hover the mouse pointer on time and see time in all my timezones at once.
Current timezone excluding from the list, so if you will scroll over the time module and change the active timezone, this timezone will be excluded from the list and the previous active zone will be added.
2021-12-01 17:08:05 +00:00
9e8a71c4ef Merge pull request #1277 from dartkron/master
Refactor Clock: generalize multi timezones and single timezone cases
2021-12-01 11:51:35 +01:00
7069429c03 Merge pull request #1229 from kraftwerk28/sway-language-country-flag
`sway/language` country flag
2021-12-01 11:49:39 +01:00
d41a60d2d9 Merge pull request #1244 from alebastr/swaybar-ipc
Yet another swaybar ipc implementation
2021-12-01 11:48:49 +01:00
05f7727dae Merge branch 'master' into swaybar-ipc 2021-12-01 11:48:03 +01:00
9bc6fae15b Merge pull request #1331 from xytovl/per-device-pulse-icon
Allow sink in addition to source for pulse icon
2021-11-30 16:36:22 +01:00
9dac851f6d Allow sink in addition to source for pulse icon 2021-11-30 16:31:41 +01:00
b6e24bd527 Merge pull request #1305 from njoyard/feat/groups
Add module group feature
2021-11-29 15:19:48 +01:00
b6d0a4b63f feat(bar): allow customization of bar modes
Allow changing existing modes and adding new ones via `modes`
configuration key.
`modes` accepts a JSON object roughly described by the following type
```typescript
type BarMode = {
    layer: 'bottom' | 'top' | 'overlay';
    exclusive: bool;
    passthrough: bool;
    visible: bool;
};
type BarModeList = {
    [name: string]: BarMode;
};
```
and will be merged with the default modes defined in `bar.cpp`.

Note that with absence of other ways to set mode, only those defined in
the `sway-bar(5)`[1] documentation could be used right now.

[1]: https://github.com/swaywm/sway/blob/master/sway/sway-bar.5.scd
2021-11-28 12:19:45 -08:00
cf5ddb2a5e fix(swaybar-ipc): avoid unnecessary copy of struct swaybar_config 2021-11-28 11:34:21 -08:00
4b5dc1bb3a test: count copies and moves done by SafeSignal 2021-11-28 09:52:18 -08:00
22ff26252b Merge pull request #1328 from Anakael/pr/anakael/experimental-flag
build: Add experimental build option
2021-11-28 11:27:12 +01:00
a832814b41 Merge pull request #1329 from m-bdf/patch-1
mediaplayer.py: Exit properly on SIGPIPE
2021-11-28 11:26:41 +01:00
2fb671f5fa Revert protocol build 2021-11-28 01:19:21 +03:00
3c2fa1625d Finish 2021-11-28 01:12:35 +03:00
d5112678c3 mediaplayer.py: Exit properly on SIGPIPE 2021-11-27 23:07:26 +01:00
0c18e57937 add group feature 2021-11-25 12:01:17 +01:00
b4e19678b7 ci: increase FreeBSD VM memory to 2048MB
Intermittent CI failures without any useful diagnostics could be caused
by the OOM killer. 1024MB is not really enough to run 3 parallel jobs
with a modern C++ compiler.
2021-11-23 19:48:31 -08:00
8fe42ebd2e doc: update exclusive and passthrough defaults 2021-11-23 19:18:24 -08:00
bb7b376fa6 removed commented useless runtime errors 2021-11-24 01:37:21 +01:00
89afa8e149 Checking if emoji byte doesn't get out of bounds 2021-11-24 02:15:10 +02:00
59040c53e4 Move definition to .cpp 2021-11-24 02:15:10 +02:00
02560a6537 Update manpage 2021-11-24 02:15:10 +02:00
0472d279e4 Add {flag} format replacement 2021-11-24 02:15:10 +02:00
166504256a Merge branch 'master' of https://github.com/Alexays/Waybar into pr/anakael/add-name-to-taskbar 2021-11-23 23:10:49 +03:00
2290fe10aa fix(bar): handle ipc connection errors.
Try to use the default bar id (`bar-0`) if none is set.
2021-11-23 08:46:58 -08:00
9fa7bfc0cb Merge pull request #720 from jbeich/disk
disk: make {used} match df(1)
2021-11-23 13:54:46 +01:00
6712cd05a3 Merge branch 'master' into disk 2021-11-23 13:54:17 +01:00
977d21b5f6 Merge pull request #805 from Anakael/workspace-manager-implementation
WLR Workspace manager implementation
2021-11-23 13:52:17 +01:00
0a4841371b Merge branch 'master' into workspace-manager-implementation 2021-11-23 13:52:08 +01:00
deab028e52 Merge pull request #1325 from Alexays/revert-1256-patch-1
Revert "dont escape essid in tooltip"
2021-11-23 10:10:24 +01:00
c51a973d60 Revert "dont escape essid in tooltip" 2021-11-23 10:10:14 +01:00
5a5f8c3b9f Merge pull request #1256 from WuerfelDev/patch-1
dont escape essid in tooltip
2021-11-23 10:04:59 +01:00
b1dc3005b7 Merge pull request #1294 from Anakael/pr/anakael/ignore-by-title
feat: Ignore by title
2021-11-23 10:03:41 +01:00
98f7a10a51 Fix sort 2021-11-23 03:18:00 +03:00
23991b6543 Finish 2021-11-23 03:10:44 +03:00
331dfa87da Merge pull request #1230 from ciarand/if-changes-isolate
Switch network module to read /proc/net/dev
2021-11-22 08:00:54 +01:00
29a8f52464 Merge pull request #1322 from alebastr/freebsd-ci-update
ci: update FreeBSD configuration
2021-11-22 07:59:31 +01:00
6bfb674d1b fix(swaybar-ipc): better logs 2021-11-21 17:28:47 -08:00
ef4c6a9ba3 Update to proto. Fix displaying. Rename classes. 2021-11-22 01:12:55 +03:00
ffeecf626c Update names 2021-11-21 15:01:25 +03:00
4154492603 ci: update FreeBSD configuration
Use latest action v0.1.5.
Pin runner to macos-10.15. macos-latest will start using macos-11 images
without VirtualBox in less than a month[1].

[1] https://github.com/actions/virtual-environments/issues/4060
2021-11-19 21:17:55 -08:00
5baffbf8f8 doc: document swaybar ipc options, ipc and id 2021-11-19 20:28:57 -08:00
60c1706273 Update taskbar.cpp 2021-11-19 18:54:37 +03:00
cb6af026f6 Update taskbar.hpp 2021-11-19 18:51:28 +03:00
18ea53fcbc Update taskbar.hpp 2021-11-19 18:39:49 +03:00
23955fdcc2 Update taskbar.hpp 2021-11-19 18:38:59 +03:00
a06ed00727 Merge pull request #1317 from jfred9/master
river/tags: Add possibility for mouse clicks
2021-11-19 16:33:29 +01:00
15761ef802 Merge branch 'master' of https://github.com/Alexays/Waybar into workspace-manager-implementation 2021-11-16 21:44:50 +03:00
ad3f46214d river/tags: Add possibility for mouse clicks
Left mouse click - set-focused-tags
Right mouse click - toggle-focused-tags
2021-11-15 22:31:38 +01:00
13fda1607f Merge pull request #1311 from b1rger/patch-2
Fix typo
2021-11-12 09:04:41 +01:00
9fda6695ea Merge pull request #1314 from Scrumplex/fix-negative-mpd-vol
Ensure MPD volume is not negative
2021-11-12 09:04:21 +01:00
b24f9ea569 Ensure MPD volume is not negative
If the primary output does not support changing volume MPD will report
-1. Ensure that negative volume levels will be represented as 0 instead.

Signed-off-by: Sefa Eyeoglu <contact@scrumplex.net>
2021-11-11 21:42:05 +01:00
e10c9dd011 changing want_route_dump to default to true, since we say we have gwaddr support 2021-11-09 19:04:05 +01:00
b0eab5d793 maybe we shouldn't actually runtime error, but still doing a check 2021-11-09 19:03:15 +01:00
17bb5643ae explicitly checking for errors to silence unused variable warnings when writing to fd 2021-11-09 18:38:07 +01:00
769b12f16a Fix typo 2021-11-06 09:00:15 +00:00
b511103fd9 Merge pull request #1301 from jonbakke/patch-1
Clarify less than/greater than in warning.
2021-10-29 13:23:28 +02:00
122fe33636 Merge pull request #1302 from marwing/master
Mark memory used by zfs arc as free in memory
2021-10-29 13:22:58 +02:00
8498ddefca Merge pull request #1304 from mamins1376/fix-1303
Fix divide by zero (#1303)
2021-10-29 13:22:01 +02:00
48117a2e97 Fix divide by zero (#1303) 2021-10-29 14:12:48 +03:30
decb13eef0 mark zfs arc size as free in memory 2021-10-28 19:10:46 +02:00
a015b2e3db Clarify less than/greater than in warning.
I was seeing "[warning] Requested height: 20 exceeds the minimum height: 30 required..."
Lines 114-134 are relevant; 133 overrides the requested height with the minimum height when GTK wants more pixels to work with. So, the code is behaving as expected, and "less than" matches the code's logic.
2021-10-28 09:37:11 -07:00
562e4157c0 Merge pull request #1297 from Molytho/master
Add spacing config option
2021-10-22 11:02:53 +02:00
01bfbc4656 Use spacing in config 2021-10-20 11:30:53 +02:00
7669029bfe Add man documentation for spacing config option 2021-10-20 11:30:49 +02:00
0b66454d5c Add spacing config option
This option allows to add spaces between the modules. It uses Gtk:Box's spacing property.
2021-10-20 11:30:40 +02:00
75a6dddea5 Finish 2021-10-20 01:23:00 +03:00
08b4a83331 Add reverse scrolling config option for pulseaudio
When natural scrolling is enabled, the behaviour of scrolling on pulseaudio
module is reversed, this commit reverses the direction of scroll variable
if "reverse-scrolling" is set to 1 in config file.
2021-10-15 19:07:25 +05:30
c5e4d26320 Fix working without timezone 2021-10-05 10:20:06 +00:00
d8bc6c92bb Fix style and spelling 2021-10-05 09:55:30 +00:00
110c66dd32 Refactor Clock: generalize multi timezones and single timezone cases
After this refactoring:
1. Timezones parses only once on start and the we refer to saved values. All time_zone.isString() checks gone to the constructor.
2. Single timezone case handling as case of multi timezoned logic.
3. Scroll event seems more clear now.
4. Tooltip template parses on start to check if there calendar placeholder or not. To do not calculate calendar_text() if not necessary.
2021-10-03 16:57:55 +00:00
6eb9606f23 Merge pull request #1274 from RobertMueller2/master
sway/window: include floating_nodes when considering window count for class
2021-10-03 10:27:26 +02:00
03ebbf6d98 Merge pull request #1275 from dartkron/master
Fix Clock crash on empty string in timezones field
2021-10-03 10:26:05 +02:00
174db444d6 Fix Clock crash on empty string in timezones field
Also fixed timezones behavior: now waybar starting with the first timezone in timezones list and falling back to timezone field only if timezones omit or has no elements.
2021-10-03 03:27:54 +00:00
9972384597 sway/window: include floating_nodes when considering window count for class 2021-10-02 18:35:38 +02:00
8b4dafd701 Merge pull request #1273 from ElyesH/master
Fix spelling errors
2021-10-02 18:29:41 +02:00
f18eb71ad7 Fix spelling errors
Signed-off-by: Elyes HAOUAS <ehaouas@noos.fr>
2021-10-02 18:13:17 +02:00
7af6e8413c Merge pull request #1271 from alebastr/sni-passive-visibility
fix(tray): fix visibility of Passive items
2021-10-02 09:49:57 +02:00
fbedc3d133 fix(tray): fix visibility of Passive items
`show_all` call from `Tray::update` attempts to walk the widget tree and
make every widget visible. Since we control individual tray item
visibility based on `Status` SNI property, we don't want that to happen.

Modify `Tray::update` to control the visibility of a whole tray module
only and ensure that the children of `Item` are still visible when
necessary.
2021-10-02 00:08:45 -07:00
fe5ac0fe08 Merge pull request #1257 from tokyovigilante/fix-catch2
Update catch2 dependency 2.13.3 -> 2.13.7
2021-09-23 22:40:31 +02:00
f638fe473a Update catch2 dependency 2.13.3 -> 2.13.7 2021-09-22 11:43:25 +12:00
8d04da1551 dont escape essid in tooltip
just like https://github.com/Alexays/Waybar/pull/834 but for the network name.
2021-09-21 13:15:36 +02:00
8534175c59 Merge pull request #1252 from gavinbeatty/fix-sway-language-tabs
sway/language: remove tabs, indent with 2 spaces
2021-09-19 19:08:28 +02:00
6778a79033 Merge pull request #1253 from Darkclainer/per-core-cpu-usage
Add cpu usage for every core
2021-09-19 19:00:46 +02:00
6e5a0bc80a Add cpu usage for every core 2021-09-19 14:02:25 +03:00
fe547901fa sway/language: remove tabs, indent with 2 spaces 2021-09-18 15:28:45 -05:00
cee08eccd1 Merge pull request #1251 from Alexays/revert-1250-master
Revert "Add CPU usage for every core"
2021-09-18 13:50:25 +02:00
67c7302938 Revert "Add CPU usage for every core" 2021-09-18 13:50:16 +02:00
8489646b66 Merge pull request #1250 from Darkclainer/master
Add CPU usage for every core
2021-09-18 13:48:39 +02:00
6938921e92 Merge pull request #1239 from mazunki/default-gateway
Added support for {gwaddr} as a variable
2021-09-18 13:47:32 +02:00
7b73cc472f Merge branch 'default-gateway' of github.com:mazunki/waybar into default-gateway 2021-09-18 02:09:57 +02:00
1c91c71dcd updated original debug message with gateway ip, similar, yet not identical to ip route 2021-09-18 02:09:25 +02:00
6142dfba6a updated original debug message with gateway ip, similar, yet not identical to default via 10.13.37.100 dev enp7s0 metric 2
10.13.37.0/24 dev enp7s0 proto kernel scope link src 10.13.37.97 's output
2021-09-18 01:51:16 +02:00
13239417d8 fixed wrong dependency for make target 2021-09-18 01:20:16 +02:00
5f083193e4 fixed tab indentation to spaces, removed debug 2021-09-18 01:12:58 +02:00
a51ac59252 Merge remote-tracking branch 'origin/master' 2021-09-17 22:30:31 +03:00
8da940f929 Update man pages for cpu usage 2021-09-17 22:22:14 +03:00
ce9e8aead3 Merge pull request #1222 from mswiger/use_g_memdup2
Use g_memdup2 instead of g_memdup
2021-09-17 20:56:47 +02:00
73ce2a99ff Merge pull request #1238 from Matan1x/master
round brightness
2021-09-17 20:56:28 +02:00
b028a47d57 Merge pull request #1243 from alebastr/config-unittest
Unit-tests for configuration includes
2021-09-17 20:56:09 +02:00
4bf577e89b Add CPU usage for every core 2021-09-17 21:18:21 +03:00
5991bbb741 ci: run unit-tests 2021-09-15 22:20:46 +07:00
d7d606b721 doc: update documentation for 'include' 2021-09-15 22:20:45 +07:00
0c1d3e30b6 fix(config): preserve explicit null when merging objects 2021-09-15 22:20:44 +07:00
ccc60b4245 refactor(config): more sensible multi-bar include behavior 2021-09-15 22:15:27 +07:00
8912bd3ed0 test: multi-bar config with includes 2021-09-15 21:34:56 +07:00
9f3b34e4d9 test: validate configuration load 2021-09-15 21:34:55 +07:00
6eba62f060 test: add build configs for catch2 2021-09-15 21:34:55 +07:00
1f16d7955d refactor(config): drop getValidPath 2021-09-15 21:34:54 +07:00
1f7d399b8e refactor(config): remove style handling from Config 2021-09-15 21:34:53 +07:00
4fff2eaaa0 refactor(client): change config visibility to public 2021-09-15 21:34:10 +07:00
b377520a38 refactor(client): extract config handling into a new class 2021-09-14 13:15:54 +07:00
95ecff0551 added example tooltip usage 2021-09-09 20:12:20 +02:00
2c380a53ca added support for the {gwaddr} variable 2021-09-09 20:05:18 +02:00
aacd0fcc65 round brightness 2021-09-08 17:12:30 +03:00
4f76c9bd43 Only use g_memdup2 for glib >= 2.68 2021-08-29 13:11:04 -07:00
8d9e322507 Add man 2021-08-29 16:37:02 +03:00
94e53c3777 Add swap flags 2021-08-29 16:34:29 +03:00
12c42fc6e4 Merge branch 'master' of https://github.com/Alexays/Waybar into pr/anakael/add-name-to-taskbar 2021-08-27 01:43:31 +03:00
5186dd27e6 Use while (getline) instead of a for loop
Also make the comments surrounding the /proc/net/dev parsing clearer and
remove the apparently redundant "is the netdev file still good?" check.
2021-08-26 11:33:52 -07:00
9d9f959769 Switch network module to read /proc/net/dev
This fixes issue #610 by reading bandwidth usage per-interface from
/proc/net/dev instead of globally via /proc/net/netstat. It supports the
same matching logic as elsewhere, so setting interface to '*' should
display the same sum-total bandwidth usage as the previous
implementation.
2021-08-25 15:00:05 -07:00
4e256cf3f0 Merge pull request #1223 from xi/cpu-mem-format-icon
add format-icons for cpu und memory
2021-08-23 09:22:02 +02:00
eae94ee14a Merge pull request #1224 from xi/rm-travis-shield
rm travis-ci shield
2021-08-23 09:10:07 +02:00
e0260ac4fc rm travis-ci shield 2021-08-23 08:02:08 +02:00
7b4b5e55a2 support format-icon for cpu und memory 2021-08-23 07:30:19 +02:00
cb49650ea4 Use g_memdup2 instead of g_memdup
This fixes a compile warning.

See: https://discourse.gnome.org/t/port-your-module-from-g-memdup-to-g-memdup2-now/5538
2021-08-22 14:46:40 -07:00
d60bb90b77 Fix typo 2021-08-22 20:43:37 +03:00
ddfe036f00 Format 2021-08-22 20:42:16 +03:00
38afa345dd Finish 2021-08-22 20:18:03 +03:00
ab38f13052 Merge pull request #1217 from gavinbeatty/patch-1
Fix memory leak and data race
2021-08-21 20:44:51 +02:00
9ee701974f Fix memory leak and data race
- Delete previous Layout before creating next one, and in destructor
- Use stack XKBContext instead of local new+delete
- Lock mutex in update() as it is called from a different thread than onEvent(res)
2021-08-20 10:06:35 -05:00
8940c3bbe8 Merge pull request #1211 from mswiger/fix_multi_display_tray_icon_scaling
Fix tray icon scaling on multi-display setups
2021-08-20 17:00:41 +02:00
51f2c6bc46 Merge pull request #1216 from Anakael/pr/anakael/add-short-desc-to-lang
fix: Add number to shortDescripton
2021-08-20 09:04:35 +02:00
c058a2d196 Add number to shortDescripton 2021-08-20 01:09:16 +03:00
a4fff66bec Merge pull request #1215 from ifreund/river-urgent
river/tags: support urgent tags
2021-08-19 15:07:35 +02:00
024fd42e27 river/tags: support urgent tags
Upstream river has a concept of urgent views/tags as of commit e59c2a73.
Introduce a new urgent style to expose this in the waybar module.
2021-08-19 15:01:49 +02:00
c413c1ec23 Merge pull request #1209 from Anakael/pr/anakael/add-short-desc-to-lang
feat: Add short desc to lang
2021-08-17 09:11:55 +02:00
2d80d31527 Fix tray icon scaling on multi-display setups 2021-08-16 23:33:29 -07:00
a87a967a97 Fix leak 2021-08-17 05:29:35 +03:00
a57e431437 Add shortDescription 2021-08-17 05:28:41 +03:00
61783aafaa save 2021-08-17 04:31:17 +03:00
e5787a2617 chore: 0.9.8 2021-08-16 15:47:34 +02:00
9aec6bbed4 Merge pull request #1190 from mswiger/fix_incorrect_tray_icon_scale
Fix incorrect tray icon scaling
2021-08-01 13:39:29 +02:00
4f6a9b1bc2 Fix incorrect tray icon scaling 2021-07-31 18:01:31 -07:00
28e7a96e37 Merge pull request #1188 from WhyNotHugo/patch-1
Don't start if graphical-session is not running
2021-07-31 20:36:52 +02:00
710f933fa6 Don't start if graphical-session is not running
Currently waybar _can_ try to start even if there's no graphical session (and
no sway) running. Adding `Requisite=` prevents this. From `systemd.unit(5)`:

    Requisite=
       Similar to Requires=. However, if the units listed here are not
       started already, they will not be started and the starting of
       this unit will fail immediately.  Requisite= does not imply an
       ordering dependency, even if both units are started in the same
       transaction. Hence this setting should usually be combined with
       After=, to ensure this unit is not started before the other
       unit.

       When Requisite=b.service is used on a.service, this dependency
       will show as RequisiteOf=a.service in property listing of
       b.service.  RequisiteOf= dependency cannot be specified directly.
2021-07-31 16:56:55 +02:00
bad72de960 Merge pull request #1105 from Amanieu/fix_power_calc
Fix power calculation when battery units are in μA instead of μW
2021-07-25 15:07:27 +02:00
65166109c9 Merge branch 'master' into fix_power_calc 2021-07-25 15:07:01 +02:00
91156dfc75 Merge pull request #1178 from Anakael/pr/anakael/add-languge-tooltip-format
[sway/language] Add tooltip-format
2021-07-25 15:05:58 +02:00
af2113931a fix typo 2021-07-24 17:26:49 +03:00
68e4457f3a Add tooltip-formay 2021-07-24 17:24:37 +03:00
1b4ddbca3a Merge pull request #1024 from GrantMoyer/keyboard_state
Keyboard state module
2021-07-23 16:15:02 +02:00
445ad22580 Merge branch 'master' into keyboard_state 2021-07-23 15:59:08 +02:00
88a5f713ed Prefer keyboard-state over keyboard_state 2021-07-23 09:45:07 -04:00
2009ceb350 Update opensuse 2021-07-23 15:01:29 +02:00
77a2eff2ce Update opensuse 2021-07-23 14:49:03 +02:00
cf832798fb Update debian 2021-07-23 14:46:03 +02:00
3f3f2d9c2c Merge pull request #1159 from Anakael/pr/anakael/sway-language-impr
[sway/language] Improve sway/language
2021-07-23 14:42:22 +02:00
b47705ac21 Merge branch 'master' into pr/anakael/sway-language-impr 2021-07-23 09:07:43 +02:00
b33be38877 Merge pull request #1145 from alebastr/sni-enhancements
tray module enhancements
2021-07-23 09:05:54 +02:00
a5fe6f40b8 feat(tray): handle Status property
On the `Passive` value of `Status` tray items would be hidden unless
`show-passive-items` is set to true.
On the `NeedsAttention` value of `Status` tray items will have a
`.needs-attention` CSS class.
2021-07-22 08:04:06 -07:00
245f7f4b11 feat(tray): handle scroll events 2021-07-22 08:04:05 -07:00
1418f96e46 feat(tray): fallback to Title for items without ToolTip 2021-07-22 08:04:04 -07:00
84a8f79bbe feat(tray): implement tooltips (text only) for tray items 2021-07-22 08:04:03 -07:00
4b6253e810 refactor(tray): infer changed properties from signal name
Comparing two GVariants is too expensive; let's collect the set of
properties updated by each signal and apply them unconditionally.
2021-07-22 08:04:00 -07:00
929fc16994 fix(tray): ignore unused WindowId property 2021-07-22 08:01:25 -07:00
811f0896c9 Merge pull request #1174 from mswiger/fix_blurry_tray_icons
Fix blurry tray icons for HiDPI displays
2021-07-21 10:36:16 +02:00
7729ca3427 Update debian 2021-07-21 10:28:56 +02:00
100d4d3499 Merge branch 'master' into pr/anakael/sway-language-impr 2021-07-21 09:40:19 +02:00
7f5fd1ac86 Update opensuse 2021-07-21 09:30:47 +02:00
1f5c07a07f Update debian 2021-07-21 09:27:54 +02:00
67d482d28b Update opensuse 2021-07-21 09:23:52 +02:00
1440ed29d4 Fix blurry tray icons for HiDPI displays 2021-07-20 22:29:34 -07:00
311c5779ea Remove unused variable 2021-07-20 23:03:41 -04:00
9880c6929f Install libevdev in FreeBSD workflow 2021-07-20 23:03:41 -04:00
99138ffdcd Add man page for keyboard_state module 2021-07-20 21:09:00 -04:00
08e886ebc6 Search for device automatically if none given 2021-07-20 21:09:00 -04:00
6fdbc27998 Add default style 2021-07-20 21:09:00 -04:00
40e6360722 Update css class when locked/unlocked 2021-07-20 21:09:00 -04:00
642e28166b Add more configuaration 2021-07-20 21:09:00 -04:00
6dfa31fb17 Basic keyboard state module 2021-07-20 21:09:00 -04:00
c91cc2218b Merge pull request #1170 from larsch/default_name_fix
Fix pulseaudio icon name compilation error
2021-07-20 15:26:18 +02:00
6f2bfd43bf Fix pulseaudio icon name compilation error 2021-07-20 15:25:05 +02:00
f43f8773c4 Merge pull request #1169 from roosemberth/pa-control-active-sink
pulseaudio: Control currently running sink
2021-07-20 14:01:23 +02:00
bb072675ba Merge pull request #1161 from xytovl/per-device-pulse-icon
Support per-device icon in pulseaudio
2021-07-20 14:00:14 +02:00
fa43072be7 Merge pull request #1163 from Anakael/pr/anakael/update-dockerfiles
Update dockerfiles
2021-07-20 13:59:09 +02:00
86a43b9042 pulseaudio: Control currently running sink
In a system with multiple sinks, the default sink may not always be
the once currently being used. It is more useful to control the
currently active sink rather than an unused one.

This patch does not make any difference if the system only uses the
default sink.

Signed-off-by: Roosembert Palacios <roosemberth@posteo.ch>
2021-07-20 10:16:53 +02:00
2506c0104a Update Dockerfiles/fedora
Co-authored-by: Aleksei Bavshin <alebastr89@gmail.com>
2021-07-16 11:37:58 +03:00
948eba92a5 Update dockerfiles 2021-07-16 03:03:11 +03:00
ad09072a6d Merge branch 'master' into pr/anakael/sway-language-impr 2021-07-15 22:17:38 +02:00
9c2b5efe7b Support per-device icon in pulseaudio 2021-07-15 09:20:43 +02:00
91cdf80c65 Merge pull request #1157 from tiosgz/multi-bar-fix
Do not fail to parse a multi-bar config
2021-07-14 09:04:24 +02:00
9cce5ea6b5 Update dockerfiles 2021-07-13 04:49:19 +03:00
8310700bbb Improve sway/language 2021-07-13 04:33:12 +03:00
78aaa5c1b4 Do not fail to parse a multi-bar config 2021-07-10 20:22:37 +00:00
7c1303f57c Merge pull request #1147 from alebastr/github-ci-linux
Add GitHub CI jobs on Linux
2021-07-03 01:08:39 +02:00
569517c531 chore: update freebsd-vm to 0.1.4 2021-07-03 00:55:59 +02:00
1c2e0083ba Merge pull request #1144 from ajakk/master
libfmt >=8.0.0 compatibility
2021-07-03 00:30:33 +02:00
a8edc0886d Delete .travis.yml 2021-07-03 00:28:43 +02:00
8e1f85e1c3 Update archlinux 2021-07-03 00:27:57 +02:00
5420a91046 chore: update FreeBSD action to address ntp sync issue 2021-07-01 00:13:30 -07:00
2a52efa99a chore: update fedora dockerfile 2021-06-30 23:51:28 -07:00
d3c59c42ef feat(ci): add GitHub CI jobs on Linux 2021-06-30 23:51:09 -07:00
368e4813de libfmt >=8.0.0 compatibility 2021-06-30 13:12:38 -05:00
36857ae72b Merge pull request #995 from OskarCarl/master
Add recursive config includes
2021-06-23 23:35:56 +02:00
982d571b2e Add include man section 2021-06-23 23:08:47 +02:00
e62b634f72 Workaround for circular imports 2021-06-21 19:29:09 +02:00
e8278431d2 Proper formatting 2021-06-21 19:05:01 +02:00
14f626d422 Add recursive config includes 2021-06-21 19:05:01 +02:00
d08fbb2ef2 Merge pull request #1132 from alebastr/fix-noexcept-condvar-crash
fix(util): protect std::condition_variable methods from pthread_cancel
2021-06-15 13:20:05 +02:00
5da268077c fix(util): protect std::condition_variable methods from pthread_cancel
The changes in GCC 11.x made `std::condition_variable` implementation
internals `noexcept`. `noexcept` is known to interact particularly bad
with `pthread_cancel`, i.e. `__cxxabiv1::__force_unwind` passing through
the `noexcept` call stack frame causes a `std::terminate` call and
immediate termination of the program

Digging through the GCC ML archives[1] lead me to the idea of patching
this with a few pthread_setcancelstate's. As bad as the solution is, it
seems to be the best we can do within C++17 limits and without major
rework.

[1]: https://gcc.gnu.org/legacy-ml/gcc/2017-08/msg00156.html
2021-06-12 12:56:44 -07:00
20160749e7 Merge pull request #1130 from tperard/fix-network-format-config
network: Fix mix use of default and state specific format
2021-06-08 22:53:10 +02:00
194f4c2f18 network: Fix mix use of default and state specific format
Whenever the network module is configured with both "format" and
"format-$state" and when the module use "format-$state" once, it
override the value that was saved from "format".

For example, if both "format" and "format-disconnect" are configured,
and only those, as soon as the module show information about a
disconnected interface, it will keep showing the format for
disconnected, even if the interface is connected again later.

Fix that by always setting a value to default_format_ in update() and
thus use the intended default format when needed.

Fixes #1129
2021-06-08 18:50:32 +01:00
9e34be7b16 Merge pull request #1126 from tperard/fix-network-auto-detection
Fix network interface auto detection
2021-06-05 18:06:30 +02:00
6e041d5275 Merge pull request #1125 from maximbaz/sway-language-ignore-empty 2021-06-05 18:01:26 +02:00
33617b67f0 network: Fix one case where default route is deleted without notification
When an interface's state is change to "down", all the route
associated with it are deleted without an RTM_DELROUTE event.

So when this happen, reset the module to start looking for a new
external interface / default route.

Fixes #1117
2021-06-05 16:52:04 +01:00
efaac20d82 network: Handle ip route priority
When there's a new default route with higher priority, switch to it.
2021-06-05 16:51:54 +01:00
ce97df34e6 network: Also clear ifname in clearIface()
Since we reset `ifid_`, clear `ifname_` as well.
2021-06-05 16:51:40 +01:00
23b9923eeb network: Parse whole RTM_NEWROUTE msg before interpreting it
The check to figure out if we have the default route should be after
the for loop that parses the route attributes, to avoid acting on
incomplete information. We are going to use more fields from the
message.
2021-06-05 16:51:35 +01:00
999c1b6b81 sway-language: ignore events with empty layout 2021-06-05 15:03:52 +02:00
1a98ecf6b0 Merge branch 'master' into fix_power_calc 2021-05-30 11:17:54 +01:00
5444a66e71 Merge pull request #1116 from tperard/fix-network-rework
Fix network module rework
2021-05-27 21:24:07 +02:00
f49a7a1acb network: Update WiFi information when available
The module doesn't update the `essid_` as soon as a WiFi interface is
connected, but that happens at some point later, depending on
"interval" configuration.

Fix that by rerunning the get WiFi information thread when the
`carrier` state changes. Also, we will clear the state related to WiFi
when the connection is drop to avoid stale information.
2021-05-27 19:36:14 +01:00
28dfb0ba41 network: Fix use of carrier information
Some RTM_NEWLINK messages may not have the IFLA_CARRIER information.
This is the case when a WiFi interface report scan result are
available. `carrier` is used regardless of if it is present in the
message or not. This would result in the interface appearing
"disconnected" in waybar when it isn't.

This patch now check that `carrier` is available before using it.

The same thing could potentially happen to `ifname` so check if it's
set before recording it.

Fixes: c1427ff (network: Handle carrier information)
Fixes #388
2021-05-26 19:23:20 +01:00
94a882bf95 Merge pull request #1113 from alebastr/exclusive-and-passthrough
Add config options for exclusive zone and input event passthrough
2021-05-22 10:34:39 +02:00
da2d603b53 doc: add man for exclusive and passthrough flags 2021-05-21 22:44:19 -07:00
7aaa3df701 feat(bar): add config flag to disable exclusive zone 2021-05-21 22:44:18 -07:00
729553d3bc feat(bar): add config flag for pointer event passthrough 2021-05-21 22:44:17 -07:00
f78a802d11 Merge pull request #1106 from tperard/network-module-reword
Network module rework
2021-05-21 17:02:28 +02:00
826a549d1f Merge pull request #1112 from yonatan8070/master
Add options to use a .json extension for the config filename
2021-05-21 17:00:02 +02:00
99918205ed Correct .json to .jsonc 2021-05-21 17:53:43 +03:00
c65ec9e14f Add options to use a .json extension for the config filename 2021-05-21 15:54:48 +03:00
c1427ff807 network: Handle carrier information
IFLA_CARRIER allows to know when a cable is plugged to the Ethernet
card or when the WiFi is connected. If there's no carrier, the
interface will be considered disconnected.
2021-05-15 16:38:00 +01:00
0bb436f949 network: Rework interface auto detection, handle route change events
Last part of the rework of handleEvents(), this time we take the
getExternalInterface() function and add it to the handleEvents()
function. That way, waybar can react immediately when a new "external
interface" is available and doesn't need to probe. Also that avoid to
have two different functions consuming from the same socket and we
don't need to recode some of the functions that are already available
via libnl (to send and receive messages).
2021-05-15 16:38:00 +01:00
0fc7ef6685 network: Rework address lookup to use only events
In order to get the IP address of an interface, we can get the
information out of NEWADDR events without needed to call getifaddrs().
And when now events are expected, we can requests a dump of all
addresses and handle addresses changes the same way via handleEvents()
only.
2021-05-15 16:38:00 +01:00
c9bbaa7241 network: Rework initial interface search by using a dump
Instead of using an alternative way to list all links in order to
choose one when an "interface" is in the configuration, we can ask for
a dump of all interface an reuse the handleEvents() function.

This patch also start to rework the handleEvents() function to grab
more information out of each event, like the interface name.
2021-05-15 16:38:00 +01:00
63fdf66ad6 network: Read all available messages on ev_sock_
When more than one message is available to read on the ev_sock_
socket, only the first one is read.

Make some changes to be able to read all the messages available by
setting the socket to non-blocking. This way we can detect when
there's nothing left to read and loop back to wait with epoll.
2021-05-15 16:38:00 +01:00
9357a6cb88 network: Start the module with some text in the label_
Fix modules starting with no text, but not hidding.

Start with some "text" in the module's label_, update() will then
update it. Since the text should be different, update() will be able
to show or hide the event_box_. This is to work around the case where
the module start with no text, but the the event_box_ is shown.
2021-05-15 16:38:00 +01:00
dbc06abf18 network: Initialise cidr_ like clearIface() does 2021-05-15 16:38:00 +01:00
4d067619a8 Fix power calculation when battery units are in μA instead of μW 2021-05-15 15:55:38 +01:00
cf3d6545c3 Merge pull request #1101 from Max1Truc/master
fix: incorrect battery percentage on Pinebook Pro
2021-05-11 10:41:38 +02:00
f3a6e2d494 fix: incorrect battery percentage on Pinebook Pro 2021-05-10 21:00:14 +02:00
cdce3e03ea Update meson.build 2021-04-30 14:25:48 +02:00
b25b7d29fc Update spdlog.wrap 2021-04-30 14:25:26 +02:00
71d7596b6f fix: bluetooth status tooltip 2021-04-30 14:23:49 +02:00
06e699c862 Merge pull request #1087 from Synthetica9/multiple-rewrites
rewriteTitle: allow multiple sequential rewrites
2021-04-27 00:00:53 +02:00
a03283d65f rewriteTitle: allow multiple sequential rewrites 2021-04-26 20:26:43 +02:00
ef38061edd Merge pull request #1084 from gabegorelick/battery-discharging-full
[modules/battery] allow format-discharging-full
2021-04-26 09:28:00 +02:00
7e13e26c29 [modules/battery] allow format-discharging-full
`format-discharging-full` has been impossible since #923 made it
impossible to be full and discharging at the same time. This should
fix that by only making `format-charging-full` impossible. Whether
or not that should be allowed is a good question, but beyond the
scope of this change.

Fixes #1031
2021-04-25 22:00:24 -04:00
5f7329f5b9 Merge pull request #1081 from David96/master
[modules/pulseaudio] fix bluetooth class for PipeWire
2021-04-25 14:03:00 +02:00
2213380dc0 [modules/pulseaudio] fix bluetooth class for PipeWire
apparently, pipewire-pulse slightly changed the naming of the sink.
2021-04-25 11:19:35 +02:00
66d8035ed1 Merge pull request #1055 from vrld/feature-rewrite-window-title
Add option to rewrite sway/window title
2021-04-21 14:23:45 +02:00
7cdf178f8d Document changes in manpage
Add section on rewrite rules and extend example
2021-04-21 12:24:47 +02:00
af3c868a5b Catch exception on erroneous rules
std::regex and std::regex_replace may throw an std::regex_error if the
expression or replacement contain errors.

Log this error and carry on with the next rule, so that the title is
shown even if the config contains errors.
2021-04-21 12:24:47 +02:00
b16c8972c7 Add option to rewrite sway/window title
Rewrites window title according to config option "rewrite".
"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. Regex and replacement follow ECMA-script
rules. If no regex matches, the title is left unchanged.

example:
"sway/window": {
  "rewrite": {
    "(.*) - Mozilla Firefox": " $1",
    "(.*) - zsh": " $1",
  }
}
2021-04-21 12:24:47 +02:00
1c9b62de07 Merge pull request #1076 from Scrumplex/add-mpd-volume-status
Implement MPD volume status format template
2021-04-20 09:38:19 +02:00
fc89b01ba6 feat: implement mpd volume format template
Allow the user to show the current volume from MPD status via the
`format` and/or `tooltip-format` configuration options.

The values are provided by libmpdclient and are integers, generally
between 0-100 (without %). Values above 100 are also possible, as mpd
output plugins like `pulse` support volumes above 100%.

Signed-off-by: Sefa Eyeoglu <contact@scrumplex.net>
2021-04-20 08:35:47 +02:00
70e67c5daa Merge pull request #1074 from Anakael/feature/taskbar-ignore-list
[wlr/taskbar] Add ignore-list param
2021-04-18 20:02:14 +02:00
5ad3b6018a Remove exceed protected 2021-04-18 21:37:58 +03:00
ba278985e8 Add ignore-list param to wlr/taskbar 2021-04-18 21:34:29 +03:00
5300461c79 chore: v0.9.7 2021-04-15 21:17:54 +02:00
d0f60c47bf Merge pull request #1070 from jgmdev/cpumodulefix
[Module CPU] fix crash due to empty frequencies.
2021-04-15 21:17:00 +02:00
07f2470e36 Merge pull request #974 from kamushadenes/patch-1
Improve Pulseaudio sink/source separation
2021-04-15 21:09:35 +02:00
f8f1e791a3 [Module CPU] fix crash due to empty frequencies.
On some systems (eg: ARM) the supported frequencies of the CPU are not
properly reported by /proc/cpuinfo so if that fails try to retrieve them
from /sys/devices/system/cpu/cpufreq/policy[0-9]/cpuinfo_[max|min]_freq.
2021-04-15 14:30:29 -04:00
729a4fe37e chore: v0.9.6 2021-04-15 16:09:45 +02:00
97e4b53cf3 Merge pull request #1061 from akheron/multi-battery-status
Use the correct battery status when multiple batteries are present
2021-03-28 19:35:51 +02:00
c850212288 Use the correct battery status when multiple batteries are present 2021-03-28 20:07:35 +03:00
600afaf530 Merge pull request #1037 from Moonlight-Angel/cpu-frequency
Add cpu min/max/avg frequencies
2021-03-25 12:09:42 +01:00
c21dc681c9 Merge pull request #1052 from Logarithmus/fix-sway-language-manpage
meson.build: add missing waybar-sway-language manpage
2021-03-23 14:57:06 +01:00
f4ad5d36ec meson.build: add missing waybar-sway-language manpage 2021-03-23 16:51:08 +03:00
f627fe3a39 Merge pull request #1051 from lunik1/disk-css
Add default styling for disk module
2021-03-23 12:31:52 +01:00
7b6dc33824 Merge pull request #1056 from martin2250/patch-1
Add style for battery state "plugged"
2021-03-23 12:30:50 +01:00
b4ee994515 Add style for battery state "plugged" 2021-03-23 00:26:45 +01:00
b1dd62078f Merge pull request #1002 from nullobsi/master
add length limits for MPD module tags
2021-03-15 09:15:09 +01:00
bf3efdb89c Merge branch 'master' into master 2021-03-14 21:34:25 -07:00
354de5f13f style: add styling to disk module 2021-03-13 15:17:11 +00:00
b4ffb8af45 Merge pull request #1050 from cmovcc/cmovcc/load-values
Fix: CPU load values
2021-03-13 16:11:39 +01:00
a49b12b66b Fix CPU load values 2021-03-12 20:58:51 +01:00
1573e1eb97 change variable instead of substr(len) 2021-02-26 13:29:58 -08:00
9b9daaee6f Merge branch 'master' into master 2021-02-26 13:22:34 -08:00
99643ba2e6 Stub parseCpuFrequencies on *BSD platforms 2021-02-25 09:14:51 +01:00
08ea5ebe1f Add cpu frequency 2021-02-25 09:14:51 +01:00
cb1c7ea12c Merge pull request #1032 from matteodelabre/terminate-custom-on-exit
Terminate custom module scripts on exit
2021-02-23 09:40:05 +01:00
1026100c9d Merge pull request #1035 from alebastr/deferred-output-removal
fix: schedule output destruction on idle callback
2021-02-23 09:39:09 +01:00
943ba3a2da fix: schedule output destruction on idle callback
Defer destruction of bars for the output to the next iteration of the
event loop to avoid deleting objects referenced by currently executed
code.
2021-02-22 18:35:09 -08:00
bfa9f1e69b Merge branch 'master' into master 2021-02-22 09:34:58 -08:00
4d150e9340 Merge pull request #1036 from WhyNotHugo/systemd-reload
Configure systemd.service file to allow reloading
2021-02-19 15:21:15 +01:00
2019028688 Configure systemd.service file to allow reloading
This allows `systemctl --user reload waybar` to reload waybar's config
as expected.
2021-02-19 14:33:38 +01:00
b4728f2e1d Merge branch 'master' into master 2021-02-16 21:51:31 -08:00
d8706af2ea Terminate custom module scripts on exit
(Fixes #358.)

Subprocesses created for custom module scripts were previously left
running when the parent Waybar process exited. This patch sets the
parent-death signal of child processes (PR_SET_PDEATHSIG on Linux,
PROC_PDEATHSIG_CTL on FreeBSD) to SIGTERM.

Caveats:

* This uses Linux-specific or FreeBSD-specific calls. I don’t know if
  this project targets other systems?
* There is a possibility that Waybar exits after calling `fork()`, but
  before calling `prctl` to set the parent-death signal. In this case,
  the child will not receive the SIGTERM signal and will continue to
  run. I did not handle this case as I consider it quite unlikely, since
  module scripts are usually launched only when Waybar starts. Please
  let me know if you think it needs to be handled.

Testing:

* With `htop` open, run Waybar v0.9.5 with a custom module that has an
  `exec` script. Terminate the Waybar process and notice that the
  script’s subprocess stays alive and is now a child of the init
  process.
* Run Waybar with this patch and follow the same steps as above. Notice
  that this time the script’s subprocess terminates when the parent
  exits.
2021-02-12 21:14:46 +01:00
08e19602f7 Merge pull request #1015 from alebastr/rfkill-events
rfkill code refactoring
2021-02-11 10:20:13 +01:00
b12b500bfc Merge branch 'master' into master 2021-02-10 09:39:03 -08:00
e786ea601e fix(rfkill): handle EAGAIN correctly 2021-02-10 08:26:21 -08:00
36da8117c0 Merge pull request #1026 from euclio/idle-inhibit-fix
disable Idle Inhibitor module if unsupported
2021-02-10 10:32:09 +01:00
6d5afdaa5f fix(network): don't block the main thread on rfkill update
Moving rfkill to the main event loop had unexpected side-effects.
Notably, the network module mutex can block all the main thread events
for several seconds while the network worker thread is sleeping.

Instead of waiting for the mutex let's hope that the worker thread
succeeds and schedule timer thread wakeup just in case.
2021-02-09 21:27:22 -08:00
52dd3d2446 refactor(bluetooth): remove interval and timer thread
The timer thread was always reading the same value from Rfkill state.
2021-02-09 21:27:21 -08:00
ecc32ddd18 refactor(bluetooth): remove Bluetooth::status_
The string was always overwritten in `update()`; don't need to store
temporary value in the class.
2021-02-09 21:27:20 -08:00
38c29fc242 refactor(rfkill): poll rfkill events from Glib main loop
Open rfkill device only once per module.
Remove rfkill threads and use `Glib::signal_io` as a more efficient way
to poll the rfkill device.
Handle runtime errors from rfkill and stop polling of the device instead
of crashing waybar.
2021-02-09 21:27:19 -08:00
40f4dc9ecf fix(rfkill): accept events larger than v1 event size
Kernel 5.11 added one more field to the `struct rfkill_event` and broke
unnecessarily strict check in `rfkill.cpp`. According to `linux/rfkill.h`,
we must accept events at least as large as v1 event size and should be
prepared to get additional fields at the end of a v1 event structure.
2021-02-09 21:27:18 -08:00
95a6689077 disable Idle Inhibitor module if unsupported 2021-02-09 18:37:13 -05:00
c5f875dc5f Merge pull request #1027 from alebastr/output-fixes
Fix more issues with duplicated bars
2021-02-09 11:17:16 +01:00
89b5e819a3 fix(client): improve guard from repeated xdg_output.done events
Multiple .done events may arrive in batch. In this case libwayland would
queue xdg_output.destroy and dispatch all pending events, triggering
this callback several times for the same output.

Delete xdg_output pointer immediately on the first event and use the
value as a guard for reentering.
2021-02-08 23:25:58 -08:00
6585381230 fix(client): remove unnecessary wl_output_roundtrip
At this point we're not awaiting any protocol events and flushing
wayland queue makes little sense. As #1019 shows, it may be even harmful
as an extra roundtrip could process wl_output disappearance and delete
output object right from under our code.
2021-02-08 22:30:01 -08:00
f3ce7ff86c Merge pull request #1021 from jgmdev/taskbar-icons
[wlr/taskbar] Check StartupWMClass
2021-02-07 16:52:34 +01:00
e4a65c72dd Added missing 'if' space. 2021-02-07 04:27:16 -04:00
f14a73584f [wlr/taskbar] Added break when matching StartupWMClass is found. 2021-02-07 01:01:57 -04:00
fffb52dd93 [wlr/taskbar] Check StartupWMClass on list returned by g_desktop_app_info_searchi() 2021-02-07 00:50:52 -04:00
71f9ed3099 Merge pull request #1018 from jgmdev/taskbar-icons
[wlr/taskbar] Fix unhandled exception crash when icon name is a path.
2021-02-04 10:05:02 +01:00
e293b89f6b [wlr/taskbar] Removed unnecessary catch statement. 2021-02-04 04:57:08 -04:00
8a284e7c74 [wlr/taskbar] Declared load_icon_from_file() static. 2021-02-03 21:14:04 -04:00
22ed153004 [wlr/taskbar] Fix unhandled exception crash when icon name is a path. 2021-02-03 21:04:10 -04:00
ff9f09a24e Merge pull request #1014 from Moonlight-Angel/disable-auto-back-and-forth
Add a way to configure auto_back_and_forth on Sway workspaces
2021-02-03 09:57:05 +01:00
7eb2a6b709 Add a configuration entry to disable auto_back_and_forth on Sway workspaces 2021-02-02 21:58:26 +01:00
f2e9bb54f0 Merge pull request #1011 from jgmdev/taskbar-icons
[wlr/taskbar] More icon search improvements.
2021-02-02 09:03:35 +01:00
ac6667b1c9 [wlr/taskbar] More icon search improvements.
* Added ~/.local/share prefix to search in user defined apps.
* Add support for apps that don't properly set an id like pamac.
2021-02-02 01:03:28 -04:00
7d78a3aeef Merge pull request #1001 from max-k/master
[sway/window] Add app_id to usable fields in title
2021-02-01 22:23:49 +01:00
aa088721c3 Merge pull request #1008 from nullobsi/label-sizing
improve module sizing options
2021-02-01 22:22:33 +01:00
97f7050d7d Update man pages 2021-02-01 08:34:51 -08:00
e21be3382b Merge pull request #1007 from nullobsi/fullwidth-length
[calendar] CJK locale formatting
2021-02-01 11:15:30 +01:00
72cd753c02 align should use rotate property 2021-02-01 01:44:51 -08:00
c8d7b6fa92 rename fixed-length to min-length 2021-01-31 14:03:49 -08:00
8c70513a24 add common align config property to set text alignment
add fixed-length property to set the fixed width of the label
2021-01-31 13:58:41 -08:00
35062ceb99 Merge branch 'master' into master 2021-01-31 12:01:49 -08:00
f05afb5468 Merge branch 'master' into fullwidth-length 2021-01-31 11:58:12 -08:00
ecba117dc0 remove unnessecary logging 2021-01-31 11:56:25 -08:00
d2a1f41750 Use g_unichar_iswide to properly align calendar on CJK locales 2021-01-31 11:53:53 -08:00
be777b8525 Merge pull request #1006 from jgmdev/taskbar-icons
Improved wlr/taskbar icon search.
2021-01-31 20:47:23 +01:00
3881af4bbe Improved wlr/taskbar icon search. 2021-01-31 15:37:26 -04:00
933e0f5280 Merge pull request #1003 from joshuachp/patch-1
Update waybar-bluetooth.5.scd
2021-01-31 15:44:00 +01:00
149c1c2f1b Update waybar-bluetooth.5.scd
Remove the `status` from the `tooltip-format` example since it will
throw error. Related to #685
2021-01-31 11:37:41 +01:00
6cc3212605 add length limits for MPD module tags 2021-01-30 18:04:59 -08:00
e19aa1d43a [sway/window] Add app_id to usable fields in title 2021-01-30 01:41:45 +01:00
69a366dced Merge pull request #996 from martin2250/master
add power formatter to battery module
2021-01-24 23:33:12 +01:00
c9ef731fd0 Merge pull request #992 from alebastr/990-duplicated-bars-on-output-events
Fix duplicate bars on xdg_output property changes
2021-01-24 23:31:34 +01:00
cd97bdb30f document power formatter in battery module 2021-01-24 21:49:00 +01:00
3bcf390484 add power to battery formatter 2021-01-24 21:39:14 +01:00
7fa1c11833 fix(client): unsubscribe after receiving xdg_output.done event
Ignore any further xdg_output events. Name and description are constant
for the lifetime of wl_output in xdg-output-unstable-v1 version 2 and we
don't need other properties.

Fixes #990.
2021-01-21 08:35:38 -08:00
ab0f2c13af fix(client): attach styles only once
Gdk >= 3.10 has only one GdkScreen. No need to reattach styles on every
output change.
2021-01-21 08:32:44 -08:00
dc38640341 Merge branch 'master' into patch-1 2021-01-18 10:55:40 -03:00
66e5fda418 Merge pull request #964 from Ocisra/master
Add an option to use battery design capacity
2021-01-18 13:48:03 +01:00
e06d603154 Merge pull request #830 from Markaos/battery-custom-tooltip
Allow customization of battery module tooltip
2021-01-18 13:46:57 +01:00
392b0679c9 Merge branch 'master' into master 2021-01-18 12:39:25 +01:00
336cc9f336 . 2021-01-18 12:39:41 +01:00
0bd96f339e typo 2021-01-18 12:38:02 +01:00
ce0bf6269b battery: use timeTo as the default format name 2021-01-18 12:32:51 +01:00
fdaba72974 Merge branch 'master' into battery-custom-tooltip 2021-01-18 12:22:44 +01:00
a2d98ddde8 Merge pull request #842 from rdnetto/config-reloading
Implement support for reloading of config files.
2021-01-18 12:06:25 +01:00
51bfe9eaf6 Merge pull request #881 from olemartinorg/master
Support format-{state} for cpu/disk/memory
2021-01-18 12:02:59 +01:00
a25cf4d188 Merge pull request #891 from danieldg/temp-tooltip
Add "tooltip-format" to temperature module
2021-01-18 12:01:34 +01:00
ede1146ddc Merge pull request #903 from spk/simpleclock
Add simpleclock as fallback when hhdate is not available
2021-01-18 12:00:48 +01:00
b916ed3cae Merge pull request #980 from sjtio/master
add option 'tag-labels' to river/tags
2021-01-18 11:56:37 +01:00
9d5ce45f3b add option tag-labels to river/tags 2021-01-15 01:07:56 +00:00
a7941a00c5 fix missing parentheses 2021-01-12 19:10:34 -03:00
f4ffb21c8c improve sink/source separation
Add additional fields, namely `source_volume` and `source_desc`
Add `tooltip-format`, reverting to default behavior if not specified
Add additional CSS classes, namely `sink-muted` and `source-muted`
2021-01-12 18:51:44 -03:00
29cba22405 Merge pull request #969 from alebastr/wlr-taskbar-fixes
Fix issues in wlr/taskbar
2021-01-11 09:23:40 +01:00
b79301a5bd fix(wlr/taskbar): protocol error when reconnecting outputs
Destroy request is not specified for foreign toplevel manager and it
does not prevent the compositor from sending more events.
Libwayland would ignore events to a destroyed objects, but that could
indirectly cause a gap in the sequence of new object ids and trigger
error condition in the library.

With this commit waybar sends a `stop` request to notify the compositor
about the destruction of a toplevel manager. That fixes abnormal
termination of the bar with following errors:
```
(waybar:11791): Gdk-DEBUG: 20:04:19.778: not a valid new object id (4278190088), message toplevel(n)

Gdk-Message: 20:04:19.778: Error reading events from display: Invalid argument
```
2021-01-08 15:41:48 -08:00
ef9c3ef1cb fix(wlr/taskbar): fix wl_array out-of-bounds access
wl_array->size contains the number of bytes in the array instead of the
number of elements.
2021-01-08 15:28:29 -08:00
1f620828c2 Merge pull request #965 from ofwinterpassed/master
Fixing logic in getIcon
2021-01-03 19:55:33 +01:00
f20dbbbd74 Fixing logic in getIcon 2021-01-03 19:08:06 +01:00
00046d309d add an option to use battery design capacity as a reference for percentage informations 2021-01-03 15:25:19 +01:00
7b7edc9029 Merge pull request #949 from jbeich/ci
CI: add FreeBSD to Actions
2021-01-02 11:56:08 +01:00
bd208fcec6 Merge pull request #956 from AndreasBackx/feature/output-identifier
Added waybar_output.identifier support. #602
2021-01-02 11:52:14 +01:00
f233d27b78 Merge pull request #959 from dorgnarg/fix-section-css-classes
Fix for group module selectors when bar is vertical
2020-12-28 23:15:46 +01:00
42e8667773 Better way of doing it by just moving the original delcarations after everything's for sure been set 2020-12-28 13:44:16 -07:00
c0361e8546 A hopeful fix to the module section classes when the bar is vertical 2020-12-28 13:34:59 -07:00
3fbbbf8541 Removed redundant log line. 2020-12-25 23:31:29 +00:00
e5684c6127 Separated name and description setup and moved bar creation to done callback. 2020-12-25 23:03:01 +00:00
0233e0eeec Added waybar_output.identifier support.
Resolves #602.
2020-12-25 20:54:38 +00:00
7fbd3657e8 Merge pull request #955 from ilpianista/bugfix/revert-pipewire-pulse
Revert "Fix waybar-pulseaudio with pipewire-pulse"
2020-12-25 17:50:01 +01:00
005af7f7b7 Revert "Fix waybar-pulseaudio with pipewire-pulse"
This reverts commit 0d03c1d4da.
2020-12-25 17:37:21 +01:00
94f8f74f51 Merge pull request #953 from Alexays/revert-901-patch-1
Revert "Replace lowercase "k" with uppercase "K" to make it look more consistent"
2020-12-25 09:28:22 +01:00
f391186749 Revert "Replace lowercase "k" with uppercase "K" to make it look more consistent" 2020-12-25 09:28:05 +01:00
e4340a7536 CI: add FreeBSD to Actions 2020-12-23 20:40:44 +00:00
dd2792b204 Merge pull request #937 from ilpianista/bugfix/pipewire-pulse
Fix waybar-pulseaudio with pipewire-pulse
2020-12-23 21:39:40 +01:00
08ee5385ec Merge pull request #942 from danielrainer/patch-1
Fix typo in states man page
2020-12-23 21:37:47 +01:00
73eb517b86 Merge pull request #946 from narilth/sway-solo-css-fix
Fix Sway #waybar.solo CSS rule applying on split
2020-12-23 21:37:25 +01:00
4b29aef048 chore: v0.9.5 2020-12-23 21:33:40 +01:00
cb7baee045 Fixed compile error 2020-12-18 18:17:17 -05:00
85ca5027f4 Fix Sway #waybar.solo CSS rule applying on split
This error occurs because of an incorrect assumption that the size of
the list of nodes that contains the focused window is the number of
windows in a workspace.

The windows in a workspace are stored as a tree by Sway, rather than a
list, so the number of windows has to be found by counting the leaves of
a workspace tree.
2020-12-18 18:14:14 -05:00
50ecc97284 Fix typo 2020-12-12 23:21:17 +01:00
d382734698 Merge branch 'master' into bugfix/pipewire-pulse 2020-12-09 18:14:22 +01:00
f91dc7fb6e Merge pull request #935 from alebastr/ignore-emulated-scroll-events
fix(sway/workspaces): ignore emulated scroll events
2020-12-05 21:02:24 +01:00
0d03c1d4da Fix waybar-pulseaudio with pipewire-pulse 2020-12-04 23:51:10 +01:00
68b6136989 fix(sway/workspaces): ignore emulated scroll events
GDK Wayland backend can emit two events for mouse scroll: one is a
GDK_SCROLL_SMOOTH and the other one is an emulated scroll event with
direction. We only receive emulated events on a window, thus it is not
possible to handle these in a module and stop propagation.

Ignoring emulated events should be safe since those are duplicates of
smooth scroll events anyways.

Fixes #386
2020-12-04 01:09:42 -08:00
930bb4ba97 Merge pull request #934 from l3nkz/wlr-taskbar-updates
Update to the latest version of the foreign toplevel manager protocol
2020-12-04 09:37:07 +01:00
18f129a712 Spit out a warning when trying to set/unset fullscreen without server supporting it
Previously we only checked when connecting to the server whether it had
the minimum required version but didn't act accordingly in the various
functions that use the functionality of later versions. If there were a
server in the wild, that actually would not have this functionality,
there would have been a crash. Fix this by checking the version before
using the functionality and gracefully abort it.
2020-12-04 08:04:02 +01:00
bb60e68b9d Update to the latest version of the foreign toplevel manager protocol
There was an update the of the toplevel manager protocol. Unfortunately,
there are no new interesting updates with regard to the taskbar
implementation. Nonetheless, update the protocol xml files to the latest
version so that the implementation is up-to-date.

While being there, also change the debug warning that is shown when
there is a version mismatch between the server and client version of the
protocol.
2020-12-04 08:03:43 +01:00
a70468a2ea Merge pull request #932 from pedrocr/speedup-battery-updates
Don't update battery list on every update
2020-12-03 11:35:51 +01:00
09c89bcd20 Don't update battery list on every update
Speedup battery state update by only updating the battery list when we
get a CREATE/DELETE event in the directory or whenever we do a full
refresh on the interval.
2020-12-03 09:52:33 +00:00
cc365a8175 Merge pull request #923 from pedrocr/fix-battery-calculations
Simplify and improve battery state calculations
2020-12-02 14:35:56 +01:00
ff0d3292a4 Merge pull request #844 from tchebb/add-sway-module-margins
style: add 4px margins to window and workspaces modules
2020-12-02 14:34:45 +01:00
1fe0bcacc0 style: add 4px margins to window and workspaces modules
These modules, unlike others, have no horizontal margins by default.
This means that they'll appear uncomfortably close together in any
config that puts them side-by-side. In general, the default style should
make configs with any module ordering look good. Add the same 4px
horizontal margins that other module have to these.

To preserve the current default appearance, exempt the workspace module
from a margin on the appropriate side when it's the leftmost or
rightmost module on the bar.
2020-12-02 05:12:48 -08:00
f74c22e851 Merge pull request #930 from tchebb/fix-compiler-warnings
Fix a few compiler warnings
2020-12-01 09:09:02 +01:00
1ea662a08d Merge pull request #928 from tchebb/fix-uninitialized-value
clock: initialize cached date
2020-12-01 09:08:19 +01:00
881bb62f88 Merge pull request #927 from tchebb/log-gtk-tree
Add debug log message to print each bar's widget tree
2020-12-01 09:07:33 +01:00
f6ef8b41df Merge pull request #929 from tchebb/update-fmt
Update fmt subproject to 7.1.3
2020-12-01 09:06:55 +01:00
c1640ed16c Merge pull request #931 from jtheoof/jtheoof/fix/service
fix(systemd): restart when service fails
2020-12-01 09:05:23 +01:00
dd596a5c6c fix(systemd): restart when service fails
The current service doesn't play too nice with Sway when it is started
from [sway service](https://github.com/xdbob/sway-services).

Waybar is started before the system has a display.

```
Nov 30 22:11:23 ansan waybar[1352]: Unable to init server: Could not
connect: Connection refused
Nov 30 22:11:23 ansan waybar[1352]: cannot open display:
Nov 30 22:11:23 ansan systemd[1306]: waybar.service: Main process
exited, code=exited, status=1/FAILURE
Nov 30 22:11:23 ansan systemd[1306]: waybar.service: Failed with result
'exit-code'.
```

Restarting the service after the system has been initialized works nicely,
so this restart rule should do the trick without tinkering with the
target.
2020-11-30 23:24:30 -05:00
29f78e0426 Fix a few compiler warnings
There was one uninitialized value warning and two mismatched-sign
compare warnings. They both appear valid, the first occurring when MPD's
"format-stopped" contains {songPosition} or {queueLength} and the second
occurring when the clock's "timezones" array is more than 2 billion
items long (not likely, I admit). Fix both issues.
2020-11-30 18:07:22 -08:00
407bf27401 Update fmt subproject to 7.1.3
There is no particular change in this update that we require. However,
our previous version, 5.3.0, is nearly two years old, so it seems
prudent to pull in all the upstream fixes that have been made since
then.

New wrap file taken from https://wrapdb.mesonbuild.com/fmt and modified
to download from GitHub as per commit 99dde1aff8 ("Download patch
files from Github instead of wrapdb").
2020-11-30 17:35:02 -08:00
85df7ce2da Add debug log message to print each bar's widget tree
This is very useful when writing CSS that affects more than just a
single widget. Pass `-l debug` to enable debug logging and show this
information.

Example output:

    [2020-11-30 12:38:51.141] [debug] GTK widget tree:
    window#waybar.background.bottom.eDP-1.:dir(ltr)
      decoration:dir(ltr)
      box.horizontal:dir(ltr)
        box.horizontal.modules-left:dir(ltr)
          widget:dir(ltr)
            box#workspaces.horizontal:dir(ltr)
          widget:dir(ltr)
            label#mode:dir(ltr)
          widget:dir(ltr)
            label#window:dir(ltr)
        box.horizontal.modules-center:dir(ltr)
        box.horizontal.modules-right:dir(ltr)
          widget:dir(ltr)
            box#tray.horizontal:dir(ltr)
          widget:dir(ltr)
            label#idle_inhibitor:dir(ltr)
          widget:dir(ltr)
            label#pulseaudio:dir(ltr)
          widget:dir(ltr)
            label#network:dir(ltr)
          widget:dir(ltr)
            label#cpu:dir(ltr)
          widget:dir(ltr)
            label#memory:dir(ltr)
          widget:dir(ltr)
            label#temperature:dir(ltr)
          widget:dir(ltr)
            label#backlight:dir(ltr)
          widget:dir(ltr)
            label#battery:dir(ltr)
          widget:dir(ltr)
            label#clock:dir(ltr)
2020-11-30 17:23:02 -08:00
ad40511358 Update spdlog subproject to 1.8.1
Among other changes, this adds spdlog::should_log(), which lets us
easily determine whether a log message will be printed so that we can
avoid extra computation when unnecessary.

New wrap file taken from https://wrapdb.mesonbuild.com/spdlog and
modified to download from GitHub as per commit 99dde1aff8 ("Download
patch files from Github instead of wrapdb").
2020-11-30 17:11:33 -08:00
e8dbdee238 Make spdlog use the same version of fmt we use
spdlog bundles a version of fmt. However, we also depend on and use fmt
directly. If we don't tell spdlog not to use its bundled version, we end
up with two versions of fmt in our include path, since both libraries
are header-only, meaning any slight API mismatches will cause build
failures and undesired behavior.

We seem to have gotten lucky so far, but I ran into all sorts of issues
when I tried to update to a newer version of spdlog. This change
prevents them.
2020-11-30 17:04:19 -08:00
c784e8170e clock: initialize cached date
We are currently using this value once before it's initialized, since we
check it before we set it in Clock::calendar_text(). This was caught by
Valgrind, producing the following error:

    ==8962== Conditional jump or move depends on uninitialised value(s)
    ==8962==    at 0x138285: date::operator==(date::year_month_day const&, date::year_month_day const&) (date.h:2793)
    ==8962==    by 0x135F11: waybar::modules::Clock::calendar_text[abi:cxx11](waybar::modules::waybar_time const&) (clock.cpp:111)
    ==8962==    by 0x13587C: waybar::modules::Clock::update() (clock.cpp:62)
    ==8962==    by 0x156EFA: waybar::Bar::getModules(waybar::Factory const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}::operator()() const (bar.cpp:577)
    ==8962==    by 0x157F39: sigc::adaptor_functor<waybar::Bar::getModules(waybar::Factory const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}>::operator()() const (adaptor_trait.h:256)
    ==8962==    by 0x157D94: sigc::internal::slot_call0<waybar::Bar::getModules(waybar::Factory const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::{lambda()#1}, void>::call_it(sigc::internal::slot_rep*) (slot.h:136)
    ==8962==    by 0x5177B21: Glib::DispatchNotifier::pipe_io_handler(Glib::IOCondition) (in /usr/lib/libglibmm-2.4.so.1.3.0)
    ==8962==    by 0x517DB5B: Glib::IOSource::dispatch(sigc::slot_base*) (in /usr/lib/libglibmm-2.4.so.1.3.0)
    ==8962==    by 0x5188B96: Glib::Source::dispatch_vfunc(_GSource*, int (*)(void*), void*) (in /usr/lib/libglibmm-2.4.so.1.3.0)
    ==8962==    by 0x5CBC913: g_main_context_dispatch (in /usr/lib/libglib-2.0.so.0.6600.2)
    ==8962==    by 0x5D107D0: ??? (in /usr/lib/libglib-2.0.so.0.6600.2)
    ==8962==    by 0x5CBB120: g_main_context_iteration (in /usr/lib/libglib-2.0.so.0.6600.2)

Initialize the value to prevent the error.
2020-11-30 12:49:48 -08:00
31a4aff1f8 Don't show battery estimate at 0
If we think we're done might as well not show 0h 0min as the estimate
and just not show anything.
2020-11-27 14:23:37 +00:00
89ca155c43 Support hotplugging of batteries
Refresh the list of batteries on update to handle hotplug correctly.
Probably fixes #490.
2020-11-27 13:56:04 +00:00
908fa2c6c2 Make the battery full-at go to 100%
full-at was capped at the value instead of allowing the battery to show
100% when you were at the full-at value. Uncapping makes more sense as
it makes the full-at value the new 100% and the scale goes down from
there. Whereas before the battery would stay at the full-at value until
it went down enough which is unrealistic.
2020-11-27 11:02:11 +00:00
f45d582957 Always mark battery as full at 100%
Since we're now clamping at 100% and rounding, mark as full at that
point. Some batteries will stay in charging state for a long time while
stuck at the same charge level. Just mark them as full to not be
confusing.
2020-11-27 11:02:11 +00:00
eb3f4216d4 Show battery state as rounded number
Round the battery charge state so that 99.9% shows as 100%.
2020-11-27 11:02:11 +00:00
e0cdcb6e30 Handle charging above 100% gracefully
When calibrating a battery it's possible to go above 100%. Handle that
gracefully by just presenting the battery as full and 100%.
2020-11-27 11:02:11 +00:00
a7056f7cce Calculate battery state from just energy values
The energy values are all that's needed to calculate the battery state.
Using other values for the total capacity results in broken results in
some cases. This matches the output of TLP and i3status, while also
being more straightforward.
2020-11-27 11:02:11 +00:00
14a6cec6d1 Merge pull request #924 from alebastr/build-fixes
Build fixes
2020-11-27 09:01:50 +01:00
3b576ae12d Add "tooltip-format" to temperature module 2020-11-26 20:23:19 -05:00
2695985da0 fix: compilation error with gcc 11
../src/modules/network.cpp:22:6: error: ‘optional’ in namespace ‘std’ does not name a template type
   22 | std::optional<unsigned long long> read_netstat(std::string_view category, std::string_view key) {
      |      ^~~~~~~~
../src/modules/network.cpp:7:1: note: ‘std::optional’ is defined in header ‘<optional>’; did you forget to ‘#include <optional>’?
    6 | #include "util/format.hpp"
  +++ |+#include <optional>
    7 | #ifdef WANT_RFKILL
2020-11-26 15:42:44 -08:00
85e00b2aab fix: build fails with meson < 0.53.0
meson.build:12:0: ERROR: Module "fs" does not exist

Fixes #909
2020-11-26 15:40:24 -08:00
05b12602d4 fix: don't check against nullptr 2020-11-26 15:16:55 +01:00
374d5ae5a1 fix: check get_icon return non nullpt 2020-11-26 15:10:33 +01:00
fd11711673 Merge pull request #920 from Arnaudv6/patch-2
update actions on taskbar man page
2020-11-22 13:09:28 +01:00
8282385074 update actions on taskbar man page 2020-11-22 13:06:46 +01:00
ef7638d45a Merge pull request #918 from Arnaudv6/patch-1
add minimize-raise() action
2020-11-22 11:08:16 +01:00
d8dafa7ecc add minimize-raise() action 2020-11-18 20:12:07 +01:00
faacd76f62 Merge pull request #892 from alebastr/layer-surfaces-v3
Refactor layer surface implementations (again)
2020-11-02 10:17:57 +01:00
c21e0f6cf3 Merge pull request #906 from JordanL2/master
Fix for syncing idle inhibitor across outputs
2020-11-02 10:16:24 +01:00
9785a89013 Making active a bool 2020-11-01 18:25:41 +00:00
b015836e7b Ensure style class is removed from all IdleInhibitor instances by moving it to update(). 2020-11-01 18:17:51 +00:00
a9dae931c7 Renaming idle_inhibitor_modules and idle_inhibitor_status to shorter, more convenient names. 2020-11-01 17:14:05 +00:00
071cb86b45 Moving idle inhibitor shared stuff out of Client and into idle_inhibitor module as static members. 2020-11-01 17:09:48 +00:00
c6743988d3 Removing 'click_param' as it is no longer used. 2020-11-01 16:03:39 +00:00
bb33427f65 Making idle_inhibitor_ private and initialised in constructor, as it was before. 2020-11-01 13:38:58 +00:00
4889e655eb Since idle_inhibitor's have a surface, we should have one for each inhibitor module. Therefore, the status is stored on the Client, and all modules create or destroy their inhibitors depending on Client's idle_inhibitor_status. Also, when modules are destroyed they remove themselves from Client's idle_inhibitor_modules. 2020-11-01 13:33:28 +00:00
aa4fc3dd29 Idle inhibitor toggle no longer update all modules - a list of idle inhibitors is maintained on the Client. 2020-10-31 17:30:25 +00:00
188611a767 Merge from master 2020-10-31 16:37:20 +00:00
4872091442 Draft fix for syncing idle inhibitor across outputs. The idle_inhibitor surface has been moved to Client, all instances of idle inhibitor module now use one surface between them. Any time an idle inhibitor is clicked, currently it force updates ALL modules on all outputs, this needs work. 2020-10-31 16:31:27 +00:00
5600783151 Merge pull request #905 from JordanL2/master
Tooltips no longer completely break if a custom module updates too frequently
2020-10-31 14:04:41 +01:00
abe1fa5bd4 Custom module - only call label_.set_tooltip_markup if tooltip markup has actually changed - fixes tooltips not appearing at all if a custom module is updating too frequently. 2020-10-31 12:21:51 +00:00
96d965fe04 Add simpleclock as fallback when hhdate is not available
ref https://github.com/Alexays/Waybar/issues/668
2020-10-29 19:40:28 +01:00
9c566564e1 fix(bar): address some of RawSurfaceImpl resizing issues 2020-10-28 08:22:26 -07:00
fc5906dbd4 feat(bar): change layer to bottom when hidden
Invisible bar on a `top` layer would still intercept pointer events and
stop them from reaching windows below. Always changing the layer to
to `bottom` along with making bar invisible would prevent that.
2020-10-28 08:18:49 -07:00
fe3aeb36c5 refactor(bar): wrap layer_surface pointer in unique_ptr 2020-10-28 08:15:02 -07:00
591a417b7d fix(bar): rework surface commit calls for RawSurfaceImpl
wayland log shows that some changes were committed twice and some
weren't committed until the next redraw.
2020-10-28 08:14:57 -07:00
d4d35e6b2b chore(subprojects): update gtk-layer-shell to 0.4.0 2020-10-28 08:08:04 -07:00
f97de599dd refactor: header cleanup
Replace a couple of header includes with forward declarations.
2020-10-28 08:08:03 -07:00
f01996ae99 fix(bar): CamelCase SurfaceImpl method names 2020-10-28 08:07:40 -07:00
7735c80d0e refactor(bar): Split GLS and raw layer-shell implementations
Extract two surface implementations from the bar class: GLSSurfaceImpl
and RawSurfaceImpl. This change allowed to remove _all_ surface type
conditionals and significantly simplify the Bar code.

The change also applies PImpl pattern to the Bar, allowing to remove
some headers and fields from `bar.hpp`.
2020-10-28 07:53:37 -07:00
2b3d7be9cb feat(bar): let gtk-layer-shell manage exclusive zone
Previous attempts to use auto exclusive zone from gtk-layer-shell failed
because gls was expecting real booleans (`TRUE`/`FALSE`) as set_anchor
arguments. With that being fixed, gtk_layer_auto_exclusive_zone_enable
makes gls handle everything related to the bar resizing.

The only remaining purpose of onConfigureGLS is to log warnings and bar
size changes; gtk-layer-shell code path no longer needs saved width_ or
height_ values.
2020-10-28 07:53:32 -07:00
9fa2cc45d2 Merge pull request #901 from 1sixth/patch-1
Replace lowercase "k" with uppercase "K" to make it look more consistent
2020-10-28 13:53:15 +01:00
7a0c0ca613 replace lowercase "k" with uppercase "K"
Other units are all uppercased, so using an uppercased "K" makes it look more consistent (especially when {bandwidthUpBits} or something like that is used).
2020-10-28 19:39:50 +08:00
48a8dbece9 Merge pull request #898 from alebastr/fix-globals-versions
fix(wlr/taskbar): do not bind to unsupported protocol versions
2020-10-25 20:43:18 +01:00
67d54ef3d5 fix(wlr/taskbar): do not bind to unsupported protocol versions
It's not allowed to bind to a higher version of a wayland protocol than
supported by the client. Binding wlr-foreign-toplevel-manager-v1 v3 to
a generated code for v2 causes errors in libwayland due to a missing
handler for `zwlr_foreign_toplevel_handle_v1.parent` event.
2020-10-25 10:26:44 -07:00
d5fa20dd33 Merge pull request #895 from Flakebi/mpd
Fix various mpd bugs
2020-10-24 10:47:14 +02:00
be3f47b374 Fix various mpd bugs
- Add elapsedTime and totalTime to tooltip format arguments
- Catch format exceptions and print error
- Copy mpd connection error message before it gets freed
- Update display after connection to mpd was lost
2020-10-23 21:13:20 +02:00
9ea13e790d Merge pull request #879 from niktob560/sway-language-module
Feature: created sway language submodule
2020-10-20 12:43:26 +02:00
f13f49ccb5 Merge branch 'master' into sway-language-module 2020-10-20 12:22:22 +03:00
2cc00ab853 Merge branch 'sway-language-module' of https://github.com/niktob560/Waybar into sway-language-module 2020-10-20 12:21:38 +03:00
ed402d7583 feature: language submodule - created man page 2020-10-20 12:20:58 +03:00
acf990743e Merge pull request #888 from jbenden/mpd-password
mpd: support password protected MPD
2020-10-20 09:06:32 +02:00
ebdeb86703 feat(swaybar-ipc): handle visibility_by_modifier update 2020-10-19 19:35:55 -07:00
bc13453155 feat(swaybar-ipc): handle mode update 2021-09-15 22:39:51 +07:00
23e5181cac feat(swaybar-ipc): add swaybar IPC client 2020-10-19 19:34:48 -07:00
452dcaa5d3 feat(client): store bar_id argument 2021-11-19 20:28:41 -08:00
5905078e56 doc: document mode option of the bar config 2021-11-19 21:02:29 -08:00
52361ed360 refactor(bar): make setVisible switch between "default" and "invisible" modes 2021-11-21 11:00:57 -08:00
87b43c2171 feat(bar): attach CSS class mode-{mode} to window when setting mode 2021-11-19 20:02:57 -08:00
ae88d7d8dc feat(bar): use "default" mode to store global options
Read `layer`, `exclusive`, `passthrough` into a special mode "default".
Drop `overlay` layer hacks, as it's easier to use `"mode": "overlay"`
for the same result.
2021-11-19 19:31:41 -08:00
6d2ba7a75b feat(bar): store modes as a map of presets
This allows to apply the mode atomically and adds possibility of
defining custom modes (to be implemented).
2021-11-19 19:29:51 -08:00
03a641ed83 feat(bar): support swaybar mode for configuring window
Use `mode` (`waybar::Bar::setMode`) as a shorthand to configure bar
visibility, layer, exclusive zones and input event handling in the same
way as `swaybar` does.
See `sway-bar(5)` for a description of available modes.
2021-09-15 22:35:50 +07:00
3e2197a82a test(util): add tests for SafeSignal
Add a fixture for writing tests that require interaction with Glib event
loop and a very basic test for SafeSignal.
2020-12-28 17:28:03 -08:00
79883dbce4 feat(util): optimize SafeSignal for events from the main thread 2020-12-28 17:31:23 -08:00
8a0e76c8d8 fix(util): avoid creating temporary functor for each event 2020-10-19 18:42:25 -07:00
285a264aae feat(util): SafeSignal class for cross-thread signals with arguments
Implement a wrapper over Glib::Dispatcher that passes the arguments to
the signal consumer via synchronized `std::queue`.
Arguments are always passed by value and the return type of the signal
is expected to be `void`.
2020-12-28 17:26:55 -08:00
587eb5fdb4 mpd: support password protected MPD
- Add MPD module option `password`, and document it.
- Add logic to send the password, directly after connecting to
  MPD.

Fixes: #576
Signed-off-by: Joseph Benden <joe@benden.us>
2020-10-19 11:54:36 -07:00
f151d435a8 Merge pull request #887 from jbenden/jbenden/mpd-module
mpd: revamped to event-driven, single-threaded v2
2020-10-19 09:05:54 +02:00
8f961ac397 mpd: revamped to event-driven, single-threaded
Fix MPD connection issues by converting/rewriting module into a
state-machine driven system. It is fully single-threaded and uses
events for transitioning between states. It supports all features
and functionality of the previous MPD module.

Signed-off-by: Joseph Benden <joe@benden.us>
2020-10-18 10:37:57 -07:00
cf5db8f663 Merge pull request #886 from Alexays/revert-877-jbenden/mpd-module
Revert "mpd: revamped to event-driven, single-threaded"
2020-10-18 10:45:44 +02:00
54beabb9dc Revert "mpd: revamped to event-driven, single-threaded" 2020-10-18 10:45:31 +02:00
41752ad5a2 Merge pull request #877 from jbenden/jbenden/mpd-module
mpd: revamped to event-driven, single-threaded
2020-10-18 10:39:12 +02:00
8349316fcd Merge branch 'master' into sway-language-module 2020-10-12 13:31:39 +03:00
4229e9b2ca Implemented format-{state} for cpu/disk/memory 2020-10-12 02:05:26 +02:00
5e86014443 Merge pull request #825 from Anakael/taskbar/remove-trim
Remove trim usage in format
2020-10-11 23:06:51 +02:00
d6381eeaff Merge branch 'master' into taskbar/remove-trim 2020-10-11 23:06:32 +02:00
45f7f9b07a Merge branch 'master' into config-reloading 2020-10-11 23:00:25 +02:00
6dc1892494 Merge pull request #880 from ChilloManiac/master
added module group selectors for styling
2020-10-11 22:58:09 +02:00
e9b2d275c8 added module group selectors for styling 2020-10-11 22:36:30 +02:00
7b78a29f3f Merge pull request #843 from tchebb/align-workspace-text
style(workspaces): align text with other modules
2020-10-11 14:40:45 +02:00
f270d317bb Merge pull request #869 from lrhel/master
Add format-icons for workspace's name entry in sway/workspaces module
2020-10-11 14:39:39 +02:00
cc3acf8102 feature: created sway language submodule; added styles & config part for a sway language submodule 2020-10-10 19:09:18 +03:00
21fdcf41c3 mpd: revamped to event-driven, single-threaded
Fix MPD connection issues by converting/rewriting module into a
state-machine driven system. It is fully single-threaded and uses
events for transitioning between states. It supports all features
and functionality of the previous MPD module.

Signed-off-by: Joseph Benden <joe@benden.us>
2020-10-08 16:43:22 -07:00
bcb63b8ccb Merge pull request #849 from ericonr/sndio
Add sndio module.
2020-10-04 20:51:00 +02:00
22e46ea6cc sndio: Add reconnection support. 2020-10-04 14:59:20 -03:00
aa625f5196 .travis.yml: add sndio to FreeBSD run.
Also add necessary environment variables and move to /latest, which has
sndio-1.7.0.
2020-10-04 02:54:57 -03:00
1f66b06f93 Dockerfiles/alpine: add sndio-dev. 2020-10-04 02:54:57 -03:00
e4427cb017 sndio: Add module.
- can control sndio: change volume, toggle mute
- appearance is somewhat dynamic: takes muted status into account
- uses polling inside sleeper thread to update values
- uses sioctl_* functions, requires sndio>=1.7.0.
2020-10-04 02:54:57 -03:00
93afe5113a Merge pull request #870 from minijackson/add-global-config-directory
Add back unprefixed global config directory
2020-10-02 20:17:06 +02:00
73681a30e5 man: add the prefixed path were config is loaded 2020-09-29 22:31:28 +02:00
e9b5be9adb fix: add global /etc/xdg/waybar back. fixes #714 2020-09-29 22:28:39 +02:00
83d679bf72 Add format-icons for workspace's name entry 2020-09-26 23:06:12 +00:00
b9f83dc77d Merge pull request #868 from danieldg/fix-backward-forward
Fix "on-click-backward" when "on-click-forward" is not present
2020-09-26 22:29:03 +02:00
7ba14c2097 Fix "on-click-backward" when "on-click-forward" is not present 2020-09-26 15:55:06 -04:00
3014082ba2 Merge pull request #862 from xenrox/disk-state
Add state to disk module
2020-09-23 14:18:12 +02:00
12016d35bb disk module: add state for percentage_used 2020-09-23 14:01:25 +02:00
1b22e2b320 style(workspaces): align text with other modules
Currently, the bottom border on workspace buttons eats into the box size
and causes the text to sit higher than in other modules. This is ugly
when there are other modules (like the window title) right next to the
workspace module. To fix the issue, create the bottom border using an
inset box-shadow, which doesn't affect the box's content sizing.
2020-08-29 22:56:26 -07:00
943b6bc51b Implement support for reloading of config files.
Fixes #759.
2020-08-28 22:34:24 +10:00
9b51094743 Merge branch 'master' into battery-custom-tooltip 2020-08-20 13:52:25 +02:00
8fb54f47ea battery: allow custom tooltip format 2020-08-19 23:13:03 +02:00
b54fb24745 Remove trim usage in format
Some clang-tidy fixes
2020-08-16 15:54:21 +03:00
22409d27c5 Fix docs typos
Add removing buttons
Adjust handling multiple outputs.
2020-08-11 00:28:56 +03:00
42b6c089f3 Add docs and adjust sorting 2020-08-08 00:09:35 +03:00
0ad29a5960 Finish base implementation 2020-08-07 23:46:47 +03:00
4c251578e9 Add formatting and states handling 2020-08-07 02:45:08 +03:00
7638f5c595 Add base name representation 2020-08-06 01:42:57 +03:00
edd4d8ee11 Finish implement wlr 2020-08-05 23:10:08 +03:00
2b11b7ef8c Base wlr impl (Manager, Group) 2020-08-05 02:17:38 +03:00
94a4d41a65 disk: make used calculation match df(1) output
Substract space only available to superuser as well.
2020-05-26 07:47:08 +00:00
210 changed files with 15389 additions and 4429 deletions

View File

@ -1,6 +1,5 @@
---
BasedOnStyle: Google
AlignConsecutiveDeclarations: true
BinPackArguments: false
AlignConsecutiveDeclarations: false
ColumnLimit: 100
...

29
.github/workflows/freebsd.yml vendored Normal file
View File

@ -0,0 +1,29 @@
name: freebsd
on: [ push, pull_request ]
jobs:
clang:
# Run actions in a FreeBSD VM on the macos-12 runner
# https://github.com/actions/runner/issues/385 - for FreeBSD runner support
# https://github.com/actions/virtual-environments/issues/4060 - for lack of VirtualBox on MacOS 11 runners
runs-on: macos-12
steps:
- uses: actions/checkout@v2
- name: Test in FreeBSD VM
uses: vmactions/freebsd-vm@v0
with:
mem: 2048
usesh: true
prepare: |
export CPPFLAGS=-isystem/usr/local/include LDFLAGS=-L/usr/local/lib # sndio
sed -i '' 's/quarterly/latest/' /etc/pkg/FreeBSD.conf
pkg install -y git # subprojects/date
pkg install -y catch evdev-proto gtk-layer-shell gtkmm30 jsoncpp \
libdbusmenu libevdev libfmt libmpdclient libudev-devd meson \
pkgconf pulseaudio scdoc sndio spdlog wayland-protocols upower \
libinotify
run: |
meson build -Dman-pages=enabled
ninja -C build
meson test -C build --no-rebuild --print-errorlogs --suite waybar

14
.github/workflows/lint.yml vendored Normal file
View File

@ -0,0 +1,14 @@
name: Linter
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: DoozyX/clang-format-lint-action@v0.13
with:
source: '.'
extensions: 'h,cpp,c'
clangFormatVersion: 12

28
.github/workflows/linux.yml vendored Normal file
View File

@ -0,0 +1,28 @@
name: linux
on: [push, pull_request]
jobs:
build:
strategy:
matrix:
distro:
- alpine
- archlinux
- debian
- fedora
- opensuse
- gentoo
runs-on: ubuntu-latest
container:
image: alexays/waybar:${{ matrix.distro }}
steps:
- uses: actions/checkout@v2
- name: configure
run: meson -Dman-pages=enabled build
- name: build
run: ninja -C build
- name: test
run: meson test -C build --no-rebuild --print-errorlogs --suite waybar

View File

@ -1,36 +0,0 @@
language: cpp
services:
- docker
git:
submodules: false
env:
- distro: debian
- distro: archlinux
- distro: fedora
- distro: alpine
- distro: opensuse
before_install:
- docker pull alexays/waybar:${distro}
- find . -type f \( -name '*.cpp' -o -name '*.h' \) -print0 | xargs -r0 clang-format -i
script:
- echo FROM alexays/waybar:${distro} > Dockerfile
- echo ADD . /root >> Dockerfile
- docker build -t waybar .
- docker run waybar /bin/sh -c "cd /root && meson build -Dman-pages=enabled && ninja -C build"
jobs:
include:
- os: freebsd
compiler: clang
env:
before_install:
- sudo pkg install -y gtk-layer-shell gtkmm30 jsoncpp libdbusmenu
libfmt libmpdclient libudev-devd meson pulseaudio scdoc spdlog
script:
- meson build -Dman-pages=enabled
- ninja -C build

View File

@ -2,4 +2,4 @@
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 scdoc
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

View File

@ -1,6 +1,6 @@
# vim: ft=Dockerfile
FROM archlinux/base:latest
FROM archlinux:base-devel
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
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

View File

@ -3,5 +3,5 @@
FROM debian:sid
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 && \
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 clean

View File

@ -1,7 +1,12 @@
# vim: ft=Dockerfile
FROM fedora:32
FROM fedora:latest
RUN dnf install sway meson git libinput-devel wayland-devel wayland-protocols-devel pugixml-devel egl-wayland-devel mesa-libEGL-devel mesa-libGLES-devel mesa-libgbm-devel libxkbcommon-devel libudev-devel pixman-devel gtkmm30-devel jsoncpp-devel scdoc -y && \
dnf group install "C Development Tools and Libraries" -y && \
RUN dnf install -y @c-development git-core meson scdoc 'pkgconfig(date)' \
'pkgconfig(dbusmenu-gtk3-0.4)' 'pkgconfig(fmt)' 'pkgconfig(gdk-pixbuf-2.0)' \
'pkgconfig(gio-unix-2.0)' 'pkgconfig(gtk-layer-shell-0)' 'pkgconfig(gtkmm-3.0)' \
'pkgconfig(jsoncpp)' 'pkgconfig(libinput)' 'pkgconfig(libmpdclient)' \
'pkgconfig(libnl-3.0)' 'pkgconfig(libnl-genl-3.0)' 'pkgconfig(libpulse)' \
'pkgconfig(libudev)' 'pkgconfig(pugixml)' 'pkgconfig(sigc++-2.0)' 'pkgconfig(spdlog)' \
'pkgconfig(wayland-client)' 'pkgconfig(wayland-cursor)' 'pkgconfig(wayland-protocols)' 'pkgconfig(xkbregistry)' && \
dnf clean all -y

11
Dockerfiles/gentoo Normal file
View File

@ -0,0 +1,11 @@
# vim: ft=Dockerfile
FROM gentoo/stage3:latest
RUN export FEATURES="-ipc-sandbox -network-sandbox -pid-sandbox -sandbox -usersandbox" && \
emerge --sync && \
eselect news read --quiet new 1>/dev/null 2>&1 && \
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 \
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

View File

@ -3,5 +3,7 @@
FROM opensuse/tumbleweed:latest
RUN zypper -n up && \
zypper addrepo https://download.opensuse.org/repositories/X11:Wayland/openSUSE_Tumbleweed/X11:Wayland.repo | echo 'a' && \
zypper -n refresh && \
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 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

View File

@ -16,5 +16,8 @@ install: build
run: build
./build/waybar
debug-run: build-debug
./build/waybar --log-level debug
clean:
rm -rf build

View File

@ -1,15 +1,18 @@
# Waybar [![Travis](https://travis-ci.org/Alexays/Waybar.svg?branch=master)](https://travis-ci.org/Alexays/Waybar) [![Licence](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) [![Paypal Donate](https://img.shields.io/badge/Donate-Paypal-2244dd.svg)](https://paypal.me/ARouillard)<br>![Waybar](https://raw.githubusercontent.com/alexays/waybar/master/preview-2.png)
# Waybar [![Licence](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) [![Paypal Donate](https://img.shields.io/badge/Donate-Paypal-2244dd.svg)](https://paypal.me/ARouillard)<br>![Waybar](https://raw.githubusercontent.com/alexays/waybar/master/preview-2.png)
> Highly customizable Wayland bar for Sway and Wlroots based compositors.<br>
> Available in Arch [community](https://www.archlinux.org/packages/community/x86_64/waybar/) or
[AUR](https://aur.archlinux.org/packages/waybar-git/), [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)*
#### Current features
- Sway (Workspaces, Binding mode, Focused window name)
- River (Mapping mode, Tags, Focused window name)
- Hyprland (Focused window name)
- Tray [#21](https://github.com/Alexays/Waybar/issues/21)
- Local time
- Battery
- UPower
- Network
- Bluetooth
- Pulseaudio
@ -20,7 +23,7 @@
- MPD
- Custom scripts
- Multiple output configuration
- And much more customizations
- And many more customizations
#### Configuration and Styling
@ -67,6 +70,10 @@ libnl [Network module]
libappindicator-gtk3 [Tray module]
libdbusmenu-gtk3 [Tray module]
libmpdclient [MPD module]
libsndio [sndio module]
libevdev [KeyboardState module]
xkbregistry
upower [UPower battery module]
```
**Build dependencies**
@ -78,13 +85,14 @@ scdoc
wayland-protocols
```
On Ubuntu you can install all the relevant dependencies using this command (tested with 19.10 and 20.04):
On Ubuntu, you can install all the relevant dependencies using this command (tested with 19.10 and 20.04):
```
sudo apt install \
clang-tidy \
gobject-introspection \
libdbusmenu-gtk3-dev \
libevdev-dev \
libfmt-dev \
libgirepository1.0-dev \
libgtk-3-dev \
@ -98,12 +106,15 @@ sudo apt install \
libsigc++-2.0-dev \
libspdlog-dev \
libwayland-dev \
scdoc
scdoc \
upower \
libxkbregistry-dev
```
Contributions welcome! - have fun :)<br>
The style guidelines is [Google's](https://google.github.io/styleguide/cppguide.html)
Contributions welcome!<br>
Have fun :)<br>
The style guidelines are [Google's](https://google.github.io/styleguide/cppguide.html)
## License

35
include/AButton.hpp Normal file
View File

@ -0,0 +1,35 @@
#pragma once
#include <glibmm/markup.h>
#include <gtkmm/button.h>
#include <gtkmm/cssprovider.h>
#include <gtkmm/label.h>
#include <json/json.h>
#include "AModule.hpp"
namespace waybar {
class AButton : public AModule {
public:
AButton(const Json::Value &, const std::string &, const std::string &, const std::string &format,
uint16_t interval = 0, bool ellipsize = false, bool enable_click = false,
bool enable_scroll = false);
virtual ~AButton() = default;
virtual auto update() -> void;
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);
protected:
Gtk::Button button_ = Gtk::Button(name_);
Gtk::Label *label_ = (Gtk::Label *)button_.get_child();
std::string format_;
const std::chrono::seconds interval_;
bool alt_ = false;
std::string default_format_;
virtual bool handleToggle(GdkEventButton *const &e);
virtual std::string getState(uint8_t value, bool lesser = false);
};
} // namespace waybar

25
include/AIconLabel.hpp Normal file
View File

@ -0,0 +1,25 @@
#pragma once
#include <gtkmm/box.h>
#include <gtkmm/image.h>
#include "ALabel.hpp"
namespace waybar {
class AIconLabel : public ALabel {
public:
AIconLabel(const Json::Value &config, const std::string &name, const std::string &id,
const std::string &format, uint16_t interval = 0, bool ellipsize = false,
bool enable_click = false, bool enable_scroll = false);
virtual ~AIconLabel() = default;
virtual auto update() -> void;
protected:
Gtk::Image image_;
Gtk::Box box_;
bool iconEnabled() const;
};
} // namespace waybar

View File

@ -3,6 +3,7 @@
#include <glibmm/markup.h>
#include <gtkmm/label.h>
#include <json/json.h>
#include "AModule.hpp"
namespace waybar {
@ -10,16 +11,16 @@ namespace waybar {
class ALabel : public AModule {
public:
ALabel(const Json::Value &, const std::string &, const std::string &, const std::string &format,
uint16_t interval = 0, bool ellipsize = false, bool enable_click = false, bool enable_scroll = false);
uint16_t interval = 0, bool ellipsize = false, bool enable_click = false,
bool enable_scroll = false);
virtual ~ALabel() = default;
virtual auto update() -> void;
virtual std::string getIcon(uint16_t, const std::string &alt = "", uint16_t max = 0);
virtual std::string getIcon(uint16_t, 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);
protected:
Gtk::Label label_;
std::string format_;
std::string click_param;
const std::chrono::seconds interval_;
bool alt_ = false;
std::string default_format_;

View File

@ -36,6 +36,22 @@ class AModule : public IModule {
std::vector<int> pid_;
gdouble distance_scrolled_y_;
gdouble distance_scrolled_x_;
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_2BUTTON_PRESS), "on-double-click"},
{std::make_pair(1, GdkEventType::GDK_3BUTTON_PRESS), "on-triple-click"},
{std::make_pair(2, GdkEventType::GDK_BUTTON_PRESS), "on-click-middle"},
{std::make_pair(2, GdkEventType::GDK_2BUTTON_PRESS), "on-double-click-middle"},
{std::make_pair(2, GdkEventType::GDK_3BUTTON_PRESS), "on-triple-click-middle"},
{std::make_pair(3, GdkEventType::GDK_BUTTON_PRESS), "on-click-right"},
{std::make_pair(3, GdkEventType::GDK_2BUTTON_PRESS), "on-double-click-right"},
{std::make_pair(3, GdkEventType::GDK_3BUTTON_PRESS), "on-triple-click-right"},
{std::make_pair(8, GdkEventType::GDK_BUTTON_PRESS), "on-click-backward"},
{std::make_pair(8, GdkEventType::GDK_2BUTTON_PRESS), "on-double-click-backward"},
{std::make_pair(8, GdkEventType::GDK_3BUTTON_PRESS), "on-triple-click-backward"},
{std::make_pair(9, GdkEventType::GDK_BUTTON_PRESS), "on-click-forward"},
{std::make_pair(9, GdkEventType::GDK_2BUTTON_PRESS), "on-double-click-forward"},
{std::make_pair(9, GdkEventType::GDK_3BUTTON_PRESS), "on-triple-click-forward"}};
};
} // namespace waybar

View File

@ -8,7 +8,7 @@ class IModule {
public:
virtual ~IModule() = default;
virtual auto update() -> void = 0;
virtual operator Gtk::Widget &() = 0;
virtual operator Gtk::Widget&() = 0;
};
} // namespace waybar

View File

@ -7,9 +7,11 @@
#include <gtkmm/main.h>
#include <gtkmm/window.h>
#include <json/json.h>
#include <memory>
#include <vector>
#include "AModule.hpp"
#include "idle-inhibit-unstable-v1-client-protocol.h"
#include "wlr-layer-shell-unstable-v1-client-protocol.h"
#include "xdg-output-unstable-v1-client-protocol.h"
namespace waybar {
@ -18,77 +20,106 @@ class Factory;
struct waybar_output {
Glib::RefPtr<Gdk::Monitor> monitor;
std::string name;
std::string identifier;
std::unique_ptr<struct zxdg_output_v1, decltype(&zxdg_output_v1_destroy)> xdg_output = {
nullptr, &zxdg_output_v1_destroy};
};
class Bar {
public:
Bar(struct waybar_output *w_output, const Json::Value &);
Bar(const Bar &) = delete;
~Bar() = default;
enum class bar_layer : uint8_t {
BOTTOM,
TOP,
OVERLAY,
};
auto toggle() -> void;
void handleSignal(int);
struct waybar_output *output;
Json::Value config;
struct wl_surface * surface;
bool visible = true;
bool vertical = false;
Gtk::Window window;
private:
static constexpr const char *MIN_HEIGHT_MSG =
"Requested height: {} exceeds the minimum height: {} required by the modules";
static constexpr const char *MIN_WIDTH_MSG =
"Requested width: {} exceeds the minimum width: {} required by the modules";
static constexpr const char *BAR_SIZE_MSG =
"Bar configured (width: {}, height: {}) for output: {}";
static constexpr const char *SIZE_DEFINED =
"{} size is defined in the config file so it will stay like that";
static void layerSurfaceHandleConfigure(void *, struct zwlr_layer_surface_v1 *, uint32_t,
uint32_t, uint32_t);
static void layerSurfaceHandleClosed(void *, struct zwlr_layer_surface_v1 *);
#ifdef HAVE_GTK_LAYER_SHELL
/* gtk-layer-shell code */
void initGtkLayerShell();
void onConfigureGLS(GdkEventConfigure *ev);
void onMapGLS(GdkEventAny *ev);
#endif
/* fallback layer-surface code */
void onConfigure(GdkEventConfigure *ev);
void onRealize();
void onMap(GdkEventAny *ev);
void setSurfaceSize(uint32_t width, uint32_t height);
/* common code */
void setExclusiveZone(uint32_t width, uint32_t height);
auto setupWidgets() -> void;
void getModules(const Factory &, const std::string &);
void setupAltFormatKeyForModule(const std::string &module_name);
void setupAltFormatKeyForModuleList(const char *module_list_name);
struct margins {
struct bar_margins {
int top = 0;
int right = 0;
int bottom = 0;
int left = 0;
} margins_;
struct zwlr_layer_surface_v1 *layer_surface_;
// use gtk-layer-shell instead of handling layer surfaces directly
bool use_gls_ = false;
uint32_t width_ = 0;
uint32_t height_ = 1;
uint8_t anchor_;
};
struct bar_mode {
bar_layer layer;
bool exclusive;
bool passthrough;
bool visible;
};
#ifdef HAVE_SWAY
namespace modules::sway {
class BarIpcClient;
}
#endif // HAVE_SWAY
class BarSurface {
protected:
BarSurface() = default;
public:
virtual void setExclusiveZone(bool enable) = 0;
virtual void setLayer(bar_layer layer) = 0;
virtual void setMargins(const struct bar_margins &margins) = 0;
virtual void setPassThrough(bool enable) = 0;
virtual void setPosition(const std::string_view &position) = 0;
virtual void setSize(uint32_t width, uint32_t height) = 0;
virtual void commit(){};
virtual ~BarSurface() = default;
};
class Bar {
public:
using bar_mode_map = std::map<std::string_view, struct bar_mode>;
static const bar_mode_map PRESET_MODES;
static const std::string_view MODE_DEFAULT;
static const std::string_view MODE_INVISIBLE;
Bar(struct waybar_output *w_output, const Json::Value &);
Bar(const Bar &) = delete;
~Bar();
void setMode(const std::string_view &);
void setVisible(bool visible);
void toggle();
void handleSignal(int);
struct waybar_output *output;
Json::Value config;
struct wl_surface *surface;
bool visible = true;
bool vertical = false;
Gtk::Window window;
#ifdef HAVE_SWAY
std::string bar_id;
#endif
private:
void onMap(GdkEventAny *);
auto setupWidgets() -> void;
void getModules(const Factory &, const std::string &, Gtk::Box *);
void setupAltFormatKeyForModule(const std::string &module_name);
void setupAltFormatKeyForModuleList(const char *module_list_name);
void setMode(const bar_mode &);
/* Copy initial set of modes to allow customization */
bar_mode_map configured_modes = PRESET_MODES;
std::string last_mode_{MODE_DEFAULT};
std::unique_ptr<BarSurface> surface_impl_;
Gtk::Box left_;
Gtk::Box center_;
Gtk::Box right_;
Gtk::Box box_;
std::vector<std::unique_ptr<waybar::AModule>> modules_left_;
std::vector<std::unique_ptr<waybar::AModule>> modules_center_;
std::vector<std::unique_ptr<waybar::AModule>> modules_right_;
std::vector<std::shared_ptr<waybar::AModule>> modules_left_;
std::vector<std::shared_ptr<waybar::AModule>> modules_center_;
std::vector<std::shared_ptr<waybar::AModule>> modules_right_;
#ifdef HAVE_SWAY
using BarIpcClient = modules::sway::BarIpcClient;
std::unique_ptr<BarIpcClient> _ipc_client;
#endif
std::vector<std::shared_ptr<waybar::AModule>> modules_all_;
};
} // namespace waybar

View File

@ -3,10 +3,14 @@
#include <fmt/format.h>
#include <gdk/gdk.h>
#include <gdk/gdkwayland.h>
#include <unistd.h>
#include <wayland-client.h>
#include <wordexp.h>
#include "bar.hpp"
#include "config.hpp"
struct zwlr_layer_shell_v1;
struct zwp_idle_inhibitor_v1;
struct zwp_idle_inhibit_manager_v1;
namespace waybar {
@ -14,25 +18,24 @@ class Client {
public:
static Client *inst();
int main(int argc, char *argv[]);
void reset();
Glib::RefPtr<Gtk::Application> gtk_app;
Glib::RefPtr<Gdk::Display> gdk_display;
struct wl_display * wl_display = nullptr;
struct wl_registry * registry = nullptr;
struct zwlr_layer_shell_v1 * layer_shell = nullptr;
struct zxdg_output_manager_v1 * xdg_output_manager = nullptr;
struct wl_display *wl_display = nullptr;
struct wl_registry *registry = nullptr;
struct zwlr_layer_shell_v1 *layer_shell = nullptr;
struct zxdg_output_manager_v1 *xdg_output_manager = nullptr;
struct zwp_idle_inhibit_manager_v1 *idle_inhibit_manager = nullptr;
std::vector<std::unique_ptr<Bar>> bars;
Config config;
std::string bar_id;
private:
Client() = default;
std::tuple<const std::string, const std::string> getConfigs(const std::string &config,
const std::string &style) const;
const std::string getStyle(const std::string &style);
void bindInterfaces();
const std::string getValidPath(const std::vector<std::string> &paths) const;
void handleOutput(struct waybar_output &output);
bool isValidOutput(const Json::Value &config, struct waybar_output &output);
auto setupConfig(const std::string &config_file) -> void;
auto setupCss(const std::string &css_file) -> void;
struct waybar_output &getOutput(void *);
std::vector<Json::Value> getOutputConfigs(struct waybar_output &output);
@ -40,11 +43,13 @@ class Client {
static void handleGlobal(void *data, struct wl_registry *registry, uint32_t name,
const char *interface, uint32_t version);
static void handleGlobalRemove(void *data, struct wl_registry *registry, uint32_t name);
static void handleOutputDone(void *, struct zxdg_output_v1 *);
static void handleOutputName(void *, struct zxdg_output_v1 *, const char *);
static void handleOutputDescription(void *, struct zxdg_output_v1 *, const char *);
void handleMonitorAdded(Glib::RefPtr<Gdk::Monitor> monitor);
void handleMonitorRemoved(Glib::RefPtr<Gdk::Monitor> monitor);
void handleDeferredMonitorRemoval(Glib::RefPtr<Gdk::Monitor> monitor);
Json::Value config_;
Glib::RefPtr<Gtk::StyleContext> style_context_;
Glib::RefPtr<Gtk::CssProvider> css_provider_;
std::list<struct waybar_output> outputs_;

40
include/config.hpp Normal file
View File

@ -0,0 +1,40 @@
#pragma once
#include <json/json.h>
#include <optional>
#include <string>
#ifndef SYSCONFDIR
#define SYSCONFDIR "/etc"
#endif
namespace waybar {
class Config {
public:
static const std::vector<std::string> CONFIG_DIRS;
static const char *CONFIG_PATH_ENV;
/* Try to find any of provided names in the supported set of config directories */
static std::optional<std::string> findConfigPath(
const std::vector<std::string> &names, const std::vector<std::string> &dirs = CONFIG_DIRS);
Config() = default;
void load(const std::string &config);
Json::Value &getConfig() { return config_; }
std::vector<Json::Value> getOutputConfigs(const std::string &name, const std::string &identifier);
private:
void setupConfig(Json::Value &dst, const std::string &config_file, int depth);
void resolveConfigIncludes(Json::Value &config, int depth);
void mergeConfig(Json::Value &a_config_, Json::Value &b_config_);
std::string config_file_;
Json::Value config_;
};
} // namespace waybar

View File

@ -1,19 +1,33 @@
#pragma once
#include <json/json.h>
#ifdef HAVE_LIBDATE
#include "modules/clock.hpp"
#else
#include "modules/simpleclock.hpp"
#endif
#ifdef HAVE_SWAY
#include "modules/sway/language.hpp"
#include "modules/sway/mode.hpp"
#include "modules/sway/scratchpad.hpp"
#include "modules/sway/window.hpp"
#include "modules/sway/workspaces.hpp"
#endif
#ifdef HAVE_WLR
#include "modules/wlr/taskbar.hpp"
#include "modules/wlr/workspace_manager.hpp"
#endif
#ifdef HAVE_RIVER
#include "modules/river/mode.hpp"
#include "modules/river/tags.hpp"
#include "modules/river/window.hpp"
#endif
#if defined(__linux__) && !defined(NO_FILESYSTEM)
#ifdef HAVE_HYPRLAND
#include "modules/hyprland/backend.hpp"
#include "modules/hyprland/language.hpp"
#include "modules/hyprland/window.hpp"
#endif
#if defined(__FreeBSD__) || (defined(__linux__) && !defined(NO_FILESYSTEM))
#include "modules/battery.hpp"
#endif
#if defined(HAVE_CPU_LINUX) || defined(HAVE_CPU_BSD)
@ -33,20 +47,35 @@
#ifdef HAVE_LIBUDEV
#include "modules/backlight.hpp"
#endif
#ifdef HAVE_LIBEVDEV
#include "modules/keyboard_state.hpp"
#endif
#ifdef HAVE_GAMEMODE
#include "modules/gamemode.hpp"
#endif
#ifdef HAVE_UPOWER
#include "modules/upower/upower.hpp"
#endif
#ifdef HAVE_LIBPULSE
#include "modules/pulseaudio.hpp"
#endif
#ifdef HAVE_LIBMPDCLIENT
#include "modules/mpd.hpp"
#include "modules/mpd/mpd.hpp"
#endif
#ifdef HAVE_LIBSNDIO
#include "modules/sndio.hpp"
#endif
#ifdef HAVE_GIO_UNIX
#include "modules/bluetooth.hpp"
#include "modules/inhibitor.hpp"
#endif
#ifdef HAVE_LIBJACK
#include "modules/jack.hpp"
#endif
#include "bar.hpp"
#include "modules/custom.hpp"
#include "modules/temperature.hpp"
#if defined(__linux__)
# ifdef WANT_RFKILL
# include "modules/bluetooth.hpp"
# endif
#endif
#include "modules/user.hpp"
namespace waybar {

22
include/group.hpp Normal file
View File

@ -0,0 +1,22 @@
#pragma once
#include <gtkmm/box.h>
#include <gtkmm/widget.h>
#include <json/json.h>
#include "AModule.hpp"
#include "bar.hpp"
#include "factory.hpp"
namespace waybar {
class Group : public AModule {
public:
Group(const std::string&, const Bar&, const Json::Value&);
~Group() = default;
auto update() -> void;
operator Gtk::Widget&();
Gtk::Box box;
};
} // namespace waybar

View File

@ -5,7 +5,7 @@
#include <string_view>
#include <vector>
#include "ALabel.hpp"
#include "AButton.hpp"
#include "util/json.hpp"
#include "util/sleeper_thread.hpp"
@ -14,7 +14,7 @@ struct udev_device;
namespace waybar::modules {
class Backlight : public ALabel {
class Backlight : public AButton {
class BacklightDev {
public:
BacklightDev() = default;

View File

@ -6,12 +6,16 @@
#include <filesystem>
#endif
#include <fmt/format.h>
#if defined(__linux__)
#include <sys/inotify.h>
#endif
#include <algorithm>
#include <fstream>
#include <string>
#include <vector>
#include "ALabel.hpp"
#include "AButton.hpp"
#include "util/sleeper_thread.hpp"
namespace waybar::modules {
@ -22,7 +26,7 @@ namespace fs = std::experimental::filesystem;
namespace fs = std::filesystem;
#endif
class Battery : public ALabel {
class Battery : public AButton {
public:
Battery(const std::string&, const Json::Value&);
~Battery();
@ -31,19 +35,23 @@ class Battery : public ALabel {
private:
static inline const fs::path data_dir_ = "/sys/class/power_supply/";
void getBatteries();
void refreshBatteries();
void worker();
const std::string getAdapterStatus(uint8_t capacity) const;
const std::tuple<uint8_t, float, std::string> getInfos() const;
const std::tuple<uint8_t, float, std::string, float> getInfos();
const std::string formatTimeRemaining(float hoursRemaining);
std::vector<fs::path> batteries_;
int global_watch;
std::map<fs::path, int> batteries_;
fs::path adapter_;
int fd_;
std::vector<int> wds_;
int battery_watch_fd_;
int global_watch_fd_;
std::mutex battery_list_mutex_;
std::string old_status_;
bool warnFirstTime_{true};
util::SleeperThread thread_;
util::SleeperThread thread_battery_update_;
util::SleeperThread thread_timer_;
};

View File

@ -1,26 +1,79 @@
#pragma once
#include <fmt/format.h>
#include "ALabel.hpp"
#include <fmt/chrono.h>
#include "util/sleeper_thread.hpp"
#include "AButton.hpp"
#ifdef WANT_RFKILL
#include "util/rfkill.hpp"
#endif
#include <gio/gio.h>
#include <optional>
#include <string>
#include <vector>
namespace waybar::modules {
class Bluetooth : public ALabel {
class Bluetooth : public AButton {
struct ControllerInfo {
std::string path;
std::string address;
std::string address_type;
// std::string name; // just use alias instead
std::string alias;
bool powered;
bool discoverable;
bool pairable;
bool discovering;
};
// NOTE: there are some properties that not all devices provide
struct DeviceInfo {
std::string path;
std::string paired_controller;
std::string address;
std::string address_type;
// std::optional<std::string> name; // just use alias instead
std::string alias;
std::optional<std::string> icon;
bool paired;
bool trusted;
bool blocked;
bool connected;
bool services_resolved;
// NOTE: experimental feature in bluez
std::optional<unsigned char> battery_percentage;
};
public:
Bluetooth(const std::string&, const Json::Value&);
~Bluetooth() = default;
auto update() -> void;
private:
std::string status_;
util::SleeperThread thread_;
util::SleeperThread intervall_thread_;
static auto onInterfaceAddedOrRemoved(GDBusObjectManager*, GDBusObject*, GDBusInterface*,
gpointer) -> void;
static auto onInterfaceProxyPropertiesChanged(GDBusObjectManagerClient*, GDBusObjectProxy*,
GDBusProxy*, GVariant*, const gchar* const*,
gpointer) -> void;
auto getDeviceBatteryPercentage(GDBusObject*) -> std::optional<unsigned char>;
auto getDeviceProperties(GDBusObject*, DeviceInfo&) -> bool;
auto getControllerProperties(GDBusObject*, ControllerInfo&) -> bool;
auto findCurController(ControllerInfo&) -> bool;
auto findConnectedDevices(const std::string&, std::vector<DeviceInfo>&) -> void;
#ifdef WANT_RFKILL
util::Rfkill rfkill_;
#endif
const std::unique_ptr<GDBusObjectManager, void (*)(GDBusObjectManager*)> manager_;
std::string state_;
ControllerInfo cur_controller_;
std::vector<DeviceInfo> connected_devices_;
DeviceInfo cur_focussed_device_;
std::string device_enumerate_;
std::vector<std::string> device_preference_;
};
} // namespace waybar::modules

View File

@ -1,23 +1,20 @@
#pragma once
#include <fmt/format.h>
#if FMT_VERSION < 60000
#include <fmt/time.h>
#else
#include <fmt/chrono.h>
#endif
#include <date/tz.h>
#include "ALabel.hpp"
#include "AButton.hpp"
#include "util/sleeper_thread.hpp"
namespace waybar::modules {
namespace waybar {
struct waybar_time {
std::locale locale;
date::zoned_seconds ztime;
};
struct waybar_time;
class Clock : public ALabel {
namespace modules {
const std::string kCalendarPlaceholder = "calendar";
const std::string KTimezonedTimeListPlaceholder = "timezoned_time_list";
class Clock : public AButton {
public:
Clock(const std::string&, const Json::Value&);
~Clock() = default;
@ -26,17 +23,22 @@ class Clock : public ALabel {
private:
util::SleeperThread thread_;
std::locale locale_;
const date::time_zone* time_zone_;
bool fixed_time_zone_;
int time_zone_idx_;
date::year_month_day cached_calendar_ymd_;
std::string cached_calendar_text_;
std::vector<const date::time_zone*> time_zones_;
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_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;
const date::time_zone* current_timezone();
bool is_timezone_fixed();
auto timezones_text(std::chrono::system_clock::time_point* now) -> std::string;
};
} // namespace waybar::modules
} // namespace modules
} // namespace waybar

View File

@ -1,28 +1,31 @@
#pragma once
#include <fmt/format.h>
#include <unistd.h>
#include <cstdint>
#include <fstream>
#include <numeric>
#include <string>
#include <utility>
#include <vector>
#include "ALabel.hpp"
#include "AButton.hpp"
#include "util/sleeper_thread.hpp"
namespace waybar::modules {
class Cpu : public ALabel {
class Cpu : public AButton {
public:
Cpu(const std::string&, const Json::Value&);
~Cpu() = default;
auto update() -> void;
private:
uint16_t getCpuLoad();
std::tuple<uint16_t, std::string> getCpuUsage();
double getCpuLoad();
std::tuple<std::vector<uint16_t>, std::string> getCpuUsage();
std::tuple<float, float, float> getCpuFrequency();
std::vector<std::tuple<size_t, size_t>> parseCpuinfo();
std::vector<float> parseCpuFrequencies();
std::vector<std::tuple<size_t, size_t>> prev_times_;

View File

@ -1,16 +1,18 @@
#pragma once
#include <fmt/format.h>
#include <csignal>
#include <string>
#include "ALabel.hpp"
#include "AButton.hpp"
#include "util/command.hpp"
#include "util/json.hpp"
#include "util/sleeper_thread.hpp"
namespace waybar::modules {
class Custom : public ALabel {
class Custom : public AButton {
public:
Custom(const std::string&, const std::string&, const Json::Value&);
~Custom();
@ -28,6 +30,7 @@ class Custom : public ALabel {
const std::string name_;
std::string text_;
std::string id_;
std::string alt_;
std::string tooltip_;
std::vector<std::string> class_;

View File

@ -1,15 +1,17 @@
#pragma once
#include <fmt/format.h>
#include <fstream>
#include <sys/statvfs.h>
#include "ALabel.hpp"
#include "util/sleeper_thread.hpp"
#include <fstream>
#include "AButton.hpp"
#include "util/format.hpp"
#include "util/sleeper_thread.hpp"
namespace waybar::modules {
class Disk : public ALabel {
class Disk : public AButton {
public:
Disk(const std::string&, const Json::Value&);
~Disk() = default;

View File

@ -0,0 +1,77 @@
#pragma once
#include <iostream>
#include <map>
#include <string>
#include "ALabel.hpp"
#include "giomm/dbusconnection.h"
#include "giomm/dbusproxy.h"
#include "glibconfig.h"
#include "gtkmm/box.h"
#include "gtkmm/image.h"
#include "gtkmm/label.h"
#include "gtkmm/overlay.h"
namespace waybar::modules {
class Gamemode : public AModule {
public:
Gamemode(const std::string &, const Json::Value &);
~Gamemode();
auto update() -> void;
private:
const std::string DEFAULT_ICON_NAME = "input-gaming-symbolic";
const std::string DEFAULT_FORMAT = "{glyph}";
const std::string DEFAULT_FORMAT_ALT = "{glyph} {count}";
const std::string DEFAULT_TOOLTIP_FORMAT = "Games running: {count}";
const std::string DEFAULT_GLYPH = "";
void appear(const Glib::RefPtr<Gio::DBus::Connection> &connection, const Glib::ustring &name,
const Glib::ustring &name_owner);
void disappear(const Glib::RefPtr<Gio::DBus::Connection> &connection, const Glib::ustring &name);
void prepareForSleep_cb(const Glib::RefPtr<Gio::DBus::Connection> &connection,
const Glib::ustring &sender_name, const Glib::ustring &object_path,
const Glib::ustring &interface_name, const Glib::ustring &signal_name,
const Glib::VariantContainerBase &parameters);
void notify_cb(const Glib::ustring &sender_name, const Glib::ustring &signal_name,
const Glib::VariantContainerBase &arguments);
void getData();
bool handleToggle(GdkEventButton *const &);
// Config
std::string format = DEFAULT_FORMAT;
std::string format_alt = DEFAULT_FORMAT_ALT;
std::string tooltip_format = DEFAULT_TOOLTIP_FORMAT;
std::string glyph = DEFAULT_GLYPH;
bool tooltip = true;
bool hideNotRunning = true;
bool useIcon = true;
uint iconSize = 20;
uint iconSpacing = 4;
std::string iconName = DEFAULT_ICON_NAME;
Gtk::Box box_;
Gtk::Image icon_;
Gtk::Label label_;
const std::string dbus_name = "com.feralinteractive.GameMode";
const std::string dbus_obj_path = "/com/feralinteractive/GameMode";
const std::string dbus_interface = "org.freedesktop.DBus.Properties";
const std::string dbus_get_interface = "com.feralinteractive.GameMode";
uint gameCount = 0;
std::string lastStatus;
bool showAltText = false;
guint login1_id;
Glib::RefPtr<Gio::DBus::Proxy> gamemode_proxy;
Glib::RefPtr<Gio::DBus::Connection> system_connection;
bool gamemodeRunning;
guint gamemodeWatcher_id;
};
} // namespace waybar::modules

View File

@ -0,0 +1,28 @@
#pragma once
#include <deque>
#include <functional>
#include <memory>
#include <mutex>
#include <string>
#include <thread>
namespace waybar::modules::hyprland {
class IPC {
public:
IPC() { startIPC(); }
void registerForIPC(const std::string&, std::function<void(const std::string&)>);
std::string getSocket1Reply(const std::string& rq);
private:
void startIPC();
void parseIPC(const std::string&);
std::mutex callbackMutex;
std::deque<std::pair<std::string, std::function<void(const std::string&)>>> callbacks;
};
inline std::unique_ptr<IPC> gIPC;
inline bool modulesReady = false;
}; // namespace waybar::modules::hyprland

View File

@ -0,0 +1,29 @@
#include <fmt/format.h>
#include "AButton.hpp"
#include "bar.hpp"
#include "modules/hyprland/backend.hpp"
#include "util/json.hpp"
namespace waybar::modules::hyprland {
class Language : public waybar::AButton {
public:
Language(const std::string&, const waybar::Bar&, const Json::Value&);
~Language() = default;
auto update() -> void;
private:
void onEvent(const std::string&);
void initLanguage();
std::string getShortFrom(const std::string&);
std::mutex mutex_;
const Bar& bar_;
util::JsonParser parser_;
std::string layoutName_;
};
} // namespace waybar::modules::hyprland

View File

@ -0,0 +1,31 @@
#include <fmt/format.h>
#include <tuple>
#include "ALabel.hpp"
#include "bar.hpp"
#include "modules/hyprland/backend.hpp"
#include "util/json.hpp"
namespace waybar::modules::hyprland {
class Window : public waybar::ALabel {
public:
Window(const std::string&, const waybar::Bar&, const Json::Value&);
~Window() = default;
auto update() -> void;
private:
uint getActiveWorkspaceID(std::string);
std::string getLastWindowTitle(uint);
void onEvent(const std::string&);
bool separate_outputs;
std::mutex mutex_;
const Bar& bar_;
util::JsonParser parser_;
std::string lastView;
};
} // namespace waybar::modules::hyprland

View File

@ -1,23 +1,28 @@
#pragma once
#include <fmt/format.h>
#include "ALabel.hpp"
#include "AButton.hpp"
#include "bar.hpp"
#include "client.hpp"
namespace waybar::modules {
class IdleInhibitor : public ALabel {
class IdleInhibitor : public AButton {
sigc::connection timeout_;
public:
IdleInhibitor(const std::string&, const waybar::Bar&, const Json::Value&);
~IdleInhibitor();
auto update() -> void;
static std::list<waybar::AModule*> modules;
static bool status;
private:
bool handleToggle(GdkEventButton* const& e);
void toggleStatus();
const Bar& bar_;
std::string status_;
struct zwp_idle_inhibitor_v1* idle_inhibitor_;
int pid_;
};

View File

@ -0,0 +1,27 @@
#pragma once
#include <gio/gio.h>
#include <memory>
#include "AButton.hpp"
#include "bar.hpp"
namespace waybar::modules {
class Inhibitor : public AButton {
public:
Inhibitor(const std::string&, const waybar::Bar&, const Json::Value&);
~Inhibitor() override;
auto update() -> void;
auto activated() -> bool;
private:
auto handleToggle(::GdkEventButton* const& e) -> bool;
const std::unique_ptr<::GDBusConnection, void (*)(::GDBusConnection*)> dbus_;
const std::string inhibitors_;
int handle_ = -1;
};
} // namespace waybar::modules

44
include/modules/jack.hpp Normal file
View File

@ -0,0 +1,44 @@
#pragma once
#include <fmt/format.h>
#include <jack/jack.h>
#include <jack/thread.h>
#include <fstream>
#include "ALabel.hpp"
#include "util/sleeper_thread.hpp"
namespace waybar::modules {
class JACK : public ALabel {
public:
JACK(const std::string &, const Json::Value &);
~JACK() = default;
auto update() -> void;
int bufSize(jack_nframes_t size);
int sampleRate(jack_nframes_t rate);
int xrun();
void shutdown();
private:
std::string JACKState();
jack_client_t *client_;
jack_nframes_t bufsize_;
jack_nframes_t samplerate_;
unsigned int xruns_;
float load_;
bool running_;
std::mutex mutex_;
std::string state_;
util::SleeperThread thread_;
};
} // namespace waybar::modules
int bufSizeCallback(jack_nframes_t size, void *obj);
int sampleRateCallback(jack_nframes_t rate, void *obj);
int xrunCallback(void *obj);
void shutdownCallback(void *obj);

View File

@ -0,0 +1,47 @@
#pragma once
#include <fmt/chrono.h>
#include <gtkmm/label.h>
#include <unordered_map>
#include "AModule.hpp"
#include "bar.hpp"
#include "util/sleeper_thread.hpp"
extern "C" {
#include <libevdev/libevdev.h>
#include <libinput.h>
}
namespace waybar::modules {
class KeyboardState : public AModule {
public:
KeyboardState(const std::string&, const waybar::Bar&, const Json::Value&);
~KeyboardState();
auto update() -> void;
private:
auto tryAddDevice(const std::string&) -> void;
Gtk::Box box_;
Gtk::Label numlock_label_;
Gtk::Label capslock_label_;
Gtk::Label scrolllock_label_;
std::string numlock_format_;
std::string capslock_format_;
std::string scrolllock_format_;
const std::chrono::seconds interval_;
std::string icon_locked_;
std::string icon_unlocked_;
std::string devices_path_;
struct libinput* libinput_;
std::unordered_map<std::string, struct libinput_device*> libinput_devices_;
util::SleeperThread libinput_thread_, hotplug_thread_;
};
} // namespace waybar::modules

View File

@ -1,14 +1,16 @@
#pragma once
#include <fmt/format.h>
#include <fstream>
#include <unordered_map>
#include "ALabel.hpp"
#include "AButton.hpp"
#include "util/sleeper_thread.hpp"
namespace waybar::modules {
class Memory : public ALabel {
class Memory : public AButton {
public:
Memory(const std::string&, const Json::Value&);
~Memory() = default;

View File

@ -1,74 +0,0 @@
#pragma once
#include <fmt/format.h>
#include <mpd/client.h>
#include <condition_variable>
#include <thread>
#include "ALabel.hpp"
namespace waybar::modules {
class MPD : public ALabel {
public:
MPD(const std::string&, const Json::Value&);
auto update() -> void;
private:
std::thread periodic_updater();
std::string getTag(mpd_tag_type type, unsigned idx = 0);
void setLabel();
std::string getStateIcon();
std::string getOptionIcon(std::string optionName, bool activated);
std::thread event_listener();
// Assumes `connection_lock_` is locked
void tryConnect();
// If checking errors on the main connection, make sure to lock it using
// `connection_lock_` before calling checkErrors
void checkErrors(mpd_connection* conn);
// Assumes `connection_lock_` is locked
void fetchState();
void waitForEvent();
bool handlePlayPause(GdkEventButton* const&);
bool stopped();
bool playing();
bool paused();
const std::string module_name_;
using unique_connection = std::unique_ptr<mpd_connection, decltype(&mpd_connection_free)>;
using unique_status = std::unique_ptr<mpd_status, decltype(&mpd_status_free)>;
using unique_song = std::unique_ptr<mpd_song, decltype(&mpd_song_free)>;
// Not using unique_ptr since we don't manage the pointer
// (It's either nullptr, or from the config)
const char* server_;
const unsigned port_;
unsigned timeout_;
// We need a mutex here because we can trigger updates from multiple thread:
// the event based updates, the periodic updates needed for the elapsed time,
// and the click play/pause feature
std::mutex connection_lock_;
unique_connection connection_;
// The alternate connection will be used to wait for events: since it will
// be blocking (idle) we can't send commands via this connection
//
// No lock since only used in the event listener thread
unique_connection alternate_connection_;
// Protect them using the `connection_lock_`
unique_status status_;
mpd_state state_;
unique_song song_;
// To make sure the previous periodic_updater stops before creating a new one
std::mutex periodic_lock_;
};
} // namespace waybar::modules

View File

@ -0,0 +1,68 @@
#pragma once
#include <fmt/format.h>
#include <mpd/client.h>
#include <spdlog/spdlog.h>
#include <condition_variable>
#include <thread>
#include "AButton.hpp"
#include "modules/mpd/state.hpp"
namespace waybar::modules {
class MPD : public AButton {
friend class detail::Context;
// State machine
detail::Context context_{this};
const std::string module_name_;
// Not using unique_ptr since we don't manage the pointer
// (It's either nullptr, or from the config)
const char* server_;
const unsigned port_;
const std::string password_;
unsigned timeout_;
detail::unique_connection connection_;
detail::unique_status status_;
mpd_state state_;
detail::unique_song song_;
public:
MPD(const std::string&, const Json::Value&);
virtual ~MPD() noexcept = default;
auto update() -> void;
private:
std::string getTag(mpd_tag_type type, unsigned idx = 0) const;
std::string getFilename() const;
void setLabel();
std::string getStateIcon() const;
std::string getOptionIcon(std::string optionName, bool activated) const;
// GUI-side methods
bool handlePlayPause(GdkEventButton* const&);
void emit() { dp.emit(); }
// MPD-side, Non-GUI methods.
void tryConnect();
void checkErrors(mpd_connection* conn);
void fetchState();
void queryMPD();
inline bool stopped() const { return connection_ && state_ == MPD_STATE_STOP; }
inline bool playing() const { return connection_ && state_ == MPD_STATE_PLAY; }
inline bool paused() const { return connection_ && state_ == MPD_STATE_PAUSE; }
};
#if !defined(MPD_NOINLINE)
#include "modules/mpd/state.inl.hpp"
#endif
} // namespace waybar::modules

View File

@ -0,0 +1,217 @@
#pragma once
#include <fmt/format.h>
#include <mpd/client.h>
#include <spdlog/spdlog.h>
#include <condition_variable>
#include <thread>
#include "AButton.hpp"
namespace waybar::modules {
class MPD;
} // namespace waybar::modules
namespace waybar::modules::detail {
using unique_connection = std::unique_ptr<mpd_connection, decltype(&mpd_connection_free)>;
using unique_status = std::unique_ptr<mpd_status, decltype(&mpd_status_free)>;
using unique_song = std::unique_ptr<mpd_song, decltype(&mpd_song_free)>;
class Context;
/// This state machine loosely follows a non-hierarchical, statechart
/// pattern, and includes ENTRY and EXIT actions.
///
/// The State class is the base class for all other states. The
/// entry and exit methods are automatically called when entering
/// into a new state and exiting from the current state. This
/// includes initially entering (Disconnected class) and exiting
/// Waybar.
///
/// The following nested "top-level" states are represented:
/// 1. Idle - await notification of MPD activity.
/// 2. All Non-Idle states:
/// 1. Playing - An active song is producing audio output.
/// 2. Paused - The current song is paused.
/// 3. Stopped - No song is actively playing.
/// 3. Disconnected - periodically attempt MPD (re-)connection.
///
/// NOTE: Since this statechart is non-hierarchical, the above
/// states are flattened into a set.
class State {
public:
virtual ~State() noexcept = default;
virtual void entry() noexcept { spdlog::debug("mpd: ignore entry action"); }
virtual void exit() noexcept { spdlog::debug("mpd: ignore exit action"); }
virtual void play() { spdlog::debug("mpd: ignore play state transition"); }
virtual void stop() { spdlog::debug("mpd: ignore stop state transition"); }
virtual void pause() { spdlog::debug("mpd: ignore pause state transition"); }
/// Request state update the GUI.
virtual void update() noexcept { spdlog::debug("mpd: ignoring update method request"); }
};
class Idle : public State {
Context* const ctx_;
sigc::connection idle_connection_;
public:
Idle(Context* const ctx) : ctx_{ctx} {}
virtual ~Idle() noexcept { this->exit(); };
void entry() noexcept override;
void exit() noexcept override;
void play() override;
void stop() override;
void pause() override;
void update() noexcept override;
private:
Idle(const Idle&) = delete;
Idle& operator=(const Idle&) = delete;
bool on_io(Glib::IOCondition const&);
};
class Playing : public State {
Context* const ctx_;
sigc::connection timer_connection_;
public:
Playing(Context* const ctx) : ctx_{ctx} {}
virtual ~Playing() noexcept { this->exit(); }
void entry() noexcept override;
void exit() noexcept override;
void pause() override;
void stop() override;
void update() noexcept override;
private:
Playing(Playing const&) = delete;
Playing& operator=(Playing const&) = delete;
bool on_timer();
};
class Paused : public State {
Context* const ctx_;
sigc::connection timer_connection_;
public:
Paused(Context* const ctx) : ctx_{ctx} {}
virtual ~Paused() noexcept { this->exit(); }
void entry() noexcept override;
void exit() noexcept override;
void play() override;
void stop() override;
void update() noexcept override;
private:
Paused(Paused const&) = delete;
Paused& operator=(Paused const&) = delete;
bool on_timer();
};
class Stopped : public State {
Context* const ctx_;
sigc::connection timer_connection_;
public:
Stopped(Context* const ctx) : ctx_{ctx} {}
virtual ~Stopped() noexcept { this->exit(); }
void entry() noexcept override;
void exit() noexcept override;
void play() override;
void pause() override;
void update() noexcept override;
private:
Stopped(Stopped const&) = delete;
Stopped& operator=(Stopped const&) = delete;
bool on_timer();
};
class Disconnected : public State {
Context* const ctx_;
sigc::connection timer_connection_;
public:
Disconnected(Context* const ctx) : ctx_{ctx} {}
virtual ~Disconnected() noexcept { this->exit(); }
void entry() noexcept override;
void exit() noexcept override;
void update() noexcept override;
private:
Disconnected(Disconnected const&) = delete;
Disconnected& operator=(Disconnected const&) = delete;
void arm_timer(int interval) noexcept;
void disarm_timer() noexcept;
bool on_timer();
};
class Context {
std::unique_ptr<State> state_;
waybar::modules::MPD* mpd_module_;
friend class State;
friend class Playing;
friend class Paused;
friend class Stopped;
friend class Disconnected;
friend class Idle;
protected:
void setState(std::unique_ptr<State>&& new_state) noexcept {
if (state_.get() != nullptr) {
state_->exit();
}
state_ = std::move(new_state);
state_->entry();
}
bool is_connected() const;
bool is_playing() const;
bool is_paused() const;
bool is_stopped() const;
constexpr std::size_t interval() const;
void tryConnect() const;
void checkErrors(mpd_connection*) const;
void do_update();
void queryMPD() const;
void fetchState() const;
constexpr mpd_state state() const;
void emit() const;
[[nodiscard]] unique_connection& connection();
public:
explicit Context(waybar::modules::MPD* const mpd_module)
: state_{std::make_unique<Disconnected>(this)}, mpd_module_{mpd_module} {
state_->entry();
}
void play() { state_->play(); }
void stop() { state_->stop(); }
void pause() { state_->pause(); }
void update() noexcept { state_->update(); }
};
} // namespace waybar::modules::detail

View File

@ -0,0 +1,22 @@
#pragma once
namespace detail {
inline bool Context::is_connected() const { return mpd_module_->connection_ != nullptr; }
inline bool Context::is_playing() const { return mpd_module_->playing(); }
inline bool Context::is_paused() const { return mpd_module_->paused(); }
inline bool Context::is_stopped() const { return mpd_module_->stopped(); }
constexpr inline std::size_t Context::interval() const { return mpd_module_->interval_.count(); }
inline void Context::tryConnect() const { mpd_module_->tryConnect(); }
inline unique_connection& Context::connection() { return mpd_module_->connection_; }
constexpr inline mpd_state Context::state() const { return mpd_module_->state_; }
inline void Context::do_update() { mpd_module_->setLabel(); }
inline void Context::checkErrors(mpd_connection* conn) const { mpd_module_->checkErrors(conn); }
inline void Context::queryMPD() const { mpd_module_->queryMPD(); }
inline void Context::fetchState() const { mpd_module_->fetchState(); }
inline void Context::emit() const { mpd_module_->emit(); }
} // namespace detail

View File

@ -2,14 +2,15 @@
#include <arpa/inet.h>
#include <fmt/format.h>
#include <ifaddrs.h>
#include <linux/nl80211.h>
#include <net/if.h>
#include <netlink/genl/ctrl.h>
#include <netlink/genl/genl.h>
#include <netlink/netlink.h>
#include <sys/epoll.h>
#include "ALabel.hpp"
#include <optional>
#include "AButton.hpp"
#include "util/sleeper_thread.hpp"
#ifdef WANT_RFKILL
#include "util/rfkill.hpp"
@ -17,7 +18,7 @@
namespace waybar::modules {
class Network : public ALabel {
class Network : public AButton {
public:
Network(const std::string&, const Json::Value&);
~Network();
@ -28,26 +29,24 @@ class Network : public ALabel {
static const uint8_t EPOLL_MAX = 200;
static int handleEvents(struct nl_msg*, void*);
static int handleEventsDone(struct nl_msg*, void*);
static int handleScan(struct nl_msg*, void*);
void askForStateDump(void);
void worker();
void createInfoSocket();
void createEventSocket();
int getExternalInterface(int skip_idx = -1) const;
void getInterfaceAddress();
int netlinkRequest(void*, uint32_t, uint32_t groups = 0) const;
int netlinkResponse(void*, uint32_t, uint32_t groups = 0) const;
void parseEssid(struct nlattr**);
void parseSignal(struct nlattr**);
void parseFreq(struct nlattr**);
bool associatedOrJoined(struct nlattr**);
bool checkInterface(struct ifinfomsg* rtif, std::string name);
int getPreferredIface(int skip_idx = -1, bool wait = true) const;
bool checkInterface(std::string name);
auto getInfo() -> void;
void checkNewInterface(struct ifinfomsg* rtif);
const std::string getNetworkState() const;
void clearIface();
bool wildcardMatch(const std::string& pattern, const std::string& text) const;
std::optional<std::pair<unsigned long long, unsigned long long>> readBandwidthUsage();
int ifid_;
sa_family_t family_;
@ -59,24 +58,31 @@ class Network : public ALabel {
int nl80211_id_;
std::mutex mutex_;
bool want_route_dump_;
bool want_link_dump_;
bool want_addr_dump_;
bool dump_in_progress_;
unsigned long long bandwidth_down_total_;
unsigned long long bandwidth_up_total_;
std::string state_;
std::string essid_;
bool carrier_;
std::string ifname_;
std::string ipaddr_;
std::string gwaddr_;
std::string netmask_;
int cidr_;
int32_t signal_strength_dbm_;
uint8_t signal_strength_;
uint32_t frequency_;
std::string signal_strength_app_;
float frequency_;
uint32_t route_priority;
util::SleeperThread thread_;
util::SleeperThread thread_timer_;
#ifdef WANT_RFKILL
util::SleeperThread thread_rfkill_;
util::Rfkill rfkill_;
#endif
};

View File

@ -3,13 +3,15 @@
#include <fmt/format.h>
#include <pulse/pulseaudio.h>
#include <pulse/volume.h>
#include <algorithm>
#include <array>
#include "ALabel.hpp"
#include "AButton.hpp"
namespace waybar::modules {
class Pulseaudio : public ALabel {
class Pulseaudio : public AButton {
public:
Pulseaudio(const std::string&, const Json::Value&);
~Pulseaudio();
@ -24,7 +26,7 @@ class Pulseaudio : public ALabel {
static void volumeModifyCb(pa_context*, int, void*);
bool handleScroll(GdkEventScroll* e);
const std::string getPortIcon() const;
const std::vector<std::string> getPulseIcon() const;
pa_threaded_mainloop* mainloop_;
pa_mainloop_api* mainloop_api_;
@ -38,7 +40,8 @@ class Pulseaudio : public ALabel {
std::string form_factor_;
std::string desc_;
std::string monitor_;
std::string default_sink_name_;
std::string current_sink_name_;
bool current_sink_running_;
// SOURCE
uint32_t source_idx_{0};
uint16_t source_volume_;

View File

@ -0,0 +1,28 @@
#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 Mode : public waybar::ALabel {
public:
Mode(const std::string &, const waybar::Bar &, const Json::Value &);
~Mode();
// Handlers for wayland events
void handle_mode(const char *mode);
struct zriver_status_manager_v1 *status_manager_;
struct wl_seat *seat_;
private:
const waybar::Bar &bar_;
std::string mode_;
struct zriver_seat_status_v1 *seat_status_;
};
} /* namespace waybar::modules::river */

View File

@ -5,6 +5,7 @@
#include "AModule.hpp"
#include "bar.hpp"
#include "river-control-unstable-v1-client-protocol.h"
#include "river-status-unstable-v1-client-protocol.h"
#include "xdg-output-unstable-v1-client-protocol.h"
@ -18,11 +19,17 @@ class Tags : public waybar::AModule {
// Handlers for wayland events
void handle_focused_tags(uint32_t tags);
void handle_view_tags(struct wl_array *tags);
void handle_urgent_tags(uint32_t tags);
void handle_primary_clicked(uint32_t tag);
bool handle_button_press(GdkEventButton *event_button, uint32_t tag);
struct zriver_status_manager_v1 *status_manager_;
struct zriver_control_v1 *control_;
struct wl_seat *seat_;
private:
const waybar::Bar & bar_;
const waybar::Bar &bar_;
Gtk::Box box_;
std::vector<Gtk::Button> buttons_;
struct zriver_output_status_v1 *output_status_;

View File

@ -0,0 +1,33 @@
#pragma once
#include <gtkmm/button.h>
#include <wayland-client.h>
#include "ALabel.hpp"
#include "bar.hpp"
#include "river-status-unstable-v1-client-protocol.h"
#include "xdg-output-unstable-v1-client-protocol.h"
namespace waybar::modules::river {
class Window : public waybar::ALabel {
public:
Window(const std::string &, const waybar::Bar &, const Json::Value &);
~Window();
// Handlers for wayland events
void handle_focused_view(const char *title);
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_seat_status_v1 *seat_status_;
};
} /* namespace waybar::modules::river */

View File

@ -0,0 +1,20 @@
#pragma once
#include <fmt/chrono.h>
#include "AButton.hpp"
#include "util/sleeper_thread.hpp"
namespace waybar::modules {
class Clock : public AButton {
public:
Clock(const std::string&, const Json::Value&);
~Clock() = default;
auto update() -> void;
private:
util::SleeperThread thread_;
};
} // namespace waybar::modules

32
include/modules/sndio.hpp Normal file
View File

@ -0,0 +1,32 @@
#pragma once
#include <sndio.h>
#include <vector>
#include "AButton.hpp"
#include "util/sleeper_thread.hpp"
namespace waybar::modules {
class Sndio : public AButton {
public:
Sndio(const std::string &, const Json::Value &);
~Sndio();
auto update() -> void;
auto set_desc(struct sioctl_desc *, unsigned int) -> void;
auto put_val(unsigned int, unsigned int) -> void;
bool handleScroll(GdkEventScroll *);
bool handleToggle(GdkEventButton *const &);
private:
auto connect_to_sndio() -> void;
util::SleeperThread thread_;
struct sioctl_hdl *hdl_;
std::vector<struct pollfd> pfds_;
unsigned int addr_;
unsigned int volume_, old_volume_, maxval_;
bool muted_;
};
} // namespace waybar::modules

View File

@ -4,14 +4,18 @@
#include <giomm.h>
#include <glibmm/refptr.h>
#include <json/json.h>
#include <tuple>
#include "bar.hpp"
#include "modules/sni/item.hpp"
namespace waybar::modules::SNI {
class Host {
public:
Host(const std::size_t id, const Json::Value&, const std::function<void(std::unique_ptr<Item>&)>&,
Host(const std::size_t id, const Json::Value&, const Bar&,
const std::function<void(std::unique_ptr<Item>&)>&,
const std::function<void(std::unique_ptr<Item>&)>&);
~Host();
@ -36,6 +40,7 @@ class Host {
GCancellable* cancellable_ = nullptr;
SnWatcher* watcher_ = nullptr;
const Json::Value& config_;
const Bar& bar_;
const std::function<void(std::unique_ptr<Item>&)> on_add_;
const std::function<void(std::unique_ptr<Item>&)> on_remove_;
};

View File

@ -11,11 +11,21 @@
#include <libdbusmenu-gtk/dbusmenu-gtk.h>
#include <sigc++/trackable.h>
#include <set>
#include <string_view>
#include "bar.hpp"
namespace waybar::modules::SNI {
struct ToolTip {
Glib::ustring icon_name;
Glib::ustring text;
};
class Item : public sigc::trackable {
public:
Item(const std::string&, const std::string&, const Json::Value&);
Item(const std::string&, const std::string&, const Json::Value&, const Bar&);
~Item() = default;
std::string bus_name;
@ -27,10 +37,8 @@ class Item : public sigc::trackable {
Gtk::EventBox event_box;
std::string category;
std::string id;
std::string status;
std::string title;
int32_t window_id;
std::string icon_name;
Glib::RefPtr<Gdk::Pixbuf> icon_pixmap;
Glib::RefPtr<Gtk::IconTheme> icon_theme;
@ -39,6 +47,7 @@ class Item : public sigc::trackable {
std::string attention_movie_name;
std::string icon_theme_path;
std::string menu;
ToolTip tooltip;
DbusmenuGtkMenu* dbus_menu = nullptr;
Gtk::Menu* gtk_menu = nullptr;
/**
@ -49,8 +58,10 @@ class Item : public sigc::trackable {
bool item_is_menu = true;
private:
void onConfigure(GdkEventConfigure* ev);
void proxyReady(Glib::RefPtr<Gio::AsyncResult>& result);
void setProperty(const Glib::ustring& name, Glib::VariantBase& value);
void setStatus(const Glib::ustring& value);
void getUpdatedProperties();
void processUpdatedProperties(Glib::RefPtr<Gio::AsyncResult>& result);
void onSignal(const Glib::ustring& sender_name, const Glib::ustring& signal_name,
@ -58,14 +69,24 @@ class Item : public sigc::trackable {
void updateImage();
Glib::RefPtr<Gdk::Pixbuf> extractPixBuf(GVariant* variant);
Glib::RefPtr<Gdk::Pixbuf> getIconPixbuf();
Glib::RefPtr<Gdk::Pixbuf> getIconByName(const std::string& name, int size);
double getScaledIconSize();
static void onMenuDestroyed(Item* self, GObject* old_menu_pointer);
void makeMenu();
bool handleClick(GdkEventButton* const& /*ev*/);
bool handleScroll(GdkEventScroll* const&);
// smooth scrolling threshold
gdouble scroll_threshold_ = 0;
gdouble distance_scrolled_x_ = 0;
gdouble distance_scrolled_y_ = 0;
// visibility of items with Status == Passive
bool show_passive_ = false;
Glib::RefPtr<Gio::DBus::Proxy> proxy_;
Glib::RefPtr<Gio::Cancellable> cancellable_;
bool update_pending_;
std::set<std::string_view> update_pending_;
};
} // namespace waybar::modules::SNI

View File

@ -1,6 +1,7 @@
#pragma once
#include <fmt/format.h>
#include "AModule.hpp"
#include "bar.hpp"
#include "modules/sni/host.hpp"

View File

@ -30,10 +30,10 @@ class Watcher {
typedef struct {
GfWatchType type;
Watcher * watcher;
gchar * service;
gchar * bus_name;
gchar * object_path;
Watcher *watcher;
gchar *service;
gchar *bus_name;
gchar *object_path;
guint watch_id;
} GfWatch;
@ -48,8 +48,8 @@ class Watcher {
void updateRegisteredItems(SnWatcher *obj);
uint32_t bus_name_id_;
GSList * hosts_ = nullptr;
GSList * items_ = nullptr;
GSList *hosts_ = nullptr;
GSList *items_ = nullptr;
SnWatcher *watcher_ = nullptr;
};

View File

@ -0,0 +1,60 @@
#pragma once
#include <atomic>
#include <string>
#include "modules/sway/ipc/client.hpp"
#include "util/SafeSignal.hpp"
#include "util/json.hpp"
namespace waybar {
class Bar;
namespace modules::sway {
/*
* Supported subset of i3/sway IPC barconfig object
*/
struct swaybar_config {
std::string id;
std::string mode;
std::string hidden_state;
};
/**
* swaybar IPC client
*/
class BarIpcClient {
public:
BarIpcClient(waybar::Bar& bar);
private:
void onInitialConfig(const struct Ipc::ipc_response& res);
void onIpcEvent(const struct Ipc::ipc_response&);
void onCmd(const struct Ipc::ipc_response&);
void onConfigUpdate(const swaybar_config& config);
void onVisibilityUpdate(bool visible_by_modifier);
void onModeUpdate(bool visible_by_modifier);
void onUrgencyUpdate(bool visible_by_urgency);
void update();
bool isModuleEnabled(std::string name);
Bar& bar_;
util::JsonParser parser_;
Ipc ipc_;
swaybar_config bar_config_;
std::string modifier_reset_;
bool visible_by_mode_ = false;
bool visible_by_modifier_ = false;
bool visible_by_urgency_ = false;
std::atomic<bool> modifier_no_action_ = false;
SafeSignal<bool> signal_mode_;
SafeSignal<bool> signal_visible_;
SafeSignal<bool> signal_urgency_;
SafeSignal<swaybar_config> signal_config_;
};
} // namespace modules::sway
} // namespace waybar

View File

@ -4,9 +4,11 @@
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <cstring>
#include <memory>
#include <mutex>
#include "ipc.hpp"
#include "util/sleeper_thread.hpp"

View File

@ -1,8 +1,10 @@
#pragma once
#include <cstdint>
#define event_mask(ev) (1u << (ev & 0x7F))
enum ipc_command_type {
enum ipc_command_type : uint32_t {
// i3 command types - see i3's I3_REPLY_TYPE constants
IPC_COMMAND = 0,
IPC_GET_WORKSPACES = 1,
@ -21,12 +23,16 @@ enum ipc_command_type {
IPC_GET_SEATS = 101,
// Events sent from sway to clients. Events have the highest bits set.
IPC_EVENT_WORKSPACE = ((1 << 31) | 0),
IPC_EVENT_OUTPUT = ((1 << 31) | 1),
IPC_EVENT_MODE = ((1 << 31) | 2),
IPC_EVENT_WINDOW = ((1 << 31) | 3),
IPC_EVENT_BARCONFIG_UPDATE = ((1 << 31) | 4),
IPC_EVENT_BINDING = ((1 << 31) | 5),
IPC_EVENT_SHUTDOWN = ((1 << 31) | 6),
IPC_EVENT_TICK = ((1 << 31) | 7),
IPC_EVENT_WORKSPACE = ((1U << 31) | 0),
IPC_EVENT_OUTPUT = ((1U << 31) | 1),
IPC_EVENT_MODE = ((1U << 31) | 2),
IPC_EVENT_WINDOW = ((1U << 31) | 3),
IPC_EVENT_BARCONFIG_UPDATE = ((1U << 31) | 4),
IPC_EVENT_BINDING = ((1U << 31) | 5),
IPC_EVENT_SHUTDOWN = ((1U << 31) | 6),
IPC_EVENT_TICK = ((1U << 31) | 7),
// sway-specific event types
IPC_EVENT_BAR_STATE_UPDATE = ((1U << 31) | 20),
IPC_EVENT_INPUT = ((1U << 31) | 21),
};

View File

@ -0,0 +1,67 @@
#pragma once
#include <fmt/format.h>
#include <xkbcommon/xkbregistry.h>
#include <map>
#include <string>
#include "AButton.hpp"
#include "bar.hpp"
#include "client.hpp"
#include "modules/sway/ipc/client.hpp"
#include "util/json.hpp"
namespace waybar::modules::sway {
class Language : public AButton, public sigc::trackable {
public:
Language(const std::string& id, const Json::Value& config);
~Language() = default;
auto update() -> void;
private:
enum class DispayedShortFlag { None = 0, ShortName = 1, ShortDescription = 1 << 1 };
struct Layout {
std::string full_name;
std::string short_name;
std::string variant;
std::string short_description;
std::string country_flag() const;
};
class XKBContext {
public:
XKBContext();
~XKBContext();
auto next_layout() -> Layout*;
private:
rxkb_context* context_ = nullptr;
rxkb_layout* xkb_layout_ = nullptr;
Layout* layout_ = nullptr;
std::map<std::string, rxkb_layout*> base_layouts_by_name_;
};
void onEvent(const struct Ipc::ipc_response&);
void onCmd(const struct Ipc::ipc_response&);
auto set_current_layout(std::string current_layout) -> void;
auto init_layouts_map(const std::vector<std::string>& used_layouts) -> void;
const static std::string XKB_LAYOUT_NAMES_KEY;
const static std::string XKB_ACTIVE_LAYOUT_NAME_KEY;
Layout layout_;
std::string tooltip_format_ = "";
std::map<std::string, Layout> layouts_map_;
bool is_variant_displayed;
std::byte displayed_short_flag = static_cast<std::byte>(DispayedShortFlag::None);
util::JsonParser parser_;
std::mutex mutex_;
Ipc ipc_;
};
} // namespace waybar::modules::sway

View File

@ -1,7 +1,8 @@
#pragma once
#include <fmt/format.h>
#include "ALabel.hpp"
#include "AButton.hpp"
#include "bar.hpp"
#include "client.hpp"
#include "modules/sway/ipc/client.hpp"
@ -9,7 +10,7 @@
namespace waybar::modules::sway {
class Mode : public ALabel, public sigc::trackable {
class Mode : public AButton, public sigc::trackable {
public:
Mode(const std::string&, const Json::Value&);
~Mode() = default;

View File

@ -0,0 +1,35 @@
#pragma once
#include <gtkmm/label.h>
#include <mutex>
#include <string>
#include "ALabel.hpp"
#include "bar.hpp"
#include "client.hpp"
#include "modules/sway/ipc/client.hpp"
#include "util/json.hpp"
namespace waybar::modules::sway {
class Scratchpad : public ALabel {
public:
Scratchpad(const std::string&, const Json::Value&);
~Scratchpad() = default;
auto update() -> void;
private:
auto getTree() -> void;
auto onCmd(const struct Ipc::ipc_response&) -> void;
auto onEvent(const struct Ipc::ipc_response&) -> void;
std::string tooltip_format_;
bool show_empty_;
bool tooltip_enabled_;
std::string tooltip_text_;
int count_;
std::mutex mutex_;
Ipc ipc_;
util::JsonParser parser_;
};
} // namespace waybar::modules::sway

View File

@ -1,8 +1,10 @@
#pragma once
#include <fmt/format.h>
#include <tuple>
#include "ALabel.hpp"
#include "AIconLabel.hpp"
#include "bar.hpp"
#include "client.hpp"
#include "modules/sway/ipc/client.hpp"
@ -10,7 +12,7 @@
namespace waybar::modules::sway {
class Window : public ALabel, public sigc::trackable {
class Window : public AIconLabel, public sigc::trackable {
public:
Window(const std::string&, const waybar::Bar&, const Json::Value&);
~Window() = default;
@ -19,16 +21,23 @@ class Window : public ALabel, public sigc::trackable {
private:
void onEvent(const struct Ipc::ipc_response&);
void onCmd(const struct Ipc::ipc_response&);
std::tuple<std::size_t, int, std::string, std::string> getFocusedNode(const Json::Value& nodes,
std::string& output);
std::tuple<std::size_t, int, std::string, std::string, std::string, std::string> getFocusedNode(
const Json::Value& nodes, std::string& output);
void getTree();
void updateAppIconName();
void updateAppIcon();
const Bar& bar_;
std::string window_;
int windowId_;
std::string app_id_;
std::string app_class_;
std::string old_app_id_;
std::size_t app_nb_;
std::string shell_;
unsigned app_icon_size_{24};
bool update_app_icon_{true};
std::string app_icon_name_;
util::JsonParser parser_;
std::mutex mutex_;
Ipc ipc_;

View File

@ -1,10 +1,11 @@
#pragma once
#include <unordered_map>
#include <fmt/format.h>
#include <gtkmm/button.h>
#include <gtkmm/label.h>
#include <unordered_map>
#include "AModule.hpp"
#include "bar.hpp"
#include "client.hpp"
@ -20,7 +21,7 @@ class Workspaces : public AModule, public sigc::trackable {
auto update() -> void;
private:
static inline const std::string workspace_switch_cmd_ = "workspace --no-auto-back-and-forth \"{}\"";
static inline const std::string workspace_switch_cmd_ = "workspace {} \"{}\"";
static int convertWorkspaceNameToNum(std::string name);

View File

@ -1,13 +1,15 @@
#pragma once
#include <fmt/format.h>
#include <fstream>
#include "ALabel.hpp"
#include "AButton.hpp"
#include "util/sleeper_thread.hpp"
namespace waybar::modules {
class Temperature : public ALabel {
class Temperature : public AButton {
public:
Temperature(const std::string&, const Json::Value&);
~Temperature() = default;

View File

@ -0,0 +1,79 @@
#pragma once
#include <libupower-glib/upower.h>
#include <iostream>
#include <map>
#include <string>
#include <unordered_map>
#include "ALabel.hpp"
#include "glibconfig.h"
#include "gtkmm/box.h"
#include "gtkmm/image.h"
#include "gtkmm/label.h"
#include "modules/upower/upower_tooltip.hpp"
namespace waybar::modules::upower {
class UPower : public AModule {
public:
UPower(const std::string &, const Json::Value &);
~UPower();
auto update() -> void;
private:
typedef std::unordered_map<std::string, UpDevice *> Devices;
const std::string DEFAULT_FORMAT = "{percentage}";
const std::string DEFAULT_FORMAT_ALT = "{percentage} {time}";
static void deviceAdded_cb(UpClient *client, UpDevice *device, gpointer data);
static void deviceRemoved_cb(UpClient *client, const gchar *objectPath, gpointer data);
static void deviceNotify_cb(UpDevice *device, GParamSpec *pspec, gpointer user_data);
static void prepareForSleep_cb(GDBusConnection *system_bus, const gchar *sender_name,
const gchar *object_path, const gchar *interface_name,
const gchar *signal_name, GVariant *parameters,
gpointer user_data);
static void upowerAppear(GDBusConnection *conn, const gchar *name, const gchar *name_owner,
gpointer data);
static void upowerDisappear(GDBusConnection *connection, const gchar *name, gpointer user_data);
void removeDevice(const gchar *objectPath);
void addDevice(UpDevice *device);
void setDisplayDevice();
void resetDevices();
void removeDevices();
bool show_tooltip_callback(int, int, bool, const Glib::RefPtr<Gtk::Tooltip> &tooltip);
bool handleToggle(GdkEventButton *const &);
std::string timeToString(gint64 time);
const std::string getDeviceStatus(UpDeviceState &state);
Gtk::Box box_;
Gtk::Image icon_;
Gtk::Label label_;
// Config
bool hideIfEmpty = true;
bool tooltip_enabled = true;
uint tooltip_spacing = 4;
uint tooltip_padding = 4;
uint iconSize = 20;
std::string format = DEFAULT_FORMAT;
std::string format_alt = DEFAULT_FORMAT_ALT;
Devices devices;
std::mutex m_Mutex;
UpClient *client;
UpDevice *displayDevice;
guint login1_id;
GDBusConnection *login1_connection;
UPowerTooltip *upower_tooltip;
std::string lastStatus;
bool showAltText;
bool upowerRunning;
guint upowerWatcher_id;
};
} // namespace waybar::modules::upower

View File

@ -0,0 +1,32 @@
#pragma once
#include <libupower-glib/upower.h>
#include <unordered_map>
#include "gtkmm/box.h"
#include "gtkmm/label.h"
#include "gtkmm/window.h"
namespace waybar::modules::upower {
class UPowerTooltip : public Gtk::Window {
private:
typedef std::unordered_map<std::string, UpDevice*> Devices;
const std::string getDeviceIcon(UpDeviceKind& kind);
Gtk::Box* contentBox;
uint iconSize;
uint tooltipSpacing;
uint tooltipPadding;
public:
UPowerTooltip(uint iconSize, uint tooltipSpacing, uint tooltipPadding);
~UPowerTooltip();
uint updateTooltip(Devices& devices);
};
} // namespace waybar::modules::upower

34
include/modules/user.hpp Normal file
View File

@ -0,0 +1,34 @@
#pragma once
#include <fmt/chrono.h>
#include <gdkmm/pixbuf.h>
#include <glibmm/refptr.h>
#include "AIconLabel.hpp"
#include "util/sleeper_thread.hpp"
namespace waybar::modules {
class User : public AIconLabel {
public:
User(const std::string&, const Json::Value&);
~User() = default;
auto update() -> void;
private:
util::SleeperThread thread_;
Glib::RefPtr<Gdk::Pixbuf> pixbuf_;
static constexpr inline int defaultUserImageWidth_ = 20;
static constexpr inline int defaultUserImageHeight_ = 20;
long uptime_as_seconds();
std::string get_user_login();
std::string get_user_home_dir();
std::string get_default_user_avatar_path();
void init_default_user_avatar(int width, int height);
void init_user_avatar(const std::string& path, int width, int height);
void init_avatar(const Json::Value& config);
void init_update_worker();
};
} // namespace waybar::modules

View File

@ -1,37 +1,35 @@
#pragma once
#include <gdk/gdk.h>
#include <glibmm/refptr.h>
#include <gtkmm/box.h>
#include <gtkmm/button.h>
#include <gtkmm/icontheme.h>
#include <gtkmm/image.h>
#include <gtkmm/label.h>
#include <wayland-client.h>
#include <map>
#include <memory>
#include <string>
#include <unordered_set>
#include <vector>
#include "AModule.hpp"
#include "bar.hpp"
#include "client.hpp"
#include "giomm/desktopappinfo.h"
#include "util/json.hpp"
#include <memory>
#include <string>
#include <vector>
#include <gdk/gdk.h>
#include <glibmm/refptr.h>
#include <gtkmm/box.h>
#include <gtkmm/button.h>
#include <gtkmm/image.h>
#include <gtkmm/label.h>
#include <gtkmm/icontheme.h>
#include <wayland-client.h>
#include "wlr-foreign-toplevel-management-unstable-v1-client-protocol.h"
namespace waybar::modules::wlr {
class Taskbar;
class Task
{
class Task {
public:
Task(const waybar::Bar&, const Json::Value&, Taskbar*,
struct zwlr_foreign_toplevel_handle_v1 *, struct wl_seat*);
Task(const waybar::Bar &, const Json::Value &, Taskbar *,
struct zwlr_foreign_toplevel_handle_v1 *, struct wl_seat *);
~Task();
public:
@ -60,21 +58,33 @@ class Task
Gtk::Image icon_;
Gtk::Label text_before_;
Gtk::Label text_after_;
bool button_visible_;
Glib::RefPtr<Gio::DesktopAppInfo> app_info_;
bool button_visible_ = false;
bool ignored_ = false;
bool with_icon_;
bool with_icon_ = false;
bool with_name_ = false;
std::string format_before_;
std::string format_after_;
std::string format_tooltip_;
std::string name_;
std::string title_;
std::string app_id_;
uint32_t state_;
uint32_t state_ = 0;
int32_t drag_start_x;
int32_t drag_start_y;
int32_t drag_start_button = -1;
private:
std::string repr() const;
std::string state_string(bool = false) const;
void set_app_info_from_app_id_list(const std::string &app_id_list);
bool image_load_icon(Gtk::Image &image, const Glib::RefPtr<Gtk::IconTheme> &icon_theme,
Glib::RefPtr<Gio::DesktopAppInfo> app_info, int size);
void hide_if_ignored();
public:
/* Getter functions */
@ -99,10 +109,16 @@ class Task
/* Callbacks for Gtk events */
bool handle_clicked(GdkEventButton *);
bool handle_button_release(GdkEventButton *);
bool handle_motion_notify(GdkEventMotion *);
void handle_drag_data_get(const Glib::RefPtr<Gdk::DragContext> &context,
Gtk::SelectionData &selection_data, guint info, guint time);
void handle_drag_data_received(const Glib::RefPtr<Gdk::DragContext> &context, int x, int y,
Gtk::SelectionData selection_data, guint info, guint time);
public:
bool operator==(const Task&) const;
bool operator!=(const Task&) const;
bool operator==(const Task &) const;
bool operator!=(const Task &) const;
public:
void update();
@ -118,11 +134,9 @@ class Task
using TaskPtr = std::unique_ptr<Task>;
class Taskbar : public waybar::AModule
{
class Taskbar : public waybar::AModule {
public:
Taskbar(const std::string&, const waybar::Bar&, const Json::Value&);
Taskbar(const std::string &, const waybar::Bar &, const Json::Value &);
~Taskbar();
void update();
@ -132,14 +146,16 @@ class Taskbar : public waybar::AModule
std::vector<TaskPtr> tasks_;
std::vector<Glib::RefPtr<Gtk::IconTheme>> icon_themes_;
std::unordered_set<std::string> ignore_list_;
std::map<std::string, std::string> app_ids_replace_map_;
struct zwlr_foreign_toplevel_manager_v1 *manager_;
struct wl_seat *seat_;
public:
/* Callbacks for global registration */
void register_manager(struct wl_registry*, uint32_t name, uint32_t version);
void register_seat(struct wl_registry*, uint32_t name, uint32_t version);
void register_manager(struct wl_registry *, uint32_t name, uint32_t version);
void register_seat(struct wl_registry *, uint32_t name, uint32_t version);
/* Callbacks for the wlr protocol */
void handle_toplevel_create(struct zwlr_foreign_toplevel_handle_v1 *);
@ -154,7 +170,9 @@ class Taskbar : public waybar::AModule
bool show_output(struct wl_output *) const;
bool all_outputs() const;
std::vector<Glib::RefPtr<Gtk::IconTheme>> icon_themes() const;
const std::vector<Glib::RefPtr<Gtk::IconTheme>> &icon_themes() const;
const std::unordered_set<std::string> &ignore_list() const;
const std::map<std::string, std::string> &app_ids_replace_map() const;
};
} /* namespace waybar::modules::wlr */

View File

@ -0,0 +1,161 @@
#pragma once
#include <fmt/format.h>
#include <gtkmm/button.h>
#include <gtkmm/image.h>
#include <gtkmm/label.h>
#include <functional>
#include <map>
#include <memory>
#include <vector>
#include "AModule.hpp"
#include "bar.hpp"
#include "ext-workspace-unstable-v1-client-protocol.h"
namespace waybar::modules::wlr {
class WorkspaceManager;
class WorkspaceGroup;
class Workspace {
public:
Workspace(const waybar::Bar &bar, const Json::Value &config, WorkspaceGroup &workspace_group,
zext_workspace_handle_v1 *workspace, uint32_t id);
~Workspace();
auto update() -> void;
auto id() const -> uint32_t { return id_; }
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_hidden() const -> bool { return state_ & static_cast<uint32_t>(State::HIDDEN); }
// wlr stuff
auto handle_name(const std::string &name) -> void;
auto handle_coordinates(const std::vector<uint32_t> &coordinates) -> void;
auto handle_state(const std::vector<uint32_t> &state) -> void;
auto handle_remove() -> void;
auto handle_done() -> void;
auto handle_clicked(GdkEventButton *bt) -> bool;
auto show() -> void;
auto hide() -> void;
auto get_button_ref() -> Gtk::Button & { return button_; }
auto get_name() -> std::string & { return name_; }
auto get_coords() -> std::vector<uint32_t> & { return coordinates_; }
enum class State {
ACTIVE = (1 << 0),
URGENT = (1 << 1),
HIDDEN = (1 << 2),
};
private:
auto get_icon() -> std::string;
const Bar &bar_;
const Json::Value &config_;
WorkspaceGroup &workspace_group_;
// wlr stuff
zext_workspace_handle_v1 *workspace_handle_;
uint32_t state_ = 0;
uint32_t id_;
std::string name_;
std::vector<uint32_t> coordinates_;
static std::map<std::string, std::string> icons_map_;
std::string format_;
bool with_icon_ = false;
Gtk::Button button_;
Gtk::Box content_;
Gtk::Label label_;
};
class WorkspaceGroup {
public:
WorkspaceGroup(const waybar::Bar &bar, Gtk::Box &box, const Json::Value &config,
WorkspaceManager &manager, zext_workspace_group_handle_v1 *workspace_group_handle,
uint32_t id);
~WorkspaceGroup();
auto update() -> void;
auto id() const -> uint32_t { return id_; }
auto is_visible() const -> bool;
auto remove_workspace(uint32_t id_) -> void;
auto active_only() const -> bool;
auto creation_delayed() const -> bool;
auto workspaces() -> std::vector<std::unique_ptr<Workspace>> & { return workspaces_; }
auto sort_workspaces() -> void;
auto set_need_to_sort() -> void { need_to_sort = true; }
auto add_button(Gtk::Button &button) -> void;
auto remove_button(Gtk::Button &button) -> void;
// wlr stuff
auto handle_workspace_create(zext_workspace_handle_v1 *workspace_handle) -> void;
auto handle_remove() -> void;
auto handle_output_enter(wl_output *output) -> void;
auto handle_output_leave() -> void;
auto handle_done() -> void;
auto commit() -> void;
private:
static uint32_t workspace_global_id;
const waybar::Bar &bar_;
Gtk::Box &box_;
const Json::Value &config_;
WorkspaceManager &workspace_manager_;
// wlr stuff
zext_workspace_group_handle_v1 *workspace_group_handle_;
wl_output *output_ = nullptr;
uint32_t id_;
std::vector<std::unique_ptr<Workspace>> workspaces_;
bool need_to_sort = false;
};
class WorkspaceManager : public AModule {
public:
WorkspaceManager(const std::string &id, const waybar::Bar &bar, const Json::Value &config);
~WorkspaceManager() override;
auto update() -> void override;
auto all_outputs() const -> bool { return all_outputs_; }
auto active_only() const -> bool { return active_only_; }
auto workspace_comparator() const
-> std::function<bool(std::unique_ptr<Workspace> &, std::unique_ptr<Workspace> &)>;
auto creation_delayed() const -> bool { return creation_delayed_; }
auto sort_workspaces() -> void;
auto remove_workspace_group(uint32_t id_) -> void;
// wlr stuff
auto register_manager(wl_registry *registry, uint32_t name, uint32_t version) -> void;
auto handle_workspace_group_create(zext_workspace_group_handle_v1 *workspace_group_handle)
-> void;
auto handle_done() -> void;
auto handle_finished() -> void;
auto commit() -> void;
private:
const waybar::Bar &bar_;
Gtk::Box box_;
std::vector<std::unique_ptr<WorkspaceGroup>> groups_;
// wlr stuff
zext_workspace_manager_v1 *workspace_manager_ = nullptr;
static uint32_t group_global_id;
bool sort_by_name_ = true;
bool sort_by_coordinates_ = true;
bool sort_by_number_ = false;
bool all_outputs_ = false;
bool active_only_ = false;
bool creation_delayed_ = false;
};
} // namespace waybar::modules::wlr

View File

@ -0,0 +1,10 @@
#include "ext-workspace-unstable-v1-client-protocol.h"
namespace waybar::modules::wlr {
void add_registry_listener(void *data);
void add_workspace_listener(zext_workspace_handle_v1 *workspace_handle, void *data);
void add_workspace_group_listener(zext_workspace_group_handle_v1 *workspace_group_handle,
void *data);
zext_workspace_manager_v1 *workspace_manager_bind(wl_registry *registry, uint32_t name,
uint32_t version, void *data);
} // namespace waybar::modules::wlr

View File

@ -0,0 +1,75 @@
#pragma once
#include <glibmm/dispatcher.h>
#include <sigc++/signal.h>
#include <functional>
#include <mutex>
#include <queue>
#include <thread>
#include <tuple>
#include <type_traits>
#include <utility>
namespace waybar {
/**
* Thread-safe signal wrapper.
* Uses Glib::Dispatcher to pass events to another thread and locked queue to pass the arguments.
*/
template <typename... Args>
struct SafeSignal : sigc::signal<void(std::decay_t<Args>...)> {
public:
SafeSignal() { dp_.connect(sigc::mem_fun(*this, &SafeSignal::handle_event)); }
template <typename... EmitArgs>
void emit(EmitArgs&&... args) {
if (main_tid_ == std::this_thread::get_id()) {
/*
* Bypass the queue if the method is called the main thread.
* Ensures that events emitted from the main thread are processed synchronously and saves a
* few CPU cycles on locking/queuing.
* As a downside, this makes main thread events prioritized over the other threads and
* disrupts chronological order.
*/
signal_t::emit(std::forward<EmitArgs>(args)...);
} else {
{
std::unique_lock lock(mutex_);
queue_.emplace(std::forward<EmitArgs>(args)...);
}
dp_.emit();
}
}
template <typename... EmitArgs>
inline void operator()(EmitArgs&&... args) {
emit(std::forward<EmitArgs>(args)...);
}
protected:
using signal_t = sigc::signal<void(std::decay_t<Args>...)>;
using slot_t = decltype(std::declval<signal_t>().make_slot());
using arg_tuple_t = std::tuple<std::decay_t<Args>...>;
// ensure that unwrapped methods are not accessible
using signal_t::emit_reverse;
using signal_t::make_slot;
void handle_event() {
for (std::unique_lock lock(mutex_); !queue_.empty(); lock.lock()) {
auto args = queue_.front();
queue_.pop();
lock.unlock();
std::apply(cached_fn_, args);
}
}
Glib::Dispatcher dp_;
std::mutex mutex_;
std::queue<arg_tuple_t> queue_;
const std::thread::id main_tid_ = std::this_thread::get_id();
// cache functor for signal emission to avoid recreating it on each event
const slot_t cached_fn_ = make_slot();
};
} // namespace waybar

File diff suppressed because it is too large Load Diff

View File

@ -5,6 +5,13 @@
#include <sys/wait.h>
#include <unistd.h>
#ifdef __linux__
#include <sys/prctl.h>
#endif
#ifdef __FreeBSD__
#include <sys/procctl.h>
#endif
#include <array>
extern std::mutex reap_mtx;
@ -61,7 +68,10 @@ inline int close(FILE* fp, pid_t pid) {
inline FILE* open(const std::string& cmd, int& pid) {
if (cmd == "") return nullptr;
int fd[2];
pipe(fd);
if (pipe(fd) != 0) {
spdlog::error("Unable to pipe fd");
return nullptr;
}
pid_t child_pid = fork();
@ -77,6 +87,18 @@ inline FILE* open(const std::string& cmd, int& pid) {
// Reset sigmask
err = pthread_sigmask(SIG_UNBLOCK, &mask, nullptr);
if (err != 0) spdlog::error("pthread_sigmask in open failed: {}", strerror(err));
// Kill child if Waybar exits
int deathsig = SIGTERM;
#ifdef __linux__
if (prctl(PR_SET_PDEATHSIG, deathsig) != 0) {
spdlog::error("prctl(PR_SET_PDEATHSIG) in open failed: {}", strerror(errno));
}
#endif
#ifdef __FreeBSD__
if (procctl(P_PID, 0, PROC_PDEATHSIG_CTL, reinterpret_cast<void*>(&deathsig)) == -1) {
spdlog::error("procctl(PROC_PDEATHSIG_CTL) in open failed: {}", strerror(errno));
}
#endif
::close(fd[0]);
dup2(fd[1], 1);
setpgid(child_pid, child_pid);

View File

@ -1,26 +1,26 @@
#pragma once
#include <fmt/format.h>
#include <glibmm/ustring.h>
class pow_format {
public:
pow_format(long long val, std::string&& unit, bool binary = false):
val_(val), unit_(unit), binary_(binary) { };
pow_format(long long val, std::string&& unit, bool binary = false)
: val_(val), unit_(unit), binary_(binary){};
long long val_;
std::string unit_;
bool binary_;
};
namespace fmt {
template <>
struct formatter<pow_format> {
template <>
struct formatter<pow_format> {
char spec = 0;
int width = 0;
template <typename ParseContext>
constexpr auto parse(ParseContext& ctx) -> decltype (ctx.begin()) {
constexpr auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {
auto it = ctx.begin(), end = ctx.end();
if (it != end && *it == ':') ++it;
if (it && (*it == '>' || *it == '<' || *it == '=')) {
@ -35,29 +35,34 @@ namespace fmt {
// The rationale for ignoring it is that the only reason to specify
// an alignment and a with is to get a fixed width bar, and ">" is
// sufficient in this implementation.
#if FMT_VERSION < 80000
width = parse_nonnegative_int(it, end, ctx);
#else
width = detail::parse_nonnegative_int(it, end, -1);
#endif
}
return it;
}
template<class FormatContext>
auto format(const pow_format& s, FormatContext &ctx) -> decltype (ctx.out()) {
const char* units[] = { "", "k", "M", "G", "T", "P", nullptr};
template <class FormatContext>
auto format(const pow_format& s, FormatContext& ctx) -> decltype(ctx.out()) {
const char* units[] = {"", "k", "M", "G", "T", "P", nullptr};
auto base = s.binary_ ? 1024ull : 1000ll;
auto fraction = (double) s.val_;
auto fraction = (double)s.val_;
int pow;
for (pow = 0; units[pow+1] != nullptr && fraction / base >= 1; ++pow) {
for (pow = 0; units[pow + 1] != nullptr && fraction / base >= 1; ++pow) {
fraction /= base;
}
auto max_width = 4 // coeff in {:.3g} format
+ 1 // prefix from units array
auto number_width = 5 // coeff in {:.1f} format
+ s.binary_; // potential 4th digit before the decimal point
auto max_width = number_width + 1 // prefix from units array
+ s.binary_ // for the 'i' in GiB.
+ s.unit_.length();
const char * format;
const char* format;
std::string string;
switch (spec) {
case '>':
@ -65,20 +70,30 @@ namespace fmt {
case '<':
return format_to(ctx.out(), "{:<{}}", fmt::format("{}", s), max_width);
case '=':
format = "{coefficient:<4.3g}{padding}{prefix}{unit}";
format = "{coefficient:<{number_width}.1f}{padding}{prefix}{unit}";
break;
case 0:
default:
format = "{coefficient:.3g}{prefix}{unit}";
format = "{coefficient:.1f}{prefix}{unit}";
break;
}
return format_to(ctx.out(), format
, fmt::arg("coefficient", fraction)
, fmt::arg("prefix", std::string() + units[pow] + ((s.binary_ && pow) ? "i" : ""))
, fmt::arg("unit", s.unit_)
, fmt::arg("padding", pow ? "" : s.binary_ ? " " : " ")
);
return format_to(
ctx.out(), format, fmt::arg("coefficient", fraction),
fmt::arg("number_width", number_width),
fmt::arg("prefix", std::string() + units[pow] + ((s.binary_ && pow) ? "i" : "")),
fmt::arg("unit", s.unit_),
fmt::arg("padding", pow ? ""
: s.binary_ ? " "
: " "));
}
};
}
};
// Glib ustirng support
template <>
struct formatter<Glib::ustring> : formatter<std::string> {
template <typename FormatContext>
auto format(const Glib::ustring& value, FormatContext& ctx) {
return formatter<std::string>::format(value, ctx);
}
};
} // namespace fmt

View File

@ -1,7 +1,15 @@
#pragma once
#include <fmt/ostream.h>
#include <json/json.h>
#if (FMT_VERSION >= 90000)
template <>
struct fmt::formatter<Json::Value> : ostream_formatter {};
#endif
namespace waybar::util {
struct JsonParser {

View File

@ -0,0 +1,8 @@
#pragma once
#include <json/json.h>
#include <string>
namespace waybar::util {
std::string rewriteTitle(const std::string&, const Json::Value&);
}

View File

@ -1,19 +1,26 @@
#pragma once
#include <glibmm/iochannel.h>
#include <linux/rfkill.h>
#include <sigc++/signal.h>
#include <sigc++/trackable.h>
namespace waybar::util {
class Rfkill {
class Rfkill : public sigc::trackable {
public:
Rfkill(enum rfkill_type rfkill_type);
~Rfkill() = default;
void waitForEvent();
~Rfkill();
bool getState() const;
sigc::signal<void(struct rfkill_event&)> on_update;
private:
enum rfkill_type rfkill_type_;
int state_ = 0;
bool state_ = false;
int fd_ = -1;
bool on_event(Glib::IOCondition cond);
};
} // namespace waybar::util

View File

@ -0,0 +1,6 @@
#pragma once
#include <string>
namespace waybar::util {
std::string sanitize_string(std::string str);
} // namespace waybar::util

View File

@ -8,6 +8,21 @@
namespace waybar::util {
/**
* Defer pthread_cancel until the end of a current scope.
*
* Required to protect a scope where it's unsafe to raise `__forced_unwind` exception.
* An example of these is a call of a method marked as `noexcept`; an attempt to cancel within such
* a method may result in a `std::terminate` call.
*/
class CancellationGuard {
int oldstate;
public:
CancellationGuard() { pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstate); }
~CancellationGuard() { pthread_setcancelstate(oldstate, &oldstate); }
};
class SleeperThread {
public:
SleeperThread() = default;
@ -34,6 +49,7 @@ class SleeperThread {
auto sleep_for(std::chrono::system_clock::duration dur) {
std::unique_lock lk(mutex_);
CancellationGuard cancel_lock;
return condvar_.wait_for(lk, dur, [this] { return signal_ || !do_run_; });
}
@ -41,6 +57,7 @@ class SleeperThread {
std::chrono::time_point<std::chrono::system_clock, std::chrono::system_clock::duration>
time_point) {
std::unique_lock lk(mutex_);
CancellationGuard cancel_lock;
return condvar_.wait_until(lk, time_point, [this] { return signal_ || !do_run_; });
}

17
include/util/string.hpp Normal file
View File

@ -0,0 +1,17 @@
#pragma once
#include <string>
const std::string WHITESPACE = " \n\r\t\f\v";
inline std::string ltrim(const std::string& s) {
size_t begin = s.find_first_not_of(WHITESPACE);
return (begin == std::string::npos) ? "" : s.substr(begin);
}
inline std::string rtrim(const std::string& s) {
size_t end = s.find_last_not_of(WHITESPACE);
return (end == std::string::npos) ? "" : s.substr(0, end + 1);
}
inline std::string trim(const std::string& s) { return rtrim(ltrim(s)); }

View File

@ -0,0 +1,5 @@
#pragma once
#include <glibmm/ustring.h>
// calculate column width of ustring
int ustring_clen(const Glib::ustring &str);

View File

@ -0,0 +1,39 @@
#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));
}
};

View File

@ -24,6 +24,14 @@ The *backlight* module displays the current backlight level.
typeof: integer ++
The maximum length in characters 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.
*rotate*: ++
typeof: integer ++
Positive value to rotate the text label.

View File

@ -20,7 +20,12 @@ The *battery* module displays the current capacity and state (eg. charging) of y
*full-at*: ++
typeof: integer ++
Define the max percentage of the battery, useful for an old battery, e.g. 96
Define the max percentage of the battery, for when you've set the battery to stop charging at a lower level to save it. For example, if you've set the battery to stop at 80% that will become the new 100%.
*design-capacity*: ++
typeof: bool ++
default: false ++
Option to use the battery design capacity instead of it's current maximal capacity.
*interval*: ++
typeof: integer ++
@ -34,7 +39,7 @@ The *battery* module displays the current capacity and state (eg. charging) of y
*format*: ++
typeof: string ++
default: {capacity}% ++
The format, how the time should be displayed.
The format, how information should be displayed.
*format-time*: ++
typeof: string ++
@ -50,6 +55,14 @@ The *battery* module displays the current capacity and state (eg. charging) of y
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.
*rotate*: ++
typeof: integer++
Positive value to rotate the text label.
@ -91,6 +104,8 @@ The *battery* module displays the current capacity and state (eg. charging) of y
*{capacity}*: Capacity in percentage
*{power}*: Power in watts
*{icon}*: Icon, as defined in *format-icons*.
*{time}*: Estimate of time until full or empty. Note that this is based on the power draw at the last refresh time, not an average.
@ -99,13 +114,14 @@ The *battery* module displays the current capacity and state (eg. charging) of y
The *battery* module allows you to define how time should be formatted via *format-time*.
The two arguments are:
The three arguments are:
*{H}*: Hours
*{M}*: Minutes
*{m}*: Zero-padded minutes
# CUSTOM FORMATS
The *battery* module allows to define custom formats based on up to two factors. The best fitting format will be selected.
The *battery* module allows one to define custom formats based on up to two factors. The best fitting format will be selected.
*format-<state>*: With *states*, a custom format can be set depending on the capacity of your battery.

View File

@ -6,26 +6,47 @@ waybar - bluetooth module
# DESCRIPTION
The *bluetooth* module displays information about the status of the device's bluetooth device.
The *bluetooth* module displays information about a bluetooth controller and its connections.
# CONFIGURATION
Addressed by *bluetooth*
*interval*: ++
typeof: integer ++
default: 60 ++
The interval in which the bluetooth state gets updated.
*controller*: ++
typeof: string ++
Use the controller with the defined alias. Otherwise a random controller is used. Recommended to define when there is more than 1 controller available to the system.
*format-device-preference*: ++
typeof: array ++
A ranking of bluetooth devices, addressed by their alias. The order is from *first displayed* to *last displayed*. ++
If this config option is not defined or none of the devices in the list are connected, it will fall back to showing the last connected device.
*format*: ++
typeof: string ++
default: *{icon}* ++
default: * {status}* ++
The format, how information should be displayed. This format is used when other formats aren't specified.
*format-disabled*: ++
typeof: string ++
This format is used when the displayed controller is disabled.
*format-off*: ++
typeof: string ++
This format is used when the displayed controller is turned off.
*format-on*: ++
typeof: string ++
This format is used when the displayed controller is turned on with no devices connected.
*format-connected*: ++
typeof: string ++
This format is used when the displayed controller is connected to at least 1 device.
*format-icons*: ++
typeof: array/object ++
Based on the device status, the corresponding icon gets selected. ++
The order is *low* to *high*. Or by the state if it is an object.
Based on the current battery percentage (see section *EXPERIMENTAL BATTERY PERCENTAGE FEATURE*), the corresponding icon gets selected. ++
The order is *low* to *high*. Will only show the current battery percentage icon in the *\*-connected-battery* config options. ++
Or by the state if it is an object. It will fall back to the enabled state if its derivatives are not defined (on, off, connected).
*rotate*: ++
typeof: integer ++
@ -35,6 +56,14 @@ Addressed by *bluetooth*
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.
@ -68,27 +97,106 @@ Addressed by *bluetooth*
typeof: string ++
The format, how information should be displayed in the tooltip. This format is used when other formats aren't specified.
*tooltip-format-disabled*: ++
typeof: string ++
This format is used when the displayed controller is disabled.
*tooltip-format-off*: ++
typeof: string ++
This format is used when the displayed controller is turned off.
*tooltip-format-on*: ++
typeof: string ++
This format is used when the displayed controller is turned on with no devices connected.
*tooltip-format-connected*: ++
typeof: string ++
This format is used when the displayed controller is connected to at least 1 device.
*tooltip-format-enumerate-connected*: ++
typeof: string ++
This format is used to define how each connected device should be displayed within the *device_enumerate* format replacement in the tooltip menu.
# FORMAT REPLACEMENTS
*{status}*: Status of the bluetooth device.
*{icon}*: Icon, as defined in *format-icons*.
*{num_connections}*: Number of connections the displayed controller has.
*{controller_address}*: Address of the displayed controller.
*{controller_address_type}*: Address type of the displayed controller.
*{controller_alias}*: Alias of the displayed controller.
*{device_address}*: Address of the displayed device.
*{device_address_type}*: Address type of the displayed device.
*{device_alias}*: Alias of the displayed device.
*{device_enumerate}*: Show a list of all connected devices, each on a seperate line. Define the format of each device with the *tooltip-format-enumerate-connected* ++
and/or *tooltip-format-enumerate-connected-battery* config options. Can only be used in the tooltip related format options.
# EXPERIMENTAL BATTERY PERCENTAGE FEATURE
At the time of writing, the experimental features of BlueZ need to be turned on, for the battery percentage options listed below to work.
## FORMAT REPLACEMENT
*{device_battery_percentage}*: Battery percentage of the displayed device if available. Use only in the config options defined below.
## CONFIGURATION
*format-connected-battery*: ++
typeof: string ++
This format is used when the displayed device provides its battery percentage.
*tooltip-format-connected-battery*: ++
typeof: string ++
This format is used when the displayed device provides its battery percentage.
*tooltip-format-enumerate-connected-battery*: ++
typeof: string ++
This format is used to define how each connected device with a battery should be displayed within the *device_enumerate* format replacement option. ++
When this config option is not defined, it will fall back on the *tooltip-format-enumerate-connected* config option.
# EXAMPLES
```
"bluetooth": {
"format": "{icon}",
"format-alt": "bluetooth: {status}",
"interval": 30,
"format-icons": {
"enabled": "",
"disabled": ""
},
"tooltip-format": "{status}"
// "controller": "controller1", // specify the alias of the controller if there are more than 1 on the system
"format": " {status}",
"format-disabled": "", // an empty format will hide the module
"format-connected": " {num_connections} connected",
"tooltip-format": "{controller_alias}\\t{controller_address}",
"tooltip-format-connected": "{controller_alias}\\t{controller_address}\\n\\n{device_enumerate}",
"tooltip-format-enumerate-connected": "{device_alias}\\t{device_address}"
}
```
```
"bluetooth": {
"format": " {status}",
"format-connected": " {device_alias}",
"format-connected-battery": " {device_alias} {device_battery_percentage}%",
// "format-device-preference": [ "device1", "device2" ], // preference list deciding the displayed device
"tooltip-format": "{controller_alias}\\t{controller_address}\\n\\n{num_connections} connected",
"tooltip-format-connected": "{controller_alias}\\t{controller_address}\\n\\n{num_connections} connected\\n\\n{device_enumerate}",
"tooltip-format-enumerate-connected": "{device_alias}\\t{device_address}",
"tooltip-format-enumerate-connected-battery": "{device_alias}\\t{device_address}\\t{device_battery_percentage}%"
}
```
# STYLE
- *#bluetooth*
- *#bluetooth.disabled*
- *#bluetooth.off*
- *#bluetooth.on*
- *#bluetooth.connected*
- *#bluetooth.discoverable*
- *#bluetooth.discovering*
- *#bluetooth.pairable*

View File

@ -24,7 +24,8 @@ The *clock* module displays the current date and time.
*timezone*: ++
typeof: string ++
default: inferred local timezone ++
The timezone to display the time in, e.g. America/New_York.
The timezone to display the time in, e.g. America/New_York. ++
This field will be ignored if *timezones* field is set and have at least one value.
*timezones*: ++
typeof: list of strings ++
@ -45,6 +46,14 @@ The *clock* module displays the current date and time.
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.
*rotate*: ++
typeof: integer ++
Positive value to rotate the text label.
@ -77,11 +86,17 @@ The *clock* module displays the current date and time.
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
*{calendar}*: Current month calendar
*{timezoned_time_list}*: List of time in the rest timezones, if more than one timezone is set in the config
# EXAMPLES

View File

@ -20,10 +20,23 @@ The *cpu* module displays the current cpu utilization.
default: {usage}% ++
The format, how information should be displayed. On {} data gets inserted.
*format-icons*: ++
typeof: array/object ++
Based on the current usage, the corresponding icon gets selected. ++
The order is *low* to *high*. Or by the state if it is an object.
*max-length*: ++
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.
*rotate*: ++
typeof: integer ++
Positive value to rotate the text label.
@ -69,9 +82,23 @@ The *cpu* module displays the current cpu utilization.
*{load}*: Current cpu load.
*{usage}*: Current cpu usage.
*{usage}*: Current overall cpu usage.
# EXAMPLE
*{usage*{n}*}*: Current cpu core n usage. Cores are numbered from zero, so first core will be {usage0} and 4th will be {usage3}.
*{avg_frequency}*: Current cpu average frequency (based on all cores) in GHz.
*{max_frequency}*: Current cpu max frequency (based on the core with the highest frequency) in GHz.
*{min_frequency}*: Current cpu min frequency (based on the core with the lowest frequency) in GHz.
*{icon}*: Icon for overall cpu usage.
*{icon*{n}*}*: Icon for cpu core n usage. Use like {icon0}.
# EXAMPLES
Basic configuration:
```
"cpu": {
@ -81,6 +108,16 @@ The *cpu* module displays the current cpu utilization.
}
```
Cpu usage per core rendered as icons:
```
"cpu": {
"interval": 1,
"format": "{icon0}{icon1}{icon2}{icon3} {usage:>2}% ",
"format-icons": ["▁", "▂", "▃", "▄", "▅", "▆", "▇", "█"],
},
```
# STYLE
- *#cpu*

View File

@ -67,6 +67,14 @@ Addressed by *custom/<name>*
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.
@ -143,7 +151,8 @@ $text\\n$tooltip\\n$class*
"max-length": 40,
"interval": 30, // Remove this if your script is endless and write in loop
"exec": "$HOME/.config/waybar/mediaplayer.sh 2> /dev/null", // Script in resources folder
"exec-if": "pgrep spotify"
"exec-if": "pgrep spotify",
"return-type": "json"
}
```

View File

@ -31,10 +31,22 @@ Addressed by *disk*
typeof: integer ++
Positive value to rotate the text label.
*states*: ++
typeof: array ++
A number of disk utilization states which get activated on certain percentage thresholds (percentage_used). See *waybar-states(5)*.
*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.

95
man/waybar-gamemode.5.scd Normal file
View File

@ -0,0 +1,95 @@
waybar-gamemode(5)
# NAME
waybar - gamemode module
# DESCRIPTION
The *gamemode* module displays if any game or application is running with ++
Feral Gamemode optimizations.
# CONFIGURATION
*format*: ++
typeof: string ++
default: {glyph} ++
The text format.
*format-alt*: ++
typeof: string ++
default: {glyph} {count} ++
The text format when toggled.
*tooltip*: ++
typeof: bool ++
defualt: true ++
Option to disable tooltip on hover.
*tooltip-format*: ++
typeof: string ++
default: Games running: {glyph} ++
The text format of the tooltip.
*hide-not-running*: ++
typeof: bool ++
default: true ++
Defines if the module should be hidden if no games are running.
*use-icon*: ++
typeof: bool ++
default: true ++
Defines if the module should display a GTK icon instead of the specified *glyph*
*glyph*: ++
typeof: string ++
default:  ++
The string icon to display. Only visible if *use-icon* is set to false.
*icon-name*: ++
typeof: string ++
default: input-gaming-symbolic ++
The GTK icon to display. Only visible if *use-icon* is set to true.
*icon-size*: ++
typeof: unsigned integer ++
default: 20 ++
Defines the size of the icons.
*icon-spacing*: ++
typeof: unsigned integer ++
default: 4 ++
Defines the spacing between the icon and the text.
# FORMAT REPLACEMENTS
*{glyph}*: The string icon glyph to use instead.
*{count}*: The amount of games running with gamemode optimizations.
# TOOLTIP FORMAT REPLACEMENTS
*{count}*: The amount of games running with gamemode optimizations.
# EXAMPLES
```
"gamemode": {
"format": "{glyph}",
"format-alt": "{glyph} {count}",
"glyph": "",
"hide-not-running": true,
"use-icon": true,
"icon-name": "input-gaming-symbolic",
"icon-spacing": 4,
"icon-size": 20,
"tooltip": true,
"tooltip-format": "Games running: {count}"
}
```
# STYLE
- *#gamemode*
- *#gamemode.running*

View File

@ -0,0 +1,43 @@
waybar-hyprland-language(5)
# NAME
waybar - hyprland language module
# DESCRIPTION
The *language* module displays the currently selected language.
# CONFIGURATION
Addressed by *hyprland/language*
*format*: ++
typeof: string ++
default: {} ++
The format, how information should be displayed. On {} the currently selected language is displayed.
*format-<lang>* ++
typeof: string++
Provide an alternative name to display per language where <lang> is the language of your choosing. Can be passed multiple times with multiple languages as shown by the example below.
*keyboard-name*: ++
typeof: string ++
Specifies which keyboard to use from hyprctl devices output. Using the option that begins with "AT Translated set..." is recommended.
# EXAMPLES
```
"hyprland/language": {
"format": "Lang: {}"
"format-us": "AMERICA, HELL YEAH!" // For American English
"format-tr": "As bayrakları" // For Turkish
"keyboard-name": "AT Translated Set 2 keyboard"
}
```
# STYLE
- *#language*

View File

@ -0,0 +1,50 @@
waybar-hyprland-window(5)
# NAME
waybar - hyprland window module
# DESCRIPTION
The *window* module displays the title of the currently focused window in Hyprland.
# CONFIGURATION
Addressed by *hyprland/window*
*format*: ++
typeof: string ++
default: {} ++
The format, how information should be displayed. On {} the current window title is displayed.
*rewrite*: ++
typeof: object ++
Rules to rewrite window title. See *rewrite rules*.
# 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 title is left unchanged.
Invalid expressions (e.g., mismatched parentheses) are skipped.
# EXAMPLES
```
"hyprland/window": {
"format": "{}",
"rewrite": {
"(.*) - Mozilla Firefox": "🌎 $1",
"(.*) - zsh": "> [$1]"
}
}
```
# STYLE
- *#window*

View File

@ -27,6 +27,14 @@ screensaving, also known as "presentation mode".
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. A click also toggles the state
@ -55,11 +63,28 @@ screensaving, also known as "presentation mode".
typeof: double ++
Threshold to be used when scrolling.
*start-activated*: ++
typeof: bool ++
default: *false* ++
Whether the inhibit should be activated when starting waybar.
*timeout*: ++
typeof: double ++
The number of minutes the inhibit should last.
*tooltip*: ++
typeof: bool ++
default: true ++
Option to disable tooltip on hover.
*tooltip-format-activated*: ++
typeof: string ++
This format is used when the inhibit is activated.
*tooltip-format-deactivated*: ++
typeof: string ++
This format is used when the inhibit is deactivated.
# FORMAT REPLACEMENTS
*{status}*: status (*activated* or *deactivated*)
@ -74,6 +99,7 @@ screensaving, also known as "presentation mode".
"format-icons": {
"activated": "",
"deactivated": ""
}
},
"timeout": 30.5
}
```

View File

@ -0,0 +1,92 @@
waybar-inhibitor(5)
# NAME
waybar - inhibitor module
# DESCRIPTION
The *inhibitor* module allows to take an inhibitor lock that logind provides.
See *systemd-inhibit*(1) for more information.
# CONFIGURATION
*what*: ++
typeof: string or array ++
The inhibitor lock or locks that should be taken when active. The available inhibitor locks are *idle*, *shutdown*, *sleep*, *handle-power-key*, *handle-suspend-key*, *handle-hibernate-key* and *handle-lid-switch*.
*format*: ++
typeof: string ++
The format, how the state should be displayed.
*format-icons*: ++
typeof: array ++
Based on the current state, the corresponding icon gets selected.
*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. A click also toggles the state
*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.
# FORMAT REPLACEMENTS
*{status}*: status (*activated* or *deactivated*)
*{icon}*: Icon, as defined in *format-icons*
# EXAMPLES
```
"inhibitor": {
"what": "handle-lid-switch",
"format": "{icon}",
"format-icons": {
"activated": "",
"deactivated": ""
}
}
```

112
man/waybar-jack.5.scd Normal file
View File

@ -0,0 +1,112 @@
waybar-jack(5)
# NAME
waybar - JACK module
# DESCRIPTION
The *jack* module displays the current state of the JACK server.
# CONFIGURATION
Addressed by *jack*
*format*: ++
typeof: string ++
default: *{load}%* ++
The format, how information should be displayed. This format is used when other formats aren't specified.
*format-connected*: ++
typeof: string ++
This format is used when the module is connected to the JACK server.
*format-disconnected*: ++
typeof: string ++
This format is used when the module is not connected to the JACK server.
*format-xrun*: ++
typeof: string ++
This format is used for one polling interval, when the JACK server reports an xrun.
*realtime*: ++
typeof: bool ++
default: *true* ++
Option to drop real-time privileges for the JACK client opened by Waybar.
*tooltip*: ++
typeof: bool ++
default: *true* ++
Option to disable tooltip on hover.
*tooltip-format*: ++
typeof: string ++
default: *{bufsize}/{samplerate} {latency}ms* ++
The format of information displayed in the tooltip.
*interval*: ++
typeof: integer ++
default: 1 ++
The interval in which the information gets polled.
*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.
# FORMAT REPLACEMENTS
*{load}*: The current CPU load estimated by JACK.
*{bufsize}*: The size of the JACK buffer.
*{samplerate}*: The samplerate at which the JACK server is running.
*{latency}*: The duration, in ms, of the current buffer size.
*{xruns}*: The number of xruns reported by the JACK server since starting Waybar.
# EXAMPLES
```
"jack": {
"format": "DSP {}%",
"format-xrun": "{xruns} xruns",
"format-disconnected": "DSP off",
"realtime": true
}
```
# STYLE
- *#jack*
- *#jack.connected*
- *#jack.disconnected*
- *#jack.xrun*

View File

@ -0,0 +1,88 @@
waybar-keyboard-state(5)
# NAME
waybar - keyboard-state module
# DESCRIPTION
The *keyboard-state* module displays the state of number lock, caps lock, and scroll lock.
You must be a member of the input group to use this module.
# CONFIGURATION
*interval*: ++
Deprecated, this module use event loop now, the interval has no effect.
typeof: integer ++
default: 1 ++
The interval, in seconds, to poll the keyboard state.
*format*: ++
typeof: string|object ++
default: {name} {icon} ++
The format, how information should be displayed. If a string, the same format is used for all keyboard states. If an object, the fields "numlock", "capslock", and "scrolllock" each specify the format for the corresponding state. Any unspecified states use the default format.
*format-icons*: ++
typeof: object ++
default: {"locked": "locked", "unlocked": "unlocked"} ++
Based on the keyboard state, the corresponding icon gets selected. The same set of icons is used for number, caps, and scroll lock, but the icon is selected from the set independently for each. See *icons*.
*numlock*: ++
typeof: bool ++
default: false ++
Display the number lock state.
*capslock*: ++
typeof: bool ++
default: false ++
Display the caps lock state.
*scrolllock*: ++
typeof: bool ++
default: false ++
Display the scroll lock state.
*device-path*: ++
typeof: string ++
default: chooses first valid input device ++
Which libevdev input device to show the state of. Libevdev devices can be found in /dev/input. The device should support number lock, caps lock, and scroll lock events.
# FORMAT REPLACEMENTS
*{name}*: Caps, Num, or Scroll.
*{icon}*: Icon, as defined in *format-icons*.
# ICONS
The following *format-icons* can be set.
- *locked*: Will be shown when the keyboard state is locked. Default "locked".
- *unlocked*: Will be shown when the keyboard state is not locked. Default "unlocked"
# EXAMPLE:
```
"keyboard-state": {
"numlock": true,
"capslock": true,
"format": "{name} {icon}",
"format-icons": {
"locked": "",
"unlocked": ""
}
}
```
# STYLE
- *#keyboard-state*
- *#keyboard-state label*
- *#keyboard-state label.locked*
- *#keyboard-state label.numlock*
- *#keyboard-state label.numlock.locked*
- *#keyboard-state label.capslock*
- *#keyboard-state label.capslock.locked*
- *#keyboard-state label.scrolllock*
- *#keyboard-state label.scrolllock.locked*

View File

@ -22,6 +22,11 @@ Addressed by *memory*
default: {percentage}% ++
The format, how information should be displayed.
*format-icons*: ++
typeof: array/object ++
Based on the current percentage, the corresponding icon gets selected. ++
The order is *low* to *high*. Or by the state if it is an object.
*rotate*: ++
typeof: integer ++
Positive value to rotate the text label.
@ -34,6 +39,14 @@ Addressed by *memory*
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.
@ -71,12 +84,20 @@ Addressed by *memory*
*{percentage}*: Percentage of memory in use.
*{swapPercentage}*: Percentage of swap in use.
*{total}*: Amount of total memory available in GiB.
*{swapTotal}*: Amount of total swap available in GiB.
*{used}*: Amount of used memory in GiB.
*{swapUsed}*: Amount of used swap in GiB.
*{avail}*: Amount of available memory in GiB.
*{swapAvail}*: Amount of available swap in GiB.
# EXAMPLES
```

View File

@ -20,6 +20,10 @@ Addressed by *mpd*
typeof: integer ++
The port MPD listens to. If empty, use the default port.
*password*: ++
typeof: string ++
The password required to connect to the MPD server. If empty, no password is sent to MPD.
*interval*: ++
typeof: integer++
default: 5 ++
@ -69,6 +73,22 @@ Addressed by *mpd*
default: "MPD (disconnected)" ++
Tooltip information displayed when the MPD server can't be reached.
*artist-len*: ++
typeof: integer ++
Maximum length of the Artist tag.
*album-len*: ++
typeof: integer ++
Maximum length of the Album tag.
*album-artist-len*: ++
typeof: integer ++
Maximum length of the Album Artist tag.
*title-len*: ++
typeof: integer ++
Maximum length of the Title tag.
*rotate*: ++
typeof: integer ++
Positive value to rotate the text label.
@ -77,6 +97,14 @@ Addressed by *mpd*
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.
@ -144,6 +172,8 @@ Addressed by *mpd*
*{date}*: The date of the current song
*{volume}*: The current volume in percent
*{elapsedTime}*: The current position of the current song. To format as a date/time (see example configuration)
*{totalTime}*: The length of the current song. To format as a date/time (see example configuration)

View File

@ -64,6 +64,14 @@ Addressed by *network*
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.
@ -123,6 +131,8 @@ Addressed by *network*
*{ipaddr}*: The first IP of the interface.
*{gwaddr}*: The default gateway for the interface
*{netmask}*: The subnetmask corresponding to the IP.
*{cidr}*: The subnetmask corresponding to the IP in CIDR notation.
@ -139,10 +149,20 @@ Addressed by *network*
*{bandwidthDownBits}*: Instant down speed in bits/seconds.
*{bandwidthTotalBits}*: Instant total speed in bits/seconds.
*{bandwidthUpOctets}*: Instant up speed in octets/seconds.
*{bandwidthDownOctets}*: Instant down speed in octets/seconds.
*{bandwidthTotalOctets}*: Instant total speed in octets/seconds.
*{bandwidthUpBytes}*: Instant up speed in bytes/seconds.
*{bandwidthDownBytes}*: Instant down speed in bytes/seconds.
*{bandwidthTotalBytes}*: Instant total speed in bytes/seconds.
*{icon}*: Icon, as defined in *format-icons*.
# EXAMPLES

View File

@ -50,6 +50,14 @@ Additionally you can control the volume by scrolling *up* or *down* while the cu
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.
*scroll-step*: ++
typeof: float ++
default: 1.0 ++
@ -88,6 +96,15 @@ Additionally you can control the volume by scrolling *up* or *down* while the cu
default: true ++
Option to disable tooltip on hover.
*max-volume*: ++
typeof: integer ++
default: 100 ++
The maximum volume that can be set, in percentage.
*ignored-sinks*: ++
typeof: array ++
Sinks in this list will not be shown as the active sink by Waybar. Entries should be the sink's description field.
# FORMAT REPLACEMENTS
*{desc}*: Pulseaudio port's description, for bluetooth it'll be the device name.
@ -101,6 +118,9 @@ Additionally you can control the volume by scrolling *up* or *down* while the cu
# ICONS:
The following strings for *format-icons* are supported.
- the device name
If they are found in the current PulseAudio port name, the corresponding icons will be selected.
- *default* (Shown, when no other port is found)
@ -123,6 +143,7 @@ If they are found in the current PulseAudio port name, the corresponding icons w
"format-bluetooth": "{volume}% {icon}",
"format-muted": "",
"format-icons": {
"alsa_output.pci-0000_00_1f.3.analog-stereo": "",
"headphones": "",
"handsfree": "",
"headset": "",

View File

@ -0,0 +1,75 @@
waybar-river-mode(5)
# NAME
waybar - river mode module
# DESCRIPTION
The *mode* module displays the current mapping mode of river.
# CONFIGURATION
Addressed by *river/mode*
*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.
*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.
# EXAMPLES
```
"river/mode": {
"format": " {}"
}
```
# STYLE
- *#mode*
- *#mode.<mode>*

Some files were not shown because too many files have changed in this diff Show More