Compare commits

...

880 Commits
0.9.15 ... gtk4

Author SHA1 Message Date
Alexis Rouillard
75d7b2f812 Merge pull request #4696 from luoqing510/gtk4
fix: add const qualifier to Glib::ustring formatter to fix compile error
2025-12-18 18:57:22 +01:00
luoQ
dd0f8a0ecf fix: add const qualifier to Glib::ustring formatter to fix compile error 2025-12-13 21:51:58 +08:00
Alexis Rouillard
b54e2c16f3 Merge pull request #2927 from LukashonakV/gtk4
Gtk4. Pick up PR#2836
2024-02-19 22:42:00 +01:00
Aleksei Bavshin
b32abf9966 refactor: merge BarSurface into Bar
With only one implementation left, the abstraction is no longer
necessary.
2024-02-19 23:02:47 +03:00
Aleksei Bavshin
2469851865 fix(bar): use std::string for mode names
`string_view` leads to UAF when reading custom mode definitions from the
configuration.
2024-02-19 22:47:25 +03:00
Aleksei Bavshin
a6d33db20f feat: add module class to the root elements of the modules
Previously, the only way to select all the module labels was with the
following kind of selector:
```css
.modules-left > widget > label,
.modules-center > widget > label,
.modules-right > widget > label {
    /* ... */
}
```
(and a matching block for the `box` containers).

Now, this can be expressed as
```css
label.module, box.module {
    /* ... */
}
```
2024-02-19 22:26:05 +03:00
Aleksei Bavshin
5a4a1a5595 refactor(bar): use Gtk enums for position and orientation
Ensure that the position and the corresponding CSS class on window are
always set.
2024-02-19 22:24:08 +03:00
Aleksei Bavshin
d6d164a27d feat!: drop RawSurfaceImpl with direct use of wlr-layer-shell
BREAKING CHANGE: gtk-layer-shell is now required and unconditionally
used. The corresponding config option is removed.

As a part of preparation for future versions of GTK, remove an ability
to use wlr-layer-shell directly. The APIs it required were dropped in
GTK4, and with the menus/tooltips positioning issue being practically
unsolvable it doesn't make sense to keep maintaining the code.
2024-02-17 22:00:38 +03:00
Aleksei Bavshin
8e33333c0b chore: update gtk-layer-shell subproject to 0.8.2 2024-02-17 21:52:03 +03:00
Alex
f1abc186b2 fix: merge 🥲 2024-01-12 10:08:20 +01:00
Alex
d5bc2f3335 Merge remote-tracking branch 'luka/gtk4' into gtk4 2024-01-12 10:06:47 +01:00
Alexis Rouillard
f744d906be Merge pull request #2820 from oxalica/feat/systemd-failed-units
Add module systemd-failed-units to monitor failed systemd units
2024-01-12 09:45:40 +01:00
Alexis Rouillard
fa3ce14b25 Merge pull request #2817 from Syndelis/fix/window-rewrite-multiple-bars-no-overlap
Fix/Hyprland/Workspaces: Window Rewrite on multiple non-overlapping bars
2024-01-12 09:44:03 +01:00
Alexis Rouillard
e6097229ce Merge pull request #2814 from khaneliman/flake-update
flake update and direnv fix
2024-01-12 09:43:19 +01:00
Austin Horstman
b239c77d74 fix: temporary catch2_3 override until upstreamed to nixpkgs 2024-01-10 12:17:46 -06:00
Brenno Lemos
9e08512927 feat: strip workspace qualifiers when creating windows 2024-01-10 02:24:51 -03:00
oxalica
eedd1f8e6a Add module systemd-failed-units 2024-01-09 18:19:30 +08:00
Brenno Lemos
c69a6dde67 chore: update Hyprland's featureset in readme 2024-01-08 20:31:15 -03:00
Brenno Lemos
4339030c9d feat: fetch clients data when moving workspaces accross monitors 2024-01-08 20:11:39 -03:00
Brenno Lemos
bc7acbde5c fix: rename windows while queued for creation
this avoids the window arriving with the wrong icon when its eventually
able to be created
2024-01-08 18:30:53 -03:00
Brenno Lemos
512c6fb127 feat: add orphan windows attribute to workspaces
this attribute will keep every window that doesn't have an associated
workspace in the current bar
2024-01-08 18:30:53 -03:00
Viktar Lukashonak
f8eb01def2 Clean code
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2024-01-08 22:48:57 +03:00
Viktar Lukashonak
158767b5b4 Drop break point
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2024-01-08 22:26:13 +03:00
Viktar Lukashonak
aa95c04842 Gtk4. Stylecontext
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2024-01-08 22:20:23 +03:00
Austin Horstman
b90af74d15 feat: enable direnv and fix flake devshell output 2024-01-08 12:47:32 -06:00
Viktar Lukashonak
4a88cb693a GTK4 base compilation
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2024-01-08 19:03:42 +03:00
Austin Horstman
d4d5a54e63 chore: flake lock update 2024-01-08 09:37:48 -06:00
Alexis Rouillard
748fc809b5 Merge pull request #2813 from yangyingchao/master
Improvements for Hyprland worskspaces & backend
2024-01-08 14:03:23 +01:00
yangyingchao
bdd7271da9 Improvements for Hyprland backend
1. Fix warnings reported by clang tidy
2. Use unique lock instead of manully lock/unlock on mutex.
   The RAII style locking makes sure mutex is unlocked when exceptions are thrown
2024-01-08 09:26:16 +08:00
yangyingchao
a34e3ccc86 Improvements for Hyprland workspace
1. Utilize `m_mutex` to safeguard member fields of `hyprland::Workspaces` as they are modified by multiple threads, including the event listener thread and UI thread. This applies to all member fields, not just `m_workspacesToCreate`.

