mirror of
https://github.com/rad4day/Waybar.git
synced 2023-12-21 10:22:59 +01:00
Compare commits
1652 Commits
Author | SHA1 | Date | |
---|---|---|---|
f0bead34d4 | |||
d6bd440027 | |||
c692d7bf64 | |||
2045aac5b0 | |||
a92223c316 | |||
24d03d13ce | |||
b3b5d8f9ab | |||
86850f5c7a | |||
0bc5314e08 | |||
1d6cfe7ce6 | |||
2a3ebc12de | |||
1938bb5d28 | |||
a35861b3b9 | |||
8b512e7b22 | |||
fb083f93dc | |||
f795e7a308 | |||
21abd4f9f9 | |||
f724cc3f9d | |||
bfbb2f9a40 | |||
91357f210d | |||
3e48551f25 | |||
c05f41d732 | |||
4d59de42af | |||
6e296838e4 | |||
e00e36981e | |||
4136ffaecb | |||
bd199e414b | |||
531bdfb8bb | |||
c1ea7626b9 | |||
995802e8ae | |||
0079092699 | |||
b5c686c0dd | |||
4c4d09992e | |||
9218968d2f | |||
a08967e008 | |||
272c638f7e | |||
57ad7f9536 | |||
2a76d8e5b9 | |||
c5babb4c44 | |||
328575a721 | |||
ea9078d887 | |||
b1833b1f36 | |||
53e89dace7 | |||
3cbcef61cf | |||
22084691ff | |||
f4afa59861 | |||
ce8c13788a | |||
b74f3c7aaa | |||
2111865efe | |||
94d6ae9741 | |||
e6760bf9dd | |||
7671ccfbc6 | |||
459541ed89 | |||
da3d9533d1 | |||
8db1996ccc | |||
cfef78a5bc | |||
60fa5e9f67 | |||
cea59ddc6c | |||
3730793197 | |||
d2b4076ac8 | |||
e63e3a0ca9 | |||
99d370d9ed | |||
80b2b29a77 | |||
27ad9ec267 | |||
9eb6c4e296 | |||
748c6125d0 | |||
235861fd3d | |||
5e9bbe5c76 | |||
74fa131ebe | |||
2c7cb0e9d4 | |||
ce8ae5bf17 | |||
062e7bb9b4 | |||
3acd31c3e9 | |||
456e06c4b5 | |||
a2751cfcd6 | |||
d9cc995405 | |||
00a2ebf00d | |||
c2f98d07ef | |||
833dcc1bb8 | |||
8c24e26f0e | |||
56b4a11a9c | |||
1111763251 | |||
769858fbb4 | |||
2695815bcc | |||
49afb87e34 | |||
5250123dcb | |||
c0b3e9ee35 | |||
454ba610f4 | |||
3718902b9d | |||
9f0a14c22b | |||
781da93f3d | |||
8f4f67f69f | |||
8be5bab8ad | |||
d02e23c759 | |||
d2b22c6ec5 | |||
ed898cd211 | |||
1a1c617520 | |||
253222d31c | |||
51e6fc6250 | |||
af1668dfd0 | |||
cf5877073a | |||
bd567800c9 | |||
6477e539d0 | |||
242e19a07d | |||
0e53c37d6b | |||
3030850b22 | |||
92cc01f401 | |||
d48eebd4d3 | |||
eb705533b5 | |||
3cf027fc56 | |||
09120caf17 | |||
73495df377 | |||
fd417c0805 | |||
afa590f781 | |||
df36ac3408 | |||
ebdf575d45 | |||
a4d27ea806 | |||
a10266ceee | |||
31137c30fb | |||
c374c412d3 | |||
2fec1d4907 | |||
be28ee3d7e | |||
2d7e21ed7d | |||
930a3e168b | |||
7948d03d25 | |||
ff61e7bf4e | |||
64849f52c9 | |||
1374b0fce4 | |||
1ceaff27c2 | |||
527017baca | |||
f330e51472 | |||
411c6f4b4b | |||
e8e8ccb6cf | |||
a24f2d72a7 | |||
ffa458223d | |||
aa8bd51952 | |||
05dbfe261a | |||
1f591e36f1 | |||
d0677c1801 | |||
c18c6b080a | |||
7240611d87 | |||
e1045381fe | |||
e660a3634d | |||
54e04b5a30 | |||
662a250705 | |||
f72c1a54d3 | |||
6b221133c2 | |||
d01fda6fae | |||
692b90c995 | |||
dea2d721eb | |||
72a2ada82c | |||
6156a62294 | |||
d4d35e2f89 | |||
a58988ea9d | |||
0ada5ac8b0 | |||
1421163df3 | |||
9d5f0e45c0 | |||
45e44e03bd | |||
830c5cd5d0 | |||
90f206f92a | |||
59e7f1974c | |||
97ae2ff343 | |||
3d63080346 | |||
cb842d9d50 | |||
a7e6330078 | |||
93807b0b3e | |||
6e73c58e60 | |||
209225e381 | |||
7746328daa | |||
c7d475ee86 | |||
4ed13df092 | |||
33c3ab35a8 | |||
4dfea72db0 | |||
504132dc55 | |||
debbfccf07 | |||
56ec72c31c | |||
27c6c96b37 | |||
8551c4bbe3 | |||
58362abfaf | |||
2abeba2b52 | |||
bfa3adcfd6 | |||
2db6fc8b1b | |||
c2dd296d31 | |||
5b0c5ea9ce | |||
c7bb0ae0af | |||
b2f90dffe1 | |||
f86dff60e6 | |||
1db3c55b48 | |||
35254ee834 | |||
9a0013cb10 | |||
cca5227210 | |||
cf9d98a0be | |||
015409acaf | |||
2b735f44bc | |||
8fa5d9b838 | |||
0012bcbd74 | |||
b8322c4b4b | |||
07050cf354 | |||
ddf3e11240 | |||
1ca660460a | |||
0898236586 | |||
c3e91cd228 | |||
c500c7d9a1 | |||
5da45ece9d | |||
024777a5bc | |||
9758833027 | |||
9a958f6848 | |||
9e03bb61c7 | |||
710f89599e | |||
d1700bf202 | |||
e1b31db42b | |||
52e9f624be | |||
e75eafcb34 | |||
6558a156b3 | |||
faf8954712 | |||
e58f1fd3e0 | |||
6b83360e76 | |||
03ca8de6d7 | |||
ac193ae669 | |||
38d2815425 | |||
79f21c0d7b | |||
0306c97173 | |||
8a82cdff16 | |||
29bdff5314 | |||
eb017347b8 | |||
912d7f8588 | |||
5647146ac0 | |||
af2a3f8bda | |||
55e83f90d1 | |||
0d94853613 | |||
120c68e014 | |||
4deb6d812d | |||
bc201fd0eb | |||
d2ff116c92 | |||
e3342467fc | |||
ce10ce0d5e | |||
4a929240df | |||
33d13af6d1 | |||
90878a5c98 | |||
0d27949f0a | |||
f6322d2dd1 | |||
330d166c82 | |||
5f2dd99e6d | |||
8b03e38594 | |||
5944989a8a | |||
58a399b9af | |||
dcd75b3b40 | |||
17f91391b6 | |||
061f4550f4 | |||
fd24d7bcf6 | |||
51670f0506 | |||
4e930ba50a | |||
8839a86afe | |||
f4bfe777d9 | |||
59e57ab9a0 | |||
f00f30a5ae | |||
40bc2e96db | |||
9ac9dc368e | |||
39c170bf10 | |||
5fea01300c | |||
b181cd04b6 | |||
d786f9a0e6 | |||
c5910ae19a | |||
ed6467e785 | |||
43c3ca1d38 | |||
97f0d6fa42 | |||
b8a68b8085 | |||
8881b9a6ef | |||
e8942feefc | |||
a23d58e900 | |||
16d5619f3b | |||
bcee4e15d3 | |||
b7bd06ad8f | |||
e50c246601 | |||
ee504b826d | |||
848ae1f818 | |||
406eb0ee9a | |||
112d481ae7 | |||
872cd6083d | |||
8dc78e4e40 | |||
e662b8c624 | |||
e0451816e2 | |||
e2e59a52df | |||
123ed36739 | |||
c64058c947 | |||
56d46e62c1 | |||
89a57f6722 | |||
4336f10b29 | |||
a7979a3e56 | |||
bfed2114e4 | |||
f65a372855 | |||
6f3fe6d339 | |||
c287b0c82b | |||
5b1cd65e20 | |||
99ed2bb7fa | |||
ddd5b4e157 | |||
e9e5780aae | |||
061ad13082 | |||
77bea7c182 | |||
c2ab2e6d19 | |||
11239a4900 | |||
95b5348c24 | |||
9616df58da | |||
7b115913de | |||
4029c5423f | |||
3996764880 | |||
60821257ac | |||
e14005a6aa | |||
15dbe8965e | |||
decc5bcd68 | |||
92870cab2a | |||
4cb2cc9f21 | |||
02df861829 | |||
23eaffc04b | |||
714451e4f9 | |||
4cd6024f07 | |||
8b5f42d934 | |||
b65c976bc1 | |||
5e7c9378df | |||
a9569e7d5c | |||
318a6e0969 | |||
a1d046b2e7 | |||
c7b09eea11 | |||
bc8517fd08 | |||
9439e4183c | |||
8fc8bb40bf | |||
d906080f26 | |||
04d66de866 | |||
699f732146 | |||
f437bf96e3 | |||
fc9a390977 | |||
56a45e962b | |||
48d2759df5 | |||
1116ff0d67 | |||
0c04aea108 | |||
a44622aa9f | |||
3117aefdf3 | |||
24a8332b62 | |||
84e7689521 | |||
0708573fa4 | |||
08d472d1b1 | |||
c35f91ed7a | |||
9c3af1b6ad | |||
17b60bc737 | |||
c1f92d2a3c | |||
72f478c195 | |||
5128a5d9f3 | |||
36aa22189b | |||
d10d9b8202 | |||
e57899c0c5 | |||
249c0aad73 | |||
18a4f87a59 | |||
458c03bf95 | |||
1b4a7b02f4 | |||
fb2ac8a765 | |||
13100326b0 | |||
ca0d35286d | |||
f3a049c6df | |||
074b7c4b99 | |||
b24fd35add | |||
c27dab9379 | |||
6857691679 | |||
a475be7cf7 | |||
00c11c64ca | |||
4e2305639b | |||
e0f29dbf71 | |||
36d3d511d6 | |||
ae9fb57790 | |||
b8ee448e71 | |||
632058a4f6 | |||
d25278f710 | |||
2dfd64e1c9 | |||
3c182c9ca9 | |||
aa5f55bbe3 | |||
7ab9a560ae | |||
a5299af3c2 | |||
4d1aeb7eb8 | |||
38a846ae51 | |||
03bbc9df64 | |||
1e4fe0bee8 | |||
5e2067d51f | |||
7ea0a2348b | |||
fd306e184a | |||
f4f2989e85 | |||
8d4c7176f8 | |||
7abcbe80e5 | |||
165c5a861d | |||
d84c0f13e6 | |||
01ffe2c290 | |||
b900c01381 | |||
e2b676b800 | |||
7f995507fe | |||
b39a8ede6c | |||
315ea991bc | |||
bd0f6128d3 | |||
5a014305ec | |||
3411236697 | |||
e615612bf4 | |||
448b413eca | |||
7b7ee41e13 | |||
9bc821bdac | |||
bfcb936d87 | |||
3d023a0421 | |||
e235f48245 | |||
3043d42a89 | |||
733fb8c62a | |||
954bed3f5e | |||
13df878bc3 | |||
4592dd4a6c | |||
794610a1ca | |||
7bbf7c99a3 | |||
eec0a8255f | |||
638b4e6573 | |||
caee2e611f | |||
96746142d2 | |||
1af7191740 | |||
89be55b00b | |||
23369aa14c | |||
a16e54573e | |||
7231c47244 | |||
6184e43c84 | |||
3f123d9c4e | |||
6851e26450 | |||
fc6f5741b1 | |||
264e2c3983 | |||
45988b3dbb | |||
4e3f91d237 | |||
e5d05baba3 | |||
7763d50691 | |||
5a0e42cc76 | |||
1dcd36b06c | |||
93f9b3d213 | |||
54b1df69a9 | |||
73cd156a7a | |||
e3700b924e | |||
d87cf8a8f2 | |||
e8b022c096 | |||
503fe9a7ea | |||
b812596080 | |||
13fdbc13c3 | |||
1071b9f7c5 | |||
6ad1f6b853 | |||
a1129c4c87 | |||
2e12ea6a81 | |||
f2fcadbf62 | |||
168ba2ca5b | |||
46f07d24dd | |||
ed3e2ffdc3 | |||
d5b76bd8b5 | |||
1d03034fbb | |||
e094480684 | |||
f4cc088d2f | |||
b086e2f995 | |||
4a457648f9 | |||
3a95f8f599 | |||
a7ed1ed570 | |||
e0f0931e2d | |||
0140606226 | |||
1d2a381b5f | |||
d1d73b5003 | |||
9dc09d2702 | |||
2ca4dcac49 | |||
2d87bcb1ab | |||
d4a07483b2 | |||
84dc82e1c1 | |||
e06316c80b | |||
7b071567ea | |||
2633ff3fb9 | |||
0764e9ad6e | |||
c4282cfacc | |||
05effad18b | |||
5f19a54deb | |||
7fac2afb85 | |||
4196e0d5d1 | |||
14a2a7027f | |||
2b2ac311d5 | |||
d7a030daf3 | |||
7345918f84 | |||
105f1cefe1 | |||
175d82858b | |||
c8d785071f | |||
8c6063d181 | |||
799125fb73 | |||
fcf93a6c45 | |||
6946288053 | |||
2a563f54e7 | |||
9f337db2d2 | |||
136b47ce0d | |||
6eb187a23e | |||
9b9e42fc5f | |||
d47073ef13 | |||
5396ffb71f | |||
5e9faeb2d0 | |||
4ee81c8dea | |||
a37ef74fb1 | |||
07034d561c | |||
37d87be3c1 | |||
8aee7492d4 | |||
5c1c07a035 | |||
caa24f0647 | |||
f4c6dfcddc | |||
2b3fc3acff | |||
25536f70a4 | |||
74ca1a42c6 | |||
8b6bc215cc | |||
3c1ba0a240 | |||
6c7acf18b5 | |||
ead1b2f0dc | |||
115c6e36e6 | |||
210f4454f0 | |||
77d8376fef | |||
0e580236ce | |||
1aa7587cac | |||
b6655e475b | |||
903fc2b6a2 | |||
50fc63b749 | |||
383d999fec | |||
56ebb09e5f | |||
35d6da3965 | |||
be1d2a02ca | |||
5e7ba0c9e3 | |||
18717d4b12 | |||
4dc1989744 | |||
54085dbde0 | |||
4635e8c5f8 | |||
adc67b6f75 | |||
ebe4424795 | |||
e3f56b8110 | |||
8f3fbebede | |||
a595b61e0f | |||
ccce2b700b | |||
91339f6ad4 | |||
41dea6e46c | |||
3c18c43b9a | |||
ac20428fdf | |||
65c3f0a132 | |||
e6262b870c | |||
ad5ea7ad2b | |||
851508df5e | |||
fc818dd794 | |||
823ed887ab | |||
3bf815f6de | |||
c1cda1553a | |||
f6ee90e5ba | |||
e066e3080e | |||
1a93a6cfa5 | |||
d5c400c0cc | |||
074b559da5 | |||
7a61a00fb3 | |||
d4da04a750 | |||
f3819ee954 | |||
2697d432a4 | |||
061cb76fc4 | |||
6c188455a4 | |||
12caae8fd2 | |||
26ea6fae32 | |||
26419e45b7 | |||
6be741afc9 | |||
c80cc873af | |||
2b42872b6c | |||
895bc878f8 | |||
a0ee9e7fc1 | |||
941cf47693 | |||
32d42749f9 | |||
96caa9f094 | |||
f4f1267a71 | |||
bcadf64031 | |||
8974bbf7b4 | |||
1c08d26af0 | |||
c4cc7ae396 | |||
65dd245362 | |||
667d0a45f4 | |||
53fc750fc3 | |||
27df7a9aa7 | |||
d575646c2d | |||
a650c7d90c | |||
3a6e5be59d | |||
81f0bcb3a3 | |||
9ae99c2621 | |||
5abdecc402 | |||
1540797cd9 | |||
5d8bc35476 | |||
5c574975b7 | |||
18cbd2aa1a | |||
ce404199de | |||
7f6bef2049 | |||
1489a539f8 | |||
766c8a1035 | |||
8c41aaae04 | |||
c0d84853ea | |||
2301788a81 | |||
d22d6a4522 | |||
d9b5c2595a | |||
4a85ec0f59 | |||
621d686310 | |||
812832d38a | |||
19069482e2 | |||
1e560cf0c9 | |||
0c9cdf7e0b | |||
5a4f7a70ef | |||
ce56a80792 | |||
db95644d26 | |||
548bd2ab1a | |||
7b9b10afc6 | |||
8ec321ddaf | |||
13d25d403e | |||
3218612d3b | |||
9bc86347be | |||
d1f8b42d22 | |||
0e3be30e01 | |||
795246263f | |||
89a8bd976e | |||
9b399ea2bb | |||
9608e0dabf | |||
1d1cfda90d | |||
ad20c0af2d | |||
eae65099d0 | |||
39f42cdd7e | |||
f573e32d0b | |||
5cbbd65ac4 | |||
2240c79b1a | |||
ece86c96d7 | |||
9e8a71c4ef | |||
7069429c03 | |||
d41a60d2d9 | |||
05f7727dae | |||
9bc6fae15b | |||
9dac851f6d | |||
b6e24bd527 | |||
b6d0a4b63f | |||
cf5ddb2a5e | |||
4b5dc1bb3a | |||
22ff26252b | |||
a832814b41 | |||
2fb671f5fa | |||
3c2fa1625d | |||
d5112678c3 | |||
0c18e57937 | |||
b4e19678b7 | |||
8fe42ebd2e | |||
bb7b376fa6 | |||
89afa8e149 | |||
59040c53e4 | |||
02560a6537 | |||
0472d279e4 | |||
166504256a | |||
2290fe10aa | |||
9fa7bfc0cb | |||
6712cd05a3 | |||
977d21b5f6 | |||
0a4841371b | |||
deab028e52 | |||
c51a973d60 | |||
5a5f8c3b9f | |||
b1dc3005b7 | |||
98f7a10a51 | |||
23991b6543 | |||
331dfa87da | |||
29a8f52464 | |||
6bfb674d1b | |||
ef4c6a9ba3 | |||
ffeecf626c | |||
4154492603 | |||
5baffbf8f8 | |||
60c1706273 | |||
cb6af026f6 | |||
18ea53fcbc | |||
23955fdcc2 | |||
a06ed00727 | |||
15761ef802 | |||
ad3f46214d | |||
13fda1607f | |||
9fda6695ea | |||
b24f9ea569 | |||
e10c9dd011 | |||
b0eab5d793 | |||
17bb5643ae | |||
769b12f16a | |||
b511103fd9 | |||
122fe33636 | |||
8498ddefca | |||
48117a2e97 | |||
decb13eef0 | |||
a015b2e3db | |||
562e4157c0 | |||
01bfbc4656 | |||
7669029bfe | |||
0b66454d5c | |||
75a6dddea5 | |||
08b4a83331 | |||
c5e4d26320 | |||
d8bc6c92bb | |||
110c66dd32 | |||
6eb9606f23 | |||
03ebbf6d98 | |||
174db444d6 | |||
9972384597 | |||
8b4dafd701 | |||
f18eb71ad7 | |||
7af6e8413c | |||
fbedc3d133 | |||
fe5ac0fe08 | |||
f638fe473a | |||
8d04da1551 | |||
8534175c59 | |||
6778a79033 | |||
6e5a0bc80a | |||
fe547901fa | |||
cee08eccd1 | |||
67c7302938 | |||
8489646b66 | |||
6938921e92 | |||
7b73cc472f | |||
1c91c71dcd | |||
6142dfba6a | |||
13239417d8 | |||
5f083193e4 | |||
a51ac59252 | |||
8da940f929 | |||
ce9e8aead3 | |||
73ce2a99ff | |||
b028a47d57 | |||
4bf577e89b | |||
5991bbb741 | |||
d7d606b721 | |||
0c1d3e30b6 | |||
ccc60b4245 | |||
8912bd3ed0 | |||
9f3b34e4d9 | |||
6eba62f060 | |||
1f16d7955d | |||
1f7d399b8e | |||
4fff2eaaa0 | |||
b377520a38 | |||
95ecff0551 | |||
2c380a53ca | |||
aacd0fcc65 | |||
4f76c9bd43 | |||
8d9e322507 | |||
94e53c3777 | |||
12c42fc6e4 | |||
5186dd27e6 | |||
9d9f959769 | |||
4e256cf3f0 | |||
eae94ee14a | |||
e0260ac4fc | |||
7b4b5e55a2 | |||
cb49650ea4 | |||
d60bb90b77 | |||
ddfe036f00 | |||
38afa345dd | |||
ab38f13052 | |||
9ee701974f | |||
8940c3bbe8 | |||
51f2c6bc46 | |||
c058a2d196 | |||
a4fff66bec | |||
024fd42e27 | |||
c413c1ec23 | |||
2d80d31527 | |||
a87a967a97 | |||
a57e431437 | |||
61783aafaa | |||
e5787a2617 | |||
9aec6bbed4 | |||
4f6a9b1bc2 | |||
28e7a96e37 | |||
710f933fa6 | |||
bad72de960 | |||
65166109c9 | |||
91156dfc75 | |||
af2113931a | |||
68e4457f3a | |||
1b4ddbca3a | |||
445ad22580 | |||
88a5f713ed | |||
2009ceb350 | |||
77a2eff2ce | |||
cf832798fb | |||
3f3f2d9c2c | |||
b47705ac21 | |||
b33be38877 | |||
a5fe6f40b8 | |||
245f7f4b11 | |||
1418f96e46 | |||
84a8f79bbe | |||
4b6253e810 | |||
929fc16994 | |||
811f0896c9 | |||
7729ca3427 | |||
100d4d3499 | |||
7f5fd1ac86 | |||
1f5c07a07f | |||
67d482d28b | |||
1440ed29d4 | |||
311c5779ea | |||
9880c6929f | |||
99138ffdcd | |||
08e886ebc6 | |||
6fdbc27998 | |||
40e6360722 | |||
642e28166b | |||
6dfa31fb17 | |||
c91cc2218b | |||
6f2bfd43bf | |||
f43f8773c4 | |||
bb072675ba | |||
fa43072be7 | |||
86a43b9042 | |||
2506c0104a | |||
948eba92a5 | |||
ad09072a6d | |||
9c2b5efe7b | |||
91cdf80c65 | |||
9cce5ea6b5 | |||
8310700bbb | |||
78aaa5c1b4 | |||
7c1303f57c | |||
569517c531 | |||
1c2e0083ba | |||
a8edc0886d | |||
8e1f85e1c3 | |||
5420a91046 | |||
2a52efa99a | |||
d3c59c42ef | |||
368e4813de | |||
36857ae72b | |||
982d571b2e | |||
e62b634f72 | |||
e8278431d2 | |||
14f626d422 | |||
d08fbb2ef2 | |||
5da268077c | |||
20160749e7 | |||
194f4c2f18 | |||
9e34be7b16 | |||
6e041d5275 | |||
33617b67f0 | |||
efaac20d82 | |||
ce97df34e6 | |||
23b9923eeb | |||
999c1b6b81 | |||
1a98ecf6b0 | |||
5444a66e71 | |||
f49a7a1acb | |||
28dfb0ba41 | |||
94a882bf95 | |||
da2d603b53 | |||
7aaa3df701 | |||
729553d3bc | |||
f78a802d11 | |||
826a549d1f | |||
99918205ed | |||
c65ec9e14f | |||
c1427ff807 | |||
0bb436f949 | |||
0fc7ef6685 | |||
c9bbaa7241 | |||
63fdf66ad6 | |||
9357a6cb88 | |||
dbc06abf18 | |||
4d067619a8 | |||
cf3d6545c3 | |||
f3a6e2d494 | |||
cdce3e03ea | |||
b25b7d29fc | |||
71d7596b6f | |||
06e699c862 | |||
a03283d65f | |||
ef38061edd | |||
7e13e26c29 | |||
5f7329f5b9 | |||
2213380dc0 | |||
66d8035ed1 | |||
7cdf178f8d | |||
af3c868a5b | |||
b16c8972c7 | |||
1c9b62de07 | |||
fc89b01ba6 | |||
70e67c5daa | |||
5ad3b6018a | |||
ba278985e8 | |||
5300461c79 | |||
d0f60c47bf | |||
07f2470e36 | |||
f8f1e791a3 | |||
729a4fe37e | |||
97e4b53cf3 | |||
c850212288 | |||
600afaf530 | |||
c21dc681c9 | |||
f4ad5d36ec | |||
f627fe3a39 | |||
7b6dc33824 | |||
b4ee994515 | |||
b1dd62078f | |||
bf3efdb89c | |||
354de5f13f | |||
b4ffb8af45 | |||
a49b12b66b | |||
1573e1eb97 | |||
9b9daaee6f | |||
99643ba2e6 | |||
08ea5ebe1f | |||
cb1c7ea12c | |||
1026100c9d | |||
943ba3a2da | |||
bfa9f1e69b | |||
4d150e9340 | |||
2019028688 | |||
b4728f2e1d | |||
d8706af2ea | |||
08e19602f7 | |||
b12b500bfc | |||
e786ea601e | |||
36da8117c0 | |||
6d5afdaa5f | |||
52dd3d2446 | |||
ecc32ddd18 | |||
38c29fc242 | |||
40f4dc9ecf | |||
95a6689077 | |||
c5f875dc5f | |||
89b5e819a3 | |||
6585381230 | |||
f3ce7ff86c | |||
e4a65c72dd | |||
f14a73584f | |||
fffb52dd93 | |||
71f9ed3099 | |||
e293b89f6b | |||
8a284e7c74 | |||
22ed153004 | |||
ff9f09a24e | |||
7eb2a6b709 | |||
f2e9bb54f0 | |||
ac6667b1c9 | |||
7d78a3aeef | |||
aa088721c3 | |||
97f7050d7d | |||
e21be3382b | |||
72cd753c02 | |||
c8d7b6fa92 | |||
8c70513a24 | |||
35062ceb99 | |||
f05afb5468 | |||
ecba117dc0 | |||
d2a1f41750 | |||
be777b8525 | |||
3881af4bbe | |||
933e0f5280 | |||
149c1c2f1b | |||
6cc3212605 | |||
e19aa1d43a | |||
69a366dced | |||
c9ef731fd0 | |||
cd97bdb30f | |||
3bcf390484 | |||
7fa1c11833 | |||
ab0f2c13af | |||
dc38640341 | |||
66e5fda418 | |||
e06d603154 | |||
392b0679c9 | |||
336cc9f336 | |||
0bd96f339e | |||
ce0bf6269b | |||
fdaba72974 | |||
a2d98ddde8 | |||
51bfe9eaf6 | |||
a25cf4d188 | |||
ede1146ddc | |||
b916ed3cae | |||
9d5ce45f3b | |||
a7941a00c5 | |||
f4ffb21c8c | |||
29cba22405 | |||
b79301a5bd | |||
ef9c3ef1cb | |||
1f620828c2 | |||
f20dbbbd74 | |||
00046d309d | |||
7b7edc9029 | |||
bd208fcec6 | |||
f233d27b78 | |||
42e8667773 | |||
c0361e8546 | |||
3fbbbf8541 | |||
e5684c6127 | |||
0233e0eeec | |||
7fbd3657e8 | |||
005af7f7b7 | |||
94f8f74f51 | |||
f391186749 | |||
e4340a7536 | |||
dd2792b204 | |||
08ee5385ec | |||
73eb517b86 | |||
4b29aef048 | |||
cb7baee045 | |||
85ca5027f4 | |||
50ecc97284 | |||
d382734698 | |||
f91dc7fb6e | |||
0d03c1d4da | |||
68b6136989 | |||
930bb4ba97 | |||
18f129a712 | |||
bb60e68b9d | |||
a70468a2ea | |||
09c89bcd20 | |||
cc365a8175 | |||
ff0d3292a4 | |||
1fe0bcacc0 | |||
f74c22e851 | |||
1ea662a08d | |||
881bb62f88 | |||
f6ef8b41df | |||
c1640ed16c | |||
dd596a5c6c | |||
29f78e0426 | |||
407bf27401 | |||
85df7ce2da | |||
ad40511358 | |||
e8dbdee238 | |||
c784e8170e | |||
31a4aff1f8 | |||
89ca155c43 | |||
908fa2c6c2 | |||
f45d582957 | |||
eb3f4216d4 | |||
e0cdcb6e30 | |||
a7056f7cce | |||
14a6cec6d1 | |||
3b576ae12d | |||
2695985da0 | |||
85e00b2aab | |||
05b12602d4 | |||
374d5ae5a1 | |||
fd11711673 | |||
8282385074 | |||
ef7638d45a | |||
d8dafa7ecc | |||
faacd76f62 | |||
c21e0f6cf3 | |||
9785a89013 | |||
b015836e7b | |||
a9dae931c7 | |||
071cb86b45 | |||
c6743988d3 | |||
bb33427f65 | |||
4889e655eb | |||
aa4fc3dd29 | |||
188611a767 | |||
4872091442 | |||
5600783151 | |||
abe1fa5bd4 | |||
96d965fe04 | |||
9c566564e1 | |||
fc5906dbd4 | |||
fe3aeb36c5 | |||
591a417b7d | |||
d4d35e6b2b | |||
f97de599dd | |||
f01996ae99 | |||
7735c80d0e | |||
2b3d7be9cb | |||
9fa2cc45d2 | |||
7a0c0ca613 | |||
48a8dbece9 | |||
67d54ef3d5 | |||
d5fa20dd33 | |||
be3f47b374 | |||
9ea13e790d | |||
f13f49ccb5 | |||
2cc00ab853 | |||
ed402d7583 | |||
acf990743e | |||
ebdeb86703 | |||
bc13453155 | |||
23e5181cac | |||
452dcaa5d3 | |||
5905078e56 | |||
52361ed360 | |||
87b43c2171 | |||
ae88d7d8dc | |||
6d2ba7a75b | |||
03a641ed83 | |||
3e2197a82a | |||
79883dbce4 | |||
8a0e76c8d8 | |||
285a264aae | |||
587eb5fdb4 | |||
f151d435a8 | |||
8f961ac397 | |||
cf5db8f663 | |||
54beabb9dc | |||
41752ad5a2 | |||
8349316fcd | |||
4229e9b2ca | |||
5e86014443 | |||
d6381eeaff | |||
45f7f9b07a | |||
6dc1892494 | |||
e9b2d275c8 | |||
7b78a29f3f | |||
f270d317bb | |||
cc3acf8102 | |||
21fdcf41c3 | |||
bcb63b8ccb | |||
22e46ea6cc | |||
aa625f5196 | |||
1f66b06f93 | |||
e4427cb017 | |||
93afe5113a | |||
73681a30e5 | |||
e9b5be9adb | |||
83d679bf72 | |||
b9f83dc77d | |||
7ba14c2097 | |||
3014082ba2 | |||
12016d35bb | |||
6db795401a | |||
43ca8f7050 | |||
063c5a5ace | |||
fcab026512 | |||
95f505a457 | |||
577dc1fa00 | |||
dc625490f8 | |||
c651670222 | |||
459df4e0c9 | |||
eb53fa8d0e | |||
9e3e4368c7 | |||
98b6d7f283 | |||
225a0eccdd | |||
1b22e2b320 | |||
44119db436 | |||
943b6bc51b | |||
4a22057138 | |||
ba78199dd1 | |||
9b51094743 | |||
3c5fd4ba84 | |||
ea722615c4 | |||
6f7d7e645a | |||
8fb54f47ea | |||
447fad34c7 | |||
d263607b27 | |||
b54fb24745 | |||
0cf3b25d50 | |||
033f0b01b7 | |||
f4e15dd93d | |||
3663b9193d | |||
591eb2ea38 | |||
69f5d19455 | |||
4d775008df | |||
4565f7f8b9 | |||
fdfb60c633 | |||
62082bdb01 | |||
8cd6e13308 | |||
31243cdc20 | |||
0aa8c03bea | |||
51a66d5919 | |||
29fa74f621 | |||
4c4691dc2e | |||
8f10c9056c | |||
22409d27c5 | |||
3bb04e82a5 | |||
9b41b95934 | |||
fb56f89ced | |||
56cbdd1403 | |||
50e8f7ca86 | |||
42b6c089f3 | |||
0ad29a5960 | |||
5ebd3594e4 | |||
4c251578e9 | |||
d51adfe7bc | |||
a446cd692d | |||
4d6e20a96d | |||
9ebfc54eb5 | |||
f5efb50871 | |||
4cd31cf3c3 | |||
6a2d214b55 | |||
7638f5c595 | |||
01c682c41e | |||
7d5da1df5e | |||
2ca20f9050 | |||
99f3e37ccf | |||
edd4d8ee11 | |||
dcc0201b45 | |||
66aa3574d9 | |||
40d3f1c1fe | |||
1e2ce29f57 | |||
2b11b7ef8c | |||
74018167ff | |||
0625bc7688 | |||
fb8cda9d90 | |||
a213aed4da | |||
17967da676 | |||
1f6277e35b | |||
006850ea5e | |||
c3359dec1b | |||
15fe73a252 | |||
246f7bf555 | |||
759602af64 | |||
273c2f3a8f | |||
a1f6e38624 | |||
e3fdd6d94a | |||
27f89bdcc3 | |||
15623ec487 | |||
bc112eaae1 | |||
70e368a1c6 | |||
7d9f6096fe | |||
06ad35c42b | |||
b7e8275d90 | |||
b9cf0a9c9a | |||
14bc842e77 | |||
7d9217b14a | |||
8a13ed59bc | |||
43500a9983 | |||
8e6cbc1021 | |||
d35e92569d | |||
b6067c7569 | |||
8f684f703e | |||
5662f80c43 | |||
5e044e5bba | |||
732ce7a27c | |||
fa6bf597cf | |||
b7a8e8e544 | |||
7429d1f9cc | |||
2c25153506 | |||
401ea05dd8 | |||
b23ba00cff | |||
343a8bef22 | |||
181fde254f | |||
0080feb9af | |||
91a2c4743e | |||
a50c12b6ae | |||
4b2e6b54a7 | |||
adaf843048 | |||
e96a0bf799 | |||
6e7f22ac3a | |||
94a4d41a65 | |||
3b16946c25 | |||
1d92d78de7 | |||
eb624c929d | |||
e72b153f87 | |||
7b4ded306b | |||
49ae944d65 | |||
2585360a3e | |||
2ffc96d0b2 | |||
9a123052a0 | |||
9b9d13ab0d | |||
6ca4e14b29 | |||
6b32aca094 | |||
b251c51936 | |||
a9b17681b0 | |||
60bad8279e | |||
a871dcaebe | |||
cef5b27b48 | |||
c5bbedfabb | |||
e7367c75aa | |||
8d8c048924 | |||
4f646543fc | |||
1885ecc958 | |||
71b7b4e0f4 | |||
4e567d0483 | |||
c4f7cdeec4 | |||
c844d7ac2e | |||
496e782544 | |||
cfd7577e1b | |||
d5df185ac6 | |||
c94ef092ff | |||
74db69dcb7 | |||
fe2dd1e843 | |||
1dc557456e | |||
45deb2472c | |||
8fbaf06cbe | |||
08dce576bd | |||
4b28518cd5 | |||
c9ee528880 | |||
0e869e3aab | |||
6fe764540c | |||
81abd9bb67 | |||
c602d38c8e | |||
c45adddd8e | |||
25648ed9c0 | |||
c8daa48e66 | |||
6a95179456 | |||
ea4dec96e6 | |||
44ed61b2c3 | |||
64f10f8f69 | |||
7b18bfd1a7 | |||
6e946bf872 | |||
e01a081f2f | |||
df0d34dbd4 | |||
b18262f6d0 | |||
d30b775d25 | |||
82c3cccd72 | |||
1814b3b593 | |||
ff7a28274f | |||
8909086b58 | |||
a851dd1198 | |||
9817955fef | |||
774d8ffdba | |||
4a80874da9 | |||
4e19ec93dc | |||
976d3332d4 | |||
2d02ae5e97 | |||
967001d9d3 | |||
09ec40e38d | |||
345c7da384 | |||
9350595158 | |||
a0d5826cbc | |||
7859bf2c60 | |||
acc3ae6e62 | |||
d1c4897f31 | |||
4a7dd400fe | |||
687c50dc13 | |||
b40cdcb5bd | |||
b9338c72c9 | |||
8f6273e9d0 | |||
1fd708cda8 | |||
ac3126b6cf | |||
7c4ea39774 | |||
27fbea2b5a | |||
f34163a065 | |||
6570aefeec | |||
5c5031fd69 | |||
8e0f3c7ddf | |||
8a5c3af949 | |||
d5bd3be8de | |||
bb2c16386b | |||
ec451b5908 | |||
ae3d4b9d28 | |||
af96150f5c | |||
10b152ac3e | |||
9acf5587fa | |||
c302116e73 | |||
ff36154c4b | |||
d12ad1128e | |||
cb2f5c154c | |||
c3cdd516ef | |||
19743f3085 | |||
5db06d99bb | |||
384200f27e | |||
5e712ca255 | |||
d405f28622 | |||
2f975f870a | |||
4471d4aba1 | |||
3945c77668 | |||
6c27af35e9 | |||
2a7e8f7d94 | |||
dd0144c3cd | |||
03130b7565 | |||
4eb462426d | |||
1209022492 | |||
bb88038c17 | |||
37b1b35035 | |||
190b2dd922 | |||
dd7d78cd60 | |||
9abe1e2790 | |||
7bebfebe5f | |||
2d8dc83480 | |||
382cf76503 | |||
9a5f5114c4 | |||
047c2929c1 | |||
9525663014 | |||
3ff1f28533 | |||
4fcf06a164 | |||
9b0660e751 | |||
543589a97b | |||
82d0c87934 | |||
4f8a396692 | |||
6141a26a09 | |||
bb7596045f | |||
16c68ee132 | |||
e0c42ae415 | |||
aae105c998 | |||
b719569243 | |||
e70f8d8730 | |||
e1215a6d17 | |||
119446d538 | |||
d1f427618f | |||
3c268d83c2 | |||
ae6ca36fa7 | |||
83b12fc8a7 | |||
f107aaddc3 | |||
cd2db19267 | |||
4c40f9c635 | |||
84e5b0e8c2 | |||
34a710cce3 | |||
218bb3bc2b | |||
f6b2005687 | |||
ea9591baea | |||
af2528952b | |||
414bf741f3 | |||
527fa982d2 | |||
8e05aab4d9 | |||
6ae9f436a9 | |||
58eb8ad11f | |||
c045288ce4 | |||
f9618d30f3 | |||
e3bf6b968c | |||
e9b0365327 | |||
97554b3532 | |||
1e969a48ae | |||
84b671f6b2 | |||
6e30b7af3c | |||
3130a57622 | |||
d85f0e1060 | |||
89cb9673d4 | |||
f0dbd8b78d | |||
626af1ddc1 | |||
2c4369a653 | |||
b8aeda794c | |||
2dc4ae78fc | |||
bd67c9e620 | |||
a555a72d7f | |||
99dde1aff8 | |||
d5875c468f | |||
9e877d3f57 | |||
f80270519b | |||
8fb3211594 | |||
b9cd51a9cc | |||
569f40de9b | |||
9c8d0865d1 | |||
129713fe1b | |||
e66c3bc965 | |||
75c6e2e7d5 | |||
d294352845 | |||
35f7fdf684 | |||
33798c31d0 | |||
ee0db26021 | |||
abcac464fa | |||
9602360d28 | |||
1d087f96bd | |||
01b8527333 | |||
abeb406166 | |||
443281f0bc | |||
de3be8b2ab | |||
4d7e19ae66 | |||
e8f2bd3ad1 | |||
c41cedd407 | |||
f6864e4a43 | |||
a833c51a28 | |||
1145788ab3 | |||
c0d4867421 | |||
d18ece13f2 | |||
1f379fa5f6 | |||
1125119dc6 | |||
173a7bb8cd | |||
4836333bff | |||
f01ddb9ab3 | |||
2f6a70f34e | |||
def4466953 | |||
db1136d647 | |||
c8821a5e7f | |||
d40cc6f23a | |||
c885be369e | |||
631695ec74 | |||
50275ae529 | |||
35d806b801 | |||
220028051f | |||
7f73a8cd45 | |||
dde700f2c9 | |||
0e87b3938a | |||
d1637d34cf | |||
2277ddd156 | |||
f9543e47dd | |||
4c548a95e8 | |||
6c3cb7c85a | |||
a307042d6b | |||
548589ee5d | |||
b2cec74c04 | |||
6895b3b6b6 | |||
ac8e892cbd | |||
1a05e230b9 | |||
ad08130b52 | |||
a94d5c5ff2 | |||
ecce607afe | |||
73bb42d40c | |||
3bb03852fe | |||
2aaf5510b8 | |||
278f26e597 | |||
03dab1bbdd | |||
0572f75055 | |||
0f0765e517 | |||
de0a3cb020 | |||
eb4c76f5e4 | |||
502b33b64a | |||
6d5b502bbb | |||
2faf629c88 | |||
c0355a3fd3 | |||
67f6dad717 | |||
7f7ebb5367 | |||
b97ca2ec9b | |||
358426cb1c | |||
5e4fdb1530 | |||
1e82982dbd | |||
048d8d328e | |||
6d5e328928 | |||
97e3226801 | |||
3d1fd4f5ea | |||
3131eb0774 | |||
f4d2ca2736 | |||
b3f9425d70 | |||
211b1c2785 | |||
9e13161385 | |||
bd5a215d2a | |||
247589efbb | |||
1d39ef5c8e | |||
4667afaa98 | |||
bae83ee4e3 | |||
52db1e8e68 | |||
334bc1e52a | |||
e6599d8ed5 | |||
5ee4c54b13 | |||
8830247b9e | |||
db74a46d7b | |||
4b24c19fa7 | |||
ce50249c04 | |||
02811293e0 | |||
5bb6fa384d | |||
b6cb02ce85 | |||
a0a218c6e2 | |||
f152ad9fa9 | |||
05d083726c | |||
a0a3c01e79 | |||
228078d538 | |||
e43b63ff02 | |||
dc93fa8218 | |||
a63bc84918 | |||
060b614eb3 | |||
dfb5ec0c65 | |||
1f84936639 | |||
f9b65baa2e | |||
ec23984c4d | |||
56d9cdc245 | |||
529daedcec | |||
089d1299c4 | |||
36fc8365ee | |||
f2f1c4f9cb | |||
2646390e28 | |||
66f2cbed51 | |||
19d7bd4ecf | |||
2e4de1ae3e | |||
ce909eea0b | |||
0b008154d9 | |||
fe88a3fa81 | |||
02e43a38d2 | |||
f592e3d38b | |||
c6d7a779b8 | |||
ceedc689ec | |||
b314cb16a9 | |||
a257126685 | |||
baaeda0ab7 | |||
e3dff6e0d8 | |||
e8a1e6ae35 | |||
3a86125495 | |||
da43336409 | |||
712424f9a8 | |||
e38df047fd | |||
0b237246f0 | |||
01ad3d96d8 | |||
642fd48af1 | |||
8f9e6c132d | |||
ba5592c86a | |||
2a3f40bc02 | |||
c60b905831 | |||
6536f7adb6 | |||
8134215839 | |||
e6fa37164c | |||
436fc94549 | |||
4f9c3d2413 | |||
c19a63e85e | |||
05e212f67a | |||
e01e3be488 | |||
f380844d61 | |||
7f6e4801eb | |||
ac461f38f4 | |||
30efd28b6a | |||
87392ef653 | |||
db85224d59 | |||
07d6a8e936 | |||
53614ab50c | |||
fba1f5c8af | |||
df83404c8c | |||
dd3da7b6ef | |||
cda9eb683f | |||
f0ad918feb | |||
8696ac77f9 | |||
9484cdff7d | |||
9b9818e95d | |||
cf72dee60c | |||
2e037df045 | |||
798fe1a622 | |||
9d0842db48 | |||
d8b1b0d0af | |||
e9b6380c18 | |||
43beefb00d | |||
12f869ccba | |||
7e9207d75c | |||
7a2dee7377 | |||
21a89ac46d | |||
bb99e6cf5b | |||
0834551161 | |||
ccd1586c65 | |||
617b370104 | |||
d607a4e33f | |||
a6c0bc5a52 | |||
67ad0e69ce | |||
ae88d6bc3c | |||
4f3c38c542 | |||
a6980fca7f | |||
bd5146fdcf | |||
22ddbde394 | |||
c916fe258e | |||
9c8e39c30c | |||
5b270dae0d | |||
c621afb0c4 | |||
bcf4725349 | |||
12b30ca25f | |||
86d6668ed4 | |||
7c85aec8e0 | |||
2c038d1977 | |||
ff9d598c16 | |||
71a9a75aad | |||
05f796158b | |||
1d2dd953e7 | |||
527144a440 | |||
cda6282277 | |||
7f13478396 | |||
90a9c0e25f | |||
340ec7be91 | |||
e7eef6b493 | |||
1b7068e61d | |||
dabe2bebbb | |||
486b5a5d38 | |||
11bbc3b24d | |||
7f74de977c | |||
028b184f7b | |||
564fdcb369 | |||
396f7d4525 | |||
3c9b533997 | |||
ae397c8fa2 | |||
ec75be0bc3 | |||
ed4521d113 | |||
c2e9ed6091 | |||
a37b4687ff | |||
ee29a35aa5 | |||
0be8e200ce | |||
46e5dd93d4 |
@ -1,6 +1,5 @@
|
|||||||
---
|
---
|
||||||
BasedOnStyle: Google
|
BasedOnStyle: Google
|
||||||
AlignConsecutiveDeclarations: true
|
AlignConsecutiveDeclarations: false
|
||||||
BinPackArguments: false
|
|
||||||
ColumnLimit: 100
|
ColumnLimit: 100
|
||||||
...
|
...
|
||||||
|
1
.github/FUNDING.yml
vendored
1
.github/FUNDING.yml
vendored
@ -1,3 +1,4 @@
|
|||||||
# These are supported funding model platforms
|
# These are supported funding model platforms
|
||||||
|
|
||||||
|
github: Alexays
|
||||||
custom: https://paypal.me/ARouillard
|
custom: https://paypal.me/ARouillard
|
||||||
|
29
.github/workflows/freebsd.yml
vendored
Normal file
29
.github/workflows/freebsd.yml
vendored
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
name: freebsd
|
||||||
|
|
||||||
|
on: [ push, pull_request ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
clang:
|
||||||
|
# Run actions in a FreeBSD VM on the macos-12 runner
|
||||||
|
# https://github.com/actions/runner/issues/385 - for FreeBSD runner support
|
||||||
|
# https://github.com/actions/virtual-environments/issues/4060 - for lack of VirtualBox on MacOS 11 runners
|
||||||
|
runs-on: macos-12
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- name: Test in FreeBSD VM
|
||||||
|
uses: vmactions/freebsd-vm@v0
|
||||||
|
with:
|
||||||
|
mem: 2048
|
||||||
|
usesh: true
|
||||||
|
prepare: |
|
||||||
|
export CPPFLAGS=-isystem/usr/local/include LDFLAGS=-L/usr/local/lib # sndio
|
||||||
|
sed -i '' 's/quarterly/latest/' /etc/pkg/FreeBSD.conf
|
||||||
|
pkg install -y git # subprojects/date
|
||||||
|
pkg install -y catch evdev-proto gtk-layer-shell gtkmm30 jsoncpp \
|
||||||
|
libdbusmenu libevdev libfmt libmpdclient libudev-devd meson \
|
||||||
|
pkgconf pulseaudio scdoc sndio spdlog wayland-protocols upower \
|
||||||
|
libinotify
|
||||||
|
run: |
|
||||||
|
meson build -Dman-pages=enabled
|
||||||
|
ninja -C build
|
||||||
|
meson test -C build --no-rebuild --print-errorlogs --suite waybar
|
14
.github/workflows/lint.yml
vendored
Normal file
14
.github/workflows/lint.yml
vendored
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
name: Linter
|
||||||
|
|
||||||
|
on: [push, pull_request]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: DoozyX/clang-format-lint-action@v0.13
|
||||||
|
with:
|
||||||
|
source: '.'
|
||||||
|
extensions: 'h,cpp,c'
|
||||||
|
clangFormatVersion: 12
|
28
.github/workflows/linux.yml
vendored
Normal file
28
.github/workflows/linux.yml
vendored
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
name: linux
|
||||||
|
|
||||||
|
on: [push, pull_request]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
distro:
|
||||||
|
- alpine
|
||||||
|
- archlinux
|
||||||
|
- debian
|
||||||
|
- fedora
|
||||||
|
- opensuse
|
||||||
|
- gentoo
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: alexays/waybar:${{ matrix.distro }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- name: configure
|
||||||
|
run: meson -Dman-pages=enabled build
|
||||||
|
- name: build
|
||||||
|
run: ninja -C build
|
||||||
|
- name: test
|
||||||
|
run: meson test -C build --no-rebuild --print-errorlogs --suite waybar
|
2
.gitignore
vendored
2
.gitignore
vendored
@ -2,6 +2,8 @@
|
|||||||
*~
|
*~
|
||||||
vgcore.*
|
vgcore.*
|
||||||
/.vscode
|
/.vscode
|
||||||
|
/.idea
|
||||||
|
/.cache
|
||||||
*.swp
|
*.swp
|
||||||
packagecache
|
packagecache
|
||||||
/subprojects/**/
|
/subprojects/**/
|
||||||
|
20
.travis.yml
20
.travis.yml
@ -1,20 +0,0 @@
|
|||||||
sudo: false
|
|
||||||
|
|
||||||
services:
|
|
||||||
- docker
|
|
||||||
|
|
||||||
env:
|
|
||||||
- distro: debian
|
|
||||||
- distro: archlinux
|
|
||||||
- distro: opensuse
|
|
||||||
- distro: fedora
|
|
||||||
- distro: alpine
|
|
||||||
|
|
||||||
before_install:
|
|
||||||
- docker pull alexays/waybar:${distro}
|
|
||||||
|
|
||||||
script:
|
|
||||||
- echo FROM alexays/waybar:${distro} > Dockerfile
|
|
||||||
- echo ADD . /root >> Dockerfile
|
|
||||||
- docker build -t waybar .
|
|
||||||
- docker run waybar /bin/sh -c "cd /root && meson build && ninja -C build"
|
|
@ -1,3 +1,5 @@
|
|||||||
|
# vim: ft=Dockerfile
|
||||||
|
|
||||||
FROM alpine:latest
|
FROM alpine:latest
|
||||||
|
|
||||||
RUN apk add --no-cache git meson alpine-sdk libinput-dev wayland-dev wayland-protocols mesa-dev libxkbcommon-dev eudev-dev pixman-dev gtkmm3-dev jsoncpp-dev libnl3-dev pulseaudio-dev libmpdclient-dev
|
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
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
FROM archlinux/base:latest
|
# vim: ft=Dockerfile
|
||||||
|
|
||||||
|
FROM archlinux:base-devel
|
||||||
|
|
||||||
RUN pacman -Syu --noconfirm && \
|
RUN pacman -Syu --noconfirm && \
|
||||||
pacman -S git meson base-devel libinput wayland wayland-protocols pixman libxkbcommon mesa gtkmm3 jsoncpp --noconfirm
|
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
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
|
# vim: ft=Dockerfile
|
||||||
|
|
||||||
FROM debian:sid
|
FROM debian:sid
|
||||||
|
|
||||||
RUN apt-get update && \
|
RUN apt-get update && \
|
||||||
apt-get install -y build-essential meson ninja-build git pkg-config libinput10 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 && \
|
apt-get install -y build-essential meson ninja-build git pkg-config libinput10 libpugixml-dev libinput-dev wayland-protocols libwayland-client0 libwayland-cursor0 libwayland-dev libegl1-mesa-dev libgles2-mesa-dev libgbm-dev libxkbcommon-dev libudev-dev libpixman-1-dev libgtkmm-3.0-dev libjsoncpp-dev scdoc libdbusmenu-gtk3-dev libnl-3-dev libnl-genl-3-dev libpulse-dev libmpdclient-dev gobject-introspection libgirepository1.0-dev libxkbcommon-dev libxkbregistry-dev libxkbregistry0 libplayerctl-dev && \
|
||||||
apt-get clean
|
apt-get clean
|
@ -1,5 +1,13 @@
|
|||||||
FROM fedora:30
|
# vim: ft=Dockerfile
|
||||||
|
|
||||||
RUN dnf install sway meson git libinput-devel wayland-devel wayland-protocols-devel egl-wayland-devel mesa-libEGL-devel mesa-libGLES-devel mesa-libgbm-devel libxkbcommon-devel libudev-devel pixman-devel gtkmm30-devel jsoncpp-devel -y && \
|
FROM fedora:latest
|
||||||
dnf group install "C Development Tools and Libraries" -y && \
|
|
||||||
|
RUN dnf install -y @c-development git-core meson scdoc 'pkgconfig(date)' \
|
||||||
|
'pkgconfig(dbusmenu-gtk3-0.4)' 'pkgconfig(fmt)' 'pkgconfig(gdk-pixbuf-2.0)' \
|
||||||
|
'pkgconfig(gio-unix-2.0)' 'pkgconfig(gtk-layer-shell-0)' 'pkgconfig(gtkmm-3.0)' \
|
||||||
|
'pkgconfig(jsoncpp)' 'pkgconfig(libinput)' 'pkgconfig(libmpdclient)' \
|
||||||
|
'pkgconfig(libnl-3.0)' 'pkgconfig(libnl-genl-3.0)' 'pkgconfig(libpulse)' \
|
||||||
|
'pkgconfig(libudev)' 'pkgconfig(pugixml)' 'pkgconfig(sigc++-2.0)' 'pkgconfig(spdlog)' \
|
||||||
|
'pkgconfig(wayland-client)' 'pkgconfig(wayland-cursor)' 'pkgconfig(wayland-protocols)' 'pkgconfig(xkbregistry)' \
|
||||||
|
'pkgconfig(playerctl)' && \
|
||||||
dnf clean all -y
|
dnf clean all -y
|
||||||
|
11
Dockerfiles/gentoo
Normal file
11
Dockerfiles/gentoo
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# vim: ft=Dockerfile
|
||||||
|
|
||||||
|
FROM gentoo/stage3:latest
|
||||||
|
|
||||||
|
RUN export FEATURES="-ipc-sandbox -network-sandbox -pid-sandbox -sandbox -usersandbox" && \
|
||||||
|
emerge --sync && \
|
||||||
|
eselect news read --quiet new 1>/dev/null 2>&1 && \
|
||||||
|
emerge --verbose --update --deep --with-bdeps=y --backtrack=30 --newuse @world && \
|
||||||
|
USE="wayland gtk3 gtk -doc X" emerge dev-vcs/git dev-libs/wayland dev-libs/wayland-protocols =dev-cpp/gtkmm-3.24.6 x11-libs/libxkbcommon \
|
||||||
|
x11-libs/gtk+:3 dev-libs/libdbusmenu dev-libs/libnl sys-power/upower media-libs/libpulse dev-libs/libevdev media-libs/libmpdclient \
|
||||||
|
media-sound/sndio gui-libs/gtk-layer-shell app-text/scdoc media-sound/playerctl
|
@ -1,5 +1,9 @@
|
|||||||
|
# vim: ft=Dockerfile
|
||||||
|
|
||||||
FROM opensuse/tumbleweed:latest
|
FROM opensuse/tumbleweed:latest
|
||||||
|
|
||||||
RUN zypper -n up && \
|
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 -t pattern devel_C_C++ && \
|
||||||
zypper -n install git meson clang libinput10 libinput-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
|
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
|
||||||
|
5
Makefile
5
Makefile
@ -1,6 +1,6 @@
|
|||||||
.PHONY: build build-debug run clean default install
|
.PHONY: build build-debug run clean default install
|
||||||
|
|
||||||
default: run
|
default: build
|
||||||
|
|
||||||
build:
|
build:
|
||||||
meson build
|
meson build
|
||||||
@ -16,5 +16,8 @@ install: build
|
|||||||
run: build
|
run: build
|
||||||
./build/waybar
|
./build/waybar
|
||||||
|
|
||||||
|
debug-run: build-debug
|
||||||
|
./build/waybar --log-level debug
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rf build
|
rm -rf build
|
||||||
|
84
README.md
84
README.md
@ -1,29 +1,47 @@
|
|||||||
# Waybar [](https://travis-ci.org/Alexays/Waybar) [](LICENSE) [](https://paypal.me/ARouillard)<br>
|
# Waybar [](LICENSE) [](https://paypal.me/ARouillard)<br>
|
||||||
|
|
||||||
> Highly customizable Wayland bar for Sway and Wlroots based compositors.<br>
|
> Highly customizable Wayland bar for Sway and Wlroots based compositors.<br>
|
||||||
> Available in Arch [community](https://www.archlinux.org/packages/community/x86_64/waybar/) or
|
> Available in Arch [community](https://www.archlinux.org/packages/community/x86_64/waybar/) or
|
||||||
[AUR](https://aur.archlinux.org/packages/waybar-git/) and [openSUSE](https://build.opensuse.org/package/show/X11:Wayland/waybar)
|
[AUR](https://aur.archlinux.org/packages/waybar-git/), [Gentoo](https://packages.gentoo.org/packages/gui-apps/waybar), [openSUSE](https://build.opensuse.org/package/show/X11:Wayland/waybar), and [Alpine Linux](https://pkgs.alpinelinux.org/packages?name=waybar).<br>
|
||||||
|
> *Waybar [examples](https://github.com/Alexays/Waybar/wiki/Examples)*
|
||||||
|
|
||||||
**Current features**
|
#### Current features
|
||||||
- Sway (Workspaces, Binding mode, Focused window name)
|
- Sway (Workspaces, Binding mode, Focused window name)
|
||||||
|
- River (Mapping mode, Tags, Focused window name)
|
||||||
|
- Hyprland (Focused window name)
|
||||||
- Tray [#21](https://github.com/Alexays/Waybar/issues/21)
|
- Tray [#21](https://github.com/Alexays/Waybar/issues/21)
|
||||||
- Local time
|
- Local time
|
||||||
- Battery
|
- Battery
|
||||||
|
- UPower
|
||||||
- Network
|
- Network
|
||||||
|
- Bluetooth
|
||||||
- Pulseaudio
|
- Pulseaudio
|
||||||
|
- Wireplumber
|
||||||
|
- Disk
|
||||||
- Memory
|
- Memory
|
||||||
- Cpu load average
|
- Cpu load average
|
||||||
- Temperature
|
- Temperature
|
||||||
- MPD
|
- MPD
|
||||||
- Custom scripts
|
- Custom scripts
|
||||||
|
- Custom image
|
||||||
- Multiple output configuration
|
- Multiple output configuration
|
||||||
- And much more customizations
|
- And many more customizations
|
||||||
|
|
||||||
**Configuration and Styling**
|
#### Configuration and Styling
|
||||||
|
|
||||||
[See the wiki for more details](https://github.com/Alexays/Waybar/wiki).
|
[See the wiki for more details](https://github.com/Alexays/Waybar/wiki).
|
||||||
|
|
||||||
**How to build**
|
### Installation
|
||||||
|
|
||||||
|
Waybar is available from a number of Linux distributions:
|
||||||
|
|
||||||
|
[](https://repology.org/project/waybar/versions)
|
||||||
|
|
||||||
|
An Ubuntu PPA with more recent versions is available
|
||||||
|
[here](https://launchpad.net/~nschloe/+archive/ubuntu/waybar).
|
||||||
|
|
||||||
|
|
||||||
|
#### Building from source
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ git clone https://github.com/Alexays/Waybar
|
$ git clone https://github.com/Alexays/Waybar
|
||||||
@ -41,20 +59,64 @@ $ waybar
|
|||||||
```
|
```
|
||||||
gtkmm3
|
gtkmm3
|
||||||
jsoncpp
|
jsoncpp
|
||||||
libinput
|
|
||||||
libsigc++
|
libsigc++
|
||||||
fmt
|
fmt
|
||||||
wayland
|
wayland
|
||||||
wlroots
|
chrono-date
|
||||||
|
spdlog
|
||||||
|
libgtk-3-dev [gtk-layer-shell]
|
||||||
|
gobject-introspection [gtk-layer-shell]
|
||||||
|
libgirepository1.0-dev [gtk-layer-shell]
|
||||||
libpulse [Pulseaudio module]
|
libpulse [Pulseaudio module]
|
||||||
libnl [Network module]
|
libnl [Network module]
|
||||||
sway [Sway modules]
|
libappindicator-gtk3 [Tray module]
|
||||||
libdbusmenu-gtk3 [Tray module]
|
libdbusmenu-gtk3 [Tray module]
|
||||||
libmpdclient [MPD module]
|
libmpdclient [MPD module]
|
||||||
|
libsndio [sndio module]
|
||||||
|
libevdev [KeyboardState module]
|
||||||
|
xkbregistry
|
||||||
|
upower [UPower battery module]
|
||||||
```
|
```
|
||||||
|
|
||||||
Contributions welcome! - have fun :)<br>
|
**Build dependencies**
|
||||||
The style guidelines is [Google's](https://google.github.io/styleguide/cppguide.html)
|
|
||||||
|
```
|
||||||
|
cmake
|
||||||
|
meson
|
||||||
|
scdoc
|
||||||
|
wayland-protocols
|
||||||
|
```
|
||||||
|
|
||||||
|
On Ubuntu, you can install all the relevant dependencies using this command (tested with 19.10 and 20.04):
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo apt install \
|
||||||
|
clang-tidy \
|
||||||
|
gobject-introspection \
|
||||||
|
libdbusmenu-gtk3-dev \
|
||||||
|
libevdev-dev \
|
||||||
|
libfmt-dev \
|
||||||
|
libgirepository1.0-dev \
|
||||||
|
libgtk-3-dev \
|
||||||
|
libgtkmm-3.0-dev \
|
||||||
|
libinput-dev \
|
||||||
|
libjsoncpp-dev \
|
||||||
|
libmpdclient-dev \
|
||||||
|
libnl-3-dev \
|
||||||
|
libnl-genl-3-dev \
|
||||||
|
libpulse-dev \
|
||||||
|
libsigc++-2.0-dev \
|
||||||
|
libspdlog-dev \
|
||||||
|
libwayland-dev \
|
||||||
|
scdoc \
|
||||||
|
upower \
|
||||||
|
libxkbregistry-dev
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
Contributions welcome!<br>
|
||||||
|
Have fun :)<br>
|
||||||
|
The style guidelines are [Google's](https://google.github.io/styleguide/cppguide.html)
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
|
25
include/AIconLabel.hpp
Normal file
25
include/AIconLabel.hpp
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <gtkmm/box.h>
|
||||||
|
#include <gtkmm/image.h>
|
||||||
|
|
||||||
|
#include "ALabel.hpp"
|
||||||
|
|
||||||
|
namespace waybar {
|
||||||
|
|
||||||
|
class AIconLabel : public ALabel {
|
||||||
|
public:
|
||||||
|
AIconLabel(const Json::Value &config, const std::string &name, const std::string &id,
|
||||||
|
const std::string &format, uint16_t interval = 0, bool ellipsize = false,
|
||||||
|
bool enable_click = false, bool enable_scroll = false);
|
||||||
|
virtual ~AIconLabel() = default;
|
||||||
|
virtual auto update() -> void;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Gtk::Image image_;
|
||||||
|
Gtk::Box box_;
|
||||||
|
|
||||||
|
bool iconEnabled() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace waybar
|
@ -1,41 +1,32 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <glibmm/markup.h>
|
#include <glibmm/markup.h>
|
||||||
#include <gtkmm/eventbox.h>
|
|
||||||
#include <gtkmm/label.h>
|
#include <gtkmm/label.h>
|
||||||
#include <json/json.h>
|
#include <json/json.h>
|
||||||
#include "IModule.hpp"
|
|
||||||
|
#include "AModule.hpp"
|
||||||
|
|
||||||
namespace waybar {
|
namespace waybar {
|
||||||
|
|
||||||
class ALabel : public IModule {
|
class ALabel : public AModule {
|
||||||
public:
|
public:
|
||||||
ALabel(const Json::Value &, const std::string &, const std::string &, const std::string &format,
|
ALabel(const Json::Value &, const std::string &, const std::string &, const std::string &format,
|
||||||
uint16_t interval = 0);
|
uint16_t interval = 0, bool ellipsize = false, bool enable_click = false,
|
||||||
virtual ~ALabel();
|
bool enable_scroll = false);
|
||||||
|
virtual ~ALabel() = default;
|
||||||
virtual auto update() -> void;
|
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::string &alt = "", uint16_t max = 0);
|
||||||
virtual operator Gtk::Widget &();
|
virtual std::string getIcon(uint16_t, const std::vector<std::string> &alts, uint16_t max = 0);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool tooltipEnabled();
|
|
||||||
|
|
||||||
Gtk::EventBox event_box_;
|
|
||||||
Gtk::Label label_;
|
Gtk::Label label_;
|
||||||
const Json::Value & config_;
|
|
||||||
std::string format_;
|
std::string format_;
|
||||||
std::string click_param;
|
|
||||||
std::mutex mutex_;
|
|
||||||
const std::chrono::seconds interval_;
|
const std::chrono::seconds interval_;
|
||||||
bool alt_ = false;
|
bool alt_ = false;
|
||||||
std::string default_format_;
|
std::string default_format_;
|
||||||
|
|
||||||
virtual bool handleToggle(GdkEventButton *const &ev);
|
virtual bool handleToggle(GdkEventButton *const &e);
|
||||||
virtual bool handleScroll(GdkEventScroll *);
|
|
||||||
virtual std::string getState(uint8_t value, bool lesser = false);
|
virtual std::string getState(uint8_t value, bool lesser = false);
|
||||||
|
|
||||||
private:
|
|
||||||
std::vector<int> pid_;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace waybar
|
} // namespace waybar
|
||||||
|
57
include/AModule.hpp
Normal file
57
include/AModule.hpp
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <glibmm/dispatcher.h>
|
||||||
|
#include <glibmm/markup.h>
|
||||||
|
#include <gtkmm/eventbox.h>
|
||||||
|
#include <json/json.h>
|
||||||
|
|
||||||
|
#include "IModule.hpp"
|
||||||
|
|
||||||
|
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 &();
|
||||||
|
|
||||||
|
Glib::Dispatcher dp;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
enum SCROLL_DIR { NONE, UP, DOWN, LEFT, RIGHT };
|
||||||
|
|
||||||
|
SCROLL_DIR getScrollDir(GdkEventScroll *e);
|
||||||
|
bool tooltipEnabled();
|
||||||
|
|
||||||
|
const std::string name_;
|
||||||
|
const Json::Value &config_;
|
||||||
|
Gtk::EventBox event_box_;
|
||||||
|
|
||||||
|
virtual bool handleToggle(GdkEventButton *const &ev);
|
||||||
|
virtual bool handleScroll(GdkEventScroll *);
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::vector<int> pid_;
|
||||||
|
gdouble distance_scrolled_y_;
|
||||||
|
gdouble distance_scrolled_x_;
|
||||||
|
static const inline std::map<std::pair<uint, GdkEventType>, std::string> eventMap_{
|
||||||
|
{std::make_pair(1, GdkEventType::GDK_BUTTON_PRESS), "on-click"},
|
||||||
|
{std::make_pair(1, GdkEventType::GDK_2BUTTON_PRESS), "on-double-click"},
|
||||||
|
{std::make_pair(1, GdkEventType::GDK_3BUTTON_PRESS), "on-triple-click"},
|
||||||
|
{std::make_pair(2, GdkEventType::GDK_BUTTON_PRESS), "on-click-middle"},
|
||||||
|
{std::make_pair(2, GdkEventType::GDK_2BUTTON_PRESS), "on-double-click-middle"},
|
||||||
|
{std::make_pair(2, GdkEventType::GDK_3BUTTON_PRESS), "on-triple-click-middle"},
|
||||||
|
{std::make_pair(3, GdkEventType::GDK_BUTTON_PRESS), "on-click-right"},
|
||||||
|
{std::make_pair(3, GdkEventType::GDK_2BUTTON_PRESS), "on-double-click-right"},
|
||||||
|
{std::make_pair(3, GdkEventType::GDK_3BUTTON_PRESS), "on-triple-click-right"},
|
||||||
|
{std::make_pair(8, GdkEventType::GDK_BUTTON_PRESS), "on-click-backward"},
|
||||||
|
{std::make_pair(8, GdkEventType::GDK_2BUTTON_PRESS), "on-double-click-backward"},
|
||||||
|
{std::make_pair(8, GdkEventType::GDK_3BUTTON_PRESS), "on-triple-click-backward"},
|
||||||
|
{std::make_pair(9, GdkEventType::GDK_BUTTON_PRESS), "on-click-forward"},
|
||||||
|
{std::make_pair(9, GdkEventType::GDK_2BUTTON_PRESS), "on-double-click-forward"},
|
||||||
|
{std::make_pair(9, GdkEventType::GDK_3BUTTON_PRESS), "on-triple-click-forward"}};
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace waybar
|
@ -1,7 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <glibmm/dispatcher.h>
|
|
||||||
#include <gtkmm/box.h>
|
|
||||||
#include <gtkmm/widget.h>
|
#include <gtkmm/widget.h>
|
||||||
|
|
||||||
namespace waybar {
|
namespace waybar {
|
||||||
@ -10,8 +8,7 @@ class IModule {
|
|||||||
public:
|
public:
|
||||||
virtual ~IModule() = default;
|
virtual ~IModule() = default;
|
||||||
virtual auto update() -> void = 0;
|
virtual auto update() -> void = 0;
|
||||||
virtual operator Gtk::Widget &() = 0;
|
virtual operator Gtk::Widget&() = 0;
|
||||||
Glib::Dispatcher dp; // Hmmm Maybe I should create an abstract class ?
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace waybar
|
} // namespace waybar
|
||||||
|
150
include/bar.hpp
150
include/bar.hpp
@ -1,81 +1,125 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <gdkmm/monitor.h>
|
||||||
#include <glibmm/refptr.h>
|
#include <glibmm/refptr.h>
|
||||||
|
#include <gtkmm/box.h>
|
||||||
#include <gtkmm/cssprovider.h>
|
#include <gtkmm/cssprovider.h>
|
||||||
#include <gtkmm/main.h>
|
#include <gtkmm/main.h>
|
||||||
#include <gtkmm/window.h>
|
#include <gtkmm/window.h>
|
||||||
#include <json/json.h>
|
#include <json/json.h>
|
||||||
#include "IModule.hpp"
|
|
||||||
#include "idle-inhibit-unstable-v1-client-protocol.h"
|
#include <memory>
|
||||||
#include "wlr-layer-shell-unstable-v1-client-protocol.h"
|
#include <vector>
|
||||||
|
|
||||||
|
#include "AModule.hpp"
|
||||||
#include "xdg-output-unstable-v1-client-protocol.h"
|
#include "xdg-output-unstable-v1-client-protocol.h"
|
||||||
|
|
||||||
namespace waybar {
|
namespace waybar {
|
||||||
|
|
||||||
class Factory;
|
class Factory;
|
||||||
struct waybar_output {
|
struct waybar_output {
|
||||||
struct wl_output * output;
|
Glib::RefPtr<Gdk::Monitor> monitor;
|
||||||
std::string name;
|
std::string name;
|
||||||
uint32_t wl_name;
|
std::string identifier;
|
||||||
struct zxdg_output_v1 *xdg_output;
|
|
||||||
|
std::unique_ptr<struct zxdg_output_v1, decltype(&zxdg_output_v1_destroy)> xdg_output = {
|
||||||
|
nullptr, &zxdg_output_v1_destroy};
|
||||||
};
|
};
|
||||||
|
|
||||||
class Bar {
|
enum class bar_layer : uint8_t {
|
||||||
public:
|
BOTTOM,
|
||||||
Bar(struct waybar_output *w_output, const Json::Value &);
|
TOP,
|
||||||
Bar(const Bar &) = delete;
|
OVERLAY,
|
||||||
~Bar() = default;
|
};
|
||||||
|
|
||||||
auto toggle() -> void;
|
struct bar_margins {
|
||||||
void handleSignal(int);
|
|
||||||
|
|
||||||
struct waybar_output * output;
|
|
||||||
Json::Value config;
|
|
||||||
Gtk::Window window;
|
|
||||||
struct wl_surface * surface;
|
|
||||||
struct zwlr_layer_surface_v1 *layer_surface;
|
|
||||||
bool visible = true;
|
|
||||||
bool vertical = false;
|
|
||||||
|
|
||||||
private:
|
|
||||||
static constexpr const char *MIN_HEIGHT_MSG =
|
|
||||||
"Requested height: {} exceeds the minimum height: {} required by the modules";
|
|
||||||
static constexpr const char *MIN_WIDTH_MSG =
|
|
||||||
"Requested width: {} exceeds the minimum width: {} required by the modules";
|
|
||||||
static constexpr const char *BAR_SIZE_MSG =
|
|
||||||
"Bar configured (width: {}, height: {}) for output: {}";
|
|
||||||
static constexpr const char *SIZE_DEFINED =
|
|
||||||
"{} size is defined in the config file so it will stay like that";
|
|
||||||
static void layerSurfaceHandleConfigure(void *, struct zwlr_layer_surface_v1 *, uint32_t,
|
|
||||||
uint32_t, uint32_t);
|
|
||||||
static void layerSurfaceHandleClosed(void *, struct zwlr_layer_surface_v1 *);
|
|
||||||
|
|
||||||
void destroyOutput();
|
|
||||||
void onConfigure(GdkEventConfigure *ev);
|
|
||||||
void onRealize();
|
|
||||||
void onMap(GdkEventAny *ev);
|
|
||||||
void setMarginsAndZone(uint32_t height, uint32_t width);
|
|
||||||
auto setupWidgets() -> void;
|
|
||||||
void getModules(const Factory &, const std::string &);
|
|
||||||
void setupAltFormatKeyForModule(const std::string &module_name);
|
|
||||||
void setupAltFormatKeyForModuleList(const char *module_list_name);
|
|
||||||
|
|
||||||
struct margins {
|
|
||||||
int top = 0;
|
int top = 0;
|
||||||
int right = 0;
|
int right = 0;
|
||||||
int bottom = 0;
|
int bottom = 0;
|
||||||
int left = 0;
|
int left = 0;
|
||||||
} margins_;
|
};
|
||||||
uint32_t width_ = 0;
|
|
||||||
uint32_t height_ = 1;
|
struct bar_mode {
|
||||||
uint8_t anchor_;
|
bar_layer layer;
|
||||||
|
bool exclusive;
|
||||||
|
bool passthrough;
|
||||||
|
bool visible;
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef HAVE_SWAY
|
||||||
|
namespace modules::sway {
|
||||||
|
class BarIpcClient;
|
||||||
|
}
|
||||||
|
#endif // HAVE_SWAY
|
||||||
|
|
||||||
|
class BarSurface {
|
||||||
|
protected:
|
||||||
|
BarSurface() = default;
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual void setExclusiveZone(bool enable) = 0;
|
||||||
|
virtual void setLayer(bar_layer layer) = 0;
|
||||||
|
virtual void setMargins(const struct bar_margins &margins) = 0;
|
||||||
|
virtual void setPassThrough(bool enable) = 0;
|
||||||
|
virtual void setPosition(const std::string_view &position) = 0;
|
||||||
|
virtual void setSize(uint32_t width, uint32_t height) = 0;
|
||||||
|
virtual void commit(){};
|
||||||
|
|
||||||
|
virtual ~BarSurface() = default;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Bar {
|
||||||
|
public:
|
||||||
|
using bar_mode_map = std::map<std::string_view, struct bar_mode>;
|
||||||
|
static const bar_mode_map PRESET_MODES;
|
||||||
|
static const std::string_view MODE_DEFAULT;
|
||||||
|
static const std::string_view MODE_INVISIBLE;
|
||||||
|
|
||||||
|
Bar(struct waybar_output *w_output, const Json::Value &);
|
||||||
|
Bar(const Bar &) = delete;
|
||||||
|
~Bar();
|
||||||
|
|
||||||
|
void setMode(const std::string_view &);
|
||||||
|
void setVisible(bool visible);
|
||||||
|
void toggle();
|
||||||
|
void handleSignal(int);
|
||||||
|
|
||||||
|
struct waybar_output *output;
|
||||||
|
Json::Value config;
|
||||||
|
struct wl_surface *surface;
|
||||||
|
bool visible = true;
|
||||||
|
bool vertical = false;
|
||||||
|
Gtk::Window window;
|
||||||
|
|
||||||
|
#ifdef HAVE_SWAY
|
||||||
|
std::string bar_id;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
private:
|
||||||
|
void onMap(GdkEventAny *);
|
||||||
|
auto setupWidgets() -> void;
|
||||||
|
void getModules(const Factory &, const std::string &, Gtk::Box *);
|
||||||
|
void setupAltFormatKeyForModule(const std::string &module_name);
|
||||||
|
void setupAltFormatKeyForModuleList(const char *module_list_name);
|
||||||
|
void setMode(const bar_mode &);
|
||||||
|
|
||||||
|
/* Copy initial set of modes to allow customization */
|
||||||
|
bar_mode_map configured_modes = PRESET_MODES;
|
||||||
|
std::string last_mode_{MODE_DEFAULT};
|
||||||
|
|
||||||
|
std::unique_ptr<BarSurface> surface_impl_;
|
||||||
Gtk::Box left_;
|
Gtk::Box left_;
|
||||||
Gtk::Box center_;
|
Gtk::Box center_;
|
||||||
Gtk::Box right_;
|
Gtk::Box right_;
|
||||||
Gtk::Box box_;
|
Gtk::Box box_;
|
||||||
std::vector<std::unique_ptr<waybar::IModule>> modules_left_;
|
std::vector<std::shared_ptr<waybar::AModule>> modules_left_;
|
||||||
std::vector<std::unique_ptr<waybar::IModule>> modules_center_;
|
std::vector<std::shared_ptr<waybar::AModule>> modules_center_;
|
||||||
std::vector<std::unique_ptr<waybar::IModule>> modules_right_;
|
std::vector<std::shared_ptr<waybar::AModule>> modules_right_;
|
||||||
|
#ifdef HAVE_SWAY
|
||||||
|
using BarIpcClient = modules::sway::BarIpcClient;
|
||||||
|
std::unique_ptr<BarIpcClient> _ipc_client;
|
||||||
|
#endif
|
||||||
|
std::vector<std::shared_ptr<waybar::AModule>> modules_all_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace waybar
|
} // namespace waybar
|
||||||
|
@ -3,10 +3,14 @@
|
|||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
#include <gdk/gdkwayland.h>
|
#include <gdk/gdkwayland.h>
|
||||||
#include <unistd.h>
|
|
||||||
#include <wayland-client.h>
|
#include <wayland-client.h>
|
||||||
#include <wordexp.h>
|
|
||||||
#include "bar.hpp"
|
#include "bar.hpp"
|
||||||
|
#include "config.hpp"
|
||||||
|
|
||||||
|
struct zwlr_layer_shell_v1;
|
||||||
|
struct zwp_idle_inhibitor_v1;
|
||||||
|
struct zwp_idle_inhibit_manager_v1;
|
||||||
|
|
||||||
namespace waybar {
|
namespace waybar {
|
||||||
|
|
||||||
@ -14,42 +18,41 @@ class Client {
|
|||||||
public:
|
public:
|
||||||
static Client *inst();
|
static Client *inst();
|
||||||
int main(int argc, char *argv[]);
|
int main(int argc, char *argv[]);
|
||||||
|
void reset();
|
||||||
|
|
||||||
Glib::RefPtr<Gtk::Application> gtk_app;
|
Glib::RefPtr<Gtk::Application> gtk_app;
|
||||||
Glib::RefPtr<Gdk::Display> gdk_display;
|
Glib::RefPtr<Gdk::Display> gdk_display;
|
||||||
struct wl_display * wl_display = nullptr;
|
struct wl_display *wl_display = nullptr;
|
||||||
struct wl_registry * registry = nullptr;
|
struct wl_registry *registry = nullptr;
|
||||||
struct zwlr_layer_shell_v1 * layer_shell = nullptr;
|
struct zwlr_layer_shell_v1 *layer_shell = nullptr;
|
||||||
struct zxdg_output_manager_v1 * xdg_output_manager = nullptr;
|
struct zxdg_output_manager_v1 *xdg_output_manager = nullptr;
|
||||||
struct zwp_idle_inhibit_manager_v1 *idle_inhibit_manager = nullptr;
|
struct zwp_idle_inhibit_manager_v1 *idle_inhibit_manager = nullptr;
|
||||||
std::vector<std::unique_ptr<Bar>> bars;
|
std::vector<std::unique_ptr<Bar>> bars;
|
||||||
|
Config config;
|
||||||
|
std::string bar_id;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Client() = default;
|
Client() = default;
|
||||||
std::tuple<const std::string, const std::string> getConfigs(const std::string &config,
|
const std::string getStyle(const std::string &style);
|
||||||
const std::string &style) const;
|
|
||||||
void bindInterfaces();
|
void bindInterfaces();
|
||||||
const std::string getValidPath(const std::vector<std::string> &paths) const;
|
void handleOutput(struct waybar_output &output);
|
||||||
void handleOutput(std::unique_ptr<struct waybar_output> &output);
|
|
||||||
bool isValidOutput(const Json::Value &config, std::unique_ptr<struct waybar_output> &output);
|
|
||||||
auto setupConfig(const std::string &config_file) -> void;
|
|
||||||
auto setupCss(const std::string &css_file) -> void;
|
auto setupCss(const std::string &css_file) -> void;
|
||||||
std::unique_ptr<struct waybar_output> &getOutput(uint32_t wl_name);
|
struct waybar_output &getOutput(void *);
|
||||||
std::vector<Json::Value> getOutputConfigs(std::unique_ptr<struct waybar_output> &output);
|
std::vector<Json::Value> getOutputConfigs(struct waybar_output &output);
|
||||||
|
|
||||||
static void handleGlobal(void *data, struct wl_registry *registry, uint32_t name,
|
static void handleGlobal(void *data, struct wl_registry *registry, uint32_t name,
|
||||||
const char *interface, uint32_t version);
|
const char *interface, uint32_t version);
|
||||||
static void handleGlobalRemove(void *data, struct wl_registry *registry, uint32_t name);
|
static void handleGlobalRemove(void *data, struct wl_registry *registry, uint32_t name);
|
||||||
static void handleLogicalPosition(void *, struct zxdg_output_v1 *, int32_t, int32_t);
|
static void handleOutputDone(void *, struct zxdg_output_v1 *);
|
||||||
static void handleLogicalSize(void *, struct zxdg_output_v1 *, int32_t, int32_t);
|
static void handleOutputName(void *, struct zxdg_output_v1 *, const char *);
|
||||||
static void handleDone(void *, struct zxdg_output_v1 *);
|
static void handleOutputDescription(void *, struct zxdg_output_v1 *, const char *);
|
||||||
static void handleName(void *, struct zxdg_output_v1 *, const char *);
|
void handleMonitorAdded(Glib::RefPtr<Gdk::Monitor> monitor);
|
||||||
static void handleDescription(void *, struct zxdg_output_v1 *, const char *);
|
void handleMonitorRemoved(Glib::RefPtr<Gdk::Monitor> monitor);
|
||||||
|
void handleDeferredMonitorRemoval(Glib::RefPtr<Gdk::Monitor> monitor);
|
||||||
|
|
||||||
Json::Value config_;
|
|
||||||
Glib::RefPtr<Gtk::StyleContext> style_context_;
|
Glib::RefPtr<Gtk::StyleContext> style_context_;
|
||||||
Glib::RefPtr<Gtk::CssProvider> css_provider_;
|
Glib::RefPtr<Gtk::CssProvider> css_provider_;
|
||||||
std::vector<std::unique_ptr<struct waybar_output>> outputs_;
|
std::list<struct waybar_output> outputs_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace waybar
|
} // namespace waybar
|
||||||
|
40
include/config.hpp
Normal file
40
include/config.hpp
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <json/json.h>
|
||||||
|
|
||||||
|
#include <optional>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#ifndef SYSCONFDIR
|
||||||
|
#define SYSCONFDIR "/etc"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace waybar {
|
||||||
|
|
||||||
|
class Config {
|
||||||
|
public:
|
||||||
|
static const std::vector<std::string> CONFIG_DIRS;
|
||||||
|
static const char *CONFIG_PATH_ENV;
|
||||||
|
|
||||||
|
/* Try to find any of provided names in the supported set of config directories */
|
||||||
|
static std::optional<std::string> findConfigPath(
|
||||||
|
const std::vector<std::string> &names, const std::vector<std::string> &dirs = CONFIG_DIRS);
|
||||||
|
|
||||||
|
Config() = default;
|
||||||
|
|
||||||
|
void load(const std::string &config);
|
||||||
|
|
||||||
|
Json::Value &getConfig() { return config_; }
|
||||||
|
|
||||||
|
std::vector<Json::Value> getOutputConfigs(const std::string &name, const std::string &identifier);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void setupConfig(Json::Value &dst, const std::string &config_file, int depth);
|
||||||
|
void resolveConfigIncludes(Json::Value &config, int depth);
|
||||||
|
void mergeConfig(Json::Value &a_config_, Json::Value &b_config_);
|
||||||
|
|
||||||
|
std::string config_file_;
|
||||||
|
|
||||||
|
Json::Value config_;
|
||||||
|
};
|
||||||
|
} // namespace waybar
|
@ -1,43 +1,96 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <json/json.h>
|
#include <json/json.h>
|
||||||
|
#ifdef HAVE_LIBDATE
|
||||||
#include "modules/clock.hpp"
|
#include "modules/clock.hpp"
|
||||||
|
#else
|
||||||
|
#include "modules/simpleclock.hpp"
|
||||||
|
#endif
|
||||||
#ifdef HAVE_SWAY
|
#ifdef HAVE_SWAY
|
||||||
|
#include "modules/sway/language.hpp"
|
||||||
#include "modules/sway/mode.hpp"
|
#include "modules/sway/mode.hpp"
|
||||||
|
#include "modules/sway/scratchpad.hpp"
|
||||||
#include "modules/sway/window.hpp"
|
#include "modules/sway/window.hpp"
|
||||||
#include "modules/sway/workspaces.hpp"
|
#include "modules/sway/workspaces.hpp"
|
||||||
#endif
|
#endif
|
||||||
#ifndef NO_FILESYSTEM
|
#ifdef HAVE_WLR
|
||||||
|
#include "modules/wlr/taskbar.hpp"
|
||||||
|
#include "modules/wlr/workspace_manager.hpp"
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_RIVER
|
||||||
|
#include "modules/river/mode.hpp"
|
||||||
|
#include "modules/river/tags.hpp"
|
||||||
|
#include "modules/river/window.hpp"
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_HYPRLAND
|
||||||
|
#include "modules/hyprland/backend.hpp"
|
||||||
|
#include "modules/hyprland/language.hpp"
|
||||||
|
#include "modules/hyprland/submap.hpp"
|
||||||
|
#include "modules/hyprland/window.hpp"
|
||||||
|
#endif
|
||||||
|
#if defined(__FreeBSD__) || (defined(__linux__) && !defined(NO_FILESYSTEM))
|
||||||
#include "modules/battery.hpp"
|
#include "modules/battery.hpp"
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(HAVE_CPU_LINUX) || defined(HAVE_CPU_BSD)
|
||||||
#include "modules/cpu.hpp"
|
#include "modules/cpu.hpp"
|
||||||
|
#endif
|
||||||
#include "modules/idle_inhibitor.hpp"
|
#include "modules/idle_inhibitor.hpp"
|
||||||
|
#if defined(HAVE_MEMORY_LINUX) || defined(HAVE_MEMORY_BSD)
|
||||||
#include "modules/memory.hpp"
|
#include "modules/memory.hpp"
|
||||||
#if defined(HAVE_DBUSMENU) && !defined(NO_FILESYSTEM)
|
#endif
|
||||||
|
#include "modules/disk.hpp"
|
||||||
|
#ifdef HAVE_DBUSMENU
|
||||||
#include "modules/sni/tray.hpp"
|
#include "modules/sni/tray.hpp"
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_MPRIS
|
||||||
|
#include "modules/mpris/mpris.hpp"
|
||||||
|
#endif
|
||||||
#ifdef HAVE_LIBNL
|
#ifdef HAVE_LIBNL
|
||||||
#include "modules/network.hpp"
|
#include "modules/network.hpp"
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_LIBUDEV
|
#ifdef HAVE_LIBUDEV
|
||||||
#include "modules/backlight.hpp"
|
#include "modules/backlight.hpp"
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_LIBEVDEV
|
||||||
|
#include "modules/keyboard_state.hpp"
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_GAMEMODE
|
||||||
|
#include "modules/gamemode.hpp"
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_UPOWER
|
||||||
|
#include "modules/upower/upower.hpp"
|
||||||
|
#endif
|
||||||
#ifdef HAVE_LIBPULSE
|
#ifdef HAVE_LIBPULSE
|
||||||
#include "modules/pulseaudio.hpp"
|
#include "modules/pulseaudio.hpp"
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_LIBMPDCLIENT
|
#ifdef HAVE_LIBMPDCLIENT
|
||||||
#include "modules/mpd.hpp"
|
#include "modules/mpd/mpd.hpp"
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_LIBSNDIO
|
||||||
|
#include "modules/sndio.hpp"
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_GIO_UNIX
|
||||||
|
#include "modules/bluetooth.hpp"
|
||||||
|
#include "modules/inhibitor.hpp"
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_LIBJACK
|
||||||
|
#include "modules/jack.hpp"
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_LIBWIREPLUMBER
|
||||||
|
#include "modules/wireplumber.hpp"
|
||||||
#endif
|
#endif
|
||||||
#include "bar.hpp"
|
#include "bar.hpp"
|
||||||
#include "modules/custom.hpp"
|
#include "modules/custom.hpp"
|
||||||
|
#include "modules/image.hpp"
|
||||||
#include "modules/temperature.hpp"
|
#include "modules/temperature.hpp"
|
||||||
|
#include "modules/user.hpp"
|
||||||
|
|
||||||
namespace waybar {
|
namespace waybar {
|
||||||
|
|
||||||
class Factory {
|
class Factory {
|
||||||
public:
|
public:
|
||||||
Factory(const Bar& bar, const Json::Value& config);
|
Factory(const Bar& bar, const Json::Value& config);
|
||||||
IModule* makeModule(const std::string& name) const;
|
AModule* makeModule(const std::string& name) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const Bar& bar_;
|
const Bar& bar_;
|
||||||
|
22
include/group.hpp
Normal file
22
include/group.hpp
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <gtkmm/box.h>
|
||||||
|
#include <gtkmm/widget.h>
|
||||||
|
#include <json/json.h>
|
||||||
|
|
||||||
|
#include "AModule.hpp"
|
||||||
|
#include "bar.hpp"
|
||||||
|
#include "factory.hpp"
|
||||||
|
|
||||||
|
namespace waybar {
|
||||||
|
|
||||||
|
class Group : public AModule {
|
||||||
|
public:
|
||||||
|
Group(const std::string&, const Bar&, const Json::Value&);
|
||||||
|
~Group() = default;
|
||||||
|
auto update() -> void;
|
||||||
|
operator Gtk::Widget&();
|
||||||
|
Gtk::Box box;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace waybar
|
@ -18,12 +18,14 @@ class Backlight : public ALabel {
|
|||||||
class BacklightDev {
|
class BacklightDev {
|
||||||
public:
|
public:
|
||||||
BacklightDev() = default;
|
BacklightDev() = default;
|
||||||
BacklightDev(std::string name, int actual, int max);
|
BacklightDev(std::string name, int actual, int max, bool powered);
|
||||||
std::string_view name() const;
|
std::string_view name() const;
|
||||||
int get_actual() const;
|
int get_actual() const;
|
||||||
void set_actual(int actual);
|
void set_actual(int actual);
|
||||||
int get_max() const;
|
int get_max() const;
|
||||||
void set_max(int max);
|
void set_max(int max);
|
||||||
|
bool get_powered() const;
|
||||||
|
void set_powered(bool powered);
|
||||||
friend inline bool operator==(const BacklightDev &lhs, const BacklightDev &rhs) {
|
friend inline bool operator==(const BacklightDev &lhs, const BacklightDev &rhs) {
|
||||||
return lhs.name_ == rhs.name_ && lhs.actual_ == rhs.actual_ && lhs.max_ == rhs.max_;
|
return lhs.name_ == rhs.name_ && lhs.actual_ == rhs.actual_ && lhs.max_ == rhs.max_;
|
||||||
}
|
}
|
||||||
@ -32,6 +34,7 @@ class Backlight : public ALabel {
|
|||||||
std::string name_;
|
std::string name_;
|
||||||
int actual_ = 1;
|
int actual_ = 1;
|
||||||
int max_ = 1;
|
int max_ = 1;
|
||||||
|
bool powered_ = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -6,11 +6,15 @@
|
|||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#endif
|
#endif
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
|
#if defined(__linux__)
|
||||||
#include <sys/inotify.h>
|
#include <sys/inotify.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "ALabel.hpp"
|
#include "ALabel.hpp"
|
||||||
#include "util/sleeper_thread.hpp"
|
#include "util/sleeper_thread.hpp"
|
||||||
|
|
||||||
@ -31,19 +35,23 @@ class Battery : public ALabel {
|
|||||||
private:
|
private:
|
||||||
static inline const fs::path data_dir_ = "/sys/class/power_supply/";
|
static inline const fs::path data_dir_ = "/sys/class/power_supply/";
|
||||||
|
|
||||||
void getBatteries();
|
void refreshBatteries();
|
||||||
void worker();
|
void worker();
|
||||||
const std::string getAdapterStatus(uint8_t capacity) const;
|
const std::string getAdapterStatus(uint8_t capacity) const;
|
||||||
const std::tuple<uint8_t, float, std::string> getInfos() const;
|
const std::tuple<uint8_t, float, std::string, float> getInfos();
|
||||||
const std::string formatTimeRemaining(float hoursRemaining);
|
const std::string formatTimeRemaining(float hoursRemaining);
|
||||||
|
|
||||||
std::vector<fs::path> batteries_;
|
int global_watch;
|
||||||
|
std::map<fs::path, int> batteries_;
|
||||||
fs::path adapter_;
|
fs::path adapter_;
|
||||||
int fd_;
|
int battery_watch_fd_;
|
||||||
std::vector<int> wds_;
|
int global_watch_fd_;
|
||||||
|
std::mutex battery_list_mutex_;
|
||||||
std::string old_status_;
|
std::string old_status_;
|
||||||
|
bool warnFirstTime_{true};
|
||||||
|
|
||||||
util::SleeperThread thread_;
|
util::SleeperThread thread_;
|
||||||
|
util::SleeperThread thread_battery_update_;
|
||||||
util::SleeperThread thread_timer_;
|
util::SleeperThread thread_timer_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
79
include/modules/bluetooth.hpp
Normal file
79
include/modules/bluetooth.hpp
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "ALabel.hpp"
|
||||||
|
#ifdef WANT_RFKILL
|
||||||
|
#include "util/rfkill.hpp"
|
||||||
|
#endif
|
||||||
|
#include <gio/gio.h>
|
||||||
|
|
||||||
|
#include <optional>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace waybar::modules {
|
||||||
|
|
||||||
|
class Bluetooth : public ALabel {
|
||||||
|
struct ControllerInfo {
|
||||||
|
std::string path;
|
||||||
|
std::string address;
|
||||||
|
std::string address_type;
|
||||||
|
// std::string name; // just use alias instead
|
||||||
|
std::string alias;
|
||||||
|
bool powered;
|
||||||
|
bool discoverable;
|
||||||
|
bool pairable;
|
||||||
|
bool discovering;
|
||||||
|
};
|
||||||
|
|
||||||
|
// NOTE: there are some properties that not all devices provide
|
||||||
|
struct DeviceInfo {
|
||||||
|
std::string path;
|
||||||
|
std::string paired_controller;
|
||||||
|
std::string address;
|
||||||
|
std::string address_type;
|
||||||
|
// std::optional<std::string> name; // just use alias instead
|
||||||
|
std::string alias;
|
||||||
|
std::optional<std::string> icon;
|
||||||
|
bool paired;
|
||||||
|
bool trusted;
|
||||||
|
bool blocked;
|
||||||
|
bool connected;
|
||||||
|
bool services_resolved;
|
||||||
|
// NOTE: experimental feature in bluez
|
||||||
|
std::optional<unsigned char> battery_percentage;
|
||||||
|
};
|
||||||
|
|
||||||
|
public:
|
||||||
|
Bluetooth(const std::string&, const Json::Value&);
|
||||||
|
~Bluetooth() = default;
|
||||||
|
auto update() -> void;
|
||||||
|
|
||||||
|
private:
|
||||||
|
static auto onInterfaceAddedOrRemoved(GDBusObjectManager*, GDBusObject*, GDBusInterface*,
|
||||||
|
gpointer) -> void;
|
||||||
|
static auto onInterfaceProxyPropertiesChanged(GDBusObjectManagerClient*, GDBusObjectProxy*,
|
||||||
|
GDBusProxy*, GVariant*, const gchar* const*,
|
||||||
|
gpointer) -> void;
|
||||||
|
|
||||||
|
auto getDeviceBatteryPercentage(GDBusObject*) -> std::optional<unsigned char>;
|
||||||
|
auto getDeviceProperties(GDBusObject*, DeviceInfo&) -> bool;
|
||||||
|
auto getControllerProperties(GDBusObject*, ControllerInfo&) -> bool;
|
||||||
|
|
||||||
|
auto findCurController(ControllerInfo&) -> bool;
|
||||||
|
auto findConnectedDevices(const std::string&, std::vector<DeviceInfo>&) -> void;
|
||||||
|
|
||||||
|
#ifdef WANT_RFKILL
|
||||||
|
util::Rfkill rfkill_;
|
||||||
|
#endif
|
||||||
|
const std::unique_ptr<GDBusObjectManager, void (*)(GDBusObjectManager*)> manager_;
|
||||||
|
|
||||||
|
std::string state_;
|
||||||
|
ControllerInfo cur_controller_;
|
||||||
|
std::vector<DeviceInfo> connected_devices_;
|
||||||
|
DeviceInfo cur_focussed_device_;
|
||||||
|
std::string device_enumerate_;
|
||||||
|
|
||||||
|
std::vector<std::string> device_preference_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace waybar::modules
|
@ -1,11 +1,18 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <fmt/format.h>
|
#include <date/tz.h>
|
||||||
|
|
||||||
#include "ALabel.hpp"
|
#include "ALabel.hpp"
|
||||||
#include "fmt/time.h"
|
|
||||||
#include "util/sleeper_thread.hpp"
|
#include "util/sleeper_thread.hpp"
|
||||||
|
|
||||||
namespace waybar::modules {
|
namespace waybar {
|
||||||
|
|
||||||
|
struct waybar_time;
|
||||||
|
|
||||||
|
namespace modules {
|
||||||
|
|
||||||
|
const std::string kCalendarPlaceholder = "calendar";
|
||||||
|
const std::string KTimezonedTimeListPlaceholder = "timezoned_time_list";
|
||||||
|
|
||||||
class Clock : public ALabel {
|
class Clock : public ALabel {
|
||||||
public:
|
public:
|
||||||
@ -15,6 +22,26 @@ class Clock : public ALabel {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
util::SleeperThread thread_;
|
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_;
|
||||||
|
|
||||||
} // namespace waybar::modules
|
bool handleScroll(GdkEventScroll* e);
|
||||||
|
|
||||||
|
std::string fmt_str_weeks_;
|
||||||
|
std::string fmt_str_calendar_;
|
||||||
|
int fmt_weeks_left_pad_{0};
|
||||||
|
auto calendar_text(const waybar_time& wtime) -> std::string;
|
||||||
|
auto weekdays_header(const date::weekday& first_dow, std::ostream& os) -> void;
|
||||||
|
auto first_day_of_week() -> date::weekday;
|
||||||
|
const date::time_zone* current_timezone();
|
||||||
|
bool is_timezone_fixed();
|
||||||
|
auto timezones_text(std::chrono::system_clock::time_point* now) -> std::string;
|
||||||
|
};
|
||||||
|
} // namespace modules
|
||||||
|
} // namespace waybar
|
||||||
|
@ -1,13 +1,14 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
#include <sys/sysinfo.h>
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <numeric>
|
#include <numeric>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "ALabel.hpp"
|
#include "ALabel.hpp"
|
||||||
#include "util/sleeper_thread.hpp"
|
#include "util/sleeper_thread.hpp"
|
||||||
|
|
||||||
@ -20,10 +21,11 @@ class Cpu : public ALabel {
|
|||||||
auto update() -> void;
|
auto update() -> void;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static inline const std::string data_dir_ = "/proc/stat";
|
double getCpuLoad();
|
||||||
uint16_t getCpuLoad();
|
std::tuple<std::vector<uint16_t>, std::string> getCpuUsage();
|
||||||
std::tuple<uint16_t, std::string> getCpuUsage();
|
std::tuple<float, float, float> getCpuFrequency();
|
||||||
std::vector<std::tuple<size_t, size_t>> parseCpuinfo();
|
std::vector<std::tuple<size_t, size_t>> parseCpuinfo();
|
||||||
|
std::vector<float> parseCpuFrequencies();
|
||||||
|
|
||||||
std::vector<std::tuple<size_t, size_t>> prev_times_;
|
std::vector<std::tuple<size_t, size_t>> prev_times_;
|
||||||
|
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
|
|
||||||
#include <csignal>
|
#include <csignal>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include "ALabel.hpp"
|
#include "ALabel.hpp"
|
||||||
#include "util/command.hpp"
|
#include "util/command.hpp"
|
||||||
#include "util/json.hpp"
|
#include "util/json.hpp"
|
||||||
@ -22,11 +24,13 @@ class Custom : public ALabel {
|
|||||||
void continuousWorker();
|
void continuousWorker();
|
||||||
void parseOutputRaw();
|
void parseOutputRaw();
|
||||||
void parseOutputJson();
|
void parseOutputJson();
|
||||||
|
void handleEvent();
|
||||||
bool handleScroll(GdkEventScroll* e);
|
bool handleScroll(GdkEventScroll* e);
|
||||||
bool handleToggle(GdkEventButton* const& e);
|
bool handleToggle(GdkEventButton* const& e);
|
||||||
|
|
||||||
const std::string name_;
|
const std::string name_;
|
||||||
std::string text_;
|
std::string text_;
|
||||||
|
std::string id_;
|
||||||
std::string alt_;
|
std::string alt_;
|
||||||
std::string tooltip_;
|
std::string tooltip_;
|
||||||
std::vector<std::string> class_;
|
std::vector<std::string> class_;
|
||||||
|
25
include/modules/disk.hpp
Normal file
25
include/modules/disk.hpp
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <fmt/format.h>
|
||||||
|
#include <sys/statvfs.h>
|
||||||
|
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
#include "ALabel.hpp"
|
||||||
|
#include "util/format.hpp"
|
||||||
|
#include "util/sleeper_thread.hpp"
|
||||||
|
|
||||||
|
namespace waybar::modules {
|
||||||
|
|
||||||
|
class Disk : public ALabel {
|
||||||
|
public:
|
||||||
|
Disk(const std::string&, const Json::Value&);
|
||||||
|
~Disk() = default;
|
||||||
|
auto update() -> void;
|
||||||
|
|
||||||
|
private:
|
||||||
|
util::SleeperThread thread_;
|
||||||
|
std::string path_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace waybar::modules
|
77
include/modules/gamemode.hpp
Normal file
77
include/modules/gamemode.hpp
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <map>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "ALabel.hpp"
|
||||||
|
#include "giomm/dbusconnection.h"
|
||||||
|
#include "giomm/dbusproxy.h"
|
||||||
|
#include "glibconfig.h"
|
||||||
|
#include "gtkmm/box.h"
|
||||||
|
#include "gtkmm/image.h"
|
||||||
|
#include "gtkmm/label.h"
|
||||||
|
#include "gtkmm/overlay.h"
|
||||||
|
|
||||||
|
namespace waybar::modules {
|
||||||
|
|
||||||
|
class Gamemode : public AModule {
|
||||||
|
public:
|
||||||
|
Gamemode(const std::string &, const Json::Value &);
|
||||||
|
~Gamemode();
|
||||||
|
auto update() -> void;
|
||||||
|
|
||||||
|
private:
|
||||||
|
const std::string DEFAULT_ICON_NAME = "input-gaming-symbolic";
|
||||||
|
const std::string DEFAULT_FORMAT = "{glyph}";
|
||||||
|
const std::string DEFAULT_FORMAT_ALT = "{glyph} {count}";
|
||||||
|
const std::string DEFAULT_TOOLTIP_FORMAT = "Games running: {count}";
|
||||||
|
const std::string DEFAULT_GLYPH = "";
|
||||||
|
|
||||||
|
void appear(const Glib::RefPtr<Gio::DBus::Connection> &connection, const Glib::ustring &name,
|
||||||
|
const Glib::ustring &name_owner);
|
||||||
|
void disappear(const Glib::RefPtr<Gio::DBus::Connection> &connection, const Glib::ustring &name);
|
||||||
|
void prepareForSleep_cb(const Glib::RefPtr<Gio::DBus::Connection> &connection,
|
||||||
|
const Glib::ustring &sender_name, const Glib::ustring &object_path,
|
||||||
|
const Glib::ustring &interface_name, const Glib::ustring &signal_name,
|
||||||
|
const Glib::VariantContainerBase ¶meters);
|
||||||
|
void notify_cb(const Glib::ustring &sender_name, const Glib::ustring &signal_name,
|
||||||
|
const Glib::VariantContainerBase &arguments);
|
||||||
|
|
||||||
|
void getData();
|
||||||
|
bool handleToggle(GdkEventButton *const &);
|
||||||
|
|
||||||
|
// Config
|
||||||
|
std::string format = DEFAULT_FORMAT;
|
||||||
|
std::string format_alt = DEFAULT_FORMAT_ALT;
|
||||||
|
std::string tooltip_format = DEFAULT_TOOLTIP_FORMAT;
|
||||||
|
std::string glyph = DEFAULT_GLYPH;
|
||||||
|
bool tooltip = true;
|
||||||
|
bool hideNotRunning = true;
|
||||||
|
bool useIcon = true;
|
||||||
|
uint iconSize = 20;
|
||||||
|
uint iconSpacing = 4;
|
||||||
|
std::string iconName = DEFAULT_ICON_NAME;
|
||||||
|
|
||||||
|
Gtk::Box box_;
|
||||||
|
Gtk::Image icon_;
|
||||||
|
Gtk::Label label_;
|
||||||
|
|
||||||
|
const std::string dbus_name = "com.feralinteractive.GameMode";
|
||||||
|
const std::string dbus_obj_path = "/com/feralinteractive/GameMode";
|
||||||
|
const std::string dbus_interface = "org.freedesktop.DBus.Properties";
|
||||||
|
const std::string dbus_get_interface = "com.feralinteractive.GameMode";
|
||||||
|
|
||||||
|
uint gameCount = 0;
|
||||||
|
|
||||||
|
std::string lastStatus;
|
||||||
|
bool showAltText = false;
|
||||||
|
|
||||||
|
guint login1_id;
|
||||||
|
Glib::RefPtr<Gio::DBus::Proxy> gamemode_proxy;
|
||||||
|
Glib::RefPtr<Gio::DBus::Connection> system_connection;
|
||||||
|
bool gamemodeRunning;
|
||||||
|
guint gamemodeWatcher_id;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace waybar::modules
|
36
include/modules/hyprland/backend.hpp
Normal file
36
include/modules/hyprland/backend.hpp
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <functional>
|
||||||
|
#include <list>
|
||||||
|
#include <memory>
|
||||||
|
#include <mutex>
|
||||||
|
#include <string>
|
||||||
|
#include <thread>
|
||||||
|
|
||||||
|
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&, EventHandler*);
|
||||||
|
void unregisterForIPC(EventHandler*);
|
||||||
|
|
||||||
|
std::string getSocket1Reply(const std::string& rq);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void startIPC();
|
||||||
|
void parseIPC(const std::string&);
|
||||||
|
|
||||||
|
std::mutex callbackMutex;
|
||||||
|
std::list<std::pair<std::string, EventHandler*>> callbacks;
|
||||||
|
};
|
||||||
|
|
||||||
|
inline std::unique_ptr<IPC> gIPC;
|
||||||
|
inline bool modulesReady = false;
|
||||||
|
}; // namespace waybar::modules::hyprland
|
29
include/modules/hyprland/language.hpp
Normal file
29
include/modules/hyprland/language.hpp
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
#include <fmt/format.h>
|
||||||
|
|
||||||
|
#include "ALabel.hpp"
|
||||||
|
#include "bar.hpp"
|
||||||
|
#include "modules/hyprland/backend.hpp"
|
||||||
|
#include "util/json.hpp"
|
||||||
|
|
||||||
|
namespace waybar::modules::hyprland {
|
||||||
|
|
||||||
|
class Language : public waybar::ALabel, public EventHandler {
|
||||||
|
public:
|
||||||
|
Language(const std::string&, const waybar::Bar&, const Json::Value&);
|
||||||
|
~Language();
|
||||||
|
|
||||||
|
auto update() -> void;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void onEvent(const std::string&);
|
||||||
|
|
||||||
|
void initLanguage();
|
||||||
|
std::string getShortFrom(const std::string&);
|
||||||
|
|
||||||
|
std::mutex mutex_;
|
||||||
|
const Bar& bar_;
|
||||||
|
util::JsonParser parser_;
|
||||||
|
std::string layoutName_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace waybar::modules::hyprland
|
26
include/modules/hyprland/submap.hpp
Normal file
26
include/modules/hyprland/submap.hpp
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
#include <fmt/format.h>
|
||||||
|
|
||||||
|
#include "ALabel.hpp"
|
||||||
|
#include "bar.hpp"
|
||||||
|
#include "modules/hyprland/backend.hpp"
|
||||||
|
#include "util/json.hpp"
|
||||||
|
|
||||||
|
namespace waybar::modules::hyprland {
|
||||||
|
|
||||||
|
class Submap : public waybar::ALabel, public EventHandler {
|
||||||
|
public:
|
||||||
|
Submap(const std::string&, const waybar::Bar&, const Json::Value&);
|
||||||
|
~Submap();
|
||||||
|
|
||||||
|
auto update() -> void;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void onEvent(const std::string&);
|
||||||
|
|
||||||
|
std::mutex mutex_;
|
||||||
|
const Bar& bar_;
|
||||||
|
util::JsonParser parser_;
|
||||||
|
std::string submap_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace waybar::modules::hyprland
|
31
include/modules/hyprland/window.hpp
Normal file
31
include/modules/hyprland/window.hpp
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
#include <fmt/format.h>
|
||||||
|
|
||||||
|
#include <tuple>
|
||||||
|
|
||||||
|
#include "ALabel.hpp"
|
||||||
|
#include "bar.hpp"
|
||||||
|
#include "modules/hyprland/backend.hpp"
|
||||||
|
#include "util/json.hpp"
|
||||||
|
|
||||||
|
namespace waybar::modules::hyprland {
|
||||||
|
|
||||||
|
class Window : public waybar::ALabel, public EventHandler {
|
||||||
|
public:
|
||||||
|
Window(const std::string&, const waybar::Bar&, const Json::Value&);
|
||||||
|
~Window();
|
||||||
|
|
||||||
|
auto update() -> void;
|
||||||
|
|
||||||
|
private:
|
||||||
|
int getActiveWorkspaceID(std::string);
|
||||||
|
std::string getLastWindowTitle(int);
|
||||||
|
void onEvent(const std::string&);
|
||||||
|
|
||||||
|
bool separate_outputs;
|
||||||
|
std::mutex mutex_;
|
||||||
|
const Bar& bar_;
|
||||||
|
util::JsonParser parser_;
|
||||||
|
std::string lastView;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace waybar::modules::hyprland
|
@ -1,6 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
|
|
||||||
#include "ALabel.hpp"
|
#include "ALabel.hpp"
|
||||||
#include "bar.hpp"
|
#include "bar.hpp"
|
||||||
#include "client.hpp"
|
#include "client.hpp"
|
||||||
@ -8,16 +9,20 @@
|
|||||||
namespace waybar::modules {
|
namespace waybar::modules {
|
||||||
|
|
||||||
class IdleInhibitor : public ALabel {
|
class IdleInhibitor : public ALabel {
|
||||||
|
sigc::connection timeout_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
IdleInhibitor(const std::string&, const waybar::Bar&, const Json::Value&);
|
IdleInhibitor(const std::string&, const waybar::Bar&, const Json::Value&);
|
||||||
~IdleInhibitor();
|
~IdleInhibitor();
|
||||||
auto update() -> void;
|
auto update() -> void;
|
||||||
|
static std::list<waybar::AModule*> modules;
|
||||||
|
static bool status;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool handleToggle(GdkEventButton* const& e);
|
bool handleToggle(GdkEventButton* const& e);
|
||||||
|
void toggleStatus();
|
||||||
|
|
||||||
const Bar& bar_;
|
const Bar& bar_;
|
||||||
std::string status_;
|
|
||||||
struct zwp_idle_inhibitor_v1* idle_inhibitor_;
|
struct zwp_idle_inhibitor_v1* idle_inhibitor_;
|
||||||
int pid_;
|
int pid_;
|
||||||
};
|
};
|
||||||
|
34
include/modules/image.hpp
Normal file
34
include/modules/image.hpp
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <fmt/format.h>
|
||||||
|
#include <gtkmm/image.h>
|
||||||
|
|
||||||
|
#include <csignal>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "ALabel.hpp"
|
||||||
|
#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 std::string&, const Json::Value&);
|
||||||
|
auto update() -> void;
|
||||||
|
void refresh(int /*signal*/);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void delayWorker();
|
||||||
|
void handleEvent();
|
||||||
|
|
||||||
|
Gtk::Image image_;
|
||||||
|
std::string path_;
|
||||||
|
int size_;
|
||||||
|
int interval_;
|
||||||
|
|
||||||
|
util::SleeperThread thread_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace waybar::modules
|
27
include/modules/inhibitor.hpp
Normal file
27
include/modules/inhibitor.hpp
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <gio/gio.h>
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
#include "ALabel.hpp"
|
||||||
|
#include "bar.hpp"
|
||||||
|
|
||||||
|
namespace waybar::modules {
|
||||||
|
|
||||||
|
class Inhibitor : public ALabel {
|
||||||
|
public:
|
||||||
|
Inhibitor(const std::string&, const waybar::Bar&, const Json::Value&);
|
||||||
|
~Inhibitor() override;
|
||||||
|
auto update() -> void;
|
||||||
|
auto activated() -> bool;
|
||||||
|
|
||||||
|
private:
|
||||||
|
auto handleToggle(::GdkEventButton* const& e) -> bool;
|
||||||
|
|
||||||
|
const std::unique_ptr<::GDBusConnection, void (*)(::GDBusConnection*)> dbus_;
|
||||||
|
const std::string inhibitors_;
|
||||||
|
int handle_ = -1;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace waybar::modules
|
44
include/modules/jack.hpp
Normal file
44
include/modules/jack.hpp
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <fmt/format.h>
|
||||||
|
#include <jack/jack.h>
|
||||||
|
#include <jack/thread.h>
|
||||||
|
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
#include "ALabel.hpp"
|
||||||
|
#include "util/sleeper_thread.hpp"
|
||||||
|
|
||||||
|
namespace waybar::modules {
|
||||||
|
|
||||||
|
class JACK : public ALabel {
|
||||||
|
public:
|
||||||
|
JACK(const std::string &, const Json::Value &);
|
||||||
|
~JACK() = default;
|
||||||
|
auto update() -> void;
|
||||||
|
|
||||||
|
int bufSize(jack_nframes_t size);
|
||||||
|
int sampleRate(jack_nframes_t rate);
|
||||||
|
int xrun();
|
||||||
|
void shutdown();
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string JACKState();
|
||||||
|
|
||||||
|
jack_client_t *client_;
|
||||||
|
jack_nframes_t bufsize_;
|
||||||
|
jack_nframes_t samplerate_;
|
||||||
|
unsigned int xruns_;
|
||||||
|
float load_;
|
||||||
|
bool running_;
|
||||||
|
std::mutex mutex_;
|
||||||
|
std::string state_;
|
||||||
|
util::SleeperThread thread_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace waybar::modules
|
||||||
|
|
||||||
|
int bufSizeCallback(jack_nframes_t size, void *obj);
|
||||||
|
int sampleRateCallback(jack_nframes_t rate, void *obj);
|
||||||
|
int xrunCallback(void *obj);
|
||||||
|
void shutdownCallback(void *obj);
|
47
include/modules/keyboard_state.hpp
Normal file
47
include/modules/keyboard_state.hpp
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <fmt/chrono.h>
|
||||||
|
#include <gtkmm/label.h>
|
||||||
|
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
|
#include "AModule.hpp"
|
||||||
|
#include "bar.hpp"
|
||||||
|
#include "util/sleeper_thread.hpp"
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
#include <libevdev/libevdev.h>
|
||||||
|
#include <libinput.h>
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace waybar::modules {
|
||||||
|
|
||||||
|
class KeyboardState : public AModule {
|
||||||
|
public:
|
||||||
|
KeyboardState(const std::string&, const waybar::Bar&, const Json::Value&);
|
||||||
|
~KeyboardState();
|
||||||
|
auto update() -> void;
|
||||||
|
|
||||||
|
private:
|
||||||
|
auto tryAddDevice(const std::string&) -> void;
|
||||||
|
|
||||||
|
Gtk::Box box_;
|
||||||
|
Gtk::Label numlock_label_;
|
||||||
|
Gtk::Label capslock_label_;
|
||||||
|
Gtk::Label scrolllock_label_;
|
||||||
|
|
||||||
|
std::string numlock_format_;
|
||||||
|
std::string capslock_format_;
|
||||||
|
std::string scrolllock_format_;
|
||||||
|
const std::chrono::seconds interval_;
|
||||||
|
std::string icon_locked_;
|
||||||
|
std::string icon_unlocked_;
|
||||||
|
std::string devices_path_;
|
||||||
|
|
||||||
|
struct libinput* libinput_;
|
||||||
|
std::unordered_map<std::string, struct libinput_device*> libinput_devices_;
|
||||||
|
|
||||||
|
util::SleeperThread libinput_thread_, hotplug_thread_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace waybar::modules
|
@ -1,7 +1,10 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
#include "ALabel.hpp"
|
#include "ALabel.hpp"
|
||||||
#include "util/sleeper_thread.hpp"
|
#include "util/sleeper_thread.hpp"
|
||||||
|
|
||||||
@ -14,11 +17,9 @@ class Memory : public ALabel {
|
|||||||
auto update() -> void;
|
auto update() -> void;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static inline const std::string data_dir_ = "/proc/meminfo";
|
|
||||||
void parseMeminfo();
|
void parseMeminfo();
|
||||||
|
|
||||||
unsigned long memtotal_;
|
std::unordered_map<std::string, unsigned long> meminfo_;
|
||||||
unsigned long memfree_;
|
|
||||||
|
|
||||||
util::SleeperThread thread_;
|
util::SleeperThread thread_;
|
||||||
};
|
};
|
||||||
|
@ -1,70 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <fmt/format.h>
|
|
||||||
#include <mpd/client.h>
|
|
||||||
#include <condition_variable>
|
|
||||||
#include <thread>
|
|
||||||
#include "ALabel.hpp"
|
|
||||||
|
|
||||||
namespace waybar::modules {
|
|
||||||
|
|
||||||
class MPD : public ALabel {
|
|
||||||
public:
|
|
||||||
MPD(const std::string&, const Json::Value&);
|
|
||||||
auto update() -> void;
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::thread periodic_updater();
|
|
||||||
std::string getTag(mpd_tag_type type, unsigned idx = 0);
|
|
||||||
void setLabel();
|
|
||||||
std::string getStateIcon();
|
|
||||||
std::string getOptionIcon(std::string optionName, bool activated);
|
|
||||||
|
|
||||||
std::thread event_listener();
|
|
||||||
|
|
||||||
// Assumes `connection_lock_` is locked
|
|
||||||
void tryConnect();
|
|
||||||
// If checking errors on the main connection, make sure to lock it using
|
|
||||||
// `connection_lock_` before calling checkErrors
|
|
||||||
void checkErrors(mpd_connection* conn);
|
|
||||||
|
|
||||||
// Assumes `connection_lock_` is locked
|
|
||||||
void fetchState();
|
|
||||||
void waitForEvent();
|
|
||||||
|
|
||||||
bool handlePlayPause(GdkEventButton* const&);
|
|
||||||
|
|
||||||
bool stopped();
|
|
||||||
bool playing();
|
|
||||||
|
|
||||||
const std::string module_name_;
|
|
||||||
|
|
||||||
using unique_connection = std::unique_ptr<mpd_connection, decltype(&mpd_connection_free)>;
|
|
||||||
using unique_status = std::unique_ptr<mpd_status, decltype(&mpd_status_free)>;
|
|
||||||
using unique_song = std::unique_ptr<mpd_song, decltype(&mpd_song_free)>;
|
|
||||||
|
|
||||||
// Not using unique_ptr since we don't manage the pointer
|
|
||||||
// (It's either nullptr, or from the config)
|
|
||||||
const char* server_;
|
|
||||||
const unsigned port_;
|
|
||||||
|
|
||||||
unsigned timeout_;
|
|
||||||
|
|
||||||
// We need a mutex here because we can trigger updates from multiple thread:
|
|
||||||
// the event based updates, the periodic updates needed for the elapsed time,
|
|
||||||
// and the click play/pause feature
|
|
||||||
std::mutex connection_lock_;
|
|
||||||
unique_connection connection_;
|
|
||||||
// The alternate connection will be used to wait for events: since it will
|
|
||||||
// be blocking (idle) we can't send commands via this connection
|
|
||||||
//
|
|
||||||
// No lock since only used in the event listener thread
|
|
||||||
unique_connection alternate_connection_;
|
|
||||||
|
|
||||||
// Protect them using the `connection_lock_`
|
|
||||||
unique_status status_;
|
|
||||||
mpd_state state_;
|
|
||||||
unique_song song_;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace waybar::modules
|
|
68
include/modules/mpd/mpd.hpp
Normal file
68
include/modules/mpd/mpd.hpp
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <fmt/format.h>
|
||||||
|
#include <mpd/client.h>
|
||||||
|
#include <spdlog/spdlog.h>
|
||||||
|
|
||||||
|
#include <condition_variable>
|
||||||
|
#include <thread>
|
||||||
|
|
||||||
|
#include "ALabel.hpp"
|
||||||
|
#include "modules/mpd/state.hpp"
|
||||||
|
|
||||||
|
namespace waybar::modules {
|
||||||
|
|
||||||
|
class MPD : public ALabel {
|
||||||
|
friend class detail::Context;
|
||||||
|
|
||||||
|
// State machine
|
||||||
|
detail::Context context_{this};
|
||||||
|
|
||||||
|
const std::string module_name_;
|
||||||
|
|
||||||
|
// Not using unique_ptr since we don't manage the pointer
|
||||||
|
// (It's either nullptr, or from the config)
|
||||||
|
const char* server_;
|
||||||
|
const unsigned port_;
|
||||||
|
const std::string password_;
|
||||||
|
|
||||||
|
unsigned timeout_;
|
||||||
|
|
||||||
|
detail::unique_connection connection_;
|
||||||
|
|
||||||
|
detail::unique_status status_;
|
||||||
|
mpd_state state_;
|
||||||
|
detail::unique_song song_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
MPD(const std::string&, const Json::Value&);
|
||||||
|
virtual ~MPD() noexcept = default;
|
||||||
|
auto update() -> void;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string getTag(mpd_tag_type type, unsigned idx = 0) const;
|
||||||
|
std::string getFilename() const;
|
||||||
|
void setLabel();
|
||||||
|
std::string getStateIcon() const;
|
||||||
|
std::string getOptionIcon(std::string optionName, bool activated) const;
|
||||||
|
|
||||||
|
// GUI-side methods
|
||||||
|
bool handlePlayPause(GdkEventButton* const&);
|
||||||
|
void emit() { dp.emit(); }
|
||||||
|
|
||||||
|
// MPD-side, Non-GUI methods.
|
||||||
|
void tryConnect();
|
||||||
|
void checkErrors(mpd_connection* conn);
|
||||||
|
void fetchState();
|
||||||
|
void queryMPD();
|
||||||
|
|
||||||
|
inline bool stopped() const { return connection_ && state_ == MPD_STATE_STOP; }
|
||||||
|
inline bool playing() const { return connection_ && state_ == MPD_STATE_PLAY; }
|
||||||
|
inline bool paused() const { return connection_ && state_ == MPD_STATE_PAUSE; }
|
||||||
|
};
|
||||||
|
|
||||||
|
#if !defined(MPD_NOINLINE)
|
||||||
|
#include "modules/mpd/state.inl.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
} // namespace waybar::modules
|
217
include/modules/mpd/state.hpp
Normal file
217
include/modules/mpd/state.hpp
Normal file
@ -0,0 +1,217 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <fmt/format.h>
|
||||||
|
#include <mpd/client.h>
|
||||||
|
#include <spdlog/spdlog.h>
|
||||||
|
|
||||||
|
#include <condition_variable>
|
||||||
|
#include <thread>
|
||||||
|
|
||||||
|
#include "ALabel.hpp"
|
||||||
|
|
||||||
|
namespace waybar::modules {
|
||||||
|
class MPD;
|
||||||
|
} // namespace waybar::modules
|
||||||
|
|
||||||
|
namespace waybar::modules::detail {
|
||||||
|
|
||||||
|
using unique_connection = std::unique_ptr<mpd_connection, decltype(&mpd_connection_free)>;
|
||||||
|
using unique_status = std::unique_ptr<mpd_status, decltype(&mpd_status_free)>;
|
||||||
|
using unique_song = std::unique_ptr<mpd_song, decltype(&mpd_song_free)>;
|
||||||
|
|
||||||
|
class Context;
|
||||||
|
|
||||||
|
/// This state machine loosely follows a non-hierarchical, statechart
|
||||||
|
/// pattern, and includes ENTRY and EXIT actions.
|
||||||
|
///
|
||||||
|
/// The State class is the base class for all other states. The
|
||||||
|
/// entry and exit methods are automatically called when entering
|
||||||
|
/// into a new state and exiting from the current state. This
|
||||||
|
/// includes initially entering (Disconnected class) and exiting
|
||||||
|
/// Waybar.
|
||||||
|
///
|
||||||
|
/// The following nested "top-level" states are represented:
|
||||||
|
/// 1. Idle - await notification of MPD activity.
|
||||||
|
/// 2. All Non-Idle states:
|
||||||
|
/// 1. Playing - An active song is producing audio output.
|
||||||
|
/// 2. Paused - The current song is paused.
|
||||||
|
/// 3. Stopped - No song is actively playing.
|
||||||
|
/// 3. Disconnected - periodically attempt MPD (re-)connection.
|
||||||
|
///
|
||||||
|
/// NOTE: Since this statechart is non-hierarchical, the above
|
||||||
|
/// states are flattened into a set.
|
||||||
|
|
||||||
|
class State {
|
||||||
|
public:
|
||||||
|
virtual ~State() noexcept = default;
|
||||||
|
|
||||||
|
virtual void entry() noexcept { spdlog::debug("mpd: ignore entry action"); }
|
||||||
|
virtual void exit() noexcept { spdlog::debug("mpd: ignore exit action"); }
|
||||||
|
|
||||||
|
virtual void play() { spdlog::debug("mpd: ignore play state transition"); }
|
||||||
|
virtual void stop() { spdlog::debug("mpd: ignore stop state transition"); }
|
||||||
|
virtual void pause() { spdlog::debug("mpd: ignore pause state transition"); }
|
||||||
|
|
||||||
|
/// Request state update the GUI.
|
||||||
|
virtual void update() noexcept { spdlog::debug("mpd: ignoring update method request"); }
|
||||||
|
};
|
||||||
|
|
||||||
|
class Idle : public State {
|
||||||
|
Context* const ctx_;
|
||||||
|
sigc::connection idle_connection_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Idle(Context* const ctx) : ctx_{ctx} {}
|
||||||
|
virtual ~Idle() noexcept { this->exit(); };
|
||||||
|
|
||||||
|
void entry() noexcept override;
|
||||||
|
void exit() noexcept override;
|
||||||
|
|
||||||
|
void play() override;
|
||||||
|
void stop() override;
|
||||||
|
void pause() override;
|
||||||
|
void update() noexcept override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Idle(const Idle&) = delete;
|
||||||
|
Idle& operator=(const Idle&) = delete;
|
||||||
|
|
||||||
|
bool on_io(Glib::IOCondition const&);
|
||||||
|
};
|
||||||
|
|
||||||
|
class Playing : public State {
|
||||||
|
Context* const ctx_;
|
||||||
|
sigc::connection timer_connection_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Playing(Context* const ctx) : ctx_{ctx} {}
|
||||||
|
virtual ~Playing() noexcept { this->exit(); }
|
||||||
|
|
||||||
|
void entry() noexcept override;
|
||||||
|
void exit() noexcept override;
|
||||||
|
|
||||||
|
void pause() override;
|
||||||
|
void stop() override;
|
||||||
|
void update() noexcept override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Playing(Playing const&) = delete;
|
||||||
|
Playing& operator=(Playing const&) = delete;
|
||||||
|
|
||||||
|
bool on_timer();
|
||||||
|
};
|
||||||
|
|
||||||
|
class Paused : public State {
|
||||||
|
Context* const ctx_;
|
||||||
|
sigc::connection timer_connection_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Paused(Context* const ctx) : ctx_{ctx} {}
|
||||||
|
virtual ~Paused() noexcept { this->exit(); }
|
||||||
|
|
||||||
|
void entry() noexcept override;
|
||||||
|
void exit() noexcept override;
|
||||||
|
|
||||||
|
void play() override;
|
||||||
|
void stop() override;
|
||||||
|
void update() noexcept override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Paused(Paused const&) = delete;
|
||||||
|
Paused& operator=(Paused const&) = delete;
|
||||||
|
|
||||||
|
bool on_timer();
|
||||||
|
};
|
||||||
|
|
||||||
|
class Stopped : public State {
|
||||||
|
Context* const ctx_;
|
||||||
|
sigc::connection timer_connection_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Stopped(Context* const ctx) : ctx_{ctx} {}
|
||||||
|
virtual ~Stopped() noexcept { this->exit(); }
|
||||||
|
|
||||||
|
void entry() noexcept override;
|
||||||
|
void exit() noexcept override;
|
||||||
|
|
||||||
|
void play() override;
|
||||||
|
void pause() override;
|
||||||
|
void update() noexcept override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Stopped(Stopped const&) = delete;
|
||||||
|
Stopped& operator=(Stopped const&) = delete;
|
||||||
|
|
||||||
|
bool on_timer();
|
||||||
|
};
|
||||||
|
|
||||||
|
class Disconnected : public State {
|
||||||
|
Context* const ctx_;
|
||||||
|
sigc::connection timer_connection_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Disconnected(Context* const ctx) : ctx_{ctx} {}
|
||||||
|
virtual ~Disconnected() noexcept { this->exit(); }
|
||||||
|
|
||||||
|
void entry() noexcept override;
|
||||||
|
void exit() noexcept override;
|
||||||
|
|
||||||
|
void update() noexcept override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Disconnected(Disconnected const&) = delete;
|
||||||
|
Disconnected& operator=(Disconnected const&) = delete;
|
||||||
|
|
||||||
|
void arm_timer(int interval) noexcept;
|
||||||
|
void disarm_timer() noexcept;
|
||||||
|
|
||||||
|
bool on_timer();
|
||||||
|
};
|
||||||
|
|
||||||
|
class Context {
|
||||||
|
std::unique_ptr<State> state_;
|
||||||
|
waybar::modules::MPD* mpd_module_;
|
||||||
|
|
||||||
|
friend class State;
|
||||||
|
friend class Playing;
|
||||||
|
friend class Paused;
|
||||||
|
friend class Stopped;
|
||||||
|
friend class Disconnected;
|
||||||
|
friend class Idle;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void setState(std::unique_ptr<State>&& new_state) noexcept {
|
||||||
|
if (state_.get() != nullptr) {
|
||||||
|
state_->exit();
|
||||||
|
}
|
||||||
|
state_ = std::move(new_state);
|
||||||
|
state_->entry();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool is_connected() const;
|
||||||
|
bool is_playing() const;
|
||||||
|
bool is_paused() const;
|
||||||
|
bool is_stopped() const;
|
||||||
|
constexpr std::size_t interval() const;
|
||||||
|
void tryConnect() const;
|
||||||
|
void checkErrors(mpd_connection*) const;
|
||||||
|
void do_update();
|
||||||
|
void queryMPD() const;
|
||||||
|
void fetchState() const;
|
||||||
|
constexpr mpd_state state() const;
|
||||||
|
void emit() const;
|
||||||
|
[[nodiscard]] unique_connection& connection();
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit Context(waybar::modules::MPD* const mpd_module)
|
||||||
|
: state_{std::make_unique<Disconnected>(this)}, mpd_module_{mpd_module} {
|
||||||
|
state_->entry();
|
||||||
|
}
|
||||||
|
|
||||||
|
void play() { state_->play(); }
|
||||||
|
void stop() { state_->stop(); }
|
||||||
|
void pause() { state_->pause(); }
|
||||||
|
void update() noexcept { state_->update(); }
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace waybar::modules::detail
|
22
include/modules/mpd/state.inl.hpp
Normal file
22
include/modules/mpd/state.inl.hpp
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace detail {
|
||||||
|
|
||||||
|
inline bool Context::is_connected() const { return mpd_module_->connection_ != nullptr; }
|
||||||
|
inline bool Context::is_playing() const { return mpd_module_->playing(); }
|
||||||
|
inline bool Context::is_paused() const { return mpd_module_->paused(); }
|
||||||
|
inline bool Context::is_stopped() const { return mpd_module_->stopped(); }
|
||||||
|
|
||||||
|
constexpr inline std::size_t Context::interval() const { return mpd_module_->interval_.count(); }
|
||||||
|
inline void Context::tryConnect() const { mpd_module_->tryConnect(); }
|
||||||
|
inline unique_connection& Context::connection() { return mpd_module_->connection_; }
|
||||||
|
constexpr inline mpd_state Context::state() const { return mpd_module_->state_; }
|
||||||
|
|
||||||
|
inline void Context::do_update() { mpd_module_->setLabel(); }
|
||||||
|
|
||||||
|
inline void Context::checkErrors(mpd_connection* conn) const { mpd_module_->checkErrors(conn); }
|
||||||
|
inline void Context::queryMPD() const { mpd_module_->queryMPD(); }
|
||||||
|
inline void Context::fetchState() const { mpd_module_->fetchState(); }
|
||||||
|
inline void Context::emit() const { mpd_module_->emit(); }
|
||||||
|
|
||||||
|
} // namespace detail
|
68
include/modules/mpris/mpris.hpp
Normal file
68
include/modules/mpris/mpris.hpp
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
#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 AModule {
|
||||||
|
public:
|
||||||
|
Mpris(const std::string&, const Json::Value&);
|
||||||
|
~Mpris();
|
||||||
|
auto update() -> void;
|
||||||
|
bool handleToggle(GdkEventButton* const&);
|
||||||
|
|
||||||
|
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
|
||||||
|
};
|
||||||
|
|
||||||
|
auto getPlayerInfo() -> std::optional<PlayerInfo>;
|
||||||
|
auto getIcon(const Json::Value&, const std::string&) -> std::string;
|
||||||
|
|
||||||
|
Gtk::Box box_;
|
||||||
|
Gtk::Label label_;
|
||||||
|
|
||||||
|
// config
|
||||||
|
std::string format_;
|
||||||
|
std::string format_playing_;
|
||||||
|
std::string format_paused_;
|
||||||
|
std::string format_stopped_;
|
||||||
|
std::chrono::seconds interval_;
|
||||||
|
std::string player_;
|
||||||
|
std::vector<std::string> ignored_players_;
|
||||||
|
|
||||||
|
PlayerctlPlayerManager* manager;
|
||||||
|
PlayerctlPlayer* player;
|
||||||
|
std::string lastStatus;
|
||||||
|
std::string lastPlayer;
|
||||||
|
|
||||||
|
util::SleeperThread thread_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace waybar::modules::mpris
|
@ -2,15 +2,19 @@
|
|||||||
|
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
#include <ifaddrs.h>
|
|
||||||
#include <linux/nl80211.h>
|
#include <linux/nl80211.h>
|
||||||
#include <net/if.h>
|
|
||||||
#include <netlink/genl/ctrl.h>
|
#include <netlink/genl/ctrl.h>
|
||||||
#include <netlink/genl/genl.h>
|
#include <netlink/genl/genl.h>
|
||||||
#include <netlink/netlink.h>
|
#include <netlink/netlink.h>
|
||||||
#include <sys/epoll.h>
|
#include <sys/epoll.h>
|
||||||
|
|
||||||
|
#include <optional>
|
||||||
|
|
||||||
#include "ALabel.hpp"
|
#include "ALabel.hpp"
|
||||||
#include "util/sleeper_thread.hpp"
|
#include "util/sleeper_thread.hpp"
|
||||||
|
#ifdef WANT_RFKILL
|
||||||
|
#include "util/rfkill.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace waybar::modules {
|
namespace waybar::modules {
|
||||||
|
|
||||||
@ -25,26 +29,24 @@ class Network : public ALabel {
|
|||||||
static const uint8_t EPOLL_MAX = 200;
|
static const uint8_t EPOLL_MAX = 200;
|
||||||
|
|
||||||
static int handleEvents(struct nl_msg*, void*);
|
static int handleEvents(struct nl_msg*, void*);
|
||||||
|
static int handleEventsDone(struct nl_msg*, void*);
|
||||||
static int handleScan(struct nl_msg*, void*);
|
static int handleScan(struct nl_msg*, void*);
|
||||||
|
|
||||||
|
void askForStateDump(void);
|
||||||
|
|
||||||
void worker();
|
void worker();
|
||||||
void createInfoSocket();
|
void createInfoSocket();
|
||||||
void createEventSocket();
|
void createEventSocket();
|
||||||
int getExternalInterface(int skip_idx = -1) const;
|
|
||||||
void getInterfaceAddress();
|
|
||||||
int netlinkRequest(void*, uint32_t, uint32_t groups = 0) const;
|
|
||||||
int netlinkResponse(void*, uint32_t, uint32_t groups = 0) const;
|
|
||||||
void parseEssid(struct nlattr**);
|
void parseEssid(struct nlattr**);
|
||||||
void parseSignal(struct nlattr**);
|
void parseSignal(struct nlattr**);
|
||||||
void parseFreq(struct nlattr**);
|
void parseFreq(struct nlattr**);
|
||||||
bool associatedOrJoined(struct nlattr**);
|
bool associatedOrJoined(struct nlattr**);
|
||||||
bool checkInterface(struct ifinfomsg* rtif, std::string name);
|
bool checkInterface(std::string name);
|
||||||
int getPreferredIface(int skip_idx = -1) const;
|
|
||||||
auto getInfo() -> void;
|
auto getInfo() -> void;
|
||||||
void checkNewInterface(struct ifinfomsg* rtif);
|
|
||||||
const std::string getNetworkState() const;
|
const std::string getNetworkState() const;
|
||||||
void clearIface();
|
void clearIface();
|
||||||
bool wildcardMatch(const std::string& pattern, const std::string& text) const;
|
bool wildcardMatch(const std::string& pattern, const std::string& text) const;
|
||||||
|
std::optional<std::pair<unsigned long long, unsigned long long>> readBandwidthUsage();
|
||||||
|
|
||||||
int ifid_;
|
int ifid_;
|
||||||
sa_family_t family_;
|
sa_family_t family_;
|
||||||
@ -56,21 +58,33 @@ class Network : public ALabel {
|
|||||||
int nl80211_id_;
|
int nl80211_id_;
|
||||||
std::mutex mutex_;
|
std::mutex mutex_;
|
||||||
|
|
||||||
|
bool want_route_dump_;
|
||||||
|
bool want_link_dump_;
|
||||||
|
bool want_addr_dump_;
|
||||||
|
bool dump_in_progress_;
|
||||||
|
|
||||||
unsigned long long bandwidth_down_total_;
|
unsigned long long bandwidth_down_total_;
|
||||||
unsigned long long bandwidth_up_total_;
|
unsigned long long bandwidth_up_total_;
|
||||||
|
|
||||||
std::string state_;
|
std::string state_;
|
||||||
std::string essid_;
|
std::string essid_;
|
||||||
|
bool carrier_;
|
||||||
std::string ifname_;
|
std::string ifname_;
|
||||||
std::string ipaddr_;
|
std::string ipaddr_;
|
||||||
|
std::string gwaddr_;
|
||||||
std::string netmask_;
|
std::string netmask_;
|
||||||
int cidr_;
|
int cidr_;
|
||||||
int32_t signal_strength_dbm_;
|
int32_t signal_strength_dbm_;
|
||||||
uint8_t signal_strength_;
|
uint8_t signal_strength_;
|
||||||
uint32_t frequency_;
|
std::string signal_strength_app_;
|
||||||
|
float frequency_;
|
||||||
|
uint32_t route_priority;
|
||||||
|
|
||||||
util::SleeperThread thread_;
|
util::SleeperThread thread_;
|
||||||
util::SleeperThread thread_timer_;
|
util::SleeperThread thread_timer_;
|
||||||
|
#ifdef WANT_RFKILL
|
||||||
|
util::Rfkill rfkill_;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace waybar::modules
|
} // namespace waybar::modules
|
||||||
|
@ -3,7 +3,10 @@
|
|||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
#include <pulse/pulseaudio.h>
|
#include <pulse/pulseaudio.h>
|
||||||
#include <pulse/volume.h>
|
#include <pulse/volume.h>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <array>
|
||||||
|
|
||||||
#include "ALabel.hpp"
|
#include "ALabel.hpp"
|
||||||
|
|
||||||
namespace waybar::modules {
|
namespace waybar::modules {
|
||||||
@ -21,28 +24,31 @@ class Pulseaudio : public ALabel {
|
|||||||
static void sourceInfoCb(pa_context*, const pa_source_info* i, int, void* data);
|
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 serverInfoCb(pa_context*, const pa_server_info*, void*);
|
||||||
static void volumeModifyCb(pa_context*, int, void*);
|
static void volumeModifyCb(pa_context*, int, void*);
|
||||||
bool handleVolume(GdkEventScroll* e);
|
|
||||||
|
|
||||||
const std::string getPortIcon() const;
|
bool handleScroll(GdkEventScroll* e);
|
||||||
|
const std::vector<std::string> getPulseIcon() const;
|
||||||
|
|
||||||
pa_threaded_mainloop* mainloop_;
|
pa_threaded_mainloop* mainloop_;
|
||||||
pa_mainloop_api* mainloop_api_;
|
pa_mainloop_api* mainloop_api_;
|
||||||
pa_context* context_;
|
pa_context* context_;
|
||||||
bool scrolling_;
|
|
||||||
// SINK
|
// SINK
|
||||||
uint32_t sink_idx_{0};
|
uint32_t sink_idx_{0};
|
||||||
uint16_t volume_;
|
uint16_t volume_;
|
||||||
pa_cvolume pa_volume_;
|
pa_cvolume pa_volume_;
|
||||||
bool muted_;
|
bool muted_;
|
||||||
std::string port_name_;
|
std::string port_name_;
|
||||||
|
std::string form_factor_;
|
||||||
std::string desc_;
|
std::string desc_;
|
||||||
std::string monitor_;
|
std::string monitor_;
|
||||||
|
std::string current_sink_name_;
|
||||||
|
bool current_sink_running_;
|
||||||
// SOURCE
|
// SOURCE
|
||||||
uint32_t source_idx_{0};
|
uint32_t source_idx_{0};
|
||||||
uint16_t source_volume_;
|
uint16_t source_volume_;
|
||||||
bool source_muted_;
|
bool source_muted_;
|
||||||
std::string source_port_name_;
|
std::string source_port_name_;
|
||||||
std::string source_desc_;
|
std::string source_desc_;
|
||||||
|
std::string default_source_name_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace waybar::modules
|
} // namespace waybar::modules
|
||||||
|
28
include/modules/river/mode.hpp
Normal file
28
include/modules/river/mode.hpp
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <wayland-client.h>
|
||||||
|
|
||||||
|
#include "ALabel.hpp"
|
||||||
|
#include "bar.hpp"
|
||||||
|
#include "river-status-unstable-v1-client-protocol.h"
|
||||||
|
|
||||||
|
namespace waybar::modules::river {
|
||||||
|
|
||||||
|
class Mode : public waybar::ALabel {
|
||||||
|
public:
|
||||||
|
Mode(const std::string &, const waybar::Bar &, const Json::Value &);
|
||||||
|
~Mode();
|
||||||
|
|
||||||
|
// Handlers for wayland events
|
||||||
|
void handle_mode(const char *mode);
|
||||||
|
|
||||||
|
struct zriver_status_manager_v1 *status_manager_;
|
||||||
|
struct wl_seat *seat_;
|
||||||
|
|
||||||
|
private:
|
||||||
|
const waybar::Bar &bar_;
|
||||||
|
std::string mode_;
|
||||||
|
struct zriver_seat_status_v1 *seat_status_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} /* namespace waybar::modules::river */
|
38
include/modules/river/tags.hpp
Normal file
38
include/modules/river/tags.hpp
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <gtkmm/button.h>
|
||||||
|
#include <wayland-client.h>
|
||||||
|
|
||||||
|
#include "AModule.hpp"
|
||||||
|
#include "bar.hpp"
|
||||||
|
#include "river-control-unstable-v1-client-protocol.h"
|
||||||
|
#include "river-status-unstable-v1-client-protocol.h"
|
||||||
|
#include "xdg-output-unstable-v1-client-protocol.h"
|
||||||
|
|
||||||
|
namespace waybar::modules::river {
|
||||||
|
|
||||||
|
class Tags : public waybar::AModule {
|
||||||
|
public:
|
||||||
|
Tags(const std::string &, const waybar::Bar &, const Json::Value &);
|
||||||
|
~Tags();
|
||||||
|
|
||||||
|
// Handlers for wayland events
|
||||||
|
void handle_focused_tags(uint32_t tags);
|
||||||
|
void handle_view_tags(struct wl_array *tags);
|
||||||
|
void handle_urgent_tags(uint32_t tags);
|
||||||
|
|
||||||
|
void handle_primary_clicked(uint32_t tag);
|
||||||
|
bool handle_button_press(GdkEventButton *event_button, uint32_t tag);
|
||||||
|
|
||||||
|
struct zriver_status_manager_v1 *status_manager_;
|
||||||
|
struct zriver_control_v1 *control_;
|
||||||
|
struct wl_seat *seat_;
|
||||||
|
|
||||||
|
private:
|
||||||
|
const waybar::Bar &bar_;
|
||||||
|
Gtk::Box box_;
|
||||||
|
std::vector<Gtk::Button> buttons_;
|
||||||
|
struct zriver_output_status_v1 *output_status_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} /* namespace waybar::modules::river */
|
33
include/modules/river/window.hpp
Normal file
33
include/modules/river/window.hpp
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <gtkmm/button.h>
|
||||||
|
#include <wayland-client.h>
|
||||||
|
|
||||||
|
#include "ALabel.hpp"
|
||||||
|
#include "bar.hpp"
|
||||||
|
#include "river-status-unstable-v1-client-protocol.h"
|
||||||
|
#include "xdg-output-unstable-v1-client-protocol.h"
|
||||||
|
|
||||||
|
namespace waybar::modules::river {
|
||||||
|
|
||||||
|
class Window : public waybar::ALabel {
|
||||||
|
public:
|
||||||
|
Window(const std::string &, const waybar::Bar &, const Json::Value &);
|
||||||
|
~Window();
|
||||||
|
|
||||||
|
// Handlers for wayland events
|
||||||
|
void handle_focused_view(const char *title);
|
||||||
|
void handle_focused_output(struct wl_output *output);
|
||||||
|
void handle_unfocused_output(struct wl_output *output);
|
||||||
|
|
||||||
|
struct zriver_status_manager_v1 *status_manager_;
|
||||||
|
struct wl_seat *seat_;
|
||||||
|
|
||||||
|
private:
|
||||||
|
const waybar::Bar &bar_;
|
||||||
|
struct wl_output *output_; // stores the output this module belongs to
|
||||||
|
struct wl_output *focused_output_; // stores the currently focused output
|
||||||
|
struct zriver_seat_status_v1 *seat_status_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} /* namespace waybar::modules::river */
|
20
include/modules/simpleclock.hpp
Normal file
20
include/modules/simpleclock.hpp
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <fmt/chrono.h>
|
||||||
|
|
||||||
|
#include "ALabel.hpp"
|
||||||
|
#include "util/sleeper_thread.hpp"
|
||||||
|
|
||||||
|
namespace waybar::modules {
|
||||||
|
|
||||||
|
class Clock : public ALabel {
|
||||||
|
public:
|
||||||
|
Clock(const std::string&, const Json::Value&);
|
||||||
|
~Clock() = default;
|
||||||
|
auto update() -> void;
|
||||||
|
|
||||||
|
private:
|
||||||
|
util::SleeperThread thread_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace waybar::modules
|
32
include/modules/sndio.hpp
Normal file
32
include/modules/sndio.hpp
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <sndio.h>
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include "ALabel.hpp"
|
||||||
|
#include "util/sleeper_thread.hpp"
|
||||||
|
|
||||||
|
namespace waybar::modules {
|
||||||
|
|
||||||
|
class Sndio : public ALabel {
|
||||||
|
public:
|
||||||
|
Sndio(const std::string &, const Json::Value &);
|
||||||
|
~Sndio();
|
||||||
|
auto update() -> void;
|
||||||
|
auto set_desc(struct sioctl_desc *, unsigned int) -> void;
|
||||||
|
auto put_val(unsigned int, unsigned int) -> void;
|
||||||
|
bool handleScroll(GdkEventScroll *);
|
||||||
|
bool handleToggle(GdkEventButton *const &);
|
||||||
|
|
||||||
|
private:
|
||||||
|
auto connect_to_sndio() -> void;
|
||||||
|
util::SleeperThread thread_;
|
||||||
|
struct sioctl_hdl *hdl_;
|
||||||
|
std::vector<struct pollfd> pfds_;
|
||||||
|
unsigned int addr_;
|
||||||
|
unsigned int volume_, old_volume_, maxval_;
|
||||||
|
bool muted_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace waybar::modules
|
@ -4,14 +4,18 @@
|
|||||||
#include <giomm.h>
|
#include <giomm.h>
|
||||||
#include <glibmm/refptr.h>
|
#include <glibmm/refptr.h>
|
||||||
#include <json/json.h>
|
#include <json/json.h>
|
||||||
|
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
|
|
||||||
|
#include "bar.hpp"
|
||||||
#include "modules/sni/item.hpp"
|
#include "modules/sni/item.hpp"
|
||||||
|
|
||||||
namespace waybar::modules::SNI {
|
namespace waybar::modules::SNI {
|
||||||
|
|
||||||
class Host {
|
class Host {
|
||||||
public:
|
public:
|
||||||
Host(const std::size_t id, const Json::Value&, const std::function<void(std::unique_ptr<Item>&)>&,
|
Host(const std::size_t id, const Json::Value&, const Bar&,
|
||||||
|
const std::function<void(std::unique_ptr<Item>&)>&,
|
||||||
const std::function<void(std::unique_ptr<Item>&)>&);
|
const std::function<void(std::unique_ptr<Item>&)>&);
|
||||||
~Host();
|
~Host();
|
||||||
|
|
||||||
@ -36,6 +40,7 @@ class Host {
|
|||||||
GCancellable* cancellable_ = nullptr;
|
GCancellable* cancellable_ = nullptr;
|
||||||
SnWatcher* watcher_ = nullptr;
|
SnWatcher* watcher_ = nullptr;
|
||||||
const Json::Value& config_;
|
const Json::Value& config_;
|
||||||
|
const Bar& bar_;
|
||||||
const std::function<void(std::unique_ptr<Item>&)> on_add_;
|
const std::function<void(std::unique_ptr<Item>&)> on_add_;
|
||||||
const std::function<void(std::unique_ptr<Item>&)> on_remove_;
|
const std::function<void(std::unique_ptr<Item>&)> on_remove_;
|
||||||
};
|
};
|
||||||
|
@ -10,17 +10,22 @@
|
|||||||
#include <json/json.h>
|
#include <json/json.h>
|
||||||
#include <libdbusmenu-gtk/dbusmenu-gtk.h>
|
#include <libdbusmenu-gtk/dbusmenu-gtk.h>
|
||||||
#include <sigc++/trackable.h>
|
#include <sigc++/trackable.h>
|
||||||
#ifdef FILESYSTEM_EXPERIMENTAL
|
|
||||||
#include <experimental/filesystem>
|
#include <set>
|
||||||
#else
|
#include <string_view>
|
||||||
#include <filesystem>
|
|
||||||
#endif
|
#include "bar.hpp"
|
||||||
|
|
||||||
namespace waybar::modules::SNI {
|
namespace waybar::modules::SNI {
|
||||||
|
|
||||||
|
struct ToolTip {
|
||||||
|
Glib::ustring icon_name;
|
||||||
|
Glib::ustring text;
|
||||||
|
};
|
||||||
|
|
||||||
class Item : public sigc::trackable {
|
class Item : public sigc::trackable {
|
||||||
public:
|
public:
|
||||||
Item(const std::string&, const std::string&, const Json::Value&);
|
Item(const std::string&, const std::string&, const Json::Value&, const Bar&);
|
||||||
~Item() = default;
|
~Item() = default;
|
||||||
|
|
||||||
std::string bus_name;
|
std::string bus_name;
|
||||||
@ -32,10 +37,8 @@ class Item : public sigc::trackable {
|
|||||||
Gtk::EventBox event_box;
|
Gtk::EventBox event_box;
|
||||||
std::string category;
|
std::string category;
|
||||||
std::string id;
|
std::string id;
|
||||||
std::string status;
|
|
||||||
|
|
||||||
std::string title;
|
std::string title;
|
||||||
int32_t window_id;
|
|
||||||
std::string icon_name;
|
std::string icon_name;
|
||||||
Glib::RefPtr<Gdk::Pixbuf> icon_pixmap;
|
Glib::RefPtr<Gdk::Pixbuf> icon_pixmap;
|
||||||
Glib::RefPtr<Gtk::IconTheme> icon_theme;
|
Glib::RefPtr<Gtk::IconTheme> icon_theme;
|
||||||
@ -44,13 +47,21 @@ class Item : public sigc::trackable {
|
|||||||
std::string attention_movie_name;
|
std::string attention_movie_name;
|
||||||
std::string icon_theme_path;
|
std::string icon_theme_path;
|
||||||
std::string menu;
|
std::string menu;
|
||||||
|
ToolTip tooltip;
|
||||||
DbusmenuGtkMenu* dbus_menu = nullptr;
|
DbusmenuGtkMenu* dbus_menu = nullptr;
|
||||||
Gtk::Menu* gtk_menu = nullptr;
|
Gtk::Menu* gtk_menu = nullptr;
|
||||||
bool item_is_menu = false;
|
/**
|
||||||
|
* ItemIsMenu flag means that the item only supports the context menu.
|
||||||
|
* Default value is true because libappindicator supports neither ItemIsMenu nor Activate method
|
||||||
|
* while compliant SNI implementation would always reset the flag to desired value.
|
||||||
|
*/
|
||||||
|
bool item_is_menu = true;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void onConfigure(GdkEventConfigure* ev);
|
||||||
void proxyReady(Glib::RefPtr<Gio::AsyncResult>& result);
|
void proxyReady(Glib::RefPtr<Gio::AsyncResult>& result);
|
||||||
void setProperty(const Glib::ustring& name, Glib::VariantBase& value);
|
void setProperty(const Glib::ustring& name, Glib::VariantBase& value);
|
||||||
|
void setStatus(const Glib::ustring& value);
|
||||||
void getUpdatedProperties();
|
void getUpdatedProperties();
|
||||||
void processUpdatedProperties(Glib::RefPtr<Gio::AsyncResult>& result);
|
void processUpdatedProperties(Glib::RefPtr<Gio::AsyncResult>& result);
|
||||||
void onSignal(const Glib::ustring& sender_name, const Glib::ustring& signal_name,
|
void onSignal(const Glib::ustring& sender_name, const Glib::ustring& signal_name,
|
||||||
@ -58,14 +69,24 @@ class Item : public sigc::trackable {
|
|||||||
|
|
||||||
void updateImage();
|
void updateImage();
|
||||||
Glib::RefPtr<Gdk::Pixbuf> extractPixBuf(GVariant* variant);
|
Glib::RefPtr<Gdk::Pixbuf> extractPixBuf(GVariant* variant);
|
||||||
|
Glib::RefPtr<Gdk::Pixbuf> getIconPixbuf();
|
||||||
Glib::RefPtr<Gdk::Pixbuf> getIconByName(const std::string& name, int size);
|
Glib::RefPtr<Gdk::Pixbuf> getIconByName(const std::string& name, int size);
|
||||||
|
double getScaledIconSize();
|
||||||
static void onMenuDestroyed(Item* self, GObject* old_menu_pointer);
|
static void onMenuDestroyed(Item* self, GObject* old_menu_pointer);
|
||||||
void makeMenu(GdkEventButton* const& ev);
|
void makeMenu();
|
||||||
bool handleClick(GdkEventButton* const& /*ev*/);
|
bool handleClick(GdkEventButton* const& /*ev*/);
|
||||||
|
bool handleScroll(GdkEventScroll* const&);
|
||||||
|
|
||||||
|
// smooth scrolling threshold
|
||||||
|
gdouble scroll_threshold_ = 0;
|
||||||
|
gdouble distance_scrolled_x_ = 0;
|
||||||
|
gdouble distance_scrolled_y_ = 0;
|
||||||
|
// visibility of items with Status == Passive
|
||||||
|
bool show_passive_ = false;
|
||||||
|
|
||||||
Glib::RefPtr<Gio::DBus::Proxy> proxy_;
|
Glib::RefPtr<Gio::DBus::Proxy> proxy_;
|
||||||
Glib::RefPtr<Gio::Cancellable> cancellable_;
|
Glib::RefPtr<Gio::Cancellable> cancellable_;
|
||||||
bool update_pending_;
|
std::set<std::string_view> update_pending_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace waybar::modules::SNI
|
} // namespace waybar::modules::SNI
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
#include "IModule.hpp"
|
|
||||||
|
#include "AModule.hpp"
|
||||||
#include "bar.hpp"
|
#include "bar.hpp"
|
||||||
#include "modules/sni/host.hpp"
|
#include "modules/sni/host.hpp"
|
||||||
#include "modules/sni/watcher.hpp"
|
#include "modules/sni/watcher.hpp"
|
||||||
@ -9,21 +10,19 @@
|
|||||||
|
|
||||||
namespace waybar::modules::SNI {
|
namespace waybar::modules::SNI {
|
||||||
|
|
||||||
class Tray : public IModule {
|
class Tray : public AModule {
|
||||||
public:
|
public:
|
||||||
Tray(const std::string&, const Bar&, const Json::Value&);
|
Tray(const std::string&, const Bar&, const Json::Value&);
|
||||||
~Tray() = default;
|
~Tray() = default;
|
||||||
auto update() -> void;
|
auto update() -> void;
|
||||||
operator Gtk::Widget&();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void onAdd(std::unique_ptr<Item>& item);
|
void onAdd(std::unique_ptr<Item>& item);
|
||||||
void onRemove(std::unique_ptr<Item>& item);
|
void onRemove(std::unique_ptr<Item>& item);
|
||||||
|
|
||||||
static inline std::size_t nb_hosts_ = 0;
|
static inline std::size_t nb_hosts_ = 0;
|
||||||
const Json::Value& config_;
|
|
||||||
Gtk::Box box_;
|
Gtk::Box box_;
|
||||||
SNI::Watcher watcher_;
|
SNI::Watcher::singleton watcher_;
|
||||||
SNI::Host host_;
|
SNI::Host host_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -7,19 +7,33 @@
|
|||||||
namespace waybar::modules::SNI {
|
namespace waybar::modules::SNI {
|
||||||
|
|
||||||
class Watcher {
|
class Watcher {
|
||||||
|
private:
|
||||||
|
Watcher();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Watcher(std::size_t id);
|
|
||||||
~Watcher();
|
~Watcher();
|
||||||
|
|
||||||
|
using singleton = std::shared_ptr<Watcher>;
|
||||||
|
static singleton getInstance() {
|
||||||
|
static std::weak_ptr<Watcher> weak;
|
||||||
|
|
||||||
|
std::shared_ptr<Watcher> strong = weak.lock();
|
||||||
|
if (!strong) {
|
||||||
|
strong = std::shared_ptr<Watcher>(new Watcher());
|
||||||
|
weak = strong;
|
||||||
|
}
|
||||||
|
return strong;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
typedef enum { GF_WATCH_TYPE_HOST, GF_WATCH_TYPE_ITEM } GfWatchType;
|
typedef enum { GF_WATCH_TYPE_HOST, GF_WATCH_TYPE_ITEM } GfWatchType;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
GfWatchType type;
|
GfWatchType type;
|
||||||
Watcher * watcher;
|
Watcher *watcher;
|
||||||
gchar * service;
|
gchar *service;
|
||||||
gchar * bus_name;
|
gchar *bus_name;
|
||||||
gchar * object_path;
|
gchar *object_path;
|
||||||
guint watch_id;
|
guint watch_id;
|
||||||
} GfWatch;
|
} GfWatch;
|
||||||
|
|
||||||
@ -34,9 +48,8 @@ class Watcher {
|
|||||||
void updateRegisteredItems(SnWatcher *obj);
|
void updateRegisteredItems(SnWatcher *obj);
|
||||||
|
|
||||||
uint32_t bus_name_id_;
|
uint32_t bus_name_id_;
|
||||||
uint32_t watcher_id_;
|
GSList *hosts_ = nullptr;
|
||||||
GSList * hosts_ = nullptr;
|
GSList *items_ = nullptr;
|
||||||
GSList * items_ = nullptr;
|
|
||||||
SnWatcher *watcher_ = nullptr;
|
SnWatcher *watcher_ = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
60
include/modules/sway/bar.hpp
Normal file
60
include/modules/sway/bar.hpp
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <atomic>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "modules/sway/ipc/client.hpp"
|
||||||
|
#include "util/SafeSignal.hpp"
|
||||||
|
#include "util/json.hpp"
|
||||||
|
|
||||||
|
namespace waybar {
|
||||||
|
|
||||||
|
class Bar;
|
||||||
|
|
||||||
|
namespace modules::sway {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Supported subset of i3/sway IPC barconfig object
|
||||||
|
*/
|
||||||
|
struct swaybar_config {
|
||||||
|
std::string id;
|
||||||
|
std::string mode;
|
||||||
|
std::string hidden_state;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* swaybar IPC client
|
||||||
|
*/
|
||||||
|
class BarIpcClient {
|
||||||
|
public:
|
||||||
|
BarIpcClient(waybar::Bar& bar);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void onInitialConfig(const struct Ipc::ipc_response& res);
|
||||||
|
void onIpcEvent(const struct Ipc::ipc_response&);
|
||||||
|
void onCmd(const struct Ipc::ipc_response&);
|
||||||
|
void onConfigUpdate(const swaybar_config& config);
|
||||||
|
void onVisibilityUpdate(bool visible_by_modifier);
|
||||||
|
void onModeUpdate(bool visible_by_modifier);
|
||||||
|
void onUrgencyUpdate(bool visible_by_urgency);
|
||||||
|
void update();
|
||||||
|
bool isModuleEnabled(std::string name);
|
||||||
|
|
||||||
|
Bar& bar_;
|
||||||
|
util::JsonParser parser_;
|
||||||
|
Ipc ipc_;
|
||||||
|
|
||||||
|
swaybar_config bar_config_;
|
||||||
|
std::string modifier_reset_;
|
||||||
|
bool visible_by_mode_ = false;
|
||||||
|
bool visible_by_modifier_ = false;
|
||||||
|
bool visible_by_urgency_ = false;
|
||||||
|
std::atomic<bool> modifier_no_action_ = false;
|
||||||
|
|
||||||
|
SafeSignal<bool> signal_mode_;
|
||||||
|
SafeSignal<bool> signal_visible_;
|
||||||
|
SafeSignal<bool> signal_urgency_;
|
||||||
|
SafeSignal<swaybar_config> signal_config_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace modules::sway
|
||||||
|
} // namespace waybar
|
@ -4,11 +4,13 @@
|
|||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <sys/un.h>
|
#include <sys/un.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <iostream>
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
|
||||||
#include "ipc.hpp"
|
#include "ipc.hpp"
|
||||||
|
#include "util/sleeper_thread.hpp"
|
||||||
|
|
||||||
namespace waybar::modules::sway {
|
namespace waybar::modules::sway {
|
||||||
|
|
||||||
@ -29,6 +31,7 @@ class Ipc {
|
|||||||
void sendCmd(uint32_t type, const std::string &payload = "");
|
void sendCmd(uint32_t type, const std::string &payload = "");
|
||||||
void subscribe(const std::string &payload);
|
void subscribe(const std::string &payload);
|
||||||
void handleEvent();
|
void handleEvent();
|
||||||
|
void setWorker(std::function<void()> &&func);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
static inline const std::string ipc_magic_ = "i3-ipc";
|
static inline const std::string ipc_magic_ = "i3-ipc";
|
||||||
@ -42,6 +45,7 @@ class Ipc {
|
|||||||
int fd_;
|
int fd_;
|
||||||
int fd_event_;
|
int fd_event_;
|
||||||
std::mutex mutex_;
|
std::mutex mutex_;
|
||||||
|
util::SleeperThread thread_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace waybar::modules::sway
|
} // namespace waybar::modules::sway
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
#define event_mask(ev) (1u << (ev & 0x7F))
|
#define event_mask(ev) (1u << (ev & 0x7F))
|
||||||
|
|
||||||
enum ipc_command_type {
|
enum ipc_command_type : uint32_t {
|
||||||
// i3 command types - see i3's I3_REPLY_TYPE constants
|
// i3 command types - see i3's I3_REPLY_TYPE constants
|
||||||
IPC_COMMAND = 0,
|
IPC_COMMAND = 0,
|
||||||
IPC_GET_WORKSPACES = 1,
|
IPC_GET_WORKSPACES = 1,
|
||||||
@ -21,12 +23,16 @@ enum ipc_command_type {
|
|||||||
IPC_GET_SEATS = 101,
|
IPC_GET_SEATS = 101,
|
||||||
|
|
||||||
// Events sent from sway to clients. Events have the highest bits set.
|
// Events sent from sway to clients. Events have the highest bits set.
|
||||||
IPC_EVENT_WORKSPACE = ((1 << 31) | 0),
|
IPC_EVENT_WORKSPACE = ((1U << 31) | 0),
|
||||||
IPC_EVENT_OUTPUT = ((1 << 31) | 1),
|
IPC_EVENT_OUTPUT = ((1U << 31) | 1),
|
||||||
IPC_EVENT_MODE = ((1 << 31) | 2),
|
IPC_EVENT_MODE = ((1U << 31) | 2),
|
||||||
IPC_EVENT_WINDOW = ((1 << 31) | 3),
|
IPC_EVENT_WINDOW = ((1U << 31) | 3),
|
||||||
IPC_EVENT_BARCONFIG_UPDATE = ((1 << 31) | 4),
|
IPC_EVENT_BARCONFIG_UPDATE = ((1U << 31) | 4),
|
||||||
IPC_EVENT_BINDING = ((1 << 31) | 5),
|
IPC_EVENT_BINDING = ((1U << 31) | 5),
|
||||||
IPC_EVENT_SHUTDOWN = ((1 << 31) | 6),
|
IPC_EVENT_SHUTDOWN = ((1U << 31) | 6),
|
||||||
IPC_EVENT_TICK = ((1 << 31) | 7),
|
IPC_EVENT_TICK = ((1U << 31) | 7),
|
||||||
|
|
||||||
|
// sway-specific event types
|
||||||
|
IPC_EVENT_BAR_STATE_UPDATE = ((1U << 31) | 20),
|
||||||
|
IPC_EVENT_INPUT = ((1U << 31) | 21),
|
||||||
};
|
};
|
||||||
|
67
include/modules/sway/language.hpp
Normal file
67
include/modules/sway/language.hpp
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <fmt/format.h>
|
||||||
|
#include <xkbcommon/xkbregistry.h>
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "ALabel.hpp"
|
||||||
|
#include "bar.hpp"
|
||||||
|
#include "client.hpp"
|
||||||
|
#include "modules/sway/ipc/client.hpp"
|
||||||
|
#include "util/json.hpp"
|
||||||
|
|
||||||
|
namespace waybar::modules::sway {
|
||||||
|
|
||||||
|
class Language : public ALabel, public sigc::trackable {
|
||||||
|
public:
|
||||||
|
Language(const std::string& id, const Json::Value& config);
|
||||||
|
~Language() = default;
|
||||||
|
auto update() -> void;
|
||||||
|
|
||||||
|
private:
|
||||||
|
enum class DispayedShortFlag { None = 0, ShortName = 1, ShortDescription = 1 << 1 };
|
||||||
|
|
||||||
|
struct Layout {
|
||||||
|
std::string full_name;
|
||||||
|
std::string short_name;
|
||||||
|
std::string variant;
|
||||||
|
std::string short_description;
|
||||||
|
std::string country_flag() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
class XKBContext {
|
||||||
|
public:
|
||||||
|
XKBContext();
|
||||||
|
~XKBContext();
|
||||||
|
auto next_layout() -> Layout*;
|
||||||
|
|
||||||
|
private:
|
||||||
|
rxkb_context* context_ = nullptr;
|
||||||
|
rxkb_layout* xkb_layout_ = nullptr;
|
||||||
|
Layout* layout_ = nullptr;
|
||||||
|
std::map<std::string, rxkb_layout*> base_layouts_by_name_;
|
||||||
|
};
|
||||||
|
|
||||||
|
void onEvent(const struct Ipc::ipc_response&);
|
||||||
|
void onCmd(const struct Ipc::ipc_response&);
|
||||||
|
|
||||||
|
auto set_current_layout(std::string current_layout) -> void;
|
||||||
|
auto init_layouts_map(const std::vector<std::string>& used_layouts) -> void;
|
||||||
|
|
||||||
|
const static std::string XKB_LAYOUT_NAMES_KEY;
|
||||||
|
const static std::string XKB_ACTIVE_LAYOUT_NAME_KEY;
|
||||||
|
|
||||||
|
Layout layout_;
|
||||||
|
std::string tooltip_format_ = "";
|
||||||
|
std::map<std::string, Layout> layouts_map_;
|
||||||
|
bool is_variant_displayed;
|
||||||
|
std::byte displayed_short_flag = static_cast<std::byte>(DispayedShortFlag::None);
|
||||||
|
|
||||||
|
util::JsonParser parser_;
|
||||||
|
std::mutex mutex_;
|
||||||
|
Ipc ipc_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace waybar::modules::sway
|
@ -1,12 +1,12 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
|
|
||||||
#include "ALabel.hpp"
|
#include "ALabel.hpp"
|
||||||
#include "bar.hpp"
|
#include "bar.hpp"
|
||||||
#include "client.hpp"
|
#include "client.hpp"
|
||||||
#include "modules/sway/ipc/client.hpp"
|
#include "modules/sway/ipc/client.hpp"
|
||||||
#include "util/json.hpp"
|
#include "util/json.hpp"
|
||||||
#include "util/sleeper_thread.hpp"
|
|
||||||
|
|
||||||
namespace waybar::modules::sway {
|
namespace waybar::modules::sway {
|
||||||
|
|
||||||
@ -18,12 +18,10 @@ class Mode : public ALabel, public sigc::trackable {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void onEvent(const struct Ipc::ipc_response&);
|
void onEvent(const struct Ipc::ipc_response&);
|
||||||
void worker();
|
|
||||||
|
|
||||||
std::string mode_;
|
std::string mode_;
|
||||||
util::JsonParser parser_;
|
util::JsonParser parser_;
|
||||||
|
std::mutex mutex_;
|
||||||
util::SleeperThread thread_;
|
|
||||||
Ipc ipc_;
|
Ipc ipc_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
35
include/modules/sway/scratchpad.hpp
Normal file
35
include/modules/sway/scratchpad.hpp
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <gtkmm/label.h>
|
||||||
|
|
||||||
|
#include <mutex>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "ALabel.hpp"
|
||||||
|
#include "bar.hpp"
|
||||||
|
#include "client.hpp"
|
||||||
|
#include "modules/sway/ipc/client.hpp"
|
||||||
|
#include "util/json.hpp"
|
||||||
|
|
||||||
|
namespace waybar::modules::sway {
|
||||||
|
class Scratchpad : public ALabel {
|
||||||
|
public:
|
||||||
|
Scratchpad(const std::string&, const Json::Value&);
|
||||||
|
~Scratchpad() = default;
|
||||||
|
auto update() -> void;
|
||||||
|
|
||||||
|
private:
|
||||||
|
auto getTree() -> void;
|
||||||
|
auto onCmd(const struct Ipc::ipc_response&) -> void;
|
||||||
|
auto onEvent(const struct Ipc::ipc_response&) -> void;
|
||||||
|
|
||||||
|
std::string tooltip_format_;
|
||||||
|
bool show_empty_;
|
||||||
|
bool tooltip_enabled_;
|
||||||
|
std::string tooltip_text_;
|
||||||
|
int count_;
|
||||||
|
std::mutex mutex_;
|
||||||
|
Ipc ipc_;
|
||||||
|
util::JsonParser parser_;
|
||||||
|
};
|
||||||
|
} // namespace waybar::modules::sway
|
@ -1,17 +1,18 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
|
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
#include "ALabel.hpp"
|
|
||||||
|
#include "AIconLabel.hpp"
|
||||||
#include "bar.hpp"
|
#include "bar.hpp"
|
||||||
#include "client.hpp"
|
#include "client.hpp"
|
||||||
#include "modules/sway/ipc/client.hpp"
|
#include "modules/sway/ipc/client.hpp"
|
||||||
#include "util/json.hpp"
|
#include "util/json.hpp"
|
||||||
#include "util/sleeper_thread.hpp"
|
|
||||||
|
|
||||||
namespace waybar::modules::sway {
|
namespace waybar::modules::sway {
|
||||||
|
|
||||||
class Window : public ALabel, public sigc::trackable {
|
class Window : public AIconLabel, public sigc::trackable {
|
||||||
public:
|
public:
|
||||||
Window(const std::string&, const waybar::Bar&, const Json::Value&);
|
Window(const std::string&, const waybar::Bar&, const Json::Value&);
|
||||||
~Window() = default;
|
~Window() = default;
|
||||||
@ -20,20 +21,25 @@ class Window : public ALabel, public sigc::trackable {
|
|||||||
private:
|
private:
|
||||||
void onEvent(const struct Ipc::ipc_response&);
|
void onEvent(const struct Ipc::ipc_response&);
|
||||||
void onCmd(const struct Ipc::ipc_response&);
|
void onCmd(const struct Ipc::ipc_response&);
|
||||||
void worker();
|
std::tuple<std::size_t, int, std::string, std::string, std::string, std::string> getFocusedNode(
|
||||||
std::tuple<std::size_t, int, std::string, std::string> getFocusedNode(const Json::Value& nodes);
|
const Json::Value& nodes, std::string& output);
|
||||||
void getTree();
|
void getTree();
|
||||||
|
void updateAppIconName();
|
||||||
|
void updateAppIcon();
|
||||||
|
|
||||||
const Bar& bar_;
|
const Bar& bar_;
|
||||||
std::mutex mutex_;
|
|
||||||
std::string window_;
|
std::string window_;
|
||||||
int windowId_;
|
int windowId_;
|
||||||
std::string app_id_;
|
std::string app_id_;
|
||||||
|
std::string app_class_;
|
||||||
std::string old_app_id_;
|
std::string old_app_id_;
|
||||||
std::size_t app_nb_;
|
std::size_t app_nb_;
|
||||||
|
std::string shell_;
|
||||||
|
unsigned app_icon_size_{24};
|
||||||
|
bool update_app_icon_{true};
|
||||||
|
std::string app_icon_name_;
|
||||||
util::JsonParser parser_;
|
util::JsonParser parser_;
|
||||||
|
std::mutex mutex_;
|
||||||
util::SleeperThread thread_;
|
|
||||||
Ipc ipc_;
|
Ipc ipc_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -3,26 +3,30 @@
|
|||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
#include <gtkmm/button.h>
|
#include <gtkmm/button.h>
|
||||||
#include <gtkmm/label.h>
|
#include <gtkmm/label.h>
|
||||||
#include "IModule.hpp"
|
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
|
#include "AModule.hpp"
|
||||||
#include "bar.hpp"
|
#include "bar.hpp"
|
||||||
#include "client.hpp"
|
#include "client.hpp"
|
||||||
#include "modules/sway/ipc/client.hpp"
|
#include "modules/sway/ipc/client.hpp"
|
||||||
#include "util/json.hpp"
|
#include "util/json.hpp"
|
||||||
#include "util/sleeper_thread.hpp"
|
|
||||||
|
|
||||||
namespace waybar::modules::sway {
|
namespace waybar::modules::sway {
|
||||||
|
|
||||||
class Workspaces : public IModule, public sigc::trackable {
|
class Workspaces : public AModule, public sigc::trackable {
|
||||||
public:
|
public:
|
||||||
Workspaces(const std::string&, const waybar::Bar&, const Json::Value&);
|
Workspaces(const std::string&, const waybar::Bar&, const Json::Value&);
|
||||||
~Workspaces() = default;
|
~Workspaces() = default;
|
||||||
auto update() -> void;
|
auto update() -> void;
|
||||||
operator Gtk::Widget&();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
static inline const std::string workspace_switch_cmd_ = "workspace {} \"{}\"";
|
||||||
|
|
||||||
|
static int convertWorkspaceNameToNum(std::string name);
|
||||||
|
|
||||||
void onCmd(const struct Ipc::ipc_response&);
|
void onCmd(const struct Ipc::ipc_response&);
|
||||||
void onEvent(const struct Ipc::ipc_response&);
|
void onEvent(const struct Ipc::ipc_response&);
|
||||||
void worker();
|
|
||||||
bool filterButtons();
|
bool filterButtons();
|
||||||
Gtk::Button& addButton(const Json::Value&);
|
Gtk::Button& addButton(const Json::Value&);
|
||||||
void onButtonReady(const Json::Value&, Gtk::Button&);
|
void onButtonReady(const Json::Value&, Gtk::Button&);
|
||||||
@ -33,16 +37,12 @@ class Workspaces : public IModule, public sigc::trackable {
|
|||||||
bool handleScroll(GdkEventScroll*);
|
bool handleScroll(GdkEventScroll*);
|
||||||
|
|
||||||
const Bar& bar_;
|
const Bar& bar_;
|
||||||
const Json::Value& config_;
|
|
||||||
std::vector<Json::Value> workspaces_;
|
std::vector<Json::Value> workspaces_;
|
||||||
std::vector<std::string> workspaces_order_;
|
std::vector<std::string> workspaces_order_;
|
||||||
std::mutex mutex_;
|
|
||||||
Gtk::Box box_;
|
Gtk::Box box_;
|
||||||
util::JsonParser parser_;
|
util::JsonParser parser_;
|
||||||
bool scrolling_;
|
|
||||||
std::unordered_map<std::string, Gtk::Button> buttons_;
|
std::unordered_map<std::string, Gtk::Button> buttons_;
|
||||||
|
std::mutex mutex_;
|
||||||
util::SleeperThread thread_;
|
|
||||||
Ipc ipc_;
|
Ipc ipc_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
||||||
#include "ALabel.hpp"
|
#include "ALabel.hpp"
|
||||||
#include "util/sleeper_thread.hpp"
|
#include "util/sleeper_thread.hpp"
|
||||||
|
|
||||||
@ -14,7 +16,7 @@ class Temperature : public ALabel {
|
|||||||
auto update() -> void;
|
auto update() -> void;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::tuple<uint16_t, uint16_t> getTemperature();
|
float getTemperature();
|
||||||
bool isCritical(uint16_t);
|
bool isCritical(uint16_t);
|
||||||
|
|
||||||
std::string file_path_;
|
std::string file_path_;
|
||||||
|
79
include/modules/upower/upower.hpp
Normal file
79
include/modules/upower/upower.hpp
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <libupower-glib/upower.h>
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <map>
|
||||||
|
#include <string>
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
|
#include "ALabel.hpp"
|
||||||
|
#include "glibconfig.h"
|
||||||
|
#include "gtkmm/box.h"
|
||||||
|
#include "gtkmm/image.h"
|
||||||
|
#include "gtkmm/label.h"
|
||||||
|
#include "modules/upower/upower_tooltip.hpp"
|
||||||
|
|
||||||
|
namespace waybar::modules::upower {
|
||||||
|
|
||||||
|
class UPower : public AModule {
|
||||||
|
public:
|
||||||
|
UPower(const std::string &, const Json::Value &);
|
||||||
|
~UPower();
|
||||||
|
auto update() -> void;
|
||||||
|
|
||||||
|
private:
|
||||||
|
typedef std::unordered_map<std::string, UpDevice *> Devices;
|
||||||
|
|
||||||
|
const std::string DEFAULT_FORMAT = "{percentage}";
|
||||||
|
const std::string DEFAULT_FORMAT_ALT = "{percentage} {time}";
|
||||||
|
|
||||||
|
static void deviceAdded_cb(UpClient *client, UpDevice *device, gpointer data);
|
||||||
|
static void deviceRemoved_cb(UpClient *client, const gchar *objectPath, gpointer data);
|
||||||
|
static void deviceNotify_cb(UpDevice *device, GParamSpec *pspec, gpointer user_data);
|
||||||
|
static void prepareForSleep_cb(GDBusConnection *system_bus, const gchar *sender_name,
|
||||||
|
const gchar *object_path, const gchar *interface_name,
|
||||||
|
const gchar *signal_name, GVariant *parameters,
|
||||||
|
gpointer user_data);
|
||||||
|
static void upowerAppear(GDBusConnection *conn, const gchar *name, const gchar *name_owner,
|
||||||
|
gpointer data);
|
||||||
|
static void upowerDisappear(GDBusConnection *connection, const gchar *name, gpointer user_data);
|
||||||
|
|
||||||
|
void removeDevice(const gchar *objectPath);
|
||||||
|
void addDevice(UpDevice *device);
|
||||||
|
void setDisplayDevice();
|
||||||
|
void resetDevices();
|
||||||
|
void removeDevices();
|
||||||
|
bool show_tooltip_callback(int, int, bool, const Glib::RefPtr<Gtk::Tooltip> &tooltip);
|
||||||
|
bool handleToggle(GdkEventButton *const &);
|
||||||
|
std::string timeToString(gint64 time);
|
||||||
|
|
||||||
|
const std::string getDeviceStatus(UpDeviceState &state);
|
||||||
|
|
||||||
|
Gtk::Box box_;
|
||||||
|
Gtk::Image icon_;
|
||||||
|
Gtk::Label label_;
|
||||||
|
|
||||||
|
// Config
|
||||||
|
bool hideIfEmpty = true;
|
||||||
|
bool tooltip_enabled = true;
|
||||||
|
uint tooltip_spacing = 4;
|
||||||
|
uint tooltip_padding = 4;
|
||||||
|
uint iconSize = 20;
|
||||||
|
std::string format = DEFAULT_FORMAT;
|
||||||
|
std::string format_alt = DEFAULT_FORMAT_ALT;
|
||||||
|
|
||||||
|
Devices devices;
|
||||||
|
std::mutex m_Mutex;
|
||||||
|
UpClient *client;
|
||||||
|
UpDevice *displayDevice;
|
||||||
|
guint login1_id;
|
||||||
|
GDBusConnection *login1_connection;
|
||||||
|
UPowerTooltip *upower_tooltip;
|
||||||
|
std::string lastStatus;
|
||||||
|
bool showAltText;
|
||||||
|
bool upowerRunning;
|
||||||
|
guint upowerWatcher_id;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace waybar::modules::upower
|
32
include/modules/upower/upower_tooltip.hpp
Normal file
32
include/modules/upower/upower_tooltip.hpp
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <libupower-glib/upower.h>
|
||||||
|
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
|
#include "gtkmm/box.h"
|
||||||
|
#include "gtkmm/label.h"
|
||||||
|
#include "gtkmm/window.h"
|
||||||
|
|
||||||
|
namespace waybar::modules::upower {
|
||||||
|
|
||||||
|
class UPowerTooltip : public Gtk::Window {
|
||||||
|
private:
|
||||||
|
typedef std::unordered_map<std::string, UpDevice*> Devices;
|
||||||
|
|
||||||
|
const std::string getDeviceIcon(UpDeviceKind& kind);
|
||||||
|
|
||||||
|
Gtk::Box* contentBox;
|
||||||
|
|
||||||
|
uint iconSize;
|
||||||
|
uint tooltipSpacing;
|
||||||
|
uint tooltipPadding;
|
||||||
|
|
||||||
|
public:
|
||||||
|
UPowerTooltip(uint iconSize, uint tooltipSpacing, uint tooltipPadding);
|
||||||
|
~UPowerTooltip();
|
||||||
|
|
||||||
|
uint updateTooltip(Devices& devices);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace waybar::modules::upower
|
34
include/modules/user.hpp
Normal file
34
include/modules/user.hpp
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <fmt/chrono.h>
|
||||||
|
#include <gdkmm/pixbuf.h>
|
||||||
|
#include <glibmm/refptr.h>
|
||||||
|
|
||||||
|
#include "AIconLabel.hpp"
|
||||||
|
#include "util/sleeper_thread.hpp"
|
||||||
|
|
||||||
|
namespace waybar::modules {
|
||||||
|
class User : public AIconLabel {
|
||||||
|
public:
|
||||||
|
User(const std::string&, const Json::Value&);
|
||||||
|
~User() = default;
|
||||||
|
auto update() -> void;
|
||||||
|
|
||||||
|
bool handleToggle(GdkEventButton* const& e) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
util::SleeperThread thread_;
|
||||||
|
|
||||||
|
static constexpr inline int defaultUserImageWidth_ = 20;
|
||||||
|
static constexpr inline int defaultUserImageHeight_ = 20;
|
||||||
|
|
||||||
|
long uptime_as_seconds();
|
||||||
|
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);
|
||||||
|
void init_update_worker();
|
||||||
|
};
|
||||||
|
} // namespace waybar::modules
|
39
include/modules/wireplumber.hpp
Normal file
39
include/modules/wireplumber.hpp
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
#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&);
|
||||||
|
~Wireplumber();
|
||||||
|
auto update() -> void;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void loadRequiredApiModules();
|
||||||
|
void prepare();
|
||||||
|
void activatePlugins();
|
||||||
|
static void updateVolume(waybar::modules::Wireplumber* self);
|
||||||
|
static void updateNodeName(waybar::modules::Wireplumber* self);
|
||||||
|
static uint32_t getDefaultNodeId(waybar::modules::Wireplumber* self);
|
||||||
|
static void onPluginActivated(WpObject* p, GAsyncResult* res, waybar::modules::Wireplumber* self);
|
||||||
|
static void onObjectManagerInstalled(waybar::modules::Wireplumber* self);
|
||||||
|
|
||||||
|
WpCore* wp_core_;
|
||||||
|
GPtrArray* apis_;
|
||||||
|
WpObjectManager* om_;
|
||||||
|
uint32_t pending_plugins_;
|
||||||
|
bool muted_;
|
||||||
|
double volume_;
|
||||||
|
uint32_t node_id_{0};
|
||||||
|
std::string node_name_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace waybar::modules
|
178
include/modules/wlr/taskbar.hpp
Normal file
178
include/modules/wlr/taskbar.hpp
Normal file
@ -0,0 +1,178 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <gdk/gdk.h>
|
||||||
|
#include <glibmm/refptr.h>
|
||||||
|
#include <gtkmm/box.h>
|
||||||
|
#include <gtkmm/button.h>
|
||||||
|
#include <gtkmm/icontheme.h>
|
||||||
|
#include <gtkmm/image.h>
|
||||||
|
#include <gtkmm/label.h>
|
||||||
|
#include <wayland-client.h>
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
|
#include <unordered_set>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include "AModule.hpp"
|
||||||
|
#include "bar.hpp"
|
||||||
|
#include "client.hpp"
|
||||||
|
#include "giomm/desktopappinfo.h"
|
||||||
|
#include "util/json.hpp"
|
||||||
|
#include "wlr-foreign-toplevel-management-unstable-v1-client-protocol.h"
|
||||||
|
|
||||||
|
namespace waybar::modules::wlr {
|
||||||
|
|
||||||
|
class Taskbar;
|
||||||
|
|
||||||
|
class Task {
|
||||||
|
public:
|
||||||
|
Task(const waybar::Bar &, const Json::Value &, Taskbar *,
|
||||||
|
struct zwlr_foreign_toplevel_handle_v1 *, struct wl_seat *);
|
||||||
|
~Task();
|
||||||
|
|
||||||
|
public:
|
||||||
|
enum State {
|
||||||
|
MAXIMIZED = (1 << 0),
|
||||||
|
MINIMIZED = (1 << 1),
|
||||||
|
ACTIVE = (1 << 2),
|
||||||
|
FULLSCREEN = (1 << 3),
|
||||||
|
INVALID = (1 << 4)
|
||||||
|
};
|
||||||
|
|
||||||
|
private:
|
||||||
|
static uint32_t global_id;
|
||||||
|
|
||||||
|
private:
|
||||||
|
const waybar::Bar &bar_;
|
||||||
|
const Json::Value &config_;
|
||||||
|
Taskbar *tbar_;
|
||||||
|
struct zwlr_foreign_toplevel_handle_v1 *handle_;
|
||||||
|
struct wl_seat *seat_;
|
||||||
|
|
||||||
|
uint32_t id_;
|
||||||
|
|
||||||
|
Gtk::Button button_;
|
||||||
|
Gtk::Box content_;
|
||||||
|
Gtk::Image icon_;
|
||||||
|
Gtk::Label text_before_;
|
||||||
|
Gtk::Label text_after_;
|
||||||
|
Glib::RefPtr<Gio::DesktopAppInfo> app_info_;
|
||||||
|
bool button_visible_ = false;
|
||||||
|
bool ignored_ = false;
|
||||||
|
|
||||||
|
bool with_icon_ = false;
|
||||||
|
bool with_name_ = false;
|
||||||
|
std::string format_before_;
|
||||||
|
std::string format_after_;
|
||||||
|
|
||||||
|
std::string format_tooltip_;
|
||||||
|
|
||||||
|
std::string name_;
|
||||||
|
std::string title_;
|
||||||
|
std::string app_id_;
|
||||||
|
uint32_t state_ = 0;
|
||||||
|
|
||||||
|
int32_t drag_start_x;
|
||||||
|
int32_t drag_start_y;
|
||||||
|
int32_t drag_start_button = -1;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string repr() const;
|
||||||
|
std::string state_string(bool = false) const;
|
||||||
|
void set_app_info_from_app_id_list(const std::string &app_id_list);
|
||||||
|
bool image_load_icon(Gtk::Image &image, const Glib::RefPtr<Gtk::IconTheme> &icon_theme,
|
||||||
|
Glib::RefPtr<Gio::DesktopAppInfo> app_info, int size);
|
||||||
|
void hide_if_ignored();
|
||||||
|
|
||||||
|
public:
|
||||||
|
/* Getter functions */
|
||||||
|
uint32_t id() const { return id_; }
|
||||||
|
std::string title() const { return title_; }
|
||||||
|
std::string app_id() const { return app_id_; }
|
||||||
|
uint32_t state() const { return state_; }
|
||||||
|
bool maximized() const { return state_ & MAXIMIZED; }
|
||||||
|
bool minimized() const { return state_ & MINIMIZED; }
|
||||||
|
bool active() const { return state_ & ACTIVE; }
|
||||||
|
bool fullscreen() const { return state_ & FULLSCREEN; }
|
||||||
|
|
||||||
|
public:
|
||||||
|
/* Callbacks for the wlr protocol */
|
||||||
|
void handle_title(const char *);
|
||||||
|
void handle_app_id(const char *);
|
||||||
|
void handle_output_enter(struct wl_output *);
|
||||||
|
void handle_output_leave(struct wl_output *);
|
||||||
|
void handle_state(struct wl_array *);
|
||||||
|
void handle_done();
|
||||||
|
void handle_closed();
|
||||||
|
|
||||||
|
/* Callbacks for Gtk events */
|
||||||
|
bool handle_clicked(GdkEventButton *);
|
||||||
|
bool handle_button_release(GdkEventButton *);
|
||||||
|
bool handle_motion_notify(GdkEventMotion *);
|
||||||
|
void handle_drag_data_get(const Glib::RefPtr<Gdk::DragContext> &context,
|
||||||
|
Gtk::SelectionData &selection_data, guint info, guint time);
|
||||||
|
void handle_drag_data_received(const Glib::RefPtr<Gdk::DragContext> &context, int x, int y,
|
||||||
|
Gtk::SelectionData selection_data, guint info, guint time);
|
||||||
|
|
||||||
|
public:
|
||||||
|
bool operator==(const Task &) const;
|
||||||
|
bool operator!=(const Task &) const;
|
||||||
|
|
||||||
|
public:
|
||||||
|
void update();
|
||||||
|
|
||||||
|
public:
|
||||||
|
/* Interaction with the tasks */
|
||||||
|
void maximize(bool);
|
||||||
|
void minimize(bool);
|
||||||
|
void activate();
|
||||||
|
void fullscreen(bool);
|
||||||
|
void close();
|
||||||
|
};
|
||||||
|
|
||||||
|
using TaskPtr = std::unique_ptr<Task>;
|
||||||
|
|
||||||
|
class Taskbar : public waybar::AModule {
|
||||||
|
public:
|
||||||
|
Taskbar(const std::string &, const waybar::Bar &, const Json::Value &);
|
||||||
|
~Taskbar();
|
||||||
|
void update();
|
||||||
|
|
||||||
|
private:
|
||||||
|
const waybar::Bar &bar_;
|
||||||
|
Gtk::Box box_;
|
||||||
|
std::vector<TaskPtr> tasks_;
|
||||||
|
|
||||||
|
std::vector<Glib::RefPtr<Gtk::IconTheme>> icon_themes_;
|
||||||
|
std::unordered_set<std::string> ignore_list_;
|
||||||
|
std::map<std::string, std::string> app_ids_replace_map_;
|
||||||
|
|
||||||
|
struct zwlr_foreign_toplevel_manager_v1 *manager_;
|
||||||
|
struct wl_seat *seat_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
/* Callbacks for global registration */
|
||||||
|
void register_manager(struct wl_registry *, uint32_t name, uint32_t version);
|
||||||
|
void register_seat(struct wl_registry *, uint32_t name, uint32_t version);
|
||||||
|
|
||||||
|
/* Callbacks for the wlr protocol */
|
||||||
|
void handle_toplevel_create(struct zwlr_foreign_toplevel_handle_v1 *);
|
||||||
|
void handle_finished();
|
||||||
|
|
||||||
|
public:
|
||||||
|
void add_button(Gtk::Button &);
|
||||||
|
void move_button(Gtk::Button &, int);
|
||||||
|
void remove_button(Gtk::Button &);
|
||||||
|
void remove_task(uint32_t);
|
||||||
|
|
||||||
|
bool show_output(struct wl_output *) const;
|
||||||
|
bool all_outputs() const;
|
||||||
|
|
||||||
|
const std::vector<Glib::RefPtr<Gtk::IconTheme>> &icon_themes() const;
|
||||||
|
const std::unordered_set<std::string> &ignore_list() const;
|
||||||
|
const std::map<std::string, std::string> &app_ids_replace_map() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
} /* namespace waybar::modules::wlr */
|
161
include/modules/wlr/workspace_manager.hpp
Normal file
161
include/modules/wlr/workspace_manager.hpp
Normal file
@ -0,0 +1,161 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <fmt/format.h>
|
||||||
|
#include <gtkmm/button.h>
|
||||||
|
#include <gtkmm/image.h>
|
||||||
|
#include <gtkmm/label.h>
|
||||||
|
|
||||||
|
#include <functional>
|
||||||
|
#include <map>
|
||||||
|
#include <memory>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include "AModule.hpp"
|
||||||
|
#include "bar.hpp"
|
||||||
|
#include "ext-workspace-unstable-v1-client-protocol.h"
|
||||||
|
|
||||||
|
namespace waybar::modules::wlr {
|
||||||
|
|
||||||
|
class WorkspaceManager;
|
||||||
|
class WorkspaceGroup;
|
||||||
|
|
||||||
|
class Workspace {
|
||||||
|
public:
|
||||||
|
Workspace(const waybar::Bar &bar, const Json::Value &config, WorkspaceGroup &workspace_group,
|
||||||
|
zext_workspace_handle_v1 *workspace, uint32_t id);
|
||||||
|
~Workspace();
|
||||||
|
auto update() -> void;
|
||||||
|
|
||||||
|
auto id() const -> uint32_t { return id_; }
|
||||||
|
auto is_active() const -> bool { return state_ & static_cast<uint32_t>(State::ACTIVE); }
|
||||||
|
auto is_urgent() const -> bool { return state_ & static_cast<uint32_t>(State::URGENT); }
|
||||||
|
auto is_hidden() const -> bool { return state_ & static_cast<uint32_t>(State::HIDDEN); }
|
||||||
|
// wlr stuff
|
||||||
|
auto handle_name(const std::string &name) -> void;
|
||||||
|
auto handle_coordinates(const std::vector<uint32_t> &coordinates) -> void;
|
||||||
|
auto handle_state(const std::vector<uint32_t> &state) -> void;
|
||||||
|
auto handle_remove() -> void;
|
||||||
|
|
||||||
|
auto handle_done() -> void;
|
||||||
|
auto handle_clicked(GdkEventButton *bt) -> bool;
|
||||||
|
auto show() -> void;
|
||||||
|
auto hide() -> void;
|
||||||
|
auto get_button_ref() -> Gtk::Button & { return button_; }
|
||||||
|
auto get_name() -> std::string & { return name_; }
|
||||||
|
auto get_coords() -> std::vector<uint32_t> & { return coordinates_; }
|
||||||
|
|
||||||
|
enum class State {
|
||||||
|
ACTIVE = (1 << 0),
|
||||||
|
URGENT = (1 << 1),
|
||||||
|
HIDDEN = (1 << 2),
|
||||||
|
};
|
||||||
|
|
||||||
|
private:
|
||||||
|
auto get_icon() -> std::string;
|
||||||
|
|
||||||
|
const Bar &bar_;
|
||||||
|
const Json::Value &config_;
|
||||||
|
WorkspaceGroup &workspace_group_;
|
||||||
|
|
||||||
|
// wlr stuff
|
||||||
|
zext_workspace_handle_v1 *workspace_handle_;
|
||||||
|
uint32_t state_ = 0;
|
||||||
|
|
||||||
|
uint32_t id_;
|
||||||
|
std::string name_;
|
||||||
|
std::vector<uint32_t> coordinates_;
|
||||||
|
static std::map<std::string, std::string> icons_map_;
|
||||||
|
std::string format_;
|
||||||
|
bool with_icon_ = false;
|
||||||
|
|
||||||
|
Gtk::Button button_;
|
||||||
|
Gtk::Box content_;
|
||||||
|
Gtk::Label label_;
|
||||||
|
};
|
||||||
|
|
||||||
|
class WorkspaceGroup {
|
||||||
|
public:
|
||||||
|
WorkspaceGroup(const waybar::Bar &bar, Gtk::Box &box, const Json::Value &config,
|
||||||
|
WorkspaceManager &manager, zext_workspace_group_handle_v1 *workspace_group_handle,
|
||||||
|
uint32_t id);
|
||||||
|
~WorkspaceGroup();
|
||||||
|
auto update() -> void;
|
||||||
|
|
||||||
|
auto id() const -> uint32_t { return id_; }
|
||||||
|
auto is_visible() const -> bool;
|
||||||
|
auto remove_workspace(uint32_t id_) -> void;
|
||||||
|
auto active_only() const -> bool;
|
||||||
|
auto creation_delayed() const -> bool;
|
||||||
|
auto workspaces() -> std::vector<std::unique_ptr<Workspace>> & { return workspaces_; }
|
||||||
|
|
||||||
|
auto sort_workspaces() -> void;
|
||||||
|
auto set_need_to_sort() -> void { need_to_sort = true; }
|
||||||
|
auto add_button(Gtk::Button &button) -> void;
|
||||||
|
auto remove_button(Gtk::Button &button) -> void;
|
||||||
|
|
||||||
|
// wlr stuff
|
||||||
|
auto handle_workspace_create(zext_workspace_handle_v1 *workspace_handle) -> void;
|
||||||
|
auto handle_remove() -> void;
|
||||||
|
auto handle_output_enter(wl_output *output) -> void;
|
||||||
|
auto handle_output_leave() -> void;
|
||||||
|
auto handle_done() -> void;
|
||||||
|
auto commit() -> void;
|
||||||
|
|
||||||
|
private:
|
||||||
|
static uint32_t workspace_global_id;
|
||||||
|
const waybar::Bar &bar_;
|
||||||
|
Gtk::Box &box_;
|
||||||
|
const Json::Value &config_;
|
||||||
|
WorkspaceManager &workspace_manager_;
|
||||||
|
|
||||||
|
// wlr stuff
|
||||||
|
zext_workspace_group_handle_v1 *workspace_group_handle_;
|
||||||
|
wl_output *output_ = nullptr;
|
||||||
|
|
||||||
|
uint32_t id_;
|
||||||
|
std::vector<std::unique_ptr<Workspace>> workspaces_;
|
||||||
|
bool need_to_sort = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
class WorkspaceManager : public AModule {
|
||||||
|
public:
|
||||||
|
WorkspaceManager(const std::string &id, const waybar::Bar &bar, const Json::Value &config);
|
||||||
|
~WorkspaceManager() override;
|
||||||
|
auto update() -> void override;
|
||||||
|
|
||||||
|
auto all_outputs() const -> bool { return all_outputs_; }
|
||||||
|
auto active_only() const -> bool { return active_only_; }
|
||||||
|
auto workspace_comparator() const
|
||||||
|
-> std::function<bool(std::unique_ptr<Workspace> &, std::unique_ptr<Workspace> &)>;
|
||||||
|
auto creation_delayed() const -> bool { return creation_delayed_; }
|
||||||
|
|
||||||
|
auto sort_workspaces() -> void;
|
||||||
|
auto remove_workspace_group(uint32_t id_) -> void;
|
||||||
|
|
||||||
|
// wlr stuff
|
||||||
|
auto register_manager(wl_registry *registry, uint32_t name, uint32_t version) -> void;
|
||||||
|
auto handle_workspace_group_create(zext_workspace_group_handle_v1 *workspace_group_handle)
|
||||||
|
-> void;
|
||||||
|
auto handle_done() -> void;
|
||||||
|
auto handle_finished() -> void;
|
||||||
|
auto commit() -> void;
|
||||||
|
|
||||||
|
private:
|
||||||
|
const waybar::Bar &bar_;
|
||||||
|
Gtk::Box box_;
|
||||||
|
std::vector<std::unique_ptr<WorkspaceGroup>> groups_;
|
||||||
|
|
||||||
|
// wlr stuff
|
||||||
|
zext_workspace_manager_v1 *workspace_manager_ = nullptr;
|
||||||
|
|
||||||
|
static uint32_t group_global_id;
|
||||||
|
|
||||||
|
bool sort_by_name_ = true;
|
||||||
|
bool sort_by_coordinates_ = true;
|
||||||
|
bool sort_by_number_ = false;
|
||||||
|
bool all_outputs_ = false;
|
||||||
|
bool active_only_ = false;
|
||||||
|
bool creation_delayed_ = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace waybar::modules::wlr
|
10
include/modules/wlr/workspace_manager_binding.hpp
Normal file
10
include/modules/wlr/workspace_manager_binding.hpp
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#include "ext-workspace-unstable-v1-client-protocol.h"
|
||||||
|
|
||||||
|
namespace waybar::modules::wlr {
|
||||||
|
void add_registry_listener(void *data);
|
||||||
|
void add_workspace_listener(zext_workspace_handle_v1 *workspace_handle, void *data);
|
||||||
|
void add_workspace_group_listener(zext_workspace_group_handle_v1 *workspace_group_handle,
|
||||||
|
void *data);
|
||||||
|
zext_workspace_manager_v1 *workspace_manager_bind(wl_registry *registry, uint32_t name,
|
||||||
|
uint32_t version, void *data);
|
||||||
|
} // namespace waybar::modules::wlr
|
75
include/util/SafeSignal.hpp
Normal file
75
include/util/SafeSignal.hpp
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <glibmm/dispatcher.h>
|
||||||
|
#include <sigc++/signal.h>
|
||||||
|
|
||||||
|
#include <functional>
|
||||||
|
#include <mutex>
|
||||||
|
#include <queue>
|
||||||
|
#include <thread>
|
||||||
|
#include <tuple>
|
||||||
|
#include <type_traits>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
namespace waybar {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Thread-safe signal wrapper.
|
||||||
|
* Uses Glib::Dispatcher to pass events to another thread and locked queue to pass the arguments.
|
||||||
|
*/
|
||||||
|
template <typename... Args>
|
||||||
|
struct SafeSignal : sigc::signal<void(std::decay_t<Args>...)> {
|
||||||
|
public:
|
||||||
|
SafeSignal() { dp_.connect(sigc::mem_fun(*this, &SafeSignal::handle_event)); }
|
||||||
|
|
||||||
|
template <typename... EmitArgs>
|
||||||
|
void emit(EmitArgs&&... args) {
|
||||||
|
if (main_tid_ == std::this_thread::get_id()) {
|
||||||
|
/*
|
||||||
|
* Bypass the queue if the method is called the main thread.
|
||||||
|
* Ensures that events emitted from the main thread are processed synchronously and saves a
|
||||||
|
* few CPU cycles on locking/queuing.
|
||||||
|
* As a downside, this makes main thread events prioritized over the other threads and
|
||||||
|
* disrupts chronological order.
|
||||||
|
*/
|
||||||
|
signal_t::emit(std::forward<EmitArgs>(args)...);
|
||||||
|
} else {
|
||||||
|
{
|
||||||
|
std::unique_lock lock(mutex_);
|
||||||
|
queue_.emplace(std::forward<EmitArgs>(args)...);
|
||||||
|
}
|
||||||
|
dp_.emit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename... EmitArgs>
|
||||||
|
inline void operator()(EmitArgs&&... args) {
|
||||||
|
emit(std::forward<EmitArgs>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
using signal_t = sigc::signal<void(std::decay_t<Args>...)>;
|
||||||
|
using slot_t = decltype(std::declval<signal_t>().make_slot());
|
||||||
|
using arg_tuple_t = std::tuple<std::decay_t<Args>...>;
|
||||||
|
// ensure that unwrapped methods are not accessible
|
||||||
|
using signal_t::emit_reverse;
|
||||||
|
using signal_t::make_slot;
|
||||||
|
|
||||||
|
void handle_event() {
|
||||||
|
for (std::unique_lock lock(mutex_); !queue_.empty(); lock.lock()) {
|
||||||
|
auto args = queue_.front();
|
||||||
|
queue_.pop();
|
||||||
|
lock.unlock();
|
||||||
|
std::apply(cached_fn_, args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Glib::Dispatcher dp_;
|
||||||
|
std::mutex mutex_;
|
||||||
|
std::queue<arg_tuple_t> queue_;
|
||||||
|
const std::thread::id main_tid_ = std::this_thread::get_id();
|
||||||
|
// cache functor for signal emission to avoid recreating it on each event
|
||||||
|
const slot_t cached_fn_ = make_slot();
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace waybar
|
File diff suppressed because it is too large
Load Diff
@ -1,9 +1,22 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <giomm.h>
|
#include <giomm.h>
|
||||||
|
#include <spdlog/spdlog.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#ifdef __linux__
|
||||||
|
#include <sys/prctl.h>
|
||||||
|
#endif
|
||||||
|
#ifdef __FreeBSD__
|
||||||
|
#include <sys/procctl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <array>
|
||||||
|
|
||||||
|
extern std::mutex reap_mtx;
|
||||||
|
extern std::list<pid_t> reap;
|
||||||
|
|
||||||
namespace waybar::util::command {
|
namespace waybar::util::command {
|
||||||
|
|
||||||
struct res {
|
struct res {
|
||||||
@ -28,36 +41,68 @@ inline std::string read(FILE* fp) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline int close(FILE* fp, pid_t pid) {
|
inline int close(FILE* fp, pid_t pid) {
|
||||||
int stat;
|
int stat = -1;
|
||||||
|
pid_t ret;
|
||||||
|
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
while (waitpid(pid, &stat, 0) == -1) {
|
do {
|
||||||
if (errno != EINTR) {
|
ret = waitpid(pid, &stat, WCONTINUED | WUNTRACED);
|
||||||
stat = -1;
|
|
||||||
|
if (WIFEXITED(stat)) {
|
||||||
|
spdlog::debug("Cmd exited with code {}", WEXITSTATUS(stat));
|
||||||
|
} else if (WIFSIGNALED(stat)) {
|
||||||
|
spdlog::debug("Cmd killed by {}", WTERMSIG(stat));
|
||||||
|
} else if (WIFSTOPPED(stat)) {
|
||||||
|
spdlog::debug("Cmd stopped by {}", WSTOPSIG(stat));
|
||||||
|
} else if (WIFCONTINUED(stat)) {
|
||||||
|
spdlog::debug("Cmd continued");
|
||||||
|
} else if (ret == -1) {
|
||||||
|
spdlog::debug("waitpid failed: {}", strerror(errno));
|
||||||
|
} else {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
} while (!WIFEXITED(stat) && !WIFSIGNALED(stat));
|
||||||
|
|
||||||
return stat;
|
return stat;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline FILE* open(const std::string cmd, int& pid) {
|
inline FILE* open(const std::string& cmd, int& pid) {
|
||||||
if (cmd == "") return nullptr;
|
if (cmd == "") return nullptr;
|
||||||
int fd[2];
|
int fd[2];
|
||||||
pipe(fd);
|
if (pipe(fd) != 0) {
|
||||||
|
spdlog::error("Unable to pipe fd");
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
pid_t child_pid = fork();
|
pid_t child_pid = fork();
|
||||||
|
|
||||||
if (child_pid < 0) {
|
if (child_pid < 0) {
|
||||||
printf("Unable to exec cmd %s, error %s", cmd.c_str(), strerror(errno));
|
spdlog::error("Unable to exec cmd {}, error {}", cmd.c_str(), strerror(errno));
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!child_pid) {
|
if (!child_pid) {
|
||||||
|
int err;
|
||||||
|
sigset_t mask;
|
||||||
|
sigfillset(&mask);
|
||||||
|
// Reset sigmask
|
||||||
|
err = pthread_sigmask(SIG_UNBLOCK, &mask, nullptr);
|
||||||
|
if (err != 0) spdlog::error("pthread_sigmask in open failed: {}", strerror(err));
|
||||||
|
// Kill child if Waybar exits
|
||||||
|
int deathsig = SIGTERM;
|
||||||
|
#ifdef __linux__
|
||||||
|
if (prctl(PR_SET_PDEATHSIG, deathsig) != 0) {
|
||||||
|
spdlog::error("prctl(PR_SET_PDEATHSIG) in open failed: {}", strerror(errno));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef __FreeBSD__
|
||||||
|
if (procctl(P_PID, 0, PROC_PDEATHSIG_CTL, reinterpret_cast<void*>(&deathsig)) == -1) {
|
||||||
|
spdlog::error("procctl(PROC_PDEATHSIG_CTL) in open failed: {}", strerror(errno));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
::close(fd[0]);
|
::close(fd[0]);
|
||||||
dup2(fd[1], 1);
|
dup2(fd[1], 1);
|
||||||
setpgid(child_pid, child_pid);
|
setpgid(child_pid, child_pid);
|
||||||
execl("/bin/sh", "sh", "-c", cmd.c_str(), (char*)0);
|
execlp("/bin/sh", "sh", "-c", cmd.c_str(), (char*)0);
|
||||||
exit(0);
|
exit(0);
|
||||||
} else {
|
} else {
|
||||||
::close(fd[1]);
|
::close(fd[1]);
|
||||||
@ -66,7 +111,7 @@ inline FILE* open(const std::string cmd, int& pid) {
|
|||||||
return fdopen(fd[0], "r");
|
return fdopen(fd[0], "r");
|
||||||
}
|
}
|
||||||
|
|
||||||
inline struct res exec(std::string cmd) {
|
inline struct res exec(const std::string& cmd) {
|
||||||
int pid;
|
int pid;
|
||||||
auto fp = command::open(cmd, pid);
|
auto fp = command::open(cmd, pid);
|
||||||
if (!fp) return {-1, ""};
|
if (!fp) return {-1, ""};
|
||||||
@ -75,23 +120,40 @@ inline struct res exec(std::string cmd) {
|
|||||||
return {WEXITSTATUS(stat), output};
|
return {WEXITSTATUS(stat), output};
|
||||||
}
|
}
|
||||||
|
|
||||||
inline int32_t forkExec(std::string cmd) {
|
inline struct res execNoRead(const std::string& cmd) {
|
||||||
|
int pid;
|
||||||
|
auto fp = command::open(cmd, pid);
|
||||||
|
if (!fp) return {-1, ""};
|
||||||
|
auto stat = command::close(fp, pid);
|
||||||
|
return {WEXITSTATUS(stat), ""};
|
||||||
|
}
|
||||||
|
|
||||||
|
inline int32_t forkExec(const std::string& cmd) {
|
||||||
if (cmd == "") return -1;
|
if (cmd == "") return -1;
|
||||||
|
|
||||||
int32_t pid = fork();
|
pid_t pid = fork();
|
||||||
|
|
||||||
if (pid < 0) {
|
if (pid < 0) {
|
||||||
printf("Unable to exec cmd %s, error %s", cmd.c_str(), strerror(errno));
|
spdlog::error("Unable to exec cmd {}, error {}", cmd.c_str(), strerror(errno));
|
||||||
return pid;
|
return pid;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Child executes the command
|
// Child executes the command
|
||||||
if (!pid) {
|
if (!pid) {
|
||||||
|
int err;
|
||||||
|
sigset_t mask;
|
||||||
|
sigfillset(&mask);
|
||||||
|
// Reset sigmask
|
||||||
|
err = pthread_sigmask(SIG_UNBLOCK, &mask, nullptr);
|
||||||
|
if (err != 0) spdlog::error("pthread_sigmask in forkExec failed: {}", strerror(err));
|
||||||
setpgid(pid, pid);
|
setpgid(pid, pid);
|
||||||
execl("/bin/sh", "sh", "-c", cmd.c_str(), (char*)0);
|
execl("/bin/sh", "sh", "-c", cmd.c_str(), (char*)0);
|
||||||
exit(0);
|
exit(0);
|
||||||
} else {
|
} else {
|
||||||
signal(SIGCHLD,SIG_IGN);
|
reap_mtx.lock();
|
||||||
|
reap.push_back(pid);
|
||||||
|
reap_mtx.unlock();
|
||||||
|
spdlog::debug("Added child to reap list: {}", pid);
|
||||||
}
|
}
|
||||||
|
|
||||||
return pid;
|
return pid;
|
||||||
|
99
include/util/format.hpp
Normal file
99
include/util/format.hpp
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <fmt/format.h>
|
||||||
|
#include <glibmm/ustring.h>
|
||||||
|
|
||||||
|
class pow_format {
|
||||||
|
public:
|
||||||
|
pow_format(long long val, std::string&& unit, bool binary = false)
|
||||||
|
: val_(val), unit_(unit), binary_(binary){};
|
||||||
|
|
||||||
|
long long val_;
|
||||||
|
std::string unit_;
|
||||||
|
bool binary_;
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace fmt {
|
||||||
|
template <>
|
||||||
|
struct formatter<pow_format> {
|
||||||
|
char spec = 0;
|
||||||
|
int width = 0;
|
||||||
|
|
||||||
|
template <typename ParseContext>
|
||||||
|
constexpr auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {
|
||||||
|
auto it = ctx.begin(), end = ctx.end();
|
||||||
|
if (it != end && *it == ':') ++it;
|
||||||
|
if (it && (*it == '>' || *it == '<' || *it == '=')) {
|
||||||
|
spec = *it;
|
||||||
|
++it;
|
||||||
|
}
|
||||||
|
if (it == end || *it == '}') return it;
|
||||||
|
if ('0' <= *it && *it <= '9') {
|
||||||
|
// We ignore it for now, but keep it for compatibility with
|
||||||
|
// existing configs where the format for pow_format'ed numbers was
|
||||||
|
// 'string' and specifications such as {:>9} were valid.
|
||||||
|
// The rationale for ignoring it is that the only reason to specify
|
||||||
|
// an alignment and a with is to get a fixed width bar, and ">" is
|
||||||
|
// sufficient in this implementation.
|
||||||
|
#if FMT_VERSION < 80000
|
||||||
|
width = parse_nonnegative_int(it, end, ctx);
|
||||||
|
#else
|
||||||
|
width = detail::parse_nonnegative_int(it, end, -1);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
return it;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class FormatContext>
|
||||||
|
auto format(const pow_format& s, FormatContext& ctx) -> decltype(ctx.out()) {
|
||||||
|
const char* units[] = {"", "k", "M", "G", "T", "P", nullptr};
|
||||||
|
|
||||||
|
auto base = s.binary_ ? 1024ull : 1000ll;
|
||||||
|
auto fraction = (double)s.val_;
|
||||||
|
|
||||||
|
int pow;
|
||||||
|
for (pow = 0; units[pow + 1] != nullptr && fraction / base >= 1; ++pow) {
|
||||||
|
fraction /= base;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto number_width = 5 // coeff in {:.1f} format
|
||||||
|
+ s.binary_; // potential 4th digit before the decimal point
|
||||||
|
auto max_width = number_width + 1 // prefix from units array
|
||||||
|
+ s.binary_ // for the 'i' in GiB.
|
||||||
|
+ s.unit_.length();
|
||||||
|
|
||||||
|
const char* format;
|
||||||
|
std::string string;
|
||||||
|
switch (spec) {
|
||||||
|
case '>':
|
||||||
|
return format_to(ctx.out(), "{:>{}}", fmt::format("{}", s), max_width);
|
||||||
|
case '<':
|
||||||
|
return format_to(ctx.out(), "{:<{}}", fmt::format("{}", s), max_width);
|
||||||
|
case '=':
|
||||||
|
format = "{coefficient:<{number_width}.1f}{padding}{prefix}{unit}";
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
default:
|
||||||
|
format = "{coefficient:.1f}{prefix}{unit}";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return format_to(
|
||||||
|
ctx.out(), format, fmt::arg("coefficient", fraction),
|
||||||
|
fmt::arg("number_width", number_width),
|
||||||
|
fmt::arg("prefix", std::string() + units[pow] + ((s.binary_ && pow) ? "i" : "")),
|
||||||
|
fmt::arg("unit", s.unit_),
|
||||||
|
fmt::arg("padding", pow ? ""
|
||||||
|
: s.binary_ ? " "
|
||||||
|
: " "));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Glib ustirng support
|
||||||
|
template <>
|
||||||
|
struct formatter<Glib::ustring> : formatter<std::string> {
|
||||||
|
template <typename FormatContext>
|
||||||
|
auto format(const Glib::ustring& value, FormatContext& ctx) {
|
||||||
|
return formatter<std::string>::format(value, ctx);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} // namespace fmt
|
@ -1,7 +1,15 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <fmt/ostream.h>
|
||||||
#include <json/json.h>
|
#include <json/json.h>
|
||||||
|
|
||||||
|
#if (FMT_VERSION >= 90000)
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct fmt::formatter<Json::Value> : ostream_formatter {};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace waybar::util {
|
namespace waybar::util {
|
||||||
|
|
||||||
struct JsonParser {
|
struct JsonParser {
|
||||||
|
8
include/util/rewrite_title.hpp
Normal file
8
include/util/rewrite_title.hpp
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <json/json.h>
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace waybar::util {
|
||||||
|
std::string rewriteTitle(const std::string&, const Json::Value&);
|
||||||
|
}
|
26
include/util/rfkill.hpp
Normal file
26
include/util/rfkill.hpp
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <glibmm/iochannel.h>
|
||||||
|
#include <linux/rfkill.h>
|
||||||
|
#include <sigc++/signal.h>
|
||||||
|
#include <sigc++/trackable.h>
|
||||||
|
|
||||||
|
namespace waybar::util {
|
||||||
|
|
||||||
|
class Rfkill : public sigc::trackable {
|
||||||
|
public:
|
||||||
|
Rfkill(enum rfkill_type rfkill_type);
|
||||||
|
~Rfkill();
|
||||||
|
bool getState() const;
|
||||||
|
|
||||||
|
sigc::signal<void(struct rfkill_event&)> on_update;
|
||||||
|
|
||||||
|
private:
|
||||||
|
enum rfkill_type rfkill_type_;
|
||||||
|
bool state_ = false;
|
||||||
|
int fd_ = -1;
|
||||||
|
|
||||||
|
bool on_event(Glib::IOCondition cond);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace waybar::util
|
6
include/util/sanitize_str.hpp
Normal file
6
include/util/sanitize_str.hpp
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace waybar::util {
|
||||||
|
std::string sanitize_string(std::string str);
|
||||||
|
} // namespace waybar::util
|
@ -8,13 +8,31 @@
|
|||||||
|
|
||||||
namespace waybar::util {
|
namespace waybar::util {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defer pthread_cancel until the end of a current scope.
|
||||||
|
*
|
||||||
|
* Required to protect a scope where it's unsafe to raise `__forced_unwind` exception.
|
||||||
|
* An example of these is a call of a method marked as `noexcept`; an attempt to cancel within such
|
||||||
|
* a method may result in a `std::terminate` call.
|
||||||
|
*/
|
||||||
|
class CancellationGuard {
|
||||||
|
int oldstate;
|
||||||
|
|
||||||
|
public:
|
||||||
|
CancellationGuard() { pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstate); }
|
||||||
|
~CancellationGuard() { pthread_setcancelstate(oldstate, &oldstate); }
|
||||||
|
};
|
||||||
|
|
||||||
class SleeperThread {
|
class SleeperThread {
|
||||||
public:
|
public:
|
||||||
SleeperThread() = default;
|
SleeperThread() = default;
|
||||||
|
|
||||||
SleeperThread(std::function<void()> func)
|
SleeperThread(std::function<void()> func)
|
||||||
: thread_{[this, func] {
|
: thread_{[this, func] {
|
||||||
while (do_run_) func();
|
while (do_run_) {
|
||||||
|
signal_ = false;
|
||||||
|
func();
|
||||||
|
}
|
||||||
}} {}
|
}} {}
|
||||||
|
|
||||||
SleeperThread& operator=(std::function<void()> func) {
|
SleeperThread& operator=(std::function<void()> func) {
|
||||||
@ -31,6 +49,7 @@ class SleeperThread {
|
|||||||
|
|
||||||
auto sleep_for(std::chrono::system_clock::duration dur) {
|
auto sleep_for(std::chrono::system_clock::duration dur) {
|
||||||
std::unique_lock lk(mutex_);
|
std::unique_lock lk(mutex_);
|
||||||
|
CancellationGuard cancel_lock;
|
||||||
return condvar_.wait_for(lk, dur, [this] { return signal_ || !do_run_; });
|
return condvar_.wait_for(lk, dur, [this] { return signal_ || !do_run_; });
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -38,11 +57,15 @@ class SleeperThread {
|
|||||||
std::chrono::time_point<std::chrono::system_clock, std::chrono::system_clock::duration>
|
std::chrono::time_point<std::chrono::system_clock, std::chrono::system_clock::duration>
|
||||||
time_point) {
|
time_point) {
|
||||||
std::unique_lock lk(mutex_);
|
std::unique_lock lk(mutex_);
|
||||||
|
CancellationGuard cancel_lock;
|
||||||
return condvar_.wait_until(lk, time_point, [this] { return signal_ || !do_run_; });
|
return condvar_.wait_until(lk, time_point, [this] { return signal_ || !do_run_; });
|
||||||
}
|
}
|
||||||
|
|
||||||
auto wake_up() {
|
auto wake_up() {
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lck(mutex_);
|
||||||
signal_ = true;
|
signal_ = true;
|
||||||
|
}
|
||||||
condvar_.notify_all();
|
condvar_.notify_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -53,6 +76,11 @@ class SleeperThread {
|
|||||||
do_run_ = false;
|
do_run_ = false;
|
||||||
}
|
}
|
||||||
condvar_.notify_all();
|
condvar_.notify_all();
|
||||||
|
auto handle = thread_.native_handle();
|
||||||
|
if (handle != 0) {
|
||||||
|
// TODO: find a proper way to terminate thread...
|
||||||
|
pthread_cancel(handle);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
~SleeperThread() {
|
~SleeperThread() {
|
||||||
|
17
include/util/string.hpp
Normal file
17
include/util/string.hpp
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
const std::string WHITESPACE = " \n\r\t\f\v";
|
||||||
|
|
||||||
|
inline std::string ltrim(const std::string& s) {
|
||||||
|
size_t begin = s.find_first_not_of(WHITESPACE);
|
||||||
|
return (begin == std::string::npos) ? "" : s.substr(begin);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::string rtrim(const std::string& s) {
|
||||||
|
size_t end = s.find_last_not_of(WHITESPACE);
|
||||||
|
return (end == std::string::npos) ? "" : s.substr(0, end + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::string trim(const std::string& s) { return rtrim(ltrim(s)); }
|
5
include/util/ustring_clen.hpp
Normal file
5
include/util/ustring_clen.hpp
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <glibmm/ustring.h>
|
||||||
|
|
||||||
|
// calculate column width of ustring
|
||||||
|
int ustring_clen(const Glib::ustring &str);
|
39
include/util/waybar_time.hpp
Normal file
39
include/util/waybar_time.hpp
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <date/tz.h>
|
||||||
|
#include <fmt/format.h>
|
||||||
|
|
||||||
|
namespace waybar {
|
||||||
|
|
||||||
|
struct waybar_time {
|
||||||
|
std::locale locale;
|
||||||
|
date::zoned_seconds ztime;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace waybar
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct fmt::formatter<waybar::waybar_time> {
|
||||||
|
std::string_view specs;
|
||||||
|
|
||||||
|
template <typename ParseContext>
|
||||||
|
constexpr auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {
|
||||||
|
auto it = ctx.begin();
|
||||||
|
if (it != ctx.end() && *it == ':') {
|
||||||
|
++it;
|
||||||
|
}
|
||||||
|
auto end = it;
|
||||||
|
while (end != ctx.end() && *end != '}') {
|
||||||
|
++end;
|
||||||
|
}
|
||||||
|
if (end != it) {
|
||||||
|
specs = {it, std::string_view::size_type(end - it)};
|
||||||
|
}
|
||||||
|
return end;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename FormatContext>
|
||||||
|
auto format(const waybar::waybar_time& t, FormatContext& ctx) {
|
||||||
|
return format_to(ctx.out(), "{}", date::format(t.locale, fmt::to_string(specs), t.ztime));
|
||||||
|
}
|
||||||
|
};
|
83
man/waybar-backlight.5.scd
Normal file
83
man/waybar-backlight.5.scd
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
waybar-backlight(5)
|
||||||
|
|
||||||
|
# NAME
|
||||||
|
|
||||||
|
waybar - backlight module
|
||||||
|
|
||||||
|
# DESCRIPTION
|
||||||
|
|
||||||
|
The *backlight* module displays the current backlight level.
|
||||||
|
|
||||||
|
# CONFIGURATION
|
||||||
|
|
||||||
|
*interval*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
default: 2 ++
|
||||||
|
The interval in which information gets polled.
|
||||||
|
|
||||||
|
*format*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: {percent}% ++
|
||||||
|
The format, how information should be displayed. On {} data gets inserted.
|
||||||
|
|
||||||
|
*max-length*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
The maximum length in characters the module should display.
|
||||||
|
|
||||||
|
*min-length*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
The minimum length in characters the module should take up.
|
||||||
|
|
||||||
|
*align*: ++
|
||||||
|
typeof: float ++
|
||||||
|
The alignment of the text, where 0 is left-aligned and 1 is right-aligned. If the module is rotated, it will follow the flow of the text.
|
||||||
|
|
||||||
|
*rotate*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
Positive value to rotate the text label.
|
||||||
|
|
||||||
|
*states*: ++
|
||||||
|
typeof: object ++
|
||||||
|
A number of backlight states which get activated on certain brightness levels. See *waybar-states(5)*.
|
||||||
|
|
||||||
|
*on-click*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when the module is clicked.
|
||||||
|
|
||||||
|
*on-click-middle*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when middle-clicked on the module using mousewheel.
|
||||||
|
|
||||||
|
*on-click-right*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when the module is right clicked.
|
||||||
|
|
||||||
|
*on-update*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when the module is updated.
|
||||||
|
|
||||||
|
*on-scroll-up*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when performing a scroll up on the module.
|
||||||
|
|
||||||
|
*on-scroll-down*: ++
|
||||||
|
typeof: string
|
||||||
|
Command to execute when performing a scroll down on the module.
|
||||||
|
|
||||||
|
*smooth-scrolling-threshold*: ++
|
||||||
|
typeof: double
|
||||||
|
Threshold to be used when scrolling.
|
||||||
|
|
||||||
|
# EXAMPLE:
|
||||||
|
|
||||||
|
```
|
||||||
|
"backlight": {
|
||||||
|
"device": "intel_backlight",
|
||||||
|
"format": "{percent}% {icon}",
|
||||||
|
"format-icons": ["", ""]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
# STYLE
|
||||||
|
|
||||||
|
- *#backlight*
|
164
man/waybar-battery.5.scd
Normal file
164
man/waybar-battery.5.scd
Normal file
@ -0,0 +1,164 @@
|
|||||||
|
waybar-battery(5)
|
||||||
|
|
||||||
|
# NAME
|
||||||
|
|
||||||
|
waybar - battery module
|
||||||
|
|
||||||
|
# DESCRIPTION
|
||||||
|
|
||||||
|
The *battery* module displays the current capacity and state (eg. charging) of your battery.
|
||||||
|
|
||||||
|
# CONFIGURATION
|
||||||
|
|
||||||
|
*bat*: ++
|
||||||
|
typeof: string ++
|
||||||
|
The battery to monitor, as in /sys/class/power_supply/ instead of auto detect.
|
||||||
|
|
||||||
|
*adapter*: ++
|
||||||
|
typeof: string ++
|
||||||
|
The adapter to monitor, as in /sys/class/power_supply/ instead of auto detect.
|
||||||
|
|
||||||
|
*full-at*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
Define the max percentage of the battery, for when you've set the battery to stop charging at a lower level to save it. For example, if you've set the battery to stop at 80% that will become the new 100%.
|
||||||
|
|
||||||
|
*design-capacity*: ++
|
||||||
|
typeof: bool ++
|
||||||
|
default: false ++
|
||||||
|
Option to use the battery design capacity instead of it's current maximal capacity.
|
||||||
|
|
||||||
|
*interval*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
default: 60 ++
|
||||||
|
The interval in which the information gets polled.
|
||||||
|
|
||||||
|
*states*: ++
|
||||||
|
typeof: object ++
|
||||||
|
A number of battery states which get activated on certain capacity levels. See *waybar-states(5)*.
|
||||||
|
|
||||||
|
*format*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: {capacity}% ++
|
||||||
|
The format, how information should be displayed.
|
||||||
|
|
||||||
|
*format-time*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: {H} h {M} min ++
|
||||||
|
The format, how the time should be displayed.
|
||||||
|
|
||||||
|
*format-icons*: ++
|
||||||
|
typeof: array/object ++
|
||||||
|
Based on the current capacity, the corresponding icon gets selected. ++
|
||||||
|
The order is *low* to *high*. Or by the state if it is an object.
|
||||||
|
|
||||||
|
*max-length*: ++
|
||||||
|
typeof: integer++
|
||||||
|
The maximum length in character the module should display.
|
||||||
|
|
||||||
|
*min-length*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
The minimum length in characters the module should take up.
|
||||||
|
|
||||||
|
*align*: ++
|
||||||
|
typeof: float ++
|
||||||
|
The alignment of the text, where 0 is left-aligned and 1 is right-aligned. If the module is rotated, it will follow the flow of the text.
|
||||||
|
|
||||||
|
*rotate*: ++
|
||||||
|
typeof: integer++
|
||||||
|
Positive value to rotate the text label.
|
||||||
|
|
||||||
|
*on-click*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when clicked on the module.
|
||||||
|
|
||||||
|
*on-click-middle*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when middle-clicked on the module using mousewheel.
|
||||||
|
|
||||||
|
*on-click-right*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when you right clicked on the module.
|
||||||
|
|
||||||
|
*on-update*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when the module is updated.
|
||||||
|
|
||||||
|
*on-scroll-up*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when scrolling up on the module.
|
||||||
|
|
||||||
|
*on-scroll-down*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when scrolling down on the module.
|
||||||
|
|
||||||
|
*smooth-scrolling-threshold*: ++
|
||||||
|
typeof: double ++
|
||||||
|
Threshold to be used when scrolling.
|
||||||
|
|
||||||
|
*tooltip*: ++
|
||||||
|
typeof: bool ++
|
||||||
|
default: true ++
|
||||||
|
Option to disable tooltip on hover.
|
||||||
|
|
||||||
|
# FORMAT REPLACEMENTS
|
||||||
|
|
||||||
|
*{capacity}*: Capacity in percentage
|
||||||
|
|
||||||
|
*{power}*: Power in watts
|
||||||
|
|
||||||
|
*{icon}*: Icon, as defined in *format-icons*.
|
||||||
|
|
||||||
|
*{time}*: Estimate of time until full or empty. Note that this is based on the power draw at the last refresh time, not an average.
|
||||||
|
|
||||||
|
# TIME FORMAT
|
||||||
|
|
||||||
|
The *battery* module allows you to define how time should be formatted via *format-time*.
|
||||||
|
|
||||||
|
The three arguments are:
|
||||||
|
*{H}*: Hours
|
||||||
|
*{M}*: Minutes
|
||||||
|
*{m}*: Zero-padded minutes
|
||||||
|
|
||||||
|
# CUSTOM FORMATS
|
||||||
|
|
||||||
|
The *battery* module allows one to define custom formats based on up to two factors. The best fitting format will be selected.
|
||||||
|
|
||||||
|
*format-<state>*: With *states*, a custom format can be set depending on the capacity of your battery.
|
||||||
|
|
||||||
|
*format-<status>*: With the status, a custom format can be set depending on the status in /sys/class/power_supply/<bat>/status (in lowercase).
|
||||||
|
|
||||||
|
*format-<status>-<state>*: You can also set a custom format depending on both values.
|
||||||
|
|
||||||
|
# STATES
|
||||||
|
|
||||||
|
- Every entry (*state*) consists of a *<name>* (typeof: *string*) and a *<value>* (typeof: *integer*).
|
||||||
|
- The state can be addressed as a CSS class in the *style.css*. The name of the CSS class is the *<name>* of the state. Each class gets activated when the current capacity is equal or below the configured *<value>*.
|
||||||
|
- Also each state can have its own *format*. Those con be configured via *format-<name>*. Or if you want to differentiate a bit more even as *format-<status>-<state>*. For more information see *custom-formats*.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# EXAMPLES
|
||||||
|
|
||||||
|
```
|
||||||
|
"battery": {
|
||||||
|
"bat": "BAT2",
|
||||||
|
"interval": 60,
|
||||||
|
"states": {
|
||||||
|
"warning": 30,
|
||||||
|
"critical": 15
|
||||||
|
},
|
||||||
|
"format": "{capacity}% {icon}",
|
||||||
|
"format-icons": ["", "", "", "", ""],
|
||||||
|
"max-length": 25
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
# STYLE
|
||||||
|
|
||||||
|
- *#battery*
|
||||||
|
- *#battery.<status>*
|
||||||
|
- *<status>* is the value of /sys/class/power_supply/<bat>/status in lowercase.
|
||||||
|
- *#battery.<state>*
|
||||||
|
- *<state>* can be defined in the *config*. For more information see *states*.
|
||||||
|
- *#battery.<status>.<state>*
|
||||||
|
- Combination of both *<status>* and *<state>*.
|
202
man/waybar-bluetooth.5.scd
Normal file
202
man/waybar-bluetooth.5.scd
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
waybar-bluetooth(5)
|
||||||
|
|
||||||
|
# NAME
|
||||||
|
|
||||||
|
waybar - bluetooth module
|
||||||
|
|
||||||
|
# DESCRIPTION
|
||||||
|
|
||||||
|
The *bluetooth* module displays information about a bluetooth controller and its connections.
|
||||||
|
|
||||||
|
# CONFIGURATION
|
||||||
|
|
||||||
|
Addressed by *bluetooth*
|
||||||
|
|
||||||
|
*controller*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Use the controller with the defined alias. Otherwise a random controller is used. Recommended to define when there is more than 1 controller available to the system.
|
||||||
|
|
||||||
|
*format-device-preference*: ++
|
||||||
|
typeof: array ++
|
||||||
|
A ranking of bluetooth devices, addressed by their alias. The order is from *first displayed* to *last displayed*. ++
|
||||||
|
If this config option is not defined or none of the devices in the list are connected, it will fall back to showing the last connected device.
|
||||||
|
|
||||||
|
*format*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: * {status}* ++
|
||||||
|
The format, how information should be displayed. This format is used when other formats aren't specified.
|
||||||
|
|
||||||
|
*format-disabled*: ++
|
||||||
|
typeof: string ++
|
||||||
|
This format is used when the displayed controller is disabled.
|
||||||
|
|
||||||
|
*format-off*: ++
|
||||||
|
typeof: string ++
|
||||||
|
This format is used when the displayed controller is turned off.
|
||||||
|
|
||||||
|
*format-on*: ++
|
||||||
|
typeof: string ++
|
||||||
|
This format is used when the displayed controller is turned on with no devices connected.
|
||||||
|
|
||||||
|
*format-connected*: ++
|
||||||
|
typeof: string ++
|
||||||
|
This format is used when the displayed controller is connected to at least 1 device.
|
||||||
|
|
||||||
|
*format-icons*: ++
|
||||||
|
typeof: array/object ++
|
||||||
|
Based on the current battery percentage (see section *EXPERIMENTAL BATTERY PERCENTAGE FEATURE*), the corresponding icon gets selected. ++
|
||||||
|
The order is *low* to *high*. Will only show the current battery percentage icon in the *\*-connected-battery* config options. ++
|
||||||
|
Or by the state if it is an object. It will fall back to the enabled state if its derivatives are not defined (on, off, connected).
|
||||||
|
|
||||||
|
*rotate*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
Positive value to rotate the text label.
|
||||||
|
|
||||||
|
*max-length*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
The maximum length in character the module should display.
|
||||||
|
|
||||||
|
*min-length*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
The minimum length in characters the module should take up.
|
||||||
|
|
||||||
|
*align*: ++
|
||||||
|
typeof: float ++
|
||||||
|
The alignment of the text, where 0 is left-aligned and 1 is right-aligned. If the module is rotated, it will follow the flow of the text.
|
||||||
|
|
||||||
|
*on-click*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when clicked on the module.
|
||||||
|
|
||||||
|
*on-click-middle*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when middle-clicked on the module using mousewheel.
|
||||||
|
|
||||||
|
*on-click-right*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when you right clicked on the module.
|
||||||
|
|
||||||
|
*on-scroll-up*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when scrolling up on the module.
|
||||||
|
|
||||||
|
*on-scroll-down*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when scrolling down on the module.
|
||||||
|
|
||||||
|
*smooth-scrolling-threshold*: ++
|
||||||
|
typeof: double ++
|
||||||
|
Threshold to be used when scrolling.
|
||||||
|
|
||||||
|
*tooltip*: ++
|
||||||
|
typeof: bool ++
|
||||||
|
default: *true* ++
|
||||||
|
Option to disable tooltip on hover.
|
||||||
|
|
||||||
|
*tooltip-format*: ++
|
||||||
|
typeof: string ++
|
||||||
|
The format, how information should be displayed in the tooltip. This format is used when other formats aren't specified.
|
||||||
|
|
||||||
|
*tooltip-format-disabled*: ++
|
||||||
|
typeof: string ++
|
||||||
|
This format is used when the displayed controller is disabled.
|
||||||
|
|
||||||
|
*tooltip-format-off*: ++
|
||||||
|
typeof: string ++
|
||||||
|
This format is used when the displayed controller is turned off.
|
||||||
|
|
||||||
|
*tooltip-format-on*: ++
|
||||||
|
typeof: string ++
|
||||||
|
This format is used when the displayed controller is turned on with no devices connected.
|
||||||
|
|
||||||
|
*tooltip-format-connected*: ++
|
||||||
|
typeof: string ++
|
||||||
|
This format is used when the displayed controller is connected to at least 1 device.
|
||||||
|
|
||||||
|
*tooltip-format-enumerate-connected*: ++
|
||||||
|
typeof: string ++
|
||||||
|
This format is used to define how each connected device should be displayed within the *device_enumerate* format replacement in the tooltip menu.
|
||||||
|
|
||||||
|
# FORMAT REPLACEMENTS
|
||||||
|
|
||||||
|
*{status}*: Status of the bluetooth device.
|
||||||
|
|
||||||
|
*{icon}*: Icon, as defined in *format-icons*.
|
||||||
|
|
||||||
|
*{num_connections}*: Number of connections the displayed controller has.
|
||||||
|
|
||||||
|
*{controller_address}*: Address of the displayed controller.
|
||||||
|
|
||||||
|
*{controller_address_type}*: Address type of the displayed controller.
|
||||||
|
|
||||||
|
*{controller_alias}*: Alias of the displayed controller.
|
||||||
|
|
||||||
|
*{device_address}*: Address of the displayed device.
|
||||||
|
|
||||||
|
*{device_address_type}*: Address type of the displayed device.
|
||||||
|
|
||||||
|
*{device_alias}*: Alias of the displayed device.
|
||||||
|
|
||||||
|
*{device_enumerate}*: Show a list of all connected devices, each on a separate line. Define the format of each device with the *tooltip-format-enumerate-connected* ++
|
||||||
|
and/or *tooltip-format-enumerate-connected-battery* config options. Can only be used in the tooltip related format options.
|
||||||
|
|
||||||
|
# EXPERIMENTAL BATTERY PERCENTAGE FEATURE
|
||||||
|
|
||||||
|
At the time of writing, the experimental features of BlueZ need to be turned on, for the battery percentage options listed below to work.
|
||||||
|
|
||||||
|
## FORMAT REPLACEMENT
|
||||||
|
|
||||||
|
*{device_battery_percentage}*: Battery percentage of the displayed device if available. Use only in the config options defined below.
|
||||||
|
|
||||||
|
## CONFIGURATION
|
||||||
|
|
||||||
|
*format-connected-battery*: ++
|
||||||
|
typeof: string ++
|
||||||
|
This format is used when the displayed device provides its battery percentage.
|
||||||
|
|
||||||
|
*tooltip-format-connected-battery*: ++
|
||||||
|
typeof: string ++
|
||||||
|
This format is used when the displayed device provides its battery percentage.
|
||||||
|
|
||||||
|
*tooltip-format-enumerate-connected-battery*: ++
|
||||||
|
typeof: string ++
|
||||||
|
This format is used to define how each connected device with a battery should be displayed within the *device_enumerate* format replacement option. ++
|
||||||
|
When this config option is not defined, it will fall back on the *tooltip-format-enumerate-connected* config option.
|
||||||
|
|
||||||
|
# EXAMPLES
|
||||||
|
|
||||||
|
```
|
||||||
|
"bluetooth": {
|
||||||
|
// "controller": "controller1", // specify the alias of the controller if there are more than 1 on the system
|
||||||
|
"format": " {status}",
|
||||||
|
"format-disabled": "", // an empty format will hide the module
|
||||||
|
"format-connected": " {num_connections} connected",
|
||||||
|
"tooltip-format": "{controller_alias}\\t{controller_address}",
|
||||||
|
"tooltip-format-connected": "{controller_alias}\\t{controller_address}\\n\\n{device_enumerate}",
|
||||||
|
"tooltip-format-enumerate-connected": "{device_alias}\\t{device_address}"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
"bluetooth": {
|
||||||
|
"format": " {status}",
|
||||||
|
"format-connected": " {device_alias}",
|
||||||
|
"format-connected-battery": " {device_alias} {device_battery_percentage}%",
|
||||||
|
// "format-device-preference": [ "device1", "device2" ], // preference list deciding the displayed device
|
||||||
|
"tooltip-format": "{controller_alias}\\t{controller_address}\\n\\n{num_connections} connected",
|
||||||
|
"tooltip-format-connected": "{controller_alias}\\t{controller_address}\\n\\n{num_connections} connected\\n\\n{device_enumerate}",
|
||||||
|
"tooltip-format-enumerate-connected": "{device_alias}\\t{device_address}",
|
||||||
|
"tooltip-format-enumerate-connected-battery": "{device_alias}\\t{device_address}\\t{device_battery_percentage}%"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
# STYLE
|
||||||
|
|
||||||
|
- *#bluetooth*
|
||||||
|
- *#bluetooth.disabled*
|
||||||
|
- *#bluetooth.off*
|
||||||
|
- *#bluetooth.on*
|
||||||
|
- *#bluetooth.connected*
|
||||||
|
- *#bluetooth.discoverable*
|
||||||
|
- *#bluetooth.discovering*
|
||||||
|
- *#bluetooth.pairable*
|
113
man/waybar-clock.5.scd
Normal file
113
man/waybar-clock.5.scd
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
waybar-clock(5)
|
||||||
|
|
||||||
|
# NAME
|
||||||
|
|
||||||
|
waybar - clock module
|
||||||
|
|
||||||
|
# DESCRIPTION
|
||||||
|
|
||||||
|
The *clock* module displays the current date and time.
|
||||||
|
|
||||||
|
# CONFIGURATION
|
||||||
|
|
||||||
|
*interval*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
default: 60 ++
|
||||||
|
The interval in which the information gets polled.
|
||||||
|
|
||||||
|
*format*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: {:%H:%M} ++
|
||||||
|
The format, how the date and time should be displayed. ++
|
||||||
|
It uses the format of the date library. See https://howardhinnant.github.io/date/date.html#to_stream_formatting for details.
|
||||||
|
|
||||||
|
*timezone*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: inferred local timezone ++
|
||||||
|
The timezone to display the time in, e.g. America/New_York. ++
|
||||||
|
This field will be ignored if *timezones* field is set and have at least one value.
|
||||||
|
|
||||||
|
*timezones*: ++
|
||||||
|
typeof: list of strings ++
|
||||||
|
A list of timezones to use for time display, changed using the scroll wheel. ++
|
||||||
|
Use "" to represent the system's local timezone. Using %Z in the format or tooltip format is useful to track which time zone is currently displayed.
|
||||||
|
|
||||||
|
*locale*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: inferred from current locale ++
|
||||||
|
A locale to be used to display the time. Intended to render times in custom timezones with the proper language and format.
|
||||||
|
|
||||||
|
*today-format*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: <b><u>{}</u></b> ++
|
||||||
|
The format of today's date in the calendar.
|
||||||
|
|
||||||
|
*max-length*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
The maximum length in character the module should display.
|
||||||
|
|
||||||
|
*min-length*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
The minimum length in characters the module should take up.
|
||||||
|
|
||||||
|
*align*: ++
|
||||||
|
typeof: float ++
|
||||||
|
The alignment of the text, where 0 is left-aligned and 1 is right-aligned. If the module is rotated, it will follow the flow of the text.
|
||||||
|
|
||||||
|
*rotate*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
Positive value to rotate the text label.
|
||||||
|
|
||||||
|
*on-click*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when clicked on the module.
|
||||||
|
|
||||||
|
*on-click-middle*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when middle-clicked on the module using mousewheel.
|
||||||
|
|
||||||
|
*on-click-right*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when you right clicked on the module.
|
||||||
|
|
||||||
|
*on-update*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when the module is updated.
|
||||||
|
|
||||||
|
*on-scroll-up*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when scrolling up on the module.
|
||||||
|
|
||||||
|
*on-scroll-down*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when scrolling down on the module.
|
||||||
|
|
||||||
|
*smooth-scrolling-threshold*: ++
|
||||||
|
typeof: double ++
|
||||||
|
Threshold to be used when scrolling.
|
||||||
|
|
||||||
|
*tooltip*: ++
|
||||||
|
typeof: bool ++
|
||||||
|
default: true ++
|
||||||
|
Option to disable tooltip on hover.
|
||||||
|
|
||||||
|
View all valid format options in *strftime(3)*.
|
||||||
|
|
||||||
|
# FORMAT REPLACEMENTS
|
||||||
|
|
||||||
|
*{calendar}*: Current month calendar
|
||||||
|
*{timezoned_time_list}*: List of time in the rest timezones, if more than one timezone is set in the config
|
||||||
|
|
||||||
|
# EXAMPLES
|
||||||
|
|
||||||
|
```
|
||||||
|
"clock": {
|
||||||
|
"interval": 60,
|
||||||
|
"format": "{:%H:%M}",
|
||||||
|
"max-length": 25
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
# STYLE
|
||||||
|
|
||||||
|
- *#clock*
|
123
man/waybar-cpu.5.scd
Normal file
123
man/waybar-cpu.5.scd
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
waybar-cpu(5)
|
||||||
|
|
||||||
|
# NAME
|
||||||
|
|
||||||
|
waybar - cpu module
|
||||||
|
|
||||||
|
# DESCRIPTION
|
||||||
|
|
||||||
|
The *cpu* module displays the current cpu utilization.
|
||||||
|
|
||||||
|
# CONFIGURATION
|
||||||
|
|
||||||
|
*interval*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
default: 10 ++
|
||||||
|
The interval in which the information gets polled.
|
||||||
|
|
||||||
|
*format*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: {usage}% ++
|
||||||
|
The format, how information should be displayed. On {} data gets inserted.
|
||||||
|
|
||||||
|
*format-icons*: ++
|
||||||
|
typeof: array/object ++
|
||||||
|
Based on the current usage, the corresponding icon gets selected. ++
|
||||||
|
The order is *low* to *high*. Or by the state if it is an object.
|
||||||
|
|
||||||
|
*max-length*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
The maximum length in character the module should display.
|
||||||
|
|
||||||
|
*min-length*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
The minimum length in characters the module should take up.
|
||||||
|
|
||||||
|
*align*: ++
|
||||||
|
typeof: float ++
|
||||||
|
The alignment of the text, where 0 is left-aligned and 1 is right-aligned. If the module is rotated, it will follow the flow of the text.
|
||||||
|
|
||||||
|
*rotate*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
Positive value to rotate the text label.
|
||||||
|
|
||||||
|
*states*: ++
|
||||||
|
typeof: object ++
|
||||||
|
A number of cpu usage states which get activated on certain usage levels. See *waybar-states(5)*.
|
||||||
|
|
||||||
|
*on-click*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when clicked on the module.
|
||||||
|
|
||||||
|
*on-click-middle*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when middle-clicked on the module using mousewheel.
|
||||||
|
|
||||||
|
*on-click-right*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when you right clicked on the module.
|
||||||
|
|
||||||
|
*on-update*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when the module is updated.
|
||||||
|
|
||||||
|
*on-scroll-up*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when scrolling up on the module.
|
||||||
|
|
||||||
|
*on-scroll-down*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when scrolling down on the module.
|
||||||
|
|
||||||
|
*smooth-scrolling-threshold*: ++
|
||||||
|
typeof: double ++
|
||||||
|
Threshold to be used when scrolling.
|
||||||
|
|
||||||
|
*tooltip*: ++
|
||||||
|
typeof: bool ++
|
||||||
|
default: true ++
|
||||||
|
Option to disable tooltip on hover.
|
||||||
|
|
||||||
|
# FORMAT REPLACEMENTS
|
||||||
|
|
||||||
|
*{load}*: Current cpu load.
|
||||||
|
|
||||||
|
*{usage}*: Current overall cpu usage.
|
||||||
|
|
||||||
|
*{usage*{n}*}*: Current cpu core n usage. Cores are numbered from zero, so first core will be {usage0} and 4th will be {usage3}.
|
||||||
|
|
||||||
|
*{avg_frequency}*: Current cpu average frequency (based on all cores) in GHz.
|
||||||
|
|
||||||
|
*{max_frequency}*: Current cpu max frequency (based on the core with the highest frequency) in GHz.
|
||||||
|
|
||||||
|
*{min_frequency}*: Current cpu min frequency (based on the core with the lowest frequency) in GHz.
|
||||||
|
|
||||||
|
*{icon}*: Icon for overall cpu usage.
|
||||||
|
|
||||||
|
*{icon*{n}*}*: Icon for cpu core n usage. Use like {icon0}.
|
||||||
|
|
||||||
|
# EXAMPLES
|
||||||
|
|
||||||
|
Basic configuration:
|
||||||
|
|
||||||
|
```
|
||||||
|
"cpu": {
|
||||||
|
"interval": 10,
|
||||||
|
"format": "{}% ",
|
||||||
|
"max-length": 10
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Cpu usage per core rendered as icons:
|
||||||
|
|
||||||
|
```
|
||||||
|
"cpu": {
|
||||||
|
"interval": 1,
|
||||||
|
"format": "{icon0}{icon1}{icon2}{icon3} {usage:>2}% ",
|
||||||
|
"format-icons": ["▁", "▂", "▃", "▄", "▅", "▆", "▇", "█"],
|
||||||
|
},
|
||||||
|
```
|
||||||
|
|
||||||
|
# STYLE
|
||||||
|
|
||||||
|
- *#cpu*
|
219
man/waybar-custom.5.scd
Normal file
219
man/waybar-custom.5.scd
Normal file
@ -0,0 +1,219 @@
|
|||||||
|
waybar-custom(5)
|
||||||
|
|
||||||
|
# NAME
|
||||||
|
|
||||||
|
waybar - custom module
|
||||||
|
|
||||||
|
# DESCRIPTION
|
||||||
|
|
||||||
|
The *custom* module displays either the output of a script or static text.
|
||||||
|
To display static text, specify only the *format* field.
|
||||||
|
|
||||||
|
# CONFIGURATION
|
||||||
|
|
||||||
|
Addressed by *custom/<name>*
|
||||||
|
|
||||||
|
*exec*: ++
|
||||||
|
typeof: string ++
|
||||||
|
The path to the script, which should be executed.
|
||||||
|
|
||||||
|
*exec-if*: ++
|
||||||
|
typeof: string ++
|
||||||
|
The path to a script, which determines if the script in *exec* should be executed.
|
||||||
|
*exec* will be executed if the exit code of *exec-if* equals 0.
|
||||||
|
|
||||||
|
*exec-on-event*: ++
|
||||||
|
typeof: bool ++
|
||||||
|
default: true ++
|
||||||
|
If an event command is set (e.g. *on-click* or *on-scroll-up*) then re-execute the script after
|
||||||
|
executing the event command.
|
||||||
|
|
||||||
|
*return-type*: ++
|
||||||
|
typeof: string ++
|
||||||
|
See *return-type*
|
||||||
|
|
||||||
|
*interval*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
The interval (in seconds) in which the information gets polled.
|
||||||
|
Use *once* if you want to execute the module only on startup.
|
||||||
|
You can update it manually with a signal. If no *interval* is defined,
|
||||||
|
it is assumed that the out script loops it self.
|
||||||
|
|
||||||
|
*restart-interval*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
The restart interval (in seconds).
|
||||||
|
Can't be used with the *interval* option, so only with continuous scripts.
|
||||||
|
Once the script exit, it'll be re-executed after the *restart-interval*.
|
||||||
|
|
||||||
|
*signal*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
The signal number used to update the module.
|
||||||
|
The number is valid between 1 and N, where *SIGRTMIN+N* = *SIGRTMAX*.
|
||||||
|
|
||||||
|
*format*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: {} ++
|
||||||
|
The format, how information should be displayed. On {} data gets inserted.
|
||||||
|
|
||||||
|
*format-icons*: ++
|
||||||
|
typeof: array ++
|
||||||
|
Based on the set percentage, the corresponding icon gets selected. The order is *low* to *high*.
|
||||||
|
|
||||||
|
*rotate*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
Positive value to rotate the text label.
|
||||||
|
|
||||||
|
*max-length*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
The maximum length in character the module should display.
|
||||||
|
|
||||||
|
*min-length*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
The minimum length in characters the module should take up.
|
||||||
|
|
||||||
|
*align*: ++
|
||||||
|
typeof: float ++
|
||||||
|
The alignment of the text, where 0 is left-aligned and 1 is right-aligned. If the module is rotated, it will follow the flow of the text.
|
||||||
|
|
||||||
|
*on-click*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when clicked on the module.
|
||||||
|
|
||||||
|
*on-click-middle*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when middle-clicked on the module using mousewheel.
|
||||||
|
|
||||||
|
*on-click-right*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when you right clicked on the module.
|
||||||
|
|
||||||
|
*on-update*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when the module is updated.
|
||||||
|
|
||||||
|
*on-scroll-up*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when scrolling up on the module.
|
||||||
|
|
||||||
|
*on-scroll-down*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when scrolling down on the module.
|
||||||
|
|
||||||
|
*smooth-scrolling-threshold*: ++
|
||||||
|
typeof: double ++
|
||||||
|
Threshold to be used when scrolling.
|
||||||
|
|
||||||
|
*tooltip*: ++
|
||||||
|
typeof: bool ++
|
||||||
|
default: true ++
|
||||||
|
Option to disable tooltip on hover.
|
||||||
|
|
||||||
|
*escape*: ++
|
||||||
|
typeof: bool ++
|
||||||
|
default: false ++
|
||||||
|
Option to enable escaping of script output.
|
||||||
|
|
||||||
|
# RETURN-TYPE
|
||||||
|
|
||||||
|
When *return-type* is set to *json*, Waybar expects the *exec*-script to output its data in JSON format.
|
||||||
|
This should look like this:
|
||||||
|
|
||||||
|
```
|
||||||
|
{"text": "$text", "tooltip": "$tooltip", "class": "$class", "percentage": $percentage }
|
||||||
|
```
|
||||||
|
|
||||||
|
The *class* parameter also accepts an array of strings.
|
||||||
|
|
||||||
|
If nothing or an invalid option is specified, Waybar expects i3blocks style output. Values are *newline* separated.
|
||||||
|
This should look like this:
|
||||||
|
|
||||||
|
```
|
||||||
|
$text\\n$tooltip\\n$class*
|
||||||
|
```
|
||||||
|
|
||||||
|
*class* is a CSS class, to apply different styles in *style.css*
|
||||||
|
|
||||||
|
# FORMAT REPLACEMENTS
|
||||||
|
|
||||||
|
*{}*: Output of the script.
|
||||||
|
|
||||||
|
*{percentage}* Percentage which can be set via a json return-type.
|
||||||
|
|
||||||
|
*{icon}*: An icon from 'format-icons' according to percentage.
|
||||||
|
|
||||||
|
# EXAMPLES
|
||||||
|
|
||||||
|
## Spotify:
|
||||||
|
|
||||||
|
```
|
||||||
|
"custom/spotify": {
|
||||||
|
"format": " {}",
|
||||||
|
"max-length": 40,
|
||||||
|
"interval": 30, // Remove this if your script is endless and write in loop
|
||||||
|
"exec": "$HOME/.config/waybar/mediaplayer.sh 2> /dev/null", // Script in resources folder
|
||||||
|
"exec-if": "pgrep spotify",
|
||||||
|
"return-type": "json"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## mpd:
|
||||||
|
|
||||||
|
```
|
||||||
|
"custom/mpd": {
|
||||||
|
"format": "♪ {}",
|
||||||
|
//"max-length": 15,
|
||||||
|
"interval": 10,
|
||||||
|
"exec": "mpc current",
|
||||||
|
"exec-if": "pgrep mpd",
|
||||||
|
"on-click": "mpc toggle",
|
||||||
|
"on-click-right": "sonata"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## cmus:
|
||||||
|
|
||||||
|
```
|
||||||
|
"custom/cmus": {
|
||||||
|
"format": "♪ {}",
|
||||||
|
//"max-length": 15,
|
||||||
|
"interval": 10,
|
||||||
|
"exec": "cmus-remote -C \"format_print '%a - %t'\"", // artist - title
|
||||||
|
"exec-if": "pgrep cmus",
|
||||||
|
"on-click": "cmus-remote -u", //toggle pause
|
||||||
|
"escape": true //handle markup entities
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Pacman
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
"custom/pacman": {
|
||||||
|
"format": "{} ",
|
||||||
|
"interval": "once",
|
||||||
|
"exec": "pacman_packages",
|
||||||
|
"on-click": "update-system",
|
||||||
|
"signal": 8
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Alternate Pacman
|
||||||
|
|
||||||
|
```
|
||||||
|
"custom/pacman": {
|
||||||
|
"format": "{} ",
|
||||||
|
"interval": 3600, // every hour
|
||||||
|
"exec": "checkupdates | wc -l", // # of updates
|
||||||
|
"exec-if": "exit 0", // always run; consider advanced run conditions
|
||||||
|
"on-click": "termite -e 'sudo pacman -Syu'; pkill -SIGRTMIN+8 waybar", // update system
|
||||||
|
"signal": 8
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
You can use the signal and update the number of available packages with *pkill -RTMIN+8 waybar*.
|
||||||
|
|
||||||
|
# STYLE
|
||||||
|
|
||||||
|
- *#custom-<name>*
|
||||||
|
- *#custom-<name>.<class>*
|
||||||
|
- *<class>* can be set by the script. For more information see *return-type*
|
113
man/waybar-disk.5.scd
Normal file
113
man/waybar-disk.5.scd
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
waybar-disk(5)
|
||||||
|
|
||||||
|
# NAME
|
||||||
|
|
||||||
|
waybar - disk module
|
||||||
|
|
||||||
|
# DESCRIPTION
|
||||||
|
|
||||||
|
The *disk* module displays the current disk space used.
|
||||||
|
|
||||||
|
# CONFIGURATION
|
||||||
|
|
||||||
|
Addressed by *disk*
|
||||||
|
|
||||||
|
*path*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: "/" ++
|
||||||
|
Any path residing in the filesystem or mountpoint for which the information should be displayed.
|
||||||
|
|
||||||
|
*interval*: ++
|
||||||
|
typeof: integer++
|
||||||
|
default: 30 ++
|
||||||
|
The interval in which the information gets polled.
|
||||||
|
|
||||||
|
*format*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: "{percentage_used}%" ++
|
||||||
|
The format, how information should be displayed.
|
||||||
|
|
||||||
|
*rotate*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
Positive value to rotate the text label.
|
||||||
|
|
||||||
|
*states*: ++
|
||||||
|
typeof: object ++
|
||||||
|
A number of disk utilization states which get activated on certain percentage thresholds (percentage_used). See *waybar-states(5)*.
|
||||||
|
|
||||||
|
*max-length*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
The maximum length in character the module should display.
|
||||||
|
|
||||||
|
*min-length*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
The minimum length in characters the module should take up.
|
||||||
|
|
||||||
|
*align*: ++
|
||||||
|
typeof: float ++
|
||||||
|
The alignment of the text, where 0 is left-aligned and 1 is right-aligned. If the module is rotated, it will follow the flow of the text.
|
||||||
|
|
||||||
|
*on-click*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when clicked on the module.
|
||||||
|
|
||||||
|
*on-click-middle*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when middle-clicked on the module using mousewheel.
|
||||||
|
|
||||||
|
*on-click-right*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when you right clicked on the module.
|
||||||
|
|
||||||
|
*on-update*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when the module is updated.
|
||||||
|
|
||||||
|
*on-scroll-up*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when scrolling up on the module.
|
||||||
|
|
||||||
|
*on-scroll-down*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when scrolling down on the module.
|
||||||
|
|
||||||
|
*smooth-scrolling-threshold*: ++
|
||||||
|
typeof: double ++
|
||||||
|
Threshold to be used when scrolling.
|
||||||
|
|
||||||
|
*tooltip*: ++
|
||||||
|
typeof: bool ++
|
||||||
|
default: true ++
|
||||||
|
Option to disable tooltip on hover.
|
||||||
|
|
||||||
|
*tooltip-format*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: "{used} out of {total} used ({percentage_used}%)" ++
|
||||||
|
The format of the information displayed in the tooltip.
|
||||||
|
|
||||||
|
# FORMAT REPLACEMENTS
|
||||||
|
|
||||||
|
*{percentage_used}*: Percentage of disk in use.
|
||||||
|
|
||||||
|
*{percentage_free}*: Percentage of free disk space
|
||||||
|
|
||||||
|
*{total}*: Total amount of space on the disk, partition or mountpoint.
|
||||||
|
|
||||||
|
*{used}*: Amount of used disk space.
|
||||||
|
|
||||||
|
*{free}*: Amount of available disk space for normal users.
|
||||||
|
|
||||||
|
*{path}*: The path specified in the configuration.
|
||||||
|
|
||||||
|
# EXAMPLES
|
||||||
|
|
||||||
|
```
|
||||||
|
"disk": {
|
||||||
|
"interval": 30,
|
||||||
|
"format": "{percentage_free}% free on {path}",
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
# STYLE
|
||||||
|
|
||||||
|
- *#disk*
|
95
man/waybar-gamemode.5.scd
Normal file
95
man/waybar-gamemode.5.scd
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
waybar-gamemode(5)
|
||||||
|
|
||||||
|
# NAME
|
||||||
|
|
||||||
|
waybar - gamemode module
|
||||||
|
|
||||||
|
# DESCRIPTION
|
||||||
|
|
||||||
|
The *gamemode* module displays if any game or application is running with ++
|
||||||
|
Feral Gamemode optimizations.
|
||||||
|
|
||||||
|
# CONFIGURATION
|
||||||
|
|
||||||
|
*format*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: {glyph} ++
|
||||||
|
The text format.
|
||||||
|
|
||||||
|
*format-alt*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: {glyph} {count} ++
|
||||||
|
The text format when toggled.
|
||||||
|
|
||||||
|
*tooltip*: ++
|
||||||
|
typeof: bool ++
|
||||||
|
default: true ++
|
||||||
|
Option to disable tooltip on hover.
|
||||||
|
|
||||||
|
*tooltip-format*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: Games running: {glyph} ++
|
||||||
|
The text format of the tooltip.
|
||||||
|
|
||||||
|
*hide-not-running*: ++
|
||||||
|
typeof: bool ++
|
||||||
|
default: true ++
|
||||||
|
Defines if the module should be hidden if no games are running.
|
||||||
|
|
||||||
|
*use-icon*: ++
|
||||||
|
typeof: bool ++
|
||||||
|
default: true ++
|
||||||
|
Defines if the module should display a GTK icon instead of the specified *glyph*
|
||||||
|
|
||||||
|
*glyph*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: ++
|
||||||
|
The string icon to display. Only visible if *use-icon* is set to false.
|
||||||
|
|
||||||
|
*icon-name*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: input-gaming-symbolic ++
|
||||||
|
The GTK icon to display. Only visible if *use-icon* is set to true.
|
||||||
|
|
||||||
|
*icon-size*: ++
|
||||||
|
typeof: unsigned integer ++
|
||||||
|
default: 20 ++
|
||||||
|
Defines the size of the icons.
|
||||||
|
|
||||||
|
*icon-spacing*: ++
|
||||||
|
typeof: unsigned integer ++
|
||||||
|
default: 4 ++
|
||||||
|
Defines the spacing between the icon and the text.
|
||||||
|
|
||||||
|
# FORMAT REPLACEMENTS
|
||||||
|
|
||||||
|
*{glyph}*: The string icon glyph to use instead.
|
||||||
|
|
||||||
|
*{count}*: The amount of games running with gamemode optimizations.
|
||||||
|
|
||||||
|
# TOOLTIP FORMAT REPLACEMENTS
|
||||||
|
|
||||||
|
*{count}*: The amount of games running with gamemode optimizations.
|
||||||
|
|
||||||
|
# EXAMPLES
|
||||||
|
|
||||||
|
```
|
||||||
|
"gamemode": {
|
||||||
|
"format": "{glyph}",
|
||||||
|
"format-alt": "{glyph} {count}",
|
||||||
|
"glyph": "",
|
||||||
|
"hide-not-running": true,
|
||||||
|
"use-icon": true,
|
||||||
|
"icon-name": "input-gaming-symbolic",
|
||||||
|
"icon-spacing": 4,
|
||||||
|
"icon-size": 20,
|
||||||
|
"tooltip": true,
|
||||||
|
"tooltip-format": "Games running: {count}"
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
# STYLE
|
||||||
|
|
||||||
|
- *#gamemode*
|
||||||
|
- *#gamemode.running*
|
43
man/waybar-hyprland-language.5.scd
Normal file
43
man/waybar-hyprland-language.5.scd
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
waybar-hyprland-language(5)
|
||||||
|
|
||||||
|
# NAME
|
||||||
|
|
||||||
|
waybar - hyprland language module
|
||||||
|
|
||||||
|
# DESCRIPTION
|
||||||
|
|
||||||
|
The *language* module displays the currently selected language.
|
||||||
|
|
||||||
|
# CONFIGURATION
|
||||||
|
|
||||||
|
Addressed by *hyprland/language*
|
||||||
|
|
||||||
|
*format*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: {} ++
|
||||||
|
The format, how information should be displayed. On {} the currently selected language is displayed.
|
||||||
|
|
||||||
|
*format-<lang>* ++
|
||||||
|
typeof: string++
|
||||||
|
Provide an alternative name to display per language where <lang> is the language of your choosing. Can be passed multiple times with multiple languages as shown by the example below.
|
||||||
|
|
||||||
|
*keyboard-name*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Specifies which keyboard to use from hyprctl devices output. Using the option that begins with "at-translated-set..." is recommended.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# EXAMPLES
|
||||||
|
|
||||||
|
```
|
||||||
|
"hyprland/language": {
|
||||||
|
"format": "Lang: {}"
|
||||||
|
"format-en": "AMERICA, HELL YEAH!"
|
||||||
|
"format-tr": "As bayrakları"
|
||||||
|
"keyboard-name": "at-translated-set-2-keyboard"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
# STYLE
|
||||||
|
|
||||||
|
- *#language*
|
82
man/waybar-hyprland-submap.5.scd
Normal file
82
man/waybar-hyprland-submap.5.scd
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
waybar-hyprland-submap(5)
|
||||||
|
|
||||||
|
# NAME
|
||||||
|
|
||||||
|
waybar - hyprland submap module
|
||||||
|
|
||||||
|
# DESCRIPTION
|
||||||
|
|
||||||
|
The *submap* module displays the currently active submap similar to *sway/mode*.
|
||||||
|
|
||||||
|
# CONFIGURATION
|
||||||
|
|
||||||
|
Addressed by *hyprland/submap*
|
||||||
|
|
||||||
|
*format*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: {} ++
|
||||||
|
The format, how information should be displayed. On {} the currently active submap is displayed.
|
||||||
|
|
||||||
|
*rotate*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
Positive value to rotate the text label.
|
||||||
|
|
||||||
|
*max-length*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
The maximum length in character the module should display.
|
||||||
|
|
||||||
|
*min-length*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
The minimum length in characters the module should take up.
|
||||||
|
|
||||||
|
*align*: ++
|
||||||
|
typeof: float ++
|
||||||
|
The alignment of the text, where 0 is left-aligned and 1 is right-aligned. If the module is rotated, it will follow the flow of the text.
|
||||||
|
|
||||||
|
*on-click*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when clicked on the module.
|
||||||
|
|
||||||
|
*on-click-middle*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when middle-clicked on the module using mousewheel.
|
||||||
|
|
||||||
|
*on-click-right*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when you right clicked on the module.
|
||||||
|
|
||||||
|
*on-update*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when the module is updated.
|
||||||
|
|
||||||
|
*on-scroll-up*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when scrolling up on the module.
|
||||||
|
|
||||||
|
*on-scroll-down*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when scrolling down on the module.
|
||||||
|
|
||||||
|
*smooth-scrolling-threshold*: ++
|
||||||
|
typeof: double ++
|
||||||
|
Threshold to be used when scrolling.
|
||||||
|
|
||||||
|
*tooltip*: ++
|
||||||
|
typeof: bool ++
|
||||||
|
default: true ++
|
||||||
|
Option to disable tooltip on hover.
|
||||||
|
|
||||||
|
|
||||||
|
# EXAMPLES
|
||||||
|
|
||||||
|
```
|
||||||
|
"hyprland/submap": {
|
||||||
|
"format": "✌️ {}",
|
||||||
|
"max-length": 8,
|
||||||
|
"tooltip": false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
# STYLE
|
||||||
|
|
||||||
|
- *#submap*
|
50
man/waybar-hyprland-window.5.scd
Normal file
50
man/waybar-hyprland-window.5.scd
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
waybar-hyprland-window(5)
|
||||||
|
|
||||||
|
# NAME
|
||||||
|
|
||||||
|
waybar - hyprland window module
|
||||||
|
|
||||||
|
# DESCRIPTION
|
||||||
|
|
||||||
|
The *window* module displays the title of the currently focused window in Hyprland.
|
||||||
|
|
||||||
|
# CONFIGURATION
|
||||||
|
|
||||||
|
Addressed by *hyprland/window*
|
||||||
|
|
||||||
|
*format*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: {} ++
|
||||||
|
The format, how information should be displayed. On {} the current window title is displayed.
|
||||||
|
|
||||||
|
*rewrite*: ++
|
||||||
|
typeof: object ++
|
||||||
|
Rules to rewrite window title. See *rewrite rules*.
|
||||||
|
|
||||||
|
# REWRITE RULES
|
||||||
|
|
||||||
|
*rewrite* is an object where keys are regular expressions and values are
|
||||||
|
rewrite rules if the expression matches. Rules may contain references to
|
||||||
|
captures of the expression.
|
||||||
|
|
||||||
|
Regular expression and replacement follow ECMA-script rules.
|
||||||
|
|
||||||
|
If no expression matches, the title is left unchanged.
|
||||||
|
|
||||||
|
Invalid expressions (e.g., mismatched parentheses) are skipped.
|
||||||
|
|
||||||
|
# EXAMPLES
|
||||||
|
|
||||||
|
```
|
||||||
|
"hyprland/window": {
|
||||||
|
"format": "{}",
|
||||||
|
"rewrite": {
|
||||||
|
"(.*) - Mozilla Firefox": "🌎 $1",
|
||||||
|
"(.*) - zsh": "> [$1]"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
# STYLE
|
||||||
|
|
||||||
|
- *#window*
|
105
man/waybar-idle-inhibitor.5.scd
Normal file
105
man/waybar-idle-inhibitor.5.scd
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
waybar-idle-inhibitor(5)
|
||||||
|
|
||||||
|
# NAME
|
||||||
|
|
||||||
|
waybar - idle_inhibitor module
|
||||||
|
|
||||||
|
# DESCRIPTION
|
||||||
|
|
||||||
|
The *idle_inhibitor* module can inhibiting the idle behavior such as screen blanking, locking, and
|
||||||
|
screensaving, also known as "presentation mode".
|
||||||
|
|
||||||
|
# CONFIGURATION
|
||||||
|
|
||||||
|
*format*: ++
|
||||||
|
typeof: string ++
|
||||||
|
The format, how the state should be displayed.
|
||||||
|
|
||||||
|
*format-icons*: ++
|
||||||
|
typeof: array ++
|
||||||
|
Based on the current state, the corresponding icon gets selected.
|
||||||
|
|
||||||
|
*rotate*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
Positive value to rotate the text label.
|
||||||
|
|
||||||
|
*max-length*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
The maximum length in character the module should display.
|
||||||
|
|
||||||
|
*min-length*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
The minimum length in characters the module should take up.
|
||||||
|
|
||||||
|
*align*: ++
|
||||||
|
typeof: float ++
|
||||||
|
The alignment of the text, where 0 is left-aligned and 1 is right-aligned. If the module is rotated, it will follow the flow of the text.
|
||||||
|
|
||||||
|
*on-click*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when clicked on the module. A click also toggles the state
|
||||||
|
|
||||||
|
*on-click-middle*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when middle-clicked on the module using mousewheel.
|
||||||
|
|
||||||
|
*on-click-right*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when you right clicked on the module.
|
||||||
|
|
||||||
|
*on-update*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when the module is updated.
|
||||||
|
|
||||||
|
*on-scroll-up*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when scrolling up on the module.
|
||||||
|
|
||||||
|
*on-scroll-down*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when scrolling down on the module.
|
||||||
|
|
||||||
|
*smooth-scrolling-threshold*: ++
|
||||||
|
typeof: double ++
|
||||||
|
Threshold to be used when scrolling.
|
||||||
|
|
||||||
|
*start-activated*: ++
|
||||||
|
typeof: bool ++
|
||||||
|
default: *false* ++
|
||||||
|
Whether the inhibit should be activated when starting waybar.
|
||||||
|
|
||||||
|
*timeout*: ++
|
||||||
|
typeof: double ++
|
||||||
|
The number of minutes the inhibit should last.
|
||||||
|
|
||||||
|
*tooltip*: ++
|
||||||
|
typeof: bool ++
|
||||||
|
default: true ++
|
||||||
|
Option to disable tooltip on hover.
|
||||||
|
|
||||||
|
*tooltip-format-activated*: ++
|
||||||
|
typeof: string ++
|
||||||
|
This format is used when the inhibit is activated.
|
||||||
|
|
||||||
|
*tooltip-format-deactivated*: ++
|
||||||
|
typeof: string ++
|
||||||
|
This format is used when the inhibit is deactivated.
|
||||||
|
|
||||||
|
# FORMAT REPLACEMENTS
|
||||||
|
|
||||||
|
*{status}*: status (*activated* or *deactivated*)
|
||||||
|
|
||||||
|
*{icon}*: Icon, as defined in *format-icons*
|
||||||
|
|
||||||
|
# EXAMPLES
|
||||||
|
|
||||||
|
```
|
||||||
|
"idle_inhibitor": {
|
||||||
|
"format": "{icon}",
|
||||||
|
"format-icons": {
|
||||||
|
"activated": "",
|
||||||
|
"deactivated": ""
|
||||||
|
},
|
||||||
|
"timeout": 30.5
|
||||||
|
}
|
||||||
|
```
|
72
man/waybar-image.5.scd
Normal file
72
man/waybar-image.5.scd
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
waybar-custom(5)
|
||||||
|
|
||||||
|
# NAME
|
||||||
|
|
||||||
|
waybar - image module
|
||||||
|
|
||||||
|
# DESCRIPTION
|
||||||
|
|
||||||
|
The *image* module displays an image from a path.
|
||||||
|
|
||||||
|
# CONFIGURATION
|
||||||
|
|
||||||
|
Addressed by *custom/<name>*
|
||||||
|
|
||||||
|
*path*: ++
|
||||||
|
typeof: string ++
|
||||||
|
The path to the image.
|
||||||
|
|
||||||
|
*size*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
The width/height to render the image.
|
||||||
|
|
||||||
|
*interval*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
The interval (in seconds) to re-render the image.
|
||||||
|
This is useful if the contents of *path* changes.
|
||||||
|
If no *interval* is defined, the image will only be rendered once.
|
||||||
|
|
||||||
|
*signal*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
The signal number used to update the module.
|
||||||
|
This can be used instead of *interval* if the file changes irregularly.
|
||||||
|
The number is valid between 1 and N, where *SIGRTMIN+N* = *SIGRTMAX*.
|
||||||
|
|
||||||
|
*on-click*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when clicked on the module.
|
||||||
|
|
||||||
|
*on-click-middle*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when middle-clicked on the module using mousewheel.
|
||||||
|
|
||||||
|
*on-update*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when the module is updated.
|
||||||
|
|
||||||
|
*on-scroll-up*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when scrolling up on the module.
|
||||||
|
|
||||||
|
*on-scroll-down*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when scrolling down on the module.
|
||||||
|
|
||||||
|
*smooth-scrolling-threshold*: ++
|
||||||
|
typeof: double ++
|
||||||
|
Threshold to be used when scrolling.
|
||||||
|
|
||||||
|
# EXAMPLES
|
||||||
|
|
||||||
|
## Spotify:
|
||||||
|
|
||||||
|
## mpd:
|
||||||
|
|
||||||
|
```
|
||||||
|
"image/album-art": {
|
||||||
|
"path": "/tmp/mpd_art",
|
||||||
|
"size": 32,
|
||||||
|
"interval": 5,
|
||||||
|
"on-click": "mpc toggle"
|
||||||
|
}
|
||||||
|
```
|
92
man/waybar-inhibitor.5.scd
Normal file
92
man/waybar-inhibitor.5.scd
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
waybar-inhibitor(5)
|
||||||
|
|
||||||
|
# NAME
|
||||||
|
|
||||||
|
waybar - inhibitor module
|
||||||
|
|
||||||
|
# DESCRIPTION
|
||||||
|
|
||||||
|
The *inhibitor* module allows one to take an inhibitor lock that logind provides.
|
||||||
|
See *systemd-inhibit*(1) for more information.
|
||||||
|
|
||||||
|
# CONFIGURATION
|
||||||
|
|
||||||
|
*what*: ++
|
||||||
|
typeof: string or array ++
|
||||||
|
The inhibitor lock or locks that should be taken when active. The available inhibitor locks are *idle*, *shutdown*, *sleep*, *handle-power-key*, *handle-suspend-key*, *handle-hibernate-key* and *handle-lid-switch*.
|
||||||
|
|
||||||
|
*format*: ++
|
||||||
|
typeof: string ++
|
||||||
|
The format, how the state should be displayed.
|
||||||
|
|
||||||
|
*format-icons*: ++
|
||||||
|
typeof: array ++
|
||||||
|
Based on the current state, the corresponding icon gets selected.
|
||||||
|
|
||||||
|
*rotate*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
Positive value to rotate the text label.
|
||||||
|
|
||||||
|
*max-length*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
The maximum length in character the module should display.
|
||||||
|
|
||||||
|
*min-length*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
The minimum length in characters the module should take up.
|
||||||
|
|
||||||
|
*align*: ++
|
||||||
|
typeof: float ++
|
||||||
|
The alignment of the text, where 0 is left-aligned and 1 is right-aligned. If the module is rotated, it will follow the flow of the text.
|
||||||
|
|
||||||
|
*on-click*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when clicked on the module. A click also toggles the state
|
||||||
|
|
||||||
|
*on-click-middle*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when middle-clicked on the module using mousewheel.
|
||||||
|
|
||||||
|
*on-click-right*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when you right clicked on the module.
|
||||||
|
|
||||||
|
*on-update*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when the module is updated.
|
||||||
|
|
||||||
|
*on-scroll-up*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when scrolling up on the module.
|
||||||
|
|
||||||
|
*on-scroll-down*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when scrolling down on the module.
|
||||||
|
|
||||||
|
*smooth-scrolling-threshold*: ++
|
||||||
|
typeof: double ++
|
||||||
|
Threshold to be used when scrolling.
|
||||||
|
|
||||||
|
*tooltip*: ++
|
||||||
|
typeof: bool ++
|
||||||
|
default: true ++
|
||||||
|
Option to disable tooltip on hover.
|
||||||
|
|
||||||
|
# FORMAT REPLACEMENTS
|
||||||
|
|
||||||
|
*{status}*: status (*activated* or *deactivated*)
|
||||||
|
|
||||||
|
*{icon}*: Icon, as defined in *format-icons*
|
||||||
|
|
||||||
|
# EXAMPLES
|
||||||
|
|
||||||
|
```
|
||||||
|
"inhibitor": {
|
||||||
|
"what": "handle-lid-switch",
|
||||||
|
"format": "{icon}",
|
||||||
|
"format-icons": {
|
||||||
|
"activated": "",
|
||||||
|
"deactivated": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user