Compare commits

...

48 Commits

Author SHA1 Message Date
b58a7327f2 Minor edits 2024-04-12 07:51:25 -07:00
885ee3d66f Backlight fixes 2024-04-11 16:21:10 -07:00
219873c890 Typo 2023-10-10 11:29:52 -07:00
01e1b307f1 Merge branch 'master' of ssh://git.betalupi.com:33/Mark/awesomewm 2023-10-10 11:29:02 -07:00
392d75f182 Fixed keybinds 2023-10-10 11:27:45 -07:00
4427954ba0 Default config edits 2023-10-10 11:27:19 -07:00
de13fa6bcb Path change 2023-10-10 11:14:56 -07:00
9e2d872968 Added config defaults 2023-10-10 10:57:39 -07:00
0db5c9fb0c Added code icon 2023-10-10 10:54:35 -07:00
38d690c5aa Fixed config template 2023-09-03 09:29:33 -07:00
c38530d5a7 Disabled volume and brightness popups 2023-09-03 09:27:26 -07:00
e78351850e Cleanup 2023-09-03 09:27:04 -07:00
5d8912036a Improved icons 2023-09-03 09:26:33 -07:00
638f1efc3a Added default clienticon 2023-09-03 09:26:07 -07:00
73881d7d05 Fixed mpc volume and title 2023-09-02 18:26:22 -07:00
187ebbadb6 Minor optimization 2023-08-26 19:26:25 -07:00
003aa55726 changed battery widget 2023-08-26 18:05:21 -07:00
7a34cbe48d Minor cleanup 2023-08-26 17:55:11 -07:00
079bef1e52 Changed backlight widget 2023-08-26 17:38:33 -07:00
17da29c03e Comments 2023-08-26 17:34:50 -07:00
0920081084 Added new volume widget 2023-08-26 17:34:37 -07:00
0f0e56174d Added launcher icon config 2023-08-23 09:38:40 -07:00
c89670f53d mpc widget edits 2023-08-23 09:16:33 -07:00
90804f75bb Merge branch 'master' of ssh://git.betalupi.com:33/Mark/awesomewm 2023-08-23 08:10:11 -07:00
6d836901aa Removed useless backlight script 2023-08-23 08:09:31 -07:00
84cfee9afa Fixed textclock font 2023-08-22 22:00:17 -07:00
45c0c935a8 Fixed font name 2023-08-22 09:00:24 -07:00
6308f00345 Use acpi for battery 2023-08-21 19:53:40 -07:00
23e3adc741 Moved fonts to config file 2023-08-21 19:00:27 -07:00
459e31371f Minor cleanup 2023-08-21 16:09:33 -07:00
eccf6c17b4 Changed config loading 2023-08-21 16:07:59 -07:00
37735ae085 Show popup on hover 2022-11-19 10:20:15 -08:00
7f9549f651 Fixed sound
Closes #17
2022-11-05 17:03:16 -07:00
b7a7798611 Improved popups 2022-11-05 11:40:42 -07:00
4b2e2c8815 typo 2022-11-05 11:35:37 -07:00
40634f0de5 Added backlight popup 2022-11-05 11:31:12 -07:00
e5b253411f Added volume step 2022-11-05 09:54:25 -07:00
bb27fcfaa0 Cleaned up volume widget 2022-11-05 09:47:15 -07:00
76e7547151 README 2022-11-05 09:46:56 -07:00
9ca3a7147d Cleanup 2022-11-05 08:44:42 -07:00
c414473b4c Cleanup
Closes #1
2022-11-05 08:42:16 -07:00
b65616d1cc Removed volume notification 2022-11-05 08:29:49 -07:00
b1c1c8faa6 Minor cleanup 2022-11-05 08:16:41 -07:00
03e9fbe124 Added volume popup 2022-11-05 08:12:13 -07:00
b70603504e Added for_each_screen module value 2022-11-05 08:08:15 -07:00
765c4232a8 Blur config 2022-11-05 08:04:18 -07:00
77106d60f4 Changed keymap order 2022-11-05 08:04:04 -07:00
8c59220b6a Added blur config 2022-11-05 07:27:24 -07:00
54 changed files with 1689 additions and 632 deletions

View File

@ -1,16 +1,22 @@
# Awesome Window Manager config scripts
# Mark's Awesomewm Config
## Setup
Copy config.lua.template into config.lua before using.
## Modules
See the [modules](./modules/README.md) README.
## Dependencies
Some features require extra tools. Tools each module requires are listed below. If a module is disabled, its tool is not needed. Applications required by `core` MUST be installed.
- Core: `fish`, `sox` (and plugins)
- Backlight: `xbacklight`
- Battery: `acpi`
- Ibus: `ibus`
- Launcher: `rofi`
- Lock: `i3lock, imagemagick, scrot` or `lightdm` (For `dm-tool`), depending on configuration.
- MPC: `mpc`
- Picom: `picom`
- Screenshot: `flameshot`, `tesseract (and data)`, `xclip`, `lpr`
- Volume: `pamixer`
- rofi
- fish
- upower, xbacklight
- flameshot, xclip, tesseract
- pamixer
- sox
- ibus
- redshift
- mpc

View File

@ -7,5 +7,7 @@ return {
signal = conf_dir .. "assets/apps/signal.svg",
terminal = conf_dir .. "assets/apps/terminal.svg",
thunderbird = conf_dir .. "assets/apps/thunderbird.svg",
writer = conf_dir .. "assets/apps/writer.svg"
writer = conf_dir .. "assets/apps/writer.svg",
phone = conf_dir .. "assets/apps/phone.svg",
code = conf_dir .. "assets/apps/code.svg",
}

13
assets/apps/code.svg Normal file
View File

@ -0,0 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" version="1">
<rect style="opacity:0.2" width="56" height="48" x="4" y="9" rx="2.8" ry="2.4"/>
<rect style="fill:#167abf" width="56" height="48" x="4" y="8" rx="2.8" ry="2.4"/>
<path style="fill:#ffffff;opacity:0.1" d="M 6.8007812 8 C 5.2495813 8 4 9.0707908 4 10.400391 L 4 11.400391 C 4 10.070791 5.2495813 9 6.8007812 9 L 57.199219 9 C 58.750419 9 60 10.070791 60 11.400391 L 60 10.400391 C 60 9.0707908 58.750419 8 57.199219 8 L 6.8007812 8 z"/>
<path style="opacity:0.2" d="m 6.8,7.9999992 c -1.5512,0 -2.8,1.0692973 -2.8,2.3988968 v 43.202207 c 0,1.3296 1.2488,2.398898 2.8,2.398898 H 22.2 V 7.9999992 Z"/>
<path style="opacity:0.2" d="M 21.955078,4.9143037 A 3.0003,3.0003 0 0 0 19,7.9572725 V 57.957273 a 3.0003,3.0003 0 1 0 6,0 V 7.9572725 A 3.0003,3.0003 0 0 0 21.955078,4.9143037 Z m 8.087891,7.0429693 a 3.0003,3.0003 0 1 0 0,6 H 41 a 3.0003,3.0003 0 1 0 0,-6 z m 4,9 a 3.0003,3.0003 0 1 0 0,6 H 48 a 3.0003,3.0003 0 1 0 0,-6 z m 0,9 a 3.0003,3.0003 0 1 0 0,6 H 48 a 3.0003,3.0003 0 1 0 0,-6 z m 0,9 a 3.0003,3.0003 0 1 0 0,6 H 48 a 3.0003,3.0003 0 1 0 0,-6 z m -4,9 a 3.0003,3.0003 0 1 0 0,6 H 41 a 3.0003,3.0003 0 1 0 0,-6 z"/>
<path style="fill:none;stroke:#ffffff;stroke-width:6;stroke-linecap:round" d="M 22,7 V 57"/>
<path style="fill:none;stroke:#ffffff;stroke-width:6;stroke-linecap:round" d="M 30.042727,13.9994 H 41"/>
<path style="fill:none;stroke:#ffffff;stroke-width:6;stroke-linecap:round" d="M 34.042727,22.9997 H 48"/>
<path style="fill:none;stroke:#ffffff;stroke-width:6;stroke-linecap:round" d="M 34.042727,31.9997 H 48"/>
<path style="fill:none;stroke:#ffffff;stroke-width:6;stroke-linecap:round" d="M 34.042727,40.9997 H 48"/>
<path style="fill:none;stroke:#ffffff;stroke-width:6;stroke-linecap:round" d="M 30.042727,49.9997 H 41"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

8
assets/apps/phone.svg Normal file
View File