2. Tidy up the create/remove workspace code.
2024-01-08 09:14:36 +08:00
Alexis Rouillard
4b20f522f0 Merge pull request #2789 from DreamMaoMao/master
fix:#2769
2024-01-04 15:33:26 +01:00
Alexis Rouillard
4636309117 Merge pull request #2803 from LukashonakV/catch_bump
Catch2 bump
2024-01-04 15:33:06 +01:00
Viktar Lukashonak
7783c81861 Catch2 bump
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2024-01-04 17:22:27 +03:00
Alexis Rouillard
3e55d0d7f2 Merge pull request #2787 from scgtrp/master
hyprland/workspaces: allow using the original window class/title
2023-12-31 12:40:06 +01:00
Emily Ellis
ff09ef6d71 hyprland/workspaces: allow using the original window class/title
This turns the values of window rewrite rules in hyprland/workspaces from static strings to format strings with the values {class} and {title} available.
2023-12-30 21:07:40 -05:00
Alexis Rouillard
99d26e44ee Merge pull request #2778 from an-prata/master
fix `restart-interval` being ignored while `signal` is defined (#2650)
2023-12-29 10:59:13 +01:00
Evan Overman
19bf4d0544 clang format trailing whitespace 2023-12-28 19:38:01 -08:00
Evan Overman
6b860f8690 clang formating 2023-12-28 19:36:21 -08:00
Evan Overman
182272b8b5 fix #2650 2023-12-28 19:30:26 -08:00
DreamMaoMao
e64d66ab24 fix:the workspace data is null in a small probability
update

fix clang-format warn

no manual unlock
2023-12-25 21:55:46 +08:00
Alexis Rouillard
41ebdc3cb6 Merge pull request #2768 from zjeffer/feat/zjeffer/freebsd-bump 2023-12-25 08:31:03 +01:00
Alexis Rouillard
8ccb959992 Merge pull request #2767 from zjeffer/master 2023-12-25 00:28:32 +01:00
zjeffer
13e904c20d Bump cross-platform-action to attempt fixing freebsd runner 2023-12-25 00:26:39 +01:00
zjeffer
77f0584d0d Bump clang-tidy cpp-linter-action version to v2.7.5 2023-12-24 23:08:22 +01:00
Alexis Rouillard
d2767fb84a Merge pull request #2760 from avannereau/wireplumber-scroll-fix
Fix wireplumber reverse-scroll option
2023-12-22 12:00:39 +01:00
Alan Vannereau
49caab47a6 Fix wireplumber reverse-scroll option 2023-12-22 11:50:41 +01:00
Alexis Rouillard
08361be9f0 Merge pull request #2756 from grimpy/custom_output_env_var
Pass WAYBAR_OUTPUT_NAME environment variable to custom exec scripts
2023-12-21 08:55:30 +01:00
Alexis Rouillard
2674982c7b Merge pull request #2755 from zjeffer/master
Added clang-tidy GitHub action
2023-12-20 23:25:33 +01:00
Tuur Vanhoutte
dbe02ebe41 Added clang-tidy GitHub action
Created clang-tidy.yml
Renamed lint.yml to clang-format.yml
2023-12-20 14:31:27 +01:00
Jo De Boeck
0ea5143493 Pass WAYBAR_OUTPUT_NAME environment variable to custom exec scripts
Signed-off-by: Jo De Boeck <deboeck.jo@gmail.com>
2023-12-19 22:54:12 +02:00
Alexis Rouillard
f5370fcff5 Merge pull request #2573 from CromFr/cabi_plugins
C ABI plugin system
2023-12-18 14:10:02 +01:00
Alexis Rouillard
7b79281437 Merge pull request #2742 from zjeffer/feat/zjeffer/debian-docker-add-clang-tidy-requirements
Added sudo, python3-pip & python3-venv to debian image, required for clang-tidy GH action
2023-12-18 09:06:54 +01:00
Alexis Rouillard
acc2da7310 Merge pull request #2744 from rpdelaney/jsonC
Specify config is JSONC
2023-12-18 09:06:28 +01:00
Ryan Delaney
68e525df58 Remove 'config' from list of valid locations
Since the file can also be named config.jsonc, that will remove ambiguity
2023-12-13 11:22:57 -05:00
Ryan Delaney
2cd67fdd0a The file can also be named config.jsonc 2023-12-13 10:40:13 -05:00
Ryan Delaney
2600f53bdd Clarify that the configuration file is JSON*C*
JSON is JSONC
2023-12-13 10:39:59 -05:00
zjeffer
da9cc77db8 Added sudo, python3-pip & python3-venv to debian image, required for clang-tidy GH action 2023-12-13 11:54:04 +01:00
Crom (Thibaut CHARLES)
75f9141cac Added cffi man page 2023-12-12 16:23:03 +01:00
Alexis Rouillard
f03b684bd8 Merge pull request #2736 from Rice8Dyb6/master 2023-12-10 19:27:52 +01:00
Rice8Dyb6
4822f967b2 Sway/workspaces: fix persistent icon 2023-12-11 00:17:35 +07:00
Alexis Rouillard
dc208b66b3 Merge pull request #2720 from zjeffer/master
Applied clang-tidy suggestions for hyprland workspaces
2023-12-07 08:34:19 +01:00
Alexis Rouillard
77ebc45336 Merge pull request #2731 from mcepl/patch-1 2023-12-07 08:25:49 +01:00
Matěj Cepl
d94519a93c Clear README.md from duplicated list of distributions
It doesn’t make sense to keep the list in README.md when we maintain it in Wiki as well.
2023-12-07 07:53:45 +01:00
zjeffer
4d5b715dc4 applied clang-tidy suggestions for hyprland workspaces 2023-12-06 21:58:26 +01:00
zjeffer
8a84cb609e clang-tidy: added StaticConstantCase CheckOption 2023-12-06 21:58:26 +01:00
Alexis Rouillard
5f8ae44233 Merge pull request #2703 from czadowanie/master
upower: show-icon config option
2023-12-05 23:34:43 +01:00
czadowanie
4283195803 man: add dot in upower/show-icon 2023-12-04 21:32:08 +01:00
czadowanie
44f309678b man: document upower/show-icon 2023-12-04 21:28:37 +01:00
Alexis Rouillard
4846ff7950 Merge pull request #2595 from zjeffer/master
Added initial .clang-tidy file
2023-12-04 09:29:12 +01:00
Alexis Rouillard
0ec2aada26 Merge pull request #2711 from chayleaf/flake
flake: update & cleanup
2023-12-04 09:28:16 +01:00
Alexis Rouillard
dfa0f5701e Merge pull request #2712 from khaneliman/fix/nix-flake
chore: lint fix
2023-12-04 09:28:05 +01:00
Austin Horstman
b1744278d1 chore: lint fix 2023-12-01 22:05:40 -06:00
chayleaf
2e2cb67cf1 flake: update & cleanup 2023-12-02 02:41:59 +07:00
Alexis Rouillard
1572bc8c75 Merge pull request #2707 from alexbakker/fix-2154 2023-11-30 08:37:59 +01:00
Alexander Bakker
6be5f7cb29 Disconnect from PipeWire when destroying the WirePlumber module
This fixes a crash where PipeWire tries to send events to a destroyed
WirePlumber module.
2023-11-29 22:46:58 +01:00
czadowanie
2334faa7fd upower: show-icon config option 2023-11-28 19:39:08 +01:00
Alexis Rouillard
58db0baaf4 Merge pull request #2701 from thejch/hl-ws-click
Add button click check to hyprland workspaces module
2023-11-28 09:20:51 +01:00
Jeremy Huang
0162dbd485 add button single click check to hyprland workspaces 2023-11-27 16:20:05 -08:00
Alexis Rouillard
1fe4a4ee9d Merge pull request #2686 from aruhier/pr_privacy_visibility
privacy: fix visibility when a module is disabled
2023-11-23 09:52:44 +01:00
Anthony Ruhier
50a4fe9623 privacy: fix visibility when a module is disabled
Only consider a privacy module as visible if it is enabled in the
configuration. Otherwise, when screensharing or audio-in or audio-out is
in use but the associated module is not enabled, the privacy widget is
empty but still considered as visible.
2023-11-23 00:45:31 +01:00
Alexis Rouillard
061c68ce92 Merge pull request #2677 from sjoblomj/master
Using 'image-missing' fallback if no taskbar icon is found
2023-11-20 14:03:52 +01:00
Alexis Rouillard
20b89d5d13 Merge pull request #2679 from aserowy/master
hyprland module: added sort_workspaces after rename occured
2023-11-20 14:02:39 +01:00
Alexis Rouillard
c299ea9369 Merge pull request #2681 from tactikauan/master 2023-11-19 14:20:54 +01:00
Kauan Decarli
d2dd2d553f cpu_usage/linux: count iowait toward idle time 2023-11-18 13:59:21 -03:00
aserowy
b6b495e1bc hyprland module: added sort_workspaces after rename occured
Signed-off-by: aserowy <serowy@hotmail.com>
2023-11-18 11:36:47 +01:00
Johan Sjöblom
d4559c7f00 Using 'image-missing' fallback if no taskbar icon is found 2023-11-16 16:59:05 +01:00
Alexis Rouillard
0a747ddafc Merge pull request #2672 from fdev31/master 2023-11-15 17:53:48 +01:00
fdev31
375a38a489 Fix for #2646 2023-11-14 21:26:17 +01:00
Alexis Rouillard
9ac27de7d8 Merge pull request #2668 from LukashonakV/cpp20_clock 2023-11-13 08:34:59 +01:00
Viktar Lukashonak
7308893adb Happy clang. fmt9-10
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2023-11-13 09:59:50 +03:00
Alexis Rouillard
a51dd8fc52 Merge pull request #2659 from LukashonakV/cpp20_clock
c++20. clock chrono API. STL + format
2023-11-12 09:17:59 +01:00
Viktar Lukashonak
86a38980e4 c++20. clock chrono API. STL + format
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2023-11-10 17:57:26 +03:00
Alexis Rouillard
c4330a1e36 Merge pull request #2648 from Mrcarrot1/wp-segfault
Fix segmentation fault in WirePlumber module
2023-11-06 16:58:40 +01:00
Caleb Harper
4d339f05af Fix segmentation fault in WirePlumber module
The WirePlumber module assumes that either the node's name or
description will not be null. This leads to a segmentation fault when
both are.

The solution provided is to set self->node_name_ to a default value in
this case.
2023-11-06 09:50:13 -06:00
Alexis Rouillard
e24adbc3c2 Merge pull request #2612 from ErikReider/privacy-module
Add Privacy Module
2023-11-06 09:42:35 +01:00
Alexis Rouillard
7d7a047fcc Merge pull request #2643 from qbe/bugfix-dst-ambiguous-hour-err 2023-11-06 08:51:26 +01:00
Lukas Hannen
aa1f8a428b avoid converting to local_time when converting to zoned_time afterwards 2023-11-06 01:28:48 +01:00
Erik Reider
f21b1dfa4d fixed linter issues 2023-11-04 15:16:13 +01:00
Erik Reider
6050fa3a43 Added documentation 2023-11-04 15:16:13 +01:00
Erik Reider
ca7c9a68f1 Made creation of privacy modules more modular 2023-11-04 14:05:01 +01:00
Alex
48ec834ec9 chore: 0.9.24 2023-11-03 14:07:07 +01:00
Alex
e7c2e90236 Revert "custom: reap zombie processes on termination"
This reverts commit 1c1a39f597.
2023-11-03 14:06:50 +01:00
zjeffer
23bc4d66bf Added initial .clang-tidy file 2023-11-02 23:09:49 +01:00
Alex
c6a9b63189 chore: 0.9.23 2023-11-02 14:16:55 +01:00
Alexis Rouillard
7dfc72003f Merge pull request #2629 from andresilva/custom-fix-zombie-processes
custom: reap zombie processes on termination
2023-11-02 10:12:21 +01:00
André Silva
1c1a39f597 custom: reap zombie processes on termination 2023-11-02 01:57:55 +00:00
Alexis Rouillard
121dcc645f Merge pull request #2628 from andresilva/fix-hyprland-workspaces-init
hyprland/workspaces: fix crash on monitor off/on
2023-11-01 23:12:32 +01:00
André Silva
8555456050 hyprland/workspaces: fix crash on monitor off/on 2023-11-01 22:04:19 +00:00
Alexis Rouillard
22dc87934a Merge pull request #2626 from akliuxingyuan/master 2023-11-01 17:35:42 +01:00
akliuxingyuan
335a736eed tray: load_icon use request_size directly 2023-11-01 22:26:52 +08:00
Alexis Rouillard
1149e51f72 Merge pull request #2625 from LukashonakV/happyLinter 2023-11-01 08:27:13 +01:00
Viktar Lukashonak
9012cebbf2 Happy Linter
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2023-10-31 23:31:58 +03:00
Alexis Rouillard
6425bd2fe0 Merge pull request #2623 from LukashonakV/cavaBump 2023-10-31 21:13:52 +01:00
Alexis Rouillard
241938a86d Merge pull request #2624 from sahib/master 2023-10-31 21:13:18 +01:00
Chris Pahl
f511e61832 fix: custom: do not crash if input text is not valid utf-8 2023-10-31 19:41:42 +01:00
Viktar Lukashonak
b9b89cce7e Happy linter
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2023-10-31 20:47:56 +03:00
Viktar Lukashonak
e9a66d68b7 Fix debug mode. cava issue
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2023-10-31 20:27:00 +03:00
Erik Reider
49caa4bf31 Add the PrivacyNodeInfo object as pw_proxy data 2023-10-31 11:38:01 +01:00
Erik Reider
c60a8e9836 free pipewire listeners on proxy destruction 2023-10-31 08:52:54 +01:00
Alexis Rouillard
b37d0df89b Merge pull request #2622 from nomads-land/master 2023-10-31 07:44:29 +01:00
cvhere
67422eea36 Skips logging NoActivePlayer error msgs 2023-10-31 11:14:23 +05:30
Erik Reider
c4226f3745 Readded signal_timeout instead of map to fix indicator being stuck 2023-10-30 18:01:47 +01:00
Erik Reider
d32da917e4 Added tooltips 2023-10-29 00:17:53 +02:00
Erik Reider
46e36c0e68 Simplified the privacy_item hiding/showing logic 2023-10-28 18:30:50 +02:00
Erik Reider
86491e1512 Call module emit in privacy module contructor 2023-10-28 16:47:06 +02:00
Alexis Rouillard
e46f66b468 Merge pull request #2613 from DreamMaoMao/master
Fixed variable synchronization exception caused by the "hyprland/workspace" module
2023-10-27 17:27:37 +02:00
DreamMaoMao
1f0ce1a5d9 Fixed variable synchronization exception caused by the "hyprland/workspace" module receiving create or delete IPC requests too quickly 2023-10-27 14:17:43 +08:00
Erik Reider
4a4c888d7d Fixed linter complaining 2023-10-27 00:01:40 +02:00
Erik Reider
ace319b515 Updated default CSS to include the privacy module 2023-10-26 23:44:04 +02:00
Erik Reider
e73ea8d608 Fixed cases where the module would be hidden when it should be visible 2023-10-26 23:37:10 +02:00
Erik Reider
f7224d8459 Initial implementation 2023-10-26 23:22:02 +02:00
Alexis Rouillard
95b0647c91 chore: increase freebsd timeout 2023-10-26 22:17:20 +02:00
Alexis Rouillard
9ef8faf9b1 Merge pull request #2611 from taminob/bugfix/increase-freebsd-ci-timeout 2023-10-26 17:45:48 +02:00
Tamino Bauknecht
7d8c1494d7 cpu_usage: Fix ScopeGuard renaming in bsd-only file 2023-10-26 17:30:48 +02:00
Tamino Bauknecht
33f8a02fb5 ci: Increase freebsd timeout to 2h
After switching to a new FreeBSD action, the job seems to take longer
than 30 minutes.
Therefore, an increase in the timeout is necessary.
2023-10-26 17:19:26 +02:00
Alexis Rouillard
1618ee78b7 Merge pull request #2601 from taminob/bugfix/2598/fix-max-duration-sleep-for-bug
Fix sleep_for for max duration
2023-10-26 10:07:27 +02:00
Alex
efab1daa7e chore: switch freebsd action 2023-10-25 18:35:58 +02:00
Alexis Rouillard
9a305b2d73 Merge pull request #2609 from taminob/feature/reduce-freebsd-ci-timeout
Reduce freebsd ci timeout
2023-10-25 18:28:10 +02:00
Crom (Thibaut CHARLES)
02c64f3f1e Moved all waybar info into a single struct 2023-10-24 20:16:50 +02:00
Crom (Thibaut CHARLES)
d86059016e Send update dispatcher though FFI 2023-10-24 20:16:50 +02:00
Crom (Thibaut CHARLES)
088ca6b963 Added cffi/* module for third-party advanced modules 2023-10-24 20:16:50 +02:00
Crom (Thibaut CHARLES)
6ae354f564 PoC 2023-10-24 20:16:23 +02:00
Tamino Bauknecht
799fce0dc6 ci: Set freebsd to timeout after 30min
The job runs very unreliably and often times out after 6h of being stuck
in a boot loop.
This commit reduces the timeout to 30min.
2023-10-24 19:01:40 +02:00
Tamino Bauknecht
68dfd6aa3a scope_guard/modules: Rename scope_guard to ScopeGuard
Using pascal case for the class name keeps it more consistent with the
majority of the other class names.
2023-10-24 17:51:38 +02:00
Tamino Bauknecht
dd1de3efbf Revert "Revert "Fix potential memory leaks""
This reverts commit 2d33c20231 and
reapplies various patches for memory leaks.
The reason for the revert was a bug for a maximum duration interval
which caused sleep_for() to cause unpredictable behavior.
2023-10-24 17:51:38 +02:00
Tamino Bauknecht
521dac8086 sleeper_thread: Make sleep_for more robust
In the previous fix for a passed max duration, the assumption was made
that at maximum one second will pass between the duration assignment and
the std::condition_variable::sleep_for() call.
This implementation makes the behavior more predictable by using
sleep_until() instead to emulate the sleep_for() behavior.
2023-10-24 17:51:34 +02:00
Tamino Bauknecht
ad7d4eb07d sleeper_thread: Allow sleep_for with max duration
The standard library has the implicit requirement that for
std::condition_variable::sleep_for() the duration must not cause an
overflow if added to the current time.
This commit will reduce the duration accordingly to fit into the
duration type.
2023-10-24 17:44:35 +02:00
Alexis Rouillard
a459d8a9b3 Merge pull request #2605 from Syndelis/fix/hyprland-persistent-workspaces-disappear-when-empty 2023-10-24 08:31:11 +02:00
Brenno Lemos
4aee5977d6 fix: set workspace as persistent on create_workspace 2023-10-23 21:07:37 -03:00
Alexis Rouillard
f2085fcd92 Merge pull request #2592 from zjeffer/hyprland/workspaces
General cleanup in hyprland/workspaces
2023-10-23 08:45:52 +02:00
Alexis Rouillard
c47d75ceda Merge pull request #2593 from x0rzavi/typo-fixes
docs: fix typos and improve language coherence
2023-10-23 08:45:08 +02:00
Alexis Rouillard
9ecdbcc7bc Merge pull request #2596 from rehanzo/master 2023-10-22 09:46:35 +02:00
Alexis Rouillard
dafe49d28c Merge pull request #2599 from Alexays/revert-2586-bugfix/fix-potential-memory-leaks
Revert "Fix potential memory leaks"
2023-10-22 09:44:57 +02:00
Alexis Rouillard
2d33c20231 Revert "Fix potential memory leaks" 2023-10-22 09:44:46 +02:00
Rehan
5963bf6ace modules/mpris: change default interval value to 0 2023-10-21 18:14:46 -04:00
zjeffer
dab1493644 cleanup onEvent, dont use try/catch for flow control 2023-10-21 19:33:55 +02:00
zjeffer
acc911737d update window count inside the on_window_* functions 2023-10-21 18:53:53 +02:00
zjeffer
2d614c68f5 code review 2023-10-21 18:15:22 +02:00
Avishek Sen
d0cab2a367 docs: fix typos and improve language coherence 2023-10-21 21:15:25 +05:30
zjeffer
7576611782 formatting 2023-10-21 17:06:02 +02:00
zjeffer
ed65d9cdbd General cleanup in hyprland/workspaces 2023-10-21 16:52:23 +02:00
Alexis Rouillard
dbb887b4a9 Merge pull request #2585 from davxy/master
Show the network interface with highest priority (aka lower metric)
2023-10-21 14:10:21 +02:00
Alexis Rouillard
06f4028697 Merge pull request #2588 from taminob/bugfix/fix-custom-module-signal-without-interval
Custom module: Allow signal without interrupt
2023-10-21 14:09:12 +02:00
Alexis Rouillard
3413b70413 Merge pull request #2586 from taminob/bugfix/fix-potential-memory-leaks
Fix potential memory leaks
2023-10-21 14:08:58 +02:00
Alexis Rouillard
6a8b510db8 Merge pull request #2589 from taminob/bugfix/lint-check-hpp-header-files 2023-10-21 12:56:57 +02:00
Tamino Bauknecht
f598e348c4 ci: Update Linter job 2023-10-21 12:50:56 +02:00
Tamino Bauknecht
6dd2cfba34 ci: Lint header files with hpp file ending 2023-10-21 11:57:11 +02:00
Tamino Bauknecht
ae748b2644 modules+util: fix actual (potential) memory leaks 2023-10-21 11:51:33 +02:00
Tamino Bauknecht
a0b63d6b1e modules: use scope_exit for deletion to make code more robust 2023-10-21 11:51:18 +02:00
Tamino Bauknecht
89e85db790 ALabel: make use of std::chrono::max() instead of magic number 2023-10-21 11:50:38 +02:00
Tamino Bauknecht
a73669be6a modules/upower: use smart pointer to avoid memory leak 2023-10-21 11:50:28 +02:00
Tamino Bauknecht
8c57756556 util: add scope_guard
This custom small implementation avoids adding an extra dependency like
Boost.ScopeExit
2023-10-21 11:50:06 +02:00
Tamino Bauknecht
b8afde043c sleeper_thread: allow interrupting sleep()
This keeps the function consistent with sleep_until() and sleep_for()
which both can be interrupted.
This is relevant to allow an update via a "signal" without an "interval"
in a custom module.
2023-10-20 23:57:54 +02:00
Alexis Rouillard
eefd6e8336 Merge pull request #2578 from Syndelis/fix/hyprland-windows-disappearing 2023-10-20 10:24:56 +02:00
Davide Galassi
6829ed1bb4 Different interfaces have different index 2023-10-20 08:25:28 +02:00
Brenno Lemos
7d5577a2ed feat: create persistent workspaces after regular ones at init
feat: avoid recreating duplicate workspaces
2023-10-19 21:29:38 -03:00
Brenno Lemos
a41225c4e0 Revert "fix: fill persistent workspaces' windows at init"
This reverts commit e14a3b8687.
2023-10-19 21:23:00 -03:00
Brenno Lemos
a0d2d95b41 chore: remove unused function 2023-10-19 21:21:55 -03:00
Brenno Lemos
e14a3b8687 fix: fill persistent workspaces' windows at init 2023-10-19 21:19:08 -03:00
Brenno Lemos
846842be80 feat: emit dispatcher when any window is created during update 2023-10-19 10:45:00 -03:00
Brenno Lemos
e845db84ad feat: avoid recreating workspaces 2023-10-18 19:11:49 -03:00
Brenno Lemos
193040c41e feat: attempt to move windows out of the create window payload before taking them from workspaces 2023-10-18 19:11:49 -03:00
Alex
871f9a1269 fix: revert clock 2023-10-18 08:45:56 +02:00
Alex
5319cb6e10 fix: upower hidded on start 2023-10-17 20:12:24 +02:00
Alex
208928ded5 fix: lint 2023-10-17 19:29:06 +02:00
Alexis Rouillard
4d7eb3bd15 Merge pull request #2515 from chrisjshore/clock_fix
fix clock to work with fmt 10.x
2023-10-17 19:25:58 +02:00
Alexis Rouillard
6b73e2aa58 Merge pull request #2114 from mmhat/split-cpu-module
Split cpu module
2023-10-17 19:25:29 +02:00
Brenno Lemos
6ddd283d0f fix: special workspaces weren't registering windows because of the special qualifier prefix 2023-10-16 20:48:52 -03:00
Brenno Lemos
e70a67d958 chore: lint
chore: swap push_back to emplace_back
2023-10-16 19:14:50 -03:00
Brenno Lemos
67c0c9a66c fix: delay window creation to await for hyprland to create a workspace 2023-10-16 19:07:00 -03:00
Alexis Rouillard
42741c963e Merge pull request #2575 from Syndelis/feat/slider 2023-10-16 08:08:37 +02:00
Brenno Lemos
9d316de15a fix: avoid compiling audio_backend if pulse is not available 2023-10-15 18:12:31 -03:00
Brenno Lemos
ecbcf242d5 feat: allow unmuting by moving the pulseaudio slider 2023-10-15 17:52:12 -03:00
Brenno Lemos
fd3710d869 chore: suppress compiler warning 2023-10-15 17:52:12 -03:00
Brenno Lemos
11d7ca1d73 feat: backlight slider 2023-10-15 17:52:12 -03:00
Brenno Lemos
c3779dd16e refactor: move backlight backend out of backlight module 2023-10-15 17:52:12 -03:00
Brenno Lemos
442a4b0da0 feat: pulseaudio slider module 2023-10-15 17:52:12 -03:00
Brenno Lemos
c9e129cda2 feat: allow setting volume directly 2023-10-15 17:52:12 -03:00
Brenno Lemos
64d7fae03a refactor: move pulseaudio handling to separate class 2023-10-15 17:52:12 -03:00
Alexis Rouillard
44d8245605 Merge pull request #2560 from akshettrj/mpris-click-fix 2023-10-15 21:26:33 +02:00
Alexis Rouillard
93daf089b5 Merge pull request #2574 from Syndelis/feat/group-drawers 2023-10-15 21:26:04 +02:00
Alexis Rouillard
7645ae1907 Merge pull request #2563 from Syndelis/feat/hyprland-window-rename-by-title 2023-10-15 21:21:32 +02:00
Alexis Rouillard
3d496c2200 Merge pull request #2554 from mutoroglin/cava-hide-on-silence 2023-10-15 21:19:17 +02:00
Brenno Lemos
ff9b6c9469 docs: fix weird man limitation 2023-10-14 22:14:13 -03:00
Brenno Lemos
05b97e9ec2 fix: add hover handler to every element in the group drawer 2023-10-14 22:13:01 -03:00
Brenno Lemos
8f32d102ae docs: include group drawer documentation 2023-10-14 18:50:45 -03:00
Brenno Lemos
5a380da3bb chore: remove redundant else statement 2023-10-14 18:39:42 -03:00
Brenno Lemos
5e44cb6ba2 refactor: move signal handler adding into separate method
fix: typo in handleMouseHover method name
2023-10-14 18:30:27 -03:00
Brenno Lemos
fad858782c feat: improve drawer configuration 2023-10-14 18:24:50 -03:00
Brenno Lemos
5246ab15cb feat: add drawer bool option to group 2023-10-14 17:17:52 -03:00
Brenno Lemos
bbb7fb0c82 refactor: don't use a group's box directly in bar 2023-10-14 13:23:11 -03:00
Brenno Lemos
c59264d6b4 fix: clang < 16 can't emplace back struct with no constructor 2023-10-12 17:30:32 -03:00
Alexis Rouillard
a3774dc586 Merge pull request #2568 from Syndelis/feat/hyprland-ignore-workspaces 2023-10-12 07:32:56 +02:00
Brenno Lemos
ee652677a6 feat: ignore windows with empty classes or titles (if any rule uses title) 2023-10-11 11:40:49 -03:00
Brenno Lemos
ceeb5bf8bd docs: include new ignore-workspaces example and documentation 2023-10-11 11:03:18 -03:00
Brenno Lemos
c995bafa7a feat: add option to ignore workspaces based on regex 2023-10-11 10:59:33 -03:00
Brenno Lemos
f8340d88be chore: lint unrelated file
this file was edited in #2558 but not linted
2023-10-09 15:26:07 -03:00
Brenno Lemos
592d5645a5 docs: include new feature in manual 2023-10-09 14:58:21 -03:00
Brenno Lemos
f9a7ecf3a9 feat: optimize cache usage when window titles aren't involved 2023-10-09 14:49:38 -03:00
Brenno Lemos
387e54498e docs: document new regex collection class 2023-10-09 14:46:57 -03:00
Brenno Lemos
fad43d4b16 feat: listen to windowtitle IPC event condiationally to update window rules 2023-10-09 14:42:53 -03:00
Brenno Lemos
8d057e6f96 refactor: separate regex rule matching and caching in separate class 2023-10-09 13:53:00 -03:00
Joerg Weislogel
b2e88347b3 added description for configuration option hide-on-silence in man file 2023-10-09 17:05:12 +02:00
Akshett Rai Jindal
1af02e0a67 fix(modules/mpris): fix on-*-click typos
In all other places, the norm is to use `on-click-(middle|right)` but in
the mpris module, `on-(middle|right)-click` was being used which caused
clicks to malfunction if set to some custom commands
2023-10-09 11:48:49 +05:30
Alexis Rouillard
30cc88a4c5 Merge pull request #2558 from SWarrener/master 2023-10-08 22:37:46 +02:00
SWarrener
32d326ca4a Some missing backticks 2023-10-08 16:34:27 +01:00
SWarrener
ae92d7d186 Updating man page with details of options to force specific units in disk size output 2023-10-08 16:26:06 +01:00
SWarrener
c16e791cdc Adding options to allow disk outputs to always be in a specific unit 2023-10-08 16:24:50 +01:00
Christopher Shore
fbd62e0071 Merge branch 'Alexays:master' into clock_fix 2023-10-07 18:39:56 -04:00
Joerg Weislogel
1eb0777799 add function to cava module to hide on silence 2023-10-07 12:50:24 +02:00
Alexis Rouillard
58e506a675 Merge pull request #2529 from Syndelis/feat/hyprland-window-workspaces
Feature: Hyprland dynamic window names on workspaces
2023-10-02 19:17:42 +02:00
Brenno Lemos
1b98a04c93 chore: lint unrelated files so the CI passes 2023-10-02 12:33:28 -03:00
Alexis Rouillard
4c0347d9f2 Merge pull request #2540 from Syndelis/fix/hyprland-special-workspaces 2023-09-25 22:33:36 +02:00
Brenno Lemos
9a3238c20b chore: avoid the creation and deletion of doubled-special workspaces
see hyprwm/Hyprland#3424 for more info

Co-authored-by: Gabriel Fox <Inbox@GabrielFox.Dev>
2023-09-25 17:13:26 -03:00
Brenno Lemos
6e48b236a1 fix: workspace special wasn't removed
fixes  #2505

Co-authored-by: Gabriel Fox <Inbox@GabrielFox.Dev>
2023-09-25 17:12:51 -03:00
Alexis Rouillard
16f6d9dfa0 Merge pull request #2534 from woojiq/fix-hyprland-default-icon 2023-09-24 09:25:37 +02:00
woojiq
d37954322a fix(hyprland): use workspace name as default icon
Wlr and Sway modules use the workspace `name` as the default icon if no icon is provided. This adds the same behavior for the `hyprland/workspace` module.

Closes https://github.com/Alexays/Waybar/issues/2533
2023-09-23 21:55:18 +03:00
Brenno Lemos
258ab8b147 refactor: take window representation directly from old workspace on movewindow event 2023-09-22 21:12:42 -03:00
Brenno Lemos
6663ca3d75 chore: document new properties 2023-09-22 20:41:38 -03:00
Brenno Lemos
adbc9d95de feat: optional default icon for 0-match classes
Co-authored-by: Gabriel Fox <Inbox@GabrielFox.Dev>
2023-09-22 19:16:59 -03:00
Brenno Lemos
fbe544984c fix: ipc vs json window addr format mismatch
feat: ignore empty windows

Co-authored-by: Gabriel Fox <Inbox@GabrielFox.Dev>
2023-09-22 19:16:56 -03:00
Brenno Lemos
b9d5912a4f feat: rewrite window classes
feat: cache window class rewrite resolution

Co-authored-by: Gabriel Fox <Inbox@GabrielFox.Dev>
2023-09-22 19:16:53 -03:00
Brenno Lemos
3e2761e81f feat: dynamically assign windows to workspaces
Co-authored-by: Gabriel Fox <Inbox@GabrielFox.Dev>
2023-09-22 19:12:50 -03:00
Alexis Rouillard
6997b34a81 Merge pull request #2517 from an-prata/master
Lighter Weight Signal-Based Custom Modules
2023-09-21 23:48:22 +02:00
Alexis Rouillard
5960e8f1ee Merge pull request #2518 from idm1try/fix-bl-asahi
fix(backlight): wrong percentage numbers for device apple-panel-bl
2023-09-21 23:47:23 +02:00
idm1try
81ffeebfb1 fix: style
Co-authored-by: Alexis Rouillard <alexisr245@gmail.com>
2023-09-21 09:03:13 +05:00
Evan Overman
f14fe96e19 add info to interval and signal in manpage for custom modules 2023-09-19 14:52:48 -07:00
idm1try
954bea36f4 chore: remove result dir by nix 2023-09-19 18:52:00 +05:00
idm1try
388c024298 fix(backlight): wrong percentage numbers for device apple-panel-bl 2023-09-19 18:50:39 +05:00
Alexis Rouillard
9b8adc1951 Merge pull request #2494 from KanuX-14/battery_fix
Fix battery not showing for some devices
2023-09-19 13:33:35 +02:00
Evan Overman
bf371f70d1 add waitingWorker() to Custom 2023-09-18 14:56:14 -07:00
Evan Overman
7c28ffc856 add indefinite sleep() function to SleeperThread 2023-09-18 14:55:50 -07:00
Christopher Shore
14820e5d18 fix clock to work with fmt 10.x 2023-09-17 16:32:19 -04:00
Mann mit Hut
80a34eec81 Fixed formatting again 2023-09-13 23:25:39 +02:00
Mann mit Hut
d5203e5b37 Fixed cpu module: Provide stub implementation for parseCpuFrequencies 2023-09-13 23:12:35 +02:00
Mann mit Hut
91b6629103 Fixed format errors 2023-09-13 21:59:42 +02:00
Mann mit Hut
93d66a9258 Moved cpu/common.cpp to cpu.cpp 2023-09-13 21:56:37 +02:00
Mann mit Hut
8d7341da6e cpu module: Reuse getLoad of load module 2023-09-13 21:56:37 +02:00
Mann mit Hut
d1602e383c cpu module: Reuse getCpuUsage of cpu_usage module 2023-09-13 21:56:36 +02:00
Mann mit Hut
c45f6681b3 cpu module: Reuse getCpuFrequency of cpu_frequency module 2023-09-13 21:56:35 +02:00
Mann mit Hut
dce6a98f38 Added changes made to the cpu module 2023-09-13 21:56:34 +02:00
Mann mit Hut
982ffde002 Use labels instead of buttons 2023-09-13 21:56:33 +02:00
Mann mit Hut
888adb57ec Introduce cpu_usage module 2023-09-13 21:56:32 +02:00
Mann mit Hut
c36fe3a004 Introduce cpu_frequency module 2023-09-13 21:56:31 +02:00
Mann mit Hut
729564cc27 Introduced separate load module
The module provides the three system load averages. This is an
improvement compared what you can do with the cpu module: cpu
only provides the one minute sample and the state of the cpu module is
derived from the cpu usage which messes up the formating of the load
average. Also, at least on modern Linux systems, the load of a system
takes much more than the cpu utilization into account and it should
therefore live in a separate module.
2023-09-13 21:56:30 +02:00
Alexis Rouillard
4d32991bee Merge pull request #2507 from hariseldon78/patch-1
Update workspaces.cpp
2023-09-13 18:21:22 +02:00
Roberto Previdi
69736d68aa Update workspaces.cpp
Fix unchecked string to int conversion of workspace name (which can be a string)
Closes #2501
2023-09-13 18:20:13 +02:00
KanuX-14
28a2d15fef Update 'bat-compatibility' option to manual 2023-09-12 13:39:09 -03:00
Alexis Rouillard
a90e275d5e Merge pull request #2470 from 4e554c4c/darkmode
search for dark or light mode stylesheet
2023-09-11 09:36:05 +02:00
Alexis Rouillard
fc67558717 Merge branch 'master' into darkmode 2023-09-11 09:25:45 +02:00
Alexis Rouillard
196b400abf Merge pull request #2468 from khaneliman/persistent-rename
deprecate persistent_workspaces in favor of persistent-workspaces
2023-09-11 09:22:07 +02:00
Alexis Rouillard
05a2af2d7c Merge pull request #2486 from khaneliman/workspace-sorting
feat: hyprland workspaces add sort-by
2023-09-11 09:21:35 +02:00
KanuX-14
1ff4464b2f Use adapter status if battery status is inexistent 2023-09-10 15:16:43 -03:00
KanuX-14
60611e9c2b Fix battery not showing for some devices
Adds 'bat-compatibility' boolean checking from configuration file.
2023-09-10 14:41:40 -03:00
Austin Horstman
79cf33b9f1 refactor: enumparser create implementation file 2023-09-09 17:59:40 -05:00
Austin Horstman
b8630968b2 refactor: move capitalize string helper 2023-09-09 13:23:17 -05:00
Austin Horstman
2fee12d930 fix: enumparser capitalize everything to avoid issues 2023-09-09 12:14:52 -05:00
Austin Horstman
3ae2fe3272 refactor: PR review cleanup 2023-09-09 12:08:30 -05:00
Austin Horstman
2b8c92e8fd refactor: enum utility allow overriding 2023-09-09 11:18:12 -05:00
Austin Horstman
8ce64ea784 refactor: make parsing sort-by more lenient 2023-09-09 10:04:49 -05:00
Austin Horstman
8ea2626de8 refactor: sort-by enum hyprland 2023-09-09 10:04:48 -05:00
Austin Horstman
65ba449460 chore: update man page index 2023-09-08 23:17:21 -05:00
Austin Horstman
cbc12e5443 feat: hyprland workspaces add sort-by 2023-09-08 22:49:15 -05:00
Austin Horstman
587bd0cd62 refactor: cleanup hyprland workspaces constructor 2023-09-08 22:24:05 -05:00
Alexis Rouillard
309edd0585 Merge pull request #2485 from khaneliman/active-rename 2023-09-08 23:11:58 +02:00
Austin Horstman
2837b72064 fix: rename workspace active fix 2023-09-08 14:11:02 -05:00
Alexis Rouillard
38ef38b72f Merge pull request #2477 from zjeffer/fix/urgent-icon 2023-09-07 20:33:22 +02:00
zjeffer
6c3565c520 Add urgent icon
Fixes #2476
2023-09-07 19:33:56 +02:00
Calvin Lee
9bb2c01a44 clean up client.cpp 2023-09-07 13:43:59 +00:00
Calvin Lee
09873f0ed9 search for dark or light mode stylesheet
summary:
-------
This commit adds xdg-desktop-portal support to waybar. If a portal
supporting `org.freedesktop.portal.Settings` exists, then it will be
queried for the current colorscheme. This colorscheme will then be used
to prefer a `style-light.css` or `style-dark.css` over the basic
`style.css`.

technical details:
-----------------
Appearance is provided by several libraries, such as libhandy (mobile)
and libadwaita. However, waybar links to neither of these libraries. As
the amount of code required to communicate with xdg-desktop portal as a
client is rather minimal, I believe doing so is better than linking to
an additional library.

The Gio library for communicating with dbus is rather messy, Instead of
the `Portal` class containing a `Gio::Dbus::Proxy`, it extends it which
simplifies signal handling.

`Portal` then exposes its own signal, which can be listened to by waybar
to update CSS.

For a reference implementation, please see another one of my projects:
https://github.com/4e554c4c/darkman.nvim/blob/main/portal.go

test plan:
---------
If no desktop portal which provides `Settings` exists, then waybar
continues with the log line
```
[2023-09-06 14:14:37.754] [info] Unable to receive desktop appearance: GDBus.Error:org.freedesktop.DBus.Error.UnknownMethod: No such interface “org.freedesktop.portal.Settings” on object at path /org/freedesktop/portal/desktop
```

Furthermore, if `style-light.css` or `style-dark.css` do not exist, then
`style.css` will still be searched for.

Waybar has been tested with both light and dark startup. E.g. if the
appearance is dark on startup the log lines
```
[2023-09-06 14:27:45.379] [info] Discovered appearance 'dark'
[2023-09-06 14:27:45.379] [debug] Try expanding: $XDG_CONFIG_HOME/waybar/style-dark.css
[2023-09-06 14:27:45.379] [debug] Found config file: $XDG_CONFIG_HOME/waybar/style-dark.css
[2023-09-06 14:27:45.379] [info] Using CSS file /home/pounce/.config/waybar/style-dark.css
```
will be observed.
If the color then changes to light during the operation of waybar, it
will change css files:
```
[2023-09-06 14:28:17.173] [info] Received new appearance 'dark'
[2023-09-06 14:28:17.173] [debug] Try expanding: $XDG_CONFIG_HOME/waybar/style-light.css
[2023-09-06 14:28:17.173] [debug] Found config file: $XDG_CONFIG_HOME/waybar/style-light.css
[2023-09-06 14:28:17.173] [info] Using CSS file /home/pounce/.config/waybar/style-light.css
```

Finally, tested resetting waybar and toggling style (works, and style is
only changed once).

fixes: Alexays/Waybar#1973
2023-09-06 15:19:56 +00:00
khaneliman
c9e1899594 refactor: deprecate instead of remove persistent_workspaces 2023-09-05 16:02:45 -05:00
khaneliman
b405dc436c refactor!: wlr persistent workspaces config rename 2023-09-05 16:02:22 -05:00
khaneliman
4a6c1269fb refactor!: sway persistent workspaces config name rename 2023-09-05 16:02:21 -05:00
khaneliman
44ac6b8044 refactor!: hyprland persistent workspaces config option name standardization 2023-09-05 16:02:19 -05:00
Alexis Rouillard
80de22a159 Merge pull request #2408 from zjeffer/hyprland/workspaces_active-only
Implement 'active_only' option and 'visible' class in hyprland/workspaces
2023-09-05 22:59:49 +02:00
zjeffer
04b39ea64e hyprland/workspaces: implement 'active_only' option and visible class 2023-09-05 18:22:54 +02:00
Alexis Rouillard
116aa5cdbd Merge pull request #2466 from maximbaz/hyprland-support-workspace-rename
hyprland/workspaces: react on renameworkspace event
2023-09-05 17:23:06 +02:00
Maxim Baz
9c49f46b01 hyprland/workspaces: react on renameworkspace event 2023-09-05 17:13:25 +02:00
Alexis Rouillard
f7ff005dd5 Merge pull request #2460 from xercesblue/set_urgent_segfault
modules/hyprland: Fix segfault when attempting to set_urgent on a missing workspace
2023-09-05 08:42:39 +02:00
xercesblue
d40ccd0da8 modules/hyprland: Fix segfault when attempting to set_urgent on a missing workspace 2023-09-04 16:57:00 -07:00
Alexis Rouillard
6f66af9ab9 Merge pull request #2134 from bruceblore/battery-weighted-percentage
Display battery percentage as weighted average of battery levels
2023-09-04 22:01:40 +02:00
Alexis Rouillard
2d27e484c7 Merge pull request #2417 from Cherser-s/sni-click-coordinate-fix
sni: fix passing relative coordinates to dbus methods
2023-09-04 22:01:04 +02:00
Alexis Rouillard
a77ccf4bd1 Merge pull request #2457 from khaneliman/hyprland-cleanup
Hyprland linting cleanup
2023-09-04 22:00:44 +02:00
Austin Horstman
4cb8efbecc chore: cpplint fixes hyprland classes 2023-09-03 00:18:31 -05:00
Austin Horstman
8fc4187713 refactor: replace strcpy with snprintf 2023-09-02 23:56:06 -05:00
Austin Horstman
ce076927f3 chore: cpplint fixes hyprland headers 2023-09-02 23:56:04 -05:00
Alexis Rouillard
8eb614f69e Merge pull request #2438 from khaneliman/hyprland-workspace-array
hyprland persistent workspace support new config declaration
2023-09-01 09:10:23 +02:00
Alexis Rouillard
347dd1c799 Merge pull request #2431 from zjeffer/fix/persistent-workspace-icon
hyprland/workspaces: Add "empty" icon and class
2023-09-01 09:09:32 +02:00
Alexis Rouillard
82b7e4ea01 Merge pull request #2414 from KosmX/add_release_v2
Release button event second attempt
2023-09-01 09:08:23 +02:00
Alexis Rouillard
d7d4a6c632 Merge pull request #2442 from PucklaJ/hyprland_persistent
Show workspaces on all outputs if persistent_workspaces value is empty
2023-09-01 09:06:41 +02:00
PucklaJ
a18b41911d hyprland/workspaces: Show workspace on all outputs if an empty array is given
This behaviour is consistent with sway/workspaces and wlr/workspaces
2023-08-30 13:35:19 +02:00
Austin Horstman
52309615c1 hyprland new persistent_workspace configuration style 2023-08-29 00:11:25 -05:00
Cherser-s
65dfabc430 sni: fix passing relative coordinates to dbus methods
Doesn't correctly handle the case with both margin and width/height being set at the same time.
2023-08-25 20:37:16 +03:00
Cherser-s
936937ec78 store margins and global window offset in the bar object 2023-08-25 20:37:14 +03:00
zjeffer
e163dd8216 hyprland/workspaces: update manpage 2023-08-24 22:51:06 +02:00
zjeffer
06a9f98878 hyprland/workspaces: Add "empty" icon and class 2023-08-24 21:19:20 +02:00
Alexis Rouillard
b665843085 Merge pull request #2429 from khaneliman/hyprland-urgent
Hyprland urgent class support
2023-08-24 17:00:40 +02:00
Austin Horstman
ee4fbc58f7 hyprland add urgent ipc support 2023-08-23 12:52:29 -05:00
Austin Horstman
3081b0c576 flake lock update 2023-08-23 12:14:35 -05:00
Alexis Rouillard
b7a527b122 Merge pull request #2424 from asas1asas200/feat-keyboard-bindingkey 2023-08-20 09:40:36 +02:00
asas1asas200
54a6668846 feat(keyboard-state): add binding-keys options 2023-08-20 08:33:34 +08:00
Alexis Rouillard
ed0f7453c9 Merge pull request #2420 from Alexays/chore-subprojects
chore: update subprojects
2023-08-18 10:39:15 +02:00
Alex
19fe929d1f chore: update subprojects 2023-08-18 09:48:03 +02:00
KosmX
392e863e6d Apply formatting 2023-08-16 17:33:36 +02:00
KosmX
2ff347f9a8 Add handleRelease method to release events
This commit shouldn't change the handleToggle behaviour,
it shouldn't break anything.
2023-08-16 17:14:49 +02:00
KosmX
1d8331d0c5 Add release events to event map 2023-08-16 17:12:32 +02:00
KosmX
718db71638 Refactor enable click condition
This shouldn't change behaviour.
2023-08-16 17:11:44 +02:00
Alexis Rouillard
0a28b50a8c Merge pull request #2413 from PucklaJ/bluetooth-no-controller
Add format-no-controller to bluetooth module and fix it still being visible if the format string is empty
2023-08-16 17:08:48 +02:00
PucklaJ
70bc318a01 Fix bluetooth module still being visible if format is empty 2023-08-16 16:30:59 +02:00
PucklaJ
22817089db Add no-controller format to bluetooth module 2023-08-16 15:34:06 +02:00
Alexis Rouillard
aecd80702e Merge pull request #2412 from jpalus/simpleclock-fmt-compile-fix
Fix simpleclock module compilation with recent fmt
2023-08-16 14:35:39 +02:00
Jan Palus
abd7a0cf25 Fix simpleclock module compilation with recent fmt
both `format_` and `tooltip_format` are dynamically provided formats so
wrap them in `fmt::runtime()`
2023-08-16 14:32:48 +02:00
Alex
e30fba0b8f chore: 0.9.22 2023-08-16 13:34:05 +02:00
Alex
b5ea14c896 revert: release event 2023-08-16 13:31:24 +02:00
Alexis Rouillard
5b33a5917c Merge pull request #2404 from eltociear/master-1
fix: typo in taskbar.cpp
2023-08-16 08:55:33 +02:00
Alexis Rouillard
66b71cc857 Merge pull request #2409 from jpalus/fmt-cast-ustring-to-string 2023-08-15 22:35:46 +02:00
Jan Palus
c8237437d2 Explicitly cast ustring to string when passing to fmt
don't rely on implicit conversion which is no longer present in fmt
10.1.0

Fixes #2403
2023-08-15 20:57:07 +02:00
Ikko Eltociear Ashimine
57544fe694 fix: typo in taskbar.cpp
ocurred -> occurred
2023-08-15 00:45:09 +09:00
Alex
e90c66a102 chore: 0.9.21 2023-08-14 15:33:52 +02:00
Alex
db1d859881 fix: lint 2023-08-14 14:20:08 +02:00
Alexis Rouillard
cc961d40b3 Merge pull request #2402 from frankebel/master
docs: fix Arch repository name
2023-08-14 13:28:54 +02:00
Frank Ebel
29cebaa0a7 docs: fix Arch repository name 2023-08-14 12:42:33 +02:00
Alexis Rouillard
2c7bbe9852 Merge pull request #2393 from zjeffer/hyprland/fixes
Hyprland/workspaces: use named icons instead of searching by id
2023-08-14 11:46:55 +02:00
Alexis Rouillard
eb74623b7d Merge pull request #2399 from KosmX/click_release_action
Button release action
2023-08-14 11:46:27 +02:00
Alexis Rouillard
b9260575e5 Merge pull request #2401 from zjeffer/master
Updated hyprland-workspaces manpage
2023-08-14 11:23:35 +02:00
zjeffer
8cf676176d Updated hyprland-workspaces manpage 2023-08-14 11:17:49 +02:00
KosmX
3db5673e70 register key hander 2023-08-13 18:48:23 +02:00
KosmX
46f5034030 Add button release events to eventMap 2023-08-13 18:20:43 +02:00
zjeffer
6f7e7c5199 formatting 2023-08-10 20:37:42 +02:00
zjeffer
2ba11e8401 Hyprland/workspaces: use named icons instead of searching by id 2023-08-10 20:09:30 +02:00
Alexis Rouillard
b084bf721e Merge pull request #2377 from marshallmoats/master
Change default workspace format
2023-08-09 08:16:52 +02:00
Marshall Moats
e40860c3e9 keep id 2023-08-08 17:17:58 -05:00
Marshall Moats
2bcd0eb09f Change default workspace format 2023-08-02 16:02:50 -05:00
Alexis Rouillard
94c34a29c4 Merge pull request #2370 from spikespaz/nix-fix-overlay
flake: fix infrec in package overlay
2023-08-02 08:41:39 +02:00
Alexis Rouillard
7fb37c0069 Merge pull request #2373 from marshallmoats/master 2023-08-02 08:35:10 +02:00
Marshall Moats
ce2ede70f2 Fix logical errors, formatting error 2023-08-01 15:55:37 -05:00
Jacob Birkett
b91adc9f29 flake: fix infrec in package overlay 2023-07-31 09:37:33 -07:00
Alexis Rouillard
86b3e456e1 Merge pull request #2341 from zjeffer/hyprland/workspaces
Persistent workspaces in hyprland/workspaces
2023-07-31 08:34:30 +02:00
Alexis Rouillard
1eb4684b60 Merge pull request #2367 from diederikdehaas/more-manpage-fixes
man: Fix several whitespace formatting issues
2023-07-31 08:33:09 +02:00
Diederik de Haas
a3904ff039 man: Fix several whitespace formatting issues
Fix the following whitespace formatting issues:
- Indentation in scdoc source files should be done with tabs.
- Lines where there (clearly) should be a line break, need to have '++'
  at the end, but several were missing them.
- The scdoc manual (clearly) states that lines should be hard wrapped
  at 80 columns, but when line(s) are indented, that causes rendering
  issues. So lines where a line break was not clearly intended or
  clearly not intended, have been put onto 1 line to circumvent the
  rendering issue.

Link: https://lists.sr.ht/~sircmpwn/public-inbox/%3C8251560.T7Z3S40VBb%40bagend%3E
2023-07-30 17:37:30 +02:00
Alexis Rouillard
88828265c0 Merge pull request #2366 from zjeffer/fix/build-warnings
Fixed sway IPC compile warnings
2023-07-30 11:52:11 +02:00
zjeffer
600653538b Persistent workspaces in hyprland/workspaces 2023-07-30 11:47:37 +02:00
zjeffer
28635c1f6d Fixed sway IPC compile warnings 2023-07-30 11:43:34 +02:00
Alexis Rouillard
b09f6cc731 Merge pull request #2365 from diederikdehaas/manpage-fixes
Manpage fixes
2023-07-30 10:07:03 +02:00
Diederik de Haas
c8910901e5 man: Make NAME-ing consistent
Tools like `apropos` and `whatis` use the NAME section to generate their
database, so make sure every manpage has it.
Also make sure they all have a brief description and make it consistent
across the manpages.
2023-07-30 10:00:02 +02:00
Diederik de Haas
6b7fd36863 man/waybar-clock: Fix typo and formatting
typo: Adressed -> Addressed
formatting: Add missing spaces
2023-07-30 09:56:19 +02:00
Alexis Rouillard
20b091dcd8 Merge pull request #2360 from LukashonakV/ISSUE_2356 2023-07-30 01:12:40 +02:00
Viktar Lukashonak
106535e3eb tooltip-format spaces breaks pango format
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2023-07-29 23:46:35 +03:00
Alexis Rouillard
d3520536c4 Merge pull request #2352 from Mr-Pine/hyprland-window-fix 2023-07-29 11:02:39 +02:00
MisterPine
05e5a7e5fd Document icon for hyprland/window 2023-07-29 00:35:01 +02:00
MisterPine
2b07dea3a6 Fix broken start behavior for hyprland/window 2023-07-29 00:30:33 +02:00
Alexis Rouillard
629686f760 Merge pull request #2347 from MightyPlaza/typo
hyprland/workspaces fix typo
2023-07-28 09:58:09 +02:00
MightyPlaza
c71c0fca6e fix typo 2023-07-25 14:48:20 +00:00
Alexis Rouillard
9207fff627 Merge pull request #2345 from LukashonakV/ISSUE_2344
Clock. Narrow seconds precision
2023-07-24 23:19:19 +02:00
Viktar Lukashonak
dae7794bdf Clock. Narrow seconds precision
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2023-07-25 00:08:13 +03:00
Alexis Rouillard
c087d8c318 Merge pull request #2316 from MightyPlaza/workspaces
hyprland/workspaces improvements
2023-07-24 13:40:23 +02:00
Alexis Rouillard
6dfa74bd5d Merge pull request #2322 from zjeffer/master
Use C++20 by default
2023-07-24 09:27:18 +02:00
Alexis Rouillard
e9b29613b2 Merge pull request #2340 from LukashonakV/ISSUE_2331
time conversion between time zones
2023-07-24 09:26:02 +02:00
Viktar Lukashonak
d01ce7d812 Rewview changes.
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2023-07-24 10:16:38 +03:00
Alexis Rouillard
8ce1d15885 Merge pull request #2323 from zjeffer/mediaplayer-improvements
Mediaplayer improvements
2023-07-24 08:56:46 +02:00
Viktar Lukashonak
4d9e0ea802 time conversion between time zones
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2023-07-24 01:21:33 +03:00
Tuur Vanhoutte
2f04a49129 Merge branch 'Alexays:master' into master 2023-07-23 14:30:14 +02:00
zjeffer
6dc33fe88f Mediaplayer improvements 2023-07-23 13:55:25 +02:00
Alexis Rouillard
effad1a5c3 Merge pull request #2336 from Anakael/pr/anakael/add-high-priority-workspaces
[sway/workspaces] feat: add high-priority-named optiion
2023-07-21 17:33:10 +02:00
dmitry
05efdb74f0 format 2023-07-20 22:57:33 +03:00
dmitry
d3bcff31e5 add high-priority-named optiion 2023-07-20 22:56:15 +03:00
Alexis Rouillard
430f0e5d65 Merge pull request #2333 from LukashonakV/cava_man
cava man page
2023-07-19 21:47:33 +02:00
Viktar Lukashonak
4dff1d4b2b cava man page
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2023-07-19 20:44:52 +03:00
Alexis Rouillard
56df72f61c Merge pull request #2328 from LukashonakV/ISSUE_2281
cava bump
2023-07-18 16:59:38 +02:00
Viktar Lukashonak
8fdd456fa9 cava bump
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2023-07-18 17:51:23 +03:00
Alex
3e1176e896 fix: lint 2023-07-18 08:35:46 +02:00
Alexis Rouillard
52a8b1d911 Merge pull request #2234 from kris7t/offscreen-app-id
sway/window: app_id on unfocused workspaces
2023-07-18 08:32:32 +02:00
Alex
3ecd4030e3 chore: v0.9.20 2023-07-18 08:29:32 +02:00
Alex
841a004acd fix: lint 2023-07-18 08:28:19 +02:00
Alexis Rouillard
839975c348 Merge pull request #2318 from calvinchd/hyprland-window-remove-empty-css
hyprland/window remove duplicate empty css
2023-07-18 08:22:27 +02:00
Alexis Rouillard
185aa104b0 Merge pull request #2326 from czM1K3/master
hyprland/language: Differentiating keyboard layout variants
2023-07-18 08:21:52 +02:00
MightyPlaza
24d56023fd last fixes 2023-07-17 22:38:58 +00:00
MightyPlaza
d3e7a8c797 Merge branch 'Alexays:master' into workspaces 2023-07-17 22:38:13 +00:00
czM1K3
b2279c9565 Differencing keyboard layout variant for hyprland/language 2023-07-17 22:20:50 +02:00
MightyPlaza
52906407af Merge pull request #3 from zjeffer/pr-fixes
Some more small improvements
2023-07-17 14:27:38 +00:00
zjeffer
2721e19ee6 small improvements 2023-07-17 16:22:59 +02:00
Alexis Rouillard
388912d4a7 Merge pull request #2324 from xytovl/fix-crash-on-resume 2023-07-17 08:26:53 +02:00
Patrick Nicolas
f62b3d0e9d Ensure signal is disconnected in destructor 2023-07-16 23:29:28 +02:00
MightyPlaza
2d0fdaeec6 special fix 2023-07-16 18:22:14 +00:00
MightyPlaza
b9348180f5 Merge branch 'Alexays:master' into workspaces 2023-07-16 18:21:36 +00:00
Alexis Rouillard
1e2b9cb5ed Merge pull request #2306 from stefonarch/patch-1
Fix wrong name for {name}
2023-07-16 18:21:00 +02:00
zjeffer
62702a4878 fixed lint 2023-07-16 16:00:26 +02:00
zjeffer
c85738574c Use C++20 by default 2023-07-16 16:00:26 +02:00
MightyPlaza
96a8e5df83 Merge branch 'Alexays:master' into workspaces 2023-07-16 13:19:24 +00:00
Alexis Rouillard
85b4ff4f81 Merge pull request #2321 from calvinchd/hyprland-runtime-err 2023-07-16 15:10:03 +02:00
Calvin Chu
0f6eff1f20 hyprland: fix json parser runtime err from socket read ending early 2023-07-16 22:18:27 +10:00
Alexis Rouillard
7a5e702334 Merge pull request #2317 from m4rch3n1ng/backlight-percent 2023-07-16 09:34:47 +02:00
Calvin Chu
8687ed2068 Update man for hyprland/window to replace #window.empty with window#waybar.empty #window 2023-07-16 16:41:50 +10:00
Calvin Chu
2be0e966e1 hyprland/window: remove .empty css class for #window 2023-07-16 16:40:54 +10:00
may
facb53e81f backlight: do not convert percent to string in fmt 2023-07-16 04:14:43 +02:00
MightyPlaza
2bfc0e1da6 moves createWorkspace to update() 2023-07-16 01:49:46 +00:00
MightyPlaza
6d24b22b21 moves createWorkspace to update() 2023-07-16 01:43:54 +00:00
MightyPlaza
5f0fa71f32 moves createWorkspace to update() 2023-07-16 01:43:25 +00:00
MightyPlaza
4f81e55e41 workspaces.hpp 2023-07-16 01:20:30 +00:00
MightyPlaza
ca0122c3cb workspaces.cpp 2023-07-16 01:18:41 +00:00
MightyPlaza
7200b16520 documentation 2023-07-16 01:02:39 +00:00
MightyPlaza
e488daae16 Merge pull request #2 from zjeffer/pr-fixes
use IPC for click events, clang-tidy fixes
2023-07-15 22:18:24 +00:00
zjeffer
f3df15650a use IPC for click events, clang-tidy fixes 2023-07-15 23:48:12 +02:00
MightyPlaza
f8a9a970b2 removes "sort-by-number" 2023-07-15 18:43:46 +00:00
MightyPlaza
75e21c4853 Update waybar-hyprland-workspaces.5.scd 2023-07-15 18:36:55 +00:00
MightyPlaza
495b63d7dc workspaces.hpp 2023-07-15 17:44:57 +00:00
MightyPlaza
52983c7188 workspaces.cpp 2023-07-15 17:43:22 +00:00
Alexis Rouillard
2211a79840 Merge pull request #2308 from gardenappl/hidden-fix
hyprland/window: rename .hidden to .swallowing (and fix grouped windows)
2023-07-12 18:13:50 +02:00
gardenapple
daca57129f hyprland/window: rename .hidden to .swallowing (and fix grouped windows) 2023-07-12 19:01:45 +03:00
Alexis Rouillard
19c7c0763f Merge pull request #2307 from gardenappl/hidden-fix
hyprland/window: Fix overlap with .hidden class from default style
2023-07-12 17:27:37 +02:00
gardenapple
14c6550593 hyprland/window: Fix overlap with .hidden class from default style 2023-07-12 17:56:12 +03:00
Standreas
7aae93e7ed Fix wrong name for {name} 2023-07-12 16:31:58 +02:00
Alexis Rouillard
dffba78401 Merge pull request #2303 from Mr-Pine/hyprland-window-icon 2023-07-11 08:08:20 +02:00
MisterPine
a8a1a4985f Add removed secondary identifier
(class for xwayland under sway)
2023-07-10 23:48:18 +02:00
MisterPine
31683d9e2a Implemented AAppIconLabel for sway/window 2023-07-10 22:55:46 +02:00
MisterPine
00e143d47e Introducce AAppIconLabel class
Implemented for hyprland
2023-07-10 22:50:58 +02:00
MisterPine
6e9ba3fc01 Fix spacing if icon is false 2023-07-10 22:26:02 +02:00
MisterPine
a373f6b654 Icon working 2023-07-10 22:02:03 +02:00
Alexis Rouillard
91bd28d410 Merge pull request #2294 from Mr-Pine/hyprland-window-data
`hyprland/window` expose more data
2023-07-09 10:18:26 +02:00
Alexis Rouillard
acde076913 Merge pull request #2288 from LukashonakV/arch_cava
Arch CI cava
2023-07-09 10:17:55 +02:00
Alexis Rouillard
f5655526d0 Merge pull request #2296 from m-bdf/clock-tz-changes 2023-07-09 04:22:15 +02:00
Maëlys Bras de fer
56f956ff90 clock: handle timezone changes (again) 2023-07-09 01:44:39 +02:00
MisterPine
f97c1c7136 remove getWindowData 2023-07-08 23:22:29 +02:00
MisterPine
9ee883ee1b No dashes is format arg name 2023-07-08 23:11:11 +02:00
MisterPine
1887512ba1 Update scd 2023-07-08 22:40:16 +02:00
MisterPine
2ae13c4092 consitent naming 2023-07-08 22:40:16 +02:00
MisterPine
c5f1771375 Use already existing queryActiveWorkspace() 2023-07-08 22:40:16 +02:00
MisterPine
c4bace504c Separate query and struct 2023-07-08 22:40:16 +02:00
Alexis Rouillard
3bfeed31bc Merge pull request #2293 from sigboe/master 2023-07-08 21:47:04 +02:00
sigboe
d774de6c46 fix, default to true, sway/workspaces: warp-on-scroll 2023-07-08 21:32:19 +02:00
ViktarL
b20041d85d cava dependencies 2023-07-08 08:41:37 +00:00
Alexis Rouillard
e4900db9a2 Merge pull request #2286 from calvinchd/hyprland-window-noinfo 2023-07-06 08:24:11 +02:00
Calvin Chu
e2bfa5e019 hyprland/window: fix no info with separate-outputs=true 2023-07-06 11:01:24 +10:00
Alexis Rouillard
423d8495e4 Merge pull request #2284 from jbeich/dbus 2023-07-05 20:17:51 +02:00
Jan Beich
1fb2b8efd5 fix(util): don't abort modules from SleeperThread after 3c9cbc99d7
[warning] module sway/workspaces: Disabling module "sway/workspaces", Unable to connect to the SYSTEM Bus!...
[warning] module sway/mode: Disabling module "sway/mode", Unable to connect to the SYSTEM Bus!...
[warning] module sway/scratchpad: Disabling module "sway/scratchpad", Unable to connect to the SYSTEM Bus!...
[warning] module custom/media: Disabling module "custom/media", Unable to connect to the SYSTEM Bus!...
[warning] module sway/window: Disabling module "sway/window", Unable to connect to the SYSTEM Bus!...
[warning] module cpu: Disabling module "cpu", Unable to connect to the SYSTEM Bus!...
[warning] module memory: Disabling module "memory", Unable to connect to the SYSTEM Bus!...
[warning] module temperature: Disabling module "temperature", Unable to connect to the SYSTEM Bus!...
[warning] module sway/language: Disabling module "sway/language", Unable to connect to the SYSTEM Bus!...
[warning] module battery: Disabling module "battery", Unable to connect to the SYSTEM Bus!...
[warning] module battery#bat2: Disabling module "battery#bat2", Unable to connect to the SYSTEM Bus!...
2023-07-05 17:47:24 +00:00
Alexis Rouillard
3299d4a25c Merge pull request #2270 from gardenappl/hypr-backend
hyprland/window: Add .hidden CSS class, account for hidden & fullscreen windows
2023-07-05 08:14:49 +02:00
gardenapple
e125bbeb4d hyprland/window: properly check visibility for .floating class 2023-07-05 03:43:03 +03:00
gardenapple
55c59253d6 Update man pages 2023-07-05 03:15:59 +03:00
Alexis Rouillard
e7deab92c7 Merge pull request #2282 from zjeffer/fix/build-warnings
Fixed build warnings
2023-07-04 23:09:13 +02:00
zjeffer
d21f29cb14 Fixed build warnings 2023-07-04 23:05:26 +02:00
Alex
d8a808f76c chore: 0.9.19 2023-07-04 23:03:50 +02:00
Alexis Rouillard
5ef6636237 Merge pull request #2265 from tengyifei/master
Partially revert 3af1853260 to fix use-after-free
2023-07-04 22:59:45 +02:00
Alex
fc632f50ec fix: lint 2023-07-04 22:52:24 +02:00
Alexis Rouillard
31e4c9023e Merge pull request #1872 from HarHarLinks/patch-1
Add output parameter format to manpage
2023-07-04 22:46:06 +02:00
Alexis Rouillard
3e1c341933 Merge branch 'master' into patch-1 2023-07-04 22:45:15 +02:00
Alexis Rouillard
0d1016d4d2 Merge pull request #2203 from rodrgz/mprisImprovement
mpris: dynamic tag ordering and separator customization
2023-07-04 22:44:21 +02:00
Alexis Rouillard
12725f4418 Merge pull request #2220 from sigboe/warp-on-scroll-toggle
sway/workspaces: setting to not warp to window when scrolling
2023-07-04 22:42:53 +02:00
Alexis Rouillard
5c64d034a2 Merge pull request #2010 from chayleaf/improve-flake
improve nix dev shell; override the nixpkgs waybar
2023-07-04 22:40:52 +02:00
Alexis Rouillard
14fa9cf7b7 Merge pull request #2128 from Alan-Kuan/image-tooltip
Image tooltip
2023-07-04 22:40:04 +02:00
Alex
6c196b8f8d fix: lint 2023-07-04 22:35:27 +02:00
Alex
18d6dfea88 feat(man): start_hidden 2023-07-04 22:35:15 +02:00
Alexis Rouillard
d2eb8eb9fc Merge pull request #2175 from maqrrr/start_hidden
Add a new start_hidden flag
2023-07-04 22:33:33 +02:00
Alexis Rouillard
65f73d3e95 Merge pull request #2269 from Arcus92/master
wlr/taskbar: add support for rewrite rules
2023-07-04 22:31:37 +02:00
Alexis Rouillard
265b4edb2e Merge pull request #2276 from skligys/fix_mpris_ui_spamming
Stop MPRIS module from updating every ~20ms
2023-07-04 22:29:48 +02:00
Alexis Rouillard
18f5af835f Merge pull request #2280 from zjeffer/fix/hyprland/workspaces 2023-07-04 19:58:07 +02:00
zjeffer
7ef80d563b Formatting fixes 2023-07-04 19:48:04 +02:00
zjeffer
d3be9a7363 Fix rare segfault when destroying workspace 2023-07-04 19:40:43 +02:00
Alexis Rouillard
5f29e5a5e8 Merge pull request #2279 from LukashonakV/Catch_bump 2023-07-04 18:37:30 +02:00
Viktar Lukashonak
cf4d58f30a Catch2 bump 2023-07-04 11:30:44 -04:00
Alexis Rouillard
bb61461aad Merge pull request #2278 from Anakael/pr/anakael/hyprland-workspaces 2023-07-04 08:02:45 +02:00
Alexis Rouillard
c91c8bbc45 Merge pull request #2277 from Aparicio99/fix_icon_theme_segfault 2023-07-04 08:01:45 +02:00
dmitry
f26a125d15 format 2023-07-04 01:26:16 +03:00
dmitry
de626dcbbc format 2023-07-04 01:24:34 +03:00
dmitry
c9b963e82b fix segfault 2023-07-04 01:17:26 +03:00
André Aparício
a1cd0acac5 Fix random segfault on GTK icon functions
The segfaults were happening on GTK icon theme functions, which are
called via the C++ interface functions such as Gtk::IconTheme::has_icon.

There are multiple modules and threads using this functions on the default
icon theme by calling Gtk::IconTheme::get_default(), which returns the same
object for all callers, and was causing concurrent access to the same internal
data structures on the GTK lib. Even a seemingly read-only function such as
has_icon can cause writes due to the internal icon cache being updated.

To avoid this issues, a program wide global mutex must be used to ensure
a single thread is accessing the default icon theme instance.

This commit implements wrappers for the existing IconTheme function calls,
ensuring the global lock is held while calling the underling GTK functions.
2023-07-03 22:32:24 +01:00
Skirmantas Kligys
c2f9d889f4 Stop MPRIS module from updating every ~20ms as onPlayerMetadata(), onPlayerPlay()
callbacks get triggered without regard for update interval.
2023-07-03 13:52:57 -07:00
gardenapple
cdece498c1 hyprland/window: .solo class accounts for hidden & fullscreen windows 2023-07-02 20:58:42 +03:00
David Schulte
58bdc6a41c fix spaces in waybar-wlr-taskbar.5.scd 2023-07-02 12:51:54 +02:00
David Schulte
c55cd82b39 wlr/taskbar: add support for rewrite rules 2023-07-02 12:23:36 +02:00
Alexis Rouillard
91588fb8bb Merge pull request #2212 from evyatark2/wpscroll
wireplumber: Support for scrolling
2023-07-02 11:46:56 +02:00
Alexis Rouillard
6b9600fecd Merge pull request #2267 from korylprince/reverse-scrolling
Don't apply reverse scrolling to mice wheels
2023-07-02 11:45:44 +02:00
Alexis Rouillard
0bfb29789c Merge pull request #2268 from zjeffer/hyprland/workspaces
Fixes for hyprland/workspaces
2023-07-02 11:45:09 +02:00
zjeffer
f6a62e258e fixes for hyprland/workspaces 2023-07-01 18:53:17 +02:00
Kory Prince
1ba05d1ffa add reverse-mouse-scrolling to configure mouse wheel reverse scrolling 2023-07-01 10:35:37 -05:00
Kory Prince
7a01143359 ignore reverse-scrolling from mouse wheel 2023-07-01 10:33:55 -05:00
Kory Prince
35496f461f fix regression from #2232: reverse-scrolling was not applied to
GTK_SCROLL_SMOOTH events
2023-07-01 10:33:55 -05:00
Alex
b9cd0287f4 fix: typo 2023-07-01 11:12:46 +02:00
Alex
9d741f89e2 fix: lint 2023-07-01 11:12:14 +02:00
Alex
cc4370f1b2 fix: build 2023-07-01 11:08:31 +02:00
Alexis Rouillard
85854c71d6 Merge pull request #2219 from xytovl/wake_threads_on_resume
Wake all sleeping threads when leaving suspend
2023-07-01 11:02:13 +02:00
Alexis Rouillard
6ed550117c Merge pull request #2237 from LukashonakV/Gentoo_CI
Refresh Gentoo docker
2023-07-01 10:57:33 +02:00
Alexis Rouillard
15fe85d18d Merge pull request #2264 from Anakael/pr/anakael/hyprland-workspaces
feat: hyprland/workspaces
2023-07-01 10:55:24 +02:00
Alexis Rouillard
b62e5eb822 Merge pull request #2266 from zjeffer/master
Fixed some build warnings
2023-07-01 10:53:24 +02:00
zjeffer
25c2aaabcb Fixed build warnings 2023-07-01 10:12:24 +02:00
Yifei Teng
cd49eef229 Partially revert 3af1853260 to fix use-after-free
After upgrading to the latest release of Waybar the bar will crash
whenever I close the laptop lid. After some debugging I believe it is
because the watching added by watch_name is not being correctly canceled
using unwatch_name. After the Tray object and Host object are destroyed,
additional callbacks will become use-after-free.

Looks like commit 3af1853260 removed the
unwatch_name. I'm not sure why it did that, but it seemed dangerous.

Additionally, bus_name_id_ is created by own_name. According to that
function's documentation, the correct inverse operation is unown_name.
2023-06-30 23:25:24 -07:00
dmitry
4f9fbbfa54 fix format 2023-07-01 02:25:15 +03:00
dmitry
0b602632f2 return catch2 2023-07-01 02:23:37 +03:00
dmitry
dbc7471f83 add docs 2023-07-01 02:13:36 +03:00
dmitry
887c44bf68 finish MVP 2023-07-01 00:18:57 +03:00
dmitry
33236c222f save 2023-06-28 02:52:01 +03:00
Alexis Rouillard
4116490535 Merge pull request #2256 from luttermann/master
Add output port (display) of workspace to template function of sway/workspace
2023-06-27 13:50:54 +02:00
Lasse Luttermann
08e18387c9 Add output port of workspace to template 2023-06-27 13:41:42 +02:00
Alexis Rouillard
0fff38c751 Merge pull request #2258 from Anakael/pr/anakael/hide-empty-taskbar
[wrl/taskbare] fix: use empty class for empty taskbar
2023-06-27 08:58:54 +02:00
dmitry
afc489869a fix format 2023-06-27 00:18:49 +03:00
dmitry
ce4da59f34 finish 2023-06-27 00:07:40 +03:00
Lasse Luttermann
43434254e0 Add output port of workspace to template 2023-06-26 11:01:50 +02:00
Erik Rodriguez
66ce74d29b mpris: Rename dynamic-priority to dynamic-importance-order keeping backward compatibility 2023-06-22 02:13:44 -03:00
Erik Rodriguez
77a8420aaf mpris: Add dynamic-order and dynamic-separator
This commit allows better handling of ordering and exclusion of the tags in Dynamics tags.
It also becomes possible to choose the separator between the tags.
2023-06-22 02:13:34 -03:00
Alexis Rouillard
b0f89f2bc1 Merge pull request #2241 from yangyingchao/master
support multiple items in hwmon-path of temperature module
2023-06-20 13:22:36 +02:00
Alexis Rouillard
7cda2dfd1a Merge pull request #2245 from gardenappl/main
hyprland/window: Add CSS customization similar to sway/window
2023-06-20 13:22:12 +02:00
Alexis Rouillard
238cfa9547 Merge pull request #2247 from gardenappl/hypr-backend
More robust Hyprland backend
2023-06-20 13:21:34 +02:00
gardenapple
b163b21ace More robust Hyprland backend 2023-06-20 13:36:48 +03:00
gardenapple
30c4f08773 hyprland/window: Correct application of .solo class 2023-06-20 03:54:02 +03:00
gardenapple
fd7c2a2012 hyprland/language: Show language on startup 2023-06-20 00:43:33 +03:00
gardenapple
4f14ce3285 hyprland/window: add .floating and .fullscreen CSS classes 2023-06-20 00:42:19 +03:00
gardenapple
e233022d1a hyprland/window: Rework, add .empty, .solo and .<app_id> CSS classes 2023-06-19 23:44:20 +03:00
yangyingchao
e403c3b71b support multiple items in hwmon-path of temperature module
So user can share configuration file among different machines with different hardware
configurations.
2023-06-17 11:33:14 +08:00
Alexis Rouillard
d367b7e1d6 Merge pull request #2229 from LukashonakV/Upower_nativePath
Upower native-path filter
2023-06-16 15:38:58 +02:00
Alexis Rouillard
038644f8d9 Merge pull request #2238 from LukashonakV/ISSUE#2204
Issue#2204
2023-06-16 15:38:20 +02:00
Viktar Lukashonak
d650c597f9 Renew clock man page
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2023-06-15 16:36:33 +03:00
Viktar Lukashonak
5196009656 Refresh Gentoo docker
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2023-06-15 13:58:33 +03:00
Viktar Lukashonak
4d8515930f Use local TZ, when user sets blank TZ in config
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2023-06-13 23:32:28 +03:00
Viktar Lukashonak
192cea97f2 Upower man
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2023-06-13 18:44:29 +03:00
Kristóf Marussy
5bfdbf116d sway/window: app_id on unfocused workspaces
If the unfocused workspace has a single window, use window-specific
styling when offscreen-css is enabled.
2023-06-13 01:52:13 +02:00
Alex
83f3c2321e Merge pull request #2231 from RobertMueller2/appid-fix
sway/window: fix appid style not cleared
2023-06-12 15:40:56 +02:00
Alex
dff0583c12 Merge pull request #2232 from robertgzr/reverse-scroll
Lift reverse-scrolling option into AModule
2023-06-12 08:54:38 +02:00
Robert Günzler
73c7e54535 pulseaudio: document reverse-scrolling option
Signed-off-by: Robert Günzler <r@gnzler.io>
2023-06-12 14:08:22 +09:00
Robert Günzler
0f8c156f24 Lift reverse-scrolling option into AModule
The option is generally useful when scrolling is used, when configuring
input devices to use "natural scroll direction".
Both backlight and pulseaudio were using different implementations, this
unifies and documents them.

Signed-off-by: Robert Günzler <r@gnzler.io>
2023-06-12 14:08:18 +09:00
Rene D. Obermueller
fff4509723 sway/window: fix appid style not cleared (#2227)
Probably a rebase error during development of #1419. The code block now
removed was not supposed to be there anymore.
2023-06-11 08:41:20 +02:00
Viktar Lukashonak
17af49d421 Upower native-path filter
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2023-06-09 18:22:24 +03:00
Alex
9f38631c7f Merge pull request #2223 from Anakael/pr/shchemel/fix-class-priority 2023-06-09 08:36:34 +02:00
dmitry
62f4125927 change order 2023-06-08 23:31:14 +03:00
sigboe
a67e692d4a sway: warp-on-scroll toggle 2023-06-07 15:49:11 +02:00
Patrick Nicolas
3c9cbc99d7 Wake all sleeping threads when leaving suspend
std::condition_variable::wait_for does not count time spent in sleep
mode, resulting in longer than expected waits.
2023-06-07 10:17:42 +02:00
Alex
c5379fa52d Merge pull request #2218 from LukashonakV/Wdeprecated
deprecated: implicit capture of 'this' via '[=]'
2023-06-06 22:56:27 +02:00
Alex
070110af0c Merge pull request #2217 from LukashonakV/g_bus_unwatch_name
Tray module causes: Invalid id passed to g_bus_unwatch_name()
2023-06-06 22:37:46 +02:00
Viktar Lukashonak
6bf5b15c13 deprecated: implicit capture of 'this' via '[=]'
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2023-06-06 23:31:12 +03:00
Viktar Lukashonak
a9779c2aa2 Happy Linter
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2023-06-06 23:06:11 +03:00
Viktar Lukashonak
3af1853260 Tray module cause error g_bus_unwatch_name()
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2023-06-06 23:02:36 +03:00
Alex
d638610db1 Merge pull request #2216 from LukashonakV/small_fixies
Small performance fixies
2023-06-06 13:03:52 +02:00
Viktar Lukashonak
87023c39f8 Small performance fixies
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2023-06-06 13:58:05 +03:00
Evyatar Stalinsky
e96610e31a Use consistent tabbing 2023-06-06 12:01:25 +03:00
Evyatar Stalinsky
d61b1d54de Document new wireplumber module functionality 2023-06-06 11:44:17 +03:00
Evyatar Stalinsky
e397f568b7 Round volume instead of truncating it 2023-06-06 11:42:31 +03:00
Evyatar Stalinsky
d22fd3bbd1 Use a minimum step as provided by wireplubmer; Default step to 1 2023-06-06 11:42:02 +03:00
Evyatar Stalinsky
75990c2867 Fix linting 2023-06-05 22:23:46 +03:00
Evyatar Stalinsky
88a1a702b4 wireplumber: Support for scrolling 2023-06-05 22:03:46 +03:00
Alex
24407dbf4a Merge pull request #2196 from calvinchd/hyprland-window-empty-css
[hyprland/window] Add css class for empty window name
2023-06-05 16:48:59 +02:00
Alex
108285e9ac Merge pull request #2210 from D3vil0p3r/patch-1
Fixing 'incomplete type error' during building
2023-06-05 16:30:00 +02:00
D3vil0p3r
b728a37b6d Fixing 'incomplete type error' during building
Fixing errors during the building due to missing library after latest GCC updates.
2023-06-05 16:28:32 +02:00
Alex
938a93a0d7 Merge pull request #2209 from Matias-Hall/river_window_tooltip 2023-06-05 12:39:38 +02:00
Matias-Hall
ff6f727631 river/window: Add tooltip. 2023-06-05 18:29:19 +08:00
Alex
84077e0253 Merge pull request #2207 from dejor/dwl-module 2023-06-04 18:39:03 +02:00
dejor
d2787cc2d8 fix: typo to avoid null pointer 2023-06-04 12:45:33 +02:00
Calvin Chu
17a56aa4f7 hyprland/window: use empty() for empty window name check 2023-06-03 12:29:36 +10:00
Alex
ca52892ab9 Merge pull request #2200 from Visne/patch-1 2023-06-01 22:52:54 +02:00
Visne
655bc8f215 Fix broken link 2023-06-01 22:08:54 +02:00
Calvin Chu
a3912436be hyprland/window: add css class for empty label 2023-06-01 21:38:27 +10:00
Alex
47193a3d2f chore: v0.9.18 2023-05-29 09:25:01 +02:00
Alex
097cbc0c53 fix: lint 2023-05-29 09:24:33 +02:00
Alex
13a9c4a08b Merge pull request #2185 from xdavidel/dwl-module
Update to new ipc version
2023-05-29 09:16:22 +02:00
David Delarosa
ebba529682 Apply clang-format 2023-05-25 01:29:28 +03:00
David Delarosa
b97b0ae605 Fix linter complains 2023-05-25 01:25:55 +03:00
David Delarosa
7e9bfc504c Update to new ipc version 2023-05-25 00:27:50 +03:00
Alex
7b0d2e8043 Merge pull request #2184 from lfos/fix-battery-segfault
Fix SEGFAULT in battery module
2023-05-22 16:19:13 +02:00
Lukas Fleischer
75eacb95ef Fix SEGFAULT in battery module
In waybar::modules::Battery::~Battery(), store a copy of the batteries_
iterator before calling erase(), as erase() invalidates the iterator.

Prior to this change, disconnecting outputs resulted in a SEGFAULT when
using the battery module; e.g.,

    [debug] Received SIGCHLD in signalThread
    [debug] Cmd exited with code 0
    [debug] Received SIGCHLD in signalThread
    [debug] Cmd exited with code 0
    [debug] Received SIGCHLD in signalThread
    [debug] Cmd exited with code 0
    [debug] Output removed: AU Optronics 0x2336
    [info] Bar configured (width: 1280, height: 25) for output: eDP-1
    [info] Bar configured (width: 1280, height: 25) for output: eDP-1
    zsh: segmentation fault (core dumped)  ./build/waybar -l trace

Signed-off-by: Lukas Fleischer <lfleischer@lfos.de>
2023-05-22 10:16:30 -04:00
Alex
2b24b16023 Merge pull request #2182 from cptpcrd/fd-closing 2023-05-22 07:40:14 +02:00
cptpcrd
5cbbfd5c8a Close pipe if fork() fails when spawning processes
Prevents potential file descriptor leakage, albeit in a bit of an edge
case.
2023-05-21 12:15:49 -04:00
cptpcrd
6163be687d Open network module eventfd as close-on-exec
Ensures that it is not leaked to child processes.
2023-05-21 12:13:17 -04:00
cptpcrd
df65cab17a Open command pipes as close-on-exec
Avoids a race where the pipe could be inherited by another process
spawning at about the same time. If the other process didn't exit
quickly (e.g. if it was a custom script that did its own looping), it
would keep the write end of the pipe open, and so reading from the pipe
to try to get the command's output would block.

This bug manifested as some custom modules randomly not appearing in the
bar, requiring a reload to fix. The custom script had run and exited,
but the pipe had been inherited by another process, and the thread that
updated the module's output was blocked trying to read from it.
2023-05-21 12:10:44 -04:00
maqrrr
339bea1213 Add a new start_hidden bool 2023-05-15 07:01:00 -04:00
Alex
7b704071ff Merge pull request #2171 from FintasticMan/fix_mpris_man
mpris: Fix incorrect format replacement names
2023-05-13 23:25:30 +02:00
Finlay Davidson
5748e56aeb mpris: Fix incorrect format replacement names 2023-05-13 21:45:29 +02:00
Alex
5b29119dab Merge pull request #2170 from FintasticMan/hide_mpris_if_empty
mpris: Hide label if empty
2023-05-13 18:26:12 +02:00
Finlay Davidson
4bc30e040f mpris: Hide label if empty 2023-05-10 13:43:43 +02:00
Alex
919ad0a8bb Merge pull request #2156 from theRealCarneiro/master
Add persistent format-icon to wlr/workspaces
2023-05-05 14:05:32 +02:00
theRealCarneiro
5df43be11f add persistent format-icon 2023-05-05 08:52:37 -03:00
Alex
56fa6b6afc Merge pull request #2153 from MonstrousOgre/master 2023-05-04 22:21:13 +02:00
MonstrousOgre
c04485a5d0 separate css class for empty workspaces 2023-05-05 00:09:32 +05:30
Alex
b06953757e Merge pull request #2144 from LukashonakV/cava_bump 2023-04-29 00:13:25 +02:00
Viktar Lukashonak
f5ef13c7f1 Gentoo docker. Add iniparser
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2023-04-28 15:46:51 +03:00
Viktar Lukashonak
8c83af75a1 happy linter
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2023-04-28 15:38:34 +03:00
Viktar Lukashonak
e253c34cd4 cava bump
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2023-04-28 13:38:35 +03:00
Alex
e4faf252b2 Merge pull request #2140 from 257/master 2023-04-26 21:35:46 +02:00
Paymon
3da3732cc9 network: detect if link is p2p and use local addr
without this we endup with peer's addr

Signed-off-by: Paymon MARANDI <darwinskernel@gmail.com>
2023-04-26 13:52:17 -04:00
Alex
757f20fc04 Merge pull request #2135 from eneshecan/master 2023-04-23 13:47:28 +02:00
Enes Hecan
f00602058c Fix misinterpreting return value of getaddrinfo call which caused an early return for Hyprland language 2023-04-23 13:31:02 +02:00
Bruce Blore
bad6cfae6f Added option to calculate battery percentage as total_energy * 100 / total_energy_full 2023-04-22 23:43:04 -07:00
Alan-Kuan
9389c8d854 chore: update manual of the image modle 2023-04-21 16:51:04 +08:00
Alan-Kuan
6a17139423 feat: tooltip for image module 2023-04-21 16:38:21 +08:00
Alex
a9a2223469 fix: lint 2023-04-17 09:09:13 +02:00
Alex
33d1ee413f fix: typo 2023-04-17 09:07:59 +02:00
Alex
0b4c1cb877 Merge pull request #1950 from tleydxdy/shironeko 2023-04-17 09:06:43 +02:00
Alex
5e5569bb10 Merge pull request #1858 from uncomfyhalomacro/replace-gethostbyname-getaddrinfo 2023-04-17 09:05:35 +02:00
Alex
272d672953 fix: add missing man 2023-04-17 09:03:01 +02:00
Alex
ede1d25440 fix: lint 2023-04-17 09:01:14 +02:00
Alex
8be889c5aa Merge pull request #2103 from xdavidel/dwl-module
Add DWL tags module
2023-04-17 09:01:00 +02:00
Alex
b1e3347fca Merge pull request #2089 from MonstrousOgre/master 2023-04-17 08:59:22 +02:00
Alex
da2163ae41 Merge pull request #2092 from chayleaf/mpris-fix-non-dynamic-tag-escapes 2023-04-17 08:58:40 +02:00
Alex
1d7d1a8fe8 Merge pull request #2108 from yeheng282/backlight-fix 2023-04-17 08:58:03 +02:00
Alex
7d20034067 Merge pull request #2095 from alex-courtis/2094-pulseaudio-states 2023-04-17 08:56:26 +02:00
Alex
8aafe817bf Merge pull request #2102 from LukashonakV/Cava 2023-04-16 18:06:53 +02:00
Viktar Lukashonak
a5607b66ca Cava module
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2023-04-15 02:36:15 +03:00
Alex
61648c55d9 Merge pull request #2113 from LukashonakV/ISSUE#2073 2023-04-13 16:29:34 +02:00
David Delarosa
4dff1b91fe Merge branch 'Alexays:master' into dwl-module 2023-04-13 17:18:27 +03:00
David Delarosa
1368ba64b5 Fix segfault in destructor 2023-04-13 17:16:37 +03:00
Viktar Lukashonak
6de3b58d6a ISSUE#2073
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2023-04-13 17:16:03 +03:00
David Delarosa
731eaeb0be Addapt to DWL new tag system
- tagscount is being used instead of tag array
2023-04-13 03:58:57 +03:00
yeheng282
022c9abad4 backlight: support tooltip 2023-04-11 21:01:02 +08:00
Alex
a46b8a0109 Merge pull request #2105 from skylar779/master
Made use of node_id_
2023-04-11 11:12:38 +02:00
skylar779
3b2dfeec01 Made use of node_id_
Checking against names for volume changes seems a bit weird to me and
also didn't really work, so I've made use of node_id_ to check against
this instead and also fixed an issue, where the volume update would
refuse to do its thing despite it being the same id that was used on launch.
2023-04-11 10:51:25 +02:00
Alex
e62d339b57 Merge pull request #2104 from numas13/master 2023-04-11 07:44:52 +02:00
Denis Drakhnia
18a2b90fc0 fix: generate wireplumber module man page 2023-04-11 08:17:45 +03:00
David Delarosa
60cdf10e64 Add DWL tags module 2023-04-11 04:50:21 +03:00
Alexander Courtis
51f0fc6b72 #2094 pulseaudio apply states 2023-04-07 14:19:45 +10:00
MonstrousOgre
6f3a27905d preventing persistent_workspaces and all-outputs from being used together 2023-04-06 12:14:44 +05:30
chayleaf
659fea07ee mpris: fix non-dynamic tags not being html escaped 2023-04-06 13:24:28 +07:00
Alex
bd908f6d97 Merge pull request #2090 from chayleaf/mpris-css-fix 2023-04-06 07:26:34 +02:00
chayleaf
cb82326b22 mpris: fix css class application
apply styles to label rather than event_box (fixes play/pause state and
per-player selectors)
2023-04-06 04:50:32 +07:00
MonstrousOgre
33c4964187 replacing spdlog::info with spdlog::debug 2023-04-06 00:34:52 +05:30
Alex
3d980f92a3 fix: build 2023-04-03 10:59:29 +02:00
Alex
626a1f58be fix: build 2023-04-03 10:51:36 +02:00
Alex
1445dc4151 fix: lint 2023-04-03 10:06:01 +02:00
Alex
a6084ea7e6 Merge pull request #2068 from TheRealLorenz/master 2023-04-03 09:44:04 +02:00
Alex
60467ad7f2 Merge pull request #2064 from en3wton/hyprland-language-format-replacements 2023-04-03 09:43:28 +02:00
Alex
ef99b0226c Merge pull request #1932 from ldelossa/wlr-taskbar-sort-app-id 2023-04-03 09:42:19 +02:00
Alex
60e0584d16 fix: lint 2023-04-03 09:41:24 +02:00
Alex
ba6faa7859 Merge pull request #2011 from chayleaf/improve-mpris 2023-04-03 09:40:01 +02:00
Alex
02b3c125a1 fix: init optional to null 2023-04-03 09:38:12 +02:00
Alex
20a8039a25 Merge pull request #2080 from cdump/master 2023-03-31 19:17:56 +02:00
Maxim Andreev
ffeef7f40f modules/clock: fix calendar shift in months with 31 days 2023-03-31 20:07:59 +03:00
chayleaf
0cfd1c7094 mpris: don't put ellipsis after whitespace 2023-03-31 19:54:44 +07:00
chayleaf
e5524d5059 mpris: switch base class from AModule to ALabel 2023-03-31 19:54:39 +07:00
chayleaf
774d8880cd mpris: fix potentially invalid seconds count on >1h media 2023-03-31 19:54:39 +07:00
chayleaf
a301b8c4cd mpris: update docs 2023-03-31 19:54:27 +07:00
chayleaf
5383f7bd56 mpris: add unicode support; add position tag 2023-03-31 19:54:20 +07:00
chayleaf
a53c97f7f6 mpris: add tooltip and length limits 2023-03-31 19:53:53 +07:00
Alex
9fd2703cb9 Merge pull request #2077 from lilydjwg/master 2023-03-30 20:45:17 +02:00
lilydjwg
918de59988 custom module: free memory returned by libc's getline 2023-03-29 21:18:13 +08:00
TheRealLorenz
4b27385da2 Update manpage for sway/window module 2023-03-25 17:41:09 +01:00
TheRealLorenz
f557697e92 Rewrite entire label in sway/window module
Closes #1742
2023-03-25 17:37:49 +01:00
TheRealLorenz
63525ec956 Rename function name 2023-03-25 17:33:01 +01:00
MonstrousOgre
5791a6abc6 Reading persistent workspaces 2023-03-24 23:11:47 +05:30
en3wton
bbcfb5e138 remove use of new on Layout 2023-03-21 19:30:35 +00:00
en3wton
4ab4ff790e add more format replacements for hyprland/language 2023-03-19 15:12:11 +00:00
Alex
473eb0982b Merge pull request #2053 from paul-ri/exlude-in-array 2023-03-13 11:04:25 +01:00
Paul Riou
fa9f3a6dc5 make:Add phony 'test' rule 2023-03-13 00:50:19 +00:00
Paul Riou
c26849217e test:Add test for output config with multiple exclusion/wildcard 2023-03-13 00:49:18 +00:00
Paul Riou
90206f55be config:output:Allow multiple exclusions & wildcard
Covers the use case where needing to exclude more than 1 output but
still include all other displays.

e.g. I have 3 monitors: laptop + HD + 4K; and 3 bar types:
- The main bar is on the laptop. `output: "laptop-monitor-id"`
- The 4K has a specific waybar bar-1 configuration. `output: "4K-monitor-id"`
- I want all other displays (3rd HD monitor / any HDMI output when presenting)
  to have a plain bar: `output: ["!laptop-monitor-id", "!4k-monitor-id", "*"]`
2023-03-13 00:44:07 +00:00
Alex
9a0dbd555d Merge pull request #2049 from 2e0byo/lint 2023-03-08 15:46:41 +01:00
John Maximilian
a9015c7c98 refactor: make linter happy. 2023-03-08 14:35:07 +00:00
Alex
5b6e9d4e34 Merge pull request #2048 from LDAP/patch-1 2023-03-08 15:29:17 +01:00
Lucas Alber
8ccf00f0fe Wireplumber: Free the default node name
The `default_node_name_` is reassigned without calling `g_free` on the old string.
2023-03-08 15:21:52 +01:00
Alex
823c13a8c0 Merge pull request #2046 from 2e0byo/fix/mpd 2023-03-07 18:12:40 +01:00
John Maximilian
3c96881a59 fix: mpd bug paused with no song. 2023-03-07 16:48:05 +00:00
Alex
b34d325a71 Merge pull request #2037 from LukashonakV/Happy_clang
Happy clang
2023-03-02 19:42:38 +01:00
Alex
3bda22da72 Merge pull request #1589 from qubidt/module-group-orientation
group module: configurable orientation
2023-03-02 19:42:22 +01:00
Viktar Lukashonak
61a6c00c02 Happy clang 2023-03-02 16:57:32 +03:00
Alex
39bc54e3ad Merge pull request #2036 from LukashonakV/Clock_TZ_try_catch 2023-03-02 08:48:56 +01:00
Viktar Lukashonak
4cb7e55a91 ISSUE #878. Try catch Clock timezones
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2023-03-02 10:10:34 +03:00
Viktar Lukashonak
43862ceb34 ISSUE #878. Try catch Clock timezones 2023-03-02 10:07:10 +03:00
Alex
f29a400c97 Merge pull request #2035 from LukashonakV/AModule_forceEvents 2023-03-01 23:24:18 +01:00
Viktar Lukashonak
ce16e029ed Issue #2030. AModule enable_click & enable_scroll
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2023-03-01 23:39:36 +03:00
Louis DeLosSantos
79eb2f5bc1 wlr-taskbar: allow sorting by app_id
some users (maybe only myself) may want to sort the task bar by app_id
which then places occurrences of the same task next to each other.

Signed-off-by: Louis DeLosSantos <louis.delos@gmail.com>
2023-03-01 12:16:28 +00:00
Alex
b7e6a2dc25 Merge pull request #2034 from pascal-huber/master 2023-03-01 11:06:27 +01:00
Pascal Huber
23f39938fb Revert "feat(sway): add workspace css class"
This reverts commit a10464d9bb.
2023-03-01 10:55:15 +01:00
Alex
8cc8820369 Merge pull request #2017 from pascal-huber/master 2023-03-01 09:43:44 +01:00
Alex
c9c8b09e3f Merge pull request #1991 from alex-courtis/add-river-layout 2023-03-01 09:42:39 +01:00
Alex
fb1f550c1a Merge pull request #2019 from LukashonakV/ISSUE#1977 2023-03-01 09:38:28 +01:00
Viktar Lukashonak
e25a7c9719 ISSUE#1977. AModule implements module actions call
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2023-02-28 15:32:28 +03:00
Alex
09142fa322 Merge pull request #2025 from ElyesH/master 2023-02-25 10:49:59 +01:00
Elyes Haouas
1af25094b7 Fix some typos
Signed-off-by: Elyes Haouas <ehaouas@noos.fr>
2023-02-25 09:55:04 +01:00
Elyes Haouas
0d99d38089 modules/network.cpp: Remove repeated "the"
Signed-off-by: Elyes Haouas <ehaouas@noos.fr>
2023-02-25 09:51:40 +01:00
Pascal Huber
a10464d9bb feat(sway): add workspace css class 2023-02-18 20:31:12 +01:00
chayleaf
3f23792df0 use the recommended way of using flake-compat 2023-02-16 20:31:02 +07:00
chayleaf
529031f44f fix typo 2023-02-16 20:26:57 +07:00
chayleaf
f51894614d after updating nix.lock all this soup isn't needed 2023-02-16 20:25:07 +07:00
chayleaf
a7dbab79e5 add default.nix for compatibility; update flake.lock 2023-02-16 20:02:39 +07:00
chayleaf
4dcce810d2 improve nix dev shell; override the nixpkgs waybar
for example, the update from 0.9.16 to 0.9.17 broke this flake, after
this change the derivation will be the same as the nixpkgs one. This is
the better option since the flake is unmaintained in this repo (although
it may still break inbetween releases)
2023-02-16 19:45:58 +07:00
Alexander Courtis
43958ef560 fix: compilation errors with cpp_std=c++20 2023-02-11 13:26:03 +11:00
Alexander Courtis
5e4a47c0a8 Merge branch 'master' into add-river-layout 2023-02-11 13:22:46 +11:00
Alex
ea38eec2af fix: lint 2023-02-09 13:25:39 +01:00
Alex
286a3c70f4 Merge pull request #1978 from kpanuragh/master 2023-02-09 13:25:15 +01:00
Alex
9049de583e Merge pull request #1996 from Kuruyia/feat/brightness-control
Closes https://github.com/Alexays/Waybar/issues/1411
2023-02-09 13:24:35 +01:00
Alex
a6eaaad97f Merge pull request #1998 from LukashonakV/Clock_revision 2023-02-09 09:32:57 +01:00
Alex
d25930793c Merge pull request #2004 from bwaite/fix-memory-leak-upower 2023-02-08 09:02:06 +01:00
Bryan Waite
67ab269706 Fixing memory leak on update UPower tooltip 2023-02-08 17:19:51 +11:00
Alex
48312f4c91 Merge pull request #2001 from LukashonakV/ISSUE#1988 2023-02-04 23:30:12 +01:00
Viktar Lukashonak
677cbb3384 When no one timezone is provided use system's TZ
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2023-02-04 23:48:25 +03:00
Kuruyia
973aa09f8b refactor(backlight): fix linter 2023-02-03 18:18:44 +01:00
Kuruyia
e8c4b85328 feat(backlight): use dbus to set the brightness 2023-02-03 12:58:52 +01:00
Viktar Lukashonak
b5ad77ea8c Avoid of unnecessary string transformation
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2023-02-02 13:26:05 +03:00
Anuragh K P
74a8464c09 updating man page 2023-02-01 21:22:10 +05:30
Kuruyia
a78f0124d2 feat(backlight): add brightness control 2023-02-01 14:46:55 +01:00
Alex
8da5425189 Merge pull request #1994 from smoak/fix_wireplumber_invalid_pointer 2023-02-01 08:25:05 +01:00
Sasha Moak
a9c9f1d705 fix(wireplumber): free(): invalid pointer
When freeing the `default_node_name_` pointer using `free`, the `&`
operator was used to try to free the reference rather than the pointer.
This caused a core dump. In order to fix this, the pointer is freed
instead (ie the `&` operator is no longer used).
2023-01-31 17:56:58 -08:00
Alexander Courtis
301b106c48 add river/layout clang-format 2023-01-31 16:41:36 +11:00
Alexander Courtis
757a450324 add river/layout 2023-01-31 16:34:38 +11:00
Anuragh K P
7b3a6fbaa7 created local variable for _output 2023-01-30 18:35:06 +05:30
Alex
c93811b158 Merge pull request #1987 from adamant-pwn/patch-2 2023-01-30 08:57:28 +01:00
Anuragh K P
7554d7f071 Fixing build issue in image module 2023-01-29 19:13:01 +05:30
Oleksandr Kulkov
220b859948 Fix kbName initialization
Second argument of substr is the length of the substring, _not_ the position. With positions, it's better to do like this.

Example:
```sh
[2023-01-29 13:08:00.927] [debug] hyprland IPC received activelayout>>ITE Tech. Inc. ITE Device(8910) Keyboard,Russian (with Ukrainian-Belorussian layout)
[2023-01-29 13:08:00.927] [debug] kbName is ITE Tech. Inc. ITE Device(8910) Keyboard,Russian (with
```

After the fix it's correct:
```sh
[2023-01-29 13:11:11.408] [debug] hyprland IPC received activelayout>>ITE Tech. Inc. ITE Device(8910) Keyboard,Russian (with Ukrainian-Belorussian layout)
[2023-01-29 13:11:11.408] [debug] kbName is ITE Tech. Inc. ITE Device(8910) Keyboard
```
2023-01-29 13:14:05 +01:00
Anuragh K P
012baadaca added exec condition check on image module 2023-01-29 10:41:24 +05:30
Alex
0ecfce9c61 Merge pull request #1975 from bd-g/fix-image 2023-01-27 14:38:26 +01:00
Alex
d2116acb62 Merge pull request #1982 from LukashonakV/ClockSimplify 2023-01-27 14:33:28 +01:00
Viktar Lukashonak
5d8f9a8273 Clock. Formating simplify
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2023-01-27 15:57:18 +03:00
Anuragh K P
9068b7548f for image module get path from executable file 2023-01-25 22:29:33 +05:30
Anuragh K P
1495b957f1 for image module get path from executable file 2023-01-25 22:28:07 +05:30
Alex
47cdd6f988 Merge pull request #1976 from LukashonakV/ClockAltMode 2023-01-25 15:10:08 +01:00
Viktar Lukashonak
f3f0b008c6 Clock. Proper handletoggle propagation
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2023-01-25 16:56:45 +03:00
Brent George
c1ceb7ac42 fix linting issues 2023-01-24 14:53:49 -05:00
Brent George
e128c48573 image module CSS fix 2023-01-24 14:34:02 -05:00
Alex
dd9e3d0172 Merge pull request #1871 from Narice/feat/nix-flake-support 2023-01-24 09:34:03 +01:00
Alex
a9613892bb Rename .envrc to .envrc.sample 2023-01-24 09:33:38 +01:00
Alex
e7af29ac1e Merge pull request #1971 from LukashonakV/YearCalendar 2023-01-23 17:07:21 +01:00
Viktar Lukashonak
3b28af8b51 Merge remote-tracking branch 'origin/master' into YearCalendar
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2023-01-23 18:49:45 +03:00
Viktar Lukashonak
ed31b20c26 Merge branch 'master' into YearCalendar
Signed-off-by: Viktar Lukashonak <myxabeer@gmail.com>
2023-01-23 18:42:32 +03:00
Alex
fea7ec9133 Merge pull request #1941 from eneshecan/master
Fixes https://github.com/Alexays/Waybar/issues/1940
2023-01-23 10:24:44 +01:00
Enes Hecan
3c8ca009ff Sanitize hyprland language string only instead of the whole format. Fixes #1940 2023-01-23 09:50:40 +01:00
Alex
f4cfafd238 fix: lint 2023-01-23 09:25:02 +01:00
Alex
5182fadede Merge pull request #1944 from PolpOnline/master 2023-01-23 09:22:27 +01:00
Alex
18e0e0c7c1 Merge pull request #1964 from tactikauan/master 2023-01-23 09:20:46 +01:00
Alex
69b95e6d71 Merge pull request #1959 from alebastr/gcc-13 2023-01-23 09:18:13 +01:00
Alex
5e2895ccb3 Merge pull request #1966 from asas1asas200/zeng-doc-image 2023-01-22 13:39:39 +01:00
asas1asas200
0ca1c3957a docs(image): add image doc in meson and fix title 2023-01-22 20:16:46 +08:00
Kauan Decarli
de77787b60 Allow any module to implement signal handling 2023-01-21 21:57:28 -03:00
Aleksei Bavshin
51b6c22cab ci: add glibc locales for date formatting tests.
Add some missing dependencies for Fedora.
2023-01-21 02:18:46 -08:00
Aleksei Bavshin
01cee153a4 ci: try to build with cpp_std=c++20
Add an extra job to build with `-std=c++20` on Fedora.
Update actions/checkout to v3.
2023-01-21 02:18:45 -08:00
Aleksei Bavshin
93e340a081 feat(clock): support chrono Time Zone extensions.
Use chrono Calendars and Time Zones (P0355R7, P1466R3) when available
instead of the `date` library.
Verified with a patched build of a recent GCC 13 snapshot.
2023-01-21 02:18:44 -08:00
Aleksei Bavshin
6225db0a48 test: refactor date formatter tests.
- Add tests for global locale.
- Warn about missing locales.
- Downgrade REQUIRE to CHECK.
- Skip tests if localized formatting does not work as expected.
2023-01-21 02:18:43 -08:00
Aleksei Bavshin
ea17a66dfc fix: compilation errors with cpp_std=c++20
There were two main issues with fmtlib and C++20 mode:

 - `fmt::format` defaults to compile-time argument checking and requires
   using `fmt::runtime(format_string)` to bypass that.
 - `std::format` implementation introduces conflicting declarations and
   we have to specify the namespace for all `format`/`format_to` calls.
2023-01-20 22:50:02 -08:00
Aleksei Bavshin
67efe1af89 refactor(clock): remove struct waybar_time
The structure was used to pass the locale instance to the date
formatter. All the supported versions of `fmt` are passing the locale
parameter via `FormatContext.locale()` so we can remove the struct and
simplify the code.

While we at it, drop `date::make_zoned` in favor of CTAD on a
`date::zoned_time` constructor.
2023-01-20 22:50:01 -08:00
Aleksei Bavshin
ba498869c5 fix(clock): delete outdated warning 2023-01-20 22:50:00 -08:00
Aleksei Bavshin
43d52c59d9 test: fix build with Catch2 v2.x
Use smaller includes for Catch2 v3.
2023-01-20 22:49:59 -08:00
Aleksei Bavshin
ca9d237b00 fix(sway): add missing includes for GCC 13
See also: https://gcc.gnu.org/gcc-13/porting_to.html
2023-01-20 22:49:58 -08:00
Alex
bc07a82579 Merge pull request #1962 from maximbaz/hyprland-submap-init 2023-01-20 23:46:08 +01:00
Maxim Baz
6e9f21fc6b hyprland/submap: run initial render on startup 2023-01-20 23:40:08 +01:00
Alex
eb9d2d9c5d Merge pull request #1935 from multun/master 2023-01-17 09:40:45 +01:00
Alex
be3df41ae0 Merge pull request #1942 from smoak/fix-wireplumber-crashes
Fixes https://github.com/Alexays/Waybar/issues/1907
2023-01-17 09:36:05 +01:00
Sasha Moak
4e8ccf36b5 fix(wireplumber): waybar crashes when default node changes
In order to fix the issue, the default node name is cached rather than
the default node id. This is due to ids being unstable. So now when the
object manager is installed (ie ready), the default node name is
retrieved and stored for later.

Now when the mixer changed signal is emitted, the id of the changed node
is used to get the node from the object manager. The nodes name is
grabbed off that node and compared against the default node name, if
they match the volume is updated. Some safeguarding has been added such
that if the node cannot be found off the object manager, it's ignored.

Additionally, the "changed" signal on the default nodes api is now
utilized to update the default node name if it has changed. This way if
the default node changes, the module will be updated with the correct
volume and node.nick.

This adds additional debug logging for helping diagnose wireplumber
issues.

This also adds the wireplumber man page entry to the main waybar
supported section.
2023-01-16 10:29:35 -08:00
shironeko
5649c3f552 river/tags: refactor to support special purpose tags
adds the set-tags and toggle-tags setting so it's possible to have
different tags set vs toggled. This enables the use of e.g. sticky tags

Also clean-up the code a bit.
2023-01-15 12:16:30 -05:00
PolpOnline
a4b1b0a211 modules/custom: Added percentage rounding 2023-01-13 22:39:59 +01:00
Alex
6c8e186586 Merge pull request #1939 from RobertMueller2/master 2023-01-13 15:31:50 +01:00
Rene D. Obermueller
544c6deb88 sway/window: fix manpage 2023-01-13 15:08:59 +01:00
Alex
e59b4e4c93 Merge pull request #1419 from RobertMueller2/sway-window-newstyles 2023-01-13 13:58:43 +01:00
Alex
d71a4569fe Merge pull request #1937 from cyrinux/fix/battery-time-remaining
fix https://github.com/Alexays/Waybar/pull/1867#pullrequestreview-1246756355
2023-01-13 09:51:40 +01:00
Cyril LEVIS
120cba0f5e fix: battery time remaining
time is reported in second and should be divided by 3600 and not 1000.
2023-01-13 09:44:39 +01:00
Rene D. Obermueller
328573332f sway-window, Issue 1399: new style classes
Provides CSS classes empty, floating, tabbed, tiled, solo, stacked and
app_id.

Adds offscreen-css bool option (default false), only effective when
"all-outputs" is true. This adds styles on outputs without focused
node, according to its focused workspaces window situation.

Adds an "offscreen-css-text" string option (default empty), only
effective when "all-outputs" and "offscreen-style" are set. This
is shown as a text on outputs without a focused node.

Adds a "show-focused-workspace" bool option (default false) to indicate
the workspace name if the whole workspace is focused when nodes are
also present. If not set, empty text is shown, but css classes
according to nodes in the workspace are still applied.

Limitation:
When the top level layout changes, there is no sway event so the
module cannot react. Perhaps in the future recurring polling can
be added to go around this limitation.
2023-01-12 05:53:59 +01:00
Victor "multun" Collod
df0fdce92b get_desktop_app_info: fix crash on failed DesktopAppInfo::create
Even though it makes little sense for this call to fail,
it sometimes randomly does, and takes down waybar with it.
2023-01-11 23:02:12 +01:00
Alex
f0bead34d4 chore: 0.9.17 2023-01-11 11:39:30 +01:00
Alex
d6bd440027 fix: lint 2023-01-09 15:48:31 +01:00
Alex
c692d7bf64 Merge pull request #1929 from julianschuler/monitor-reconnect-fix
Fixes https://github.com/Alexays/Waybar/issues/1783
2023-01-08 19:56:27 +01:00
Julian Schuler
2045aac5b0 Fix crash upon reconnecting monitor 2023-01-08 18:49:24 +01:00
Alex
a92223c316 Merge pull request #1926 from robertgzr/mpris-module 2023-01-07 09:23:25 +01:00
Robert Günzler
24d03d13ce mpris: fix build errors
to address https://github.com/Alexays/Waybar/pull/1520#issuecomment-1374229080

Signed-off-by: Robert Günzler <r@gnzler.io>
2023-01-07 01:44:25 +01:00
Robert Günzler
b3b5d8f9ab Activate ci for mpris module
Signed-off-by: Robert Günzler <r@gnzler.io>
2023-01-07 01:44:25 +01:00
Alex
86850f5c7a Merge pull request #1520 from robertgzr/mpris-module 2023-01-06 22:35:24 +01:00
Robert Günzler
0bc5314e08 Add mpris module
Uses libplayerctl to use the MPRIS dbus protocol to query, listen and
control media players.

Signed-off-by: Robert Günzler <r@gnzler.io>
2023-01-06 20:55:31 +01:00
Alex
1d6cfe7ce6 Merge pull request #1921 from Jonher937/cpu-load-pushed-back-twice 2023-01-05 08:52:22 +01:00
Jonathan Herlin
2a3ebc12de fix: cpu_load pushed twice to the vector 2023-01-05 01:10:04 +01:00
Alex
1938bb5d28 fix: lint 2023-01-04 16:26:50 +01:00
Alex
a35861b3b9 Merge pull request #1918 from ldelossa/sway-workspaces-alpha-sort 2023-01-03 11:52:39 +01:00
Louis DeLosSantos
8b512e7b22 sway,feat: allow alphabetical sort
for users who do not utilize any form of "workspace prev/next" commands,
it can be very handle to sort the workspaces alphabetically.

this commit adds a new "alphabetical_sort" to the `sway/workspaces`
module which allows the module to alway sort workspaces alphabetically.

this docs are updated to warn the user of the implications involved.

Signed-off-by: Louis DeLosSantos <louis.delos@gmail.com>
2023-01-02 17:03:28 -05:00
Alex
fb083f93dc Merge pull request #1911 from cdump/master 2022-12-31 13:35:46 +01:00
Maxim Andreev
f795e7a308 modules/clock: improve ux when calendar_shift is used:
1. change only date, but not time
  2. use shifted values only in tooltip
  3. reset shift when mouse leaves (popup closes)
2022-12-28 10:13:10 +03:00
Alex
21abd4f9f9 Merge pull request #1910 from eneshecan/master 2022-12-27 15:44:42 +01:00
Enes Hecan
f724cc3f9d Fix wrong layout name in hyprland language module when a variant is used 2022-12-27 15:29:10 +01:00
Alex
bfbb2f9a40 Merge pull request #1906 from Arisa-Snowbell/gitignore 2022-12-26 09:33:55 +01:00
Arisa Snowbell
91357f210d Ignore .cache generated by clangd 2022-12-26 06:39:15 +01:00
Alex
3e48551f25 Merge pull request #1897 from eneshecan/master 2022-12-21 09:43:08 +01:00
Enes Hecan
c05f41d732 Make linter happy 2022-12-21 01:55:39 +01:00
Enes Hecan
4d59de42af Implement hyprland submap module 2022-12-21 01:45:57 +01:00
Enes Hecan
6e296838e4 Update hyprland language module docs 2022-12-21 00:20:16 +01:00
Alex
e00e36981e Merge pull request #1890 from eneshecan/master 2022-12-16 10:37:54 +01:00
Enes Hecan
4136ffaecb Minor refactorings and formatting fixes for hyprland language module 2022-12-16 10:01:58 +01:00
Alex
bd199e414b Merge pull request #1888 from eneshecan/master
Fixes undefined
2022-12-16 09:20:49 +01:00
Enes Hecan
531bdfb8bb Fix hyprland language initialization issues 2022-12-15 01:48:14 +01:00
Alex
c1ea7626b9 Merge pull request #1887 from LukashonakV/ISSUE#1874 2022-12-14 16:08:36 +01:00
Viktar Lukashonak
995802e8ae ISSUE#1874 - happy linter 2022-12-14 16:49:03 +03:00
Viktar Lukashonak
0079092699 ISSUE#1874
1. Calendar. Weeks. Fix right paddings when first days of the week is
Monday
2. Fix small perfomrance penalty(avoid of defining parameter in the
month loop)
3. Small name convention for format string variables
2022-12-14 16:43:23 +03:00
Alex
b5c686c0dd Merge pull request #1882 from LukashonakV/ISSUE#1877 2022-12-12 09:18:10 +01:00
Viktar Lukashonak
4c4d09992e Regular expression improved 2022-12-10 18:36:58 +03:00
Viktar Lukashonak
9218968d2f Wrong assigning 2022-12-10 17:55:21 +03:00
Viktar Lukashonak
a08967e008 Happy linter 2022-12-10 16:54:26 +03:00
Viktar Lukashonak
272c638f7e Happy linter 2022-12-10 16:48:22 +03:00
Viktar Lukashonak
57ad7f9536 ISSUE#1877 Calendar week numbers
1. Let's do code simplier
2. Week format using regexp. Needs when user provide additional
characters in format string and need to align week days according
3. Week format has got default formats: ":%U",":%V"
4. Week number is based on the first day of the week now. The output is
the same as of date library now.
5. Avoiding of unnecessary operations
2022-12-10 14:02:15 +03:00
Alex
2a76d8e5b9 Merge pull request #1862 from alebastr/battery-ignore-scope-device 2022-12-07 15:01:26 +01:00
Kim Brose
1130e8c8ec Add output parameter format to manpage 2022-12-06 19:05:08 +01:00
Narice
d5a86526bc dev: Added Nix Flake support
- Enables Nix users to get the git version of waybar
- Enables Nix users to develop waybar easily
- Adds a fully reproducible development environment
  - The user only has to install Nix, no other depencencies
  - Automatic dev env on directory entry through .envrc
2022-12-06 18:44:26 +01:00
Alex
c5babb4c44 Merge pull request #1868 from prohornikitin/calendar-week-numbers
Fix https://github.com/Alexays/Waybar/issues/1802
2022-12-06 09:01:18 +01:00
Prokhor40
328575a721 fix: calendar week numbers
fix their format to correct

fix last number hide if the last day of the month is the last day of the week

some refactoring(mostly renaming abbreviations to the full phrases)
2022-12-06 03:47:28 +03:00
Alex
ea9078d887 Merge pull request #1867 from cyrinux/feat/macsmc-battery-support 2022-12-05 22:30:47 +01:00
Cyril Levis
b1833b1f36 feat: add macsmc-battery time remaining support for asahi
use time_to_empty_now and time_to_full_now
2022-12-05 22:09:05 +01:00
Alex
53e89dace7 Merge pull request #1865 from Dordovel/master
Fix https://github.com/Alexays/Waybar/pull/1854#issue-1469577538
2022-12-05 09:01:45 +01:00
Dordovel
3cbcef61cf fix AIconLabel spacing between image and label 2022-12-05 10:02:38 +03:00
Aleksei Bavshin
22084691ff fix(battery): ignore non-system power supplies
Linux power_supply sysfs interface allows checking if the battery powers
the whole system or a specific device/tree of devices with `scope`
attribute[1]. We can use it to skip the non-system power supplies in the
battery module and avoid adding HIDs or other peripheral devices to the
total.

The logic is based on UPower, where it is assumed that "Unknown" devices
or devices without a `scope` are system power supplies.

[1]: https://lore.kernel.org/lkml/alpine.LNX.2.00.1201031556460.24984@pobox.suse.cz/T/
2022-12-04 00:14:42 -08:00
Alex
f4afa59861 Merge pull request #1860 from prohornikitin/hide-module-if-empty 2022-12-03 15:32:12 +01:00
Prokhor40
ce8c13788a fix formatting issues 2022-12-02 19:32:03 +03:00
Prokhor40
b74f3c7aaa hide mdp/pulseaudio/sndio if text 'resolves' to be empty. 2022-12-02 18:15:51 +03:00
Soc Virnyl S. Estela
55d7868f86 fix(2): use getaddrinfo() instead of gethostbyname() 2022-12-02 22:18:32 +08:00
Soc Virnyl S. Estela
0540977e45 format: remove some newlines 2022-12-02 21:42:58 +08:00
Soc Virnyl S. Estela
385726e701 fix: use getaddrinfo() instead of gethostbyname() 2022-12-02 21:36:14 +08:00
Alex
2111865efe refactor: remove warning 2022-12-01 08:45:12 +01:00
Alex
94d6ae9741 Merge pull request #1845 from adamant-pwn/patch-1 2022-11-29 10:47:20 +01:00
Alex
e6760bf9dd Merge pull request #1846 from Dordovel/master 2022-11-29 08:46:06 +01:00
Dordovel
7671ccfbc6 added file existence check 2022-11-29 09:00:12 +03:00
Oleksandr Kulkov
459541ed89 Don't search "Keyboard at" from hyprland/language
The current output form of `hyprctl devices` is like this:
```
        Keyboard at 6f80ad70:
                ITE Tech. Inc. ITE Device(8910) Keyboard
                        rules: r "", m "", l "us,ru", v "", o "grp:alt_shift_toggle"
                        active keymap: Russian
                        main: no
```

That is, `Keyboard at` goes _before_ the keyboard name, so looking for `Keyboard at` only makes it skip to the keyboard _after_ the one that the user specified.
2022-11-29 01:11:25 +01:00
Alex
da3d9533d1 Merge pull request #1841 from encbar5/inverted-date-scroll 2022-11-28 07:43:48 +01:00
encbar5
8db1996ccc Allow calendar_shift_init_ to be negative 2022-11-27 21:24:56 -06:00
Alex
cfef78a5bc Merge pull request #1837 from smoak/smoak/fix-wireplumber-bluetooth 2022-11-26 20:45:29 +01:00
Sasha Moak
60fa5e9f67 fix: wireplumber module when used with a bluetooth device
This fixes #1811 by falling back to `node.description` if `node.nick` is
not available. This can happen for bluetooth devices that do not have a
`node.nick`.
2022-11-26 11:35:45 -08:00
Alex
cea59ddc6c Merge pull request #1836 from smoak/smoak/wireplumber-icon-support 2022-11-26 20:23:17 +01:00
Sasha Moak
3730793197 feat: add icon support to the wireplumber module
Adds basic icon support for the wireplumber module.

This can be achieved by using `{icon}` in the `format` config and
pairing it with the `format-icons` config as well.

Example:

```
"wireplumber": {
    "format": "{volume}% {icon}",
    "format-icons": ["", "", ""]
}
```
2022-11-26 10:02:16 -08:00
Alex
d2b4076ac8 Merge pull request #1799 from Keloran/upower-click 2022-11-25 09:04:31 +01:00
Alex
e63e3a0ca9 Update upower.cpp 2022-11-25 09:03:27 +01:00
Alex
99d370d9ed Update README.md 2022-11-24 20:51:54 +01:00
Alex
80b2b29a77 Merge pull request #1397 from JakeStanger/feat/image-module
Resolves https://github.com/Alexays/Waybar/issues/1191
2022-11-24 20:40:56 +01:00
Alex
27ad9ec267 Update README.md 2022-11-24 20:37:30 +01:00
Alex
9eb6c4e296 chore: v0.9.16 2022-11-24 20:34:12 +01:00
Alex
748c6125d0 Merge pull request #1810 from pinselimo/revert-1120 2022-11-24 15:20:29 +01:00
Simon Plakolb
235861fd3d button: Remove AButton class 2022-11-24 13:08:16 +01:00
Simon Plakolb
5e9bbe5c76 modules: Revert button to label 2022-11-24 13:08:16 +01:00
Alex
74fa131ebe Merge pull request #1809 from herlev/hyprland-named-workspace-crash 2022-11-24 07:46:17 +01:00
herlev
2c7cb0e9d4 Fix crashes when using named workspaces in Hyprland
The first crash occurs when trying to parse the
ID of a workspace as an uint, since named
workspaces has negative IDs. This is fixed by
using ints for workspace IDs instead of uints.

The second crash occurs when converting a
workspace name that isn't a number to an integer.
This is fixed by wrapping std::stoi in a try
block and only sorting by number, when both names
can successfully be converted to integers.
2022-11-24 02:16:44 +01:00
Alex
ce8ae5bf17 Merge pull request #1748 from lilydjwg/fix-zombies
fixes https://github.com/Alexays/Waybar/issues/1713
2022-11-23 21:31:47 +01:00
Alex
062e7bb9b4 Merge pull request #1797 from smoak/wireplumber-support 2022-11-22 12:44:39 +01:00
Keloran
3acd31c3e9 syntax issue 2022-11-21 09:48:41 +00:00
Keloran
456e06c4b5 exact opposite, lol 2022-11-21 09:46:57 +00:00
Keloran
a2751cfcd6 alt text readded 2022-11-18 14:25:16 +00:00
Keloran
d9cc995405 added onclick to upower 2022-11-18 13:10:04 +00:00
Keloran
00a2ebf00d added onclick to upower 2022-11-18 13:09:38 +00:00
Sasha Moak
c2f98d07ef feat: wireplumber support
Adds basic support for showing volume via wireplumber. Allows specifying
the node-id or falling back to the default Audio/Sink node id if node-id
is not set. If tooltip on hover is enabled, will show `{node_name}` by
default otherwise `tooltip-format`.

Format replacements:

`{volume}` - Volume in percentage
`{node_name}` - The node's nickname (`node.nick` property)
2022-11-16 23:23:07 -08:00
Alex
833dcc1bb8 Merge pull request #1795 from schmidma/bluez-output-detection 2022-11-16 19:07:46 +01:00
Maximilian Schmidt
8c24e26f0e Recognize outputs with 'bluez' in monitor name as bluetooth class 2022-11-16 19:01:12 +01:00
Alex
56b4a11a9c Merge pull request #1793 from Dordovel/master 2022-11-16 07:41:29 +01:00
Dordovel
1111763251 added path settings 2022-11-16 08:04:18 +03:00
Dordovel
769858fbb4 fix call parent event handle, added commang to open user folder 2022-11-15 16:15:26 +03:00
Alex
2695815bcc Merge pull request #1787 from Dordovel/master 2022-11-15 08:41:12 +01:00
Dordovel
49afb87e34 Merge branch 'Alexays:master' into master 2022-11-13 16:17:04 +03:00
Alex
5250123dcb Merge pull request #1788 from grfrederic/normalize-battery-capacity 2022-11-12 23:41:00 +01:00
Frederic Grabowski
c0b3e9ee35 normalize capacity by number of batteries 2022-11-12 22:39:53 +01:00
Dordovel
454ba610f4 clicking on the user label opens the default file manager 2022-11-11 15:15:12 +03:00
Alex
3718902b9d Merge pull request #1785 from ElJeffe/hyprland_monitor_remove 2022-11-10 09:21:52 +01:00
Jef Steelant
9f0a14c22b make linter happy 2022-11-10 09:19:49 +01:00
Alex
781da93f3d Merge pull request #1780 from ElJeffe/hyprland_monitor_remove 2022-11-09 23:09:30 +01:00
Jef Steelant
8f4f67f69f Do not crash when a monitor is removed 2022-11-09 09:34:19 +01:00
Alex
8be5bab8ad Merge pull request #1734 from baltitenger/backlight-hide-when-powered-off
closes https://github.com/Alexays/Waybar/issues/393
2022-11-07 14:09:54 +01:00
Baltazár Radics
d02e23c759 feat(backlight): hide if the display is powered off 2022-11-07 13:57:21 +01:00
Alex
d2b22c6ec5 fix: lint 2022-11-07 09:23:47 +01:00
Alex
ed898cd211 Merge pull request #1773 from kj/backlight-format-states 2022-11-07 09:23:17 +01:00
Alex
1a1c617520 Merge pull request #1772 from kj/fix-states-documentation 2022-11-07 09:13:41 +01:00
Kelsey Judson
253222d31c Make backlight module respect format-<state> config 2022-11-07 21:06:16 +13:00
Kelsey Judson
51e6fc6250 Fix states documentation 2022-11-07 20:30:01 +13:00
Alex
af1668dfd0 Merge pull request #1770 from Scrumplex/fix-mpd-double-encode 2022-11-06 09:52:31 +01:00
Sefa Eyeoglu
cf5877073a fix: don't escape mpd label twice
Signed-off-by: Sefa Eyeoglu <contact@scrumplex.net>
2022-11-05 20:23:00 +01:00
Alex
bd567800c9 Merge pull request #1769 from ericliou/master 2022-11-04 22:01:36 +01:00
Eric L
6477e539d0 Battery: Plugged status has higher priority 2022-11-04 20:01:53 +00:00
Alex
242e19a07d Merge pull request #1767 from b1rger/fix-typos 2022-11-04 15:07:31 +01:00
Birger Schacht
0e53c37d6b Fix typos in manual pages 2022-11-04 15:03:10 +01:00
Alex
3030850b22 refactor: inherit disabled button 2022-11-04 08:39:59 +01:00
Alex
92cc01f401 fix: label default style 2022-11-03 15:53:45 +01:00
Alex
d48eebd4d3 fix: use GTK_STYLE_PROVIDER_PRIORITY_APPLICATION 2022-11-03 14:10:18 +01:00
Alex
eb705533b5 feat: jsoncpp wrap 2022-11-03 14:08:22 +01:00
Alex
3cf027fc56 fix: button default style 2022-11-03 14:04:29 +01:00
Alex
09120caf17 Merge pull request #1762 from jpalus/jsoncpp-version 2022-11-03 11:02:19 +01:00
Jan Palus
73495df377 build: require jsoncpp >= 1.9.2
with #1719 Waybar started using Json::Value.as() available since jsoncpp
1.9.2.
2022-11-03 10:59:03 +01:00
lilydjwg
31137c30fb fix custom module leaves zombie processes behind when bars are removed
fixes #1713.
2022-10-27 18:12:14 +08:00
Bao Trinh
f5a24d12e5 group module: configurable orientation
currently, the orientation of group modules is always the opposite of
the bar. Change it so that:

* the default orientation of the group module is always the opposite of
  its parent, even for nested groups
* the orientation can be overridden in the config
* css ID and class are set for the group element
2022-09-03 18:37:35 -05:00
Jake Stanger
41dea6e46c Merge branch 'master' into feat/image-module 2022-02-22 23:40:59 +00:00
Jake Stanger
a650c7d90c feat: image module
Module which renders an image onto the bar.
2022-01-16 23:55:13 +00:00
271 changed files with 12937 additions and 4143 deletions

29
.clang-tidy Normal file
View File

@@ -0,0 +1,29 @@
Checks: >
-*,
bugprone-*
misc-*,
modernize-*,
performance-*,
portability-*,
readability-*,
-fuchsia-trailing-return,
-readability-magic-numbers,
-modernize-use-nodiscard,
-modernize-use-trailing-return-type,
-readability-braces-around-statements,
-readability-redundant-access-specifiers,
-readability-redundant-member-init,
-readability-redundant-string-init,
-readability-identifier-length
CheckOptions:
- { key: readability-identifier-naming.NamespaceCase, value: lower_case }
- { key: readability-identifier-naming.ClassCase, value: CamelCase }
- { key: readability-identifier-naming.StructCase, value: CamelCase }
- { key: readability-identifier-naming.FunctionCase, value: camelBack }
- { key: readability-identifier-naming.VariableCase, value: camelBack }
- { key: readability-identifier-naming.PrivateMemberCase, value: camelBack }
- { key: readability-identifier-naming.PrivateMemberPrefix, value: m_ }
- { key: readability-identifier-naming.EnumCase, value: CamelCase }
- { key: readability-identifier-naming.EnumConstantCase, value: UPPER_CASE }
- { key: readability-identifier-naming.GlobalConstantCase, value: UPPER_CASE }
- { key: readability-identifier-naming.StaticConstantCase, value: UPPER_CASE }

1
.envrc Normal file
View File

@@ -0,0 +1 @@
use flake

15
.github/workflows/clang-format.yml vendored Normal file
View File

@@ -0,0 +1,15 @@
name: clang-format
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: DoozyX/clang-format-lint-action@v0.16.2
name: clang-format
with:
source: '.'
extensions: 'hpp,h,cpp,c'
clangFormatVersion: 16

31
.github/workflows/clang-tidy.yml vendored Normal file
View File

@@ -0,0 +1,31 @@
name: clang-tidy
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
container:
image: alexays/waybar:debian
steps:
- uses: actions/checkout@v3
- name: configure
run: |
meson -Dcpp_std=c++20 build # necessary to generate compile_commands.json
ninja -C build # necessary to find certain .h files (xdg, wayland, etc.)
- uses: cpp-linter/cpp-linter-action@v2.7.5
name: clang-tidy
id: clang-tidy-check
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PIP_NO_CACHE_DIR: false
with:
style: "" # empty string => don't do clang-format checks here, we do them in clang-format.yml
files-changed-only: true # only check files that have changed
lines-changed-only: true # only check lines that have changed
tidy-checks: "" # empty string => use the .clang-tidy file
version: "17" # clang-tools version
database: "build" # path to the compile_commands.json file
- name: Check if clang-tidy failed on any files
if: steps.clang-tidy-check.outputs.checks-failed > 0
run: echo "Some files failed the linting checks!" && exit 1

View File

@@ -1,6 +1,6 @@
name: freebsd
on: [ push, pull_request ]
on: [push, pull_request]
jobs:
clang:
@@ -9,21 +9,21 @@ jobs:
# 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
- uses: actions/checkout@v3
- name: Test in FreeBSD VM
uses: cross-platform-actions/action@v0.21.1
timeout-minutes: 180
with:
operating_system: freebsd
version: "13.2"
environment_variables: CPPFLAGS=-isystem/usr/local/include LDFLAGS=-L/usr/local/lib
run: |
sudo sed -i '' 's/quarterly/latest/' /etc/pkg/FreeBSD.conf
sudo pkg install -y git # subprojects/date
sudo 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
meson build -Dman-pages=enabled
ninja -C build
meson test -C build --no-rebuild --print-errorlogs --suite waybar

View File

@@ -1,14 +0,0 @@
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

View File

@@ -13,16 +13,20 @@ jobs:
- fedora
- opensuse
- gentoo
cpp_std: [c++20]
include:
- distro: fedora
cpp_std: c++20
runs-on: ubuntu-latest
container:
image: alexays/waybar:${{ matrix.distro }}
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: configure
run: meson -Dman-pages=enabled build
run: meson -Dman-pages=enabled -Dcpp_std=${{matrix.cpp_std}} build
- name: build
run: ninja -C build
- name: test
run: meson test -C build --no-rebuild --print-errorlogs --suite waybar
run: make test

7
.gitignore vendored
View File

@@ -2,6 +2,8 @@
*~
vgcore.*
/.vscode
/.idea
/.cache
*.swp
packagecache
/subprojects/**/
@@ -41,3 +43,8 @@ packagecache
*.exe
*.out
*.app
/.direnv/
# Nix
result
result-*

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 sndio-dev scdoc libxkbcommon tzdata
RUN apk add --no-cache git meson alpine-sdk libinput-dev wayland-dev wayland-protocols mesa-dev libxkbcommon-dev eudev-dev pixman-dev gtkmm3-dev jsoncpp-dev pugixml-dev libnl3-dev pulseaudio-dev libmpdclient-dev sndio-dev scdoc libxkbcommon tzdata playerctl-dev

View File

@@ -3,4 +3,5 @@
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 libxkbcommon
pacman -S --noconfirm git meson base-devel libinput wayland wayland-protocols pixman libxkbcommon mesa gtkmm3 jsoncpp pugixml scdoc libpulse libdbusmenu-gtk3 libmpdclient gobject-introspection libxkbcommon playerctl iniparser fftw && \
sed -Ei 's/#(en_(US|GB)\.UTF)/\1/' /etc/locale.gen && locale-gen

View File

@@ -2,6 +2,12 @@
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 libxkbcommon-dev libxkbregistry-dev libxkbregistry0 && \
apt-get clean
RUN apt update && \
apt install -y \
build-essential meson ninja-build git pkg-config libinput10 libpugixml-dev libinput-dev \
wayland-protocols libwayland-client0 libwayland-cursor0 libwayland-dev \
libegl1-mesa-dev libgles2-mesa-dev libgbm-dev libxkbcommon-dev libudev-dev libpixman-1-dev \
libgtkmm-3.0-dev libjsoncpp-dev scdoc libdbusmenu-gtk3-dev libnl-3-dev libnl-genl-3-dev \
libpulse-dev libmpdclient-dev gobject-introspection libgirepository1.0-dev libxkbcommon-dev \
libxkbregistry-dev libxkbregistry0 libplayerctl-dev sudo python3-venv python3-pip && \
apt clean

View File

@@ -2,11 +2,33 @@
FROM fedora:latest
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)' && \
RUN dnf install -y @c-development \
git-core glibc-langpack-en meson scdoc \
'pkgconfig(catch2)' \
'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(jack)' \
'pkgconfig(jsoncpp)' \
'pkgconfig(libevdev)' \
'pkgconfig(libinput)' \
'pkgconfig(libmpdclient)' \
'pkgconfig(libnl-3.0)' \
'pkgconfig(libnl-genl-3.0)' \
'pkgconfig(libpulse)' \
'pkgconfig(libudev)' \
'pkgconfig(playerctl)' \
'pkgconfig(pugixml)' \
'pkgconfig(sigc++-2.0)' \
'pkgconfig(spdlog)' \
'pkgconfig(upower-glib)' \
'pkgconfig(wayland-client)' \
'pkgconfig(wayland-cursor)' \
'pkgconfig(wayland-protocols)' \
'pkgconfig(wireplumber-0.4)' \
'pkgconfig(xkbregistry)' && \
dnf clean all -y

