diff options
author | Julian T <julian@jtle.dk> | 2023-02-06 20:50:11 +0100 |
---|---|---|
committer | Julian T <julian@jtle.dk> | 2023-02-06 21:33:55 +0100 |
commit | 265b3b7b976732ab00e57aa064f06857b547b2b0 (patch) | |
tree | a298676cf535cadd5602d8aefa110abd3687e996 | |
parent | e9d6b42be25ac756a7cc9c44e1a34b78919dfec2 (diff) |
Create new setwall script in rust
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | bspwm/.xinitrc | 1 | ||||
-rw-r--r-- | fish/.config/fish/config.fish | 1 | ||||
-rwxr-xr-x | scripts/Scripts/lc | 2 | ||||
-rwxr-xr-x | scripts/Scripts/setwall_old (renamed from scripts/Scripts/setwall) | 0 | ||||
-rw-r--r-- | scripts/resc/setwall/Cargo.lock | 576 | ||||
-rw-r--r-- | scripts/resc/setwall/Cargo.toml | 14 | ||||
-rw-r--r-- | scripts/resc/setwall/src/main.rs | 178 | ||||
-rwxr-xr-x | xinit/Scripts/xlaunchrc | 2 |
9 files changed, 773 insertions, 2 deletions
@@ -3,3 +3,4 @@ vim/.config/nvim/.netrwhist state*.json *.pyc *~ +**/target/* diff --git a/bspwm/.xinitrc b/bspwm/.xinitrc index 91ea4a0..419b635 100644 --- a/bspwm/.xinitrc +++ b/bspwm/.xinitrc @@ -1,5 +1,6 @@ export LOPTS="panel composer gnome-keyring jpinput" +export WALLCONFIG="$HOME/Pictures/Rand/walls/config.yaml" # Launch other stuff source ~/.xprofile source ~/Scripts/xlaunchrc diff --git a/fish/.config/fish/config.fish b/fish/.config/fish/config.fish index 9031b65..a4509ef 100644 --- a/fish/.config/fish/config.fish +++ b/fish/.config/fish/config.fish @@ -9,6 +9,7 @@ set -x TERM xterm-256color # Path set -x PATH $PATH $HOME/go/bin set -x PATH $PATH $HOME/Scripts/bin +set -x PATH $PATH $HOME/.cargo/bin # Functions function gittr diff --git a/scripts/Scripts/lc b/scripts/Scripts/lc index 8b9fbcd..dba58f0 100755 --- a/scripts/Scripts/lc +++ b/scripts/Scripts/lc @@ -42,7 +42,7 @@ handle_stuff() { fi if [ "$1" = "wall" ]; then - $HOME/Scripts/setwall -A + setwall --config $WALLCONFIG fi if [ "$1" = "remember" ]; then diff --git a/scripts/Scripts/setwall b/scripts/Scripts/setwall_old index 86214a6..86214a6 100755 --- a/scripts/Scripts/setwall +++ b/scripts/Scripts/setwall_old diff --git a/scripts/resc/setwall/Cargo.lock b/scripts/resc/setwall/Cargo.lock new file mode 100644 index 0000000..77a31cd --- /dev/null +++ b/scripts/resc/setwall/Cargo.lock @@ -0,0 +1,576 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "aho-corasick" +version = "0.7.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +dependencies = [ + "memchr", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + +[[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.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f13b9c79b5d1dd500d20ef541215a6423c75829ef43117e1b4d17fd8af0b5d76" +dependencies = [ + "bitflags", + "clap_derive", + "clap_lex", + "is-terminal", + "once_cell", + "strsim", + "termcolor", +] + +[[package]] +name = "clap_derive" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "684a277d672e91966334af371f1a7b5833f9aa00b07c84e92fbce95e00208ce8" +dependencies = [ + "heck", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "783fe232adfca04f90f56201b26d79682d4cd2625e0bc7290b95123afe558ade" +dependencies = [ + "os_str_bytes", +] + +[[package]] +name = "dirs" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "errno" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" +dependencies = [ + "errno-dragonfly", + "libc", + "winapi", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "getrandom" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "hermit-abi" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" +dependencies = [ + "libc", +] + +[[package]] +name = "indexmap" +version = "1.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1abeb7a0dd0f8181267ff8adc397075586500b81b28a73e8a0208b00fc170fb3" +dependencies = [ + "libc", + "windows-sys 0.45.0", +] + +[[package]] +name = "is-terminal" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dfb6c8100ccc63462345b67d1bbc3679177c75ee4bf59bf29c8b1d110b8189" +dependencies = [ + "hermit-abi", + "io-lifetimes", + "rustix", + "windows-sys 0.42.0", +] + +[[package]] +name = "itoa" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" + +[[package]] +name = "libc" +version = "0.2.139" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" + +[[package]] +name = "linux-raw-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "once_cell" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66" + +[[package]] +name = "os_str_bytes" +version = "6.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ef7d57beacfaf2d8aee5937dab7b7f28de3cb8b1828479bb5de2a7106f2bae2" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" +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 = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_users" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +dependencies = [ + "getrandom", + "redox_syscall", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" + +[[package]] +name = "rustix" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fdebc4b395b7fbb9ab11e462e20ed9051e7b16e42d24042c776eca0ac81b03" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys 0.42.0", +] + +[[package]] +name = "ryu" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde" + +[[package]] +name = "serde" +version = "1.0.152" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.152" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_yaml" +version = "0.9.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fb06d4b6cdaef0e0c51fa881acb721bed3c924cfaa71d9c94a3b771dfdf6567" +dependencies = [ + "indexmap", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + +[[package]] +name = "setwall" +version = "0.1.0" +dependencies = [ + "clap", + "dirs", + "rand", + "regex", + "serde", + "serde_yaml", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "syn" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "termcolor" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "unicode-ident" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" + +[[package]] +name = "unsafe-libyaml" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7ed8ba44ca06be78ea1ad2c3682a43349126c8818054231ee6f4748012aed2" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[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-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[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.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" diff --git a/scripts/resc/setwall/Cargo.toml b/scripts/resc/setwall/Cargo.toml new file mode 100644 index 0000000..61c5fc0 --- /dev/null +++ b/scripts/resc/setwall/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "setwall" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +clap = { version = "4.1.4", features = ["derive"] } +serde = { version = "1.0", features = ["derive"] } +serde_yaml = "0.9" +regex = "1" +rand = "0.8" +dirs = "4" diff --git a/scripts/resc/setwall/src/main.rs b/scripts/resc/setwall/src/main.rs new file mode 100644 index 0000000..b9e4f01 --- /dev/null +++ b/scripts/resc/setwall/src/main.rs @@ -0,0 +1,178 @@ +use clap::Parser; +use serde::Deserialize; +use regex::RegexSet; +use rand::thread_rng; +use rand::seq::SliceRandom; + +use std::fs::File; +use std::error; +use std::path::{PathBuf, Path}; +use std::process::Command; +use std::fmt; + +#[derive(Parser, Debug)] +#[command(version, about, long_about=None)] +struct Args { + #[arg(short, long, help="Where to load configuration from")] + config: String, + + #[arg(short, long, help="Reapply last applied wallpaper")] + reapply: bool, +} + +#[derive(Debug, Deserialize, Clone, Copy)] +enum Rule { + Tiled, + Scale, + Border, + Center, +} + +#[derive(Debug, Deserialize)] +struct Config { + #[serde(default = "default_folder")] + folder: String, + #[serde(default)] + rules: Vec<(String, Rule)>, + #[serde(default = "default_background")] + background: String, +} + +#[derive(Debug)] +enum Error { + FehFailure(i32), + NoRule(String), + NoState, +} + +impl fmt::Display for Error { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + Error::FehFailure(code) => write!(f, "Feh returned non error: {}", code), + Error::NoRule(fname) => write!(f, "No rule for file with name {}", fname), + Error::NoState => write!(f, "There is no previous wallpaper to reapply"), + } + } +} +impl error::Error for Error {} + +fn default_folder() -> String { String::from(".") } +fn default_background() -> String { String::from("black") } + +fn main() -> Result<(), Box<dyn error::Error>> { + let args = Args::parse(); + + // Load configuration file + let config = Config::parse(&Path::new(&args.config))?; + + if args.reapply { + let img = state::load_state()?.ok_or(Box::new(Error::NoState))?; + config.reapply_image_file(&img)?; + + return Ok(()); + } + + if let Some((img, rule)) = config.select_image_file()? { + config.apply_image_file(&img, rule)?; + } + + Ok(()) + +} + +impl Config { + fn parse(file: &Path) -> Result<Self, Box<dyn error::Error>> { + let f = File::open(file)?; + let mut config: Config = serde_yaml::from_reader(f)?; + + config.folder = file.parent().unwrap_or(Path::new("/")). + join(config.folder).to_string_lossy().to_string(); + + Ok(config) + } + + fn build_regexset(&self) -> Result<RegexSet, Box<dyn error::Error>> { + Ok(RegexSet::new(self.rules.iter().map(|(r,_)| r))?) + } + + fn reapply_image_file(&self, img: &Path) -> Result<(), Box<dyn error::Error>> { + let rs = self.build_regexset()?; + + // TODO handle the invalid unicode here + let file_name = img.file_name().ok_or( + Box::new(Error::NoState))?.to_str().unwrap(); + if let Some(index) = rs.matches(file_name).iter().next() { + self.apply_image_file(img, self.rules[index].1) + } else { + Err(Box::new(Error::NoRule(file_name.into()))) + } + } + + fn select_image_file(&self) -> Result<Option<(PathBuf, Rule)>, Box<dyn error::Error>> { + let folder = Path::new(&self.folder); + let rs = self.build_regexset()?; + let mut imgs: Vec<(PathBuf, Rule)> = Vec::new(); + + for entry in folder.read_dir()? { + let entry = entry?; + let file_name = String::from(entry.file_name().to_string_lossy()); + if let Some(index) = rs.matches(&file_name).iter().next() { + imgs.push((entry.path(), self.rules[index].1)); + } else { + return Err(Box::new(Error::NoRule(file_name.into()))); + } + // deja vu + } + + + Ok(imgs.choose(&mut thread_rng()).cloned()) + } + + fn apply_image_file(&self, img: &Path, rule: Rule) -> Result<(), Box<dyn error::Error>> { + println!("Setting wallpaper {:?}, with {:?} mode", img, rule); + let mode = match rule { + Rule::Tiled => "--bg-tile", + Rule::Scale => "--bg-fill", + Rule::Border => "--bg-max", + Rule::Center => "--bg-center", + }; + + let status = Command::new("feh").arg(mode). + arg("--image-bg").arg(&self.background).arg(img).status()?; + if status.success() { + state::save_state(img) + } else { + Err(Box::new(Error::FehFailure(status.code().unwrap()))) + } + } +} + +mod state { + use std::error; + use std::path::{Path,PathBuf}; + use std::fs; + + // Hehe, not very cool but whatever + static FALLBACK_DATADIR: &str = "."; + + fn state_file() -> PathBuf { + dirs::data_dir().unwrap_or(FALLBACK_DATADIR.into()).join("wallstate") + } + + pub fn load_state() -> Result<Option<PathBuf>, Box<dyn error::Error>> { + let stf = state_file(); + + if stf.exists() { + let raw = fs::read(stf)?; + let content = String::from_utf8_lossy(&raw); + Ok(content.lines().next().map(|x| x.into())) + } else { + Ok(None) + } + } + + pub fn save_state(img: &Path) -> Result<(), Box<dyn error::Error>> { + + Ok(fs::write(state_file(), img.to_str().unwrap())?) + } +} diff --git a/xinit/Scripts/xlaunchrc b/xinit/Scripts/xlaunchrc index e057b0b..a659a39 100755 --- a/xinit/Scripts/xlaunchrc +++ b/xinit/Scripts/xlaunchrc @@ -15,7 +15,7 @@ xrdb ~/.Xresources nm-applet & # set wallpaper -~/Scripts/setwall -A +setwall --config $WALLCONFIG dunst & play ~/Winsounds/login.wav -q & |