@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" version="1">
<rect style="opacity:0.2" width="40" height="60" x="12" y="3" rx="3" ry="3"/>
<path style="fill:#595959" d="M 15 2 C 13.338 2 12 3.338 12 5 L 12 8 L 52 8 L 52 5 C 52 3.338 50.662 2 49 2 L 15 2 z M 12 54 L 12 59 C 12 60.662 13.338 62 15 62 L 49 62 C 50.662 62 52 60.662 52 59 L 52 54 L 12 54 z"/>
<rect style="fill:#333333" width="40" height="46" x="12" y="8"/>
<path style="fill:#333333" d="M 28.25 4 C 27.5575 4 27 4.446 27 5 C 27 5.554 27.5575 6 28.25 6 L 35.75 6 C 36.4425 6 37 5.554 37 5 C 37 4.446 36.4425 4 35.75 4 L 28.25 4 z M 40 4 A 1 1 0 0 0 39 5 A 1 1 0 0 0 40 6 A 1 1 0 0 0 41 5 A 1 1 0 0 0 40 4 z M 30.5 55 C 29.669 55 29 55.669 29 56.5 L 29 59.5 C 29 60.331 29.669 61 30.5 61 L 33.5 61 C 34.331 61 35 60.331 35 59.5 L 35 56.5 C 35 55.669 34.331 55 33.5 55 L 30.5 55 z M 19.5 56 C 18.669 56 18 56.669 18 57.5 C 18 58.331 18.669 59 19.5 59 L 22.5 59 C 23.331 59 24 58.331 24 57.5 C 24 56.669 23.331 56 22.5 56 L 19.5 56 z M 41.5 56 C 40.669 56 40 56.669 40 57.5 C 40 58.331 40.669 59 41.5 59 L 44.5 59 C 45.331 59 46 58.331 46 57.5 C 46 56.669 45.331 56 44.5 56 L 41.5 56 z"/>
<path style="fill:#ffffff;opacity:0.1" d="M 15 2 C 13.338 2 12 3.338 12 5 L 12 6 C 12 4.338 13.338 3 15 3 L 49 3 C 50.662 3 52 4.338 52 6 L 52 5 C 52 3.338 50.662 2 49 2 L 15 2 z"/>
<rect style="opacity:0.2" width="40" height="1" x="12" y="8"/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -1,11 +1,15 @@
-- Some subdir variables,
-- to make switching icon sets easy.
local brightnessdir = conf_dir .. "assets/icons/brightness/clockwise/"
local brightnessdir = conf_dir .. "assets/icons/brightness/counterclockwise/"
local titlebardir = conf_dir .. "assets/icons/titlebar/"
return {
submenu = conf_dir .. "assets/icons/submenu.svg",
launcher = conf_dir .. "assets/icons/arch.svg",
arch = conf_dir .. "assets/icons/arch.svg",
nix = conf_dir .. "assets/icons/nix.svg",
sys76 = conf_dir .. "assets/icons/sys76.svg",
nix_grey = conf_dir .. "assets/icons/nix-grey.svg",
arch_grey = conf_dir .. "assets/icons/arch-grey.svg",
music = {
grey = {

38
assets/icons/arch-grey.svg Executable file
View File

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="512"
height="512"
version="1.1"
id="svg8"
sodipodi:docname="arch-grey.svg"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs12" />
<sodipodi:namedview
id="namedview10"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showgrid="false"
inkscape:zoom="0.94931588"
inkscape:cx="1025.4753"
inkscape:cy="524.5883"
inkscape:window-width="3200"
inkscape:window-height="1696"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg8" />
<path
style="opacity:1;fill:#a3a3a3;fill-opacity:1;fill-rule:evenodd;stroke-width:9.14289"
d="M 255.9559,0.01280001 C 233.16217,55.8841 219.41473,92.430208 194.03744,146.63496 209.59643,163.12501 224.98314,179.4548 256,201.14286 222.65435,187.42399 203.62144,176.52388 186.62345,162.23158 154.14583,229.98881 103.26064,326.50472 0,512 c 81.159513,-46.84357 137.67092,-75.72385 196.30682,-86.74451 -2.51776,-10.82611 -3.94935,-22.53668 -3.85205,-34.75541 l 0.0896,-2.59965 c 1.28769,-51.98526 35.30506,-95.25882 66.77374,-95.329 31.46869,-0.0705 62.07084,53.16378 60.7829,105.14906 -0.24196,9.7829 -1.34595,19.19207 -3.27402,27.92027 57.99577,11.34321 115.11197,40.14926 195.173,86.35924 -15.78689,-29.05692 -29.87741,-55.25051 -43.33294,-80.1974 -21.19597,-16.42476 -39.57118,-33.80335 -84.66706,-56.94545 30.99636,8.05238 49.45735,13.34536 66.75623,23.72987 C 313.94768,143.9214 302.87344,110.07863 255.95193,0 Z"
id="path2" />
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -1,5 +1,46 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" version="1.1">
<path style="opacity:0.2;fill-rule:evenodd" d="M 31.995177,5.0013995 C 29.502112,11.112323 27.998486,15.109554 25.222845,21.038199 26.924609,22.841797 28.607531,24.627869 32,27 28.35282,25.499498 26.271095,24.307299 24.41194,22.744078 20.8597,30.155025 15.294132,40.711453 4.0000002,61 12.876822,55.876484 19.057757,52.717703 25.471058,51.512319 25.195678,50.328213 25.039098,49.04737 25.049741,47.710946 l 0.0098,-0.284337 C 25.200382,41.740721 28.921032,37.007676 32.362919,37 c 3.441888,-0.0077 6.788998,5.814788 6.648129,11.500678 -0.02646,1.070005 -0.147212,2.099133 -0.358095,3.05378 C 44.99624,52.795122 51.243325,55.945783 60,61 58.273309,57.821899 56.732158,54.956976 55.26046,52.228409 52.94215,50.431951 50.932361,48.531168 46,46 c 3.390226,0.880729 5.409397,1.459649 7.301462,2.595455 C 38.338028,20.741402 37.126783,17.03985 31.994742,4.9999995 Z"/>
<path style="fill:#1793d1;fill-rule:evenodd" d="M 31.995177,4.0013995 C 29.502112,10.112323 27.998486,14.109554 25.222845,20.038199 26.924609,21.841797 28.607531,23.627869 32,26 28.35282,24.499498 26.271095,23.307299 24.41194,21.744078 20.8597,29.155025 15.294132,39.711453 4.0000002,60 12.876822,54.876484 19.057757,51.717703 25.471058,50.512319 25.195678,49.328213 25.039098,48.04737 25.049741,46.710946 l 0.0098,-0.284337 C 25.200382,40.740721 28.921032,36.007676 32.362919,36 c 3.441888,-0.0077 6.788998,5.814788 6.648129,11.500678 -0.02646,1.070005 -0.147212,2.099133 -0.358095,3.05378 C 44.99624,51.795122 51.243325,54.945783 60,60 58.273309,56.821899 56.732158,53.956976 55.26046,51.228409 52.94215,49.431951 50.932361,47.531168 46,45 c 3.390226,0.880729 5.409397,1.459649 7.301462,2.595455 C 38.338028,19.741402 37.126783,16.03985 31.994742,3.9999995 Z"/>
<path style="fill:#ffffff;fill-rule:evenodd;opacity:0.2" d="M 31.996094 4.0039062 C 29.503492 10.113758 27.998009 14.111032 25.222656 20.039062 C 25.323 20.145411 25.42873 20.253025 25.529297 20.359375 C 28.094806 14.819153 29.605533 10.863636 31.996094 5.0039062 C 37.029258 16.812002 38.370111 20.737759 52.542969 47.173828 C 52.799752 47.306209 53.051272 47.445923 53.300781 47.595703 C 38.339229 19.745153 37.126504 16.040146 31.996094 4.0039062 z M 24.412109 21.744141 C 20.859869 29.155088 15.294132 39.711453 4 60 C 4.2790559 59.838935 4.5328222 59.696245 4.8066406 59.539062 C 15.496107 40.307372 20.956001 29.95453 24.412109 22.744141 C 26.271264 24.307362 28.35282 25.499498 32 27 C 30.744922 26.122406 29.773063 25.343432 28.898438 24.595703 C 27.047844 23.676699 25.658286 22.791955 24.412109 21.744141 z M 46 46 C 50.932361 48.531168 52.941456 50.432058 55.259766 52.228516 C 56.488953 54.507462 57.825027 56.982477 59.21875 59.554688 C 59.483717 59.706715 59.730349 59.844362 60 60 C 58.273309 56.821899 56.731464 53.957083 55.259766 51.228516 C 53.590647 49.935116 52.064892 48.584211 49.509766 46.986328 C 48.498719 46.669238 47.382852 46.359244 46 46 z M 25.064453 47.345703 C 25.063622 47.372706 25.059264 47.398735 25.058594 47.425781 L 25.048828 47.710938 C 25.040995 48.694489 25.125285 49.647751 25.279297 50.554688 C 25.343143 50.542292 25.406814 50.523727 25.470703 50.511719 C 25.239369 49.517004 25.099409 48.452553 25.064453 47.345703 z M 39 47.652344 C 38.966126 48.666573 38.852993 49.646368 38.652344 50.554688 C 38.705667 50.565117 38.759189 50.581098 38.8125 50.591797 C 38.915197 49.916489 38.99384 49.223001 39.011719 48.5 C 39.018717 48.217524 39.009803 47.934762 39 47.652344 z"/>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="512"
height="512"
version="1.1"
id="svg8"
sodipodi:docname="arch.svg"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs12" />
<sodipodi:namedview
id="namedview10"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showgrid="false"
inkscape:zoom="1.7307882"
inkscape:cx="261.44158"
inkscape:cy="162.35378"
inkscape:window-width="3200"
inkscape:window-height="1696"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg8" />
<path
style="opacity:0.2;fill-rule:evenodd;stroke-width:8.98246"
d="M 255.95668,8.9950315 C 233.56281,63.886133 220.05655,99.79108 195.12444,153.04488 210.41048,169.24562 225.52727,185.28893 256,206.59649 223.23934,193.1183 204.54031,182.40942 187.84052,168.36786 155.93265,234.93637 105.94013,329.75902 4.4910018,512 84.226737,465.97824 139.74676,437.60463 197.35402,426.77732 c -2.4736,-10.63618 -3.88008,-22.14129 -3.78448,-34.14566 l 0.088,-2.55405 c 1.2651,-51.07324 34.6857,-93.58761 65.60233,-93.65656 30.91664,-0.0692 60.98194,52.23108 59.71659,103.30434 -0.23768,9.61127 -1.32232,18.85537 -3.21658,27.43044 56.97835,11.14421 113.09257,39.44489 191.74909,84.84417 -15.50994,-28.54715 -29.35328,-54.2812 -42.57275,-78.79043 -20.82414,-16.13661 -38.87699,-33.21031 -83.18176,-55.94641 30.45259,7.91111 48.58973,13.11123 65.58513,23.31356 C 312.93111,150.37891 302.05114,117.12988 255.95277,8.9824565 Z"
id="path2" />
<path
style="fill:#1793d1;fill-rule:evenodd;stroke-width:8.98246"
d="M 255.95668,0.0125754 C 233.56281,54.903677 220.05655,90.808629 195.12444,144.06242 210.41048,160.26316 225.52727,176.30647 256,197.61404 223.23934,184.13584 204.54031,173.42697 187.84052,159.3854 155.93265,225.95391 105.94013,320.77656 4.4910018,503.01754 84.226737,456.99579 139.74676,428.62217 197.35402,417.79487 c -2.4736,-10.63618 -3.88008,-22.1413 -3.78448,-34.14567 l 0.088,-2.55404 c 1.2651,-51.07324 34.6857,-93.58761 65.60233,-93.65656 30.91664,-0.0692 60.98194,52.23108 59.71659,103.30433 -0.23768,9.61128 -1.32232,18.85537 -3.21658,27.43045 56.97835,11.14421 113.09257,39.44488 191.74909,84.84416 -15.50994,-28.54715 -29.35328,-54.28119 -42.57275,-78.79043 -20.82414,-16.1366 -38.87699,-33.2103 -83.18176,-55.94641 30.45259,7.91111 48.58973,13.11124 65.58513,23.31356 C 312.93111,141.39646 302.05114,108.14743 255.95277,0 Z"
id="path4" />
<path
style="opacity:0.2;fill:#ffffff;fill-rule:evenodd;stroke-width:8.98246"
d="M 255.96491,0.0350918 C 233.57521,54.916567 220.05226,90.821905 195.12275,144.07017 c 0.90134,0.95528 1.85106,1.92192 2.75439,2.8772 23.0446,-49.7648 36.61465,-85.295057 58.08777,-137.9298225 45.21022,106.0657025 57.25438,141.3286425 184.56158,378.7894725 2.30654,1.1891 4.56581,2.44408 6.80701,3.78947 C 312.9419,141.43015 302.04864,108.15009 255.96491,0.0350918 Z M 187.84204,159.38597 C 155.93417,225.95448 105.94013,320.77656 4.491,503.01754 6.99761,501.57078 9.277056,500.28908 11.736621,498.87719 107.75437,326.12938 156.79767,233.13543 187.84204,168.36843 204.54183,182.40999 223.23934,193.1183 256,206.59649 244.72631,198.71354 235.99662,191.71644 228.14033,185 211.51744,176.74509 199.03578,168.79791 187.84204,159.38597 Z m 193.91245,217.87719 c 44.30477,22.7361 62.35139,39.81076 83.17553,55.94737 11.04112,20.47053 23.04236,42.70225 35.56143,65.80702 2.38006,1.36557 4.59542,2.60198 7.01755,3.99999 -15.50994,-28.54715 -29.35951,-54.28023 -42.57898,-78.78947 -14.9928,-11.6179 -28.69785,-23.75235 -51.64918,-38.10526 -9.08168,-2.84825 -19.10492,-5.63276 -31.52635,-8.85965 z m -188.0528,12.08772 c -0.007,0.24252 -0.0467,0.47634 -0.053,0.71931 l -0.088,2.56141 c -0.0701,8.83471 0.6868,17.39734 2.07018,25.54386 0.57354,-0.11138 1.14542,-0.2781 1.7193,-0.38597 -2.07795,-8.93499 -3.33514,-18.49637 -3.64913,-28.4386 z m 125.17556,2.75439 c -0.30423,9.11026 -1.32048,17.91123 -3.12281,26.07017 0.47895,0.0937 0.95974,0.23723 1.4386,0.33334 0.92247,-6.06592 1.62888,-12.29515 1.78948,-18.78947 0.0629,-2.53733 -0.0171,-5.07723 -0.10528,-7.61404 z"
id="path6" />
</svg>

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

113
assets/icons/nix-grey.svg Normal file
View File

@ -0,0 +1,113 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="512"
height="512"
viewBox="0 0 480.00001 480"
id="svg2"
version="1.1"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
sodipodi:docname="nix-grey.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.7494491"
inkscape:cx="126.03968"
inkscape:cy="287.51908"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1600"
inkscape:window-height="1696"
inkscape:window-x="1600"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:snap-global="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:showpageshadow="2"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showguides="true" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="print-logo"
inkscape:groupmode="layer"
id="layer1"
style="display:inline"
transform="translate(-132.5822,958.04022)">
<g
id="g251"
transform="matrix(0.95674018,0,0,0.95674018,-16.993334,-33.377468)"
style="fill:#a4a4a4;fill-opacity:1">
<path
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#a4a4a4;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 309.40365,-710.2521 122.19683,211.6751 -56.15706,0.5268 -32.6236,-56.8692 -32.85645,56.5653 -27.90237,-0.011 -14.29086,-24.6896 46.81047,-80.4902 -33.22946,-57.8256 z"
id="path4861"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccccc" />
<path
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#a4a4a4;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 353.50926,-797.4433 -122.21756,211.6631 -28.53477,-48.37 32.93839,-56.6875 -65.41521,-0.1719 -13.9414,-24.1698 14.23637,-24.721 93.11177,0.2939 33.46371,-57.6903 z"
id="use4863"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccccc" />
<path
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#a4a4a4;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 362.88537,-628.243 244.41439,0.012 -27.62229,48.8968 -65.56199,-0.1817 32.55876,56.7371 -13.96098,24.1585 -28.52722,0.032 -46.3013,-80.7841 -66.69317,-0.1353 z"
id="use4865"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccccc" />
<path
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#a4a4a4;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 505.14318,-720.9886 -122.19683,-211.6751 56.15706,-0.5268 32.6236,56.8692 32.85645,-56.5653 27.90237,0.011 14.29086,24.6896 -46.81047,80.4902 33.22946,57.8256 z"
id="use4867"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccccc" />
<path
sodipodi:nodetypes="cccccccccc"
inkscape:connector-curvature="0"
id="path4873"
d="m 309.40365,-710.2521 122.19683,211.6751 -56.15706,0.5268 -32.6236,-56.8692 -32.85645,56.5653 -27.90237,-0.011 -14.29086,-24.6896 46.81047,-80.4902 -33.22946,-57.8256 z"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#a4a4a4;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
<path
sodipodi:nodetypes="cccccccccc"
inkscape:connector-curvature="0"
id="use4875"
d="m 451.3364,-803.53264 -244.4144,-0.012 27.62229,-48.89685 65.56199,0.18175 -32.55875,-56.73717 13.96097,-24.15851 28.52722,-0.0315 46.3013,80.78414 66.69317,0.13524 z"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#a4a4a4;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
<path
sodipodi:nodetypes="cccccccccc"
inkscape:connector-curvature="0"
id="use4877"
d="m 460.87178,-633.8425 122.21757,-211.66304 28.53477,48.37003 -32.93839,56.68751 65.4152,0.1718 13.9414,24.1698 -14.23636,24.7211 -93.11177,-0.294 -33.46371,57.6904 z"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#a4a4a4;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.8 KiB

112
assets/icons/nix.svg Normal file
View File

@ -0,0 +1,112 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="512"
height="512"
viewBox="0 0 480.00001 480"
id="svg2"
version="1.1"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
sodipodi:docname="nix.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.7494491"
inkscape:cx="278.65915"
inkscape:cy="287.51908"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1600"
inkscape:window-height="1696"
inkscape:window-x="1600"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:snap-global="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:showpageshadow="2"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showguides="true" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="print-logo"
inkscape:groupmode="layer"
id="layer1"
style="display:inline"
transform="translate(-132.5822,958.04022)">
<g
id="g251"
transform="matrix(0.95674018,0,0,0.95674018,-16.993334,-33.377468)">
<path
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5277c3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 309.40365,-710.2521 122.19683,211.6751 -56.15706,0.5268 -32.6236,-56.8692 -32.85645,56.5653 -27.90237,-0.011 -14.29086,-24.6896 46.81047,-80.4902 -33.22946,-57.8256 z"
id="path4861"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccccc" />
<path
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#7ebae4;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 353.50926,-797.4433 -122.21756,211.6631 -28.53477,-48.37 32.93839,-56.6875 -65.41521,-0.1719 -13.9414,-24.1698 14.23637,-24.721 93.11177,0.2939 33.46371,-57.6903 z"
id="use4863"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccccc" />
<path
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#7ebae4;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 362.88537,-628.243 244.41439,0.012 -27.62229,48.8968 -65.56199,-0.1817 32.55876,56.7371 -13.96098,24.1585 -28.52722,0.032 -46.3013,-80.7841 -66.69317,-0.1353 z"
id="use4865"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccccc" />
<path
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#7ebae4;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 505.14318,-720.9886 -122.19683,-211.6751 56.15706,-0.5268 32.6236,56.8692 32.85645,-56.5653 27.90237,0.011 14.29086,24.6896 -46.81047,80.4902 33.22946,57.8256 z"
id="use4867"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccccc" />
<path
sodipodi:nodetypes="cccccccccc"
inkscape:connector-curvature="0"
id="path4873"
d="m 309.40365,-710.2521 122.19683,211.6751 -56.15706,0.5268 -32.6236,-56.8692 -32.85645,56.5653 -27.90237,-0.011 -14.29086,-24.6896 46.81047,-80.4902 -33.22946,-57.8256 z"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5277c3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
<path
sodipodi:nodetypes="cccccccccc"
inkscape:connector-curvature="0"
id="use4875"
d="m 451.3364,-803.53264 -244.4144,-0.012 27.62229,-48.89685 65.56199,0.18175 -32.55875,-56.73717 13.96097,-24.15851 28.52722,-0.0315 46.3013,80.78414 66.69317,0.13524 z"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5277c3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
<path
sodipodi:nodetypes="cccccccccc"
inkscape:connector-curvature="0"
id="use4877"
d="m 460.87178,-633.8425 122.21757,-211.66304 28.53477,48.37003 -32.93839,56.68751 65.4152,0.1718 13.9414,24.1698 -14.23636,24.7211 -93.11177,-0.294 -33.46371,57.6904 z"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#5277c3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

@ -0,0 +1,67 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="512"
height="512"
viewBox="0 0 480.00001 480"
id="svg2"
version="1.1"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)"
sodipodi:docname="sys76.svg"
xml:space="preserve"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"><defs
id="defs4" /><sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.0844886"
inkscape:cx="301.5246"
inkscape:cy="154.91172"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="2560"
inkscape:window-height="1362"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:snap-global="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:showpageshadow="2"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showguides="true" /><metadata
id="metadata7"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><g
inkscape:label="print-logo"
inkscape:groupmode="layer"
id="layer1"
style="display:inline"
transform="translate(-132.5822,958.04022)"><circle
style="display:inline;fill:#faa41a;fill-opacity:1;stroke-width:1.00645"
id="path2-6"
cx="372.58221"
cy="-718.04022"
r="239.99998" /><circle
style="fill:#ffffff;fill-opacity:1;stroke-width:0.884138"
id="path2"
cx="372.58221"
cy="-718.04022"
r="210.83322" /><path
d="m 365.13622,-928.75782 a 210.72083,210.72083 0 0 0 -141.52888,359.73483 l 2.17872,2.12607 114.76933,-212.77665 h -122.7814 l 21.55875,36.30037 a 11.104441,11.104441 0 0 1 1.33626,8.60935 11.895105,11.895105 0 0 1 -11.4206,8.89068 11.174722,11.174722 0 0 1 -9.55826,-5.23605 l -32.03063,-53.90572 a 11.122011,11.122011 0 0 1 -1.66988,-6.00897 v -0.47419 a 11.385566,11.385566 0 0 1 11.28023,-11.03414 h 162.63086 c 2.9342,0 6.46588,1.05328 8.25795,2.45989 l 0.16869,0.13116 a 12.879043,12.879043 0 0 1 3.86547,16.55133 l -124.20465,230.29411 a 12.879043,12.879043 0 0 1 -2.45982,3.19789 210.73839,210.73839 0 0 0 249.93781,3.25037 h -98.95603 a 13.072317,13.072317 0 0 1 -13.07231,-13.07231 v -0.26427 a 13.072317,13.072317 0 0 1 13.07231,-13.07231 h 129.17699 a 210.73839,210.73839 0 0 0 -4.07632,-294.00417 211.89803,211.89803 0 0 0 -28.42886,-23.86044 l -0.0563,0.11245 -0.57911,1.73929 c -4.09375,7.60782 -51.67416,93.64964 -67.4348,122.1312 l -5.78069,10.45431 c -13.23049,22.87663 -19.30972,48.61701 -16.25259,68.87563 a 66.327949,66.327949 0 0 0 11.54374,28.5342 68.770224,68.770224 0 0 0 44.80443,27.98956 71.30035,71.30035 0 0 0 11.98287,1.01954 69.947434,69.947434 0 0 0 42.25665,-14.02101 66.626645,66.626645 0 0 0 26.00407,-42.3796 66.486082,66.486082 0 0 0 -12.29922,-50.81337 70.544824,70.544824 0 0 0 -45.38408,-27.77871 76.905277,76.905277 0 0 0 -3.11,-0.45731 12.281653,12.281653 0 0 1 -10.78827,-12.61559 12.123519,12.123519 0 0 1 4.09393,-8.83782 12.387074,12.387074 0 0 1 9.64616,-3.02209 95.055416,95.055416 0 0 1 65.62509,38.33834 91.014244,91.014244 0 0 1 16.55133,69.27991 91.014244,91.014244 0 0 1 -38.3033,60.05526 94.756727,94.756727 0 0 1 -54.25714,16.92015 h -0.0175 a 96.267769,96.267769 0 0 1 -16.0768,-1.37001 93.175398,93.175398 0 0 1 -61.00415,-38.19795 98.095086,98.095086 0 0 1 -7.46743,-12.40457 c -12.59797,-24.87957 -13.23049,-53.94094 -1.79171,-84.074 a 323.99665,323.99665 0 0 1 13.3184,-29.48291 l 71.65167,-130.89902 1.68675,-2.05571 0.0748,-0.14996 a 211.54663,211.54663 0 0 0 -17.21892,-8.20527 210.72083,210.72083 0 0 0 -89.48549,-16.51606 z"
id="path1"
style="fill:#000000;fill-opacity:1;stroke-width:17.5703" /></g></svg>

After

Width:  |  Height:  |  Size: 4.3 KiB

57
assets/icons/sys76.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 8.3 KiB

View File

@ -1,4 +1,4 @@
return {
volume_up = conf_dir .. "assets/sounds/volumeup-click.mp3",
volume_down = conf_dir .. "assets/sounds/volumedown-click.mp3"
volume_up = conf_dir .. "assets/sounds/volumeup.ogg",
volume_down = conf_dir .. "assets/sounds/volumedown.ogg"
}

Binary file not shown.

BIN
assets/sounds/volumedown.ogg Executable file

Binary file not shown.

Binary file not shown.

BIN
assets/sounds/volumeup.ogg Executable file

Binary file not shown.

View File

@ -36,6 +36,32 @@ return gears.table.join(
}
),
awful.key( {"Mod4"}, "Right",
function ()
awful.client.focus.byidx(1)
end,
{
description = "Focus next",
group = "Client"
}
),
awful.key( {"Mod4"}, "Left",
function ()
awful.client.focus.byidx(-1)
end,
{
description = "Focus previous",
group = "Client"
}
),
awful.key( {"Mod4", "Shift"}, "c",
function (c)
c:kill()

View File

@ -28,7 +28,8 @@ return {
"feh",
"Tor Browser", -- Needs a fixed window size to avoid fingerprinting by screen size.
"zoom",
"flameshot"
"flameshot",
"scrcpy"
},
role = {

View File

@ -105,7 +105,7 @@ return gears.table.join(
awful.key( {"Mod4"}, "p",
function ()
awful.prompt.run {
prompt = "<b>Really shutdown? (y/n/r) </b>",
prompt = "Really shutdown? (y/n/r) ",
textbox = awful.screen.focused().mypromptbox.widget,
exe_callback = shutdown
}
@ -156,32 +156,8 @@ return gears.table.join(
description = "Down",
group = "Tags"
}
),
-- Clients
awful.key( {"Mod4"}, "Left",
function ()
awful.client.focus.byidx( 1)
end,
{
description = "Focus next",
group = "Client"
}
),
awful.key( {"Mod4"}, "Right",
function ()
awful.client.focus.byidx(-1)
end,
{
description = "Focus previous",
group = "Client"
}
)
--[[
awful.key( {"Mod4", "Shift"}, "j",
function ()

View File

@ -9,7 +9,7 @@ sound.play = function(sound_key)
text = "There is no sound with key " .. sound_key
})
else
if (sound.counter > 5) then
if (sound.counter > 0) then
return
end
sound.counter = sound.counter + 1

View File

@ -54,20 +54,23 @@ local function start()
-- If timed wallpaper is enabled, load timed manager
if (type(beautiful.wallpaper) == "table") then
desktop.wallpaper = require("desktop.wallpaper")
screen.connect_signal("property::geometry", desktop.wallpaper.update)
desktop.wallpaper.update()
desktop.wallpaper.start()
local wallpaper = require("core.wallpaper")
screen.connect_signal(
"property::geometry",
wallpaper.update
)
wallpaper.update()
wallpaper.start()
else
-- Otherwise, set static wallpaper on each screen
-- We loop over screens to prevent the wallpaper from being stretched over
-- all displays. If, for some reason, you want that to happen, use a single
-- call of "gears.wallpaper.maximized(beautiful.wallpaper)" instead of
-- this loop.
-- Otherwise, set a static wallpaper
-- on each screen. We need to iterate
-- because a single call to wallpaper.maximized
-- will stretch one image over all screens
for s in screen do
gears.wallpaper.maximized(beautiful.wallpaper, s)
gears.wallpaper.maximized(
beautiful.wallpaper,
s
)
end
end
@ -92,13 +95,10 @@ local function start()
-- Prepare screens
awful.screen.connect_for_each_screen(
function(s)
-- s: the screen this function is being called for
-- Create tag table
s.tagger = tagger:new(s)
-- Create a promptbox for each s
-- Create a promptbox for each screen
s.mypromptbox = awful.widget.prompt()
-- Create the bar
@ -215,6 +215,14 @@ local function start()
rightside
}
}
-- Run module screen initialization methods
for _, mod in pairs(modules) do
if (mod["for_each_screen"] ~= nil) then
mod["for_each_screen"](s)
end
end
end
)
end

View File

@ -4,7 +4,7 @@ local function make(tagger)
-- Create tag tagindicators
-- We're using flex.vertical and flex.horizontal layouts because the grid
-- layout doesn't expand things properly.
widget.tagindicators = {}
widget.tagindicators = {} -- NOTE THE `s`, THIS IS A DIFFERENT VARIABLE
widget.tagindicator = wibox.widget {
homogeneous = true,
spacing = beautiful.dpi(2),

View File

@ -64,7 +64,10 @@ tasklist.make = function(screen)
fill_vertical = true,
{
id = "clienticon",
widget = awful.widget.clienticon,
-- Don't use awesomewm's stock clienticon.
-- using a raw imagebox lets us handle nil icons...
-- also, see th call to awesome.preferred_icon_size in rc.lua.
widget = wibox.widget.imagebox,
},
},
margins = beautiful.dpi(3),
@ -79,8 +82,24 @@ tasklist.make = function(screen)
-- The create callback is only called once, when the task indicator
-- is created.
create_callback = function(self, c, index, objects)
-- Set indicator icon
self:get_children_by_id("clienticon")[1].client = c
if c.icon == nil then
self:get_children_by_id("clienticon")[1].image = beautiful.icons[config.core.default_clienticon]
else
self:get_children_by_id("clienticon")[1].image = c.icon
end
self:get_children_by_id("clienticon")[1]:emit_signal("widget::redraw_needed")
-- Update top color
if c == client.focus then
self:get_children_by_id("top_tab")[1].bg = "#2DA0DA"
elseif c.minimized then
self:get_children_by_id("top_tab")[1].bg = beautiful.color.bar.hover_bg --beautiful.color.transparent
else
self:get_children_by_id("top_tab")[1].bg = "#2DA0DA77"
end
-- Change background when mouse is over widget
self:connect_signal("mouse::enter", function(result)
@ -106,7 +125,13 @@ tasklist.make = function(screen)
update_callback = function(self, c, index, objects)
-- Update indicator icon
self:get_children_by_id("clienticon")[1].client = c
if c.icon == nil then
self:get_children_by_id("clienticon")[1].image = beautiful.icons[config.core.default_clienticon]
else
self:get_children_by_id("clienticon")[1].image = c.icon
end
self:get_children_by_id("clienticon")[1]:emit_signal("widget::redraw_needed")
-- Update top color
if c == client.focus then

View File

@ -1,33 +1,78 @@
-- Default configuration values.
-- Override these by creating `config.lua`
-- Example contents:
--
--[[ config.lua
-- Override values in defaults.lua.
-- If you only want to overwrite one, you'll need to do explicitly:
-- config.core = { wallpaper = "" } will delete all other value in config.core.
config.battery = { enabled = true }
config.backlight = { enabled = true }
config.launcher = { enabled = true, icon = "nix"}
config.core.wallpaper = "/home/assets/wallpapers/Themed/Stellaris/upscale/City.png"
config.core.default_clienticon = "arch_grey"
config.core.browser = "firefox-developer-edition --new-tab"
config.core.startup_commands = {
"ibus-daemon --daemonize --replace --xim",
"keepassxc"
}
]]--
local config = {}
-- Copy this file to `config.lua` before starting awesome.
-- To enable a module, add a line like the ones below.
-- To disable a module, delete its config table or set
-- enabled to false.
config.picom = { enabled = true }
config.launcher = { enabled = true, icon = "arch"}
config.lock = { enabled = true, type = "i3lock"}
config.battery = { enabled = false }
config.backlight = { enabled = false }
config.simple_widgets = { enabled = true }
config.launcher = { enabled = true }
config.screenshot = { enabled = true }
config.simple_widgets = { enabled = true }
config.keymap_popup = { enabled = true }
config.battery = { enabled = false }
config.picom = { enabled = true }
config.backlight = {
enabled = false,
button_step = 5,
scroll_step = 5,
backend = "xbacklight"
}
config.core = {
wallpaper = "/home/assets/wallpapers/Themed/Stellaris/Gigapixel/City.png",
--
-- Icon to use when a window doesn't provide one
default_clienticon = "arch_grey",
continuous_tag_updates = true,
-- Run these commands in this order when awesome starts.
startup_commands = {},
wallpaper = "",
-- Dynamic: a table of files and times
-- {file = "path", start_time = {hour, minute}}
--[[
config.wallpaper = {
wallpaper = {
{ file = "morning-file.png", start_time = {04, 00} },
{ file = "noon-file.png", start_time = {11, 00} },
{ file = "night-file.png", start_time = {19, 00} },
}
]]--
font = {
normal_large = "Hack NF 16",
normal_medium = "Hack NF 14",
normal = "Hack NF 12",
normal_small = "Hack NF 10",
prompt = "Hack NF 14"
},
-- The position of the bar on each screen
bar_position = "bottom",
-- Bar size in dpi
@ -36,9 +81,9 @@ config.core = {
bar_margin = 3,
-- Preferred terminal.
terminal = "kitty",
terminal = "alacritty",
-- Preferred browser.
browser = "firefox-developer-edition --new-tab",
browser = "firefox --new-tab",
-- Table of layouts.
-- This is not handled by the regular awesomewm facility.
@ -78,13 +123,7 @@ config.core = {
--awful.layout.suit.corner.se,
},
-- Run these commands, in this order, when awesome starts.
startup_commands = {
"ibus-daemon --daemonize --replace --xim",
"keepassxc"
},
continuous_tag_updates = true,
bar_shortcuts = {
{
@ -96,12 +135,12 @@ config.core = {
"firefox_dev"
},
{
"thunderbird",
"thunderbird"
"code",
"code"
},
{
"onlyoffice-desktopeditors",
"writer"
"thunderbird",
"thunderbird"
},
{
"signal-desktop",
@ -112,32 +151,35 @@ config.core = {
"keepassx"
}
}
}
config.mpc = {
enabled = true,
-- If your MPC server has a password, do "passwd@host"
-- Default port is 6600, you probably won't need to change it.
host = "localhost",
port = 6600,
-- Fixed width of the mpc widget
width = 250,
}
config.volume = {
enabled = true,
-- How much % to change volume by
scroll_step = 2,
button_step = 5,
-- The pulse sink volume widgets and keybinds should use.
-- To use the default, keep this value an empty string.
-- Applies the --sink option to pamixer in wrapper.volume
pamixer_sink = ""
-- Applies the --sink option to pamixer
pamixer_sink = "",
}
config.ibus = {
enabled = true,
@ -169,7 +211,4 @@ config.ibus = {
}
}
return config

View File

@ -1,20 +1,3 @@
# Mark's Awesomewm Config
## Dependencies
Some features require extra tools. Tools each module requires are listed below. If a module is disabled, its tool is not needed. Applications required by `core` MUST be installed.
- Core: `fish`
- Backlight: `xbacklight`
- Battery: `upower`
- Ibus: `ibus`
- Launcher: `rofi`
- Lock: `i3lock, imagemagick, scrot` or `lightdm` (For `dm-tool`), depending on configuration.
- MPC: `mpc`
- Picom: `picom`
- Screenshot: `flameshot`, `tesseract (and data)`, `xclip`, `lpr`
- Volume: `pamixer`
## Modules
Modules are parts of this configuration that can be disabled. Nearly all features in this config are defined by a module.
@ -29,8 +12,11 @@ Every directory in `modules/` is a module. Modules cannot be in subdirectories.
Each module directory MUST have an ``init.lua``, which returns a table. That table can contain anything, but a few keys are special:
``keybinds`` \
Defines keybinds the module provides. It is audomatically loaded *if* the module is enabled. \
Defines keybinds the module provides. It is automatically loaded *if* the module is enabled. \
This MUST be a table formed by ``awful.key()``. See `ibus` or `screenshot` for examples.
``init`` \
Defines an init method. This is called once when awesome starts.
Called once when awesome starts if defined. Takes no arguments.
``for_each_screen(s)`` \
Called for each screen at start if defined. Takes one argument, `s`, the screen.

View File

@ -1,37 +0,0 @@
#!/usr/bin/fish
#
# Usage:
# backlight get
# backlight set [value]
# backlight max
#
# Returns:
# Set - nothing
# Get, max - Number between 0 and 100 (eg: 0, 25.445283, 100)
#
function backlight
switch $argv[1]
case "get"
xbacklight -get
case "max"
echo 100
case "set"
xbacklight -set $argv[2]
case "up"
xbacklight -inc 10
case "down"
xbacklight -dec 10
case "*"
echo "Unknown function \"$argv[1]\""
echo ""
echo "Usage:"
echo " backlight get"
echo " backlight set [value]"
echo " backlight max"
return 0
end
return 1
end
backlight $argv

View File

@ -1,4 +1,14 @@
local popup = require("modules.backlight.popup")
return {
widget = require("modules.backlight.widget").widget,
keybinds = require("modules.backlight.keybinds"),
init = function()
awesome.emit_signal("module::backlight:update_read")
end,
for_each_screen = function(s)
popup(s)
end
}

View File

@ -3,7 +3,8 @@ local backlight = req_rel(..., "util")
return gears.table.join(
awful.key( {}, "XF86MonBrightnessUp",
function ()
backlight.backlight_up()
backlight.backlight_up(config.backlight.button_step)
--awesome.emit_signal("module::backlight:popup_show")
end,
{
description = "Raise brightness",
@ -13,7 +14,8 @@ return gears.table.join(
awful.key( {}, "XF86MonBrightnessDown",
function ()
backlight.backlight_down()
backlight.backlight_down(config.backlight.button_step)
--awesome.emit_signal("module::backlight:popup_show")
end,
{
description = "Lower brightness",

246
modules/backlight/popup.lua Normal file
View File

@ -0,0 +1,246 @@
local backlight = req_rel(..., "util")
return function(s)
local widget = wibox.widget {
{
{
{
{ -- Icon and margins
nil,
{
nil,
{
id = "icon",
forced_height = beautiful.dpi(100),
image = beautiful.icons.brightness.i,
widget = wibox.widget.imagebox
},
nil,
expand = "none",
id = "icon_margin2",
layout = wibox.layout.align.vertical
},
nil,
id = "icon_margin1",
expand = "none",
layout = wibox.layout.align.horizontal
},
{ -- Text and percentage
{
id = "label",
text = "Backlight",
align = "left",
valign = "center",
widget = wibox.widget.textbox
},
nil,
{
id = "value",
text = "0%",
align = "center",
valign = "center",
widget = wibox.widget.textbox
},
id = "label_value_layout",
forced_height = beautiful.dpi(48),
layout = wibox.layout.align.horizontal,
},
{ -- Progress bar
{
id = "backlight_bar",
shape = gears.shape.rounded_bar,
forced_height = beautiful.dpi(10),
background_color = "#AAAAAA88",
bar_color = "#ffffff",
color = "#ffffff",
bar_shape = gears.shape.rounded_bar,
max_value = 100,
widget = wibox.widget.progressbar
},
id = "bar_layout",
forced_height = beautiful.dpi(24),
widget = wibox.container.place
},
id = "icon_bar_layout",
spacing = beautiful.dpi(0),
layout = wibox.layout.align.vertical
},
id = "popup_layout",
layout = wibox.layout.align.vertical,
},
id = "container",
left = beautiful.dpi(20),
right = beautiful.dpi(20),
top = beautiful.dpi(10),
bottom = beautiful.dpi(10),
widget = wibox.container.margin
},
bg ="#000000FF",
widget = wibox.container.background,
ontop = true,
visible = true,
type = "notification",
forced_height = beautiful.dpi(180),
forced_width = beautiful.dpi(300),
offset = beautiful.dpi(5),
}
local popup_container = awful.popup {
widget = wibox.container.background,
ontop = true,
bg = "#00000000",
stretch = false,
visible = false,
screen = s,
placement = function(c)
awful.placement.bottom_right(
c,
{
honor_workarea = true,
margins = {
top = beautiful.dpi(200)
}
}
)
end,
-- Only set corner radius here.
shape = function(cr, width, height)
gears.shape.partially_rounded_rect(
cr,
width,
height,
true,
false,
false,
false,
beautiful.dpi(20)
)
end
}
popup_container:setup {
widget,
layout = wibox.layout.fixed.horizontal
}
awesome.connect_signal("module::backlight:update",
function(value)
if value == nil then
value = 0
end
-- Update slider
widget.
container.
popup_layout.
icon_bar_layout.
bar_layout.
backlight_bar:set_value(value)
-- Update text
widget.
container.
popup_layout.
icon_bar_layout.
label_value_layout.
value:set_text(value .. "%")
-- Update icon
local icon
if value >= 90 then icon = beautiful.icons.brightness.i
elseif value >= 80 then icon = beautiful.icons.brightness.h
elseif value >= 70 then icon = beautiful.icons.brightness.g
elseif value >= 60 then icon = beautiful.icons.brightness.f
elseif value >= 50 then icon = beautiful.icons.brightness.e
elseif value >= 40 then icon = beautiful.icons.brightness.d
elseif value >= 30 then icon = beautiful.icons.brightness.c
elseif value >= 20 then icon = beautiful.icons.brightness.b
elseif value <= 10 then icon = beautiful.icons.brightness.a end
widget.
container.
popup_layout.
icon_bar_layout.
icon_margin1.
icon_margin2.
icon:set_image(icon)
end
)
local hide_popup_timer = gears.timer {
timeout = 1,
autostart = true,
callback = function()
popup_container.visible = false
end
}
awesome.connect_signal("module::all:popup_hide",
function(except)
if (except == "backlight") then
return
end
popup_container.visible = false
if hide_popup_timer.started then
hide_popup_timer:stop()
end
end
)
awesome.connect_signal("module::backlight:popup_show",
function()
awesome.emit_signal("module::all:popup_hide", "backlight")
if s == mouse.screen then
popup_container.visible = true
end
if hide_popup_timer.started then
hide_popup_timer:again()
else
hide_popup_timer:start()
end
end
)
awesome.connect_signal("module::backlight:popup_show_stay",
function()
awesome.emit_signal("module::all:popup_hide", "backlight")
if s == mouse.screen then
popup_container.visible = true
end
if hide_popup_timer.started then
hide_popup_timer:stop()
end
end
)
popup_container:connect_signal("button::press",
function(_, _, _, button, mods)
-- Scroll up
if (button == 4) then
backlight.backlight_up(config.backlight.scroll_step)
-- Scroll down
elseif (button == 5) then
backlight.backlight_down(config.backlight.scroll_step)
end
end
)
popup_container:connect_signal("mouse::enter", function(result)
awesome.emit_signal("module::backlight:popup_show_stay")
end)
popup_container:connect_signal("mouse::leave", function(result)
awesome.emit_signal("module::backlight:popup_show")
end)
end

View File

@ -1,38 +1,84 @@
local backlight = {}
-- The space at the end is important!
local script = conf_dir .. "modules/backlight/backlight.fish"
script = script .. " "
backlight.hooks = {}
backlight.add_hook = function(callback)
backlight.hooks[#backlight.hooks + 1] = callback
local brightnessctl = {}
brightnessctl.parse = function(s)
local batpec = string.match(s, ",%d?%d?%d%%,")
batpec = batpec:sub(2, batpec:len() - 2)
return tonumber(batpec)
end
backlight.exec_hooks = function()
backlight.read(function(status)
for i=1, #backlight.hooks do
backlight.hooks[i](status)
end
end)
end
backlight.read = function(callback)
brightnessctl.get = function(callback)
awful.spawn.easy_async(
script .. "get",
"brightnessctl info -m",
function(stdout, stderr, exitreason, exitcode)
callback(brightnessctl.parse(stdout))
end
)
end
brightnessctl.set = function(value)
awful.spawn.easy_async(
"brightnessctl set " .. value .. "% -m",
function(stdout, stderr, exitreason, exitcode)
awesome.emit_signal(
"module::backlight:update",
brightnessctl.parse(stdout)
)
end
)
end
brightnessctl.watch = function(timeout, callback, widget)
awful.widget.watch(
"brightnessctl get -m",
timeout,
function(stdout, stderr, exitreason, exitcode)
callback(brightnessctl.parse(stdout))
end,
widget
)
end
brightnessctl.backlight_up = function(value)
awful.spawn.easy_async(
"brightnessctl set " .. value .. "%+ -m",
function(stdout, stderr, exitreason, exitcode)
awesome.emit_signal(
"module::backlight:update",
brightnessctl.parse(stdout)
)
end
)
end
brightnessctl.backlight_down = function(value)
awful.spawn.easy_async(
"brightnessctl set " .. value .. "%- -m",
function(stdout, stderr, exitreason, exitcode)
awesome.emit_signal(
"module::backlight:update",
brightnessctl.parse(stdout)
)
end
)
end
local xbacklight = {}
xbacklight.get = function(callback)
awful.spawn.easy_async(
"xbacklight -get",
function(stdout, stderr, exitreason, exitcode)
callback(tonumber(stdout))
end
)
end
backlight.set = function(value)
awful.spawn(script .. "set " .. value, false)
xbacklight.set = function(value)
awful.spawn("xbacklight -set " .. value, false)
end
backlight.watch = function(timeout, callback, widget)
xbacklight.watch = function(timeout, callback, widget)
awful.widget.watch(
script .. "get",
"xbacklight -get",
timeout,
callback,
widget
@ -40,25 +86,48 @@ backlight.watch = function(timeout, callback, widget)
end
backlight.backlight_up = function()
awful.spawn(script .. "up", false)
backlight.exec_hooks()
xbacklight.backlight_up = function(value)
awful.spawn.easy_async(
"xbacklight -inc " .. value,
function(stdout, stderr, exitreason, exitcode)
awesome.emit_signal("module::backlight:update_read")
end
)
end
backlight.backlight_down = function()
awful.spawn(script .. "down", false)
backlight.exec_hooks()
xbacklight.backlight_down = function(value)
awful.spawn.easy_async(
"xbacklight -dec " .. value,
function(stdout, stderr, exitreason, exitcode)
awesome.emit_signal("module::backlight:update_read")
end
)
end
--[[
backlight.redshift = function(temp)
awful.spawn("redshift -O " .. tostring(temp), false)
local backlight = {}
if config.backlight.backend == "xbacklight" then
backlight = xbacklight
elseif config.backlight.backend == "brightnessctl" then
backlight = brightnessctl
else
backlight = xbacklight
end
backlight.reset_redshift = function()
awful.spawn("redshift -x", false)
end
--]]
awesome.connect_signal("module::backlight:update_read",
function()
backlight.get(
function(value)
awesome.emit_signal(
"module::backlight:update",
value
)
end
)
end
)
return backlight

View File

@ -1,99 +1,59 @@
local backlight = req_rel(..., "util")
local widget = {}
local dotgrid = require("widgets.dotgrid")
widget.icon = wibox.widget {
id = "icon",
image = beautiful.icons.brightness.i,
resize = true,
widget = wibox.widget.imagebox,
}
widget.arc = wibox.widget {
{
widget.icon,
top = beautiful.dpi(1),
bottom = beautiful.dpi(1),
layout = wibox.container.margin,
},
max_value = 100,
thickness = beautiful.dpi(4),
start_angle = 4.71238898, -- 2pi*3/4
--forced_height = beautiful.dpi(16),
--forced_width = beautiful.dpi(16),
colors = {"#27D4CC", "#00446B"},
bg = "#FFFFFF30",
paddings = beautiful.dpi(2),
widget = wibox.container.arcchart
}
widget.dots = dotgrid:new();
widget.dots.on_color = {0.18, 0.88, 1}
widget.dots.off_color = {0.1, 0.44, 0.5}
widget.dots.spacing = beautiful.dpi(2)
widget.widget = wibox.widget {
{
{ -- Right space
widget = wibox.widget.separator,
color = beautiful.color.transparent,
forced_width = beautiful.dpi(3)
},
{ -- Main indicator. Can be replaced with widget.arc
widget.arc,
top = beautiful.dpi(2),
bottom = beautiful.dpi(2),
layout = wibox.container.margin,
},
{ -- Left space
widget = wibox.widget.separator,
color = beautiful.color.transparent,
forced_width = beautiful.dpi(3)
},
layout = wibox.layout.align.horizontal,
widget.dots,
top = beautiful.dpi(2),
bottom = beautiful.dpi(2),
left = beautiful.dpi(2),
right = beautiful.dpi(2),
layout = wibox.container.margin,
},
layout = wibox.container.background,
}
widget.widget:connect_signal("mouse::enter", function(result)
widget.widget.bg = beautiful.color.bar.hover_bg
--awesome.emit_signal("module::backlight:popup_show_stay")
end)
widget.widget:connect_signal("mouse::leave", function(result)
widget.widget.bg = beautiful.color.transparent
--awesome.emit_signal("module::backlight:popup_show")
end)
widget.widget:connect_signal("button::press",
function(_, _, _, button, mods)
-- Scroll up
if (button == 4) then
backlight.backlight_up()
backlight.backlight_up(config.backlight.scroll_step)
-- Scroll down
elseif (button == 5) then
backlight.backlight_down()
backlight.backlight_down(config.backlight.scroll_step)
end
--awesome.emit_signal("module::backlight:popup_show_stay")
end
)
widget.update = function(value)
widget.arc.value = value
awesome.connect_signal("module::backlight:update",
function(value)
widget.dots.value = value
widget.dots:emit_signal("widget::redraw_needed")
end
)
--[[if value > 90 then widget.icon.image = beautiful.icons.brightness.i
elseif value > 80 then widget.icon.image = beautiful.icons.brightness.h
elseif value > 70 then widget.icon.image = beautiful.icons.brightness.g
elseif value > 60 then widget.icon.image = beautiful.icons.brightness.f
elseif value > 50 then widget.icon.image = beautiful.icons.brightness.e
elseif value > 40 then widget.icon.image = beautiful.icons.brightness.d
elseif value > 30 then widget.icon.image = beautiful.icons.brightness.c
elseif value > 20 then widget.icon.image = beautiful.icons.brightness.b
elseif value <= 10 then widget.icon.image = beautiful.icons.brightness.a end
--]]
end
backlight.add_hook(widget.update)
backlight.watch(
5,
function()
backlight.read(widget.update)
awesome.emit_signal("module::backlight::update_read")
end,
widget.widget
)

View File

@ -1,8 +0,0 @@
#!/usr/bin/fish
# returns battery percentage and status
# 45%, discharging
# second parameter returns "fully" when fully charged. Since awesome only checks for "discharging," fixing that isn't necessary.
echo \
(upower --show-info /org/freedesktop/UPower/devices/battery_BAT1 | grep percentage | grep -Po "(\d\d?\d?)%"), \
(upower --show-info /org/freedesktop/UPower/devices/battery_BAT1 | grep state | grep -Po "(?<=state:)\s*(\w*)" | xargs) \

View File

@ -1,13 +1,11 @@
local battery = {}
local script = conf_dir .. "modules/battery/battery.fish"
battery.watch = function(timeout, callback, widget)
awful.widget.watch(script, timeout, callback, widget)
awful.widget.watch("acpi --battery", timeout, callback, widget)
end
battery.status = function(callback)
awful.spawn.easy_async(script, callback)
awful.spawn.easy_async("acpi --battery", callback)
end
return battery

View File

@ -1,5 +1,6 @@
local battery = req_rel(..., "util")
local widget = {}
local dotgrid = require("widgets.dotgrid")
-- Percentages to warn at
-- (must be in order least -> greatest)
@ -13,76 +14,25 @@ for i=1, #widget.warnings do
widget.warninglog[i] = false
end
widget.image_path = beautiful.icons.battery.missing
widget.icon = wibox.widget {
image = beautiful.icons.battery.missing,
resize = true,
widget = wibox.widget.imagebox,
}
widget.progressbar = wibox.widget {
max_value = 100,
widget = wibox.widget.progressbar,
paddings = beautiful.dpi(2),
color = beautiful.color.bar.active,
background_color = beautiful.color.transparent,
border_color = beautiful.color.bar.active,
border_width = beautiful.dpi(1),
margins = beautiful.dpi(3)
}
widget.arc = wibox.widget {
{
widget.icon,
top = beautiful.dpi(1),
bottom = beautiful.dpi(1),
layout = wibox.container.margin,
},
max_value = 100,
thickness = beautiful.dpi(4),
start_angle = 4.71238898, -- 2pi*3/4
--forced_height = beautiful.dpi(16),
--forced_width = beautiful.dpi(16),
colors = {"#27D4CC", "#00446B"},
bg = "#FFFFFF30",
paddings = beautiful.dpi(2),
widget = wibox.container.arcchart
}
widget.rotator = wibox.widget {
widget.progressbar,
forced_width = beautiful.dpi(15),
direction = "east",
layout = wibox.container.rotate,
}
widget.dots = dotgrid:new();
widget.dots.on_color = {1, 0, 0}
widget.dots.off_color = {0.5, 0, 0}
widget.dots.spacing = beautiful.dpi(2)
widget.widget = wibox.widget {
{
{ -- Right space
widget = wibox.widget.separator,
color = beautiful.color.transparent,
forced_width = beautiful.dpi(3)
},
{
widget.arc,
top = beautiful.dpi(2),
bottom = beautiful.dpi(2),
layout = wibox.container.margin,
},
{ -- Left space
widget = wibox.widget.separator,
color = beautiful.color.transparent,
forced_width = beautiful.dpi(3)
},
layout = wibox.layout.align.horizontal,
widget.dots,
top = beautiful.dpi(2),
bottom = beautiful.dpi(2),
left = beautiful.dpi(2),
right = beautiful.dpi(2),
layout = wibox.container.margin,
},
layout = wibox.container.background,
}
widget.widget:connect_signal("mouse::enter", function(result)
widget.widget.bg = beautiful.color.bar.hover_bg
end)
@ -95,7 +45,7 @@ widget.update = function(stdout)
local batpec = string.match(stdout, "(%d?%d?%d)%%")
batpec = tonumber(string.format("% 3d", batpec))
local discharging = string.match(stdout, "discharging") or false
local discharging = string.match(stdout, "Discharging") or false
-- Handle low power notifications
if discharging then
@ -126,49 +76,17 @@ widget.update = function(stdout)
end
end
widget.progressbar.value = batpec
widget.arc.value = batpec
if batpec > 60 then
widget.progressbar.color = beautiful.color.battery.good
elseif batpec > 40 then
widget.progressbar.color = beautiful.color.battery.low
elseif batpec <= 40 then
widget.progressbar.color = beautiful.color.battery.danger
end
widget.image_path = beautiful.icons.battery.missing
-- Set current battery icon
if (not discharging) then
if batpec > 80 then widget.image_path = beautiful.icons.battery.charging.full
elseif batpec > 60 then widget.image_path = beautiful.icons.battery.charging.good
elseif batpec > 40 then widget.image_path = beautiful.icons.battery.charging.low
elseif batpec > 20 then widget.image_path = beautiful.icons.battery.charging.caution
elseif batpec <= 20 then widget.image_path = beautiful.icons.battery.charging.empty end
else
if batpec > 80 then widget.image_path = beautiful.icons.battery.full
elseif batpec > 60 then widget.image_path = beautiful.icons.battery.good
elseif batpec > 40 then widget.image_path = beautiful.icons.battery.low
elseif batpec > 20 then widget.image_path = beautiful.icons.battery.caution
elseif batpec <= 20 then widget.image_path = beautiful.icons.battery.empty end
end
widget.icon.image = widget.image_path
if (not discharging) and (batpec > 90) then
widget.progressbar.border_color = beautiful.color.battery.good
elseif (discharging) and (batpec <= 25) then
widget.progressbar.border_color = beautiful.color.battery.danger
else
widget.progressbar.border_color = beautiful.color.bar.active
end
widget.dots.value = batpec
if discharging then
widget.rotator.direction = "east"
widget.dots.on_color = {1, 0, 0}
widget.dots.off_color = {0.5, 0, 0}
else
widget.rotator.direction = "west"
widget.dots.on_color = {1, 1, 0}
widget.dots.off_color = {0.5, 0.5, 0}
end
widget.dots:emit_signal("widget::redraw_needed")
end
widget.readupdate = function()
@ -185,8 +103,12 @@ widget.widget:connect_signal("button::press",
if (button == 1) then
battery.status(
function(stdout, stderr, exitreason, exitcode)
local batpec = string.match(stdout, "(%d?%d?%d)%%") -- (\d?\d?\d)\%)
local batstat = string.match(stdout, "discharging") or false
local batpec = string.match(stdout, "(%d?%d?%d)%%")
batpec = tonumber(string.format("% 3d", batpec))
local batstat = string.match(stdout, "Discharging") or false
debug_message(batpec)
if batstat then
batstat = "Discharging, "
@ -211,7 +133,7 @@ widget.widget:connect_signal("button::press",
)
battery.watch(
10,
2,
function(_, stdout)
widget.update(stdout)
end,

View File

@ -31,10 +31,10 @@ for k, l in pairs(config.ibus.language_list) do
l["widget_text"] = wibox.widget {
{
markup = "<b>" .. l["title"] .. "</b>",
text = "" .. l["title"] .. "",
align = "left",
valign = "center",
font = "Comfortaa 16",
font = config.core.font.normal_large,
widget = wibox.widget.textbox
},
layout = wibox.container.background,

View File

@ -4,12 +4,12 @@ local widget = {}
widget.ibus_indicator_text = wibox.widget.textbox("??")
widget.ibus_indicator_text.valign = "center"
widget.ibus_indicator_text.align = "center"
widget.ibus_indicator_text.font = "Hack NF 14"
widget.ibus_indicator_text.font = config.core.font.normal_medium
widget.xkb_indicator_text = wibox.widget.textbox("??")
widget.xkb_indicator_text.valign = "center"
widget.xkb_indicator_text.align = "center"
widget.xkb_indicator_text.font = "Hack NF 10"
widget.xkb_indicator_text.font = config.core.font.normal_small
widget.widget = wibox.widget {
@ -53,8 +53,8 @@ widget.widget:connect_signal("mouse::leave", function(result)
end)
widget.update = function()
widget.ibus_indicator_text.markup = config.ibus.language_list[util.current_engine_index]["indicator_code"]
widget.xkb_indicator_text.markup = util.current_xkbmap
widget.ibus_indicator_text.text = config.ibus.language_list[util.current_engine_index]["indicator_code"]
widget.xkb_indicator_text.text = util.current_xkbmap
end

View File

@ -7,7 +7,6 @@ popup.popup = awful.popup {
widget = wibox.widget {
wibox.widget {
image = ru_kb_img,
resize = true,
widget = wibox.widget.imagebox,
resize = true,
forced_width = popup.width,
@ -18,7 +17,7 @@ popup.popup = awful.popup {
margins = beautiful.dpi(20),
widget = wibox.container.margin
},
bg = "#00000000",
border_width = 0,
ontop = true,
@ -71,4 +70,4 @@ popup.widget = wibox.widget {
layout = wibox.layout.grid
}
return popup
return popup

View File

@ -3,7 +3,7 @@ local widget = {}
widget.icon = wibox.widget {
resize = true,
image = beautiful.icons.launcher,
image = beautiful.icons[config.launcher.icon],
widget = wibox.widget.imagebox
}

View File

@ -2,14 +2,18 @@ local util = {}
util.mpc_command = function(command, callback)
awful.spawn.easy_async(
"mpc --host " .. config.mpc.host .. " " .. command,
"mpc --host " .. config.mpc.host .. " "
.. "--port " .. config.mpc.port .. " "
.. command,
callback
)
end
util.mpc_watch = function(command, timeout, callback, widget)
awful.widget.watch(
"mpc --host " .. config.mpc.host .. " " .. command,
"mpc --host " .. config.mpc.host .. " "
.. "--port " .. config.mpc.port .. " "
.. command,
timeout,
callback,
widget

View File

@ -4,21 +4,21 @@ local mpc_widget = {}
mpc_widget.title = wibox.widget.textbox("MPD is not")
mpc_widget.title.valign = "center"
mpc_widget.title.align = "left"
mpc_widget.title.font = "Hack NF 12"
mpc_widget.title.font = config.core.font.normal
mpc_widget.title.ellipsize = "end"
mpc_widget.title.forced_width = beautiful.dpi(config.mpc.width)
mpc_widget.artist = wibox.widget.textbox("connected")
mpc_widget.artist.valign = "center"
mpc_widget.artist.align = "left"
mpc_widget.artist.font = "Hack NF 12"
mpc_widget.artist.font = config.core.font.normal
mpc_widget.artist.ellipsize = "end"
mpc_widget.artist.forced_width = beautiful.dpi(config.mpc.width)
mpc_widget.volume = wibox.widget.textbox("??")
mpc_widget.volume.valign = "center"
mpc_widget.volume.align = "left"
mpc_widget.volume.font = "Hack NF 10"
mpc_widget.volume.font = config.core.font.normal_small
mpc_widget.volume.ellipsize = "end"
mpc_widget.volume.forced_width = beautiful.dpi(10)
@ -67,21 +67,23 @@ mpc_widget.right = wibox.widget {
mpc_widget.widget = wibox.widget {
{
{ -- Right spacer
widget = wibox.widget.separator,
color = beautiful.color.transparent,
forced_width = beautiful.dpi(3)
{
mpc_widget.left,
mpc_widget.right,
forced_num_cols = 2,
forced_num_rows = 1,
homogeneous = false,
vertical_homogenous = true;
horizontal_homogenous = false;
expand = true,
layout = wibox.layout.grid
},
mpc_widget.left,
mpc_widget.right,
{ -- Left spacer
widget = wibox.widget.separator,
color = beautiful.color.transparent,
forced_width = beautiful.dpi(3)
},
layout = wibox.layout.align.horizontal,
top = 0, bottom = 0,
left = beautiful.dpi(2),
right = beautiful.dpi(2),
layout = wibox.container.margin,
},
layout = wibox.container.background,
}
@ -130,6 +132,20 @@ mpc_widget.left:connect_signal("button::press",
end
)
--[[
function pango.escape(text)
local replacements = {
["&"] = "&amp;",
["<"] = "&lt;",
[">"] = "&gt;",
["\""] = "&quot;",
["'"] = "&apos;",
}
return string.gsub(text, "[&<>'\"]", replacements)
end
]]--
mpc_widget.readupdate = function()
-- Update title and artist
mpc.mpc_command("current --format \"title=%title% artist=%artist%\"",
@ -138,8 +154,8 @@ mpc_widget.readupdate = function()
return
end
mpc_widget.title.markup = string.match(stdout, "title=(.*)artist=")
mpc_widget.artist.markup = string.match(stdout, "artist=(.*)")
mpc_widget.title.text = string.match(stdout, "title=(.*)artist=")
mpc_widget.artist.text = string.match(stdout, "artist=(.*)")
end
)
@ -158,11 +174,12 @@ mpc_widget.readupdate = function()
mpc_widget.icon_play.image = beautiful.icons.music.blue.stopped
end
local volume = string.match(stdout, "volume: (%d?%d?%d)%%")
local volume = string.match(stdout, "volume: ?(%d?%d?%d)%%")
if (volume) then
mpc_widget.volume.markup = volume .. "%"
mpc_widget.volume.text = volume .. "%"
else
mpc_widget.volume.markup = ""
mpc_widget.volume.text = ""
end
end
)

View File

@ -1,6 +1,6 @@
return {
init = function()
local conf = conf_dir .. "/modules/picom/picom.conf"
awful.spawn("picom -b --conf \"" .. conf .. "\"")
awful.spawn("picom -b --experimental-backends --conf \"" .. conf .. "\"")
end
}

View File

@ -1,18 +1,29 @@
shadow-radius = 0
shadow-opacity = 0
shadow-radius = 0;
shadow-opacity = 0;
// Enable fading initially.
// Finer config is in fade-exclude.
fading = true
fade-in-step = 0.04
fade-out-step = 0.03
fade-delta = 10
fade-in-step = 0.1;
fade-out-step = 0.03;
fade-delta = 5;
fade-exclude = [
"class_g != 'awesome'"
]
];
inactive-opacity = 1
active-opacity = 1
inactive-dim = 0
backend = "glx";
detect-rounded-corners = true;
blur-background-frame = false;
blur: {
method = "dual_kawase";
strength = 3;
};
blur-exclude = [
"class_g != 'awesome'"
];
inactive-opacity = 1;
active-opacity = 1;
inactive-dim = 0;

View File

@ -1,6 +1,6 @@
local function screenshot_action(mode)
awful.spawn(
conf_dir .. "modules/screenshot/screenshot.fish " .. mode,
"fish " .. conf_dir .. "modules/screenshot/screenshot.fish " .. mode,
false
)
end

View File

@ -8,8 +8,8 @@ textclock.widget = wibox.widget {
forced_width = beautiful.dpi(3)
},
wibox.widget {
wibox.widget.textclock("%m/%d"),
wibox.widget.textclock("%I:%M", 60),
wibox.widget.textclock("<span font=\"" .. config.core.font.normal .. "\">%m/%d</span>"),
wibox.widget.textclock("<span font=\"" .. config.core.font.normal .. "\">%I:%M</span>", 60),
-- Long format:
-- wibox.widget.textclock("%m/%d/%y"),

View File

@ -1,5 +1,5 @@
local volume = require("modules.volume.util")
local widget = require("modules.volume.widget")
local popup = require("modules.volume.popup")
return {
widget = require("modules.volume.widget").widget,
@ -7,8 +7,11 @@ return {
init = function ()
-- Make sure volume is unmuted
volume.commands:unmute()
-- Update volume widget at start
volume.commands:get(widget.update)
-- Implicitly updates widgets
volume.commands.unmute()
end,
for_each_screen = function (s)
popup(s)
end
}

View File

@ -3,7 +3,8 @@ local volume = req_rel(..., "util")
return gears.table.join(
awful.key( {}, "XF86AudioRaiseVolume",
function ()
volume.volume_up()
volume.volume_up(config.volume.button_step)
--awesome.emit_signal("module::volume:popup_show")
end,
{
description = "Volume up",
@ -13,7 +14,8 @@ return gears.table.join(
awful.key( {}, "XF86AudioLowerVolume",
function ()
volume.volume_down()
volume.volume_down(config.volume.button_step)
--awesome.emit_signal("module::volume:popup_show")
end,
{
description = "Volume down",
@ -24,6 +26,7 @@ return gears.table.join(
awful.key( {}, "XF86AudioMute",
function ()
volume.toggle_mute()
--awesome.emit_signal("module::volume:popup_show")
end,
{
description = "Mute",

247
modules/volume/popup.lua Normal file
View File

@ -0,0 +1,247 @@
local volume = req_rel(..., "util")
return function(s)
local widget = wibox.widget {
{
{
{
{ -- Icon and margins
nil,
{
nil,
{
id = "icon",
forced_height = beautiful.dpi(100),
image = beautiful.icons.volume.high,
widget = wibox.widget.imagebox
},
nil,
expand = "none",
id = "icon_margin2",
layout = wibox.layout.align.vertical
},
nil,
id = "icon_margin1",
expand = "none",
layout = wibox.layout.align.horizontal
},
{ -- Text and percentage
{
id = "label",
text = "Volume",
align = "left",
valign = "center",
widget = wibox.widget.textbox
},
nil,
{
id = "value",
text = "0%",
align = "center",
valign = "center",
widget = wibox.widget.textbox
},
id = "label_value_layout",
forced_height = beautiful.dpi(48),
layout = wibox.layout.align.horizontal,
},
{ -- Progress bar
{
id = "volume_bar",
shape = gears.shape.rounded_bar,
forced_height = beautiful.dpi(10),
background_color = "#AAAAAA88",
bar_color = "#ffffff",
color = "#ffffff",
bar_shape = gears.shape.rounded_bar,
max_value = 100,
widget = wibox.widget.progressbar
},
id = "bar_layout",
forced_height = beautiful.dpi(24),
widget = wibox.container.place
},
id = "icon_bar_layout",
spacing = beautiful.dpi(0),
layout = wibox.layout.align.vertical
},
id = "popup_layout",
layout = wibox.layout.align.vertical,
},
id = "container",
left = beautiful.dpi(20),
right = beautiful.dpi(20),
top = beautiful.dpi(10),
bottom = beautiful.dpi(10),
widget = wibox.container.margin
},
bg ="#000000FF",
widget = wibox.container.background,
ontop = true,
visible = true,
type = "notification",
forced_height = beautiful.dpi(180),
forced_width = beautiful.dpi(300),
offset = beautiful.dpi(5),
}
local popup_container = awful.popup {
widget = wibox.container.background,
ontop = true,
bg = "#00000000",
stretch = false,
visible = false,
screen = s,
placement = function(c)
awful.placement.bottom_right(
c,
{
honor_workarea = true,
margins = {
top = beautiful.dpi(200)
}
}
)
end,
-- Only set corner radius here.
shape = function(cr, width, height)
gears.shape.partially_rounded_rect(
cr,
width,
height,
true,
false,
false,
false,
beautiful.dpi(20)
)
end
}
popup_container:setup {
widget,
layout = wibox.layout.fixed.horizontal
}
local hide_popup_timer = gears.timer {
timeout = 1,
autostart = true,
callback = function()
popup_container.visible = false
end
}
awesome.connect_signal("module::all:popup_hide",
function(except)
if (except == "volume") then
return
end
popup_container.visible = false
if hide_popup_timer.started then
hide_popup_timer:stop()
end
end
)
awesome.connect_signal("module::volume:update",
function(status)
-- Update slider
widget.
container.
popup_layout.
icon_bar_layout.
bar_layout.
volume_bar:set_value(status.value)
-- Update text
widget.
container.
popup_layout.
icon_bar_layout.
label_value_layout.
value:set_text(status.value .. "%")
-- Update icon
local icon
if status.mute then
icon = beautiful.icons.volume.mute
elseif status.value < 1 then
icon = beautiful.icons.volume.off
elseif status.value >= 1 and status.value < 34 then
icon = beautiful.icons.volume.low
elseif status.value >= 34 and status.value < 67 then
icon = beautiful.icons.volume.medium
elseif status.value >= 67 then
icon = beautiful.icons.volume.high
end
widget.
container.
popup_layout.
icon_bar_layout.
icon_margin1.
icon_margin2.
icon:set_image(icon)
end
)
awesome.connect_signal("module::volume:popup_show",
function()
awesome.emit_signal("module::all:popup_hide", "volume")
if s == mouse.screen then
popup_container.visible = true
end
if hide_popup_timer.started then
hide_popup_timer:again()
else
hide_popup_timer:start()
end
end
)
awesome.connect_signal("module::volume:popup_show_stay",
function()
awesome.emit_signal("module::all:popup_hide", "volume")
if s == mouse.screen then
popup_container.visible = true
end
if hide_popup_timer.started then
hide_popup_timer:stop()
end
end
)
popup_container:connect_signal("button::press",
function(_, _, _, button, mods)
-- Left-click
if (button == 1) then
volume.toggle_mute()
-- Scroll up
elseif (button == 4) then
volume.volume_up(config.volume.scroll_step)
-- Scroll down
elseif (button == 5) then
volume.volume_down(config.volume.scroll_step)
end
end
)
popup_container:connect_signal("mouse::enter", function(result)
awesome.emit_signal("module::volume:popup_show_stay")
end)
popup_container:connect_signal("mouse::leave", function(result)
awesome.emit_signal("module::volume:popup_show")
end)
end

View File

@ -1,5 +1,5 @@
local volume = {}
volume.commands = {}
-- Create pamixer option string
@ -8,131 +8,150 @@ if (config.volume.pamixer_sink ~= "") then
volume.pamixer_options = volume.pamixer_options .. " --sink " .. config.volume.pamixer_sink
end
function volume.commands:up()
awful.spawn("pamixer --increase 5" .. volume.pamixer_options, false)
end
function volume.commands:down()
awful.spawn("pamixer --decrease 5" .. volume.pamixer_options, false)
end
function volume.commands:set(value)
awful.spawn("pamixer --set_volume" .. tostring(value) .. " " .. volume.pamixer_options, false)
end
function volume.commands:mute()
awful.spawn("pamixer --mute" .. volume.pamixer_options, false)
end
function volume.commands:unmute()
awful.spawn("pamixer --unmute" .. volume.pamixer_options, false)
end
function volume.commands:get(callback)
local muted
local value
awful.spawn.easy_async("pamixer --get-mute --get-volume" .. volume.pamixer_options,
function(stdout, stderr, exitreason, exitcode)
muted = string.match(stdout, "(%w%w%w%w%w?) ") -- "true" or "false"
muted = (muted == "true")
value = string.match(stdout, "(%d?%d?%d)") -- (\d?\d?\d)\%)
if (value == nil) then
value = false
else
value = tonumber(string.format("% 3d", value))
volume.commands = {
up = function(value, callback)
awful.spawn.easy_async(
"pamixer --increase " .. value .. " "
.. volume.pamixer_options,
function(stdout, stderr, exitreason, exitcode)
awesome.emit_signal("module::volume:update_read")
if (callback ~= nil) then
callback()
end
end
)
end,
callback({
mute = muted,
value = value
})
end
)
end
down = function(value, callback)
awful.spawn.easy_async(
"pamixer --decrease " .. value .. " "
.. volume.pamixer_options,
function(stdout, stderr, exitreason, exitcode)
awesome.emit_signal("module::volume:update_read")
if (callback ~= nil) then
callback()
end
end
)
end,
function volume.commands:watch(timeout, callback, widget)
awful.widget.watch(
"pamixer --get-mute --get-volume " .. volume.pamixer_options,
timeout, callback, widget
)
end
set = function(value, callback)
awful.spawn.easy_async(
"pamixer --set_volume " .. tostring(value) .. " " .. volume.pamixer_options,
function(stdout, stderr, exitreason, exitcode)
awesome.emit_signal("module::volume:update_read")
if (callback ~= nil) then
callback()
end
end
)
end,
mute = function(callback)
awful.spawn.easy_async(
"pamixer --mute " .. volume.pamixer_options,
function(stdout, stderr, exitreason, exitcode)
awesome.emit_signal("module::volume:update_read")
if (callback ~= nil) then
callback()
end
end
)
end,
unmute = function(callback)
awful.spawn.easy_async(
"pamixer --unmute " .. volume.pamixer_options,
function(stdout, stderr, exitreason, exitcode)
awesome.emit_signal("module::volume:update_read")
if (callback ~= nil) then
callback()
end
end
)
end,
volume.hooks = {}
volume.add_hook = function(callback)
volume.hooks[#volume.hooks + 1] = callback
end
watch = function(timeout, callback, widget)
awful.widget.watch(
"pamixer --get-mute --get-volume " .. volume.pamixer_options,
timeout, callback, widget
)
end,
volume.exec_hooks = function()
volume.commands:get(function(status)
for i=1, #volume.hooks do
volume.hooks[i](status)
end
get = function(callback)
local muted
local value
awful.spawn.easy_async(
"pamixer --get-mute --get-volume " .. volume.pamixer_options,
function(stdout, stderr, exitreason, exitcode)
muted = string.match(stdout, "(%w%w%w%w%w?) ") -- "true" or "false"
muted = (muted == "true")
value = string.match(stdout, "(%d?%d?%d)") -- (\d?\d?\d)\%)
if (value == nil) then
value = false
else
value = tonumber(string.format("% 3d", value))
end
-- Value will be "false" if audio not connected,
-- needs to be handled gracefully
callback({
mute = muted,
value = value
})
end
)
end
}
awesome.connect_signal("module::volume:update_read",
function()
volume.commands.get(
function(status)
awesome.emit_signal(
"module::volume:update",
status
)
end
)
end
)
volume.volume_up = function(value)
if volume.muted then
volume.unmute()
end
volume.commands.up(value, function()
core.sound.play("volume_up")
end)
end
volume.volume_up = function()
volume.volume_down = function(value)
if volume.muted then
volume.unmute()
end
volume.commands:up()
core.sound.play("volume_up")
volume.exec_hooks()
end
volume.volume_down = function()
if volume.muted then
volume.unmute()
end
volume.commands:down()
core.sound.play("volume_down")
volume.exec_hooks()
volume.commands.down(value, function()
core.sound.play("volume_down")
end)
end
volume.mute = function()
volume.commands:mute()
volume.muted = true
-- Spawn notification
local n = naughty.notify({
title = "Volume muted",
text = "Silence!",
timeout = 1,
replaces_id = volume.notificationid
})
volume.notificationid = n.id
volume.exec_hooks()
volume.commands.mute()
end
volume.unmute = function()
volume.commands:unmute()
volume.muted = false
-- Spawn notification
local n = naughty.notify({
title = "Volume unmuted",
text = "Loud.",
timeout = 1,
replaces_id = volume.notificationid
})
volume.notificationid = n.id
volume.exec_hooks()
volume.commands.unmute()
end
volume.toggle_mute = function()
volume.commands:get(function(status)
volume.commands.get(function(status)
if status.mute then
volume.unmute()
else

View File

@ -1,136 +1,72 @@
local volume = req_rel(..., "util")
local widget = {}
local dotgrid = require("widgets.dotgrid")
widget.icon = wibox.widget {
resize = true,
image = beautiful.icons.volume.mute,
widget = wibox.widget.imagebox
}
widget.arc = wibox.widget {
{
widget.icon,
top = beautiful.dpi(1),
bottom = beautiful.dpi(1),
layout = wibox.container.margin,
},
max_value = 1,
thickness = beautiful.dpi(4),
start_angle = 4.71238898, -- 2pi*3/4
--forced_height = beautiful.dpi(16),
--forced_width = beautiful.dpi(16),
colors = {"#27D4CC", "#00446B"},
bg = "#FFFFFF30",
paddings = beautiful.dpi(2),
widget = wibox.container.arcchart
}
widget.bar = wibox.widget {
max_value = 100,
value = 0,
--forced_height = 20,
forced_width = beautiful.dpi(50),
paddings = 0,
border_width = 0,
color = {
type = "linear",
from = {0, 0}, to = {beautiful.dpi(50), 0},
stops = { { 0, "#27D4CC" }, { 1, "#00446B" }}
},
background_color = "#FFFFFF30",
widget = wibox.widget.progressbar,
shape = gears.shape.rounded_bar,
}
widget.dots = dotgrid:new();
widget.dots.on_color = {1, 0, 0}
widget.dots.off_color = {0.5, 0, 0}
widget.dots.spacing = beautiful.dpi(2)
widget.widget = wibox.widget {
{
{ -- Right space
widget = wibox.widget.separator,
color = beautiful.color.transparent,
forced_width = beautiful.dpi(3)
},
{
widget.arc,
top = beautiful.dpi(2),
bottom = beautiful.dpi(2),
layout = wibox.container.margin,
},
{ -- Left space
widget = wibox.widget.separator,
color = beautiful.color.transparent,
forced_width = beautiful.dpi(3)
},
layout = wibox.layout.align.horizontal,
widget.dots,
top = beautiful.dpi(2),
bottom = beautiful.dpi(2),
left = beautiful.dpi(2),
right = beautiful.dpi(2),
layout = wibox.container.margin,
},
layout = wibox.container.background,
}
widget.widget:connect_signal("mouse::enter", function(result)
widget.widget.bg = beautiful.color.bar.hover_bg
--awesome.emit_signal("module::volume:popup_show_stay")
end)
widget.widget:connect_signal("mouse::leave", function(result)
widget.widget.bg = beautiful.color.transparent
--awesome.emit_signal("module::volume:popup_show")
end)
widget.widget:connect_signal("button::press",
function(_, _, _, button, mods)
-- Right-click
if (button == 3) then
-- Left-click
if (button == 1) then
volume.toggle_mute()
-- Scroll up
elseif (button == 4) then
volume.volume_up()
volume.volume_up(config.volume.scroll_step)
-- Scroll down
elseif (button == 5) then
volume.volume_down()
volume.volume_down(config.volume.scroll_step)
end
--awesome.emit_signal("module::volume:popup_show_stay")
end
)
widget.update = function(status)
if (status.value == false) then
widget.icon.image = beautiful.icons.volume.error
widget.arc.value = 100;
widget.bar.value = 100;
return
end
widget.arc.value = status.value / 100;
widget.bar.value = status.value;
if (status.mute) then
-- Set muted icon
widget.icon.image = beautiful.icons.volume.mute
else
-- Set icon by value
if status.value > 70 then
widget.icon.image = beautiful.icons.volume.high
elseif status.value > 40 then
widget.icon.image = beautiful.icons.volume.medium
elseif status.value > 0 then
widget.icon.image = beautiful.icons.volume.low
elseif status.value == 0 then
widget.icon.image = beautiful.icons.volume.off
awesome.connect_signal("module::volume:update",
function(status)
if (status.value == false) then
widget.dots.value = 100
return
end
widget.dots.value = status.value
if (status.mute) then
widget.dots.on_color = {0.7, 0.7, 0.7}
widget.dots.off_color = {0.3, 0.3, 0.3}
else
widget.dots.on_color = {0, 1, 0}
widget.dots.off_color = {0, 0.5, 0}
end
widget.dots:emit_signal("widget::redraw_needed")
end
end
volume.add_hook(widget.update)
volume.commands:watch(
5,
function()
volume.commands:get(widget.update)
end,
widget.widget
)
return widget

21
rc.lua
View File

@ -6,7 +6,19 @@ beautiful = require("beautiful")
menubar = require("menubar")
wibox = require("wibox")
require("awful.autofocus")
-- Load configuration
conf_dir = gears.filesystem.get_configuration_dir()
conf_env = os.getenv("AWESOMEWM_CONFIG")
config = require("defaults")
if (conf_env == nil) then
-- Default location: in this directory
dofile(conf_dir .. "/config.lua")
else
dofile(conf_env)
end
-- A "relative require" hack. Does the same thing as `require`,
@ -22,8 +34,6 @@ debug_message = function(msg)
naughty.notify({title = "Debug message:", text = tostring(msg)})
end
-- Order matters.
config = require("config")
beautiful.init(require("theme"))
@ -32,6 +42,13 @@ local keys = require("core.keybinds")
local buttons = {}
-- Preferred client icon size, in pixels.
-- Set this to bar height, since that's the largest icon we'll ever draw.
-- This fixes the icon size given by client.icon. Client.icon give the smallest size by default.
awesome.set_preferred_icon_size(beautiful.dpi(config.core.bar_height))
-- Bind first 5 shortcuts to Mod + #.
local i = 0
for k, v in pairs(config.core.bar_shortcuts) do

View File

@ -19,7 +19,7 @@ local overrides = function(theme)
theme.prompt_font = "Comfortaa 14"
theme.prompt_font = config.core.font.prompt
theme.prompt_fg = theme.color.white
theme.prompt_bg = "#00000000"
theme.prompt_fg_cursor = theme.color.black

View File

@ -19,7 +19,7 @@ local theme = bar(theme)
local theme = clients(theme)
local theme = notifications(theme)
theme.font = "Hack NF 12"
theme.font = config.core.font.normal
theme.wallpaper = config.core.wallpaper

View File

@ -17,7 +17,7 @@ local overrides = function(theme)
--theme.hotkeys_group_magin = 5
-- Notification theming
theme.notification_font = "Comfortaa 8"
theme.notification_font = config.core.font.normal_small
theme.notification_bg = theme.color.black
theme.notification_fg = theme.color.white

117
widgets/dotgrid.lua Normal file
View File

@ -0,0 +1,117 @@
local dotgrid = {}
function dotgrid:shuffle(tbl)
for i = #tbl, 2, -1 do
local j = math.random(i)
tbl[i], tbl[j] = tbl[j], tbl[i]
end
return tbl
end
function dotgrid:new()
local dots = wibox.widget.base.make_widget();
dots.on_color = {1, 0, 0}
dots.off_color = {0.5, 0, 0}
dots.value = 0
dots.max = 100
dots.rows = 5
dots.cols = 5
dots.spacing = 2
dots.last_value = 0
dots.map = {}
local idx
for i=1, dots.rows*dots.cols do
dots.map[i] = false;
end
--dots.map = dotgrid:shuffle(dots.map)
function dots:fit(context, width, height)
local m = math.min(width, height)
return m, m
end
function dots:draw(context, cr, width, height)
local col_size = math.floor((height - self.spacing * (self.rows-1)) / self.rows)
local row_size = math.floor((width - self.spacing * (self.cols-1)) / self.cols)
-- Compute rounding offsets for better centering
local xoffset = math.floor((
width - (
(col_size * self.cols) +
(self.spacing * (self.cols - 1))
)
) / 2)
local yoffset = math.floor((
height - (
(row_size * self.rows) +
(self.spacing * (self.rows - 1))
)
) / 2)
-- How many dots should be on
local on = math.floor((self.value / self.max) * (self.rows * self.cols))
local flip
while self.last_value > on do
-- Flip the nth on dot
flip = math.random(1, self.last_value)
for i=1, dots.rows*dots.cols do
if dots.map[i] then
if flip == 1 then
dots.map[i] = false
self.last_value = self.last_value - 1
break
else
flip = flip - 1
end
end
end
end
while self.last_value < on do
-- Flip the nth off dot
flip = math.random(1, dots.rows*dots.cols - self.last_value)
for i=1, dots.rows*dots.cols do
if not dots.map[i] then
if flip == 1 then
dots.map[i] = true
self.last_value = self.last_value + 1
break
else
flip = flip - 1
end
end
end
end
local idx
for r=1, self.rows do
for c=1, self.cols do
idx = c + ((r-1)*self.cols)
cr:new_path();
if self.map[idx] then
cr:set_source_rgb(self.on_color[1], self.on_color[2], self.on_color[3])
else
cr:set_source_rgb(self.off_color[1], self.off_color[2], self.off_color[3])
end
cr:rectangle(
(c-1) * (col_size + self.spacing) + xoffset,
(r-1) * (row_size + self.spacing) + yoffset,
col_size,
row_size
)
cr:fill()
end
end
end
return dots
end
return dotgrid