View File

@@ -6,6 +6,6 @@ RUN export FEATURES="-ipc-sandbox -network-sandbox -pid-sandbox -sandbox -usersa
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 \
USE="wayland gtk3 gtk -doc X pulseaudio minimal" emerge dev-vcs/git dev-libs/wayland dev-libs/wayland-protocols =dev-cpp/gtkmm-3.24.6 x11-libs/libxkbcommon \
x11-libs/gtk+:3 dev-libs/libdbusmenu dev-libs/libnl sys-power/upower media-libs/libpulse dev-libs/libevdev media-libs/libmpdclient \
media-sound/sndio gui-libs/gtk-layer-shell app-text/scdoc
media-sound/sndio gui-libs/gtk-layer-shell app-text/scdoc media-sound/playerctl dev-libs/iniparser sci-libs/fftw

View File

@@ -6,4 +6,4 @@ RUN zypper -n up && \
zypper addrepo https://download.opensuse.org/repositories/X11:Wayland/openSUSE_Tumbleweed/X11:Wayland.repo | echo 'a' && \
zypper -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 libxkbregistry-devel scdoc
zypper -n install git meson clang libinput10 libinput-devel pugixml-devel libwayland-client0 libwayland-cursor0 wayland-protocols-devel wayland-devel Mesa-libEGL-devel Mesa-libGLESv2-devel libgbm-devel libxkbcommon-devel libudev-devel libpixman-1-0-devel gtkmm3-devel jsoncpp-devel libxkbregistry-devel scdoc playerctl-devel

