mirror of
https://github.com/rad4day/Waybar.git
synced 2023-12-21 10:22:59 +01:00
Compare commits
1983 Commits
Author | SHA1 | Date | |
---|---|---|---|
9eb6c4e296 | |||
748c6125d0 | |||
235861fd3d | |||
5e9bbe5c76 | |||
74fa131ebe | |||
2c7cb0e9d4 | |||
ce8ae5bf17 | |||
062e7bb9b4 | |||
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 | |||
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 | |||
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 | |||
2ee4a51546 | |||
91996a85c1 | |||
460d25ac45 | |||
648eecdd83 | |||
f04ff38567 | |||
d20a586734 | |||
1962caf144 | |||
9dbf057f58 | |||
918146c16b | |||
0b01b35c76 | |||
f3fb955d75 | |||
fcf2d18a01 | |||
b05d4cd413 | |||
9b89fc6470 | |||
c06725aa69 | |||
5ae5821929 | |||
74e40432e5 | |||
6e69af8967 | |||
be2fa743eb | |||
5fdb122829 | |||
6e73c6db61 | |||
253366baf4 | |||
ecec02c8be | |||
070619fa34 | |||
d4ace4b4d8 | |||
5fd92b3c28 | |||
c0a39f34cd | |||
2a9fa1a4b9 | |||
07147878a9 | |||
ffadd5c1a7 | |||
2b34f3a30f | |||
85d60f95c4 | |||
755d38d4d6 | |||
b673279a43 | |||
9e1200ae32 | |||
e999cca7a6 | |||
d24d85bebf | |||
97bd637f5d | |||
23d4a811db | |||
bf5c00ff2a | |||
14ace24a26 | |||
2fa581c7ea | |||
6ff013e25b | |||
cf3cb4c61f | |||
00ada46dfc | |||
2db81a6107 | |||
3e76984ce7 | |||
48a58cd979 | |||
296b448d06 | |||
7a3febf6a7 | |||
bb4af295bc | |||
cf7663153d | |||
12a251c3a4 | |||
4accdd4524 | |||
032ad925af | |||
50bfe78aed | |||
afd291a566 | |||
316a9be656 | |||
cdb347aaca | |||
ed240ac105 | |||
232073ca17 | |||
5314b74dae | |||
e3879559a2 | |||
0ec8774a08 | |||
071b4928dc | |||
7c4d75d428 | |||
67593b8c0f | |||
cff39bc7cf | |||
f2edc8f965 | |||
7b11283b73 | |||
03e43fb31d | |||
913d0f7ad0 | |||
5feb478611 | |||
6bf64cd04d | |||
5e43b4f587 | |||
e8dd1e2d2c | |||
51be97f9aa | |||
a00f812cd1 | |||
863e0babd8 | |||
8ba3052dd1 | |||
1a76aa0c8c | |||
85f177a213 | |||
6ffc7ee3b3 | |||
ff28de0482 | |||
d5e8a37e63 | |||
67786c32a8 | |||
93a644eec4 | |||
aa385e28b6 | |||
2c1a3d0430 | |||
b31a64ad00 | |||
4865a9ad6c | |||
e70d8aff73 | |||
3e1c77d158 | |||
d34c3a801c | |||
794fb12e8c | |||
f743882baa | |||
9fa0eb7068 | |||
43d724ebad | |||
c862fde986 | |||
0d59f7b7d1 | |||
1e95f5d9b6 | |||
9234be8544 | |||
9d3255fe9f | |||
d2d9db23b5 | |||
d8be72e4b6 | |||
f8a47598ba | |||
cb2d6e1997 | |||
17291dffdf | |||
9a091d7740 | |||
2cb70c7324 | |||
4d4cadb5ae | |||
cddee2626a | |||
d5c1e6f312 | |||
b45dcdf74e | |||
a1ffa7fa9f | |||
4b4b74db0c | |||
8901df9702 | |||
e12766a656 | |||
31f63398dc | |||
0a14e7f3ab | |||
31416ffae6 | |||
fbe19d886a | |||
9c67150884 | |||
f3c467cc46 | |||
a09d2222be | |||
45ebee52a6 | |||
841576497a | |||
e730105950 | |||
963d4f68e4 | |||
7e8eee0571 | |||
37f87be9dd | |||
380fc58f3c | |||
22bf0b161a | |||
5b3402e110 | |||
d209d350fe | |||
0968170074 | |||
362c393b1d | |||
0c3c548bc0 | |||
b54160e02f | |||
db14fac038 | |||
4f1defe6d5 | |||
92967c7c06 | |||
fcb23d3104 | |||
62f8af8a39 | |||
d5a9eccb7b | |||
80e9ea746b | |||
84728f6fab | |||
10a17187a1 | |||
7cdde05568 | |||
e343cf4b00 | |||
e4756cf24e | |||
131dae5818 | |||
4688002f23 | |||
5bf0ca85ac | |||
fd9b34adf8 | |||
8a011e6d90 | |||
5a44c8c6de | |||
74137befba | |||
b75e0bb0d0 | |||
77d9dd06af | |||
e5d5735e9d | |||
dd0ebe117c | |||
5f0a3063d1 | |||
3bac96945c | |||
e158a3e132 | |||
472363a623 | |||
1a024db03c | |||
5623bbecfe | |||
1e871b2353 | |||
82bed9dd5e | |||
d027243a19 | |||
e6d59f05cc | |||
4d4562aade | |||
e8f31a0c4f | |||
f8c06b27ae | |||
717a07d584 | |||
2d9bcb1a2d | |||
4dd36890c1 | |||
66acaeca7f | |||
20cf7592aa | |||
9fe29c37b4 | |||
f8ae1534db | |||
46c91a26ac | |||
07c592cc86 | |||
bb8ff5a99f | |||
79a5e9ecee | |||
9504b7ac03 | |||
311c34ecbc | |||
90d89fe974 | |||
cccf60c30e | |||
07dba791cf | |||
3ee99946c7 | |||
0d0f5ed7db | |||
263a32c9af | |||
b50650f63f | |||
768bc29bc1 | |||
12e1233d38 | |||
160837b900 | |||
d03997bdaa | |||
471b5b1ea1 | |||
29d8f365f8 | |||
8cf19826aa | |||
cbb6f2a307 | |||
e77c155ede | |||
811468c0ab | |||
171ecd53aa | |||
66b0420391 | |||
42dc0c4c71 | |||
bb1cf7570e | |||
a14b933d3e | |||
4c8f4f82dc | |||
6ed8f94dab | |||
807ef32357 | |||
817c42841b | |||
3e54c3c669 | |||
3656035c89 | |||
0ce8821aec | |||
38e37f3680 | |||
ab43d34a1e | |||
22eccc2ac2 | |||
cd92b475ad | |||
235997fa73 | |||
80a12d0238 | |||
07dab2baec | |||
cbfcec4867 | |||
557b786ce0 | |||
8c9dd94670 | |||
06aff70e2e | |||
85b6e6f709 | |||
6d6df4be00 | |||
9564adb5b4 | |||
aeaa1927d9 | |||
346ec68578 | |||
93a1bafb46 | |||
5f37abbd3f | |||
3273ee8b42 | |||
d05b8398fa | |||
ecc5f48dd7 | |||
316b948d86 | |||
5828d34fa0 | |||
bc9a49787a | |||
6aee51479d | |||
57c99dc526 | |||
78067462be | |||
5870421f84 | |||
24684ca71b | |||
8351dea292 | |||
a68011bce6 | |||
1f6f443c48 | |||
7fac483530 | |||
0ad9a03d3d | |||
0f689b733d | |||
618fe80670 | |||
3a8cd91cc0 | |||
30725824d0 | |||
6522a7acb4 | |||
fd3e4ab2d4 | |||
949a4ecf2e | |||
860a6a1b81 | |||
5a2b5624dc | |||
82fcee33b3 | |||
842e8501f9 | |||
7bd5454e43 | |||
8340e88795 | |||
095294389b | |||
3bcf3befec | |||
db69b449ba | |||
ed358ef024 | |||
faa79ea216 | |||
b17984f75e | |||
4521db66ce | |||
7912b7f119 | |||
55a6e4907b | |||
dda0cc793e | |||
5144426f0e | |||
98c028226d | |||
3eb901f800 | |||
47142a61ae | |||
f700319d7f | |||
418767c405 | |||
1f924c9c06 | |||
38fa7ceab1 | |||
22cddc5e26 | |||
1ccf372f8e | |||
3257968a28 | |||
6fc06fe9db | |||
75afcd3ad1 | |||
9ad80849b1 | |||
492d151079 | |||
00176c9514 | |||
6d2dcd8ac7 | |||
7d6079bb06 | |||
c820ed3495 | |||
0314bf70b3 | |||
7ae549dc9e | |||
cd13180199 | |||
8d6d8e8210 | |||
2995da845d | |||
973cec1713 | |||
94d7b083c5 | |||
ef88f0a223 | |||
ab0dcbfb2e | |||
1974766125 | |||
9c0c0d262e | |||
768e57dd37 | |||
67c756b28e | |||
584750d0fe | |||
80ef63791d | |||
a9f680b06e | |||
7e4fed8218 | |||
737da3615f | |||
d0f56b7bdd | |||
f47492c371 | |||
79b0367e6c | |||
2c411b9848 | |||
ac6d833d4d | |||
39de8e544c | |||
0271e9bc1a | |||
470f539346 | |||
6633e34bbd | |||
4b3725ec31 | |||
c1295c8fd6 | |||
39bf403505 | |||
4499a23e51 | |||
821a009c32 | |||
961a05bedf | |||
7247360e29 | |||
abfa428dab | |||
63e97df9ff | |||
5a7f801922 | |||
8fa30f8ce3 | |||
da4661f97c | |||
7245fb5d0a | |||
b4f36436c3 | |||
eb7e265eb1 | |||
c2ed0cb832 | |||
d708ce2be9 | |||
83a6475510 | |||
331b28393a | |||
afbf2de1b9 | |||
e67347f6ad | |||
bef8520937 | |||
8bfcb106c0 | |||
875306804c | |||
6bf4f65228 | |||
0c9edb0c4b | |||
3e18673451 | |||
d0370acb21 | |||
aeec80f375 | |||
dc9fe04d11 | |||
01cec9fcb7 | |||
6fb25ade7e | |||
e10e9554ab | |||
93173851d3 | |||
add9e925f4 | |||
60af51fc17 | |||
3021ef2d51 | |||
0ddcf26a45 | |||
4d3c2191cb | |||
38fc62ea27 | |||
2f7b2677d7 | |||
6d03d9f6a9 | |||
6f2d784d4e | |||
ce6816737c | |||
a0fd99b112 | |||
12a48b70ae | |||
aedf133b16 | |||
02aed73295 | |||
9348e88592 | |||
eace8c549f | |||
f8116132a7 | |||
171e0e5ae3 | |||
30781757e3 | |||
800d2f388e | |||
1647e31b48 | |||
399f61df98 | |||
8af813c2f1 | |||
29a2ee1744 | |||
afa1cc8287 | |||
ab78698ffd | |||
8ea0659ee2 | |||
aa6da11ba4 | |||
6a5a4881ad | |||
3a9bf932b4 | |||
a078be991a | |||
83ae5ec5c9 | |||
b4d38294a7 | |||
7804514c5c | |||
513278597a | |||
4698c9d2cf | |||
11c98f13e3 | |||
76bbdd0425 | |||
34df2b0695 | |||
ad638357b5 | |||
7404f80122 | |||
de0ee9fcb2 | |||
755fad6bc3 | |||
e3c0624c48 | |||
87e55ea993 | |||
3b8bfb08a4 | |||
00728fe877 | |||
a4062455cd |
5
.clang-format
Normal file
5
.clang-format
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
BasedOnStyle: Google
|
||||||
|
AlignConsecutiveDeclarations: false
|
||||||
|
ColumnLimit: 100
|
||||||
|
...
|
19
.editorconfig
Normal file
19
.editorconfig
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
# EditorConfig configuration for Waybar
|
||||||
|
# http://EditorConfig.org
|
||||||
|
|
||||||
|
# Top-most EditorConfig file
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
end_of_line = lf
|
||||||
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
charset = utf-8
|
||||||
|
|
||||||
|
[*.{build,css}]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
|
||||||
|
[*.{hpp,cpp}]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
4
.github/FUNDING.yml
vendored
Normal file
4
.github/FUNDING.yml
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
# These are supported funding model platforms
|
||||||
|
|
||||||
|
github: Alexays
|
||||||
|
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
@ -5,7 +5,7 @@ vgcore.*
|
|||||||
*.swp
|
*.swp
|
||||||
packagecache
|
packagecache
|
||||||
/subprojects/**/
|
/subprojects/**/
|
||||||
/build
|
/build*
|
||||||
/dist
|
/dist
|
||||||
/meson.egg-info
|
/meson.egg-info
|
||||||
|
|
||||||
|
18
.travis.yml
18
.travis.yml
@ -1,18 +0,0 @@
|
|||||||
sudo: false
|
|
||||||
|
|
||||||
services:
|
|
||||||
- docker
|
|
||||||
|
|
||||||
env:
|
|
||||||
- distro: debian
|
|
||||||
- distro: archlinux
|
|
||||||
- distro: opensuse
|
|
||||||
|
|
||||||
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 && git clone https://github.com/swaywm/wlroots subprojects/wlroots && meson build && ninja -C build"
|
|
5
Dockerfiles/alpine
Normal file
5
Dockerfiles/alpine
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# vim: ft=Dockerfile
|
||||||
|
|
||||||
|
FROM alpine:latest
|
||||||
|
|
||||||
|
RUN apk add --no-cache git meson alpine-sdk libinput-dev wayland-dev wayland-protocols mesa-dev libxkbcommon-dev eudev-dev pixman-dev gtkmm3-dev jsoncpp-dev pugixml-dev libnl3-dev pulseaudio-dev libmpdclient-dev sndio-dev scdoc libxkbcommon tzdata
|
@ -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 git meson base-devel libinput wayland wayland-protocols pixman libxkbcommon mesa gtkmm3 jsoncpp pugixml scdoc libpulse libdbusmenu-gtk3 libmpdclient gobject-introspection --noconfirm libxkbcommon
|
||||||
|
@ -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 && \
|
||||||
apt-get clean
|
apt-get clean
|
12
Dockerfiles/fedora
Normal file
12
Dockerfiles/fedora
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
# vim: ft=Dockerfile
|
||||||
|
|
||||||
|
FROM fedora:latest
|
||||||
|
|
||||||
|
RUN dnf install -y @c-development git-core meson scdoc 'pkgconfig(date)' \
|
||||||
|
'pkgconfig(dbusmenu-gtk3-0.4)' 'pkgconfig(fmt)' 'pkgconfig(gdk-pixbuf-2.0)' \
|
||||||
|
'pkgconfig(gio-unix-2.0)' 'pkgconfig(gtk-layer-shell-0)' 'pkgconfig(gtkmm-3.0)' \
|
||||||
|
'pkgconfig(jsoncpp)' 'pkgconfig(libinput)' 'pkgconfig(libmpdclient)' \
|
||||||
|
'pkgconfig(libnl-3.0)' 'pkgconfig(libnl-genl-3.0)' 'pkgconfig(libpulse)' \
|
||||||
|
'pkgconfig(libudev)' 'pkgconfig(pugixml)' 'pkgconfig(sigc++-2.0)' 'pkgconfig(spdlog)' \
|
||||||
|
'pkgconfig(wayland-client)' 'pkgconfig(wayland-cursor)' 'pkgconfig(wayland-protocols)' 'pkgconfig(xkbregistry)' && \
|
||||||
|
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
|
@ -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 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
|
||||||
|
23
Makefile
Normal file
23
Makefile
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
.PHONY: build build-debug run clean default install
|
||||||
|
|
||||||
|
default: build
|
||||||
|
|
||||||
|
build:
|
||||||
|
meson build
|
||||||
|
ninja -C build
|
||||||
|
|
||||||
|
build-debug:
|
||||||
|
meson build --buildtype=debug
|
||||||
|
ninja -C build
|
||||||
|
|
||||||
|
install: build
|
||||||
|
ninja -C build install
|
||||||
|
|
||||||
|
run: build
|
||||||
|
./build/waybar
|
||||||
|
|
||||||
|
debug-run: build-debug
|
||||||
|
./build/waybar --log-level debug
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rf build
|
103
README.md
103
README.md
@ -1,26 +1,45 @@
|
|||||||
# Waybar [](https://travis-ci.org/Alexays/Waybar) [](LICENSE)<br>
|
# Waybar [](LICENSE) [](https://paypal.me/ARouillard)<br>
|
||||||
**Proof of concept**
|
|
||||||
|
|
||||||
> Highly customizable Wayland bar for Sway and Wlroots based compositors.<br>
|
> Highly customizable Wayland bar for Sway and Wlroots based compositors.<br>
|
||||||
> Available on [AUR](https://aur.archlinux.org/packages/waybar-git/)
|
> Available in Arch [community](https://www.archlinux.org/packages/community/x86_64/waybar/) or
|
||||||
|
[AUR](https://aur.archlinux.org/packages/waybar-git/), [Gentoo](https://packages.gentoo.org/packages/gui-apps/waybar), [openSUSE](https://build.opensuse.org/package/show/X11:Wayland/waybar), and [Alpine Linux](https://pkgs.alpinelinux.org/packages?name=waybar).<br>
|
||||||
|
> *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)
|
||||||
- Tray (Beta) [#21](https://github.com/Alexays/Waybar/issues/21)
|
- River (Mapping mode, Tags, Focused window name)
|
||||||
|
- Hyprland (Focused window name)
|
||||||
|
- Tray [#21](https://github.com/Alexays/Waybar/issues/21)
|
||||||
- Local time
|
- Local time
|
||||||
- Battery
|
- Battery
|
||||||
|
- UPower
|
||||||
- Network
|
- Network
|
||||||
|
- Bluetooth
|
||||||
- Pulseaudio
|
- Pulseaudio
|
||||||
|
- Disk
|
||||||
- Memory
|
- Memory
|
||||||
- Cpu load average
|
- Cpu load average
|
||||||
|
- Temperature
|
||||||
|
- MPD
|
||||||
- Custom scripts
|
- Custom scripts
|
||||||
- And much more customizations
|
- Multiple output configuration
|
||||||
|
- And many more customizations
|
||||||
|
|
||||||
**Configuration and Customization**
|
#### 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
|
||||||
@ -28,10 +47,74 @@ $ cd Waybar
|
|||||||
$ meson build
|
$ meson build
|
||||||
$ ninja -C build
|
$ ninja -C build
|
||||||
$ ./build/waybar
|
$ ./build/waybar
|
||||||
|
# If you want to install it
|
||||||
|
$ ninja -C build install
|
||||||
|
$ waybar
|
||||||
```
|
```
|
||||||
|
|
||||||
Contributions welcome! - have fun :)<br>
|
**Dependencies**
|
||||||
The style guidelines is [Google's](https://google.github.io/styleguide/cppguide.html)
|
|
||||||
|
```
|
||||||
|
gtkmm3
|
||||||
|
jsoncpp
|
||||||
|
libsigc++
|
||||||
|
fmt
|
||||||
|
wayland
|
||||||
|
chrono-date
|
||||||
|
spdlog
|
||||||
|
libgtk-3-dev [gtk-layer-shell]
|
||||||
|
gobject-introspection [gtk-layer-shell]
|
||||||
|
libgirepository1.0-dev [gtk-layer-shell]
|
||||||
|
libpulse [Pulseaudio module]
|
||||||
|
libnl [Network module]
|
||||||
|
libappindicator-gtk3 [Tray module]
|
||||||
|
libdbusmenu-gtk3 [Tray module]
|
||||||
|
libmpdclient [MPD module]
|
||||||
|
libsndio [sndio module]
|
||||||
|
libevdev [KeyboardState module]
|
||||||
|
xkbregistry
|
||||||
|
upower [UPower battery module]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Build dependencies**
|
||||||
|
|
||||||
|
```
|
||||||
|
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,31 +1,32 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <glibmm/markup.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 format, uint16_t interval = 0);
|
ALabel(const Json::Value &, const std::string &, const std::string &, const std::string &format,
|
||||||
|
uint16_t interval = 0, bool ellipsize = false, bool enable_click = false,
|
||||||
|
bool enable_scroll = false);
|
||||||
virtual ~ALabel() = default;
|
virtual ~ALabel() = default;
|
||||||
virtual auto update() -> void;
|
virtual auto update() -> void;
|
||||||
virtual std::string getIcon(uint16_t, const std::string &alt = "");
|
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:
|
||||||
Gtk::EventBox event_box_;
|
|
||||||
Gtk::Label label_;
|
Gtk::Label label_;
|
||||||
const Json::Value &config_;
|
|
||||||
std::string format_;
|
std::string format_;
|
||||||
std::mutex mutex_;
|
|
||||||
const std::chrono::seconds interval_;
|
const std::chrono::seconds interval_;
|
||||||
|
bool alt_ = false;
|
||||||
|
std::string default_format_;
|
||||||
|
|
||||||
private:
|
virtual bool handleToggle(GdkEventButton *const &e);
|
||||||
bool handleToggle(GdkEventButton *const &ev);
|
virtual std::string getState(uint8_t value, bool lesser = false);
|
||||||
bool handleScroll(GdkEventScroll *);
|
|
||||||
bool alt = false;
|
|
||||||
const std::string default_format_;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // 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,6 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <gtkmm.h>
|
#include <gtkmm/widget.h>
|
||||||
|
|
||||||
namespace waybar {
|
namespace waybar {
|
||||||
|
|
||||||
@ -8,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
|
||||||
|
144
include/bar.hpp
144
include/bar.hpp
@ -1,59 +1,125 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <gdkmm/monitor.h>
|
||||||
|
#include <glibmm/refptr.h>
|
||||||
|
#include <gtkmm/box.h>
|
||||||
|
#include <gtkmm/cssprovider.h>
|
||||||
|
#include <gtkmm/main.h>
|
||||||
|
#include <gtkmm/window.h>
|
||||||
#include <json/json.h>
|
#include <json/json.h>
|
||||||
#include <gtkmm.h>
|
|
||||||
#include "wlr-layer-shell-unstable-v1-client-protocol.h"
|
#include <memory>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include "AModule.hpp"
|
||||||
#include "xdg-output-unstable-v1-client-protocol.h"
|
#include "xdg-output-unstable-v1-client-protocol.h"
|
||||||
#include "IModule.hpp"
|
|
||||||
|
|
||||||
namespace waybar {
|
namespace waybar {
|
||||||
|
|
||||||
class Client;
|
|
||||||
class Factory;
|
class Factory;
|
||||||
|
struct waybar_output {
|
||||||
|
Glib::RefPtr<Gdk::Monitor> monitor;
|
||||||
|
std::string name;
|
||||||
|
std::string identifier;
|
||||||
|
|
||||||
|
std::unique_ptr<struct zxdg_output_v1, decltype(&zxdg_output_v1_destroy)> xdg_output = {
|
||||||
|
nullptr, &zxdg_output_v1_destroy};
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class bar_layer : uint8_t {
|
||||||
|
BOTTOM,
|
||||||
|
TOP,
|
||||||
|
OVERLAY,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct bar_margins {
|
||||||
|
int top = 0;
|
||||||
|
int right = 0;
|
||||||
|
int bottom = 0;
|
||||||
|
int left = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct bar_mode {
|
||||||
|
bar_layer layer;
|
||||||
|
bool exclusive;
|
||||||
|
bool passthrough;
|
||||||
|
bool visible;
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef HAVE_SWAY
|
||||||
|
namespace modules::sway {
|
||||||
|
class BarIpcClient;
|
||||||
|
}
|
||||||
|
#endif // HAVE_SWAY
|
||||||
|
|
||||||
|
class BarSurface {
|
||||||
|
protected:
|
||||||
|
BarSurface() = default;
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual void setExclusiveZone(bool enable) = 0;
|
||||||
|
virtual void setLayer(bar_layer layer) = 0;
|
||||||
|
virtual void setMargins(const struct bar_margins &margins) = 0;
|
||||||
|
virtual void setPassThrough(bool enable) = 0;
|
||||||
|
virtual void setPosition(const std::string_view &position) = 0;
|
||||||
|
virtual void setSize(uint32_t width, uint32_t height) = 0;
|
||||||
|
virtual void commit(){};
|
||||||
|
|
||||||
|
virtual ~BarSurface() = default;
|
||||||
|
};
|
||||||
|
|
||||||
class Bar {
|
class Bar {
|
||||||
public:
|
public:
|
||||||
Bar(const Client&, std::unique_ptr<struct wl_output *>&&, uint32_t);
|
using bar_mode_map = std::map<std::string_view, struct bar_mode>;
|
||||||
Bar(const Bar&) = delete;
|
static const bar_mode_map PRESET_MODES;
|
||||||
|
static const std::string_view MODE_DEFAULT;
|
||||||
|
static const std::string_view MODE_INVISIBLE;
|
||||||
|
|
||||||
auto toggle() -> void;
|
Bar(struct waybar_output *w_output, const Json::Value &);
|
||||||
|
Bar(const Bar &) = delete;
|
||||||
|
~Bar();
|
||||||
|
|
||||||
const Client& client;
|
void setMode(const std::string_view &);
|
||||||
Gtk::Window window;
|
void setVisible(bool visible);
|
||||||
|
void toggle();
|
||||||
|
void handleSignal(int);
|
||||||
|
|
||||||
|
struct waybar_output *output;
|
||||||
|
Json::Value config;
|
||||||
struct wl_surface *surface;
|
struct wl_surface *surface;
|
||||||
struct zwlr_layer_surface_v1 *layer_surface;
|
|
||||||
std::unique_ptr<struct wl_output *> output;
|
|
||||||
std::string output_name;
|
|
||||||
uint32_t wl_name;
|
|
||||||
bool visible = true;
|
bool visible = true;
|
||||||
|
bool vertical = false;
|
||||||
|
Gtk::Window window;
|
||||||
|
|
||||||
|
#ifdef HAVE_SWAY
|
||||||
|
std::string bar_id;
|
||||||
|
#endif
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static void handleLogicalPosition(void *, struct zxdg_output_v1 *, int32_t,
|
void onMap(GdkEventAny *);
|
||||||
int32_t);
|
|
||||||
static void handleLogicalSize(void *, struct zxdg_output_v1 *, int32_t,
|
|
||||||
int32_t);
|
|
||||||
static void handleDone(void *, struct zxdg_output_v1 *);
|
|
||||||
static void handleName(void *, struct zxdg_output_v1 *, const char *);
|
|
||||||
static void handleDescription(void *, struct zxdg_output_v1 *,
|
|
||||||
const char *);
|
|
||||||
static void layerSurfaceHandleConfigure(void *,
|
|
||||||
struct zwlr_layer_surface_v1 *, uint32_t, uint32_t, uint32_t);
|
|
||||||
static void layerSurfaceHandleClosed(void *,
|
|
||||||
struct zwlr_layer_surface_v1 *);
|
|
||||||
|
|
||||||
auto setupConfig() -> void;
|
|
||||||
auto setupWidgets() -> void;
|
auto setupWidgets() -> void;
|
||||||
auto setupCss() -> void;
|
void getModules(const Factory &, const std::string &, Gtk::Box *);
|
||||||
void getModules(const Factory&, const std::string&);
|
void setupAltFormatKeyForModule(const std::string &module_name);
|
||||||
|
void setupAltFormatKeyForModuleList(const char *module_list_name);
|
||||||
|
void setMode(const bar_mode &);
|
||||||
|
|
||||||
uint32_t width_ = 0;
|
/* Copy initial set of modes to allow customization */
|
||||||
uint32_t height_ = 30;
|
bar_mode_map configured_modes = PRESET_MODES;
|
||||||
Json::Value config_;
|
std::string last_mode_{MODE_DEFAULT};
|
||||||
Glib::RefPtr<Gtk::StyleContext> style_context_;
|
|
||||||
Glib::RefPtr<Gtk::CssProvider> css_provider_;
|
std::unique_ptr<BarSurface> surface_impl_;
|
||||||
struct zxdg_output_v1 *xdg_output_;
|
Gtk::Box left_;
|
||||||
std::vector<std::unique_ptr<waybar::IModule>> modules_left_;
|
Gtk::Box center_;
|
||||||
std::vector<std::unique_ptr<waybar::IModule>> modules_center_;
|
Gtk::Box right_;
|
||||||
std::vector<std::unique_ptr<waybar::IModule>> modules_right_;
|
Gtk::Box box_;
|
||||||
|
std::vector<std::shared_ptr<waybar::AModule>> modules_left_;
|
||||||
|
std::vector<std::shared_ptr<waybar::AModule>> modules_center_;
|
||||||
|
std::vector<std::shared_ptr<waybar::AModule>> modules_right_;
|
||||||
|
#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
|
||||||
|
@ -1,40 +1,58 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <wordexp.h>
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
#include <wayland-client.h>
|
|
||||||
#include <gdk/gdkwayland.h>
|
#include <gdk/gdkwayland.h>
|
||||||
|
#include <wayland-client.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 {
|
||||||
|
|
||||||
class Client {
|
class Client {
|
||||||
public:
|
public:
|
||||||
Client(int argc, char *argv[]);
|
static Client *inst();
|
||||||
int main(int argc, char *argv[]);
|
int main(int argc, char *argv[]);
|
||||||
|
void reset();
|
||||||
|
|
||||||
Gtk::Main gtk_main;
|
Glib::RefPtr<Gtk::Application> gtk_app;
|
||||||
std::string css_file;
|
|
||||||
std::string config_file;
|
|
||||||
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 wl_seat *seat = 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:
|
||||||
void setupConfigs(const std::string& config, const std::string& style);
|
Client() = default;
|
||||||
|
const std::string getStyle(const std::string &style);
|
||||||
void bindInterfaces();
|
void bindInterfaces();
|
||||||
const std::string getValidPath(std::vector<std::string> paths);
|
void handleOutput(struct waybar_output &output);
|
||||||
|
auto setupCss(const std::string &css_file) -> void;
|
||||||
|
struct waybar_output &getOutput(void *);
|
||||||
|
std::vector<Json::Value> getOutputConfigs(struct waybar_output &output);
|
||||||
|
|
||||||
static void handleGlobal(void *data, struct wl_registry *registry,
|
static void handleGlobal(void *data, struct wl_registry *registry, uint32_t name,
|
||||||
uint32_t name, const char *interface, uint32_t version);
|
const char *interface, uint32_t version);
|
||||||
static void handleGlobalRemove(void *data,
|
static void handleGlobalRemove(void *data, struct wl_registry *registry, uint32_t name);
|
||||||
struct wl_registry *registry, uint32_t name);
|
static void handleOutputDone(void *, struct zxdg_output_v1 *);
|
||||||
|
static void handleOutputName(void *, struct zxdg_output_v1 *, const char *);
|
||||||
|
static void handleOutputDescription(void *, struct zxdg_output_v1 *, const char *);
|
||||||
|
void handleMonitorAdded(Glib::RefPtr<Gdk::Monitor> monitor);
|
||||||
|
void handleMonitorRemoved(Glib::RefPtr<Gdk::Monitor> monitor);
|
||||||
|
void handleDeferredMonitorRemoval(Glib::RefPtr<Gdk::Monitor> monitor);
|
||||||
|
|
||||||
|
Glib::RefPtr<Gtk::StyleContext> style_context_;
|
||||||
|
Glib::RefPtr<Gtk::CssProvider> css_provider_;
|
||||||
|
std::list<struct waybar_output> outputs_;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
} // 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,37 +1,95 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <json/json.h>
|
#include <json/json.h>
|
||||||
|
#ifdef HAVE_LIBDATE
|
||||||
#include "modules/clock.hpp"
|
#include "modules/clock.hpp"
|
||||||
#ifdef HAVE_SWAY
|
#else
|
||||||
#include "modules/sway/mode.hpp"
|
#include "modules/simpleclock.hpp"
|
||||||
#include "modules/sway/workspaces.hpp"
|
|
||||||
#include "modules/sway/window.hpp"
|
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_SWAY
|
||||||
|
#include "modules/sway/language.hpp"
|
||||||
|
#include "modules/sway/mode.hpp"
|
||||||
|
#include "modules/sway/scratchpad.hpp"
|
||||||
|
#include "modules/sway/window.hpp"
|
||||||
|
#include "modules/sway/workspaces.hpp"
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_WLR
|
||||||
|
#include "modules/wlr/taskbar.hpp"
|
||||||
|
#include "modules/wlr/workspace_manager.hpp"
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_RIVER
|
||||||
|
#include "modules/river/mode.hpp"
|
||||||
|
#include "modules/river/tags.hpp"
|
||||||
|
#include "modules/river/window.hpp"
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_HYPRLAND
|
||||||
|
#include "modules/hyprland/backend.hpp"
|
||||||
|
#include "modules/hyprland/language.hpp"
|
||||||
|
#include "modules/hyprland/window.hpp"
|
||||||
|
#endif
|
||||||
|
#if defined(__FreeBSD__) || (defined(__linux__) && !defined(NO_FILESYSTEM))
|
||||||
#include "modules/battery.hpp"
|
#include "modules/battery.hpp"
|
||||||
#include "modules/memory.hpp"
|
#endif
|
||||||
|
#if defined(HAVE_CPU_LINUX) || defined(HAVE_CPU_BSD)
|
||||||
#include "modules/cpu.hpp"
|
#include "modules/cpu.hpp"
|
||||||
|
#endif
|
||||||
|
#include "modules/idle_inhibitor.hpp"
|
||||||
|
#if defined(HAVE_MEMORY_LINUX) || defined(HAVE_MEMORY_BSD)
|
||||||
|
#include "modules/memory.hpp"
|
||||||
|
#endif
|
||||||
|
#include "modules/disk.hpp"
|
||||||
#ifdef HAVE_DBUSMENU
|
#ifdef HAVE_DBUSMENU
|
||||||
#include "modules/sni/tray.hpp"
|
#include "modules/sni/tray.hpp"
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_LIBNL
|
#ifdef HAVE_LIBNL
|
||||||
#include "modules/network.hpp"
|
#include "modules/network.hpp"
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_LIBUDEV
|
||||||
|
#include "modules/backlight.hpp"
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_LIBEVDEV
|
||||||
|
#include "modules/keyboard_state.hpp"
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_GAMEMODE
|
||||||
|
#include "modules/gamemode.hpp"
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_UPOWER
|
||||||
|
#include "modules/upower/upower.hpp"
|
||||||
|
#endif
|
||||||
#ifdef HAVE_LIBPULSE
|
#ifdef HAVE_LIBPULSE
|
||||||
#include "modules/pulseaudio.hpp"
|
#include "modules/pulseaudio.hpp"
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_LIBMPDCLIENT
|
||||||
|
#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
|
||||||
|
#include "bar.hpp"
|
||||||
#include "modules/custom.hpp"
|
#include "modules/custom.hpp"
|
||||||
|
#include "modules/temperature.hpp"
|
||||||
|
#include "modules/user.hpp"
|
||||||
|
|
||||||
namespace waybar {
|
namespace waybar {
|
||||||
|
|
||||||
class Bar;
|
|
||||||
|
|
||||||
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_;
|
||||||
const Json::Value& config_;
|
const Json::Value& config_;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
} // namespace waybar
|
||||||
|
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
|
64
include/modules/backlight.hpp
Normal file
64
include/modules/backlight.hpp
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <optional>
|
||||||
|
#include <string>
|
||||||
|
#include <string_view>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include "ALabel.hpp"
|
||||||
|
#include "util/json.hpp"
|
||||||
|
#include "util/sleeper_thread.hpp"
|
||||||
|
|
||||||
|
struct udev;
|
||||||
|
struct udev_device;
|
||||||
|
|
||||||
|
namespace waybar::modules {
|
||||||
|
|
||||||
|
class Backlight : public ALabel {
|
||||||
|
class BacklightDev {
|
||||||
|
public:
|
||||||
|
BacklightDev() = default;
|
||||||
|
BacklightDev(std::string name, int actual, int max, bool powered);
|
||||||
|
std::string_view name() const;
|
||||||
|
int get_actual() const;
|
||||||
|
void set_actual(int actual);
|
||||||
|
int get_max() const;
|
||||||
|
void set_max(int max);
|
||||||
|
bool get_powered() const;
|
||||||
|
void set_powered(bool powered);
|
||||||
|
friend inline bool operator==(const BacklightDev &lhs, const BacklightDev &rhs) {
|
||||||
|
return lhs.name_ == rhs.name_ && lhs.actual_ == rhs.actual_ && lhs.max_ == rhs.max_;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string name_;
|
||||||
|
int actual_ = 1;
|
||||||
|
int max_ = 1;
|
||||||
|
bool powered_ = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
public:
|
||||||
|
Backlight(const std::string &, const Json::Value &);
|
||||||
|
~Backlight();
|
||||||
|
auto update() -> void;
|
||||||
|
|
||||||
|
private:
|
||||||
|
template <class ForwardIt>
|
||||||
|
static const BacklightDev *best_device(ForwardIt first, ForwardIt last, std::string_view);
|
||||||
|
template <class ForwardIt, class Inserter>
|
||||||
|
static void upsert_device(ForwardIt first, ForwardIt last, Inserter inserter, udev_device *dev);
|
||||||
|
template <class ForwardIt, class Inserter>
|
||||||
|
static void enumerate_devices(ForwardIt first, ForwardIt last, Inserter inserter, udev *udev);
|
||||||
|
|
||||||
|
const std::string preferred_device_;
|
||||||
|
static constexpr int EPOLL_MAX_EVENTS = 16;
|
||||||
|
|
||||||
|
std::optional<BacklightDev> previous_best_;
|
||||||
|
std::string previous_format_;
|
||||||
|
|
||||||
|
std::mutex udev_thread_mutex_;
|
||||||
|
std::vector<BacklightDev> devices_;
|
||||||
|
// thread must destruct before shared data
|
||||||
|
util::SleeperThread udev_thread_;
|
||||||
|
};
|
||||||
|
} // namespace waybar::modules
|
@ -5,13 +5,18 @@
|
|||||||
#else
|
#else
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#endif
|
#endif
|
||||||
#include <fstream>
|
|
||||||
#include <iostream>
|
|
||||||
#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 "util/chrono.hpp"
|
#include <fstream>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "ALabel.hpp"
|
#include "ALabel.hpp"
|
||||||
|
#include "util/sleeper_thread.hpp"
|
||||||
|
|
||||||
namespace waybar::modules {
|
namespace waybar::modules {
|
||||||
|
|
||||||
@ -26,18 +31,28 @@ class Battery : public ALabel {
|
|||||||
Battery(const std::string&, const Json::Value&);
|
Battery(const std::string&, const Json::Value&);
|
||||||
~Battery();
|
~Battery();
|
||||||
auto update() -> void;
|
auto update() -> void;
|
||||||
|
|
||||||
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 refreshBatteries();
|
||||||
void worker();
|
void worker();
|
||||||
const std::tuple<uint8_t, std::string> getInfos() const;
|
const std::string getAdapterStatus(uint8_t capacity) const;
|
||||||
const std::string getState(uint8_t) const;
|
const std::tuple<uint8_t, float, std::string, float> getInfos();
|
||||||
|
const std::string formatTimeRemaining(float hoursRemaining);
|
||||||
|
|
||||||
|
int global_watch;
|
||||||
|
std::map<fs::path, int> batteries_;
|
||||||
|
fs::path adapter_;
|
||||||
|
int battery_watch_fd_;
|
||||||
|
int global_watch_fd_;
|
||||||
|
std::mutex battery_list_mutex_;
|
||||||
|
std::string old_status_;
|
||||||
|
bool warnFirstTime_{true};
|
||||||
|
|
||||||
util::SleeperThread thread_;
|
util::SleeperThread thread_;
|
||||||
|
util::SleeperThread thread_battery_update_;
|
||||||
util::SleeperThread thread_timer_;
|
util::SleeperThread thread_timer_;
|
||||||
std::vector<fs::path> batteries_;
|
|
||||||
int fd_;
|
|
||||||
std::string old_status_;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
} // namespace waybar::modules
|
||||||
|
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,18 +1,44 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <fmt/format.h>
|
#include <date/tz.h>
|
||||||
#include "fmt/time.h"
|
|
||||||
#include "util/chrono.hpp"
|
|
||||||
#include "ALabel.hpp"
|
|
||||||
|
|
||||||
namespace waybar::modules {
|
#include "ALabel.hpp"
|
||||||
|
#include "util/sleeper_thread.hpp"
|
||||||
|
|
||||||
|
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:
|
||||||
Clock(const std::string&, const Json::Value&);
|
Clock(const std::string&, const Json::Value&);
|
||||||
|
~Clock() = default;
|
||||||
auto update() -> void;
|
auto update() -> void;
|
||||||
private:
|
|
||||||
waybar::util::SleeperThread thread_;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
private:
|
||||||
|
util::SleeperThread thread_;
|
||||||
|
std::locale locale_;
|
||||||
|
std::vector<const date::time_zone*> time_zones_;
|
||||||
|
int current_time_zone_idx_;
|
||||||
|
date::year_month_day calendar_cached_ymd_{date::January / 1 / 0};
|
||||||
|
date::months calendar_shift_{0}, calendar_shift_init_{0};
|
||||||
|
std::string calendar_cached_text_;
|
||||||
|
bool is_calendar_in_tooltip_;
|
||||||
|
bool is_timezoned_list_in_tooltip_;
|
||||||
|
|
||||||
|
bool handleScroll(GdkEventScroll* e);
|
||||||
|
|
||||||
|
auto calendar_text(const waybar_time& wtime) -> std::string;
|
||||||
|
auto weekdays_header(const date::weekday& first_dow, std::ostream& os) -> void;
|
||||||
|
auto first_day_of_week() -> date::weekday;
|
||||||
|
const date::time_zone* current_timezone();
|
||||||
|
bool is_timezone_fixed();
|
||||||
|
auto timezones_text(std::chrono::system_clock::time_point* now) -> std::string;
|
||||||
|
};
|
||||||
|
} // namespace modules
|
||||||
|
} // namespace waybar
|
||||||
|
@ -1,28 +1,35 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
#include <sys/sysinfo.h>
|
|
||||||
|
#include <cstdint>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <vector>
|
|
||||||
#include <numeric>
|
#include <numeric>
|
||||||
#include <iostream>
|
#include <string>
|
||||||
#include "util/chrono.hpp"
|
#include <utility>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "ALabel.hpp"
|
#include "ALabel.hpp"
|
||||||
|
#include "util/sleeper_thread.hpp"
|
||||||
|
|
||||||
namespace waybar::modules {
|
namespace waybar::modules {
|
||||||
|
|
||||||
class Cpu : public ALabel {
|
class Cpu : public ALabel {
|
||||||
public:
|
public:
|
||||||
Cpu(const std::string&, const Json::Value&);
|
Cpu(const std::string&, const Json::Value&);
|
||||||
|
~Cpu() = default;
|
||||||
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_;
|
||||||
waybar::util::SleeperThread thread_;
|
|
||||||
|
util::SleeperThread thread_;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
} // namespace waybar::modules
|
||||||
|
@ -1,34 +1,46 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
#include <iostream>
|
|
||||||
#include "util/chrono.hpp"
|
#include <csignal>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "ALabel.hpp"
|
||||||
#include "util/command.hpp"
|
#include "util/command.hpp"
|
||||||
#include "util/json.hpp"
|
#include "util/json.hpp"
|
||||||
#include "ALabel.hpp"
|
#include "util/sleeper_thread.hpp"
|
||||||
|
|
||||||
namespace waybar::modules {
|
namespace waybar::modules {
|
||||||
|
|
||||||
class Custom : public ALabel {
|
class Custom : public ALabel {
|
||||||
public:
|
public:
|
||||||
Custom(const std::string&, const Json::Value&);
|
Custom(const std::string&, const std::string&, const Json::Value&);
|
||||||
~Custom();
|
~Custom();
|
||||||
auto update() -> void;
|
auto update() -> void;
|
||||||
|
void refresh(int /*signal*/);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void delayWorker();
|
void delayWorker();
|
||||||
void continuousWorker();
|
void continuousWorker();
|
||||||
void parseOutputRaw();
|
void parseOutputRaw();
|
||||||
void parseOutputJson();
|
void parseOutputJson();
|
||||||
|
void handleEvent();
|
||||||
|
bool handleScroll(GdkEventScroll* 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 tooltip_;
|
std::string tooltip_;
|
||||||
std::string class_;
|
std::vector<std::string> class_;
|
||||||
std::string prevclass_;
|
int percentage_;
|
||||||
waybar::util::SleeperThread thread_;
|
|
||||||
waybar::util::command::res output_;
|
|
||||||
waybar::util::JsonParser parser_;
|
|
||||||
FILE* fp_;
|
FILE* fp_;
|
||||||
|
int pid_;
|
||||||
|
util::command::res output_;
|
||||||
|
util::JsonParser parser_;
|
||||||
|
|
||||||
|
util::SleeperThread thread_;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
} // namespace waybar::modules
|
||||||
|
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
|
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
|
30
include/modules/idle_inhibitor.hpp
Normal file
30
include/modules/idle_inhibitor.hpp
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <fmt/format.h>
|
||||||
|
|
||||||
|
#include "ALabel.hpp"
|
||||||
|
#include "bar.hpp"
|
||||||
|
#include "client.hpp"
|
||||||
|
|
||||||
|
namespace waybar::modules {
|
||||||
|
|
||||||
|
class IdleInhibitor : public ALabel {
|
||||||
|
sigc::connection timeout_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
IdleInhibitor(const std::string&, const waybar::Bar&, const Json::Value&);
|
||||||
|
~IdleInhibitor();
|
||||||
|
auto update() -> void;
|
||||||
|
static std::list<waybar::AModule*> modules;
|
||||||
|
static bool status;
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool handleToggle(GdkEventButton* const& e);
|
||||||
|
void toggleStatus();
|
||||||
|
|
||||||
|
const Bar& bar_;
|
||||||
|
struct zwp_idle_inhibitor_v1* idle_inhibitor_;
|
||||||
|
int pid_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // 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,22 +1,27 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include "util/chrono.hpp"
|
#include <unordered_map>
|
||||||
|
|
||||||
#include "ALabel.hpp"
|
#include "ALabel.hpp"
|
||||||
|
#include "util/sleeper_thread.hpp"
|
||||||
|
|
||||||
namespace waybar::modules {
|
namespace waybar::modules {
|
||||||
|
|
||||||
class Memory : public ALabel {
|
class Memory : public ALabel {
|
||||||
public:
|
public:
|
||||||
Memory(const std::string&, const Json::Value&);
|
Memory(const std::string&, const Json::Value&);
|
||||||
|
~Memory() = default;
|
||||||
auto update() -> void;
|
auto update() -> void;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static inline const std::string data_dir_ = "/proc/meminfo";
|
|
||||||
unsigned long memtotal_;
|
|
||||||
unsigned long memfree_;
|
|
||||||
void parseMeminfo();
|
void parseMeminfo();
|
||||||
waybar::util::SleeperThread thread_;
|
|
||||||
|
std::unordered_map<std::string, unsigned long> meminfo_;
|
||||||
|
|
||||||
|
util::SleeperThread thread_;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
} // 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
|
@ -1,15 +1,20 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <net/if.h>
|
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <ifaddrs.h>
|
|
||||||
#include <netlink/netlink.h>
|
|
||||||
#include <netlink/genl/genl.h>
|
|
||||||
#include <netlink/genl/ctrl.h>
|
|
||||||
#include <linux/nl80211.h>
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
#include "util/chrono.hpp"
|
#include <linux/nl80211.h>
|
||||||
|
#include <netlink/genl/ctrl.h>
|
||||||
|
#include <netlink/genl/genl.h>
|
||||||
|
#include <netlink/netlink.h>
|
||||||
|
#include <sys/epoll.h>
|
||||||
|
|
||||||
|
#include <optional>
|
||||||
|
|
||||||
#include "ALabel.hpp"
|
#include "ALabel.hpp"
|
||||||
|
#include "util/sleeper_thread.hpp"
|
||||||
|
#ifdef WANT_RFKILL
|
||||||
|
#include "util/rfkill.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace waybar::modules {
|
namespace waybar::modules {
|
||||||
|
|
||||||
@ -18,37 +23,68 @@ class Network : public ALabel {
|
|||||||
Network(const std::string&, const Json::Value&);
|
Network(const std::string&, const Json::Value&);
|
||||||
~Network();
|
~Network();
|
||||||
auto update() -> void;
|
auto update() -> void;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static int netlinkRequest(int, void*, uint32_t, uint32_t groups = 0);
|
static const uint8_t MAX_RETRY = 5;
|
||||||
static int netlinkResponse(int, void*, uint32_t, uint32_t groups = 0);
|
static const uint8_t EPOLL_MAX = 200;
|
||||||
static int scanCb(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*);
|
||||||
|
|
||||||
|
void askForStateDump(void);
|
||||||
|
|
||||||
void worker();
|
void worker();
|
||||||
void disconnected();
|
void createInfoSocket();
|
||||||
void initNL80211();
|
void createEventSocket();
|
||||||
int getExternalInterface();
|
|
||||||
void getInterfaceAddress();
|
|
||||||
void parseEssid(struct nlattr**);
|
void parseEssid(struct nlattr**);
|
||||||
void parseSignal(struct nlattr**);
|
void parseSignal(struct nlattr**);
|
||||||
|
void parseFreq(struct nlattr**);
|
||||||
bool associatedOrJoined(struct nlattr**);
|
bool associatedOrJoined(struct nlattr**);
|
||||||
|
bool checkInterface(std::string name);
|
||||||
auto getInfo() -> void;
|
auto getInfo() -> void;
|
||||||
|
const std::string getNetworkState() const;
|
||||||
|
void clearIface();
|
||||||
|
bool wildcardMatch(const std::string& pattern, const std::string& text) const;
|
||||||
|
std::optional<std::pair<unsigned long long, unsigned long long>> readBandwidthUsage();
|
||||||
|
|
||||||
waybar::util::SleeperThread thread_;
|
|
||||||
waybar::util::SleeperThread thread_timer_;
|
|
||||||
int ifid_;
|
int ifid_;
|
||||||
sa_family_t family_;
|
sa_family_t family_;
|
||||||
int sock_fd_;
|
|
||||||
struct sockaddr_nl nladdr_ = {0};
|
struct sockaddr_nl nladdr_ = {0};
|
||||||
struct nl_sock* sk_ = nullptr;
|
struct nl_sock* sock_ = nullptr;
|
||||||
|
struct nl_sock* ev_sock_ = nullptr;
|
||||||
|
int efd_;
|
||||||
|
int ev_fd_;
|
||||||
int nl80211_id_;
|
int nl80211_id_;
|
||||||
|
std::mutex mutex_;
|
||||||
|
|
||||||
|
bool want_route_dump_;
|
||||||
|
bool want_link_dump_;
|
||||||
|
bool want_addr_dump_;
|
||||||
|
bool dump_in_progress_;
|
||||||
|
|
||||||
|
unsigned long long bandwidth_down_total_;
|
||||||
|
unsigned long long bandwidth_up_total_;
|
||||||
|
|
||||||
|
std::string state_;
|
||||||
std::string essid_;
|
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_;
|
||||||
int signal_strength_dbm_;
|
int32_t signal_strength_dbm_;
|
||||||
uint16_t signal_strength_;
|
uint8_t signal_strength_;
|
||||||
|
std::string signal_strength_app_;
|
||||||
|
float frequency_;
|
||||||
|
uint32_t route_priority;
|
||||||
|
|
||||||
|
util::SleeperThread thread_;
|
||||||
|
util::SleeperThread thread_timer_;
|
||||||
|
#ifdef WANT_RFKILL
|
||||||
|
util::Rfkill rfkill_;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
} // 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 {
|
||||||
@ -13,27 +16,39 @@ class Pulseaudio : public ALabel {
|
|||||||
Pulseaudio(const std::string&, const Json::Value&);
|
Pulseaudio(const std::string&, const Json::Value&);
|
||||||
~Pulseaudio();
|
~Pulseaudio();
|
||||||
auto update() -> void;
|
auto update() -> void;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static void subscribeCb(pa_context*, pa_subscription_event_type_t,
|
static void subscribeCb(pa_context*, pa_subscription_event_type_t, uint32_t, void*);
|
||||||
uint32_t, void*);
|
|
||||||
static void contextStateCb(pa_context*, void*);
|
static void contextStateCb(pa_context*, void*);
|
||||||
static void sinkInfoCb(pa_context*, const pa_sink_info*, int, void*);
|
static void sinkInfoCb(pa_context*, const pa_sink_info*, int, void*);
|
||||||
|
static void sourceInfoCb(pa_context*, const pa_source_info* i, int, void* data);
|
||||||
static void serverInfoCb(pa_context*, const pa_server_info*, void*);
|
static void serverInfoCb(pa_context*, const pa_server_info*, void*);
|
||||||
static void volumeModifyCb(pa_context*, int, void*);
|
static void volumeModifyCb(pa_context*, int, void*);
|
||||||
bool handleScroll(GdkEventScroll* e);
|
|
||||||
|
|
||||||
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_;
|
||||||
|
// 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_;
|
||||||
bool scrolling_;
|
std::string monitor_;
|
||||||
|
std::string current_sink_name_;
|
||||||
|
bool current_sink_running_;
|
||||||
|
// SOURCE
|
||||||
|
uint32_t source_idx_{0};
|
||||||
|
uint16_t source_volume_;
|
||||||
|
bool source_muted_;
|
||||||
|
std::string source_port_name_;
|
||||||
|
std::string source_desc_;
|
||||||
|
std::string default_source_name_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // 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
|
@ -1,22 +1,28 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <gtkmm.h>
|
|
||||||
#include <json/json.h>
|
|
||||||
#include <tuple>
|
|
||||||
#include <dbus-status-notifier-watcher.h>
|
#include <dbus-status-notifier-watcher.h>
|
||||||
|
#include <giomm.h>
|
||||||
|
#include <glibmm/refptr.h>
|
||||||
|
#include <json/json.h>
|
||||||
|
|
||||||
|
#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&,
|
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>&)>&);
|
const std::function<void(std::unique_ptr<Item>&)>&);
|
||||||
~Host();
|
~Host();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void busAcquired(const Glib::RefPtr<Gio::DBus::Connection>&, Glib::ustring);
|
void busAcquired(const Glib::RefPtr<Gio::DBus::Connection>&, Glib::ustring);
|
||||||
void nameAppeared(const Glib::RefPtr<Gio::DBus::Connection>&, Glib::ustring, const Glib::ustring&);
|
void nameAppeared(const Glib::RefPtr<Gio::DBus::Connection>&, Glib::ustring,
|
||||||
|
const Glib::ustring&);
|
||||||
void nameVanished(const Glib::RefPtr<Gio::DBus::Connection>&, Glib::ustring);
|
void nameVanished(const Glib::RefPtr<Gio::DBus::Connection>&, Glib::ustring);
|
||||||
static void proxyReady(GObject*, GAsyncResult*, gpointer);
|
static void proxyReady(GObject*, GAsyncResult*, gpointer);
|
||||||
static void registerHost(GObject*, GAsyncResult*, gpointer);
|
static void registerHost(GObject*, GAsyncResult*, gpointer);
|
||||||
@ -33,9 +39,10 @@ class Host {
|
|||||||
std::size_t watcher_id_;
|
std::size_t watcher_id_;
|
||||||
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_;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
} // namespace waybar::modules::SNI
|
||||||
|
@ -1,20 +1,31 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <dbus-status-notifier-item.h>
|
#include <dbus-status-notifier-item.h>
|
||||||
#include <gtkmm.h>
|
#include <giomm/dbusproxy.h>
|
||||||
|
#include <glibmm/refptr.h>
|
||||||
|
#include <gtkmm/eventbox.h>
|
||||||
|
#include <gtkmm/icontheme.h>
|
||||||
|
#include <gtkmm/image.h>
|
||||||
|
#include <gtkmm/menu.h>
|
||||||
#include <json/json.h>
|
#include <json/json.h>
|
||||||
#include <libdbusmenu-gtk/dbusmenu-gtk.h>
|
#include <libdbusmenu-gtk/dbusmenu-gtk.h>
|
||||||
#ifdef FILESYSTEM_EXPERIMENTAL
|
#include <sigc++/trackable.h>
|
||||||
#include <experimental/filesystem>
|
|
||||||
#else
|
#include <set>
|
||||||
#include <filesystem>
|
#include <string_view>
|
||||||
#endif
|
|
||||||
|
#include "bar.hpp"
|
||||||
|
|
||||||
namespace waybar::modules::SNI {
|
namespace waybar::modules::SNI {
|
||||||
|
|
||||||
class Item {
|
struct ToolTip {
|
||||||
public:
|
Glib::ustring icon_name;
|
||||||
Item(std::string, std::string, const Json::Value&);
|
Glib::ustring text;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Item : public sigc::trackable {
|
||||||
|
public:
|
||||||
|
Item(const std::string&, const std::string&, const Json::Value&, const Bar&);
|
||||||
~Item() = default;
|
~Item() = default;
|
||||||
|
|
||||||
std::string bus_name;
|
std::string bus_name;
|
||||||
@ -26,34 +37,56 @@ public:
|
|||||||
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;
|
||||||
std::string overlay_icon_name;
|
std::string overlay_icon_name;
|
||||||
std::string attention_icon_name;
|
std::string attention_icon_name;
|
||||||
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;
|
||||||
DbusmenuGtkMenu *dbus_menu = nullptr;
|
ToolTip tooltip;
|
||||||
Gtk::Menu *gtk_menu = nullptr;
|
DbusmenuGtkMenu* dbus_menu = nullptr;
|
||||||
bool item_is_menu;
|
Gtk::Menu* gtk_menu = nullptr;
|
||||||
|
/**
|
||||||
|
* 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:
|
||||||
static void proxyReady(GObject *obj, GAsyncResult *res, gpointer data);
|
void onConfigure(GdkEventConfigure* ev);
|
||||||
static void getAll(GObject *obj, GAsyncResult *res, gpointer data);
|
void proxyReady(Glib::RefPtr<Gio::AsyncResult>& result);
|
||||||
|
void setProperty(const Glib::ustring& name, Glib::VariantBase& value);
|
||||||
|
void setStatus(const Glib::ustring& value);
|
||||||
|
void getUpdatedProperties();
|
||||||
|
void processUpdatedProperties(Glib::RefPtr<Gio::AsyncResult>& result);
|
||||||
|
void onSignal(const Glib::ustring& sender_name, const Glib::ustring& signal_name,
|
||||||
|
const Glib::VariantContainerBase& arguments);
|
||||||
|
|
||||||
void updateImage();
|
void updateImage();
|
||||||
Glib::RefPtr<Gdk::Pixbuf> extractPixBuf(GVariant *variant);
|
Glib::RefPtr<Gdk::Pixbuf> extractPixBuf(GVariant* variant);
|
||||||
Glib::RefPtr<Gdk::Pixbuf> getIconByName(std::string name, int size);
|
Glib::RefPtr<Gdk::Pixbuf> getIconPixbuf();
|
||||||
static void onMenuDestroyed(Item *self);
|
Glib::RefPtr<Gdk::Pixbuf> getIconByName(const std::string& name, int size);
|
||||||
bool makeMenu(GdkEventButton *const &ev);
|
double getScaledIconSize();
|
||||||
bool handleClick(GdkEventButton *const & /*ev*/);
|
static void onMenuDestroyed(Item* self, GObject* old_menu_pointer);
|
||||||
|
void makeMenu();
|
||||||
|
bool handleClick(GdkEventButton* const& /*ev*/);
|
||||||
|
bool handleScroll(GdkEventScroll* const&);
|
||||||
|
|
||||||
GCancellable *cancellable_ = nullptr;
|
// smooth scrolling threshold
|
||||||
SnItem *proxy_ = nullptr;
|
gdouble scroll_threshold_ = 0;
|
||||||
|
gdouble distance_scrolled_x_ = 0;
|
||||||
|
gdouble distance_scrolled_y_ = 0;
|
||||||
|
// visibility of items with Status == Passive
|
||||||
|
bool show_passive_ = false;
|
||||||
|
|
||||||
|
Glib::RefPtr<Gio::DBus::Proxy> proxy_;
|
||||||
|
Glib::RefPtr<Gio::Cancellable> cancellable_;
|
||||||
|
std::set<std::string_view> update_pending_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace waybar::modules::SNI
|
} // namespace waybar::modules::SNI
|
||||||
|
@ -1,30 +1,29 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
#include <thread>
|
|
||||||
|
#include "AModule.hpp"
|
||||||
#include "bar.hpp"
|
#include "bar.hpp"
|
||||||
#include "util/json.hpp"
|
|
||||||
#include "IModule.hpp"
|
|
||||||
#include "modules/sni/watcher.hpp"
|
|
||||||
#include "modules/sni/host.hpp"
|
#include "modules/sni/host.hpp"
|
||||||
|
#include "modules/sni/watcher.hpp"
|
||||||
|
#include "util/json.hpp"
|
||||||
|
|
||||||
namespace waybar::modules::SNI {
|
namespace waybar::modules::SNI {
|
||||||
|
|
||||||
class Tray : public IModule {
|
class Tray : public AModule {
|
||||||
public:
|
public:
|
||||||
Tray(const std::string&, const Json::Value&);
|
Tray(const std::string&, const Bar&, const Json::Value&);
|
||||||
|
~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;
|
||||||
std::thread thread_;
|
|
||||||
const Json::Value& config_;
|
|
||||||
Gtk::Box box_;
|
Gtk::Box box_;
|
||||||
SNI::Watcher watcher_ ;
|
SNI::Watcher::singleton watcher_;
|
||||||
SNI::Host host_;
|
SNI::Host host_;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
} // namespace waybar::modules::SNI
|
||||||
|
@ -1,16 +1,31 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <gtkmm.h>
|
|
||||||
#include <dbus-status-notifier-watcher.h>
|
#include <dbus-status-notifier-watcher.h>
|
||||||
|
#include <giomm.h>
|
||||||
|
#include <glibmm/refptr.h>
|
||||||
|
|
||||||
namespace waybar::modules::SNI {
|
namespace waybar::modules::SNI {
|
||||||
|
|
||||||
class Watcher {
|
class Watcher {
|
||||||
public:
|
private:
|
||||||
Watcher();
|
Watcher();
|
||||||
~Watcher() = default;
|
|
||||||
|
|
||||||
private:
|
public:
|
||||||
|
~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:
|
||||||
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 {
|
||||||
@ -22,26 +37,20 @@ private:
|
|||||||
guint watch_id;
|
guint watch_id;
|
||||||
} GfWatch;
|
} GfWatch;
|
||||||
|
|
||||||
void busAcquired(const Glib::RefPtr<Gio::DBus::Connection>&, Glib::ustring);
|
void busAcquired(const Glib::RefPtr<Gio::DBus::Connection> &, Glib::ustring);
|
||||||
static gboolean handleRegisterHost(Watcher *, GDBusMethodInvocation *,
|
static gboolean handleRegisterHost(Watcher *, GDBusMethodInvocation *, const gchar *);
|
||||||
const gchar *);
|
static gboolean handleRegisterItem(Watcher *, GDBusMethodInvocation *, const gchar *);
|
||||||
static gboolean handleRegisterItem(Watcher *, GDBusMethodInvocation *,
|
static GfWatch *gfWatchFind(GSList *list, const gchar *bus_name, const gchar *object_path);
|
||||||
const gchar *);
|
static GfWatch *gfWatchNew(GfWatchType, const gchar *, const gchar *, const gchar *, Watcher *);
|
||||||
static GfWatch *gfWatchFind(GSList *list, const gchar *bus_name,
|
static void nameVanished(GDBusConnection *connection, const char *name, gpointer data);
|
||||||
const gchar *object_path);
|
static void gfWatchFree(gpointer data);
|
||||||
static GfWatch *gfWatchNew(GfWatchType, const gchar *, const gchar *,
|
|
||||||
const gchar *, Watcher *);
|
|
||||||
static void nameVanished(GDBusConnection *connection, const char *name,
|
|
||||||
gpointer data);
|
|
||||||
|
|
||||||
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;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace waybar::modules::SNI
|
} // namespace waybar::modules::SNI
|
||||||
|
|
||||||
|
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
|
@ -1,11 +1,16 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <iostream>
|
#include <sigc++/sigc++.h>
|
||||||
#include <cstring>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <sys/un.h>
|
#include <sys/un.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
#include <memory>
|
||||||
|
#include <mutex>
|
||||||
|
|
||||||
#include "ipc.hpp"
|
#include "ipc.hpp"
|
||||||
|
#include "util/sleeper_thread.hpp"
|
||||||
|
|
||||||
namespace waybar::modules::sway {
|
namespace waybar::modules::sway {
|
||||||
|
|
||||||
@ -20,23 +25,27 @@ class Ipc {
|
|||||||
std::string payload;
|
std::string payload;
|
||||||
};
|
};
|
||||||
|
|
||||||
void connect();
|
sigc::signal<void, const struct ipc_response &> signal_event;
|
||||||
struct ipc_response sendCmd(uint32_t type,
|
sigc::signal<void, const struct ipc_response &> signal_cmd;
|
||||||
const std::string& payload = "") const;
|
|
||||||
void subscribe(const std::string& payload) const;
|
void sendCmd(uint32_t type, const std::string &payload = "");
|
||||||
struct ipc_response handleEvent() const;
|
void subscribe(const std::string &payload);
|
||||||
|
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";
|
||||||
static inline const size_t ipc_header_size_ = ipc_magic_.size() + 8;
|
static inline const size_t ipc_header_size_ = ipc_magic_.size() + 8;
|
||||||
|
|
||||||
const std::string getSocketPath() const;
|
const std::string getSocketPath() const;
|
||||||
int open(const std::string&) const;
|
int open(const std::string &) const;
|
||||||
struct ipc_response send(int fd, uint32_t type,
|
struct ipc_response send(int fd, uint32_t type, const std::string &payload = "");
|
||||||
const std::string& payload = "") const;
|
struct ipc_response recv(int fd);
|
||||||
struct ipc_response recv(int fd) const;
|
|
||||||
|
|
||||||
int fd_;
|
int fd_;
|
||||||
int fd_event_;
|
int fd_event_;
|
||||||
|
std::mutex mutex_;
|
||||||
|
util::SleeperThread thread_;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
} // 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,27 +1,28 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
|
|
||||||
|
#include "ALabel.hpp"
|
||||||
#include "bar.hpp"
|
#include "bar.hpp"
|
||||||
#include "client.hpp"
|
#include "client.hpp"
|
||||||
#include "util/chrono.hpp"
|
|
||||||
#include "util/json.hpp"
|
|
||||||
#include "ALabel.hpp"
|
|
||||||
#include "modules/sway/ipc/client.hpp"
|
#include "modules/sway/ipc/client.hpp"
|
||||||
|
#include "util/json.hpp"
|
||||||
|
|
||||||
namespace waybar::modules::sway {
|
namespace waybar::modules::sway {
|
||||||
|
|
||||||
class Mode : public ALabel {
|
class Mode : public ALabel, public sigc::trackable {
|
||||||
public:
|
public:
|
||||||
Mode(const std::string&, const waybar::Bar&, const Json::Value&);
|
Mode(const std::string&, const Json::Value&);
|
||||||
|
~Mode() = default;
|
||||||
auto update() -> void;
|
auto update() -> void;
|
||||||
private:
|
|
||||||
void worker();
|
|
||||||
|
|
||||||
const Bar& bar_;
|
private:
|
||||||
waybar::util::SleeperThread thread_;
|
void onEvent(const struct Ipc::ipc_response&);
|
||||||
util::JsonParser parser_;
|
|
||||||
Ipc ipc_;
|
|
||||||
std::string mode_;
|
std::string mode_;
|
||||||
|
util::JsonParser parser_;
|
||||||
|
std::mutex mutex_;
|
||||||
|
Ipc ipc_;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
} // namespace waybar::modules::sway
|
||||||
|
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,31 +1,46 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
|
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
|
|
||||||
|
#include "AIconLabel.hpp"
|
||||||
#include "bar.hpp"
|
#include "bar.hpp"
|
||||||
#include "client.hpp"
|
#include "client.hpp"
|
||||||
#include "util/chrono.hpp"
|
|
||||||
#include "util/json.hpp"
|
|
||||||
#include "ALabel.hpp"
|
|
||||||
#include "modules/sway/ipc/client.hpp"
|
#include "modules/sway/ipc/client.hpp"
|
||||||
|
#include "util/json.hpp"
|
||||||
|
|
||||||
namespace waybar::modules::sway {
|
namespace waybar::modules::sway {
|
||||||
|
|
||||||
class Window : public ALabel {
|
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;
|
||||||
auto update() -> void;
|
auto update() -> void;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void worker();
|
void onEvent(const struct Ipc::ipc_response&);
|
||||||
std::tuple<int, std::string> getFocusedNode(Json::Value nodes);
|
void onCmd(const struct Ipc::ipc_response&);
|
||||||
void getFocusedWindow();
|
std::tuple<std::size_t, int, std::string, std::string, std::string, std::string> getFocusedNode(
|
||||||
|
const Json::Value& nodes, std::string& output);
|
||||||
|
void getTree();
|
||||||
|
void updateAppIconName();
|
||||||
|
void updateAppIcon();
|
||||||
|
|
||||||
const Bar& bar_;
|
const Bar& bar_;
|
||||||
waybar::util::SleeperThread thread_;
|
|
||||||
util::JsonParser parser_;
|
|
||||||
Ipc ipc_;
|
|
||||||
std::string window_;
|
std::string window_;
|
||||||
int windowId_;
|
int windowId_;
|
||||||
|
std::string app_id_;
|
||||||
|
std::string app_class_;
|
||||||
|
std::string old_app_id_;
|
||||||
|
std::size_t app_nb_;
|
||||||
|
std::string shell_;
|
||||||
|
unsigned app_icon_size_{24};
|
||||||
|
bool update_app_icon_{true};
|
||||||
|
std::string app_icon_name_;
|
||||||
|
util::JsonParser parser_;
|
||||||
|
std::mutex mutex_;
|
||||||
|
Ipc ipc_;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
} // namespace waybar::modules::sway
|
||||||
|
@ -1,38 +1,49 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
|
#include <gtkmm/button.h>
|
||||||
|
#include <gtkmm/label.h>
|
||||||
|
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
|
#include "AModule.hpp"
|
||||||
#include "bar.hpp"
|
#include "bar.hpp"
|
||||||
#include "client.hpp"
|
#include "client.hpp"
|
||||||
#include "util/chrono.hpp"
|
|
||||||
#include "util/json.hpp"
|
|
||||||
#include "IModule.hpp"
|
|
||||||
#include "modules/sway/ipc/client.hpp"
|
#include "modules/sway/ipc/client.hpp"
|
||||||
|
#include "util/json.hpp"
|
||||||
|
|
||||||
namespace waybar::modules::sway {
|
namespace waybar::modules::sway {
|
||||||
|
|
||||||
class Workspaces : public IModule {
|
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;
|
||||||
auto update() -> void;
|
auto update() -> void;
|
||||||
operator Gtk::Widget &();
|
|
||||||
private:
|
private:
|
||||||
void worker();
|
static inline const std::string workspace_switch_cmd_ = "workspace {} \"{}\"";
|
||||||
void addWorkspace(Json::Value);
|
|
||||||
std::string getIcon(std::string, Json::Value);
|
static int convertWorkspaceNameToNum(std::string name);
|
||||||
|
|
||||||
|
void onCmd(const struct Ipc::ipc_response&);
|
||||||
|
void onEvent(const struct Ipc::ipc_response&);
|
||||||
|
bool filterButtons();
|
||||||
|
Gtk::Button& addButton(const Json::Value&);
|
||||||
|
void onButtonReady(const Json::Value&, Gtk::Button&);
|
||||||
|
std::string getIcon(const std::string&, const Json::Value&);
|
||||||
|
const std::string getCycleWorkspace(std::vector<Json::Value>::iterator, bool prev) const;
|
||||||
|
uint16_t getWorkspaceIndex(const std::string& name) const;
|
||||||
|
std::string trimWorkspaceName(std::string);
|
||||||
bool handleScroll(GdkEventScroll*);
|
bool handleScroll(GdkEventScroll*);
|
||||||
std::string getPrevWorkspace();
|
|
||||||
std::string getNextWorkspace();
|
|
||||||
|
|
||||||
const Bar& bar_;
|
const Bar& bar_;
|
||||||
const Json::Value& config_;
|
std::vector<Json::Value> workspaces_;
|
||||||
waybar::util::SleeperThread thread_;
|
std::vector<std::string> workspaces_order_;
|
||||||
Gtk::Box box_;
|
Gtk::Box box_;
|
||||||
util::JsonParser parser_;
|
util::JsonParser parser_;
|
||||||
std::mutex mutex_;
|
|
||||||
bool scrolling_;
|
|
||||||
std::unordered_map<std::string, Gtk::Button> buttons_;
|
std::unordered_map<std::string, Gtk::Button> buttons_;
|
||||||
Json::Value workspaces_;
|
std::mutex mutex_;
|
||||||
Ipc ipc_;
|
Ipc ipc_;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
} // namespace waybar::modules::sway
|
||||||
|
26
include/modules/temperature.hpp
Normal file
26
include/modules/temperature.hpp
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <fmt/format.h>
|
||||||
|
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
#include "ALabel.hpp"
|
||||||
|
#include "util/sleeper_thread.hpp"
|
||||||
|
|
||||||
|
namespace waybar::modules {
|
||||||
|
|
||||||
|
class Temperature : public ALabel {
|
||||||
|
public:
|
||||||
|
Temperature(const std::string&, const Json::Value&);
|
||||||
|
~Temperature() = default;
|
||||||
|
auto update() -> void;
|
||||||
|
|
||||||
|
private:
|
||||||
|
float getTemperature();
|
||||||
|
bool isCritical(uint16_t);
|
||||||
|
|
||||||
|
std::string file_path_;
|
||||||
|
util::SleeperThread thread_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace waybar::modules
|
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
|
@ -1,83 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <chrono>
|
|
||||||
#include <ctime>
|
|
||||||
#include <functional>
|
|
||||||
#include <condition_variable>
|
|
||||||
#include <thread>
|
|
||||||
#include <gtkmm.h>
|
|
||||||
|
|
||||||
namespace waybar::chrono {
|
|
||||||
|
|
||||||
using namespace std::chrono;
|
|
||||||
|
|
||||||
using clock = std::chrono::system_clock;
|
|
||||||
using duration = clock::duration;
|
|
||||||
using time_point = std::chrono::time_point<clock, duration>;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace waybar::util {
|
|
||||||
|
|
||||||
struct SleeperThread {
|
|
||||||
SleeperThread() = default;
|
|
||||||
|
|
||||||
SleeperThread(std::function<void()> func)
|
|
||||||
: do_run_(true), thread_{[this, func] {
|
|
||||||
while (do_run_) func();
|
|
||||||
}}
|
|
||||||
{}
|
|
||||||
|
|
||||||
SleeperThread& operator=(std::function<void()> func)
|
|
||||||
{
|
|
||||||
do_run_ = true;
|
|
||||||
thread_ = std::thread([this, func] {
|
|
||||||
while (do_run_) func();
|
|
||||||
});
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isRunnging() const
|
|
||||||
{
|
|
||||||
return do_run_;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto sleep_for(chrono::duration dur)
|
|
||||||
{
|
|
||||||
auto lock = std::unique_lock(mutex_);
|
|
||||||
return condvar_.wait_for(lock, dur);
|
|
||||||
}
|
|
||||||
|
|
||||||
auto sleep_until(chrono::time_point time)
|
|
||||||
{
|
|
||||||
auto lock = std::unique_lock(mutex_);
|
|
||||||
return condvar_.wait_until(lock, time);
|
|
||||||
}
|
|
||||||
|
|
||||||
auto wake_up()
|
|
||||||
{
|
|
||||||
condvar_.notify_all();
|
|
||||||
}
|
|
||||||
|
|
||||||
auto stop()
|
|
||||||
{
|
|
||||||
do_run_ = false;
|
|
||||||
condvar_.notify_all();
|
|
||||||
}
|
|
||||||
|
|
||||||
~SleeperThread()
|
|
||||||
{
|
|
||||||
stop();
|
|
||||||
if (thread_.joinable()) {
|
|
||||||
thread_.detach();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
bool do_run_ = false;
|
|
||||||
std::thread thread_;
|
|
||||||
std::condition_variable condvar_;
|
|
||||||
std::mutex mutex_;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
@ -1,6 +1,21 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <giomm.h>
|
||||||
|
#include <spdlog/spdlog.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#ifdef __linux__
|
||||||
|
#include <sys/prctl.h>
|
||||||
|
#endif
|
||||||
|
#ifdef __FreeBSD__
|
||||||
|
#include <sys/procctl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <array>
|
||||||
|
|
||||||
|
extern std::mutex reap_mtx;
|
||||||
|
extern std::list<pid_t> reap;
|
||||||
|
|
||||||
namespace waybar::util::command {
|
namespace waybar::util::command {
|
||||||
|
|
||||||
@ -9,13 +24,7 @@ struct res {
|
|||||||
std::string out;
|
std::string out;
|
||||||
};
|
};
|
||||||
|
|
||||||
inline struct res exec(const std::string cmd)
|
inline std::string read(FILE* fp) {
|
||||||
{
|
|
||||||
FILE* fp(popen(cmd.c_str(), "r"));
|
|
||||||
if (!fp) {
|
|
||||||
return { -1, "" };
|
|
||||||
}
|
|
||||||
|
|
||||||
std::array<char, 128> buffer = {0};
|
std::array<char, 128> buffer = {0};
|
||||||
std::string output;
|
std::string output;
|
||||||
while (feof(fp) == 0) {
|
while (feof(fp) == 0) {
|
||||||
@ -25,27 +34,129 @@ inline struct res exec(const std::string cmd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Remove last newline
|
// Remove last newline
|
||||||
if (!output.empty() && output[output.length()-1] == '\n') {
|
if (!output.empty() && output[output.length() - 1] == '\n') {
|
||||||
output.erase(output.length()-1);
|
output.erase(output.length() - 1);
|
||||||
}
|
}
|
||||||
int exit_code = WEXITSTATUS(pclose(fp));
|
return output;
|
||||||
return {exit_code, output};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool forkExec(std::string cmd) {
|
inline int close(FILE* fp, pid_t pid) {
|
||||||
if (cmd == "") return true;
|
int stat = -1;
|
||||||
|
pid_t ret;
|
||||||
|
|
||||||
int32_t pid = fork();
|
fclose(fp);
|
||||||
|
do {
|
||||||
|
ret = waitpid(pid, &stat, WCONTINUED | WUNTRACED);
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
} while (!WIFEXITED(stat) && !WIFSIGNALED(stat));
|
||||||
|
return stat;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline FILE* open(const std::string& cmd, int& pid) {
|
||||||
|
if (cmd == "") return nullptr;
|
||||||
|
int fd[2];
|
||||||
|
if (pipe(fd) != 0) {
|
||||||
|
spdlog::error("Unable to pipe fd");
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
pid_t child_pid = fork();
|
||||||
|
|
||||||
|
if (child_pid < 0) {
|
||||||
|
spdlog::error("Unable to exec cmd {}, error {}", cmd.c_str(), strerror(errno));
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
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]);
|
||||||
|
dup2(fd[1], 1);
|
||||||
|
setpgid(child_pid, child_pid);
|
||||||
|
execlp("/bin/sh", "sh", "-c", cmd.c_str(), (char*)0);
|
||||||
|
exit(0);
|
||||||
|
} else {
|
||||||
|
::close(fd[1]);
|
||||||
|
}
|
||||||
|
pid = child_pid;
|
||||||
|
return fdopen(fd[0], "r");
|
||||||
|
}
|
||||||
|
|
||||||
|
inline struct res exec(const std::string& cmd) {
|
||||||
|
int pid;
|
||||||
|
auto fp = command::open(cmd, pid);
|
||||||
|
if (!fp) return {-1, ""};
|
||||||
|
auto output = command::read(fp);
|
||||||
|
auto stat = command::close(fp, pid);
|
||||||
|
return {WEXITSTATUS(stat), output};
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
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 false;
|
return pid;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Child executes the command
|
// Child executes the command
|
||||||
if (!pid) execl("/bin/sh", "sh", "-c", cmd.c_str(), (char*)0);
|
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);
|
||||||
|
execl("/bin/sh", "sh", "-c", cmd.c_str(), (char*)0);
|
||||||
|
exit(0);
|
||||||
|
} else {
|
||||||
|
reap_mtx.lock();
|
||||||
|
reap.push_back(pid);
|
||||||
|
reap_mtx.unlock();
|
||||||
|
spdlog::debug("Added child to reap list: {}", pid);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return pid;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace waybar::util::command
|
} // namespace waybar::util::command
|
||||||
|
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,31 +1,36 @@
|
|||||||
#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 {
|
||||||
|
JsonParser() {}
|
||||||
|
|
||||||
JsonParser()
|
const Json::Value parse(const std::string& data) const {
|
||||||
: reader_(builder_.newCharReader())
|
Json::Value root(Json::objectValue);
|
||||||
{}
|
if (data.empty()) {
|
||||||
|
return root;
|
||||||
const Json::Value parse(const std::string data) const
|
}
|
||||||
{
|
std::unique_ptr<Json::CharReader> const reader(builder_.newCharReader());
|
||||||
Json::Value root;
|
|
||||||
std::string err;
|
std::string err;
|
||||||
bool res =
|
bool res = reader->parse(data.c_str(), data.c_str() + data.size(), &root, &err);
|
||||||
reader_->parse(data.c_str(), data.c_str() + data.size(), &root, &err);
|
if (!res) throw std::runtime_error(err);
|
||||||
if (!res)
|
|
||||||
throw std::runtime_error(err);
|
|
||||||
return root;
|
return root;
|
||||||
}
|
}
|
||||||
|
|
||||||
~JsonParser() = default;
|
~JsonParser() = default;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Json::CharReaderBuilder builder_;
|
Json::CharReaderBuilder builder_;
|
||||||
std::unique_ptr<Json::CharReader> const reader_;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
} // namespace waybar::util
|
||||||
|
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
|
101
include/util/sleeper_thread.hpp
Normal file
101
include/util/sleeper_thread.hpp
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
|
#include <condition_variable>
|
||||||
|
#include <ctime>
|
||||||
|
#include <functional>
|
||||||
|
#include <thread>
|
||||||
|
|
||||||
|
namespace waybar::util {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defer pthread_cancel until the end of a current scope.
|
||||||
|
*
|
||||||
|
* Required to protect a scope where it's unsafe to raise `__forced_unwind` exception.
|
||||||
|
* An example of these is a call of a method marked as `noexcept`; an attempt to cancel within such
|
||||||
|
* a method may result in a `std::terminate` call.
|
||||||
|
*/
|
||||||
|
class CancellationGuard {
|
||||||
|
int oldstate;
|
||||||
|
|
||||||
|
public:
|
||||||
|
CancellationGuard() { pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstate); }
|
||||||
|
~CancellationGuard() { pthread_setcancelstate(oldstate, &oldstate); }
|
||||||
|
};
|
||||||
|
|
||||||
|
class SleeperThread {
|
||||||
|
public:
|
||||||
|
SleeperThread() = default;
|
||||||
|
|
||||||
|
SleeperThread(std::function<void()> func)
|
||||||
|
: thread_{[this, func] {
|
||||||
|
while (do_run_) {
|
||||||
|
signal_ = false;
|
||||||
|
func();
|
||||||
|
}
|
||||||
|
}} {}
|
||||||
|
|
||||||
|
SleeperThread& operator=(std::function<void()> func) {
|
||||||
|
thread_ = std::thread([this, func] {
|
||||||
|
while (do_run_) {
|
||||||
|
signal_ = false;
|
||||||
|
func();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isRunning() const { return do_run_; }
|
||||||
|
|
||||||
|
auto sleep_for(std::chrono::system_clock::duration dur) {
|
||||||
|
std::unique_lock lk(mutex_);
|
||||||
|
CancellationGuard cancel_lock;
|
||||||
|
return condvar_.wait_for(lk, dur, [this] { return signal_ || !do_run_; });
|
||||||
|
}
|
||||||
|
|
||||||
|
auto sleep_until(
|
||||||
|
std::chrono::time_point<std::chrono::system_clock, std::chrono::system_clock::duration>
|
||||||
|
time_point) {
|
||||||
|
std::unique_lock lk(mutex_);
|
||||||
|
CancellationGuard cancel_lock;
|
||||||
|
return condvar_.wait_until(lk, time_point, [this] { return signal_ || !do_run_; });
|
||||||
|
}
|
||||||
|
|
||||||
|
auto wake_up() {
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lck(mutex_);
|
||||||
|
signal_ = true;
|
||||||
|
}
|
||||||
|
condvar_.notify_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
auto stop() {
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lck(mutex_);
|
||||||
|
signal_ = true;
|
||||||
|
do_run_ = false;
|
||||||
|
}
|
||||||
|
condvar_.notify_all();
|
||||||
|
auto handle = thread_.native_handle();
|
||||||
|
if (handle != 0) {
|
||||||
|
// TODO: find a proper way to terminate thread...
|
||||||
|
pthread_cancel(handle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
~SleeperThread() {
|
||||||
|
stop();
|
||||||
|
if (thread_.joinable()) {
|
||||||
|
thread_.join();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::thread thread_;
|
||||||
|
std::condition_variable condvar_;
|
||||||
|
std::mutex mutex_;
|
||||||
|
bool do_run_ = true;
|
||||||
|
bool signal_ = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace waybar::util
|
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-us": "AMERICA, HELL YEAH!" // For American English
|
||||||
|
"format-tr": "As bayrakları" // For Turkish
|
||||||
|
"keyboard-name": "AT Translated Set 2 keyboard"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
# STYLE
|
||||||
|
|
||||||
|
- *#language*
|
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
|
||||||
|
}
|
||||||
|
```
|
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": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
112
man/waybar-jack.5.scd
Normal file
112
man/waybar-jack.5.scd
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
waybar-jack(5)
|
||||||
|
|
||||||
|
# NAME
|
||||||
|
|
||||||
|
waybar - JACK module
|
||||||
|
|
||||||
|
# DESCRIPTION
|
||||||
|
|
||||||
|
The *jack* module displays the current state of the JACK server.
|
||||||
|
|
||||||
|
# CONFIGURATION
|
||||||
|
|
||||||
|
Addressed by *jack*
|
||||||
|
|
||||||
|
*format*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: *{load}%* ++
|
||||||
|
The format, how information should be displayed. This format is used when other formats aren't specified.
|
||||||
|
|
||||||
|
*format-connected*: ++
|
||||||
|
typeof: string ++
|
||||||
|
This format is used when the module is connected to the JACK server.
|
||||||
|
|
||||||
|
*format-disconnected*: ++
|
||||||
|
typeof: string ++
|
||||||
|
This format is used when the module is not connected to the JACK server.
|
||||||
|
|
||||||
|
*format-xrun*: ++
|
||||||
|
typeof: string ++
|
||||||
|
This format is used for one polling interval, when the JACK server reports an xrun.
|
||||||
|
|
||||||
|
*realtime*: ++
|
||||||
|
typeof: bool ++
|
||||||
|
default: *true* ++
|
||||||
|
Option to drop real-time privileges for the JACK client opened by Waybar.
|
||||||
|
|
||||||
|
*tooltip*: ++
|
||||||
|
typeof: bool ++
|
||||||
|
default: *true* ++
|
||||||
|
Option to disable tooltip on hover.
|
||||||
|
|
||||||
|
*tooltip-format*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: *{bufsize}/{samplerate} {latency}ms* ++
|
||||||
|
The format of information displayed in the tooltip.
|
||||||
|
|
||||||
|
*interval*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
default: 1 ++
|
||||||
|
The interval in which the information gets polled.
|
||||||
|
|
||||||
|
*rotate*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
Positive value to rotate the text label.
|
||||||
|
|
||||||
|
*max-length*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
The maximum length in character the module should display.
|
||||||
|
|
||||||
|
*min-length*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
The minimum length in characters the module should take up.
|
||||||
|
|
||||||
|
*align*: ++
|
||||||
|
typeof: float ++
|
||||||
|
The alignment of the text, where 0 is left-aligned and 1 is right-aligned. If the module is rotated, it will follow the flow of the text.
|
||||||
|
|
||||||
|
*on-click*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when clicked on the module.
|
||||||
|
|
||||||
|
*on-click-middle*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when middle-clicked on the module using mousewheel.
|
||||||
|
|
||||||
|
*on-click-right*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when you right clicked on the module.
|
||||||
|
|
||||||
|
*on-update*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when the module is updated.
|
||||||
|
|
||||||
|
# FORMAT REPLACEMENTS
|
||||||
|
|
||||||
|
*{load}*: The current CPU load estimated by JACK.
|
||||||
|
|
||||||
|
*{bufsize}*: The size of the JACK buffer.
|
||||||
|
|
||||||
|
*{samplerate}*: The samplerate at which the JACK server is running.
|
||||||
|
|
||||||
|
*{latency}*: The duration, in ms, of the current buffer size.
|
||||||
|
|
||||||
|
*{xruns}*: The number of xruns reported by the JACK server since starting Waybar.
|
||||||
|
|
||||||
|
# EXAMPLES
|
||||||
|
|
||||||
|
```
|
||||||
|
"jack": {
|
||||||
|
"format": "DSP {}%",
|
||||||
|
"format-xrun": "{xruns} xruns",
|
||||||
|
"format-disconnected": "DSP off",
|
||||||
|
"realtime": true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
# STYLE
|
||||||
|
|
||||||
|
- *#jack*
|
||||||
|
- *#jack.connected*
|
||||||
|
- *#jack.disconnected*
|
||||||
|
- *#jack.xrun*
|
88
man/waybar-keyboard-state.5.scd
Normal file
88
man/waybar-keyboard-state.5.scd
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
waybar-keyboard-state(5)
|
||||||
|
|
||||||
|
# NAME
|
||||||
|
|
||||||
|
waybar - keyboard-state module
|
||||||
|
|
||||||
|
# DESCRIPTION
|
||||||
|
|
||||||
|
The *keyboard-state* module displays the state of number lock, caps lock, and scroll lock.
|
||||||
|
|
||||||
|
You must be a member of the input group to use this module.
|
||||||
|
|
||||||
|
# CONFIGURATION
|
||||||
|
|
||||||
|
*interval*: ++
|
||||||
|
Deprecated, this module use event loop now, the interval has no effect.
|
||||||
|
typeof: integer ++
|
||||||
|
default: 1 ++
|
||||||
|
The interval, in seconds, to poll the keyboard state.
|
||||||
|
|
||||||
|
*format*: ++
|
||||||
|
typeof: string|object ++
|
||||||
|
default: {name} {icon} ++
|
||||||
|
The format, how information should be displayed. If a string, the same format is used for all keyboard states. If an object, the fields "numlock", "capslock", and "scrolllock" each specify the format for the corresponding state. Any unspecified states use the default format.
|
||||||
|
|
||||||
|
*format-icons*: ++
|
||||||
|
typeof: object ++
|
||||||
|
default: {"locked": "locked", "unlocked": "unlocked"} ++
|
||||||
|
Based on the keyboard state, the corresponding icon gets selected. The same set of icons is used for number, caps, and scroll lock, but the icon is selected from the set independently for each. See *icons*.
|
||||||
|
|
||||||
|
*numlock*: ++
|
||||||
|
typeof: bool ++
|
||||||
|
default: false ++
|
||||||
|
Display the number lock state.
|
||||||
|
|
||||||
|
*capslock*: ++
|
||||||
|
typeof: bool ++
|
||||||
|
default: false ++
|
||||||
|
Display the caps lock state.
|
||||||
|
|
||||||
|
*scrolllock*: ++
|
||||||
|
typeof: bool ++
|
||||||
|
default: false ++
|
||||||
|
Display the scroll lock state.
|
||||||
|
|
||||||
|
*device-path*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: chooses first valid input device ++
|
||||||
|
Which libevdev input device to show the state of. Libevdev devices can be found in /dev/input. The device should support number lock, caps lock, and scroll lock events.
|
||||||
|
|
||||||
|
# FORMAT REPLACEMENTS
|
||||||
|
|
||||||
|
*{name}*: Caps, Num, or Scroll.
|
||||||
|
|
||||||
|
*{icon}*: Icon, as defined in *format-icons*.
|
||||||
|
|
||||||
|
# ICONS
|
||||||
|
|
||||||
|
The following *format-icons* can be set.
|
||||||
|
|
||||||
|
- *locked*: Will be shown when the keyboard state is locked. Default "locked".
|
||||||
|
- *unlocked*: Will be shown when the keyboard state is not locked. Default "unlocked"
|
||||||
|
|
||||||
|
# EXAMPLE:
|
||||||
|
|
||||||
|
```
|
||||||
|
"keyboard-state": {
|
||||||
|
"numlock": true,
|
||||||
|
"capslock": true,
|
||||||
|
"format": "{name} {icon}",
|
||||||
|
"format-icons": {
|
||||||
|
"locked": "",
|
||||||
|
"unlocked": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
# STYLE
|
||||||
|
|
||||||
|
- *#keyboard-state*
|
||||||
|
- *#keyboard-state label*
|
||||||
|
- *#keyboard-state label.locked*
|
||||||
|
- *#keyboard-state label.numlock*
|
||||||
|
- *#keyboard-state label.numlock.locked*
|
||||||
|
- *#keyboard-state label.capslock*
|
||||||
|
- *#keyboard-state label.capslock.locked*
|
||||||
|
- *#keyboard-state label.scrolllock*
|
||||||
|
- *#keyboard-state label.scrolllock.locked*
|
122
man/waybar-memory.5.scd
Normal file
122
man/waybar-memory.5.scd
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
waybar-memory(5)
|
||||||
|
|
||||||
|
# NAME
|
||||||
|
|
||||||
|
waybar - memory module
|
||||||
|
|
||||||
|
# DESCRIPTION
|
||||||
|
|
||||||
|
The *memory* module displays the current memory utilization.
|
||||||
|
|
||||||
|
# CONFIGURATION
|
||||||
|
|
||||||
|
Addressed by *memory*
|
||||||
|
|
||||||
|
*interval*: ++
|
||||||
|
typeof: integer++
|
||||||
|
default: 30 ++
|
||||||
|
The interval in which the information gets polled.
|
||||||
|
|
||||||
|
*format*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: {percentage}% ++
|
||||||
|
The format, how information should be displayed.
|
||||||
|
|
||||||
|
*format-icons*: ++
|
||||||
|
typeof: array/object ++
|
||||||
|
Based on the current percentage, the corresponding icon gets selected. ++
|
||||||
|
The order is *low* to *high*. Or by the state if it is an object.
|
||||||
|
|
||||||
|
*rotate*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
Positive value to rotate the text label.
|
||||||
|
|
||||||
|
*states*: ++
|
||||||
|
typeof: object ++
|
||||||
|
A number of memory utilization states which get activated on certain percentage thresholds. 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.
|
||||||
|
|
||||||
|
# FORMAT REPLACEMENTS
|
||||||
|
|
||||||
|
*{percentage}*: Percentage of memory in use.
|
||||||
|
|
||||||
|
*{swapPercentage}*: Percentage of swap in use.
|
||||||
|
|
||||||
|
*{total}*: Amount of total memory available in GiB.
|
||||||
|
|
||||||
|
*{swapTotal}*: Amount of total swap available in GiB.
|
||||||
|
|
||||||
|
*{used}*: Amount of used memory in GiB.
|
||||||
|
|
||||||
|
*{swapUsed}*: Amount of used swap in GiB.
|
||||||
|
|
||||||
|
*{avail}*: Amount of available memory in GiB.
|
||||||
|
|
||||||
|
*{swapAvail}*: Amount of available swap in GiB.
|
||||||
|
|
||||||
|
# EXAMPLES
|
||||||
|
|
||||||
|
```
|
||||||
|
"memory": {
|
||||||
|
"interval": 30,
|
||||||
|
"format": "{}% ",
|
||||||
|
"max-length": 10
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## FORMATTED MEMORY VALUES
|
||||||
|
|
||||||
|
```
|
||||||
|
"memory": {
|
||||||
|
"interval": 30,
|
||||||
|
"format": "{used:0.1f}G/{total:0.1f}G "
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
# STYLE
|
||||||
|
|
||||||
|
- *#memory*
|
246
man/waybar-mpd.5.scd
Normal file
246
man/waybar-mpd.5.scd
Normal file
@ -0,0 +1,246 @@
|
|||||||
|
waybar-mpd(5)
|
||||||
|
|
||||||
|
# NAME
|
||||||
|
|
||||||
|
waybar - mpd module
|
||||||
|
|
||||||
|
# DESCRIPTION
|
||||||
|
|
||||||
|
The *mpd* module displays information about a running "Music Player Daemon" instance.
|
||||||
|
|
||||||
|
# CONFIGURATION
|
||||||
|
|
||||||
|
Addressed by *mpd*
|
||||||
|
|
||||||
|
*server*: ++
|
||||||
|
typeof: string ++
|
||||||
|
The network address or Unix socket path of the MPD server. If empty, connect to the default host.
|
||||||
|
|
||||||
|
*port*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
The port MPD listens to. If empty, use the default port.
|
||||||
|
|
||||||
|
*password*: ++
|
||||||
|
typeof: string ++
|
||||||
|
The password required to connect to the MPD server. If empty, no password is sent to MPD.
|
||||||
|
|
||||||
|
*interval*: ++
|
||||||
|
typeof: integer++
|
||||||
|
default: 5 ++
|
||||||
|
The interval in which the connection to the MPD server is retried
|
||||||
|
|
||||||
|
*timeout*: ++
|
||||||
|
typeof: integer++
|
||||||
|
default: 30 ++
|
||||||
|
The timeout for the connection. Change this if your MPD server has a low `connection_timeout` setting
|
||||||
|
|
||||||
|
*unknown-tag*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: "N/A" ++
|
||||||
|
The text to display when a tag is not present in the current song, but used in `format`
|
||||||
|
|
||||||
|
*format*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: "{album} - {artist} - {title}" ++
|
||||||
|
Information displayed when a song is playing.
|
||||||
|
|
||||||
|
*format-stopped*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: "stopped" ++
|
||||||
|
Information displayed when the player is stopped.
|
||||||
|
|
||||||
|
*format-paused*: ++
|
||||||
|
typeof: string ++
|
||||||
|
This format is used when a song is paused.
|
||||||
|
|
||||||
|
*format-disconnected*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: "disconnected" ++
|
||||||
|
Information displayed when the MPD server can't be reached.
|
||||||
|
|
||||||
|
*tooltip*: ++
|
||||||
|
typeof: bool ++
|
||||||
|
default: true ++
|
||||||
|
Option to disable tooltip on hover.
|
||||||
|
|
||||||
|
*tooltip-format*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: "MPD (connected)" ++
|
||||||
|
Tooltip information displayed when connected to MPD.
|
||||||
|
|
||||||
|
*tooltip-format-disconnected*: ++
|
||||||
|
typeof: string ++
|
||||||
|
default: "MPD (disconnected)" ++
|
||||||
|
Tooltip information displayed when the MPD server can't be reached.
|
||||||
|
|
||||||
|
*artist-len*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
Maximum length of the Artist tag.
|
||||||
|
|
||||||
|
*album-len*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
Maximum length of the Album tag.
|
||||||
|
|
||||||
|
*album-artist-len*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
Maximum length of the Album Artist tag.
|
||||||
|
|
||||||
|
*title-len*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
Maximum length of the Title tag.
|
||||||
|
|
||||||
|
*rotate*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
Positive value to rotate the text label.
|
||||||
|
|
||||||
|
*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.
|
||||||
|
|
||||||
|
*state-icons*: ++
|
||||||
|
typeof: object ++
|
||||||
|
default: {} ++
|
||||||
|
Icon to show depending on the play/pause state of the player (*{ "playing": "...", "paused": "..." }*)
|
||||||
|
|
||||||
|
*consume-icons*: ++
|
||||||
|
typeof: object ++
|
||||||
|
default: {} ++
|
||||||
|
Icon to show depending on the "consume" option (*{ "on": "...", "off": "..." }*)
|
||||||
|
|
||||||
|
*random-icons*: ++
|
||||||
|
typeof: object ++
|
||||||
|
default: {} ++
|
||||||
|
Icon to show depending on the "random" option (*{ "on": "...", "off": "..." }*)
|
||||||
|
|
||||||
|
*repeat-icons*: ++
|
||||||
|
typeof: object ++
|
||||||
|
default: {} ++
|
||||||
|
Icon to show depending on the "repeat" option (*{ "on": "...", "off": "..." }*)
|
||||||
|
|
||||||
|
*single-icons*: ++
|
||||||
|
typeof: object ++
|
||||||
|
default: {} ++
|
||||||
|
Icon to show depending on the "single" option (*{ "on": "...", "off": "..." }*)
|
||||||
|
|
||||||
|
# FORMAT REPLACEMENTS
|
||||||
|
|
||||||
|
## WHEN PLAYING/PAUSED
|
||||||
|
|
||||||
|
*{artist}*: The artist of the current song
|
||||||
|
|
||||||
|
*{albumArtist}*: The artist of the current album
|
||||||
|
|
||||||
|
*{album}*: The album of the current song
|
||||||
|
|
||||||
|
*{title}*: The title of the current song
|
||||||
|
|
||||||
|
*{date}*: The date of the current song
|
||||||
|
|
||||||
|
*{volume}*: The current volume in percent
|
||||||
|
|
||||||
|
*{elapsedTime}*: The current position of the current song. To format as a date/time (see example configuration)
|
||||||
|
|
||||||
|
*{totalTime}*: The length of the current song. To format as a date/time (see example configuration)
|
||||||
|
|
||||||
|
*{songPosition}*: The position of the current song.
|
||||||
|
|
||||||
|
*{queueLength}*: The length of the current queue.
|
||||||
|
|
||||||
|
*{stateIcon}*: The icon corresponding the playing or paused status of the player (see *state-icons* option)
|
||||||
|
|
||||||
|
*{consumeIcon}*: The icon corresponding the "consume" option (see *consume-icons* option)
|
||||||
|
|
||||||
|
*{randomIcon}*: The icon corresponding the "random" option (see *random-icons* option)
|
||||||
|
|
||||||
|
*{repeatIcon}*: The icon corresponding the "repeat" option (see *repeat-icons* option)
|
||||||
|
|
||||||
|
*{singleIcon}*: The icon corresponding the "single" option (see *single-icons* option)
|
||||||
|
|
||||||
|
|
||||||
|
## WHEN STOPPED
|
||||||
|
|
||||||
|
*{consumeIcon}*: The icon corresponding the "consume" option (see *consume-icons* option)
|
||||||
|
|
||||||
|
*{randomIcon}*: The icon corresponding the "random" option (see *random-icons* option)
|
||||||
|
|
||||||
|
*{repeatIcon}*: The icon corresponding the "repeat" option (see *repeat-icons* option)
|
||||||
|
|
||||||
|
*{singleIcon}*: The icon corresponding the "single" option (see *single-icons* option)
|
||||||
|
|
||||||
|
## WHEN DISCONNECTED
|
||||||
|
|
||||||
|
Currently, no format replacements when disconnected.
|
||||||
|
|
||||||
|
# EXAMPLES
|
||||||
|
|
||||||
|
```
|
||||||
|
"mpd": {
|
||||||
|
"format": "{stateIcon} {consumeIcon}{randomIcon}{repeatIcon}{singleIcon}{artist} - {album} - {title} ({elapsedTime:%M:%S}/{totalTime:%M:%S}) ",
|
||||||
|
"format-disconnected": "Disconnected ",
|
||||||
|
"format-stopped": "{consumeIcon}{randomIcon}{repeatIcon}{singleIcon}Stopped ",
|
||||||
|
"interval": 2,
|
||||||
|
"consume-icons": {
|
||||||
|
"on": " " // Icon shows only when "consume" is on
|
||||||
|
},
|
||||||
|
"random-icons": {
|
||||||
|
"off": "<span color=\"#f53c3c\"></span> ", // Icon grayed out when "random" is off
|
||||||
|
"on": " "
|
||||||
|
},
|
||||||
|
"repeat-icons": {
|
||||||
|
"on": " "
|
||||||
|
},
|
||||||
|
"single-icons": {
|
||||||
|
"on": "1 "
|
||||||
|
},
|
||||||
|
"state-icons": {
|
||||||
|
"paused": "",
|
||||||
|
"playing": ""
|
||||||
|
},
|
||||||
|
"tooltip-format": "MPD (connected)",
|
||||||
|
"tooltip-format-disconnected": "MPD (disconnected)"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
# STYLE
|
||||||
|
|
||||||
|
- *#mpd*
|
||||||
|
- *#mpd.disconnected*
|
||||||
|
- *#mpd.stopped*
|
||||||
|
- *#mpd.playing*
|
||||||
|
- *#mpd.paused*
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user