walrs
pywal but if its Fast-Minimal-Simple
git clone https://git.pi66.xyz/walrs
About | Files | Commits | Refs | License
v1.0.1
Author: pixel
Date: 2025-03-19 16:49
commit: a350d591
Stat
| A | Cargo.lock | 1289 | +1289 | -0 |
| A | Cargo.toml | 14 | +14 | -0 |
| A | LICENSE | 674 | +674 | -0 |
| A | Makefile | 19 | +19 | -0 |
| A | README.md | 97 | +97 | -0 |
| A | src/create_templates.rs | 149 | +149 | -0 |
| A | src/get_colors.rs | 103 | +103 | -0 |
| A | src/main.rs | 78 | +78 | -0 |
| A | src/reload.rs | 127 | +127 | -0 |
| A | src/utils.rs | 46 | +46 | -0 |
| A | src/wallpaper.rs | 343 | +343 | -0 |
| A | templates/Colors.hs | 33 | +33 | -0 |
| A | templates/colors | 16 | +16 | -0 |
| A | templates/colors--nodim-alacritty.yml | 44 | +44 | -0 |
| A | templates/colors-alacritty.toml | 51 | +51 | -0 |
| A | templates/colors-alacritty.yml | 53 | +53 | -0 |
| A | templates/colors-foot.ini | 19 | +19 | -0 |
| A | templates/colors-fuzzel.ini | 11 | +11 | -0 |
| A | templates/colors-hyprland.conf | 21 | +21 | -0 |
| A | templates/colors-kitty.conf | 27 | +27 | -0 |
| A | templates/colors-konsole.colorscheme | 43 | +43 | -0 |
| A | templates/colors-leftwm-theme.ron | 8 | +8 | -0 |
| A | templates/colors-mako | 3 | +3 | -0 |
| A | templates/colors-nqq.css | 30 | +30 | -0 |
| A | templates/colors-oomox | 17 | +17 | -0 |
| A | templates/colors-polybar | 8 | +8 | -0 |
| A | templates/colors-putty.reg | 24 | +24 | -0 |
| A | templates/colors-rgb | 16 | +16 | -0 |
| A | templates/colors-rofi-dark.rasi | 111 | +111 | -0 |
| A | templates/colors-rofi-light.rasi | 111 | +111 | -0 |
| A | templates/colors-speedcrunch.json | 15 | +15 | -0 |
| A | templates/colors-sway | 19 | +19 | -0 |
| A | templates/colors-themer.js | 20 | +20 | -0 |
| A | templates/colors-tilix.json | 35 | +35 | -0 |
| A | templates/colors-tofi | 4 | +4 | -0 |
| A | templates/colors-tty.sh | 18 | +18 | -0 |
| A | templates/colors-vscode.json | 14 | +14 | -0 |
| A | templates/colors-wal-dmenu.h | 6 | +6 | -0 |
| A | templates/colors-wal-dwl.h | 11 | +11 | -0 |
| A | templates/colors-wal-dwm-urg.h | 15 | +15 | -0 |
| A | templates/colors-wal-dwm.h | 11 | +11 | -0 |
| A | templates/colors-wal-st.h | 30 | +30 | -0 |
| A | templates/colors-wal-tabbed.h | 6 | +6 | -0 |
| A | templates/colors-wal.vim | 22 | +22 | -0 |
| A | templates/colors-waybar.css | 19 | +19 | -0 |
| A | templates/colors-zathura | 30 | +30 | -0 |
| A | templates/colors-zed.json | 105 | +105 | -0 |
| A | templates/colors.Xresources | 64 | +64 | -0 |
| A | templates/colors.css | 26 | +26 | -0 |
| A | templates/colors.fish | 38 | +38 | -0 |
| A | templates/colors.json | 28 | +28 | -0 |
| A | templates/colors.scss | 20 | +20 | -0 |
| A | templates/colors.sh | 26 | +26 | -0 |
| A | templates/colors.styl | 20 | +20 | -0 |
| A | templates/colors.yml | 22 | +22 | -0 |
| A | templates/ghostty.conf | 21 | +21 | -0 |
Diff
diff --git a/Cargo.lock b/Cargo.lock
new file mode 100644
index 0000000..6f3c594
--- /dev/null
+++ b/Cargo.lock
@@ -0,0 +1,1289 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 4
+
+[[package]]
+name = "adler2"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627"
+
+[[package]]
+name = "aligned-vec"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
...
Show all
Show less
diff --git a/Cargo.lock b/Cargo.lock
new file mode 100644
index 0000000..6f3c594
--- /dev/null
+++ b/Cargo.lock
@@ -0,0 +1,1289 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 4
+
+[[package]]
+name = "adler2"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627"
+
+[[package]]
+name = "aligned-vec"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
...
diff --git a/Cargo.lock b/Cargo.lock
new file mode 100644
index 0000000..6f3c594
--- /dev/null
+++ b/Cargo.lock
@@ -0,0 +1,1289 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 4
+
+[[package]]
+name = "adler2"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627"
+
+[[package]]
+name = "aligned-vec"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1"
+
+[[package]]
+name = "anstream"
+version = "0.6.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b"
+dependencies = [
+ "anstyle",
+ "anstyle-parse",
+ "anstyle-query",
+ "anstyle-wincon",
+ "colorchoice",
+ "is_terminal_polyfill",
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle"
+version = "1.0.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9"
+
+[[package]]
+name = "anstyle-parse"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9"
+dependencies = [
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle-query"
+version = "1.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c"
+dependencies = [
+ "windows-sys",
+]
+
+[[package]]
+name = "anstyle-wincon"
+version = "3.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e"
+dependencies = [
+ "anstyle",
+ "once_cell",
+ "windows-sys",
+]
+
+[[package]]
+name = "anyhow"
+version = "1.0.97"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f"
+
+[[package]]
+name = "arbitrary"
+version = "1.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223"
+
+[[package]]
+name = "arg_enum_proc_macro"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "arrayvec"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50"
+
+[[package]]
+name = "autocfg"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
+
+[[package]]
+name = "av1-grain"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf"
+dependencies = [
+ "anyhow",
+ "arrayvec",
+ "log",
+ "nom",
+ "num-rational",
+ "v_frame",
+]
+
+[[package]]
+name = "avif-serialize"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "98922d6a4cfbcb08820c69d8eeccc05bb1f29bfa06b4f5b1dbfe9a868bd7608e"
+dependencies = [
+ "arrayvec",
+]
+
+[[package]]
+name = "bit_field"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61"
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "bitflags"
+version = "2.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd"
+
+[[package]]
+name = "bitstream-io"
+version = "2.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2"
+
+[[package]]
+name = "built"
+version = "0.7.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56ed6191a7e78c36abdb16ab65341eefd73d64d303fffccdbb00d51e4205967b"
+
+[[package]]
+name = "bumpalo"
+version = "3.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
+
+[[package]]
+name = "bytemuck"
+version = "1.22.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540"
+
+[[package]]
+name = "byteorder-lite"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495"
+
+[[package]]
+name = "cc"
+version = "1.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c"
+dependencies = [
+ "jobserver",
+ "libc",
+ "shlex",
+]
+
+[[package]]
+name = "cfg-expr"
+version = "0.15.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02"
+dependencies = [
+ "smallvec",
+ "target-lexicon",
+]
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "clap"
+version = "4.5.32"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6088f3ae8c3608d19260cd7445411865a485688711b78b5be70d78cd96136f83"
+dependencies = [
+ "clap_builder",
+ "clap_derive",
+]
+
+[[package]]
+name = "clap_builder"
+version = "4.5.32"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "22a7ef7f676155edfb82daa97f99441f3ebf4a58d5e32f295a56259f1b6facc8"
+dependencies = [
+ "anstream",
+ "anstyle",
+ "clap_lex",
+ "strsim",
+]
+
+[[package]]
+name = "clap_derive"
+version = "4.5.32"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "clap_lex"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6"
+
+[[package]]
+name = "color-thief"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6460d760cf38ce67c9e0318f896538820acc54f2d0a3bfc5b2c557211066c98"
+dependencies = [
+ "rgb",
+]
+
+[[package]]
+name = "color_quant"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
+
+[[package]]
+name = "colorchoice"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990"
+
+[[package]]
+name = "crc32fast"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "crossbeam-deque"
+version = "0.8.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51"
+dependencies = [
+ "crossbeam-epoch",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.9.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
+dependencies = [
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
+
+[[package]]
+name = "crunchy"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929"
+
+[[package]]
+name = "dirs-next"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1"
+dependencies = [
+ "cfg-if",
+ "dirs-sys-next",
+]
+
+[[package]]
+name = "dirs-sys-next"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d"
+dependencies = [
+ "libc",
+ "redox_users",
+ "winapi",
+]
+
+[[package]]
+name = "either"
+version = "1.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
+
+[[package]]
+name = "equivalent"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
+
+[[package]]
+name = "exr"
+version = "1.73.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0"
+dependencies = [
+ "bit_field",
+ "half",
+ "lebe",
+ "miniz_oxide",
+ "rayon-core",
+ "smallvec",
+ "zune-inflate",
+]
+
+[[package]]
+name = "fdeflate"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c"
+dependencies = [
+ "simd-adler32",
+]
+
+[[package]]
+name = "flate2"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc"
+dependencies = [
+ "crc32fast",
+ "miniz_oxide",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi",
+]
+
+[[package]]
+name = "gif"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2"
+dependencies = [
+ "color_quant",
+ "weezl",
+]
+
+[[package]]
+name = "half"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7db2ff139bba50379da6aa0766b52fdcb62cb5b263009b09ed58ba604e14bbd1"
+dependencies = [
+ "cfg-if",
+ "crunchy",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.15.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
+
+[[package]]
+name = "heck"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
+
+[[package]]
+name = "image"
+version = "0.25.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b"
+dependencies = [
+ "bytemuck",
+ "byteorder-lite",
+ "color_quant",
+ "exr",
+ "gif",
+ "image-webp",
+ "num-traits",
+ "png",
+ "qoi",
+ "ravif",
+ "rayon",
+ "rgb",
+ "tiff",
+ "zune-core",
+ "zune-jpeg",
+]
+
+[[package]]
+name = "image-webp"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b77d01e822461baa8409e156015a1d91735549f0f2c17691bd2d996bef238f7f"
+dependencies = [
+ "byteorder-lite",
+ "quick-error",
+]
+
+[[package]]
+name = "imgref"
+version = "1.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408"
+
+[[package]]
+name = "indexmap"
+version = "2.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058"
+dependencies = [
+ "equivalent",
+ "hashbrown",
+]
+
+[[package]]
+name = "interpolate_name"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "is_terminal_polyfill"
+version = "1.70.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
+
+[[package]]
+name = "itertools"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "jobserver"
+version = "0.1.32"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "jpeg-decoder"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0"
+
+[[package]]
+name = "lebe"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8"
+
+[[package]]
+name = "libc"
+version = "0.2.171"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6"
+
+[[package]]
+name = "libfuzzer-sys"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf78f52d400cf2d84a3a973a78a592b4adc535739e0a5597a0da6f0c357adc75"
+dependencies = [
+ "arbitrary",
+ "cc",
+]
+
+[[package]]
+name = "libredox"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d"
+dependencies = [
+ "bitflags 2.9.0",
+ "libc",
+]
+
+[[package]]
+name = "log"
+version = "0.4.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e"
+
+[[package]]
+name = "loop9"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062"
+dependencies = [
+ "imgref",
+]
+
+[[package]]
+name = "maybe-rayon"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519"
+dependencies = [
+ "cfg-if",
+ "rayon",
+]
+
+[[package]]
+name = "memchr"
+version = "2.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
+
+[[package]]
+name = "minimal-lexical"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
+
+[[package]]
+name = "miniz_oxide"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5"
+dependencies = [
+ "adler2",
+ "simd-adler32",
+]
+
+[[package]]
+name = "new_debug_unreachable"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086"
+
+[[package]]
+name = "nom"
+version = "7.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
+dependencies = [
+ "memchr",
+ "minimal-lexical",
+]
+
+[[package]]
+name = "noop_proc_macro"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8"
+
+[[package]]
+name = "num-bigint"
+version = "0.4.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
+dependencies = [
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-derive"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "num-integer"
+version = "0.1.46"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "num-rational"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824"
+dependencies = [
+ "num-bigint",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.21.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d75b0bedcc4fe52caa0e03d9f1151a323e4aa5e2d78ba3580400cd3c9e2bc4bc"
+
+[[package]]
+name = "palette_extract"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "37152de66c36e76d4637af2a51310ede2c0e42b80357fa517bf1b595b56489a4"
+
+[[package]]
+name = "paste"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
+
+[[package]]
+name = "pkg-config"
+version = "0.3.32"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"
+
+[[package]]
+name = "png"
+version = "0.17.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526"
+dependencies = [
+ "bitflags 1.3.2",
+ "crc32fast",
+ "fdeflate",
+ "flate2",
+ "miniz_oxide",
+]
+
+[[package]]
+name = "ppv-lite86"
+version = "0.2.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
+dependencies = [
+ "zerocopy",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.94"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "profiling"
+version = "1.0.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d"
+dependencies = [
+ "profiling-procmacros",
+]
+
+[[package]]
+name = "profiling-procmacros"
+version = "1.0.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30"
+dependencies = [
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "qoi"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001"
+dependencies = [
+ "bytemuck",
+]
+
+[[package]]
+name = "quick-error"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3"
+
+[[package]]
+name = "quote"
+version = "1.0.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "rand"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
+dependencies = [
+ "libc",
+ "rand_chacha",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
+dependencies = [
+ "ppv-lite86",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
+dependencies = [
+ "getrandom",
+]
+
+[[package]]
+name = "rav1e"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9"
+dependencies = [
+ "arbitrary",
+ "arg_enum_proc_macro",
+ "arrayvec",
+ "av1-grain",
+ "bitstream-io",
+ "built",
+ "cfg-if",
+ "interpolate_name",
+ "itertools",
+ "libc",
+ "libfuzzer-sys",
+ "log",
+ "maybe-rayon",
+ "new_debug_unreachable",
+ "noop_proc_macro",
+ "num-derive",
+ "num-traits",
+ "once_cell",
+ "paste",
+ "profiling",
+ "rand",
+ "rand_chacha",
+ "simd_helpers",
+ "system-deps",
+ "thiserror",
+ "v_frame",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "ravif"
+version = "0.11.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2413fd96bd0ea5cdeeb37eaf446a22e6ed7b981d792828721e74ded1980a45c6"
+dependencies = [
+ "avif-serialize",
+ "imgref",
+ "loop9",
+ "quick-error",
+ "rav1e",
+ "rayon",
+ "rgb",
+]
+
+[[package]]
+name = "rayon"
+version = "1.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa"
+dependencies = [
+ "either",
+ "rayon-core",
+]
+
+[[package]]
+name = "rayon-core"
+version = "1.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2"
+dependencies = [
+ "crossbeam-deque",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "redox_users"
+version = "0.4.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43"
+dependencies = [
+ "getrandom",
+ "libredox",
+ "thiserror",
+]
+
+[[package]]
+name = "rgb"
+version = "0.8.50"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a"
+dependencies = [
+ "bytemuck",
+]
+
+[[package]]
+name = "rustversion"
+version = "1.0.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2"
+
+[[package]]
+name = "serde"
+version = "1.0.219"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.219"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "serde_spanned"
+version = "0.6.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "shlex"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
+
+[[package]]
+name = "simd-adler32"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe"
+
+[[package]]
+name = "simd_helpers"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6"
+dependencies = [
+ "quote",
+]
+
+[[package]]
+name = "smallvec"
+version = "1.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd"
+
+[[package]]
+name = "strsim"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
+
+[[package]]
+name = "syn"
+version = "2.0.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "system-deps"
+version = "6.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349"
+dependencies = [
+ "cfg-expr",
+ "heck",
+ "pkg-config",
+ "toml",
+ "version-compare",
+]
+
+[[package]]
+name = "target-lexicon"
+version = "0.12.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
+
+[[package]]
+name = "thiserror"
+version = "1.0.69"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.69"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "tiff"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e"
+dependencies = [
+ "flate2",
+ "jpeg-decoder",
+ "weezl",
+]
+
+[[package]]
+name = "toml"
+version = "0.8.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148"
+dependencies = [
+ "serde",
+ "serde_spanned",
+ "toml_datetime",
+ "toml_edit",
+]
+
+[[package]]
+name = "toml_datetime"
+version = "0.6.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "toml_edit"
+version = "0.22.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474"
+dependencies = [
+ "indexmap",
+ "serde",
+ "serde_spanned",
+ "toml_datetime",
+ "winnow",
+]
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
+
+[[package]]
+name = "utf8parse"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
+
+[[package]]
+name = "v_frame"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b"
+dependencies = [
+ "aligned-vec",
+ "num-traits",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "version-compare"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b"
+
+[[package]]
+name = "walrs"
+version = "1.0.1"
+dependencies = [
+ "clap",
+ "color-thief",
+ "dirs-next",
+ "image",
+ "palette_extract",
+]
+
+[[package]]
+name = "wasi"
+version = "0.11.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "rustversion",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
+dependencies = [
+ "bumpalo",
+ "log",
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "weezl"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082"
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+
+[[package]]
+name = "windows-sys"
+version = "0.59.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
+
+[[package]]
+name = "winnow"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0e97b544156e9bebe1a0ffbc03484fc1ffe3100cbce3ffb17eac35f7cdd7ab36"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "zerocopy"
+version = "0.8.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fd97444d05a4328b90e75e503a34bad781f14e28a823ad3557f0750df1ebcbc6"
+dependencies = [
+ "zerocopy-derive",
+]
+
+[[package]]
+name = "zerocopy-derive"
+version = "0.8.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6352c01d0edd5db859a63e2605f4ea3183ddbd15e2c4a9e7d32184df75e4f154"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "zune-core"
+version = "0.4.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a"
+
+[[package]]
+name = "zune-inflate"
+version = "0.2.54"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02"
+dependencies = [
+ "simd-adler32",
+]
+
+[[package]]
+name = "zune-jpeg"
+version = "0.4.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "99a5bab8d7dedf81405c4bb1f2b83ea057643d9cb28778cea9eecddeedd2e028"
+dependencies = [
+ "zune-core",
+]
diff --git a/Cargo.toml b/Cargo.toml
new file mode 100644
index 0000000..86a5f4c
--- /dev/null
+++ b/Cargo.toml
@@ -0,0 +1,14 @@
+[package]
+name = "walrs"
+version = "1.0.1"
+edition = "2024"
+description = "walrs is a fast color scheme generator."
+license = "MIT"
+repository = "https://github.com/pixel2175/walrs"
+
+[dependencies]
+clap = { version = "4.5.32", features = ["derive"] }
+color-thief = "0.2.2"
+dirs-next = "2.0.0"
+image = "0.25.5"
+palette_extract = "0.1.0"
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..f288702
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<https://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<https://www.gnu.org/licenses/why-not-lgpl.html>.
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..8c40da1
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,19 @@
+all: build
+
+build:
+ cargo build --release
+
+install: build
+ sudo install -d $(DESTDIR)$(PREFIX)/bin
+ sudo install -m755 target/release/walrs /usr/bin/walrs
+ sudo install -d ./templates/ /etc/walrs/templates
+ sudo cp -r templates/* /etc/walrs/templates/
+
+uninstall:
+ sudo rm -f $(DESTDIR)$(PREFIX)/bin/walrs
+ sudo rm -rf $(DESTDIR)$(SYSCONFDIR)/walrs
+
+clean:
+ cargo clean
+
+.PHONY: all build install uninstall clean
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..9365f3c
--- /dev/null
+++ b/README.md
@@ -0,0 +1,97 @@
+# walrs: Fast Color Scheme Generator
+
+walrs is a fast color scheme generator written in Rust that creates terminal color schemes from images.
+
+[](screenshots/preview.gif)
+
+---
+
+## Shortcuts
+- [Features](#features)
+- [Installation](#installation)
+- [Usage](#usage)
+- [Supported Terminals and Applications](#supported-terminals-and-applications)
+- [Performance](#performance)
+
+---
+
+## Features
+- **Rust-based**: Fast and minimal resource usage
+- **Generate terminal color schemes** from images
+- **Reload themes instantly**
+- **Compatible with pywal templates**
+- **Seamless integration** with various terminal emulators and applications
+
+---
+
+## Installation
+### From AUR
+```bash
+yay -S walrs
+```
+
+### From Cargo
+```bash
+cargo install rswal
+```
+
+### From Source
+```bash
+make install
+```
+The make install command will place all necessary files in their appropriate locations.
+
+---
+
+## Usage
+
+Generate a color scheme from an image:
+```bash
+walrs -i /path/to/image.jpg
+```
+
+Example output:
+```
+[I] Generate: generate colors.
+[I] Template: create templates.
+[I] Wallpaper: set the wallpaper.
+[I] Terminal: terminal colorscheme set.
+[I] Xrdb: xrdb colorscheme set.
+[I] Colors: colorscheme applied successfully.
+● ● ● ● ● ● ● ● ●
+```
+
+---
+
+## Supported Terminals and Applications
+walrs is compatible with various terminals and applications through pywal templates:
+- sway
+- xrdb
+- tty
+- kitty
+- polybar
+- And more!
+
+---
+
+## Performance
+walrs is designed to be lightweight and fast:
+- **Memory usage**: Approximately 3.9MB
+- **Processing time**: ~180-300ms to generate and apply a color scheme
+- **Dependencies**: Requires an external app to set wallpaper
+
+Example benchmark:
+```sh
+time walrs -i /home/pixel/.config/wallpaper/wallhaven-ymwj9d.jpg
+[I] Generate: generate colors.
+[I] Template: create templates.
+[I] Wallpaper: set the wallpaper.
+[I] Terminal: terminal colorscheme set.
+[I] Xrdb: xrdb colorscheme set.
+[I] Colors: colorscheme applied successfully.
+● ● ● ● ● ● ● ● ●
+________________________________________________________
+Executed in 185.80 millis fish external
+ usr time 119.95 millis 0.56 millis 119.39 millis
+ sys time 58.95 millis 1.12 millis 57.82 millis
+```
diff --git a/screenshots/preview.gif b/screenshots/preview.gif
new file mode 100644
index 0000000..511fadb
Binary files /dev/null and b/screenshots/preview.gif differ
diff --git a/src/create_templates.rs b/src/create_templates.rs
new file mode 100644
index 0000000..ec9d8ae
--- /dev/null
+++ b/src/create_templates.rs
@@ -0,0 +1,149 @@
+use std::fs::{self, create_dir_all, read_to_string, write};
+use crate::utils::{get_cache_folder, get_config_folder};
+
+fn change(template: &str, colors: (u8, u8, u8), alpha: u8) -> String {
+ let (r, g, b) = colors;
+
+ if template.contains(".strip") {
+ format!("{:02X}{:02X}{:02X}", r, g, b)
+ } else if template.contains(".xrgba") {
+ format!("{:02X}/{:02X}/{:02X}/{:02X}", r, g, b, alpha)
+ } else if template.contains(".rgba") {
+ format!("{},{},{},{}", r, g, b, alpha)
+ } else if template.contains(".rgb") {
+ format!("{},{},{}", r, g, b)
+ } else if template.contains(".alpha_dec") {
+ format!("{:.2}", alpha as f32 / 255.0)
+ } else if template.contains(".alpha") {
+ format!("#{:02X}{:02X}{:02X}{:02X}", r, g, b, alpha)
+ } else {
+ format!("#{:02X}{:02X}{:02X}", r, g, b)
+ }
+}
+
+fn fill_template(template_name: &str, template: &str, colors: &(Vec<(u8, u8, u8)>, u8), wallpaper: &str) {
+ let output_path = format!("{}/wal/{}", get_cache_folder().expect("Can't find cache folder"), template_name);
+ let alpha = colors.1;
+
+ let mut result = template
+ .replace("{wallpaper}", wallpaper)
+ .replace("{alpha}", &format!("{}", (alpha / 255) * 100));
+
+ if colors.0.len() > 0 {
+ let background_patterns = [
+ "{background.strip}",
+ "{background.xrgba}",
+ "{background.rgba}",
+ "{background.rgb}",
+ "{background.alpha_dec}",
+ "{background.alpha}",
+ "{background}",
+ ];
+
+ for pattern in background_patterns {
+ let replacement = change(pattern, colors.0[0], alpha);
+ result = result.replace(pattern, &replacement);
+ }
+ }
+
+ if colors.0.len() > 7 {
+ let foreground_patterns = [
+ "{foreground.strip}",
+ "{foreground.xrgba}",
+ "{foreground.rgba}",
+ "{foreground.rgb}",
+ "{foreground.alpha_dec}",
+ "{foreground.alpha}",
+ "{foreground}",
+ ];
+
+ for pattern in foreground_patterns {
+ let replacement = change(pattern, colors.0[7], alpha);
+ result = result.replace(pattern, &replacement);
+ }
+
+ let cursor_patterns = [
+ "{cursor.strip}",
+ "{cursor.xrgba}",
+ "{cursor.rgba}",
+ "{cursor.rgb}",
+ "{cursor.alpha_dec}",
+ "{cursor.alpha}",
+ "{cursor}",
+ ];
+
+ for pattern in cursor_patterns {
+ let replacement = change(pattern, colors.0[7], alpha);
+ result = result.replace(pattern, &replacement);
+ }
+ }
+
+ for i in 0..colors.0.len().min(16) {
+ let color = colors.0[i];
+
+ let patterns = [
+ format!("{{color{}.strip}}", i),
+ format!("{{color{}.xrgba}}", i),
+ format!("{{color{}.rgba}}", i),
+ format!("{{color{}.rgb}}", i),
+ format!("{{color{}.alpha_dec}}", i),
+ format!("{{color{}.alpha}}", i),
+ format!("{{color{}}}", i),
+ ];
+
+ for pattern in patterns {
+ let replacement = change(&pattern, color, alpha);
+ result = result.replace(&pattern, &replacement);
+ }
+ }
+
+ if result.contains("{checksum}") {
+ let checksum = colors.0.iter()
+ .map(|(r, g, b)| format!("{:02X}{:02X}{:02X}", r, g, b))
+ .collect::<Vec<String>>()
+ .join("");
+ result = result.replace("{checksum}", &checksum);
+ }
+
+ write(output_path, result).expect("Failed to write filled template");
+}
+
+pub fn create_template(colors: (Vec<(u8, u8, u8)>, u8), wallpaper: String) {
+ let system_template_path = "/etc/walrs/templates/";
+ let user_template_path = format!("{}/walrs/templates/", get_config_folder().unwrap());
+ let cache_path = format!("{}/wal/", get_cache_folder().unwrap());
+ let _ = create_dir_all(&cache_path);
+
+ // Check if user templates directory exists and has templates
+ let mut has_user_templates = false;
+ if let Ok(entries) = fs::read_dir(&user_template_path) {
+ for entry in entries.flatten() {
+ if entry.path().is_file() {
+ has_user_templates = true;
+ let Ok(content) = read_to_string(entry.path()) else { continue };
+ let Some(name) = entry.file_name().into_string().ok() else { continue };
+ fill_template(&name, &content, &colors, &wallpaper);
+ }
+ }
+ }
+
+ // If no user templates, copy from system templates
+ if !has_user_templates {
+ let _ = create_dir_all(&user_template_path);
+
+ if let Ok(entries) = fs::read_dir(system_template_path) {
+ for entry in entries.flatten() {
+ if entry.path().is_file() {
+ let Ok(content) = read_to_string(entry.path()) else { continue };
+ let Some(name) = entry.file_name().into_string().ok() else { continue };
+
+ // Copy template to user directory
+ let user_file_path = format!("{}{}", user_template_path, name);
+ let _ = write(&user_file_path, &content);
+
+ fill_template(&name, &content, &colors, &wallpaper);
+ }
+ }
+ }
+ }
+}
diff --git a/src/get_colors.rs b/src/get_colors.rs
new file mode 100644
index 0000000..e67c010
--- /dev/null
+++ b/src/get_colors.rs
@@ -0,0 +1,103 @@
+use color_thief::ColorFormat;
+use image;
+use palette_extract::{MaxColors, Quality,};
+use std::collections::HashSet;
+use std::process::exit;
+use std::u8;
+use crate::utils::warning;
+
+fn adjust_rgb(r: u8, g: u8, b: u8, brightness: i16, saturation: i16) -> (u8, u8, u8) {
+ let avg = ((r as u16 + g as u16 + b as u16) / 3) as f32;
+
+ let r = ((r as f32 - avg) * (saturation as f32 / 100.0) + avg + brightness as f32).clamp(0.0, 255.0);
+ let g = ((g as f32 - avg) * (saturation as f32 / 100.0) + avg + brightness as f32).clamp(0.0, 255.0);
+ let b = ((b as f32 - avg) * (saturation as f32 / 100.0) + avg + brightness as f32).clamp(0.0, 255.0);
+
+ (r as u8, g as u8, b as u8)
+}
+
+fn remove_duplicates(colors: Vec<(u8, u8, u8)>) -> Vec<(u8, u8, u8)> {
+ let set: HashSet<_> = colors.into_iter().collect();
+ set.into_iter().collect()
+}
+
+fn to_gray(r: u8, g: u8, b: u8, v: Option<u8>) -> (u8, u8, u8) {
+ if let Some(v) = v{
+
+ let mut gray = (0.3 * r as f32 + 0.59 * g as f32 + 0.11 * b as f32).round() as u8;
+ gray = gray.saturating_add(v);
+ (gray, gray, gray)
+ }else{
+ (r,g,b)
+ }
+}
+
+fn generate_variation(color: (u8, u8, u8), offset: i16) -> (u8, u8, u8) {
+ adjust_rgb(color.0, color.1, color.2, offset, 50)
+}
+
+pub fn get_colors(image_path: String,send:bool) -> (Vec<(u8,u8,u8)>,u8){
+ let image = match image::open(image_path){
+ Ok(v) => v,
+ Err(_) => {warning("Image", "Unsupported or corrupted image format",send);exit(1)},
+ };
+ let native_rgba = image.to_rgba8();
+ let alpha = &native_rgba.get_pixel(0, 0)[3];
+ let mut collect_rgb:Vec<(u8,u8,u8)> = Vec::new();
+
+ let palette_extract = palette_extract::get_palette_with_options(
+ &native_rgba,
+ palette_extract::PixelEncoding::Rgba,
+ Quality::new(5),
+ MaxColors::new(15),
+ palette_extract::PixelFilter::White
+ );
+ let palette_thief = color_thief::get_palette(&native_rgba,ColorFormat::Rgba, 5,15);
+
+ for color in palette_extract{
+ collect_rgb.push((color.r, color.g, color.b));
+ }
+
+ if let Ok(colors) = palette_thief{
+ for color in colors {
+ collect_rgb.push((color.r, color.g, color.b));
+ }
+ }
+
+ collect_rgb = remove_duplicates(collect_rgb);
+
+ let mut i = 0;
+ while collect_rgb.len() <= 21 {
+ let base = collect_rgb[i % collect_rgb.len()];
+ let variation = generate_variation(base, 10 * (i as i16 + 1));
+ collect_rgb.push(variation);
+ i += 1;
+ }
+
+ collect_rgb.sort_by(|a, b| {
+ let lum_a = 0.299 * a.0 as f32 + 0.587 * a.1 as f32 + 0.114 * a.2 as f32;
+ let lum_b = 0.299 * b.0 as f32 + 0.587 * b.1 as f32 + 0.114 * b.2 as f32;
+ lum_a.partial_cmp(&lum_b).unwrap()
+ });
+
+ let colors = [0, 13, 15, 16, 17, 21, 20, 19, 9,13,15,16,17,21,20,19];
+
+ let mut done:Vec<(u8,u8,u8)> = Vec::new();
+
+ for color in colors{
+ let (mut r, mut g, mut b) = collect_rgb[color];
+ (r,g,b) = adjust_rgb(r, g, b,-10,80);
+ done.push((r,g,b));
+ }
+
+ let (mut r,mut g,mut b) = collect_rgb[20];
+ (r,g,b) = adjust_rgb(r,g,b,60,-10);
+ (r,g,b) = to_gray(r, g, b, Some(2));
+ done[7] = (r,g,b);
+ done[15] = (r,g,b);
+
+ (done,*alpha)
+
+
+}
+
diff --git a/src/main.rs b/src/main.rs
new file mode 100644
index 0000000..d146778
--- /dev/null
+++ b/src/main.rs
@@ -0,0 +1,78 @@
+mod get_colors;
+mod create_templates;
+mod reload;
+mod wallpaper;
+mod utils;
+
+use wallpaper::change_wallpaper;
+use reload::reload;
+use create_templates::create_template;
+use get_colors::get_colors;
+use clap::{ArgAction, CommandFactory, Parser};
+use std::path::Path;
+use std::process::exit;
+use utils::*;
+
+#[derive(Parser, Debug)]
+#[command(name = "walrs",version="v1.0.1",about= "walrs - Generate colorscheme from image")]
+
+struct Arg {
+ /// path/to/your/wal.png
+ #[arg(short = 'i')]
+ image: Option<String>,
+
+ /// reload Templates from cache file
+ #[arg(short = 'R', action = ArgAction::SetTrue)]
+ reload: bool,
+
+ /// set quit mode (no output)
+ #[arg(short = 'q', action = ArgAction::SetTrue)]
+ quit: bool,
+}
+
+fn main() {
+ let arg = Arg::parse();
+
+ if !arg.reload && arg.image.is_none() {
+ let mut cmd = Arg::command();
+ let _ = cmd.print_help();
+
+ std::process::exit(1);
+ }
+
+ if arg.reload {
+ reload(!arg.quit);
+ exit(0);
+ }
+
+ let image_path = match arg.image {
+ Some(ref v) if Path::new(v).exists() => match get_absolute_path(v) {
+ Some(p) => p,
+ None => {
+ warning("Wallpaper", "Can't find wallpaper absolute path!", !arg.quit);
+ exit(1);
+ }
+ },
+ Some(_) => {
+ warning("Image", "Image does not exist", !arg.quit);
+ exit(1);
+ }
+ None => {
+ warning("Image", "Can't find Image", !arg.quit);
+ exit(1);
+ }
+ };
+
+ let palette = get_colors(image_path.clone(), !arg.quit);
+ info("Generate", "generate colors", !arg.quit);
+
+ create_template(palette, image_path.clone());
+ info("Template", "create templates", !arg.quit);
+
+ change_wallpaper(&image_path.to_string(),!arg.quit);
+
+ reload(!arg.quit);
+
+ print_colors(!arg.quit);
+}
+
diff --git a/src/reload.rs b/src/reload.rs
new file mode 100644
index 0000000..78421e4
--- /dev/null
+++ b/src/reload.rs
@@ -0,0 +1,127 @@
+use std::fs::{File, read_dir};
+use std::io::{BufRead, BufReader};
+use std::process::{Command, Stdio};
+use std::fs::OpenOptions;
+use std::io::Write;
+use std::process::exit;
+
+
+use crate::utils::{get_cache_folder,info,warning};
+
+fn run(command: &str) -> bool {
+ Command::new("sh")
+ .arg("-c")
+ .arg(command)
+ .stdout(Stdio::null())
+ .stderr(Stdio::null())
+ .status()
+ .map(|s| s.success())
+ .unwrap_or(false)
+}
+
+fn tty(cache:&str) {
+ let path = format!("{}/wal/colors-tty.sh", cache);
+ if Command::new("tty").arg("-s").status().map(|s| s.success()).unwrap_or(false) {
+ run(&format!("chmod +x {}", path));
+ run(&path);
+ }
+}
+
+fn xrdb(cache:&str,send:bool) {
+ if run("which xrdb") {
+ run(&format!("xrdb -merge -quiet {}/wal/colors.Xresources", cache));
+ info("Xrdb", "xrdb colorscheme set",send);
+ }
+}
+
+fn i3(send:bool) {
+ if run("pgrep -x i3") {
+ run("i3-msg reload");
+ info("i3", "i3 colorscheme set",send);
+ }
+}
+
+fn bspwm(send:bool) {
+ if run("pgrep -x bspwm") {
+ run("bspc wm -r");
+ info("Bspwm", "bspwm colorscheme set",send);
+ }
+}
+
+fn kitty(cache:&str,send:bool) {
+ if run("which kitty") && run("pgrep kitty") {
+ run(&format!("kitty @ set-colors --all {}/wal/colors-kitty.conf", cache));
+ info("Kitty", "kitty colorscheme set",send);
+ }
+}
+
+fn polybar(send:bool) {
+ if run("which polybar") && run("pgrep polybar") {
+ run("pkill -USR1 polybar");
+ info("Polybar", "polybar colorscheme set",send);
+ }
+}
+
+fn sway(send:bool) {
+ if run("which swaymsg") && run("pgrep sway") {
+ run("swaymsg reload");
+ info("Sway", "sway colorscheme set",send);
+ }
+}
+
+fn colors(colors:Vec<String>,send:bool){
+
+ for i in read_dir("/dev/pts/").expect("Can't load terminals"){
+ let file = i.unwrap().file_name().into_string().unwrap();
+ if file != "ptmx" && file.parse::<i32>().is_ok(){
+ let special_index = [(10,7),(11,0),(12,15),(708,5)];
+ let term = file.parse::<i32>().unwrap();
+ for (i,value) in colors.iter().enumerate(){
+ let sequence = format!("\x1b]4;{};{}\x1b\\", i, value);
+
+ if let Ok(mut file) = OpenOptions::new().write(true).open(format!("/dev/pts/{}",term)) {
+ let _ = file.write_all(sequence.as_bytes());
+ };
+ };
+ for (i,v) in special_index{
+ let sequence = format!("\x1b]{};{}\x1b\\", i,colors[v] );
+
+ if let Ok(mut file) = OpenOptions::new().write(true).open(format!("/dev/pts/{}",term)) {
+ let _ = file.write_all(sequence.as_bytes());
+ };
+
+ }
+ }
+ }
+ info("Terminal", "terminal colorscheme set",send);
+}
+
+pub fn reload(send:bool) {
+ let cache = get_cache_folder().expect("Can't get cache path");
+ let file_path = format!("{}/wal/colors", cache);
+
+ let lines: Vec<String> = BufReader::new(File::open(&file_path).expect("Can't load colors"))
+ .lines()
+ .collect::<Result<_, _>>()
+ .expect("Failed to read lines");
+
+ // Spawn threads
+ let cache = match get_cache_folder() {
+ Some(v) => v,
+ None => {warning("Path", "can't found cache folder",send);exit(1)}
+ };
+
+
+
+ colors(lines,send);
+ xrdb(&cache,send);
+ kitty(&cache,send);
+ i3(send);
+ sway(send);
+ bspwm(send);
+ polybar(send);
+ tty(&cache);
+ info("Colors", "colorscheme applied successfully",send);
+
+}
+
diff --git a/src/utils.rs b/src/utils.rs
new file mode 100644
index 0000000..67d2684
--- /dev/null
+++ b/src/utils.rs
@@ -0,0 +1,46 @@
+use std::{fs, process::Command};
+use dirs_next::{cache_dir, config_dir};
+use std::path::Path;
+
+pub fn print_colors(send:bool) {
+ if send{
+
+ if let Ok(output) = Command::new("bash")
+ .arg("-c")
+ .arg(r#"for i in {30..37} 90; do echo -en "\033[0;${i}m●\033[0m "; done; echo"#)
+ .output()
+ {
+ if output.status.success() {
+ print!("{}", String::from_utf8_lossy(&output.stdout));
+ }
+ }
+ }
+}
+
+
+pub fn warning(title:&str,message:&str,send:bool){
+ if send{
+ println!("[\x1b[33mW\x1b[0m] \x1b[31m{title}:\x1b[0m {message}.");
+ }
+}
+
+pub fn info(title:&str,message:&str, send:bool){
+ if send{
+ println!("[\x1b[32mI\x1b[0m] \x1b[31m{title}:\x1b[0m {message}.");
+ }
+}
+
+
+pub fn get_config_folder() -> Option<String> {
+ config_dir()?.to_str().map(|s| s.to_string())
+}
+
+pub fn get_cache_folder() -> Option<String> {
+ cache_dir()?.to_str().map(|s| s.to_string())
+}
+
+pub fn get_absolute_path(path_str: &str) -> Option<String> {
+ let path = Path::new(path_str);
+ fs::canonicalize(path).ok()?.to_str().map(|s| s.to_string())
+}
+
diff --git a/src/wallpaper.rs b/src/wallpaper.rs
new file mode 100644
index 0000000..9481355
--- /dev/null
+++ b/src/wallpaper.rs
@@ -0,0 +1,343 @@
+use std::env;
+use std::path::Path;
+use std::process::{Command, Stdio};
+use crate::utils::{info, warning};
+
+fn run(command: &str) -> bool {
+ Command::new("sh")
+ .arg("-c")
+ .arg(command)
+ .stdout(Stdio::null())
+ .stderr(Stdio::null())
+ .status()
+ .map(|s| s.success())
+ .unwrap_or(false)
+}
+
+fn run_with_output(command: &str) -> Option<String> {
+ let output = Command::new("sh")
+ .arg("-c")
+ .arg(command)
+ .stderr(Stdio::null())
+ .stdout(Stdio::null())
+ .output()
+ .ok()?;
+
+ if output.status.success() {
+ String::from_utf8(output.stdout).ok()
+ } else {
+ None
+ }
+}
+
+fn spawn(command: &str) {
+ let _ = Command::new("sh")
+ .arg("-c")
+ .arg(command)
+ .stderr(Stdio::null())
+ .stdout(Stdio::null())
+ .spawn();
+}
+
+fn get_desktop_env() -> Option<String> {
+ let keys = [
+ "XDG_CURRENT_DESKTOP",
+ "DESKTOP_SESSION",
+ "GNOME_DESKTOP_SESSION_ID",
+ "MATE_DESKTOP_SESSION_ID",
+ "SWAYSOCK",
+ "HYPRLAND_INSTANCE_SIGNATURE",
+ "DESKTOP_STARTUP_ID",
+ "I3SOCK",
+ "WAYLAND_DISPLAY",
+ ];
+
+ // Check specifically for Sway
+ if env::var("SWAYSOCK").is_ok() || run("pgrep -x sway") {
+ return Some("SWAY".to_string());
+ }
+
+ // Check if Hyprland is running
+ if run("pgrep -x Hyprland") || env::var("HYPRLAND_INSTANCE_SIGNATURE").is_ok() {
+ return Some("HYPRLAND".to_string());
+ }
+
+ // Check if i3 is running
+ if run("pgrep -x i3") || env::var("I3SOCK").is_ok() {
+ return Some("I3".to_string());
+ }
+
+ // Check if bspwm is running
+ if run("pgrep -x bspwm") {
+ return Some("BSPWM".to_string());
+ }
+
+ // Check if qtile is running
+ if run("pgrep -x qtile") {
+ return Some("QTILE".to_string());
+ }
+
+ // Check for other environment variables
+ for key in keys.iter() {
+ if let Ok(val) = env::var(key) {
+ if !val.is_empty() {
+ if *key == "DESKTOP_STARTUP_ID" && val.contains("awesome") {
+ return Some("AWESOME".to_string());
+ }
+ if *key == "WAYLAND_DISPLAY" && env::var("XDG_CURRENT_DESKTOP").is_err() {
+ // Generic Wayland session without specific DE identifier
+ return Some("WAYLAND".to_string());
+ }
+ // Don't return SWAYSOCK here, as we've already checked for it
+ if *key != "SWAYSOCK" {
+ return Some(val);
+ }
+ }
+ }
+ }
+ None
+}
+
+fn set_wm_wallpaper(img: &str, send: bool) {
+ if run("which feh") {
+ spawn(&format!("feh --no-fehbg --bg-fill '{}'", img));
+ info("Wallpaper", "wallpaper set with feh", send);
+ } else if run("which xwallpaper") {
+ spawn(&format!("xwallpaper --zoom '{}'", img));
+ info("Wallpaper", "wallpaper set with xwallpaper", send);
+ } else if run("which hsetroot") {
+ spawn(&format!("hsetroot -fill '{}'", img));
+ info("Wallpaper", "wallpaper set with hsetroot", send);
+ } else if run("which nitrogen") {
+ spawn(&format!("nitrogen --set-zoom-fill --save '{}'", img));
+ info("Wallpaper", "wallpaper set with nitrogen", send);
+ } else if run("which xsetroot") {
+ warning("Wallpaper", "using xsetroot, but it does not support images properly", send);
+ spawn(&format!("xsetroot -solid '#000000'"));
+ info("Wallpaper", "set solid background with xsetroot", send);
+ } else {
+ warning("Wallpaper", "can't find any app to set wallpaper", send);
+ }
+}
+
+fn set_desktop_wallpaper(desktop: &str, img: &str, send: bool) {
+ let d = desktop.to_lowercase();
+
+ // Convert img to absolute path
+ let abs_path = if Path::new(img).is_absolute() {
+ img.to_string()
+ } else {
+ match std::fs::canonicalize(img) {
+ Ok(p) => p.to_string_lossy().to_string(),
+ Err(_) => {
+ warning("Wallpaper", "failed to get absolute path", send);
+ img.to_string()
+ }
+ }
+ };
+
+ if d.contains("xfce") || d.contains("xubuntu") {
+ // Try to find the active monitor
+ let monitors = run_with_output("xfconf-query -c xfce4-desktop -l | grep last-image").unwrap_or_default();
+ if !monitors.is_empty() {
+ for line in monitors.lines() {
+ spawn(&format!(
+ "xfconf-query --channel xfce4-desktop --property {} --set '{}'",
+ line.trim(), abs_path
+ ));
+ }
+ } else {
+ // Fallback to default monitor
+ spawn(&format!(
+ "xfconf-query --channel xfce4-desktop --property /backdrop/screen0/monitor0/workspace0/last-image --set '{}'",
+ abs_path
+ ));
+ }
+ info("Wallpaper", "wallpaper set with XFCE settings", send);
+ } else if d.contains("gnome") || d.contains("unity") || d.contains("ubuntu") {
+ // Check for GNOME version for compatibility
+ if run("gsettings get org.gnome.desktop.background picture-uri-dark") {
+ // GNOME 42+ with light/dark mode support
+ spawn(&format!(
+ "gsettings set org.gnome.desktop.background picture-uri 'file://{}'",
+ abs_path
+ ));
+ spawn(&format!(
+ "gsettings set org.gnome.desktop.background picture-uri-dark 'file://{}'",
+ abs_path
+ ));
+ } else {
+ // Older GNOME versions
+ spawn(&format!(
+ "gsettings set org.gnome.desktop.background picture-uri 'file://{}'",
+ abs_path
+ ));
+ }
+ info("Wallpaper", "wallpaper set with GNOME settings", send);
+ } else if d.contains("mate") {
+ spawn(&format!(
+ "gsettings set org.mate.background picture-filename '{}'",
+ abs_path
+ ));
+ info("Wallpaper", "wallpaper set with MATE settings", send);
+ } else if d.contains("cinnamon") {
+ spawn(&format!(
+ "gsettings set org.cinnamon.desktop.background picture-uri 'file://{}'",
+ abs_path
+ ));
+ info("Wallpaper", "wallpaper set with Cinnamon settings", send);
+ } else if d.contains("hyprland") {
+ // Try to determine the monitor configuration
+ let monitors = run_with_output("hyprctl monitors -j | jq -r '.[].name'").unwrap_or_default();
+ if !monitors.is_empty() {
+ // Set for each monitor
+ for monitor in monitors.lines() {
+ spawn(&format!("hyprctl hyprpaper wallpaper \"{},{}\"", monitor.trim(), abs_path));
+ }
+ } else {
+ // No monitors detected, try generic approach
+ if run("which hyprpaper") {
+ // Using hyprpaper
+ spawn(&format!("echo 'preload = {}\\nwallpaper = {}' > ~/.config/hypr/hyprpaper.conf", abs_path, abs_path));
+ //spawn(&format!("echo 'wallpaper = ,{}' >> ~/.config/hypr/hyprpaper.conf", abs_path));
+ spawn("killall hyprpaper; hyprpaper &");
+ info("Wallpaper", "wallpaper set with hyprpaper", send);
+ } else {
+ // Using swaybg as fallback for Hyprland
+ spawn(&format!("pkill swaybg; swaybg -i '{}' -m fill &", abs_path));
+ info("Wallpaper", "wallpaper set with swaybg for Hyprland", send);
+ }
+ }
+ } else if d == "sway" {
+ // Using swww or swaybg for Sway
+ if run("which swww") {
+ // Initialize swww if not running
+ if !run("pgrep -x swww-daemon") {
+ spawn("swww init");
+ }
+ spawn(&format!("swww img '{}' --transition-type fade --transition-fps 60", abs_path));
+ info("Wallpaper", "wallpaper set with swww for Sway", send);
+ } else if run("which swaybg") {
+ spawn(&format!("pkill swaybg; swaybg -i '{}' -m fill &", abs_path));
+ info("Wallpaper", "wallpaper set with swaybg for Sway", send);
+ } else {
+ warning("Wallpaper", "no suitable wallpaper tool found for Sway", send);
+ }
+ } else if d.contains("awesome") {
+ spawn(&format!(
+ "awesome-client \"require('gears').wallpaper.maximized('{}')\"",
+ abs_path
+ ));
+ info("Wallpaper", "wallpaper set with Awesome WM", send);
+ } else if d.contains("kde") || d.contains("plasma") {
+ let script = format!(
+ r#"var allDesktops = desktops();for (i=0;i<allDesktops.length;i++){{d = allDesktops[i];d.wallpaperPlugin = "org.kde.image";d.currentConfigGroup = Array("Wallpaper", "org.kde.image", "General");d.writeConfig("Image", "{}");}}"#,
+ abs_path
+ );
+ spawn(&format!(
+ "qdbus org.kde.plasmashell /PlasmaShell org.kde.PlasmaShell.evaluateScript \"{}\"",
+ script
+ ));
+ info("Wallpaper", "wallpaper set with KDE Plasma settings", send);
+ } else if d.contains("i3") {
+ // i3 support
+ if run("which feh") {
+ spawn(&format!("feh --no-fehbg --bg-fill '{}'", abs_path));
+ info("Wallpaper", "wallpaper set with feh for i3", send);
+ } else {
+ set_wm_wallpaper(&abs_path, send);
+ }
+ } else if d.contains("bspwm") {
+ // bspwm support
+ if run("which feh") {
+ spawn(&format!("feh --no-fehbg --bg-fill '{}'", abs_path));
+ info("Wallpaper", "wallpaper set with feh for bspwm", send);
+ } else {
+ set_wm_wallpaper(&abs_path, send);
+ }
+ } else if d.contains("qtile") {
+ // qtile support - uses typical WM wallpaper setters
+ set_wm_wallpaper(&abs_path, send);
+ } else if d.contains("wayland") {
+ // Generic Wayland - try multiple approaches
+ if run("which swaybg") {
+ spawn(&format!("pkill swaybg; swaybg -i '{}' -m fill &", abs_path));
+ info("Wallpaper", "wallpaper set with swaybg", send);
+ } else if run("which wbg") {
+ spawn(&format!("wbg '{}'", abs_path));
+ info("Wallpaper", "wallpaper set with wbg", send);
+ } else if run("which swww") {
+ spawn(&format!("swww img '{}'", abs_path));
+ info("Wallpaper", "wallpaper set with swww", send);
+ } else {
+ warning("Wallpaper", "no suitable Wayland wallpaper tool found", send);
+ }
+ } else if d.contains("wayfire") {
+ // Wayfire compositor
+ if run("which wbg") {
+ spawn(&format!("wbg '{}'", abs_path));
+ info("Wallpaper", "wallpaper set with wbg for Wayfire", send);
+ } else {
+ spawn(&format!("pkill swaybg; swaybg -i '{}' -m fill &", abs_path));
+ info("Wallpaper", "wallpaper set with swaybg for Wayfire", send);
+ }
+ } else if d.contains("deepin") {
+ spawn(&format!(
+ "gsettings set com.deepin.wrap.gnome.desktop.background picture-uri 'file://{}'",
+ abs_path
+ ));
+ info("Wallpaper", "wallpaper set with Deepin settings", send);
+ } else if d.contains("lxqt") {
+ // LXQt uses pcmanfm-qt for desktop management
+ spawn(&format!(
+ "pcmanfm-qt --set-wallpaper='{}'",
+ abs_path
+ ));
+ info("Wallpaper", "wallpaper set with LXQt settings", send);
+ } else if d.contains("lxde") {
+ // LXDE uses pcmanfm for desktop management
+ spawn(&format!(
+ "pcmanfm --set-wallpaper='{}'",
+ abs_path
+ ));
+ info("Wallpaper", "wallpaper set with LXDE settings", send);
+ } else if d.contains("budgie") {
+ // Budgie uses GNOME settings
+ spawn(&format!(
+ "gsettings set org.gnome.desktop.background picture-uri 'file://{}'",
+ abs_path
+ ));
+ info("Wallpaper", "wallpaper set with Budgie (GNOME) settings", send);
+ } else if d.contains("enlightenment") || d.contains("e17") || d.contains("e16") {
+ // Enlightenment WM - try using enlightenment_remote
+ if run("which enlightenment_remote") {
+ spawn(&format!(
+ "enlightenment_remote -desktop-bg-add 0 0 0 0 '{}'",
+ abs_path
+ ));
+ info("Wallpaper", "wallpaper set with Enlightenment", send);
+ } else {
+ set_wm_wallpaper(&abs_path, send);
+ }
+ } else {
+ // Default to the generic wallpaper setters
+ set_wm_wallpaper(&abs_path, send);
+ }
+}
+
+pub fn change_wallpaper(img: &str, send: bool) {
+ if !Path::new(img).is_file() {
+ warning("Wallpaper", "invalid image path", send);
+ return;
+ }
+
+ match get_desktop_env() {
+ Some(d) => {
+ info("Wallpaper", &format!("detected environment: {}", d), send);
+ set_desktop_wallpaper(&d, img, send);
+ },
+ None => {
+ set_wm_wallpaper(img, send);
+ },
+ }
+}
diff --git a/templates/Colors.hs b/templates/Colors.hs
new file mode 100644
index 0000000..2e26a11
--- /dev/null
+++ b/templates/Colors.hs
@@ -0,0 +1,33 @@
+--Place this file in your .xmonad/lib directory and import module Colors into .xmonad/xmonad.hs config
+--The easy way is to create a soft link from this file to the file in .xmonad/lib using ln -s
+--Then recompile and restart xmonad.
+module Colors
+ ( wallpaper
+ , background, foreground, cursor
+ , color0, color1, color2, color3, color4, color5, color6, color7
+ , color8, color9, color10, color11, color12, color13, color14, color15
+ ) where
+-- Shell variables
+-- Generated by 'wal'
+wallpaper="{wallpaper}"
+-- Special
+background="{background}"
+foreground="{foreground}"
+cursor="{cursor}"
+-- Colors
+color0="{color0}"
+color1="{color1}"
+color2="{color2}"
+color3="{color3}"
+color4="{color4}"
+color5="{color5}"
+color6="{color6}"
+color7="{color7}"
+color8="{color8}"
+color9="{color9}"
+color10="{color10}"
+color11="{color11}"
+color12="{color12}"
+color13="{color13}"
+color14="{color14}"
+color15="{color15}"
diff --git a/templates/colors b/templates/colors
new file mode 100644
index 0000000..228f4c8
--- /dev/null
+++ b/templates/colors
@@ -0,0 +1,16 @@
+{color0}
+{color1}
+{color2}
+{color3}
+{color4}
+{color5}
+{color6}
+{color7}
+{color8}
+{color9}
+{color10}
+{color11}
+{color12}
+{color13}
+{color14}
+{color15}
diff --git a/templates/colors--nodim-alacritty.yml b/templates/colors--nodim-alacritty.yml
new file mode 100644
index 0000000..0180a6b
--- /dev/null
+++ b/templates/colors--nodim-alacritty.yml
@@ -0,0 +1,44 @@
+colors:
+ primary:
+ background: "{background}"
+ foreground: "{foreground}"
+ cursor:
+ text: CellBackground
+ cursor: CellForeground
+ vi_mode_cursor:
+ text: CellBackground
+ cursor: CellForeground
+ search:
+ matches:
+ foreground: '{color0}'
+ background: '{color15}'
+ focused_match:
+ foreground: CellBackground
+ background: CellForeground
+ line_indicator:
+ foreground: None
+ background: None
+ footer_bar:
+ foreground: '{color8}'
+ background: '{color7}'
+ selection:
+ text: CellBackground
+ background: CellForeground
+ normal:
+ black: "{color0}"
+ red: "{color1}"
+ green: "{color2}"
+ yellow: "{color3}"
+ blue: "{color4}"
+ magenta: "{color5}"
+ cyan: "{color6}"
+ white: "{color7}"
+ bright:
+ black: "{color8}"
+ red: "{color9}"
+ green: "{color10}"
+ yellow: "{color11}"
+ blue: "{color12}"
+ magenta: "{color13}"
+ cyan: "{color14}"
+ white: "{color15}"
diff --git a/templates/colors-alacritty.toml b/templates/colors-alacritty.toml
new file mode 100644
index 0000000..884bf61
--- /dev/null
+++ b/templates/colors-alacritty.toml
@@ -0,0 +1,51 @@
+[colors.primary]
+background = "{background}"
+foreground = "{foreground}"
+[colors.cursor]
+text = "{background}"
+cursor = "{foreground}"
+[colors.vi_mode_cursor]
+text = "{background}"
+cursor = "{foreground}"
+[colors.search.matches]
+foreground = "{color0}"
+background = "{color15}"
+[colors.search.focused_match]
+foreground = "CellBackground"
+background = "CellForeground"
+[colors.line_indicator]
+foreground = "None"
+background = "None"
+[colors.footer_bar]
+foreground = "{color8}"
+background = "{color7}"
+[colors.selection]
+text = "CellBackground"
+background = "CellForeground"
+[colors.normal]
+black = "{color0}"
+red = "{color1}"
+green = "{color2}"
+yellow = "{color3}"
+blue = "{color4}"
+magenta = "{color5}"
+cyan = "{color6}"
+white = "{color7}"
+[colors.bright]
+black = "{color8}"
+red = "{color9}"
+green = "{color10}"
+yellow = "{color11}"
+blue = "{color12}"
+magenta = "{color13}"
+cyan = "{color14}"
+white = "{color15}"
+[colors.dim]
+black = "{color15}"
+red = "{color9}"
+green = "{color13}"
+yellow = "{color11}"
+blue = "{color12}"
+magenta = "{color10}"
+cyan = "{color14}"
+white = "{color8}"
diff --git a/templates/colors-alacritty.yml b/templates/colors-alacritty.yml
new file mode 100644
index 0000000..9200b33
--- /dev/null
+++ b/templates/colors-alacritty.yml
@@ -0,0 +1,53 @@
+colors:
+ primary:
+ background: "{background}"
+ foreground: "{foreground}"
+ cursor:
+ text: CellBackground
+ cursor: CellForeground
+ vi_mode_cursor:
+ text: CellBackground
+ cursor: CellForeground
+ search:
+ matches:
+ foreground: '{color0}'
+ background: '{color15}'
+ focused_match:
+ foreground: CellBackground
+ background: CellForeground
+ line_indicator:
+ foreground: None
+ background: None
+ footer_bar:
+ foreground: '{color8}'
+ background: '{color7}'
+ selection:
+ text: CellBackground
+ background: CellForeground
+ normal:
+ black: "{color0}"
+ red: "{color1}"
+ green: "{color2}"
+ yellow: "{color3}"
+ blue: "{color4}"
+ magenta: "{color5}"
+ cyan: "{color6}"
+ white: "{color7}"
+ bright:
+ black: "{color8}"
+ red: "{color9}"
+ green: "{color10}"
+ yellow: "{color11}"
+ blue: "{color12}"
+ magenta: "{color13}"
+ cyan: "{color14}"
+ white: "{color15}"
+ dim:
+ black: "{color15}"
+ red: "{color9}"
+ green: "{color13}"
+ yellow: "{color11}"
+ blue: "{color12}"
+ magenta: "{color10}"
+ cyan: "{color14}"
+ white: "{color8}"
diff --git a/templates/colors-foot.ini b/templates/colors-foot.ini
new file mode 100644
index 0000000..16942f3
--- /dev/null
+++ b/templates/colors-foot.ini
@@ -0,0 +1,19 @@
+[colors]
+background={background.strip}
+foreground={foreground.strip}
+regular0={color0.strip}
+regular1={color1.strip}
+regular2={color2.strip}
+regular3={color3.strip}
+regular4={color4.strip}
+regular5={color5.strip}
+regular6={color6.strip}
+regular7={color7.strip}
+bright0={color8.strip}
+bright1={color9.strip}
+bright2={color10.strip}
+bright3={color11.strip}
+bright4={color12.strip}
+bright5={color13.strip}
+bright6={color14.strip}
+bright7={color15.strip}
diff --git a/templates/colors-fuzzel.ini b/templates/colors-fuzzel.ini
new file mode 100644
index 0000000..a99fb3c
--- /dev/null
+++ b/templates/colors-fuzzel.ini
@@ -0,0 +1,11 @@
+[colors]
+background={background.strip}ff
+prompt={foreground.strip}ff
+text={foreground.strip}ff
+placeholder={foreground.strip}ff
+input={foreground.strip}ff
+match={foreground.strip}ff
+selection={color1.strip}ff
+selection-text={background.strip}ff
+selection-match={foreground.strip}ff
+border={color1.strip}ff
diff --git a/templates/colors-hyprland.conf b/templates/colors-hyprland.conf
new file mode 100644
index 0000000..4dc8aba
--- /dev/null
+++ b/templates/colors-hyprland.conf
@@ -0,0 +1,21 @@
+$wallpaper = {wallpaper}
+
+$foreground = rgba({foreground.rgba})
+$background = rgba({background.rgba})
+
+$color0 = rgba({color0.rgba})
+$color1 = rgba({color1.rgba})
+$color2 = rgba({color2.rgba})
+$color3 = rgba({color3.rgba})
+$color4 = rgba({color4.rgba})
+$color5 = rgba({color5.rgba})
+$color6 = rgba({color6.rgba})
+$color7 = rgba({color7.rgba})
+$color8 = rgba({color8.rgba})
+$color9 = rgba({color9.rgba})
+$color10 =rgba({color10.rgba})
+$color11 =rgba({color11.rgba})
+$color12 =rgba({color12.rgba})
+$color13 =rgba({color13.rgba})
+$color14 =rgba({color14.rgba})
+$color15 =rgba({color15.rgba})
diff --git a/templates/colors-kitty.conf b/templates/colors-kitty.conf
new file mode 100644
index 0000000..1ab9c3c
--- /dev/null
+++ b/templates/colors-kitty.conf
@@ -0,0 +1,27 @@
+foreground {foreground}
+background {background}
+background_opacity {background.alpha_dec}
+cursor {cursor}
+active_tab_foreground {background}
+active_tab_background {foreground}
+inactive_tab_foreground {foreground}
+inactive_tab_background {background}
+active_border_color {foreground}
+inactive_border_color {background}
+bell_border_color {color1}
+color0 {color0}
+color8 {color8}
+color1 {color1}
+color9 {color9}
+color2 {color2}
+color10 {color10}
+color3 {color3}
+color11 {color11}
+color4 {color4}
+color12 {color12}
+color5 {color5}
+color13 {color13}
+color6 {color6}
+color14 {color14}
+color7 {color7}
+color15 {color15}
diff --git a/templates/colors-konsole.colorscheme b/templates/colors-konsole.colorscheme
new file mode 100644
index 0000000..d3ba1ef
--- /dev/null
+++ b/templates/colors-konsole.colorscheme
@@ -0,0 +1,43 @@
+[Background]
+Color={background.rgb}
+[BackgroundIntense]
+Color={background.rgb}
+[Color0]
+Color={color0.rgb}
+[Color0Intense]
+Color={color8.rgb}
+[Color1]
+Color={color1.rgb}
+[Color1Intense]
+Color={color9.rgb}
+[Color2]
+Color={color2.rgb}
+[Color2Intense]
+Color={color10.rgb}
+[Color3]
+Color={color3.rgb}
+[Color3Intense]
+Color={color11.rgb}
+[Color4]
+Color={color4.rgb}
+[Color4Intense]
+Color={color12.rgb}
+[Color5]
+Color={color5.rgb}
+[Color5Intense]
+Color={color13.rgb}
+[Color6]
+Color={color6.rgb}
+[Color6Intense]
+Color={color14.rgb}
+[Color7]
+Color={color7.rgb}
+[Color7Intense]
+Color={color15.rgb}
+[Foreground]
+Color={foreground.rgb}
+[ForegroundIntense]
+Color={foreground.rgb}
+[General]
+Description=Colorscheme generated by wal
+Opacity=1
diff --git a/templates/colors-leftwm-theme.ron b/templates/colors-leftwm-theme.ron
new file mode 100644
index 0000000..7e49e57
--- /dev/null
+++ b/templates/colors-leftwm-theme.ron
@@ -0,0 +1,8 @@
+(
+ border_width: 2,
+ margin: [4, 4],
+ default_border_color: "{background}",
+ floating_border_color: "{color6}",
+ focused_border_color: "{foreground}",
+ background_color: "{background}",
+)
diff --git a/templates/colors-mako b/templates/colors-mako
new file mode 100644
index 0000000..c75576a
--- /dev/null
+++ b/templates/colors-mako
@@ -0,0 +1,3 @@
+background-color={background}
+text-color={foreground}
+border-color={color1}
diff --git a/templates/colors-nqq.css b/templates/colors-nqq.css
new file mode 100644
index 0000000..126bd67
--- /dev/null
+++ b/templates/colors-nqq.css
@@ -0,0 +1,30 @@
+/*
+ * pywal theme template for notepadqq by threadreaper
+ * https:
+ */
+.cm-s-nqqwal .CodeMirror-gutters { background: {background} !important; }
+.cm-s-nqqwal .CodeMirror-foldgutter-open, .CodeMirror-foldgutter-folded { color: {foreground}; }
+.cm-s-nqqwal .CodeMirror-cursor { border-left: 1px solid {foreground}; background-color: rgba({color6.rgb},0.4)}
+.cm-s-nqqwal { background-color: {background}; color: {foreground}; }
+.cm-s-nqqwal span.cm-builtin { color: {color2}; font-weight: bold; }
+.cm-s-nqqwal span.cm-comment { color: {color8}; }
+.cm-s-nqqwal span.cm-keyword { color: {color3}; font-weight: bold; }
+.cm-s-nqqwal span.cm-atom { color: {color4}; }
+.cm-s-nqqwal span.cm-def { color: {color5}; }
+.cm-s-nqqwal span.cm-variable { color: {color6}; }
+.cm-s-nqqwal span.cm-variable-2 { color: {color5}; }
+.cm-s-nqqwal span.cm-string { color: {color2}; }
+.cm-s-nqqwal span.cm-string-2 { color: {color2}; }
+.cm-s-nqqwal span.cm-number { color: {color5}; }
+.cm-s-nqqwal span.cm-tag { color: {color3}; }
+.cm-s-nqqwal span.cm-property { color: {color6}; }
+.cm-s-nqqwal span.cm-attribute { color: {color6}; }
+.cm-s-nqqwal span.cm-qualifier { color: {color4}; }
+.cm-s-nqqwal span.cm-meta { color: {color5}; }
+.cm-s-nqqwal span.cm-header { color: {color3}; }
+.cm-s-nqqwal span.cm-operator { color: {color3}; }
+.cm-s-nqqwal span.CodeMirror-matchingbracket { box-sizing: border-box; background: transparent; border-bottom: 1px solid; }
+.cm-s-nqqwal span.CodeMirror-nonmatchingbracket { border-bottom: 1px solid; background: none; }
+.cm-s-nqqwal .CodeMirror-activeline-background { background: rgba({color5.rgb},0.4); }
+.cm-s-nqqwal div.CodeMirror-selected { background: {color3}; }
+.cm-s-nqqwal .CodeMirror-focused div.CodeMirror-selected { background: {color0}); }
diff --git a/templates/colors-oomox b/templates/colors-oomox
new file mode 100644
index 0000000..16823f7
--- /dev/null
+++ b/templates/colors-oomox
@@ -0,0 +1,17 @@
+NAME=wal
+BG={color0.strip}
+FG={color15.strip}
+MENU_BG={color0.strip}
+MENU_FG={color15.strip}
+SEL_BG={color1.strip}
+SEL_FG={color0.strip}
+TXT_BG={color0.strip}
+TXT_FG={color15.strip}
+BTN_BG={color2.strip}
+BTN_FG={color15.strip}
+HDR_BTN_BG={color3.strip}
+HDR_BTN_FG={color15.strip}
+GTK3_GENERATE_DARK=True
+ROUNDNESS=0
+SPACING=3
+GRADIENT=0.0
diff --git a/templates/colors-polybar b/templates/colors-polybar
new file mode 100644
index 0000000..d000dad
--- /dev/null
+++ b/templates/colors-polybar
@@ -0,0 +1,8 @@
+background = d9{color0.strip}
+background-alt = {color8.strip}
+foreground = {color7.strip}
+foreground-alt = {color7.strip}
+primary = {color1.strip}
+secondary = {color2.strip}
+alert = {color3.strip}
+disabled = {color15.strip}
diff --git a/templates/colors-putty.reg b/templates/colors-putty.reg
new file mode 100644
index 0000000..5e64356
--- /dev/null
+++ b/templates/colors-putty.reg
@@ -0,0 +1,24 @@
+Windows Registry Editor Version 5.00
+[HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\wal]
+"Colour0"="{foreground.rgb}" ; Default Foreground
+"Colour1"="{foreground.rgb}" ; Default Bold Foreground
+"Colour2"="{background.rgb}" ; Default Background
+"Colour3"="{background.rgb}" ; Default Bold Background
+"Colour4"="{background.rgb}" ; Cursor Text
+"Colour5"="{cursor.rgb}" ; Cursor Color
+"Colour6"="{color0.rgb}" ; ANSI Black
+"Colour7"="{color8.rgb}" ; ANSI Black Bold
+"Colour8"="{color1.rgb}" ; ANSI Red
+"Colour9"="{color9.rgb}" ; ANSI Red Bold
+"Colour10"="{color2.rgb}" ; ANSI Green
+"Colour11"="{color10.rgb}" ; ANSI Green Bold
+"Colour12"="{color3.rgb}" ; ANSI Yellow
+"Colour13"="{color11.rgb}" ; ANSI Yellow Bold
+"Colour14"="{color4.rgb}" ; ANSI Blue
+"Colour15"="{color12.rgb}" ; ANSI Blue Bold
+"Colour16"="{color5.rgb}" ; ANSI Magenta
+"Colour17"="{color13.rgb}" ; ANSI Magenta Bold
+"Colour18"="{color6.rgb}" ; ANSI Cyan
+"Colour19"="{color14.rgb}" ; ANSI Cyan Bold
+"Colour20"="{color7.rgb}" ; ANSI White
+"Colour21"="{color15.rgb}" ; ANSI White Bold
diff --git a/templates/colors-rgb b/templates/colors-rgb
new file mode 100644
index 0000000..4c2c423
--- /dev/null
+++ b/templates/colors-rgb
@@ -0,0 +1,16 @@
+{color0.rgb}
+{color1.rgb}
+{color2.rgb}
+{color3.rgb}
+{color4.rgb}
+{color5.rgb}
+{color6.rgb}
+{color7.rgb}
+{color8.rgb}
+{color9.rgb}
+{color10.rgb}
+{color11.rgb}
+{color12.rgb}
+{color13.rgb}
+{color14.rgb}
+{color15.rgb}
diff --git a/templates/colors-rofi-dark.rasi b/templates/colors-rofi-dark.rasi
new file mode 100644
index 0000000..b023bdd
--- /dev/null
+++ b/templates/colors-rofi-dark.rasi
@@ -0,0 +1,111 @@
+* {
+ active-background: {color2};
+ active-foreground: @foreground;
+ normal-background: @background;
+ normal-foreground: @foreground;
+ urgent-background: {color1};
+ urgent-foreground: @foreground;
+ alternate-active-background: @background;
+ alternate-active-foreground: @foreground;
+ alternate-normal-background: @background;
+ alternate-normal-foreground: @foreground;
+ alternate-urgent-background: @background;
+ alternate-urgent-foreground: @foreground;
+ selected-active-background: {color1};
+ selected-active-foreground: @foreground;
+ selected-normal-background: {color2};
+ selected-normal-foreground: @foreground;
+ selected-urgent-background: {color3};
+ selected-urgent-foreground: @foreground;
+ background-color: @background;
+ background: {background};
+ foreground: {foreground};
+ border-color: @background;
+ spacing: 2;
+}
+ background-color: @background;
+ border: 0;
+ padding: 2.5ch;
+}
+ border: 0;
+ padding: 0;
+}
+ border: 2px 0px 0px;
+ border-color: @border-color;
+ padding: 1px;
+}
+ text-color: @foreground;
+}
+ children: [ prompt,textbox-prompt-colon,entry,case-indicator ];
+}
+ expand: false;
+ str: ":";
+ margin: 0px 0.3em 0em 0em;
+ text-color: @normal-foreground;
+}
+ fixed-height: 0;
+ border: 2px 0px 0px;
+ border-color: @border-color;
+ spacing: 2px;
+ scrollbar: true;
+ padding: 2px 0px 0px;
+}
+ border: 0;
+ padding: 1px;
+}
+ background-color: inherit;
+ text-color: inherit;
+}
+ background-color: @normal-background;
+ text-color: @normal-foreground;
+}
+ background-color: @urgent-background;
+ text-color: @urgent-foreground;
+}
+ background-color: @active-background;
+ text-color: @active-foreground;
+}
+ background-color: @selected-normal-background;
+ text-color: @selected-normal-foreground;
+}
+ background-color: @selected-urgent-background;
+ text-color: @selected-urgent-foreground;
+}
+ background-color: @selected-active-background;
+ text-color: @selected-active-foreground;
+}
+ background-color: @alternate-normal-background;
+ text-color: @alternate-normal-foreground;
+}
+ background-color: @alternate-urgent-background;
+ text-color: @alternate-urgent-foreground;
+}
+ background-color: @alternate-active-background;
+ text-color: @alternate-active-foreground;
+}
+ width: 4px;
+ border: 0;
+ handle-width: 8px;
+ padding: 0;
+}
+ border: 2px 0px 0px;
+ border-color: @border-color;
+}
+ text-color: @normal-foreground;
+}
+ background-color: @selected-normal-background;
+ text-color: @selected-normal-foreground;
+}
+ spacing: 0;
+ text-color: @normal-foreground;
+ padding: 1px;
+}
+ spacing: 0;
+ text-color: @normal-foreground;
+}
+ spacing: 0;
+ text-color: @normal-foreground;
+}
+ spacing: 0;
+ text-color: @normal-foreground;
+}
diff --git a/templates/colors-rofi-light.rasi b/templates/colors-rofi-light.rasi
new file mode 100644
index 0000000..7b2869d
--- /dev/null
+++ b/templates/colors-rofi-light.rasi
@@ -0,0 +1,111 @@
+* {
+ active-background: {color2};
+ active-foreground: @foreground;
+ normal-background: @background;
+ normal-foreground: @foreground;
+ urgent-background: {color1};
+ urgent-foreground: @foreground;
+ alternate-active-background: @background;
+ alternate-active-foreground: @foreground;
+ alternate-normal-background: @background;
+ alternate-normal-foreground: @foreground;
+ alternate-urgent-background: @background;
+ alternate-urgent-foreground: @foreground;
+ selected-active-background: {color1};
+ selected-active-foreground: @foreground;
+ selected-normal-background: {color2};
+ selected-normal-foreground: @foreground;
+ selected-urgent-background: {color3};
+ selected-urgent-foreground: @foreground;
+ background-color: @background;
+ background: {foreground};
+ foreground: {background};
+ border-color: @background;
+ spacing: 2;
+}
+ background-color: @background;
+ border: 0;
+ padding: 2.5ch;
+}
+ border: 0;
+ padding: 0;
+}
+ border: 2px 0px 0px;
+ border-color: @border-color;
+ padding: 1px;
+}
+ text-color: @foreground;
+}
+ children: [ prompt,textbox-prompt-colon,entry,case-indicator ];
+}
+ expand: false;
+ str: ":";
+ margin: 0px 0.3em 0em 0em;
+ text-color: @normal-foreground;
+}
+ fixed-height: 0;
+ border: 2px 0px 0px;
+ border-color: @border-color;
+ spacing: 2px;
+ scrollbar: true;
+ padding: 2px 0px 0px;
+}
+ border: 0;
+ padding: 1px;
+}
+ background-color: inherit;
+ text-color: inherit;
+}
+ background-color: @normal-background;
+ text-color: @normal-foreground;
+}
+ background-color: @urgent-background;
+ text-color: @urgent-foreground;
+}
+ background-color: @active-background;
+ text-color: @active-foreground;
+}
+ background-color: @selected-normal-background;
+ text-color: @selected-normal-foreground;
+}
+ background-color: @selected-urgent-background;
+ text-color: @selected-urgent-foreground;
+}
+ background-color: @selected-active-background;
+ text-color: @selected-active-foreground;
+}
+ background-color: @alternate-normal-background;
+ text-color: @alternate-normal-foreground;
+}
+ background-color: @alternate-urgent-background;
+ text-color: @alternate-urgent-foreground;
+}
+ background-color: @alternate-active-background;
+ text-color: @alternate-active-foreground;
+}
+ width: 4px;
+ border: 0;
+ handle-width: 8px;
+ padding: 0;
+}
+ border: 2px 0px 0px;
+ border-color: @border-color;
+}
+ text-color: @normal-foreground;
+}
+ background-color: @selected-normal-background;
+ text-color: @selected-normal-foreground;
+}
+ spacing: 0;
+ text-color: @normal-foreground;
+ padding: 1px;
+}
+ spacing: 0;
+ text-color: @normal-foreground;
+}
+ spacing: 0;
+ text-color: @normal-foreground;
+}
+ spacing: 0;
+ text-color: @normal-foreground;
+}
diff --git a/templates/colors-speedcrunch.json b/templates/colors-speedcrunch.json
new file mode 100644
index 0000000..ac17c0c
--- /dev/null
+++ b/templates/colors-speedcrunch.json
@@ -0,0 +1,15 @@
+{
+ "cursor": "{cursor}",
+ "number": "{foreground}",
+ "parens": "{color13}",
+ "result": "{color12}",
+ "comment": "{color8}",
+ "matched": "{color4}",
+ "function": "{color1}",
+ "operator": "{color3}",
+ "variable": "{color2}",
+ "scrollbar": "{color3}",
+ "separator": "{color3}",
+ "background": "{background}",
+ "editorbackground": "{background}"
+}
diff --git a/templates/colors-sway b/templates/colors-sway
new file mode 100644
index 0000000..aea1f06
--- /dev/null
+++ b/templates/colors-sway
@@ -0,0 +1,19 @@
+set $wallpaper {wallpaper}
+set $background {background}
+set $foreground {foreground}
+set $color0 {color0}
+set $color1 {color1}
+set $color2 {color2}
+set $color3 {color3}
+set $color4 {color4}
+set $color5 {color5}
+set $color6 {color6}
+set $color7 {color7}
+set $color8 {color8}
+set $color9 {color9}
+set $color10 {color10}
+set $color11 {color11}
+set $color12 {color12}
+set $color13 {color13}
+set $color14 {color14}
+set $color15 {color15}
diff --git a/templates/colors-themer.js b/templates/colors-themer.js
new file mode 100644
index 0000000..88fbc57
--- /dev/null
+++ b/templates/colors-themer.js
@@ -0,0 +1,20 @@
+module.exports.colors = {
+ dark: {
+ accent0: "{color0}",
+ accent1: "{color1}",
+ accent2: "{color2}",
+ accent3: "{color3}",
+ accent4: "{color4}",
+ accent5: "{color5}",
+ accent6: "{cursor}",
+ accent7: "{color7}",
+ shade0: "{background}",
+ shade1: "{color9}",
+ shade2: "{color10}",
+ shade3: "{color11}",
+ shade4: "{color12}",
+ shade5: "{color13}",
+ shade6: "{color14}",
+ shade7: "{foreground}"
+ },
+};
diff --git a/templates/colors-tilix.json b/templates/colors-tilix.json
new file mode 100644
index 0000000..187bb4a
--- /dev/null
+++ b/templates/colors-tilix.json
@@ -0,0 +1,35 @@
+{
+ "background-color": "{background}",
+ "badge-color": "{foreground}",
+ "bold-color": "{foreground}",
+ "comment": "",
+ "cursor-background-color": "{background}",
+ "cursor-foreground-color": "{cursor}",
+ "foreground-color": "{foreground}",
+ "highlight-background-color": "{background}",
+ "highlight-foreground-color": "{foreground}",
+ "name": "wal export",
+ "palette": [
+ "{color0}",
+ "{color1}",
+ "{color2}",
+ "{color3}",
+ "{color4}",
+ "{color5}",
+ "{color6}",
+ "{color7}",
+ "{color8}",
+ "{color9}",
+ "{color10}",
+ "{color11}",
+ "{color12}",
+ "{color13}",
+ "{color14}",
+ "{color15}"
+ ],
+ "use-badge-color": false,
+ "use-bold-color": false,
+ "use-cursor-color": false,
+ "use-highlight-color": false,
+ "use-theme-colors": false
+}
diff --git a/templates/colors-tofi b/templates/colors-tofi
new file mode 100644
index 0000000..e735183
--- /dev/null
+++ b/templates/colors-tofi
@@ -0,0 +1,4 @@
+background-color = {background.strip}
+border-color = {color1.strip}
+selection-color = {color1.strip}
+text-color = {foreground.strip}
diff --git a/templates/colors-tty.sh b/templates/colors-tty.sh
new file mode 100644
index 0000000..9038f1d
--- /dev/null
+++ b/templates/colors-tty.sh
@@ -0,0 +1,18 @@
+[ "${TERM:-none}" = "linux" ] && \
+ printf '%b' '\e]P0{color0.strip}
+ \e]P1{color1.strip}
+ \e]P2{color2.strip}
+ \e]P3{color3.strip}
+ \e]P4{color4.strip}
+ \e]P5{color5.strip}
+ \e]P6{color6.strip}
+ \e]P7{color7.strip}
+ \e]P8{color8.strip}
+ \e]P9{color9.strip}
+ \e]PA{color10.strip}
+ \e]PB{color11.strip}
+ \e]PC{color12.strip}
+ \e]PD{color13.strip}
+ \e]PE{color14.strip}
+ \e]PF{color15.strip}
+ \ec'
diff --git a/templates/colors-vscode.json b/templates/colors-vscode.json
new file mode 100644
index 0000000..5d35106
--- /dev/null
+++ b/templates/colors-vscode.json
@@ -0,0 +1,14 @@
+{
+ "editor.tokenColorCustomizations": {
+ "functions": "{color1}",
+ "keywords": "{color2}",
+ "numbers": "{color3}",
+ "strings": "{color4}",
+ "types": "{color5}",
+ "variables": "{color6}",
+ "comments": "{color8}"
+ },
+ "workbench.colorCustomizations": {
+ "editor.background": "{background}"
+ }
+}
diff --git a/templates/colors-wal-dmenu.h b/templates/colors-wal-dmenu.h
new file mode 100644
index 0000000..81b1a74
--- /dev/null
+++ b/templates/colors-wal-dmenu.h
@@ -0,0 +1,6 @@
+static const char *colors[SchemeLast][2] = {
+ /* fg bg */
+ [SchemeNorm] = { "{color15}", "{color0}" },
+ [SchemeSel] = { "{color15}", "{color1}" },
+ [SchemeOut] = { "{color15}", "{color14}" },
+};
diff --git a/templates/colors-wal-dwl.h b/templates/colors-wal-dwl.h
new file mode 100644
index 0000000..92a36bc
--- /dev/null
+++ b/templates/colors-wal-dwl.h
@@ -0,0 +1,11 @@
+/* Taken from https:
+ ((hex >> 16) & 0xFF) / 255.0f, \
+ ((hex >> 8) & 0xFF) / 255.0f, \
+ (hex & 0xFF) / 255.0f }
+static const float rootcolor[] = COLOR(0x{color0.strip}ff);
+static uint32_t colors[][3] = {
+ /* fg bg border */
+ [SchemeNorm] = { 0x{color15.strip}ff, 0x{color0.strip}ff, 0x{color8.strip}ff },
+ [SchemeSel] = { 0x{color15.strip}ff, 0x{color2.strip}ff, 0x{color1.strip}ff },
+ [SchemeUrg] = { 0x{color15.strip}ff, 0x{color1.strip}ff, 0x{color2.strip}ff },
+};
diff --git a/templates/colors-wal-dwm-urg.h b/templates/colors-wal-dwm-urg.h
new file mode 100644
index 0000000..b21fccb
--- /dev/null
+++ b/templates/colors-wal-dwm-urg.h
@@ -0,0 +1,15 @@
+static const char norm_fg[] = "{color15}";
+static const char norm_bg[] = "{color0}";
+static const char norm_border[] = "{color8}";
+static const char sel_fg[] = "{color15}";
+static const char sel_bg[] = "{color2}";
+static const char sel_border[] = "{color15}";
+static const char urg_fg[] = "{color15}";
+static const char urg_bg[] = "{color1}";
+static const char urg_border[] = "{color1}";
+static const char *colors[][3] = {
+ /* fg bg border */
+ [SchemeNorm] = { norm_fg, norm_bg, norm_border },
+ [SchemeSel] = { sel_fg, sel_bg, sel_border },
+ [SchemeUrg] = { urg_fg, urg_bg, urg_border },
+};
diff --git a/templates/colors-wal-dwm.h b/templates/colors-wal-dwm.h
new file mode 100644
index 0000000..1a9b894
--- /dev/null
+++ b/templates/colors-wal-dwm.h
@@ -0,0 +1,11 @@
+static const char norm_fg[] = "{color15}";
+static const char norm_bg[] = "{color0}";
+static const char norm_border[] = "{color8}";
+static const char sel_fg[] = "{color15}";
+static const char sel_bg[] = "{color1}";
+static const char sel_border[] = "{color15}";
+static const char *colors[][3] = {
+ /* fg bg border */
+ [SchemeNorm] = { norm_fg, norm_bg, norm_border },
+ [SchemeSel] = { sel_fg, sel_bg, sel_border },
+};
diff --git a/templates/colors-wal-st.h b/templates/colors-wal-st.h
new file mode 100644
index 0000000..e410c9b
--- /dev/null
+++ b/templates/colors-wal-st.h
@@ -0,0 +1,30 @@
+const char *colorname[] = {
+ /* 8 normal colors */
+ [0] = "{color0}", /* black */
+ [1] = "{color1}", /* red */
+ [2] = "{color2}", /* green */
+ [3] = "{color3}", /* yellow */
+ [4] = "{color4}", /* blue */
+ [5] = "{color5}", /* magenta */
+ [6] = "{color6}", /* cyan */
+ [7] = "{color7}", /* white */
+ /* 8 bright colors */
+ [8] = "{color8}", /* black */
+ [9] = "{color9}", /* red */
+ [10] = "{color10}", /* green */
+ [11] = "{color11}", /* yellow */
+ [12] = "{color12}", /* blue */
+ [13] = "{color13}", /* magenta */
+ [14] = "{color14}", /* cyan */
+ [15] = "{color15}", /* white */
+ /* special colors */
+ [256] = "{background}", /* background */
+ [257] = "{foreground}", /* foreground */
+ [258] = "{cursor}", /* cursor */
+};
+/* Default colors (colorname index)
+ * foreground, background, cursor */
+ unsigned int defaultbg = 0;
+ unsigned int defaultfg = 257;
+ unsigned int defaultcs = 258;
+ unsigned int defaultrcs= 258;
diff --git a/templates/colors-wal-tabbed.h b/templates/colors-wal-tabbed.h
new file mode 100644
index 0000000..90623c5
--- /dev/null
+++ b/templates/colors-wal-tabbed.h
@@ -0,0 +1,6 @@
+static const char* selbgcolor = "{color0}";
+static const char* selfgcolor = "{color15}";
+static const char* normbgcolor = "{color2}";
+static const char* normfgcolor = "{color15}";
+static const char* urgbgcolor = "{color1}";
+static const char* urgfgcolor = "{color15}";
diff --git a/templates/colors-wal.vim b/templates/colors-wal.vim
new file mode 100644
index 0000000..f1d86fb
--- /dev/null
+++ b/templates/colors-wal.vim
@@ -0,0 +1,22 @@
+" Special
+let wallpaper = "{wallpaper}"
+let background = "{background}"
+let foreground = "{foreground}"
+let cursor = "{cursor}"
+" Colors
+let color0 = "{color0}"
+let color1 = "{color1}"
+let color2 = "{color2}"
+let color3 = "{color3}"
+let color4 = "{color4}"
+let color5 = "{color5}"
+let color6 = "{color6}"
+let color7 = "{color7}"
+let color8 = "{color8}"
+let color9 = "{color9}"
+let color10 = "{color10}"
+let color11 = "{color11}"
+let color12 = "{color12}"
+let color13 = "{color13}"
+let color14 = "{color14}"
+let color15 = "{color15}"
diff --git a/templates/colors-waybar.css b/templates/colors-waybar.css
new file mode 100644
index 0000000..2e2bcc9
--- /dev/null
+++ b/templates/colors-waybar.css
@@ -0,0 +1,19 @@
+@define-color foreground {foreground};
+@define-color background {background};
+@define-color cursor {cursor};
+@define-color color0 {color0};
+@define-color color1 {color1};
+@define-color color2 {color2};
+@define-color color3 {color3};
+@define-color color4 {color4};
+@define-color color5 {color5};
+@define-color color6 {color6};
+@define-color color7 {color7};
+@define-color color8 {color8};
+@define-color color9 {color9};
+@define-color color10 {color10};
+@define-color color11 {color11};
+@define-color color12 {color12};
+@define-color color13 {color13};
+@define-color color14 {color14};
+@define-color color15 {color15};
diff --git a/templates/colors-zathura b/templates/colors-zathura
new file mode 100644
index 0000000..4233e9d
--- /dev/null
+++ b/templates/colors-zathura
@@ -0,0 +1,30 @@
+set recolor "true"
+set recolor-keephue "true"
+set completion-bg "{background}"
+set completion-fg "{foreground}"
+set completion-group-bg "{background}"
+set completion-group-fg "{color2}"
+set completion-highlight-bg "{foreground}"
+set completion-highlight-fg "{background}"
+set recolor-lightcolor "{background}"
+set recolor-darkcolor "{foreground}"
+set default-bg "{background}"
+set inputbar-bg "{background}"
+set inputbar-fg "{foreground}"
+set notification-bg "{background}"
+set notification-fg "{foreground}"
+set notification-error-bg "{color1}"
+set notification-error-fg "{foreground}"
+set notification-warning-bg "{color1}"
+set notification-warning-fg "{foreground}"
+set statusbar-bg "{background}"
+set statusbar-fg "{foreground}"
+set index-bg "{background}"
+set index-fg "{foreground}"
+set index-active-bg "{foreground}"
+set index-active-fg "{background}"
+set render-loading-bg "{background}"
+set render-loading-fg "{foreground}"
+set window-title-home-tilde true
+set statusbar-basename true
+set selection-clipboard clipboard
diff --git a/templates/colors-zed.json b/templates/colors-zed.json
new file mode 100644
index 0000000..1997e21
--- /dev/null
+++ b/templates/colors-zed.json
@@ -0,0 +1,105 @@
+{
+ "$schema": "https:
+ "name": "pywal",
+ "author": "pywal",
+ "themes": [
+ {
+ "name": "pywal",
+ "appearance": "dark",
+ "style": {
+ "background": "{background}90",
+ "editor.background": "{background}90",
+ "editor.foreground": "{foreground}",
+ "text": "{foreground}",
+ "text.muted": "{foreground}70",
+ "text.ignored": "{foreground}40",
+ "text.placeholder": "{foreground}50",
+ "ignored": "{foreground}30",
+ "element.hover": "{foreground}30",
+ "ghost_element.hover": "{color1}30",
+ "ghost_element.selected": "{color1}30",
+ "ghost_element.active": "{color1}60",
+ "border": "{background}",
+ "editor.highlighted_line.background": "{color1}10",
+ "editor.active_line.background": "{color1}10",
+ "panel.background": "{background}90",
+ "title_bar.background": "{background}90",
+ "title_bar.inactive_background": "{background}90",
+ "status_bar.background": "{background}90",
+ "drop_target.background": "{background}90",
+ "elevated_surface.background": "{background}",
+ "toolbar.background": "{background}90",
+ "tab_bar.background": "{background}90",
+ "tab.inactive_background": "{background}90",
+ "tab.active_background": "{color1}30",
+ "scrollbar.track.background": "transparent",
+ "scrollbar.track.border": "{background}",
+ "scrollbar.thumb.background": "{color1}",
+ "editor.gutter.background": "{background}90",
+ "terminal.background": "{background}10",
+ "terminal.foreground": "{foreground}",
+ "terminal.dim_foreground": "{foreground}",
+ "terminal.bright_foreground": "{foreground}",
+ "terminal.ansi.black": "{color0}",
+ "terminal.ansi.red": "{color1}",
+ "terminal.ansi.green": "{color2}",
+ "terminal.ansi.yellow": "{color3}",
+ "terminal.ansi.blue": "{color4}",
+ "terminal.ansi.magenta": "{color5}",
+ "terminal.ansi.cyan": "{color6}",
+ "terminal.ansi.white": "{color7}",
+ "terminal.ansi.bright_black": "{color8}",
+ "terminal.ansi.bright_red": "{color9}",
+ "terminal.ansi.bright_green": "{color10}",
+ "terminal.ansi.bright_yellow": "{color11}",
+ "terminal.ansi.bright_blue": "{color12}",
+ "terminal.ansi.bright_magenta": "{color13}",
+ "terminal.ansi.bright_cyan": "{color14}",
+ "terminal.ansi.bright_white": "{color15}",
+ "modified": "{color1}",
+ "syntax": {
+ "attribute": {
+ "color": "{color1}"
+ },
+ "boolean": {
+ "color": "{color2}"
+ },
+ "comment": {
+ "color": "{color8}"
+ },
+ "comment.doc": {
+ "color": "{color8}"
+ },
+ "constant": {
+ "color": "{color10}"
+ },
+ "function": {
+ "color": "{color14}"
+ },
+ "keyword": {
+ "color": "{color4}"
+ },
+ "number": {
+ "color": "{color5}"
+ },
+ "operator": {
+ "color": "{color4}"
+ },
+ "string": {
+ "color": "{color1}"
+ },
+ "variable": {
+ "color": "{color2}"
+ }
+ },
+ "players": [
+ {
+ "cursor": "{color1}",
+ "background": "{background}",
+ "selection": "{color1}30"
+ }
+ ]
+ }
+ }
+ ]
+}
diff --git a/templates/colors.Xresources b/templates/colors.Xresources
new file mode 100644
index 0000000..590205c
--- /dev/null
+++ b/templates/colors.Xresources
@@ -0,0 +1,64 @@
+! X colors.
+! Generated by 'wal'
+*foreground: {foreground}
+*background: {background}
+*.foreground: {foreground}
+*.background: {background}
+emacs*foreground: {foreground}
+emacs*background: {background}
+URxvt*foreground: {foreground}
+XTerm*foreground: {foreground}
+UXTerm*foreground: {foreground}
+URxvt*background: {background.alpha}
+XTerm*background: {background}
+UXTerm*background: {background}
+URxvt*cursorColor: {cursor}
+XTerm*cursorColor: {cursor}
+UXTerm*cursorColor: {cursor}
+URxvt*borderColor: {background.alpha}
+! Colors 0-15.
+*.color0: {color0}
+*color0: {color0}
+*.color1: {color1}
+*color1: {color1}
+*.color2: {color2}
+*color2: {color2}
+*.color3: {color3}
+*color3: {color3}
+*.color4: {color4}
+*color4: {color4}
+*.color5: {color5}
+*color5: {color5}
+*.color6: {color6}
+*color6: {color6}
+*.color7: {color7}
+*color7: {color7}
+*.color8: {color8}
+*color8: {color8}
+*.color9: {color9}
+*color9: {color9}
+*.color10: {color10}
+*color10: {color10}
+*.color11: {color11}
+*color11: {color11}
+*.color12: {color12}
+*color12: {color12}
+*.color13: {color13}
+*color13: {color13}
+*.color14: {color14}
+*color14: {color14}
+*.color15: {color15}
+*color15: {color15}
+! Black color that will not be affected by bold highlighting.
+*.color66: {color0}
+*color66: {color0}
+! Xclock colors.
+XClock*foreground: {foreground}
+XClock*background: {background}
+XClock*majorColor: rgba:{color15.xrgba}
+XClock*minorColor: rgba:{color15.xrgba}
+XClock*hourColor: rgba:{color15.xrgba}
+XClock*minuteColor: rgba:{color15.xrgba}
+XClock*secondColor: rgba:{color15.xrgba}
+! Set depth to make transparency work.
+URxvt*depth: 32
diff --git a/templates/colors.css b/templates/colors.css
new file mode 100644
index 0000000..147a6f6
--- /dev/null
+++ b/templates/colors.css
@@ -0,0 +1,26 @@
+/* CSS variables
+ Generated by 'wal' */
+:root {
+ --wallpaper: url("{wallpaper}");
+ /* Special */
+ --background: {background};
+ --foreground: {foreground};
+ --cursor: {cursor};
+ /* Colors */
+ --color0: {color0};
+ --color1: {color1};
+ --color2: {color2};
+ --color3: {color3};
+ --color4: {color4};
+ --color5: {color5};
+ --color6: {color6};
+ --color7: {color7};
+ --color8: {color8};
+ --color9: {color9};
+ --color10: {color10};
+ --color11: {color11};
+ --color12: {color12};
+ --color13: {color13};
+ --color14: {color14};
+ --color15: {color15};
+}
diff --git a/templates/colors.fish b/templates/colors.fish
new file mode 100644
index 0000000..ea0e5b7
--- /dev/null
+++ b/templates/colors.fish
@@ -0,0 +1,38 @@
+set fish_color_autosuggestion {color8.strip}
+set fish_color_cancel {color1.strip} '--reverse'
+set fish_color_command {color10.strip}
+set fish_color_comment {color8.strip}
+set fish_color_cwd {color2.strip}
+set fish_color_cwd_root {color1.strip}
+set fish_color_end {color3.strip}
+set fish_color_error {color1.strip}
+set fish_color_escape {color5.strip}
+set fish_color_history_current --bold
+set fish_color_host {color12.strip}
+set fish_color_host_remote {color12.strip}
+set fish_color_keyword {color5.strip}
+set fish_color_match --background={color4.strip}
+set fish_color_normal {foreground.strip}
+set fish_color_operator {color6.strip}
+set fish_color_option {color3.strip}
+set fish_color_param {color12.strip}
+set fish_color_quote {color11.strip}
+set fish_color_redirection {color5.strip}
+set fish_color_search_match --background={color8.strip}
+set fish_color_selection --background={color8.strip}
+set fish_color_status {color1.strip}
+set fish_color_user {color10.strip}
+set fish_color_valid_path --underline
+set fish_pager_color_background {background.strip}
+set fish_pager_color_completion {foreground.strip}
+set fish_pager_color_description {color8.strip}
+set fish_pager_color_prefix {color10.strip}
+set fish_pager_color_progress {color8.strip}
+set fish_pager_color_secondary_background {background.strip}
+set fish_pager_color_secondary_completion {foreground.strip}
+set fish_pager_color_secondary_description {color8.strip}
+set fish_pager_color_secondary_prefix {color10.strip}
+set fish_pager_color_selected_background --background={color8.strip}
+set fish_pager_color_selected_completion {foreground.strip}
+set fish_pager_color_selected_description {color8.strip}
+set fish_pager_color_selected_prefix {color10.strip}
diff --git a/templates/colors.json b/templates/colors.json
new file mode 100644
index 0000000..4e2fc7b
--- /dev/null
+++ b/templates/colors.json
@@ -0,0 +1,28 @@
+{
+ "checksum": "{checksum}",
+ "wallpaper": "{wallpaper}",
+ "alpha": "{alpha}",
+ "special": {
+ "background": "{background}",
+ "foreground": "{foreground}",
+ "cursor": "{cursor}"
+ },
+ "colors": {
+ "color0": "{color0}",
+ "color1": "{color1}",
+ "color2": "{color2}",
+ "color3": "{color3}",
+ "color4": "{color4}",
+ "color5": "{color5}",
+ "color6": "{color6}",
+ "color7": "{color7}",
+ "color8": "{color8}",
+ "color9": "{color9}",
+ "color10": "{color10}",
+ "color11": "{color11}",
+ "color12": "{color12}",
+ "color13": "{color13}",
+ "color14": "{color14}",
+ "color15": "{color15}"
+ }
+}
diff --git a/templates/colors.scss b/templates/colors.scss
new file mode 100644
index 0000000..052f245
--- /dev/null
+++ b/templates/colors.scss
@@ -0,0 +1,20 @@
+$wallpaper: "{wallpaper}";
+$background: {background};
+$foreground: {foreground};
+$cursor: {cursor};
+$color0: {color0};
+$color1: {color1};
+$color2: {color2};
+$color3: {color3};
+$color4: {color4};
+$color5: {color5};
+$color6: {color6};
+$color7: {color7};
+$color8: {color8};
+$color9: {color9};
+$color10: {color10};
+$color11: {color11};
+$color12: {color12};
+$color13: {color13};
+$color14: {color14};
+$color15: {color15};
diff --git a/templates/colors.sh b/templates/colors.sh
new file mode 100644
index 0000000..e7c4095
--- /dev/null
+++ b/templates/colors.sh
@@ -0,0 +1,26 @@
+wallpaper="{wallpaper}"
+background='{background}'
+foreground='{foreground}'
+cursor='{cursor}'
+color0='{color0}'
+color1='{color1}'
+color2='{color2}'
+color3='{color3}'
+color4='{color4}'
+color5='{color5}'
+color6='{color6}'
+color7='{color7}'
+color8='{color8}'
+color9='{color9}'
+color10='{color10}'
+color11='{color11}'
+color12='{color12}'
+color13='{color13}'
+color14='{color14}'
+color15='{color15}'
+export FZF_DEFAULT_OPTS="
+ $FZF_DEFAULT_OPTS
+ --color fg:7,bg:0,hl:1,fg+:232,bg+:1,hl+:255
+ --color info:7,prompt:2,spinner:1,pointer:232,marker:1
+"
+export LS_COLORS="${LS_COLORS}:su=30;41:ow=30;42:st=30;44:"
diff --git a/templates/colors.styl b/templates/colors.styl
new file mode 100644
index 0000000..fe2615b
--- /dev/null
+++ b/templates/colors.styl
@@ -0,0 +1,20 @@
+$wallpaper = "{wallpaper}"
+$background = {background}
+$foregroud = {foreground}
+$cursor = {cursor}
+$color0 = {color0}
+$color1 = {color1}
+$color2 = {color2}
+$color3 = {color3}
+$color4 = {color4}
+$color5 = {color5}
+$color6 = {color6}
+$color7 = {color7}
+$color8 = {color8}
+$color9 = {color9}
+$color10 = {color10}
+$color11 = {color11}
+$color12 = {color12}
+$color13 = {color13}
+$color14 = {color14}
+$color15 = {color15}
diff --git a/templates/colors.yml b/templates/colors.yml
new file mode 100644
index 0000000..ea445b8
--- /dev/null
+++ b/templates/colors.yml
@@ -0,0 +1,22 @@
+wallpaper: "{wallpaper}"
+special:
+ background: "{background}"
+ foreground: "{foreground}"
+ cursor: "{cursor}"
+colors:
+ color0: "{color0}"
+ color1: "{color1}"
+ color2: "{color2}"
+ color3: "{color3}"
+ color4: "{color4}"
+ color5: "{color5}"
+ color6: "{color6}"
+ color7: "{color7}"
+ color8: "{color8}"
+ color9: "{color9}"
+ color10: "{color10}"
+ color11: "{color11}"
+ color12: "{color12}"
+ color13: "{color13}"
+ color14: "{color14}"
+ color15: "{color15}"
diff --git a/templates/ghostty.conf b/templates/ghostty.conf
new file mode 100644
index 0000000..b4686df
--- /dev/null
+++ b/templates/ghostty.conf
@@ -0,0 +1,21 @@
+background = {background.strip}
+foreground = {foreground.strip}
+cursor-color = {cursor.strip}
+selection-background = {foreground.strip}
+selection-foreground = {background.strip}
+palette = 0={color0}
+palette = 1={color1}
+palette = 2={color2}
+palette = 3={color3}
+palette = 4={color4}
+palette = 5={color5}
+palette = 6={color6}
+palette = 7={color7}
+palette = 8={color8}
+palette = 9={color9}
+palette = 10={color10}
+palette = 11={color11}
+palette = 12={color12}
+palette = 13={color13}
+palette = 14={color14}
+palette = 15={color15}