View File

@@ -19,5 +19,9 @@ run: build
debug-run: build-debug
./build/waybar --log-level debug
test:
meson test -C build --no-rebuild --verbose --suite waybar
.PHONY: test
clean:
rm -rf build

View File

@@ -1,14 +1,14 @@
# 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/), [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>
> Available in [all major distributions](https://github.com/Alexays/Waybar/wiki/Installation)<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)
- Hyprland (Window Icons, Workspaces, Focused window name)
- DWL (Tags) [requires dwl ipc patch](https://github.com/djpohly/dwl/wiki/ipc)
- Tray [#21](https://github.com/Alexays/Waybar/issues/21)
- Local time
- Battery
@@ -16,12 +16,15 @@
- Network
- Bluetooth
- Pulseaudio
- Privacy Info
- Wireplumber
- Disk
- Memory
- Cpu load average
- Temperature
- MPD
- Custom scripts
- Custom image
- Multiple output configuration
- And many more customizations

10
default.nix Normal file
View File

@@ -0,0 +1,10 @@
(import
(
let lock = builtins.fromJSON (builtins.readFile ./flake.lock); in
fetchTarball {
url = "https://github.com/edolstra/flake-compat/archive/${lock.nodes.flake-compat.locked.rev}.tar.gz";
sha256 = lock.nodes.flake-compat.locked.narHash;
}
)
{ src = ./.; }
).defaultNix

44
flake.lock generated Normal file
View File

@@ -0,0 +1,44 @@
{
"nodes": {
"flake-compat": {
"flake": false,
"locked": {
"lastModified": 1696426674,
"narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
"owner": "edolstra",
"repo": "flake-compat",
"rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
"type": "github"
},
"original": {
"owner": "edolstra",
"repo": "flake-compat",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1704538339,
"narHash": "sha256-1734d3mQuux9ySvwf6axRWZRBhtcZA9Q8eftD6EZg6U=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "46ae0210ce163b3cba6c7da08840c1d63de9c701",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"flake-compat": "flake-compat",
"nixpkgs": "nixpkgs"
}
}
},
"root": "root",
"version": 7
}

67
flake.nix Normal file
View File

@@ -0,0 +1,67 @@
{
description = "Highly customizable Wayland bar for Sway and Wlroots based compositors";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
flake-compat = {
url = "github:edolstra/flake-compat";
flake = false;
};
};
outputs = { self, nixpkgs, ... }:
let
inherit (nixpkgs) lib;
genSystems = func: lib.genAttrs [
"x86_64-linux"
"aarch64-linux"
]
(system: func (import nixpkgs { inherit system; }));
mkDate = longDate: (lib.concatStringsSep "-" [
(builtins.substring 0 4 longDate)
(builtins.substring 4 2 longDate)
(builtins.substring 6 2 longDate)
]);
in
{
devShells = genSystems
(pkgs:
{
default =
pkgs.mkShell
{
name = "waybar-shell";
# inherit attributes from upstream nixpkgs derivation
inherit (pkgs.waybar) buildInputs depsBuildBuild depsBuildBuildPropagated depsBuildTarget
depsBuildTargetPropagated depsHostHost depsHostHostPropagated depsTargetTarget
depsTargetTargetPropagated propagatedBuildInputs propagatedNativeBuildInputs strictDeps;
# overrides for local development
nativeBuildInputs = pkgs.waybar.nativeBuildInputs ++ (with pkgs; [
clang-tools
gdb
]);
};
});
overlays.default = final: prev: {
waybar = final.callPackage ./nix/default.nix {
# take the first "version: '...'" from meson.build
version =
(builtins.head (builtins.split "'"
(builtins.elemAt
(builtins.split " version: '" (builtins.readFile ./meson.build))
2)))
+ "+date=" + (mkDate (self.lastModifiedDate or "19700101")) + "_" + (self.shortRev or "dirty");
};
};
packages = genSystems (pkgs:
let packages = self.overlays.default pkgs pkgs;
in packages // {
default = packages.waybar;
});
};
}

27
include/AAppIconLabel.hpp Normal file
View File

@@ -0,0 +1,27 @@
#pragma once
#include <gtkmm/box.h>
#include <gtkmm/image.h>
#include "AIconLabel.hpp"
namespace waybar {
class AAppIconLabel : public AIconLabel {
public:
AAppIconLabel(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 ~AAppIconLabel() = default;
auto update() -> void override;
protected:
void updateAppIconName(const std::string &app_identifier,
const std::string &alternative_app_identifier);
void updateAppIcon();
unsigned app_icon_size_{24};
bool update_app_icon_{true};
std::string app_icon_name_;
};
} // namespace waybar

View File

@@ -1,35 +0,0 @@
#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

View File

@@ -13,7 +13,7 @@ class AIconLabel : public ALabel {
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;
auto update() -> void override;
protected:
Gtk::Image image_;

View File

@@ -14,7 +14,7 @@ class ALabel : public AModule {
uint16_t interval = 0, bool ellipsize = false, bool enable_click = false,
bool enable_scroll = false);
virtual ~ALabel() = default;
virtual auto update() -> void;
auto update() -> void override;
virtual std::string getIcon(uint16_t, const std::string &alt = "", uint16_t max = 0);
virtual std::string getIcon(uint16_t, const std::vector<std::string> &alts, uint16_t max = 0);
@@ -25,7 +25,7 @@ class ALabel : public AModule {
bool alt_ = false;
std::string default_format_;
virtual bool handleToggle(GdkEventButton *const &e);
//todo bool handleToggle(GdkEventButton *const &e) override;
virtual std::string getState(uint8_t value, bool lesser = false);
};

View File

@@ -2,7 +2,7 @@
#include <glibmm/dispatcher.h>
#include <glibmm/markup.h>
#include <gtkmm/eventbox.h>
//#include <gtkmm/eventbox.h>
#include <json/json.h>
#include "IModule.hpp"
@@ -11,47 +11,64 @@ namespace waybar {
class AModule : public IModule {
public:
AModule(const Json::Value &, const std::string &, const std::string &, bool enable_click = false,
bool enable_scroll = false);
virtual ~AModule();
virtual auto update() -> void;
virtual operator Gtk::Widget &();
static constexpr const char *MODULE_CLASS = "module";
virtual ~AModule();
auto update() -> void override;
virtual auto refresh(int) -> void{};
operator Gtk::Widget &() override;
auto doAction(const std::string &name) -> void override;
/// Emitting on this dispatcher triggers a update() call
Glib::Dispatcher dp;
protected:
// Don't need to make an object directly
// Derived classes are able to use it
AModule(const Json::Value &, const std::string &, const std::string &, bool enable_click = false,
bool enable_scroll = false);
enum SCROLL_DIR { NONE, UP, DOWN, LEFT, RIGHT };
SCROLL_DIR getScrollDir(GdkEventScroll *e);
// SCROLL_DIR getScrollDir(GdkEventScroll *e);
bool tooltipEnabled();
const std::string name_;
const Json::Value &config_;
Gtk::EventBox event_box_;
// Gtk::EventBox event_box_;
virtual bool handleToggle(GdkEventButton *const &ev);
virtual bool handleScroll(GdkEventScroll *);
// virtual bool handleToggle(GdkEventButton *const &ev);
// virtual bool handleScroll(GdkEventScroll *);
// virtual bool handleRelease(GdkEventButton *const &ev);
private:
// bool handleUserEvent(GdkEventButton *const &ev);
const bool isTooltip;
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::map<std::string, std::string> eventActionMap_;
/* static const inline std::map<std::pair<uint, GdkEventType>, std::string> eventMap_{
{std::make_pair(1, GdkEventType::GDK_BUTTON_PRESS), "on-click"},
{std::make_pair(1, GdkEventType::GDK_BUTTON_RELEASE), "on-click-release"},
{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_BUTTON_RELEASE), "on-click-middle-release"},
{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_BUTTON_RELEASE), "on-click-right-release"},
{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_BUTTON_RELEASE), "on-click-backward-release"},
{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_BUTTON_RELEASE), "on-click-forward-release"},
{std::make_pair(9, GdkEventType::GDK_2BUTTON_PRESS), "on-double-click-forward"},
{std::make_pair(9, GdkEventType::GDK_3BUTTON_PRESS), "on-triple-click-forward"}};
{std::make_pair(9, GdkEventType::GDK_3BUTTON_PRESS), "on-triple-click-forward"}};*/
};
} // namespace waybar

19
include/ASlider.hpp Normal file
View File

@@ -0,0 +1,19 @@
#pragma once
#include "AModule.hpp"
#include "gtkmm/scale.h"
namespace waybar {
class ASlider : public AModule {
public:
ASlider(const Json::Value& config, const std::string& name, const std::string& id);
virtual void onValueChanged();
protected:
bool vertical_ = false;
int min_ = 0, max_ = 100, curr_ = 50;
Gtk::Scale scale_;
};
} // namespace waybar

View File

@@ -9,6 +9,7 @@ class IModule {
virtual ~IModule() = default;
virtual auto update() -> void = 0;
virtual operator Gtk::Widget&() = 0;
virtual auto doAction(const std::string& name) -> void = 0;
};
} // namespace waybar

View File

@@ -1,17 +1,13 @@
#pragma once
#include <gdkmm/monitor.h>
#include <glibmm/refptr.h>
#include <gtkmm/box.h>
#include <gtkmm/centerbox.h>
#include <gtkmm/cssprovider.h>
#include <gtkmm/main.h>
#include <gtkmm/window.h>
#include <json/json.h>
#include <memory>
#include <vector>
#include "AModule.hpp"
//#include "group.hpp"
#include "xdg-output-unstable-v1-client-protocol.h"
namespace waybar {
@@ -52,34 +48,18 @@ 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>;
using bar_mode_map = std::map<std::string, struct bar_mode>;
static const bar_mode_map PRESET_MODES;
static const std::string_view MODE_DEFAULT;
static const std::string_view MODE_INVISIBLE;
static const std::string MODE_DEFAULT;
static const std::string MODE_INVISIBLE;
Bar(struct waybar_output *w_output, const Json::Value &);
Bar(const Bar &) = delete;
~Bar();
void setMode(const std::string_view &);
void setMode(const std::string &mode);
void setVisible(bool visible);
void toggle();
void handleSignal(int);
@@ -88,30 +68,43 @@ class Bar {
Json::Value config;
struct wl_surface *surface;
bool visible = true;
bool vertical = false;
Gtk::Window window;
Glib::RefPtr<Gdk::Surface> gdk_surface_;
Gtk::Orientation orientation = Gtk::Orientation::HORIZONTAL;
Gtk::PositionType position = Gtk::PositionType::TOP;
int x_global;
int y_global;
#ifdef HAVE_SWAY
std::string bar_id;
#endif
private:
void onMap(GdkEventAny *);
void onMap();
auto setupWidgets() -> void;
void getModules(const Factory &, const std::string &, Gtk::Box *);
// void getModules(const Factory &, const std::string &, waybar::Group *);
void setupAltFormatKeyForModule(const std::string &module_name);
void setupAltFormatKeyForModuleList(const char *module_list_name);
void setMode(const bar_mode &);
void setPassThrough(bool passthrough);
void setPosition(Gtk::PositionType position);
void onConfigure(int width, int height);
void configureGlobalOffset(int width, int height);
void onOutputGeometryChanged();
/* 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_;
struct bar_margins margins_;
uint32_t width_, height_;
bool passthrough_;
Gtk::Box left_;
Gtk::Box center_;
Gtk::Box right_;
Gtk::Box box_;
Gtk::CenterBox box_;
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_;

View File

@@ -1,14 +1,11 @@
#pragma once
#include <fmt/format.h>
#include <gdk/gdk.h>
#include <gdk/gdkwayland.h>
#include <wayland-client.h>
#include <gdk/wayland/gdkwayland.h>
#include "bar.hpp"
#include "config.hpp"
#include "util/portal.hpp"
struct zwlr_layer_shell_v1;
struct zwp_idle_inhibitor_v1;
struct zwp_idle_inhibit_manager_v1;
@@ -24,7 +21,6 @@ class Client {
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 zwp_idle_inhibit_manager_v1 *idle_inhibit_manager = nullptr;
std::vector<std::unique_ptr<Bar>> bars;
@@ -33,7 +29,8 @@ class Client {
private:
Client() = default;
const std::string getStyle(const std::string &style);
Glib::RefPtr<Gio::ListModel> monitors_;
const std::string getStyle(const std::string &style, std::optional<Appearance> appearance);
void bindInterfaces();
void handleOutput(struct waybar_output &output);
auto setupCss(const std::string &css_file) -> void;
@@ -50,8 +47,8 @@ class Client {
void handleMonitorRemoved(Glib::RefPtr<Gdk::Monitor> monitor);
void handleDeferredMonitorRemoval(Glib::RefPtr<Gdk::Monitor> monitor);
Glib::RefPtr<Gtk::StyleContext> style_context_;
Glib::RefPtr<Gtk::CssProvider> css_provider_;
std::unique_ptr<Portal> portal;
std::list<struct waybar_output> outputs_;
};

View File

@@ -1,7 +1,7 @@
#pragma once
#include <json/json.h>
#ifdef HAVE_LIBDATE
#if defined(HAVE_CHRONO_TIMEZONES) || defined(HAVE_LIBDATE)
#include "modules/clock.hpp"
#else
#include "modules/simpleclock.hpp"
@@ -18,20 +18,29 @@
#include "modules/wlr/workspace_manager.hpp"
#endif
#ifdef HAVE_RIVER
#include "modules/river/layout.hpp"
#include "modules/river/mode.hpp"
#include "modules/river/tags.hpp"
#include "modules/river/window.hpp"
#endif
#ifdef HAVE_DWL
#include "modules/dwl/tags.hpp"
#endif
#ifdef HAVE_HYPRLAND
#include "modules/hyprland/backend.hpp"
#include "modules/hyprland/language.hpp"
#include "modules/hyprland/submap.hpp"
#include "modules/hyprland/window.hpp"
#include "modules/hyprland/workspaces.hpp"
#endif
#if defined(__FreeBSD__) || (defined(__linux__) && !defined(NO_FILESYSTEM))
#include "modules/battery.hpp"
#endif
#if defined(HAVE_CPU_LINUX) || defined(HAVE_CPU_BSD)
#include "modules/cpu.hpp"
#include "modules/cpu_frequency.hpp"
#include "modules/cpu_usage.hpp"
#include "modules/load.hpp"
#endif
#include "modules/idle_inhibitor.hpp"
#if defined(HAVE_MEMORY_LINUX) || defined(HAVE_MEMORY_BSD)
@@ -41,6 +50,9 @@
#ifdef HAVE_DBUSMENU
#include "modules/sni/tray.hpp"
#endif
#ifdef HAVE_MPRIS
#include "modules/mpris/mpris.hpp"
#endif
#ifdef HAVE_LIBNL
#include "modules/network.hpp"
#endif
@@ -56,6 +68,9 @@
#ifdef HAVE_UPOWER
#include "modules/upower/upower.hpp"
#endif
#ifdef HAVE_PIPEWIRE
#include "modules/privacy/privacy.hpp"
#endif
#ifdef HAVE_LIBPULSE
#include "modules/pulseaudio.hpp"
#endif
@@ -72,8 +87,19 @@
#ifdef HAVE_LIBJACK
#include "modules/jack.hpp"
#endif
#ifdef HAVE_LIBWIREPLUMBER
#include "modules/wireplumber.hpp"
#endif
#ifdef HAVE_LIBCAVA
#include "modules/cava.hpp"
#endif
#ifdef HAVE_SYSTEMD_MONITOR
#include "modules/systemd_failed_units.hpp"
#endif
#include "bar.hpp"
#include "modules/cffi.hpp"
#include "modules/custom.hpp"
#include "modules/image.hpp"
#include "modules/temperature.hpp"
#include "modules/user.hpp"
@@ -82,7 +108,7 @@ namespace waybar {
class Factory {
public:
Factory(const Bar& bar, const Json::Value& config);
AModule* makeModule(const std::string& name) const;
AModule* makeModule(const std::string& name, const std::string& pos) const;
private:
const Bar& bar_;

View File

@@ -5,18 +5,31 @@
#include <json/json.h>
#include "AModule.hpp"
#include "bar.hpp"
#include "factory.hpp"
#include "gtkmm/revealer.h"
namespace waybar {
class Group : public AModule {
public:
Group(const std::string&, const Bar&, const Json::Value&);
~Group() = default;
auto update() -> void;
operator Gtk::Widget&();
Group(const std::string&, const std::string&, const Json::Value&, bool);
virtual ~Group() = default;
auto update() -> void override;
operator Gtk::Widget&() override;
virtual Gtk::Box& getBox();
void addWidget(Gtk::Widget& widget);
// bool handleMouseHover(GdkEventCrossing* const& e);
protected:
Gtk::Box box;
Gtk::Box revealer_box;
Gtk::Revealer revealer;
bool is_first_widget = true;
bool is_drawer = false;
std::string add_class_to_drawer_children;
void addHoverHandlerTo(Gtk::Widget& widget);
};
} // namespace waybar

View File

@@ -1,61 +1,32 @@
#pragma once
#include <memory>
#include <optional>
#include <string>
#include <string_view>
#include <vector>
#include "AButton.hpp"
#include "ALabel.hpp"
#include "util/backlight_backend.hpp"
#include "util/json.hpp"
#include "util/sleeper_thread.hpp"
struct udev;
struct udev_device;
namespace waybar::modules {
class Backlight : public AButton {
class BacklightDev {
public:
BacklightDev() = default;
BacklightDev(std::string name, int actual, int max);
std::string_view name() const;
int get_actual() const;
void set_actual(int actual);
int get_max() const;
void set_max(int max);
friend inline bool operator==(const BacklightDev &lhs, const BacklightDev &rhs) {
return lhs.name_ == rhs.name_ && lhs.actual_ == rhs.actual_ && lhs.max_ == rhs.max_;
}
private:
std::string name_;
int actual_ = 1;
int max_ = 1;
};
class Backlight : public ALabel {
public:
Backlight(const std::string &, const Json::Value &);
~Backlight();
auto update() -> void;
virtual ~Backlight() = default;
auto update() -> void override;
private:
template <class ForwardIt>
static const BacklightDev *best_device(ForwardIt first, ForwardIt last, std::string_view);
template <class ForwardIt, class Inserter>
static void upsert_device(ForwardIt first, ForwardIt last, Inserter inserter, udev_device *dev);
template <class ForwardIt, class Inserter>
static void enumerate_devices(ForwardIt first, ForwardIt last, Inserter inserter, udev *udev);
bool handleScroll(GdkEventScroll *e) override;
const std::string preferred_device_;
static constexpr int EPOLL_MAX_EVENTS = 16;
std::optional<BacklightDev> previous_best_;
std::string previous_format_;
std::mutex udev_thread_mutex_;
std::vector<BacklightDev> devices_;
// thread must destruct before shared data
util::SleeperThread udev_thread_;
util::BacklightBackend backend;
};
} // namespace waybar::modules

View File

@@ -0,0 +1,24 @@
#pragma once
#include <chrono>
#include "ASlider.hpp"
#include "util/backlight_backend.hpp"
namespace waybar::modules {
class BacklightSlider : public ASlider {
public:
BacklightSlider(const std::string&, const Json::Value&);
virtual ~BacklightSlider() = default;
void update() override;
void onValueChanged() override;
private:
std::chrono::milliseconds interval_;
std::string preferred_device_;
util::BacklightBackend backend;
};
} // namespace waybar::modules

View File

@@ -15,7 +15,7 @@
#include <string>
#include <vector>
#include "AButton.hpp"
#include "ALabel.hpp"
#include "util/sleeper_thread.hpp"
namespace waybar::modules {
@@ -26,11 +26,11 @@ namespace fs = std::experimental::filesystem;
namespace fs = std::filesystem;
#endif
class Battery : public AButton {
class Battery : public ALabel {
public:
Battery(const std::string&, const Json::Value&);
~Battery();
auto update() -> void;
virtual ~Battery();
auto update() -> void override;
private:
static inline const fs::path data_dir_ = "/sys/class/power_supply/";

View File

@@ -1,6 +1,6 @@
#pragma once
#include "AButton.hpp"
#include "ALabel.hpp"
#ifdef WANT_RFKILL
#include "util/rfkill.hpp"
#endif
@@ -12,7 +12,7 @@
namespace waybar::modules {
class Bluetooth : public AButton {
class Bluetooth : public ALabel {
struct ControllerInfo {
std::string path;
std::string address;
@@ -45,8 +45,8 @@ class Bluetooth : public AButton {
public:
Bluetooth(const std::string&, const Json::Value&);
~Bluetooth() = default;
auto update() -> void;
virtual ~Bluetooth() = default;
auto update() -> void override;
private:
static auto onInterfaceAddedOrRemoved(GDBusObjectManager*, GDBusObject*, GDBusInterface*,
@@ -59,7 +59,8 @@ class Bluetooth : public AButton {
auto getDeviceProperties(GDBusObject*, DeviceInfo&) -> bool;
auto getControllerProperties(GDBusObject*, ControllerInfo&) -> bool;
auto findCurController(ControllerInfo&) -> bool;
// Returns std::nullopt if no controller could be found
auto findCurController() -> std::optional<ControllerInfo>;
auto findConnectedDevices(const std::string&, std::vector<DeviceInfo>&) -> void;
#ifdef WANT_RFKILL
@@ -68,7 +69,7 @@ class Bluetooth : public AButton {
const std::unique_ptr<GDBusObjectManager, void (*)(GDBusObjectManager*)> manager_;
std::string state_;
ControllerInfo cur_controller_;
std::optional<ControllerInfo> cur_controller_;
std::vector<DeviceInfo> connected_devices_;
DeviceInfo cur_focussed_device_;
std::string device_enumerate_;

49
include/modules/cava.hpp Normal file
View File

@@ -0,0 +1,49 @@
#pragma once
#include "ALabel.hpp"
#include "util/sleeper_thread.hpp"
namespace cava {
extern "C" {
#include <cava/common.h>
}
} // namespace cava
namespace waybar::modules {
using namespace std::literals::chrono_literals;
class Cava final : public ALabel {
public:
Cava(const std::string&, const Json::Value&);
virtual ~Cava();
auto update() -> void override;
auto doAction(const std::string& name) -> void override;
private:
util::SleeperThread thread_;
util::SleeperThread thread_fetch_input_;
struct cava::error_s error_ {}; // cava errors
struct cava::config_params prm_ {}; // cava parameters
struct cava::audio_raw audio_raw_ {}; // cava handled raw audio data(is based on audio_data)
struct cava::audio_data audio_data_ {}; // cava audio data
struct cava::cava_plan* plan_; //{new cava_plan{}};
// Cava API to read audio source
cava::ptr input_source_;
// Delay to handle audio source
std::chrono::milliseconds frame_time_milsec_{1s};
// Text to display
std::string text_{""};
int rePaint_{1};
std::chrono::seconds fetch_input_delay_{4};
std::chrono::seconds suspend_silence_delay_{0};
bool silence_{false};
bool hide_on_silence_{false};
int sleep_counter_{0};
// Cava method
void pause_resume();
// ModuleActionMap
static inline std::map<const std::string, void (waybar::modules::Cava::*const)()> actionMap_{
{"mode", &waybar::modules::Cava::pause_resume}};
};
} // namespace waybar::modules

60
include/modules/cffi.hpp Normal file
View File

@@ -0,0 +1,60 @@
#pragma once
#include <string>
#include "AModule.hpp"
#include "util/command.hpp"
#include "util/json.hpp"
#include "util/sleeper_thread.hpp"
namespace waybar::modules {
namespace ffi {
extern "C" {
typedef struct wbcffi_module wbcffi_module;
typedef struct {
wbcffi_module* obj;
const char* waybar_version;
//todo GtkContainer* (*get_root_widget)(wbcffi_module*);
void (*queue_update)(wbcffi_module*);
} wbcffi_init_info;
struct wbcffi_config_entry {
const char* key;
const char* value;
};
}
} // namespace ffi
class CFFI : public AModule {
public:
CFFI(const std::string&, const std::string&, const Json::Value&);
virtual ~CFFI();
virtual auto refresh(int signal) -> void override;
virtual auto doAction(const std::string& name) -> void override;
virtual auto update() -> void override;
private:
///
void* cffi_instance_ = nullptr;
typedef void*(InitFn)(const ffi::wbcffi_init_info* init_info,
const ffi::wbcffi_config_entry* config_entries, size_t config_entries_len);
typedef void(DenitFn)(void* instance);
typedef void(RefreshFn)(void* instance, int signal);
typedef void(DoActionFn)(void* instance, const char* name);
typedef void(UpdateFn)(void* instance);
// FFI hooks
struct {
std::function<InitFn> init = nullptr;
std::function<DenitFn> deinit = nullptr;
std::function<RefreshFn> refresh = [](void*, int) {};
std::function<DoActionFn> doAction = [](void*, const char*) {};
std::function<UpdateFn> update = [](void*) {};
} hooks_;
};
} // namespace waybar::modules

View File

@@ -1,44 +1,77 @@
#pragma once
#include <date/tz.h>
#include "AButton.hpp"
#include "ALabel.hpp"
#include "util/date.hpp"
#include "util/sleeper_thread.hpp"
namespace waybar {
namespace waybar::modules {
struct waybar_time;
const std::string kCldPlaceholder{"calendar"};
const std::string kTZPlaceholder{"tz_list"};
namespace modules {
enum class CldMode { MONTH, YEAR };
enum class WS { LEFT, RIGHT, HIDDEN };
const std::string kCalendarPlaceholder = "calendar";
const std::string KTimezonedTimeListPlaceholder = "timezoned_time_list";
class Clock : public AButton {
class Clock final : public ALabel {
public:
Clock(const std::string&, const Json::Value&);
~Clock() = default;
auto update() -> void;
virtual ~Clock() = default;
auto update() -> void override;
auto doAction(const std::string&) -> void override;
private:
const std::locale locale_;
// tooltip
const std::string tlpFmt_;
std::string tlpText_{""}; // tooltip text to print
// Calendar
const bool cldInTooltip_; // calendar in tooltip
/*
0 - calendar.format.months
1 - calendar.format.weekdays
2 - calendar.format.days
3 - calendar.format.today
4 - calendar.format.weeks
5 - tooltip-format
*/
std::map<int, std::string const> fmtMap_;
uint cldMonCols_{3}; // calendar count month columns
int cldWnLen_{3}; // calendar week number length
const int cldMonColLen_{20}; // calendar month column length
WS cldWPos_{WS::HIDDEN}; // calendar week side to print
months cldCurrShift_{0}; // calendar months shift
year_month_day cldYearShift_; // calendar Year mode. Cached ymd
std::string cldYearCached_; // calendar Year mode. Cached calendar
year_month cldMonShift_; // calendar Month mode. Cached ym
std::string cldMonCached_; // calendar Month mode. Cached calendar
day cldBaseDay_{0}; // calendar Cached day. Is used when today is changing(midnight)
std::string cldText_{""}; // calendar text to print
CldMode cldMode_{CldMode::MONTH};
auto get_calendar(const year_month_day& today, const year_month_day& ymd, const time_zone* tz)
-> const std::string;
// time zoned time in tooltip
const bool tzInTooltip_; // if need to print time zones text
std::vector<const time_zone*> tzList_; // time zones list
int tzCurrIdx_; // current time zone index for tzList_
std::string tzText_{""}; // time zones text to print
util::SleeperThread thread_;
std::locale locale_;
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;
auto getTZtext(sys_seconds now) -> std::string;
auto first_day_of_week() -> weekday;
// Module actions
void cldModeSwitch();
void cldShift_up();
void cldShift_down();
void tz_up();
void tz_down();
// Module Action Map
static inline std::map<const std::string, void (waybar::modules::Clock::*const)()> actionMap_{
{"mode", &waybar::modules::Clock::cldModeSwitch},
{"shift_up", &waybar::modules::Clock::cldShift_up},
{"shift_down", &waybar::modules::Clock::cldShift_down},
{"tz_up", &waybar::modules::Clock::tz_up},
{"tz_down", &waybar::modules::Clock::tz_down}};
};
} // namespace modules
} // namespace waybar
} // namespace waybar::modules

View File

@@ -9,24 +9,18 @@
#include <utility>
#include <vector>
#include "AButton.hpp"
#include "ALabel.hpp"
#include "util/sleeper_thread.hpp"
namespace waybar::modules {
class Cpu : public AButton {
class Cpu : public ALabel {
public:
Cpu(const std::string&, const Json::Value&);
~Cpu() = default;
auto update() -> void;
virtual ~Cpu() = default;
auto update() -> void override;
private:
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_;
util::SleeperThread thread_;

View File

@@ -0,0 +1,32 @@
#pragma once
#include <fmt/format.h>
#include <cstdint>
#include <fstream>
#include <numeric>
#include <string>
#include <utility>
#include <vector>
#include "ALabel.hpp"
#include "util/sleeper_thread.hpp"
namespace waybar::modules {
class CpuFrequency : public ALabel {
public:
CpuFrequency(const std::string&, const Json::Value&);
virtual ~CpuFrequency() = default;
auto update() -> void override;
// This is a static member because it is also used by the cpu module.
static std::tuple<float, float, float> getCpuFrequency();
private:
static std::vector<float> parseCpuFrequencies();
util::SleeperThread thread_;
};
} // namespace waybar::modules

View File

@@ -0,0 +1,35 @@
#pragma once
#include <fmt/format.h>
#include <cstdint>
#include <fstream>
#include <numeric>
#include <string>
#include <utility>
#include <vector>
#include "ALabel.hpp"
#include "util/sleeper_thread.hpp"
namespace waybar::modules {
class CpuUsage : public ALabel {
public:
CpuUsage(const std::string&, const Json::Value&);
virtual ~CpuUsage() = default;
auto update() -> void override;
// This is a static member because it is also used by the cpu module.
static std::tuple<std::vector<uint16_t>, std::string> getCpuUsage(
std::vector<std::tuple<size_t, size_t>>&);
private:
static std::vector<std::tuple<size_t, size_t>> parseCpuinfo();
std::vector<std::tuple<size_t, size_t>> prev_times_;
util::SleeperThread thread_;
};
} // namespace waybar::modules

View File

@@ -5,30 +5,32 @@
#include <csignal>
#include <string>
#include "AButton.hpp"
#include "ALabel.hpp"
#include "util/command.hpp"
#include "util/json.hpp"
#include "util/sleeper_thread.hpp"
namespace waybar::modules {
class Custom : public AButton {
class Custom : public ALabel {
public:
Custom(const std::string&, const std::string&, const Json::Value&);
~Custom();
auto update() -> void;
void refresh(int /*signal*/);
Custom(const std::string&, const std::string&, const Json::Value&, const std::string&);
virtual ~Custom();
auto update() -> void override;
void refresh(int /*signal*/) override;
private:
void delayWorker();
void continuousWorker();
void waitingWorker();
void parseOutputRaw();
void parseOutputJson();
void handleEvent();
bool handleScroll(GdkEventScroll* e);
bool handleToggle(GdkEventButton* const& e);
//todo bool handleScroll(GdkEventScroll* e) override;
//todo bool handleToggle(GdkEventButton* const& e) override;
const std::string name_;
const std::string output_name_;
std::string text_;
std::string id_;
std::string alt_;

View File

@@ -5,21 +5,24 @@
#include <fstream>
#include "AButton.hpp"
#include "ALabel.hpp"
#include "util/format.hpp"
#include "util/sleeper_thread.hpp"
namespace waybar::modules {
class Disk : public AButton {
class Disk : public ALabel {
public:
Disk(const std::string&, const Json::Value&);
~Disk() = default;
auto update() -> void;
virtual ~Disk() = default;
auto update() -> void override;
private:
util::SleeperThread thread_;
std::string path_;
std::string unit_;
float calc_specific_divisor(const std::string divisor);
};
} // namespace waybar::modules

View File

@@ -0,0 +1,34 @@
#pragma once
#include <gtkmm/button.h>
#include <wayland-client.h>
#include "AModule.hpp"
#include "bar.hpp"
#include "dwl-ipc-unstable-v2-client-protocol.h"
#include "xdg-output-unstable-v1-client-protocol.h"
namespace waybar::modules::dwl {
class Tags : public waybar::AModule {
public:
Tags(const std::string &, const waybar::Bar &, const Json::Value &);
virtual ~Tags();
// Handlers for wayland events
void handle_view_tags(uint32_t tag, uint32_t state, uint32_t clients, uint32_t focused);
void handle_primary_clicked(uint32_t tag);
bool handle_button_press(GdkEventButton *event_button, uint32_t tag);
struct zdwl_ipc_manager_v2 *status_manager_;
struct wl_seat *seat_;
private:
const waybar::Bar &bar_;
Gtk::Box box_;
std::vector<Gtk::Button> buttons_;
struct zdwl_ipc_output_v2 *output_status_;
};
} /* namespace waybar::modules::dwl */

View File

@@ -18,8 +18,8 @@ namespace waybar::modules {
class Gamemode : public AModule {
public:
Gamemode(const std::string &, const Json::Value &);
~Gamemode();
auto update() -> void;
virtual ~Gamemode();
auto update() -> void override;
private:
const std::string DEFAULT_ICON_NAME = "input-gaming-symbolic";
@@ -39,7 +39,7 @@ class Gamemode : public AModule {
const Glib::VariantContainerBase &arguments);
void getData();
bool handleToggle(GdkEventButton *const &);
bool handleToggle(GdkEventButton *const &) override;
// Config
std::string format = DEFAULT_FORMAT;

View File

@@ -1,26 +1,38 @@
#pragma once
#include <deque>
#include <functional>
#include <list>
#include <memory>
#include <mutex>
#include <string>
#include <thread>
#include <utility>
#include "util/json.hpp"
namespace waybar::modules::hyprland {
class EventHandler {
public:
virtual void onEvent(const std::string& ev) = 0;
virtual ~EventHandler() = default;
};
class IPC {
public:
IPC() { startIPC(); }
void registerForIPC(const std::string&, std::function<void(const std::string&)>);
void registerForIPC(const std::string&, EventHandler*);
void unregisterForIPC(EventHandler*);
std::string getSocket1Reply(const std::string& rq);
static std::string getSocket1Reply(const std::string& rq);
Json::Value getSocket1JsonReply(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;
std::mutex m_callbackMutex;
util::JsonParser m_parser;
std::list<std::pair<std::string, EventHandler*>> m_callbacks;
};
inline std::unique_ptr<IPC> gIPC;

View File

@@ -1,29 +1,42 @@
#pragma once
#include <fmt/format.h>
#include "AButton.hpp"
#include <string>
#include "ALabel.hpp"
#include "bar.hpp"
#include "modules/hyprland/backend.hpp"
#include "util/json.hpp"
namespace waybar::modules::hyprland {
class Language : public waybar::AButton {
class Language : public waybar::ALabel, public EventHandler {
public:
Language(const std::string&, const waybar::Bar&, const Json::Value&);
~Language() = default;
virtual ~Language();
auto update() -> void;
auto update() -> void override;
private:
void onEvent(const std::string&);
void onEvent(const std::string&) override;
void initLanguage();
std::string getShortFrom(const std::string&);
struct Layout {
std::string full_name;
std::string short_name;
std::string variant;
std::string short_description;
};
auto getLayout(const std::string&) -> Layout;
std::mutex mutex_;
const Bar& bar_;
util::JsonParser parser_;
std::string layoutName_;
Layout layout_;
};
} // namespace waybar::modules::hyprland

View File

@@ -0,0 +1,30 @@
#pragma once
#include <fmt/format.h>
#include <string>
#include "ALabel.hpp"
#include "bar.hpp"
#include "modules/hyprland/backend.hpp"
#include "util/json.hpp"
namespace waybar::modules::hyprland {
class Submap : public waybar::ALabel, public EventHandler {
public:
Submap(const std::string&, const waybar::Bar&, const Json::Value&);
virtual ~Submap();
auto update() -> void override;
private:
void onEvent(const std::string&) override;
std::mutex mutex_;
const Bar& bar_;
util::JsonParser parser_;
std::string submap_;
};
} // namespace waybar::modules::hyprland

View File

@@ -1,31 +1,64 @@
#pragma once
#include <fmt/format.h>
#include <tuple>
#include <string>
#include "ALabel.hpp"
#include "AAppIconLabel.hpp"
#include "bar.hpp"
#include "modules/hyprland/backend.hpp"
#include "util/json.hpp"
namespace waybar::modules::hyprland {
class Window : public waybar::ALabel {
class Window : public waybar::AAppIconLabel, public EventHandler {
public:
Window(const std::string&, const waybar::Bar&, const Json::Value&);
~Window() = default;
~Window() override;
auto update() -> void;
auto update() -> void override;
private:
uint getActiveWorkspaceID(std::string);
std::string getLastWindowTitle(uint);
void onEvent(const std::string&);
struct Workspace {
int id;
int windows;
std::string last_window;
std::string last_window_title;
static auto parse(const Json::Value&) -> Workspace;
};
struct WindowData {
bool floating;
int monitor = -1;
std::string class_name;
std::string initial_class_name;
std::string title;
std::string initial_title;
bool fullscreen;
bool grouped;
static auto parse(const Json::Value&) -> WindowData;
};
auto getActiveWorkspace(const std::string&) -> Workspace;
auto getActiveWorkspace() -> Workspace;
void onEvent(const std::string&) override;
void queryActiveWorkspace();
void setClass(const std::string&, bool enable);
bool separate_outputs;
std::mutex mutex_;
const Bar& bar_;
util::JsonParser parser_;
std::string lastView;
WindowData window_data_;
Workspace workspace_;
std::string solo_class_;
std::string last_solo_class_;
bool solo_;
bool all_floating_;
bool swallowing_;
bool fullscreen_;
};
} // namespace waybar::modules::hyprland
} // namespace waybar::modules::hyprland

View File

@@ -0,0 +1,214 @@
#pragma once
#include <gtkmm/button.h>
#include <gtkmm/label.h>
#include <json/value.h>
#include <cstddef>
#include <cstdint>
#include <map>
#include <memory>
#include <optional>
#include <regex>
#include <string>
#include <variant>
#include <vector>
#include "AModule.hpp"
#include "bar.hpp"
#include "modules/hyprland/backend.hpp"
#include "util/enum.hpp"
#include "util/regex_collection.hpp"
using WindowAddress = std::string;
namespace waybar::modules::hyprland {
class Workspaces;
class WindowCreationPayload {
public:
WindowCreationPayload(std::string workspace_name, WindowAddress window_address,
std::string window_repr);
WindowCreationPayload(std::string workspace_name, WindowAddress window_address,
std::string window_class, std::string window_title);
WindowCreationPayload(Json::Value const& client_data);
int incrementTimeSpentUncreated();
bool isEmpty(Workspaces& workspace_manager);
bool reprIsReady() const { return std::holds_alternative<Repr>(m_window); }
std::string repr(Workspaces& workspace_manager);
std::string getWorkspaceName() const { return m_workspaceName; }
WindowAddress getAddress() const { return m_windowAddress; }
void moveToWorksace(std::string& new_workspace_name);
private:
void clearAddr();
void clearWorkspaceName();
using Repr = std::string;
using ClassAndTitle = std::pair<std::string, std::string>;
std::variant<Repr, ClassAndTitle> m_window;
WindowAddress m_windowAddress;
std::string m_workspaceName;
int m_timeSpentUncreated = 0;
};
class Workspace {
public:
explicit Workspace(const Json::Value& workspace_data, Workspaces& workspace_manager,
const Json::Value& clients_data = Json::Value::nullRef);
std::string& selectIcon(std::map<std::string, std::string>& icons_map);
Gtk::Button& button() { return m_button; };
int id() const { return m_id; };
std::string name() const { return m_name; };
std::string output() const { return m_output; };
bool isActive() const { return m_active; };
bool isSpecial() const { return m_isSpecial; };
bool isPersistent() const { return m_isPersistent; };
bool isVisible() const { return m_isVisible; };
bool isEmpty() const { return m_windows == 0; };
bool isUrgent() const { return m_isUrgent; };
bool handleClicked(GdkEventButton* bt) const;
void setActive(bool value = true) { m_active = value; };
void setPersistent(bool value = true) { m_isPersistent = value; };
void setUrgent(bool value = true) { m_isUrgent = value; };
void setVisible(bool value = true) { m_isVisible = value; };
void setWindows(uint value) { m_windows = value; };
void setName(std::string const& value) { m_name = value; };
bool containsWindow(WindowAddress const& addr) const { return m_windowMap.contains(addr); }
void insertWindow(WindowCreationPayload create_window_paylod);
std::string removeWindow(WindowAddress const& addr);
void initializeWindowMap(const Json::Value& clients_data);
bool onWindowOpened(WindowCreationPayload const& create_window_paylod);
std::optional<std::string> closeWindow(WindowAddress const& addr);
void update(const std::string& format, const std::string& icon);
private:
Workspaces& m_workspaceManager;
int m_id;
std::string m_name;
std::string m_output;
uint m_windows;
bool m_active = false;
bool m_isSpecial = false;
bool m_isPersistent = false;
bool m_isUrgent = false;
bool m_isVisible = false;
std::map<WindowAddress, std::string> m_windowMap;
Gtk::Button m_button;
Gtk::Box m_content;
Gtk::Label m_label;
};
class Workspaces : public AModule, public EventHandler {
public:
Workspaces(const std::string&, const waybar::Bar&, const Json::Value&);
~Workspaces() override;
void update() override;
void init();
auto allOutputs() const -> bool { return m_allOutputs; }
auto showSpecial() const -> bool { return m_showSpecial; }
auto activeOnly() const -> bool { return m_activeOnly; }
auto getBarOutput() const -> std::string { return m_bar.output->name; }
std::string getRewrite(std::string window_class, std::string window_title);
std::string& getWindowSeparator() { return m_formatWindowSeparator; }
bool isWorkspaceIgnored(std::string const& workspace_name);
bool windowRewriteConfigUsesTitle() const { return m_anyWindowRewriteRuleUsesTitle; }
private:
void onEvent(const std::string& e) override;
void updateWindowCount();
void sortWorkspaces();
void createWorkspace(Json::Value const& workspace_data,
Json::Value const& clients_data = Json::Value::nullRef);
void removeWorkspace(std::string const& name);
void setUrgentWorkspace(std::string const& windowaddress);
void parseConfig(const Json::Value& config);
void registerIpc();
// workspace events
void onWorkspaceActivated(std::string const& payload);
void onWorkspaceDestroyed(std::string const& payload);
void onWorkspaceCreated(std::string const& workspaceName,
Json::Value const& clientsData = Json::Value::nullRef);
void onWorkspaceMoved(std::string const& payload);
void onWorkspaceRenamed(std::string const& payload);
// monitor events
void onMonitorFocused(std::string const& payload);
// window events
void onWindowOpened(std::string const& payload);
void onWindowClosed(std::string const& addr);
void onWindowMoved(std::string const& payload);
void onWindowTitleEvent(std::string const& payload);
int windowRewritePriorityFunction(std::string const& window_rule);
void doUpdate();
void extendOrphans(int workspaceId, Json::Value const& clientsJson);
void registerOrphanWindow(WindowCreationPayload create_window_paylod);
bool m_allOutputs = false;
bool m_showSpecial = false;
bool m_activeOnly = false;
// Map for windows stored in workspaces not present in the current bar.
// This happens when the user has multiple monitors (hence, multiple bars)
// and doesn't share windows accross bars (a.k.a `all-outputs` = false)
std::map<WindowAddress, std::string> m_orphanWindowMap;
enum class SortMethod { ID, NAME, NUMBER, DEFAULT };
util::EnumParser<SortMethod> m_enumParser;
SortMethod m_sortBy = SortMethod::DEFAULT;
std::map<std::string, SortMethod> m_sortMap = {{"ID", SortMethod::ID},
{"NAME", SortMethod::NAME},
{"NUMBER", SortMethod::NUMBER},
{"DEFAULT", SortMethod::DEFAULT}};
void fillPersistentWorkspaces();
void createPersistentWorkspaces();
std::vector<std::string> m_persistentWorkspacesToCreate;
bool m_persistentCreated = false;
std::string m_format;
std::map<std::string, std::string> m_iconsMap;
util::RegexCollection m_windowRewriteRules;
bool m_anyWindowRewriteRuleUsesTitle = false;
std::string m_formatWindowSeparator;
bool m_withIcon;
uint64_t m_monitorId;
std::string m_activeWorkspaceName;
std::vector<std::unique_ptr<Workspace>> m_workspaces;
std::vector<std::pair<Json::Value, Json::Value>> m_workspacesToCreate;
std::vector<std::string> m_workspacesToRemove;
std::vector<WindowCreationPayload> m_windowsToCreate;
std::vector<std::regex> m_ignoreWorkspaces;
std::mutex m_mutex;
const Bar& m_bar;
Gtk::Box m_box;
};
} // namespace waybar::modules::hyprland

View File

@@ -2,24 +2,24 @@
#include <fmt/format.h>
#include "AButton.hpp"
#include "ALabel.hpp"
#include "bar.hpp"
#include "client.hpp"
namespace waybar::modules {
class IdleInhibitor : public AButton {
class IdleInhibitor : public ALabel {
sigc::connection timeout_;
public:
IdleInhibitor(const std::string&, const waybar::Bar&, const Json::Value&);
~IdleInhibitor();
auto update() -> void;
virtual ~IdleInhibitor();
auto update() -> void override;
static std::list<waybar::AModule*> modules;
static bool status;
private:
bool handleToggle(GdkEventButton* const& e);
//todo bool handleToggle(GdkEventButton* const& e) override;
void toggleStatus();
const Bar& bar_;

40
include/modules/image.hpp Normal file
View File

@@ -0,0 +1,40 @@
#pragma once
#include <fmt/format.h>
#include <gtkmm/image.h>
#include <csignal>
#include <string>
#include "ALabel.hpp"
#include "gtkmm/box.h"
#include "util/command.hpp"
#include "util/json.hpp"
#include "util/sleeper_thread.hpp"
namespace waybar::modules {
class Image : public AModule {
public:
Image(const std::string&, const Json::Value&);
virtual ~Image() = default;
auto update() -> void override;
void refresh(int /*signal*/) override;
private:
void delayWorker();
void handleEvent();
void parseOutputRaw();
Gtk::Box box_;
Gtk::Image image_;
std::string path_;
std::string tooltip_;
int size_;
int interval_;
util::command::res output_;
util::SleeperThread thread_;
};
} // namespace waybar::modules

View File

@@ -4,20 +4,20 @@
#include <memory>
#include "AButton.hpp"
#include "ALabel.hpp"
#include "bar.hpp"
namespace waybar::modules {
class Inhibitor : public AButton {
class Inhibitor : public ALabel {
public:
Inhibitor(const std::string&, const waybar::Bar&, const Json::Value&);
~Inhibitor() override;
auto update() -> void;
virtual ~Inhibitor();
auto update() -> void override;
auto activated() -> bool;
private:
auto handleToggle(::GdkEventButton* const& e) -> bool;
auto handleToggle(::GdkEventButton* const& e) -> bool override;
const std::unique_ptr<::GDBusConnection, void (*)(::GDBusConnection*)> dbus_;
const std::string inhibitors_;

View File

@@ -14,8 +14,8 @@ namespace waybar::modules {
class JACK : public ALabel {
public:
JACK(const std::string &, const Json::Value &);
~JACK() = default;
auto update() -> void;
virtual ~JACK() = default;
auto update() -> void override;
int bufSize(jack_nframes_t size);
int sampleRate(jack_nframes_t rate);

View File

@@ -3,6 +3,7 @@
#include <fmt/chrono.h>
#include <gtkmm/label.h>
#include <set>
#include <unordered_map>
#include "AModule.hpp"
@@ -19,8 +20,8 @@ namespace waybar::modules {
class KeyboardState : public AModule {
public:
KeyboardState(const std::string&, const waybar::Bar&, const Json::Value&);
~KeyboardState();
auto update() -> void;
virtual ~KeyboardState();
auto update() -> void override;
private:
auto tryAddDevice(const std::string&) -> void;
@@ -40,6 +41,7 @@ class KeyboardState : public AModule {
struct libinput* libinput_;
std::unordered_map<std::string, struct libinput_device*> libinput_devices_;
std::set<int> binding_keys;
util::SleeperThread libinput_thread_, hotplug_thread_;
};

30
include/modules/load.hpp Normal file
View File

@@ -0,0 +1,30 @@
#pragma once
#include <fmt/format.h>
#include <cstdint>
#include <fstream>
#include <numeric>
#include <string>
#include <utility>
#include <vector>
#include "ALabel.hpp"
#include "util/sleeper_thread.hpp"
namespace waybar::modules {
class Load : public ALabel {
public:
Load(const std::string&, const Json::Value&);
virtual ~Load() = default;
auto update() -> void override;
// This is a static member because it is also used by the cpu module.
static std::tuple<double, double, double> getLoad();
private:
util::SleeperThread thread_;
};
} // namespace waybar::modules

View File

@@ -5,16 +5,16 @@
#include <fstream>
#include <unordered_map>
#include "AButton.hpp"
#include "ALabel.hpp"
#include "util/sleeper_thread.hpp"
namespace waybar::modules {
class Memory : public AButton {
class Memory : public ALabel {
public:
Memory(const std::string&, const Json::Value&);
~Memory() = default;
auto update() -> void;
virtual ~Memory() = default;
auto update() -> void override;
private:
void parseMeminfo();

View File

@@ -7,12 +7,12 @@
#include <condition_variable>
#include <thread>
#include "AButton.hpp"
#include "ALabel.hpp"
#include "modules/mpd/state.hpp"
namespace waybar::modules {
class MPD : public AButton {
class MPD : public ALabel {
friend class detail::Context;
// State machine
@@ -37,7 +37,7 @@ class MPD : public AButton {
public:
MPD(const std::string&, const Json::Value&);
virtual ~MPD() noexcept = default;
auto update() -> void;
auto update() -> void override;
private:
std::string getTag(mpd_tag_type type, unsigned idx = 0) const;

View File

@@ -7,7 +7,7 @@
#include <condition_variable>
#include <thread>
#include "AButton.hpp"
#include "ALabel.hpp"
namespace waybar::modules {
class MPD;

View File

@@ -0,0 +1,88 @@
#pragma once
#include <iostream>
#include <optional>
#include <string>
#include "gtkmm/box.h"
#include "gtkmm/label.h"
extern "C" {
#include <playerctl/playerctl.h>
}
#include "ALabel.hpp"
#include "util/sleeper_thread.hpp"
namespace waybar::modules::mpris {
class Mpris : public ALabel {
public:
Mpris(const std::string&, const Json::Value&);
virtual ~Mpris();
auto update() -> void override;
bool handleToggle(GdkEventButton* const&) override;
private:
static auto onPlayerNameAppeared(PlayerctlPlayerManager*, PlayerctlPlayerName*, gpointer) -> void;
static auto onPlayerNameVanished(PlayerctlPlayerManager*, PlayerctlPlayerName*, gpointer) -> void;
static auto onPlayerPlay(PlayerctlPlayer*, gpointer) -> void;
static auto onPlayerPause(PlayerctlPlayer*, gpointer) -> void;
static auto onPlayerStop(PlayerctlPlayer*, gpointer) -> void;
static auto onPlayerMetadata(PlayerctlPlayer*, GVariant*, gpointer) -> void;
struct PlayerInfo {
std::string name;
PlayerctlPlaybackStatus status;
std::string status_string;
std::optional<std::string> artist;
std::optional<std::string> album;
std::optional<std::string> title;
std::optional<std::string> length; // as HH:MM:SS
std::optional<std::string> position; // same format
};
auto getPlayerInfo() -> std::optional<PlayerInfo>;
auto getIconFromJson(const Json::Value&, const std::string&) -> std::string;
auto getArtistStr(const PlayerInfo&, bool) -> std::string;
auto getAlbumStr(const PlayerInfo&, bool) -> std::string;
auto getTitleStr(const PlayerInfo&, bool) -> std::string;
auto getLengthStr(const PlayerInfo&, bool) -> std::string;
auto getPositionStr(const PlayerInfo&, bool) -> std::string;
auto getDynamicStr(const PlayerInfo&, bool, bool) -> std::string;
// config
std::string format_playing_;
std::string format_paused_;
std::string format_stopped_;
std::string tooltip_;
std::string tooltip_playing_;
std::string tooltip_paused_;
std::string tooltip_stopped_;
int artist_len_;
int album_len_;
int title_len_;
int dynamic_len_;
std::vector<std::string> dynamic_prio_;
std::vector<std::string> dynamic_order_;
std::string dynamic_separator_;
bool truncate_hours_;
bool tooltip_len_limits_;
std::string ellipsis_;
std::string player_;
std::vector<std::string> ignored_players_;
PlayerctlPlayerManager* manager;
PlayerctlPlayer* player;
std::string lastStatus;
std::string lastPlayer;
util::SleeperThread thread_;
std::chrono::time_point<std::chrono::system_clock> last_update_;
};
} // namespace waybar::modules::mpris

View File

@@ -10,7 +10,7 @@
#include <optional>
#include "AButton.hpp"
#include "ALabel.hpp"
#include "util/sleeper_thread.hpp"
#ifdef WANT_RFKILL
#include "util/rfkill.hpp"
@@ -18,11 +18,11 @@
namespace waybar::modules {
class Network : public AButton {
class Network : public ALabel {
public:
Network(const std::string&, const Json::Value&);
~Network();
auto update() -> void;
virtual ~Network();
auto update() -> void override;
private:
static const uint8_t MAX_RETRY = 5;
@@ -62,6 +62,7 @@ class Network : public AButton {
bool want_link_dump_;
bool want_addr_dump_;
bool dump_in_progress_;
bool is_p2p_;
unsigned long long bandwidth_down_total_;
unsigned long long bandwidth_up_total_;
@@ -77,7 +78,6 @@ class Network : public AButton {
int32_t signal_strength_dbm_;
uint8_t signal_strength_;
std::string signal_strength_app_;
float frequency_;
uint32_t route_priority;
util::SleeperThread thread_;
@@ -85,6 +85,7 @@ class Network : public AButton {
#ifdef WANT_RFKILL
util::Rfkill rfkill_;
#endif
float frequency_;
};
} // namespace waybar::modules

View File

@@ -0,0 +1,41 @@
#pragma once
#include <iostream>
#include <map>
#include <string>
#include "ALabel.hpp"
#include "gtkmm/box.h"
#include "modules/privacy/privacy_item.hpp"
#include "util/pipewire/pipewire_backend.hpp"
#include "util/pipewire/privacy_node_info.hpp"
using waybar::util::PipewireBackend::PrivacyNodeInfo;
namespace waybar::modules::privacy {
class Privacy : public AModule {
public:
Privacy(const std::string &, const Json::Value &, const std::string &pos);
auto update() -> void override;
void onPrivacyNodesChanged();
private:
std::list<PrivacyNodeInfo *> nodes_screenshare; // Screen is being shared
std::list<PrivacyNodeInfo *> nodes_audio_in; // Application is using the microphone
std::list<PrivacyNodeInfo *> nodes_audio_out; // Application is outputting audio
std::mutex mutex_;
sigc::connection visibility_conn;
// Config
Gtk::Box box_;
uint iconSpacing = 4;
uint iconSize = 20;
uint transition_duration = 250;
std::shared_ptr<util::PipewireBackend::PipewireBackend> backend = nullptr;
};
} // namespace waybar::modules::privacy

View File

@@ -0,0 +1,51 @@
#pragma once
#include <json/value.h>
#include <iostream>
#include <map>
#include <mutex>
#include <string>
#include "gtkmm/box.h"
#include "gtkmm/image.h"
#include "gtkmm/revealer.h"
#include "util/pipewire/privacy_node_info.hpp"
using waybar::util::PipewireBackend::PrivacyNodeInfo;
using waybar::util::PipewireBackend::PrivacyNodeType;
namespace waybar::modules::privacy {
class PrivacyItem : public Gtk::Revealer {
public:
PrivacyItem(const Json::Value &config_, enum PrivacyNodeType privacy_type_,
std::list<PrivacyNodeInfo *> *nodes, const std::string &pos, const uint icon_size,
const uint transition_duration);
enum PrivacyNodeType privacy_type;
void set_in_use(bool in_use);
private:
std::list<PrivacyNodeInfo *> *nodes;
sigc::connection signal_conn;
Gtk::Box tooltip_window;
bool init = false;
bool in_use = false;
// Config
std::string iconName = "image-missing-symbolic";
bool tooltip = true;
uint tooltipIconSize = 24;
Gtk::Box box_;
Gtk::Image icon_;
void update_tooltip();
};
} // namespace waybar::modules::privacy

View File

@@ -1,54 +1,27 @@
#pragma once
#include <fmt/format.h>
#include <pulse/pulseaudio.h>
#include <pulse/volume.h>
#include <algorithm>
#include <array>
#include <memory>
#include "AButton.hpp"
#include "ALabel.hpp"
#include "util/audio_backend.hpp"
namespace waybar::modules {
class Pulseaudio : public AButton {
class Pulseaudio : public ALabel {
public:
Pulseaudio(const std::string&, const Json::Value&);
~Pulseaudio();
auto update() -> void;
virtual ~Pulseaudio() = default;
auto update() -> void override;
private:
static void subscribeCb(pa_context*, pa_subscription_event_type_t, uint32_t, void*);
static void contextStateCb(pa_context*, void*);
static void sinkInfoCb(pa_context*, const pa_sink_info*, int, void*);
static void sourceInfoCb(pa_context*, const pa_source_info* i, int, void* data);
static void serverInfoCb(pa_context*, const pa_server_info*, void*);
static void volumeModifyCb(pa_context*, int, void*);
bool handleScroll(GdkEventScroll* e);
bool handleScroll(GdkEventScroll* e) override;
const std::vector<std::string> getPulseIcon() const;
pa_threaded_mainloop* mainloop_;
pa_mainloop_api* mainloop_api_;
pa_context* context_;
// SINK
uint32_t sink_idx_{0};
uint16_t volume_;
pa_cvolume pa_volume_;
bool muted_;
std::string port_name_;
std::string form_factor_;
std::string desc_;
std::string monitor_;
std::string current_sink_name_;
bool current_sink_running_;
// SOURCE
uint32_t source_idx_{0};
uint16_t source_volume_;
bool source_muted_;
std::string source_port_name_;
std::string source_desc_;
std::string default_source_name_;
std::shared_ptr<util::AudioBackend> backend = nullptr;
};
} // namespace waybar::modules

View File

@@ -0,0 +1,27 @@
#pragma once
#include <memory>
#include "ASlider.hpp"
#include "util/audio_backend.hpp"
namespace waybar::modules {
enum class PulseaudioSliderTarget {
Sink,
Source,
};
class PulseaudioSlider : public ASlider {
public:
PulseaudioSlider(const std::string&, const Json::Value&);
virtual ~PulseaudioSlider() = default;
void update() override;
void onValueChanged() override;
private:
std::shared_ptr<util::AudioBackend> backend = nullptr;
PulseaudioSliderTarget target = PulseaudioSliderTarget::Sink;
};
} // namespace waybar::modules

View File

@@ -0,0 +1,33 @@
#pragma once
#include <wayland-client.h>
#include "ALabel.hpp"
#include "bar.hpp"
#include "river-status-unstable-v1-client-protocol.h"
namespace waybar::modules::river {
class Layout : public waybar::ALabel {
public:
Layout(const std::string &, const waybar::Bar &, const Json::Value &);
virtual ~Layout();
// Handlers for wayland events
void handle_name(const char *name);
void handle_clear();
void handle_focused_output(struct wl_output *output);
void handle_unfocused_output(struct wl_output *output);
struct zriver_status_manager_v1 *status_manager_;
struct wl_seat *seat_;
private:
const waybar::Bar &bar_;
struct wl_output *output_; // stores the output this module belongs to
struct wl_output *focused_output_; // stores the currently focused output
struct zriver_output_status_v1 *output_status_;
struct zriver_seat_status_v1 *seat_status_;
};
} /* namespace waybar::modules::river */

View File

@@ -11,7 +11,7 @@ namespace waybar::modules::river {
class Mode : public waybar::ALabel {
public:
Mode(const std::string &, const waybar::Bar &, const Json::Value &);
~Mode();
virtual ~Mode();
// Handlers for wayland events
void handle_mode(const char *mode);

View File

@@ -14,7 +14,7 @@ namespace waybar::modules::river {
class Tags : public waybar::AModule {
public:
Tags(const std::string &, const waybar::Bar &, const Json::Value &);
~Tags();
virtual ~Tags();
// Handlers for wayland events
void handle_focused_tags(uint32_t tags);

View File

@@ -13,7 +13,7 @@ namespace waybar::modules::river {
class Window : public waybar::ALabel {
public:
Window(const std::string &, const waybar::Bar &, const Json::Value &);
~Window();
virtual ~Window();
// Handlers for wayland events
void handle_focused_view(const char *title);

View File

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

View File

@@ -4,20 +4,20 @@
#include <vector>
#include "AButton.hpp"
#include "ALabel.hpp"
#include "util/sleeper_thread.hpp"
namespace waybar::modules {
class Sndio : public AButton {
class Sndio : public ALabel {
public:
Sndio(const std::string &, const Json::Value &);
~Sndio();
auto update() -> void;
virtual ~Sndio();
auto update() -> void override;
auto set_desc(struct sioctl_desc *, unsigned int) -> void;
auto put_val(unsigned int, unsigned int) -> void;
bool handleScroll(GdkEventScroll *);
bool handleToggle(GdkEventButton *const &);
bool handleScroll(GdkEventScroll *) override;
bool handleToggle(GdkEventButton *const &) override;
private:
auto connect_to_sndio() -> void;

View File

@@ -84,6 +84,8 @@ class Item : public sigc::trackable {
// visibility of items with Status == Passive
bool show_passive_ = false;
const Bar& bar_;
Glib::RefPtr<Gio::DBus::Proxy> proxy_;
Glib::RefPtr<Gio::Cancellable> cancellable_;
std::set<std::string_view> update_pending_;

View File

@@ -13,8 +13,8 @@ namespace waybar::modules::SNI {
class Tray : public AModule {
public:
Tray(const std::string&, const Bar&, const Json::Value&);
~Tray() = default;
auto update() -> void;
virtual ~Tray() = default;
auto update() -> void override;
private:
void onAdd(std::unique_ptr<Item>& item);

View File

@@ -8,6 +8,8 @@
#include <cstring>
#include <memory>
#include <mutex>
#include <stdexcept>
#include <string>
#include "ipc.hpp"
#include "util/sleeper_thread.hpp"

View File

@@ -6,7 +6,7 @@
#include <map>
#include <string>
#include "AButton.hpp"
#include "ALabel.hpp"
#include "bar.hpp"
#include "client.hpp"
#include "modules/sway/ipc/client.hpp"
@@ -14,11 +14,11 @@
namespace waybar::modules::sway {
class Language : public AButton, public sigc::trackable {
class Language : public ALabel, public sigc::trackable {
public:
Language(const std::string& id, const Json::Value& config);
~Language() = default;
auto update() -> void;
virtual ~Language() = default;
auto update() -> void override;
private:
enum class DispayedShortFlag { None = 0, ShortName = 1, ShortDescription = 1 << 1 };

View File

@@ -2,7 +2,7 @@
#include <fmt/format.h>
#include "AButton.hpp"
#include "ALabel.hpp"
#include "bar.hpp"
#include "client.hpp"
#include "modules/sway/ipc/client.hpp"
@@ -10,11 +10,11 @@
namespace waybar::modules::sway {
class Mode : public AButton, public sigc::trackable {
class Mode : public ALabel, public sigc::trackable {
public:
Mode(const std::string&, const Json::Value&);
~Mode() = default;
auto update() -> void;
virtual ~Mode() = default;
auto update() -> void override;
private:
void onEvent(const struct Ipc::ipc_response&);

View File

@@ -15,8 +15,8 @@ namespace waybar::modules::sway {
class Scratchpad : public ALabel {
public:
Scratchpad(const std::string&, const Json::Value&);
~Scratchpad() = default;
auto update() -> void;
virtual ~Scratchpad() = default;
auto update() -> void override;
private:
auto getTree() -> void;
@@ -32,4 +32,4 @@ class Scratchpad : public ALabel {
Ipc ipc_;
util::JsonParser parser_;
};
} // namespace waybar::modules::sway
} // namespace waybar::modules::sway

View File

@@ -4,7 +4,7 @@
#include <tuple>
#include "AIconLabel.hpp"
#include "AAppIconLabel.hpp"
#include "bar.hpp"
#include "client.hpp"
#include "modules/sway/ipc/client.hpp"
@@ -12,32 +12,30 @@
namespace waybar::modules::sway {
class Window : public AIconLabel, public sigc::trackable {
class Window : public AAppIconLabel, public sigc::trackable {
public:
Window(const std::string&, const waybar::Bar&, const Json::Value&);
~Window() = default;
auto update() -> void;
virtual ~Window() = default;
auto update() -> void override;
private:
void setClass(std::string classname, bool enable);
void onEvent(const struct Ipc::ipc_response&);
void onCmd(const struct Ipc::ipc_response&);
std::tuple<std::size_t, int, std::string, std::string, std::string, std::string> getFocusedNode(
const Json::Value& nodes, std::string& output);
std::tuple<std::size_t, int, int, std::string, 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 layout_;
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_;
int floating_count_;
util::JsonParser parser_;
std::mutex mutex_;
Ipc ipc_;

View File

@@ -4,6 +4,7 @@
#include <gtkmm/button.h>
#include <gtkmm/label.h>
#include <string_view>
#include <unordered_map>
#include "AModule.hpp"
@@ -17,11 +18,13 @@ namespace waybar::modules::sway {
class Workspaces : public AModule, public sigc::trackable {
public:
Workspaces(const std::string&, const waybar::Bar&, const Json::Value&);
~Workspaces() = default;
auto update() -> void;
virtual ~Workspaces() = default;
auto update() -> void override;
private:
static inline const std::string workspace_switch_cmd_ = "workspace {} \"{}\"";
static constexpr std::string_view workspace_switch_cmd_ = "workspace {} \"{}\"";
static constexpr std::string_view persistent_workspace_switch_cmd_ =
R"(workspace {} "{}"; move workspace to output "{}"; workspace {} "{}")";
static int convertWorkspaceNameToNum(std::string name);
@@ -34,10 +37,11 @@ class Workspaces : public AModule, public sigc::trackable {
const std::string getCycleWorkspace(std::vector<Json::Value>::iterator, bool prev) const;
uint16_t getWorkspaceIndex(const std::string& name) const;
std::string trimWorkspaceName(std::string);
bool handleScroll(GdkEventScroll*);
bool handleScroll(GdkEventScroll*) override;
const Bar& bar_;
std::vector<Json::Value> workspaces_;
std::vector<std::string> high_priority_named_;
std::vector<std::string> workspaces_order_;
Gtk::Box box_;
util::JsonParser parser_;

View File

@@ -0,0 +1,30 @@
#pragma once
#include <string>
#include <giomm/dbusproxy.h>
#include "ALabel.hpp"
namespace waybar::modules {
class SystemdFailedUnits : public ALabel {
public:
SystemdFailedUnits(const std::string&, const Json::Value&);
virtual ~SystemdFailedUnits();
auto update() -> void override;
private:
bool hide_on_ok;
std::string format_ok;
bool update_pending;
std::string last_status;
uint32_t nr_failed_system, nr_failed_user;
Glib::RefPtr<Gio::DBus::Proxy> system_proxy, user_proxy;
void notify_cb(const Glib::ustring &sender_name, const Glib::ustring &signal_name,
const Glib::VariantContainerBase &arguments);
void updateData();
};
} // namespace waybar::modules

View File

@@ -4,16 +4,16 @@
#include <fstream>
#include "AButton.hpp"
#include "ALabel.hpp"
#include "util/sleeper_thread.hpp"
namespace waybar::modules {
class Temperature : public AButton {
class Temperature : public ALabel {
public:
Temperature(const std::string&, const Json::Value&);
~Temperature() = default;
auto update() -> void;
virtual ~Temperature() = default;
auto update() -> void override;
private:
float getTemperature();

View File

@@ -19,8 +19,8 @@ namespace waybar::modules::upower {
class UPower : public AModule {
public:
UPower(const std::string &, const Json::Value &);
~UPower();
auto update() -> void;
virtual ~UPower();
auto update() -> void override;
private:
typedef std::unordered_map<std::string, UpDevice *> Devices;
@@ -45,7 +45,7 @@ class UPower : public AModule {
void resetDevices();
void removeDevices();
bool show_tooltip_callback(int, int, bool, const Glib::RefPtr<Gtk::Tooltip> &tooltip);
bool handleToggle(GdkEventButton *const &);
bool handleToggle(GdkEventButton *const &) override;
std::string timeToString(gint64 time);
const std::string getDeviceStatus(UpDeviceState &state);
@@ -69,11 +69,13 @@ class UPower : public AModule {
UpDevice *displayDevice;
guint login1_id;
GDBusConnection *login1_connection;
UPowerTooltip *upower_tooltip;
std::unique_ptr<UPowerTooltip> upower_tooltip;
std::string lastStatus;
bool showAltText;
bool showIcon = true;
bool upowerRunning;
guint upowerWatcher_id;
std::string nativePath_;
};
} // namespace waybar::modules::upower

View File

@@ -2,6 +2,7 @@
#include <libupower-glib/upower.h>
#include <memory>
#include <unordered_map>
#include "gtkmm/box.h"
@@ -16,7 +17,7 @@ class UPowerTooltip : public Gtk::Window {
const std::string getDeviceIcon(UpDeviceKind& kind);
Gtk::Box* contentBox;
std::unique_ptr<Gtk::Box> contentBox;
uint iconSize;
uint tooltipSpacing;
@@ -24,7 +25,7 @@ class UPowerTooltip : public Gtk::Window {
public:
UPowerTooltip(uint iconSize, uint tooltipSpacing, uint tooltipPadding);
~UPowerTooltip();
virtual ~UPowerTooltip();
uint updateTooltip(Devices& devices);
};

View File

@@ -11,21 +11,21 @@ namespace waybar::modules {
class User : public AIconLabel {
public:
User(const std::string&, const Json::Value&);
~User() = default;
auto update() -> void;
virtual ~User() = default;
auto update() -> void override;
//todo bool handleToggle(GdkEventButton* const& e) override;
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();
std::string get_user_login() const;
std::string get_user_home_dir() const;
std::string get_default_user_avatar_path() const;
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);

View File

@@ -0,0 +1,46 @@
#pragma once
#include <fmt/format.h>
#include <wp/wp.h>
#include <algorithm>
#include <array>
#include "ALabel.hpp"
namespace waybar::modules {
class Wireplumber : public ALabel {
public:
Wireplumber(const std::string&, const Json::Value&);
virtual ~Wireplumber();
auto update() -> void override;
private:
void loadRequiredApiModules();
void prepare();
void activatePlugins();
static void updateVolume(waybar::modules::Wireplumber* self, uint32_t id);
static void updateNodeName(waybar::modules::Wireplumber* self, uint32_t id);
static void onPluginActivated(WpObject* p, GAsyncResult* res, waybar::modules::Wireplumber* self);
static void onObjectManagerInstalled(waybar::modules::Wireplumber* self);
static void onMixerChanged(waybar::modules::Wireplumber* self, uint32_t id);
static void onDefaultNodesApiChanged(waybar::modules::Wireplumber* self);
bool handleScroll(GdkEventScroll* e) override;
WpCore* wp_core_;
GPtrArray* apis_;
WpObjectManager* om_;
WpPlugin* mixer_api_;
WpPlugin* def_nodes_api_;
gchar* default_node_name_;
uint32_t pending_plugins_;
bool muted_;
double volume_;
double min_step_;
uint32_t node_id_{0};
std::string node_name_;
};
} // namespace waybar::modules

View File

@@ -40,6 +40,8 @@ class Task {
FULLSCREEN = (1 << 3),
INVALID = (1 << 4)
};
// made public so TaskBar can reorder based on configuration.
Gtk::Button button;
private:
static uint32_t global_id;
@@ -53,7 +55,6 @@ class Task {
uint32_t id_;
Gtk::Button button_;
Gtk::Box content_;
Gtk::Image icon_;
Gtk::Label text_before_;

View File

@@ -22,7 +22,7 @@ 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);
zext_workspace_handle_v1 *workspace, uint32_t id, std::string name);
~Workspace();
auto update() -> void;
@@ -30,11 +30,15 @@ class Workspace {
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); }
auto is_empty() const -> bool { return state_ & static_cast<uint32_t>(State::EMPTY); }
auto is_persistent() const -> bool { return persistent_; }
// 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 make_persistent() -> void;
auto handle_duplicate() -> void;
auto handle_done() -> void;
auto handle_clicked(GdkEventButton *bt) -> bool;
@@ -48,6 +52,7 @@ class Workspace {
ACTIVE = (1 << 0),
URGENT = (1 << 1),
HIDDEN = (1 << 2),
EMPTY = (1 << 3),
};
private:
@@ -67,6 +72,7 @@ class Workspace {
static std::map<std::string, std::string> icons_map_;
std::string format_;
bool with_icon_ = false;
bool persistent_ = false;
Gtk::Button button_;
Gtk::Box content_;
@@ -87,11 +93,14 @@ class WorkspaceGroup {
auto active_only() const -> bool;
auto creation_delayed() const -> bool;
auto workspaces() -> std::vector<std::unique_ptr<Workspace>> & { return workspaces_; }
auto persistent_workspaces() -> std::vector<std::string> & { return persistent_workspaces_; }
auto sort_workspaces() -> void;
auto set_need_to_sort() -> void { need_to_sort = true; }
auto add_button(Gtk::Button &button) -> void;
auto remove_button(Gtk::Button &button) -> void;
auto fill_persistent_workspaces() -> void;
auto create_persistent_workspaces() -> void;
// wlr stuff
auto handle_workspace_create(zext_workspace_handle_v1 *workspace_handle) -> void;
@@ -115,6 +124,8 @@ class WorkspaceGroup {
uint32_t id_;
std::vector<std::unique_ptr<Workspace>> workspaces_;
bool need_to_sort = false;
std::vector<std::string> persistent_workspaces_;
bool persistent_created_ = false;
};
class WorkspaceManager : public AModule {

View File

@@ -52,7 +52,7 @@ struct SafeSignal : 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::emit;
using signal_t::make_slot;
void handle_event() {

View File

@@ -0,0 +1,95 @@
#pragma once
#include <json/value.h>
#include <pulse/context.h>
#include <pulse/introspect.h>
#include <pulse/thread-mainloop.h>
#include <pulse/volume.h>
#include <functional>
#include <memory>
#include <string>
#include "util/backend_common.hpp"
namespace waybar::util {
class AudioBackend {
private:
static void subscribeCb(pa_context*, pa_subscription_event_type_t, uint32_t, void*);
static void contextStateCb(pa_context*, void*);
static void sinkInfoCb(pa_context*, const pa_sink_info*, int, void*);
static void sourceInfoCb(pa_context*, const pa_source_info* i, int, void* data);
static void serverInfoCb(pa_context*, const pa_server_info*, void*);
static void volumeModifyCb(pa_context*, int, void*);
pa_threaded_mainloop* mainloop_;
pa_mainloop_api* mainloop_api_;
pa_context* context_;
pa_cvolume pa_volume_;
// SINK
uint32_t sink_idx_{0};
uint16_t volume_;
bool muted_;
std::string port_name_;
std::string form_factor_;
std::string desc_;
std::string monitor_;
std::string current_sink_name_;
bool current_sink_running_;
// SOURCE
uint32_t source_idx_{0};
uint16_t source_volume_;
bool source_muted_;
std::string source_port_name_;
std::string source_desc_;
std::string default_source_name_;
std::vector<std::string> ignored_sinks_;
std::function<void()> on_updated_cb_ = NOOP;
/* Hack to keep constructor inaccessible but still public.
* This is required to be able to use std::make_shared.
* It is important to keep this class only accessible via a reference-counted
* pointer because the destructor will manually free memory, and this could be
* a problem with C++20's copy and move semantics.
*/
struct private_constructor_tag {};
public:
static std::shared_ptr<AudioBackend> getInstance(std::function<void()> on_updated_cb = NOOP);
AudioBackend(std::function<void()> on_updated_cb, private_constructor_tag tag);
~AudioBackend();
void changeVolume(uint16_t volume, uint16_t min_volume = 0, uint16_t max_volume = 100);
void changeVolume(ChangeType change_type, double step = 1, uint16_t max_volume = 100);
void setIgnoredSinks(const Json::Value& config);
std::string getSinkPortName() const { return port_name_; }
std::string getFormFactor() const { return form_factor_; }
std::string getSinkDesc() const { return desc_; }
std::string getMonitor() const { return monitor_; }
std::string getCurrentSinkName() const { return current_sink_name_; }
bool getCurrentSinkRunning() const { return current_sink_running_; }
uint16_t getSinkVolume() const { return volume_; }
bool getSinkMuted() const { return muted_; }
uint16_t getSourceVolume() const { return source_volume_; }
bool getSourceMuted() const { return source_muted_; }
std::string getSourcePortName() const { return source_port_name_; }
std::string getSourceDesc() const { return source_desc_; }
std::string getDefaultSourceName() const { return default_source_name_; }
void toggleSinkMute();
void toggleSinkMute(bool);
void toggleSourceMute();
void toggleSourceMute(bool);
bool isBluetooth();
};
} // namespace waybar::util

View File

@@ -0,0 +1,10 @@
#pragma once
#include "AModule.hpp"
namespace waybar::util {
const static auto NOOP = []() {};
enum class ChangeType : char { Increase, Decrease };
} // namespace waybar::util

View File

@@ -0,0 +1,93 @@
#pragma once
#include <libudev.h>
#include <spdlog/spdlog.h>
#include <chrono>
#include <mutex>
#include <optional>
#include <string>
#include <string_view>
#include <vector>
#include "giomm/dbusproxy.h"
#include "util/backend_common.hpp"
#include "util/sleeper_thread.hpp"
#define GET_BEST_DEVICE(varname, backend, preferred_device) \
decltype((backend).devices_) __devices; \
{ \
std::scoped_lock<std::mutex> lock((backend).udev_thread_mutex_); \
__devices = (backend).devices_; \
} \
auto varname = (backend).best_device(__devices.cbegin(), __devices.cend(), preferred_device);
namespace waybar::util {
class BacklightDevice {
public:
BacklightDevice() = default;
BacklightDevice(std::string name, int actual, int max, bool powered);
std::string name() const;
int get_actual() const;
void set_actual(int actual);
int get_max() const;
void set_max(int max);
bool get_powered() const;
void set_powered(bool powered);
friend inline bool operator==(const BacklightDevice &lhs, const BacklightDevice &rhs) {
return lhs.name_ == rhs.name_ && lhs.actual_ == rhs.actual_ && lhs.max_ == rhs.max_;
}
private:
std::string name_;
int actual_ = 1;
int max_ = 1;
bool powered_ = true;
};
class BacklightBackend {
public:
BacklightBackend(std::chrono::milliseconds interval, std::function<void()> on_updated_cb = NOOP);
// const inline BacklightDevice *get_best_device(std::string_view preferred_device);
const BacklightDevice *get_previous_best_device();
void set_previous_best_device(const BacklightDevice *device);
void set_brightness(std::string preferred_device, ChangeType change_type, double step);
void set_scaled_brightness(std::string preferred_device, int brightness);
int get_scaled_brightness(std::string preferred_device);
template <class ForwardIt, class Inserter>
static void upsert_device(ForwardIt first, ForwardIt last, Inserter inserter, udev_device *dev);
template <class ForwardIt, class Inserter>
static void enumerate_devices(ForwardIt first, ForwardIt last, Inserter inserter, udev *udev);
bool is_login_proxy_initialized() const { return static_cast<bool>(login_proxy_); }
template <class ForwardIt>
static const BacklightDevice *best_device(ForwardIt first, ForwardIt last, std::string_view);
std::vector<BacklightDevice> devices_;
std::mutex udev_thread_mutex_;
private:
void set_brightness_internal(std::string device_name, int brightness, int max_brightness);
std::function<void()> on_updated_cb_;
std::chrono::milliseconds polling_interval_;
std::optional<BacklightDevice> previous_best_;
// thread must destruct before shared data
util::SleeperThread udev_thread_;
Glib::RefPtr<Gio::DBus::Proxy> login_proxy_;
static constexpr int EPOLL_MAX_EVENTS = 16;
};
} // namespace waybar::util

View File

@@ -989,7 +989,7 @@ struct Help : Opt {
showHelpFlag = flag;
return ParserResult::ok(ParseResultType::ShortCircuitAll);
}) {
static_cast<Opt &> (*this)("display usage information")["-?"]["-h"]["--help"].optional();
static_cast<Opt &>(*this)("display usage information")["-?"]["-h"]["--help"].optional();
}
};

View File

@@ -1,5 +1,6 @@
#pragma once
#include <fcntl.h>
#include <giomm.h>
#include <spdlog/spdlog.h>
#include <sys/wait.h>
@@ -65,10 +66,14 @@ inline int close(FILE* fp, pid_t pid) {
return stat;
}
inline FILE* open(const std::string& cmd, int& pid) {
inline FILE* open(const std::string& cmd, int& pid, const std::string& output_name) {
if (cmd == "") return nullptr;
int fd[2];
if (pipe(fd) != 0) {
// Open the pipe with the close-on-exec flag set, so it will not be inherited
// by any other subprocesses launched by other threads (which could result in
// the pipe staying open after this child dies, causing us to hang when trying
// to read from it)
if (pipe2(fd, O_CLOEXEC) != 0) {
spdlog::error("Unable to pipe fd");
return nullptr;
}
@@ -77,6 +82,8 @@ inline FILE* open(const std::string& cmd, int& pid) {
if (child_pid < 0) {
spdlog::error("Unable to exec cmd {}, error {}", cmd.c_str(), strerror(errno));
::close(fd[0]);
::close(fd[1]);
return nullptr;
}
@@ -102,6 +109,9 @@ inline FILE* open(const std::string& cmd, int& pid) {
::close(fd[0]);
dup2(fd[1], 1);
setpgid(child_pid, child_pid);
if (output_name != "") {
setenv("WAYBAR_OUTPUT_NAME", output_name.c_str(), 1);
}
execlp("/bin/sh", "sh", "-c", cmd.c_str(), (char*)0);
exit(0);
} else {
@@ -111,9 +121,9 @@ inline FILE* open(const std::string& cmd, int& pid) {
return fdopen(fd[0], "r");
}
inline struct res exec(const std::string& cmd) {
inline struct res exec(const std::string& cmd, const std::string& output_name) {
int pid;
auto fp = command::open(cmd, pid);
auto fp = command::open(cmd, pid, output_name);
if (!fp) return {-1, ""};
auto output = command::read(fp);
auto stat = command::close(fp, pid);
@@ -122,7 +132,7 @@ inline struct res exec(const std::string& cmd) {
inline struct res execNoRead(const std::string& cmd) {
int pid;
auto fp = command::open(cmd, pid);
auto fp = command::open(cmd, pid, "");
if (!fp) return {-1, ""};
auto stat = command::close(fp, pid);
return {WEXITSTATUS(stat), ""};

81
include/util/date.hpp Normal file
View File

@@ -0,0 +1,81 @@
#pragma once
#include <chrono>
#if HAVE_CHRONO_TIMEZONES
#include <format>
#else
#include <date/tz.h>
#include <fmt/format.h>
#include <regex>
#endif
// Date
namespace date {
#if HAVE_CHRONO_TIMEZONES
using namespace std::chrono;
using namespace std;
#else
using system_clock = std::chrono::system_clock;
using seconds = std::chrono::seconds;
template <typename T>
inline auto format(const char* spec, const T& arg) {
return date::format(std::regex_replace(spec, std::regex("\\{:L|\\}"), ""), arg);
}
template <typename T>
inline auto format(const std::locale& loc, const char* spec, const T& arg) {
return date::format(loc, std::regex_replace(spec, std::regex("\\{:L|\\}"), ""), arg);
}
constexpr decltype(auto) operator""d(unsigned long long d) noexcept {
return date::operator""_d(d); // very verbose, but it works
}
#endif
} // namespace date
// Format
namespace waybar::util::date::format {
#if HAVE_CHRONO_TIMEZONES
using namespace std;
#else
using namespace fmt;
#endif
} // namespace waybar::util::date::format
#if not HAVE_CHRONO_TIMEZONES
template <typename Duration, typename TimeZonePtr>
struct fmt::formatter<date::zoned_time<Duration, TimeZonePtr>> {
std::string_view specs;
template <typename ParseContext>
constexpr auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {
auto it = ctx.begin();
if (it != ctx.end() && *it == ':') {
++it;
}
auto end = it;
while (end != ctx.end() && *end != '}') {
++end;
}
if (end != it) {
specs = {it, std::string_view::size_type(end - it)};
}
return end;
}
template <typename FormatContext>
auto format(const date::zoned_time<Duration, TimeZonePtr>& ztime, FormatContext& ctx) {
if (ctx.locale()) {
const auto loc = ctx.locale().template get<std::locale>();
return fmt::format_to(ctx.out(), "{}", date::format(loc, fmt::to_string(specs), ztime));
}
return fmt::format_to(ctx.out(), "{}", date::format(fmt::to_string(specs), ztime));
}
};
#endif
using namespace date;

19
include/util/enum.hpp Normal file
View File

@@ -0,0 +1,19 @@
#pragma once
#include <map>
#include <stdexcept>
#include <string>
namespace waybar::util {
template <typename EnumType>
struct EnumParser {
public:
EnumParser();
~EnumParser();
EnumType parseStringToEnum(const std::string& str,
const std::map<std::string, EnumType>& enumMap);
};
} // namespace waybar::util

View File

@@ -66,9 +66,9 @@ struct formatter<pow_format> {
std::string string;
switch (spec) {
case '>':
return format_to(ctx.out(), "{:>{}}", fmt::format("{}", s), max_width);
return fmt::format_to(ctx.out(), "{:>{}}", fmt::format("{}", s), max_width);
case '<':
return format_to(ctx.out(), "{:<{}}", fmt::format("{}", s), max_width);
return fmt::format_to(ctx.out(), "{:<{}}", fmt::format("{}", s), max_width);
case '=':
format = "{coefficient:<{number_width}.1f}{padding}{prefix}{unit}";
break;
@@ -77,8 +77,8 @@ struct formatter<pow_format> {
format = "{coefficient:.1f}{prefix}{unit}";
break;
}
return format_to(
ctx.out(), format, fmt::arg("coefficient", fraction),
return fmt::format_to(
ctx.out(), fmt::runtime(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_),
@@ -92,8 +92,8 @@ struct formatter<pow_format> {
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);
auto format(const Glib::ustring& value, FormatContext& ctx) const {
return formatter<std::string>::format(static_cast<std::string>(value), ctx);
}
};
} // namespace fmt

14
include/util/gtk_icon.hpp Normal file
View File

@@ -0,0 +1,14 @@
#pragma once
#include <gtkmm/icontheme.h>
#include <mutex>
#include <string>
class DefaultGtkIconThemeWrapper {
private:
static std::mutex default_theme_mutex;
public:
static bool has_icon(const std::string&);
static Glib::RefPtr<Gdk::Pixbuf> load_icon(const char*, int, Gtk::IconLookupFlags);
};

View File

@@ -0,0 +1,40 @@
#pragma once
#include <pipewire/pipewire.h>
#include "util/backend_common.hpp"
#include "util/pipewire/privacy_node_info.hpp"
namespace waybar::util::PipewireBackend {
class PipewireBackend {
private:
pw_thread_loop* mainloop_;
pw_context* context_;
pw_core* core_;
spa_hook registry_listener;
/* Hack to keep constructor inaccessible but still public.
* This is required to be able to use std::make_shared.
* It is important to keep this class only accessible via a reference-counted
* pointer because the destructor will manually free memory, and this could be
* a problem with C++20's copy and move semantics.
*/
struct private_constructor_tag {};
public:
std::mutex mutex_;
pw_registry* registry;
sigc::signal<void> privacy_nodes_changed_signal_event;
std::unordered_map<uint32_t, PrivacyNodeInfo*> privacy_nodes;
static std::shared_ptr<PipewireBackend> getInstance();
PipewireBackend(private_constructor_tag tag);
~PipewireBackend();
};
} // namespace waybar::util::PipewireBackend

View File

@@ -0,0 +1,62 @@
#pragma once
#include <pipewire/pipewire.h>
#include <string>
#include "util/gtk_icon.hpp"
namespace waybar::util::PipewireBackend {
enum PrivacyNodeType {
PRIVACY_NODE_TYPE_NONE,
PRIVACY_NODE_TYPE_VIDEO_INPUT,
PRIVACY_NODE_TYPE_AUDIO_INPUT,
PRIVACY_NODE_TYPE_AUDIO_OUTPUT
};
class PrivacyNodeInfo {
public:
PrivacyNodeType type = PRIVACY_NODE_TYPE_NONE;
uint32_t id;
uint32_t client_id;
enum pw_node_state state = PW_NODE_STATE_IDLE;
std::string media_class;
std::string media_name;
std::string node_name;
std::string application_name;
std::string pipewire_access_portal_app_id;
std::string application_icon_name;
struct spa_hook object_listener;
struct spa_hook proxy_listener;
void *data;
std::string get_name() {
const std::vector<std::string *> names{&application_name, &node_name};
std::string name = "Unknown Application";
for (auto &name_ : names) {
if (name_ != nullptr && name_->length() > 0) {
name = *name_;
name[0] = toupper(name[0]);
break;
}
}
return name;
}
std::string get_icon_name() {
const std::vector<std::string *> names{&application_icon_name, &pipewire_access_portal_app_id,
&application_name, &node_name};
const std::string name = "application-x-executable-symbolic";
for (auto &name_ : names) {
if (name_ != nullptr && name_->length() > 0 && DefaultGtkIconThemeWrapper::has_icon(*name_)) {
return *name_;
}
}
return name;
}
};
} // namespace waybar::util::PipewireBackend

38
include/util/portal.hpp Normal file
View File

@@ -0,0 +1,38 @@
#include <giomm/dbusproxy.h>
#include <string>
#include "fmt/format.h"
namespace waybar {
using namespace Gio;
enum class Appearance {
UNKNOWN = 0,
DARK = 1,
LIGHT = 2,
};
class Portal : private DBus::Proxy {
public:
Portal();
void refreshAppearance();
Appearance getAppearance();
typedef sigc::signal<void(Appearance)> type_signal_appearance_changed;
type_signal_appearance_changed signal_appearance_changed() { return m_signal_appearance_changed; }
private:
type_signal_appearance_changed m_signal_appearance_changed;
Appearance currentMode;
void on_signal(const Glib::ustring& sender_name, const Glib::ustring& signal_name,
const Glib::VariantContainerBase& parameters);
};
} // namespace waybar
template <>
struct fmt::formatter<waybar::Appearance> : formatter<fmt::string_view> {
// parse is inherited from formatter<string_view>.
auto format(waybar::Appearance c, format_context& ctx) const;
};

View File

@@ -0,0 +1,9 @@
#pragma once
#include "SafeSignal.hpp"
namespace waybar::util {
// Get a signal emited with value true when entering sleep, and false when exiting
SafeSignal<bool>& prepare_for_sleep();
} // namespace waybar::util

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