diff --git a/Cargo.lock b/Cargo.lock index b27277ab..d2059b6d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -45,7 +45,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f47983a1084940ba9a39c077a8c63e55c619388be5476ac04c804cfbd1e63459" dependencies = [ "accesskit", - "hashbrown", + "hashbrown 0.15.2", "immutable-chunkmap", ] @@ -57,7 +57,7 @@ checksum = "7329821f3bd1101e03a7d2e03bd339e3ac0dc64c70b4c9f9ae1949e3ba8dece1" dependencies = [ "accesskit", "accesskit_consumer", - "hashbrown", + "hashbrown 0.15.2", "objc2 0.5.2", "objc2-app-kit", "objc2-foundation 0.2.2", @@ -89,7 +89,7 @@ checksum = "24fcd5d23d70670992b823e735e859374d694a3d12bfd8dd32bd3bd8bedb5d81" dependencies = [ "accesskit", "accesskit_consumer", - "hashbrown", + "hashbrown 0.15.2", "paste", "static_assertions", "windows 0.58.0", @@ -131,6 +131,12 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +[[package]] +name = "adler32" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" + [[package]] name = "ahash" version = "0.8.11" @@ -272,6 +278,15 @@ version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" +[[package]] +name = "approx" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0e60b75072ecd4168020818c0107f2857bb6c4e64252d8d3983f6263b40a5c3" +dependencies = [ + "num-traits", +] + [[package]] name = "arbitrary" version = "1.4.1" @@ -286,7 +301,7 @@ checksum = "df099ccb16cd014ff054ac1bf392c67feeef57164b05c42f037cd40f5d4357f4" dependencies = [ "clipboard-win", "core-graphics 0.23.2", - "image", + "image 0.25.6", "log", "objc2 0.5.2", "objc2-app-kit", @@ -304,7 +319,7 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -439,7 +454,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -474,7 +489,7 @@ checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -550,7 +565,7 @@ dependencies = [ "arrayvec", "log", "nom", - "num-rational", + "num-rational 0.4.2", "v_frame", ] @@ -599,12 +614,29 @@ dependencies = [ "strum_macros 0.27.1", ] +[[package]] +name = "base16_color_scheme" +version = "0.3.2" +source = "git+https://github.com/LGUG2Z/base16_color_scheme#c32a9e290f0997eacba3e74bba2442667b5fc478" +dependencies = [ + "hex", + "nom", + "ramhorns", + "serde", +] + [[package]] name = "base64" version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "beef" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" + [[package]] name = "bit-set" version = "0.8.0" @@ -728,13 +760,13 @@ dependencies = [ [[package]] name = "bytemuck_derive" -version = "1.9.2" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ff22c2722516255d1823ce3cc4bc0b154dbc9364be5c905d6baa6eccbbc8774" +checksum = "7ecc273b49b3205b83d648f0690daa588925572cc5063745bfe547fe7ec8e1a1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -781,6 +813,25 @@ dependencies = [ "wayland-client", ] +[[package]] +name = "calm_io" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ea0608700fe42d90ec17ad0f86335cf229b67df2e34e7f463e8241ce7b8fa5f" +dependencies = [ + "calmio_filters", +] + +[[package]] +name = "calmio_filters" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "846501f4575cd66766a40bb7ab6d8e960adc7eb49f753c8232bd8e0e09cf6ca2" +dependencies = [ + "quote", + "syn 1.0.109", +] + [[package]] name = "catppuccin-egui" version = "5.3.1" @@ -860,30 +911,30 @@ dependencies = [ [[package]] name = "chrono-tz" -version = "0.10.1" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c6ac4f2c0bf0f44e9161aec9675e1050aa4a530663c4a9e37e108fa948bca9f" +checksum = "efdce149c370f133a071ca8ef6ea340b7b88748ab0810097a9e2976eaa34b4f3" dependencies = [ "chrono", "chrono-tz-build", - "phf", + "phf 0.11.3", ] [[package]] name = "chrono-tz-build" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94fea34d77a245229e7746bd2beb786cd2a896f306ff491fb8cecb3074b10a7" +checksum = "8f10f8c9340e31fc120ff885fcdb54a0b48e474bbd77cab557f0c30a3e569402" dependencies = [ "parse-zoneinfo", - "phf_codegen", + "phf_codegen 0.11.3", ] [[package]] name = "clap" -version = "4.5.32" +version = "4.5.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6088f3ae8c3608d19260cd7445411865a485688711b78b5be70d78cd96136f83" +checksum = "d8aa86934b44c19c50f87cc2790e19f54f7a67aedb64101c2e1a2e5ecfb73944" dependencies = [ "clap_builder", "clap_derive", @@ -891,9 +942,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.32" +version = "4.5.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22a7ef7f676155edfb82daa97f99441f3ebf4a58d5e32f295a56259f1b6facc8" +checksum = "2414dbb2dd0695280da6ea9261e327479e9d37b0630f6b53ba2a11c60c679fd9" dependencies = [ "anstream", "anstyle", @@ -911,7 +962,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -975,6 +1026,15 @@ dependencies = [ "tracing-error", ] +[[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" @@ -1186,10 +1246,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" [[package]] -name = "deranged" -version = "0.4.0" +name = "deflate" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +checksum = "73770f8e1fe7d64df17ca66ad28994a0a623ea497fa69486e14984e715c5d174" +dependencies = [ + "adler32", + "byteorder", +] + +[[package]] +name = "deranged" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28cfac68e08048ae1883171632c2aef3ebc555621ae56fbccce1cbf22dd7f058" dependencies = [ "powerfmt", ] @@ -1204,13 +1274,42 @@ dependencies = [ "crypto-common", ] +[[package]] +name = "dirs" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30baa043103c9d0c2a57cf537cc2f35623889dc0d405e6c3cccfadbc81c71309" +dependencies = [ + "dirs-sys 0.3.7", +] + +[[package]] +name = "dirs" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" +dependencies = [ + "dirs-sys 0.3.7", +] + [[package]] name = "dirs" version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" dependencies = [ - "dirs-sys", + "dirs-sys 0.5.0", +] + +[[package]] +name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users 0.4.6", + "winapi", ] [[package]] @@ -1221,7 +1320,7 @@ checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" dependencies = [ "libc", "option-ext", - "redox_users", + "redox_users 0.5.0", "windows-sys 0.59.0", ] @@ -1239,7 +1338,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -1321,7 +1420,7 @@ dependencies = [ "glow", "glutin", "glutin-winit", - "image", + "image 0.25.6", "js-sys", "log", "objc2 0.5.2", @@ -1486,7 +1585,7 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -1507,7 +1606,7 @@ checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -1575,9 +1674,9 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" dependencies = [ "event-listener", "pin-project-lite", @@ -1662,14 +1761,36 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc" +checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" dependencies = [ "crc32fast", "miniz_oxide 0.8.5", ] +[[package]] +name = "flavours" +version = "0.7.2" +source = "git+https://github.com/LGUG2Z/flavours#84da76ccf16e795360e556711fd68edb06f67011" +dependencies = [ + "anyhow", + "base16_color_scheme", + "calm_io", + "color-thief", + "dirs 3.0.2", + "glob", + "hex", + "image 0.23.14", + "palette", + "rand 0.7.3", + "serde", + "serde_yaml 0.8.26", + "shell-words", + "shellexpand", + "toml 0.5.11", +] + [[package]] name = "fnv" version = "1.0.7" @@ -1722,7 +1843,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -1844,7 +1965,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -1897,6 +2018,17 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + [[package]] name = "getrandom" version = "0.2.15" @@ -1929,7 +2061,17 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn", + "syn 2.0.100", +] + +[[package]] +name = "gif" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3edd93c6756b4dfaf2709eafcc345ba2636565295c198a9cfbf75fa5e3e00b06" +dependencies = [ + "color_quant", + "weezl", ] [[package]] @@ -1972,6 +2114,12 @@ dependencies = [ "xml-rs", ] +[[package]] +name = "glob" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" + [[package]] name = "glow" version = "0.16.0" @@ -2077,7 +2225,7 @@ checksum = "dcf29e94d6d243368b7a56caa16bc213e4f9f8ed38c4d9557069527b5d5281ca" dependencies = [ "bitflags 2.9.0", "gpu-descriptor-types", - "hashbrown", + "hashbrown 0.15.2", ] [[package]] @@ -2101,7 +2249,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap", + "indexmap 2.8.0", "slab", "tokio", "tokio-util", @@ -2118,6 +2266,12 @@ dependencies = [ "crunchy", ] +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + [[package]] name = "hashbrown" version = "0.15.2" @@ -2144,6 +2298,9 @@ name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +dependencies = [ + "serde", +] [[package]] name = "hex_color" @@ -2152,7 +2309,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d37f101bf4c633f7ca2e4b5e136050314503dd198e78e325ea602c327c484ef0" dependencies = [ "arrayvec", - "rand", + "rand 0.8.5", "serde", ] @@ -2277,9 +2434,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" dependencies = [ "bytes", "futures-channel", @@ -2287,6 +2444,7 @@ dependencies = [ "http", "http-body", "hyper", + "libc", "pin-project-lite", "socket2", "tokio", @@ -2296,16 +2454,17 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.61" +version = "0.1.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", + "log", "wasm-bindgen", - "windows-core 0.52.0", + "windows-core 0.61.0", ] [[package]] @@ -2358,9 +2517,9 @@ dependencies = [ [[package]] name = "icu_locid_transform_data" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" +checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" [[package]] name = "icu_normalizer" @@ -2382,9 +2541,9 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" +checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" [[package]] name = "icu_properties" @@ -2403,9 +2562,9 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" +checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" [[package]] name = "icu_provider" @@ -2432,7 +2591,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -2458,23 +2617,42 @@ dependencies = [ [[package]] name = "image" -version = "0.25.5" +version = "0.23.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b" +checksum = "24ffcb7e7244a9bf19d35bf2883b9c080c4ced3c07a9895572178cdb8f13f6a1" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "gif 0.11.4", + "jpeg-decoder 0.1.22", + "num-iter", + "num-rational 0.3.2", + "num-traits", + "png 0.16.8", + "scoped_threadpool", + "tiff 0.6.1", +] + +[[package]] +name = "image" +version = "0.25.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db35664ce6b9810857a38a906215e75a9c879f0696556a39f59c62829710251a" dependencies = [ "bytemuck", "byteorder-lite", "color_quant", "exr", - "gif", + "gif 0.13.1", "image-webp", "num-traits", - "png", + "png 0.17.16", "qoi", "ravif", "rayon", "rgb", - "tiff", + "tiff 0.9.1", "zune-core", "zune-jpeg", ] @@ -2510,6 +2688,16 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", +] + [[package]] name = "indexmap" version = "2.8.0" @@ -2517,7 +2705,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.15.2", ] [[package]] @@ -2548,7 +2736,7 @@ checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -2623,13 +2811,23 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "jobserver" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" dependencies = [ + "getrandom 0.3.2", "libc", ] +[[package]] +name = "jpeg-decoder" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229d53d58899083193af11e15917b5640cd40b29ff475a1fe4ef725deb02d0f2" +dependencies = [ + "rayon", +] + [[package]] name = "jpeg-decoder" version = "0.3.1" @@ -2673,7 +2871,7 @@ dependencies = [ "crossbeam-channel", "crossbeam-utils", "ctrlc", - "dirs", + "dirs 6.0.0", "dunce", "getset", "hotwatch", @@ -2690,7 +2888,7 @@ dependencies = [ "schemars", "serde", "serde_json_lenient", - "serde_yaml", + "serde_yaml 0.9.34+deprecated", "shadow-rs", "strum 0.27.1", "sysinfo", @@ -2719,13 +2917,13 @@ dependencies = [ "clap", "color-eyre", "crossbeam-channel", - "dirs", + "dirs 6.0.0", "dunce", "eframe", "egui-phosphor", "font-loader", "hotwatch", - "image", + "image 0.25.6", "komorebi-client", "komorebi-themes", "lazy_static", @@ -2777,6 +2975,7 @@ dependencies = [ "base16-egui-themes", "catppuccin-egui", "eframe", + "flavours", "hex_color", "schemars", "serde", @@ -2791,7 +2990,7 @@ dependencies = [ "chrono", "clap", "color-eyre", - "dirs", + "dirs 6.0.0", "dunce", "fs-tail", "komorebi-client", @@ -2913,6 +3112,12 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + [[package]] name = "linux-raw-sys" version = "0.4.15" @@ -2949,9 +3154,42 @@ dependencies = [ [[package]] name = "log" -version = "0.4.26" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "logos" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7251356ef8cb7aec833ddf598c6cb24d17b689d20b993f9d11a3d764e34e6458" +dependencies = [ + "logos-derive", +] + +[[package]] +name = "logos-codegen" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59f80069600c0d66734f5ff52cc42f2dabd6b29d205f333d61fd7832e9e9963f" +dependencies = [ + "beef", + "fnv", + "lazy_static", + "proc-macro2", + "quote", + "regex-syntax 0.8.5", + "syn 2.0.100", +] + +[[package]] +name = "logos-derive" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24fb722b06a9dc12adb0963ed585f19fc61dc5413e6a9be9422ef92c091e731d" +dependencies = [ + "logos-codegen", +] [[package]] name = "loop9" @@ -3066,7 +3304,7 @@ checksum = "bf45bf44ab49be92fd1227a3be6fc6f617f1a337c06af54981048574d8783147" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -3091,6 +3329,25 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" +[[package]] +name = "miniz_oxide" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791daaae1ed6889560f8c4359194f56648355540573244a5448a83ba1ecc7435" +dependencies = [ + "adler32", +] + +[[package]] +name = "miniz_oxide" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +dependencies = [ + "adler", + "autocfg", +] + [[package]] name = "miniz_oxide" version = "0.7.4" @@ -3154,7 +3411,7 @@ dependencies = [ "cfg_aliases", "codespan-reporting", "hexf-parse", - "indexmap", + "indexmap 2.8.0", "log", "rustc-hash", "spirv", @@ -3170,7 +3427,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ffa00dec017b5b1a8b7cf5e2c008bfda1aa7e0697ac1508b491fdf2622fb4d8" dependencies = [ - "rand", + "rand 0.8.5", ] [[package]] @@ -3408,7 +3665,7 @@ dependencies = [ "num-complex", "num-integer", "num-iter", - "num-rational", + "num-rational 0.4.2", "num-traits", ] @@ -3445,7 +3702,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -3468,6 +3725,17 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-rational" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-rational" version = "0.4.2" @@ -3506,7 +3774,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -3760,9 +4028,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.21.1" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75b0bedcc4fe52caa0e03d9f1151a323e4aa5e2d78ba3580400cd3c9e2bc4bc" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "openssl" @@ -3787,7 +4055,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -3880,6 +4148,30 @@ version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1036865bb9422d3300cf723f657c2851d0e9ab12567854b1f4eba3d77decf564" +[[package]] +name = "palette" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a05c0334468e62a4dfbda34b29110aa7d70d58c7fdb2c9857b5874dd9827cc59" +dependencies = [ + "approx", + "num-traits", + "palette_derive", + "phf 0.8.0", + "phf_codegen 0.8.0", +] + +[[package]] +name = "palette_derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b4b5f600e60dd3a147fb57b4547033d382d1979eb087af310e91cb45a63b1f4" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "parking" version = "2.2.1" @@ -3940,7 +4232,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap", + "indexmap 2.8.0", +] + +[[package]] +name = "phf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" +dependencies = [ + "phf_shared 0.8.0", ] [[package]] @@ -3949,7 +4250,17 @@ version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" dependencies = [ - "phf_shared", + "phf_shared 0.11.3", +] + +[[package]] +name = "phf_codegen" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", ] [[package]] @@ -3958,8 +4269,18 @@ version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" dependencies = [ - "phf_generator", - "phf_shared", + "phf_generator 0.11.3", + "phf_shared 0.11.3", +] + +[[package]] +name = "phf_generator" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" +dependencies = [ + "phf_shared 0.8.0", + "rand 0.7.3", ] [[package]] @@ -3968,8 +4289,17 @@ version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ - "phf_shared", - "rand", + "phf_shared 0.11.3", + "rand 0.8.5", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher 0.3.11", ] [[package]] @@ -3978,7 +4308,7 @@ version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" dependencies = [ - "siphasher", + "siphasher 1.0.1", ] [[package]] @@ -3998,7 +4328,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -4032,17 +4362,29 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "plist" -version = "1.7.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016" +checksum = "eac26e981c03a6e53e0aee43c113e3202f5581d5360dae7bd2c70e800dd0451d" dependencies = [ "base64", - "indexmap", + "indexmap 2.8.0", "quick-xml 0.32.0", "serde", "time", ] +[[package]] +name = "png" +version = "0.16.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c3287920cb847dee3de33d301c463fba14dda99db24214ddf93f83d3021f4c6" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "deflate", + "miniz_oxide 0.3.7", +] + [[package]] name = "png" version = "0.17.16" @@ -4120,7 +4462,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -4148,7 +4490,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" dependencies = [ "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -4187,9 +4529,9 @@ dependencies = [ [[package]] name = "quick-xml" -version = "0.37.2" +version = "0.37.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "165859e9e55f79d67b96c5d96f4e88b6f2695a1972849c15a6a3f5c59fc2c003" +checksum = "a4ce8c88de324ff838700f36fb6ab86c96df0e3c4ab6ef3a9b2044465cce1369" dependencies = [ "memchr", ] @@ -4209,6 +4551,32 @@ version = "5.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" +[[package]] +name = "ramhorns" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d64e28e1069d26c22d4f085ca7f9e2e2eaee16f9d6f80e5fdce62cbf8670f" +dependencies = [ + "arrayvec", + "beef", + "fnv", + "logos", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", + "rand_pcg", +] + [[package]] name = "rand" version = "0.8.5" @@ -4216,8 +4584,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", ] [[package]] @@ -4227,7 +4605,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", ] [[package]] @@ -4239,6 +4626,24 @@ dependencies = [ "getrandom 0.2.15", ] +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_pcg" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +dependencies = [ + "rand_core 0.5.1", +] + [[package]] name = "random_word" version = "0.5.0" @@ -4249,7 +4654,7 @@ dependencies = [ "brotli", "once_cell", "paste", - "rand", + "rand 0.8.5", "unicase", ] @@ -4279,8 +4684,8 @@ dependencies = [ "once_cell", "paste", "profiling", - "rand", - "rand_chacha", + "rand 0.8.5", + "rand_chacha 0.3.1", "simd_helpers", "system-deps", "thiserror 1.0.69", @@ -4347,6 +4752,17 @@ dependencies = [ "bitflags 2.9.0", ] +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom 0.2.15", + "libredox", + "thiserror 1.0.69", +] + [[package]] name = "redox_users" version = "0.5.0" @@ -4458,6 +4874,9 @@ name = "rgb" version = "0.8.50" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" +dependencies = [ + "bytemuck", +] [[package]] name = "ring" @@ -4506,9 +4925,9 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.3" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e56a18552996ac8d29ecc3b190b4fdbb2d91ca4ec396de7bbffaf43f3d637e96" +checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" dependencies = [ "bitflags 2.9.0", "errno", @@ -4547,9 +4966,9 @@ checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" [[package]] name = "rustls-webpki" -version = "0.103.0" +version = "0.103.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aa4eeac2588ffff23e9d7a7e9b3f971c5fb5b7ebc9452745e0c232c64f83b2f" +checksum = "fef8b8769aaccf73098557a87cd1816b4f9c7c16811c9c77142aa695c16f2c03" dependencies = [ "ring", "rustls-pki-types", @@ -4607,7 +5026,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn", + "syn 2.0.100", ] [[package]] @@ -4616,6 +5035,12 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" +[[package]] +name = "scoped_threadpool" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8" + [[package]] name = "scopeguard" version = "1.2.0" @@ -4675,7 +5100,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -4686,7 +5111,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -4721,7 +5146,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -4754,13 +5179,25 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_yaml" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578a7433b776b56a35785ed5ce9a7e777ac0598aac5a6dd1b4b18a307c7fc71b" +dependencies = [ + "indexmap 1.9.3", + "ryu", + "serde", + "yaml-rust", +] + [[package]] name = "serde_yaml" version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap", + "indexmap 2.8.0", "itoa", "ryu", "serde", @@ -4821,6 +5258,21 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shell-words" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" + +[[package]] +name = "shellexpand" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ccc8076840c4da029af4f87e4e8daeb0fca6b87bbb02e10cb60b791450e11e4" +dependencies = [ + "dirs 4.0.0", +] + [[package]] name = "shlex" version = "1.3.0" @@ -4851,6 +5303,12 @@ dependencies = [ "quote", ] +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + [[package]] name = "siphasher" version = "1.0.1" @@ -4928,9 +5386,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.8" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" dependencies = [ "libc", "windows-sys 0.52.0", @@ -5015,7 +5473,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn", + "syn 2.0.100", ] [[package]] @@ -5028,7 +5486,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn", + "syn 2.0.100", ] [[package]] @@ -5058,6 +5516,17 @@ version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7401a30af6cb5818bb64852270bb722533397edcfc7344954a38f420819ece2" +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "syn" version = "2.0.100" @@ -5086,7 +5555,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -5133,7 +5602,7 @@ dependencies = [ "cfg-expr", "heck", "pkg-config", - "toml", + "toml 0.8.20", "version-compare", ] @@ -5152,7 +5621,7 @@ dependencies = [ "fastrand", "getrandom 0.3.2", "once_cell", - "rustix 1.0.3", + "rustix 1.0.5", "windows-sys 0.59.0", ] @@ -5171,7 +5640,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45c6481c4829e4cc63825e62c49186a34538b7b2750b73b266581ffb612fb5ed" dependencies = [ - "rustix 1.0.3", + "rustix 1.0.5", "windows-sys 0.59.0", ] @@ -5211,7 +5680,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -5222,7 +5691,7 @@ checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -5245,6 +5714,17 @@ dependencies = [ "once_cell", ] +[[package]] +name = "tiff" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a53f4706d65497df0c4349241deddf35f84cee19c87ed86ea8ca590f4464437" +dependencies = [ + "jpeg-decoder 0.1.22", + "miniz_oxide 0.4.4", + "weezl", +] + [[package]] name = "tiff" version = "0.9.1" @@ -5252,15 +5732,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" dependencies = [ "flate2", - "jpeg-decoder", + "jpeg-decoder 0.3.1", "weezl", ] [[package]] name = "time" -version = "0.3.40" +version = "0.3.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d9c75b47bdff86fa3334a3db91356b8d7d86a9b839dab7d0bdc5c3d3a077618" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" dependencies = [ "deranged", "itoa", @@ -5281,9 +5761,9 @@ checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" [[package]] name = "time-macros" -version = "0.2.21" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29aa485584182073ed57fd5004aa09c371f021325014694e432313345865fd04" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" dependencies = [ "num-conv", "time-core", @@ -5372,6 +5852,15 @@ dependencies = [ "tokio", ] +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + [[package]] name = "toml" version = "0.8.20" @@ -5399,7 +5888,7 @@ version = "0.22.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" dependencies = [ - "indexmap", + "indexmap 2.8.0", "serde", "serde_spanned", "toml_datetime", @@ -5464,7 +5953,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -5736,6 +6225,12 @@ dependencies = [ "try-lock", ] +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -5773,7 +6268,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn", + "syn 2.0.100", "wasm-bindgen-shared", ] @@ -5808,7 +6303,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5915,7 +6410,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "896fdafd5d28145fce7958917d69f2fd44469b1d4e861cb5961bcbeebc6d1484" dependencies = [ "proc-macro2", - "quick-xml 0.37.2", + "quick-xml 0.37.4", "quote", ] @@ -6010,7 +6505,7 @@ dependencies = [ "bitflags 2.9.0", "cfg_aliases", "document-features", - "indexmap", + "indexmap 2.8.0", "log", "naga", "once_cell", @@ -6197,15 +6692,6 @@ dependencies = [ "windows-core 0.61.0", ] -[[package]] -name = "windows-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets 0.52.6", -] - [[package]] name = "windows-core" version = "0.57.0" @@ -6283,7 +6769,7 @@ version = "0.1.0" source = "git+https://github.com/LGUG2Z/windows-icons?rev=0c9d7ee1b807347c507d3a9862dd007b4d3f4354#0c9d7ee1b807347c507d3a9862dd007b4d3f4354" dependencies = [ "base64", - "image", + "image 0.25.6", "regex", "roxmltree", "sysinfo", @@ -6297,7 +6783,7 @@ version = "0.1.0" source = "git+https://github.com/LGUG2Z/windows-icons?rev=d67cc9920aa9b4883393e411fb4fa2ddd4c498b5#d67cc9920aa9b4883393e411fb4fa2ddd4c498b5" dependencies = [ "base64", - "image", + "image 0.25.6", "winapi", "windows 0.58.0", ] @@ -6310,7 +6796,7 @@ checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -6321,7 +6807,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -6332,7 +6818,7 @@ checksum = "83577b051e2f49a058c308f17f273b570a6a758386fc291b5f6a934dd84e48c1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -6343,7 +6829,7 @@ checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -6354,7 +6840,7 @@ checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -6365,7 +6851,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -6376,7 +6862,7 @@ checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -6846,9 +7332,9 @@ dependencies = [ [[package]] name = "wmi" -version = "0.15.1" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae33d16f05f9b4b819abe7a9472bad4acb17f5b5d52d3f422762ebec613c65a6" +checksum = "2f902b4592b911109e7352bcfec7b754b07ec71e514d7dfa280eaef924c1cb08" dependencies = [ "chrono", "futures", @@ -6944,6 +7430,15 @@ version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4" +[[package]] +name = "yaml-rust" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" +dependencies = [ + "linked-hash-map", +] + [[package]] name = "yoke" version = "0.7.5" @@ -6964,7 +7459,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", "synstructure", ] @@ -6992,7 +7487,7 @@ dependencies = [ "hex", "nix", "ordered-stream", - "rand", + "rand 0.8.5", "serde", "serde_repr", "sha1", @@ -7024,7 +7519,7 @@ checksum = "709ab20fc57cb22af85be7b360239563209258430bccf38d8b979c5a2ae3ecce" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", "zbus-lockstep", "zbus_xml", "zvariant", @@ -7039,7 +7534,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 2.0.100", "zvariant_utils", ] @@ -7093,7 +7588,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -7104,7 +7599,7 @@ checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -7124,7 +7619,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", "synstructure", ] @@ -7153,7 +7648,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -7202,7 +7697,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 2.0.100", "zvariant_utils", ] @@ -7214,5 +7709,5 @@ checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] diff --git a/deny.toml b/deny.toml index 65c1bcdf..b0cccf23 100644 --- a/deny.toml +++ b/deny.toml @@ -13,7 +13,8 @@ feature-depth = 1 [advisories] ignore = [ { id = "RUSTSEC-2020-0016", reason = "local tcp connectivity is an opt-in feature, and there is no upgrade path for TcpStreamExt" }, - { id = "RUSTSEC-2024-0436", reason = "paste being unmaintained is not an issue in our use" } + { id = "RUSTSEC-2024-0436", reason = "paste being unmaintained is not an issue in our use" }, + { id = "RUSTSEC-2024-0320", reason = "not using any yaml features from this library" } ] [licenses] @@ -93,4 +94,6 @@ allow-git = [ "https://github.com/LGUG2Z/catppuccin-egui", "https://github.com/LGUG2Z/windows-icons", "https://github.com/LGUG2Z/win32-display-data", + "https://github.com/LGUG2Z/flavours", + "https://github.com/LGUG2Z/base16_color_scheme", ] diff --git a/komorebi-themes/Cargo.toml b/komorebi-themes/Cargo.toml index 4db37ea7..5783bd6e 100644 --- a/komorebi-themes/Cargo.toml +++ b/komorebi-themes/Cargo.toml @@ -13,6 +13,7 @@ serde = { workspace = true } serde_variant = "0.1" strum = { workspace = true } hex_color = { version = "3", features = ["serde"] } +flavours = { git = "https://github.com/LGUG2Z/flavours", version = "0.7.2" } [features] default = ["schemars"] diff --git a/komorebi-themes/src/colour.rs b/komorebi-themes/src/colour.rs index d51433bb..999a7dca 100644 --- a/komorebi-themes/src/colour.rs +++ b/komorebi-themes/src/colour.rs @@ -57,7 +57,7 @@ impl From for Color32 { } #[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq)] -pub struct Hex(HexColor); +pub struct Hex(pub HexColor); #[cfg(feature = "schemars")] impl schemars::JsonSchema for Hex { diff --git a/komorebi-themes/src/generator.rs b/komorebi-themes/src/generator.rs new file mode 100644 index 00000000..df5915fd --- /dev/null +++ b/komorebi-themes/src/generator.rs @@ -0,0 +1,77 @@ +use crate::colour::Colour; +use crate::colour::Hex; +use crate::Base16ColourPalette; +use hex_color::HexColor; +use std::collections::VecDeque; +use std::fmt::Display; +use std::fmt::Formatter; +use std::path::Path; + +use serde::Deserialize; +use serde::Serialize; + +#[derive(Debug, Default, Copy, Clone, Serialize, Deserialize, PartialEq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +pub enum ThemeVariant { + #[default] + Dark, + Light, +} + +impl Display for ThemeVariant { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + match self { + ThemeVariant::Dark => write!(f, "dark"), + ThemeVariant::Light => write!(f, "light"), + } + } +} + +impl From for flavours::operations::generate::Mode { + fn from(value: ThemeVariant) -> Self { + match value { + ThemeVariant::Dark => Self::Dark, + ThemeVariant::Light => Self::Light, + } + } +} + +pub fn generate_base16_palette( + image_path: &Path, + variant: ThemeVariant, +) -> Result { + Base16ColourPalette::try_from( + &flavours::operations::generate::generate(image_path, variant.into(), false) + .unwrap_or_default(), + ) +} + +impl TryFrom<&VecDeque> for Base16ColourPalette { + type Error = hex_color::ParseHexColorError; + + fn try_from(value: &VecDeque) -> Result { + let fixed = value.iter().map(|s| format!("#{s}")).collect::>(); + if fixed.len() != 16 { + return Err(hex_color::ParseHexColorError::Empty); + } + + Ok(Self { + base_00: Colour::Hex(Hex(HexColor::parse(&fixed[0])?)), + base_01: Colour::Hex(Hex(HexColor::parse(&fixed[1])?)), + base_02: Colour::Hex(Hex(HexColor::parse(&fixed[2])?)), + base_03: Colour::Hex(Hex(HexColor::parse(&fixed[3])?)), + base_04: Colour::Hex(Hex(HexColor::parse(&fixed[4])?)), + base_05: Colour::Hex(Hex(HexColor::parse(&fixed[5])?)), + base_06: Colour::Hex(Hex(HexColor::parse(&fixed[6])?)), + base_07: Colour::Hex(Hex(HexColor::parse(&fixed[7])?)), + base_08: Colour::Hex(Hex(HexColor::parse(&fixed[8])?)), + base_09: Colour::Hex(Hex(HexColor::parse(&fixed[9])?)), + base_0a: Colour::Hex(Hex(HexColor::parse(&fixed[10])?)), + base_0b: Colour::Hex(Hex(HexColor::parse(&fixed[11])?)), + base_0c: Colour::Hex(Hex(HexColor::parse(&fixed[12])?)), + base_0d: Colour::Hex(Hex(HexColor::parse(&fixed[13])?)), + base_0e: Colour::Hex(Hex(HexColor::parse(&fixed[14])?)), + base_0f: Colour::Hex(Hex(HexColor::parse(&fixed[15])?)), + }) + } +} diff --git a/komorebi-themes/src/lib.rs b/komorebi-themes/src/lib.rs index faa58a4b..56fc2421 100644 --- a/komorebi-themes/src/lib.rs +++ b/komorebi-themes/src/lib.rs @@ -2,6 +2,10 @@ #![allow(clippy::missing_errors_doc)] pub mod colour; +mod generator; + +pub use generator::generate_base16_palette; +pub use generator::ThemeVariant; use schemars::JsonSchema; use serde::Deserialize; diff --git a/komorebi/src/static_config.rs b/komorebi/src/static_config.rs index a2be7dda..c6dee3e6 100644 --- a/komorebi/src/static_config.rs +++ b/komorebi/src/static_config.rs @@ -124,6 +124,57 @@ pub struct BorderColours { pub unfocused_locked: Option, } +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +pub struct ThemeOptions { + /// Specify Light or Dark variant for theme generation (default: Dark) + #[serde(skip_serializing_if = "Option::is_none")] + pub theme_variant: Option, + /// Border colour when the container contains a single window (default: Base0D) + #[serde(skip_serializing_if = "Option::is_none")] + pub single_border: Option, + /// Border colour when the container contains multiple windows (default: Base0B) + #[serde(skip_serializing_if = "Option::is_none")] + pub stack_border: Option, + /// Border colour when the container is in monocle mode (default: Base0F) + #[serde(skip_serializing_if = "Option::is_none")] + pub monocle_border: Option, + /// Border colour when the window is floating (default: Base09) + #[serde(skip_serializing_if = "Option::is_none")] + pub floating_border: Option, + /// Border colour when the container is unfocused (default: Base01) + #[serde(skip_serializing_if = "Option::is_none")] + pub unfocused_border: Option, + /// Border colour when the container is unfocused and locked (default: Base08) + #[serde(skip_serializing_if = "Option::is_none")] + pub unfocused_locked_border: Option, + /// Stackbar focused tab text colour (default: Base0B) + #[serde(skip_serializing_if = "Option::is_none")] + pub stackbar_focused_text: Option, + /// Stackbar unfocused tab text colour (default: Base05) + #[serde(skip_serializing_if = "Option::is_none")] + pub stackbar_unfocused_text: Option, + /// Stackbar tab background colour (default: Base01) + #[serde(skip_serializing_if = "Option::is_none")] + pub stackbar_background: Option, + /// Komorebi status bar accent (default: Base0D) + #[serde(skip_serializing_if = "Option::is_none")] + pub bar_accent: Option, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +pub struct Wallpaper { + /// Path to the wallpaper image file + pub path: PathBuf, + /// Generate and apply Base16 theme for this wallpaper (default: true) + #[serde(skip_serializing_if = "Option::is_none")] + pub generate_theme: Option, + /// Specify Light or Dark variant for theme generation (default: Dark) + #[serde(skip_serializing_if = "Option::is_none")] + pub theme_options: Option, +} + #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] pub struct WorkspaceConfig { @@ -171,6 +222,9 @@ pub struct WorkspaceConfig { /// Determine what happens to a new window when the Floating workspace layer is active (default: Tile) #[serde(skip_serializing_if = "Option::is_none")] pub floating_layer_behaviour: Option, + /// Specify a wallpaper for this workspace + #[serde(skip_serializing_if = "Option::is_none")] + pub wallpaper: Option, } impl From<&Workspace> for WorkspaceConfig { @@ -247,6 +301,7 @@ impl From<&Workspace> for WorkspaceConfig { float_override: *value.float_override(), layout_flip: value.layout_flip(), floating_layer_behaviour: Option::from(*value.floating_layer_behaviour()), + wallpaper: None, } } } diff --git a/komorebi/src/window_manager.rs b/komorebi/src/window_manager.rs index 629ffecd..4ccf2a1f 100644 --- a/komorebi/src/window_manager.rs +++ b/komorebi/src/window_manager.rs @@ -348,6 +348,7 @@ impl From<&WindowManager> for State { floating_layer_behaviour: workspace.floating_layer_behaviour, globals: workspace.globals, locked_containers: workspace.locked_containers.clone(), + wallpaper: workspace.wallpaper.clone(), workspace_config: None, }) .collect::>(); diff --git a/komorebi/src/windows_api.rs b/komorebi/src/windows_api.rs index dfa4d6c0..a453b68e 100644 --- a/komorebi/src/windows_api.rs +++ b/komorebi/src/windows_api.rs @@ -1,13 +1,13 @@ +use color_eyre::eyre::anyhow; +use color_eyre::eyre::bail; +use color_eyre::eyre::Error; +use color_eyre::Result; use core::ffi::c_void; use std::collections::HashMap; use std::collections::VecDeque; use std::convert::TryFrom; use std::mem::size_of; - -use color_eyre::eyre::anyhow; -use color_eyre::eyre::bail; -use color_eyre::eyre::Error; -use color_eyre::Result; +use std::path::Path; use windows::core::Result as WindowsCrateResult; use windows::core::PCWSTR; use windows::core::PWSTR; @@ -47,6 +47,8 @@ use windows::Win32::Graphics::Gdi::HMONITOR; use windows::Win32::Graphics::Gdi::MONITORENUMPROC; use windows::Win32::Graphics::Gdi::MONITORINFOEXW; use windows::Win32::Graphics::Gdi::MONITOR_DEFAULTTONEAREST; +use windows::Win32::System::Com::CoCreateInstance; +use windows::Win32::System::Com::CLSCTX_ALL; use windows::Win32::System::LibraryLoader::GetModuleHandleW; use windows::Win32::System::Power::RegisterPowerSettingNotification; use windows::Win32::System::Power::HPOWERNOTIFY; @@ -72,6 +74,9 @@ use windows::Win32::UI::Input::KeyboardAndMouse::MOUSEEVENTF_LEFTUP; use windows::Win32::UI::Input::KeyboardAndMouse::MOUSEINPUT; use windows::Win32::UI::Input::KeyboardAndMouse::VK_LBUTTON; use windows::Win32::UI::Input::KeyboardAndMouse::VK_MENU; +use windows::Win32::UI::Shell::DesktopWallpaper; +use windows::Win32::UI::Shell::IDesktopWallpaper; +use windows::Win32::UI::Shell::DWPOS_FILL; use windows::Win32::UI::WindowsAndMessaging::AllowSetForegroundWindow; use windows::Win32::UI::WindowsAndMessaging::BringWindowToTop; use windows::Win32::UI::WindowsAndMessaging::CreateWindowExW; @@ -141,6 +146,7 @@ use windows::Win32::UI::WindowsAndMessaging::WS_EX_TOPMOST; use windows::Win32::UI::WindowsAndMessaging::WS_POPUP; use windows::Win32::UI::WindowsAndMessaging::WS_SYSMENU; use windows_core::BOOL; +use windows_core::HSTRING; use crate::core::Rect; @@ -1345,4 +1351,22 @@ impl WindowsApi { pub fn wts_register_session_notification(hwnd: isize) -> Result<()> { unsafe { WTSRegisterSessionNotification(HWND(as_ptr!(hwnd)), 1) }.process() } + + pub fn set_wallpaper(path: &Path) -> Result<()> { + let path = path.canonicalize()?; + + let wallpaper: IDesktopWallpaper = + unsafe { CoCreateInstance(&DesktopWallpaper, None, CLSCTX_ALL)? }; + + let wallpaper_path = HSTRING::from(path.to_str().unwrap_or_default()); + unsafe { + wallpaper.SetPosition(DWPOS_FILL)?; + } + + // Set the wallpaper + unsafe { + wallpaper.SetWallpaper(PCWSTR::null(), PCWSTR::from_raw(wallpaper_path.as_ptr()))?; + } + Ok(()) + } } diff --git a/komorebi/src/workspace.rs b/komorebi/src/workspace.rs index c80bc411..9c92e1c8 100644 --- a/komorebi/src/workspace.rs +++ b/komorebi/src/workspace.rs @@ -1,20 +1,16 @@ use std::collections::BTreeSet; use std::collections::VecDeque; +use std::ffi::OsStr; use std::fmt::Display; use std::fmt::Formatter; +use std::io::Write; use std::num::NonZeroUsize; use std::sync::atomic::Ordering; -use color_eyre::eyre::anyhow; -use color_eyre::Result; -use getset::CopyGetters; -use getset::Getters; -use getset::MutGetters; -use getset::Setters; -use serde::Deserialize; -use serde::Serialize; - use crate::border_manager; +use crate::border_manager::BORDER_OFFSET; +use crate::border_manager::BORDER_WIDTH; +use crate::container::Container; use crate::core::Axis; use crate::core::CustomLayout; use crate::core::CycleDirection; @@ -22,11 +18,6 @@ use crate::core::DefaultLayout; use crate::core::Layout; use crate::core::OperationDirection; use crate::core::Rect; -use crate::FloatingLayerBehaviour; - -use crate::border_manager::BORDER_OFFSET; -use crate::border_manager::BORDER_WIDTH; -use crate::container::Container; use crate::locked_deque::LockedDeque; use crate::ring::Ring; use crate::should_act; @@ -36,13 +27,28 @@ use crate::static_config::WorkspaceConfig; use crate::window::Window; use crate::window::WindowDetails; use crate::windows_api::WindowsApi; +use crate::FloatingLayerBehaviour; +use crate::KomorebiTheme; +use crate::SocketMessage; +use crate::Wallpaper; use crate::WindowContainerBehaviour; +use crate::DATA_DIR; use crate::DEFAULT_CONTAINER_PADDING; use crate::DEFAULT_WORKSPACE_PADDING; use crate::INITIAL_CONFIGURATION_LOADED; use crate::NO_TITLEBAR; use crate::REGEX_IDENTIFIERS; use crate::REMOVE_TITLEBARS; +use color_eyre::eyre::anyhow; +use color_eyre::Result; +use getset::CopyGetters; +use getset::Getters; +use getset::MutGetters; +use getset::Setters; +use komorebi_themes::Base16ColourPalette; +use serde::Deserialize; +use serde::Serialize; +use uds_windows::UnixStream; #[allow(clippy::struct_field_names)] #[derive( @@ -96,6 +102,8 @@ pub struct Workspace { pub floating_layer_behaviour: FloatingLayerBehaviour, #[getset(get = "pub", get_mut = "pub", set = "pub")] pub locked_containers: BTreeSet, + #[getset(get = "pub", get_mut = "pub", set = "pub")] + pub wallpaper: Option, #[serde(skip_serializing_if = "Option::is_none")] #[getset(get = "pub", set = "pub")] pub workspace_config: Option, @@ -148,6 +156,7 @@ impl Default for Workspace { globals: Default::default(), workspace_config: None, locked_containers: Default::default(), + wallpaper: None, } } } @@ -255,6 +264,7 @@ impl Workspace { self.set_float_override(config.float_override); self.set_layout_flip(config.layout_flip); self.set_floating_layer_behaviour(config.floating_layer_behaviour.unwrap_or_default()); + self.set_wallpaper(config.wallpaper.clone()); self.set_workspace_config(Some(config.clone())); @@ -291,12 +301,129 @@ impl Workspace { } } + pub fn apply_wallpaper(&self) -> Result<()> { + if let Some(wallpaper) = &self.wallpaper { + if let Err(error) = WindowsApi::set_wallpaper(&wallpaper.path) { + tracing::error!("failed to set wallpaper: {error}"); + } + + // if !cfg!(debug_assertions) && wallpaper.generate_theme.unwrap_or(true) { + if wallpaper.generate_theme.unwrap_or(true) { + let variant = wallpaper + .theme_options + .as_ref() + .and_then(|t| t.theme_variant) + .unwrap_or_default(); + + let cached_palette = DATA_DIR.join(format!( + "{}.base16.{variant}.json", + wallpaper + .path + .file_name() + .unwrap_or(OsStr::new("tmp")) + .to_string_lossy() + )); + + let mut base16_palette = None; + + if cached_palette.is_file() { + tracing::info!( + "colour palette for wallpaper {} found in cache", + cached_palette.display() + ); + + // this code is VERY slow on debug builds - should only be a one-time issue when loading + // an uncached wallpaper + if let Ok(palette) = serde_json::from_str::( + &std::fs::read_to_string(&cached_palette)?, + ) { + base16_palette = Some(palette); + } + }; + + if base16_palette.is_none() { + base16_palette = + komorebi_themes::generate_base16_palette(&wallpaper.path, variant).ok(); + + std::fs::write( + &cached_palette, + serde_json::to_string_pretty(&base16_palette)?, + )?; + + tracing::info!( + "colour palette for wallpaper {} cached", + cached_palette.display() + ); + } + + if let Some(palette) = base16_palette { + let komorebi_theme = KomorebiTheme::Custom { + colours: Box::new(palette), + single_border: wallpaper + .theme_options + .as_ref() + .and_then(|o| o.single_border), + stack_border: wallpaper + .theme_options + .as_ref() + .and_then(|o| o.stack_border), + monocle_border: wallpaper + .theme_options + .as_ref() + .and_then(|o| o.monocle_border), + floating_border: wallpaper + .theme_options + .as_ref() + .and_then(|o| o.floating_border), + unfocused_border: wallpaper + .theme_options + .as_ref() + .and_then(|o| o.unfocused_border), + unfocused_locked_border: wallpaper + .theme_options + .as_ref() + .and_then(|o| o.unfocused_locked_border), + stackbar_focused_text: wallpaper + .theme_options + .as_ref() + .and_then(|o| o.stackbar_focused_text), + stackbar_unfocused_text: wallpaper + .theme_options + .as_ref() + .and_then(|o| o.stackbar_unfocused_text), + stackbar_background: wallpaper + .theme_options + .as_ref() + .and_then(|o| o.stackbar_background), + bar_accent: wallpaper.theme_options.as_ref().and_then(|o| o.bar_accent), + }; + + let bytes = SocketMessage::Theme(Box::new(komorebi_theme)).as_bytes()?; + + let socket = DATA_DIR.join("komorebi.sock"); + match UnixStream::connect(socket) { + Ok(mut stream) => { + if let Err(error) = stream.write_all(&bytes) { + tracing::error!("failed to send theme update message: {error}") + } + } + Err(error) => { + tracing::error!("{error}") + } + } + } + } + } + + Ok(()) + } + pub fn restore(&mut self, mouse_follows_focus: bool) -> Result<()> { if let Some(container) = self.monocle_container() { if let Some(window) = container.focused_window() { container.restore(); window.focus(mouse_follows_focus)?; - return Ok(()); + return self.apply_wallpaper(); } } @@ -340,7 +467,7 @@ impl Workspace { floating_window.focus(mouse_follows_focus)?; } - Ok(()) + self.apply_wallpaper() } pub fn update(&mut self) -> Result<()> { @@ -559,13 +686,13 @@ impl Workspace { for window in self.visible_windows().into_iter().flatten() { if !window.is_window() - // This one is a hack because WINWORD.EXE is an absolute trainwreck of an app - // when multiple docs are open, it keeps open an invisible window, with WS_EX_LAYERED - // (A STYLE THAT THE REGULAR WINDOWS NEED IN ORDER TO BE MANAGED!) when one of the - // docs is closed - // - // I hate every single person who worked on Microsoft Office 365, especially Word - || !window.is_visible() + // This one is a hack because WINWORD.EXE is an absolute trainwreck of an app + // when multiple docs are open, it keeps open an invisible window, with WS_EX_LAYERED + // (A STYLE THAT THE REGULAR WINDOWS NEED IN ORDER TO BE MANAGED!) when one of the + // docs is closed + // + // I hate every single person who worked on Microsoft Office 365, especially Word + || !window.is_visible() { hwnds.push(window.hwnd); } diff --git a/schema.json b/schema.json index ce0e5642..552b2502 100644 --- a/schema.json +++ b/schema.json @@ -1384,6 +1384,257 @@ "description": "Name", "type": "string" }, + "wallpaper": { + "description": "Specify a wallpaper for this workspace", + "type": "object", + "required": [ + "path" + ], + "properties": { + "generate_theme": { + "description": "Generate and apply Base16 theme for this wallpaper (default: true)", + "type": "boolean" + }, + "path": { + "description": "Path to the wallpaper image file", + "type": "string" + }, + "theme_options": { + "description": "Specify Light or Dark variant for theme generation (default: Dark)", + "type": "object", + "properties": { + "bar_accent": { + "description": "Komorebi status bar accent (default: Base0D)", + "type": "string", + "enum": [ + "Base00", + "Base01", + "Base02", + "Base03", + "Base04", + "Base05", + "Base06", + "Base07", + "Base08", + "Base09", + "Base0A", + "Base0B", + "Base0C", + "Base0D", + "Base0E", + "Base0F" + ] + }, + "floating_border": { + "description": "Border colour when the window is floating (default: Base09)", + "type": "string", + "enum": [ + "Base00", + "Base01", + "Base02", + "Base03", + "Base04", + "Base05", + "Base06", + "Base07", + "Base08", + "Base09", + "Base0A", + "Base0B", + "Base0C", + "Base0D", + "Base0E", + "Base0F" + ] + }, + "monocle_border": { + "description": "Border colour when the container is in monocle mode (default: Base0F)", + "type": "string", + "enum": [ + "Base00", + "Base01", + "Base02", + "Base03", + "Base04", + "Base05", + "Base06", + "Base07", + "Base08", + "Base09", + "Base0A", + "Base0B", + "Base0C", + "Base0D", + "Base0E", + "Base0F" + ] + }, + "single_border": { + "description": "Border colour when the container contains a single window (default: Base0D)", + "type": "string", + "enum": [ + "Base00", + "Base01", + "Base02", + "Base03", + "Base04", + "Base05", + "Base06", + "Base07", + "Base08", + "Base09", + "Base0A", + "Base0B", + "Base0C", + "Base0D", + "Base0E", + "Base0F" + ] + }, + "stack_border": { + "description": "Border colour when the container contains multiple windows (default: Base0B)", + "type": "string", + "enum": [ + "Base00", + "Base01", + "Base02", + "Base03", + "Base04", + "Base05", + "Base06", + "Base07", + "Base08", + "Base09", + "Base0A", + "Base0B", + "Base0C", + "Base0D", + "Base0E", + "Base0F" + ] + }, + "stackbar_background": { + "description": "Stackbar tab background colour (default: Base01)", + "type": "string", + "enum": [ + "Base00", + "Base01", + "Base02", + "Base03", + "Base04", + "Base05", + "Base06", + "Base07", + "Base08", + "Base09", + "Base0A", + "Base0B", + "Base0C", + "Base0D", + "Base0E", + "Base0F" + ] + }, + "stackbar_focused_text": { + "description": "Stackbar focused tab text colour (default: Base0B)", + "type": "string", + "enum": [ + "Base00", + "Base01", + "Base02", + "Base03", + "Base04", + "Base05", + "Base06", + "Base07", + "Base08", + "Base09", + "Base0A", + "Base0B", + "Base0C", + "Base0D", + "Base0E", + "Base0F" + ] + }, + "stackbar_unfocused_text": { + "description": "Stackbar unfocused tab text colour (default: Base05)", + "type": "string", + "enum": [ + "Base00", + "Base01", + "Base02", + "Base03", + "Base04", + "Base05", + "Base06", + "Base07", + "Base08", + "Base09", + "Base0A", + "Base0B", + "Base0C", + "Base0D", + "Base0E", + "Base0F" + ] + }, + "theme_variant": { + "description": "Specify Light or Dark variant for theme generation (default: Dark)", + "type": "string", + "enum": [ + "Dark", + "Light" + ] + }, + "unfocused_border": { + "description": "Border colour when the container is unfocused (default: Base01)", + "type": "string", + "enum": [ + "Base00", + "Base01", + "Base02", + "Base03", + "Base04", + "Base05", + "Base06", + "Base07", + "Base08", + "Base09", + "Base0A", + "Base0B", + "Base0C", + "Base0D", + "Base0E", + "Base0F" + ] + }, + "unfocused_locked_border": { + "description": "Border colour when the container is unfocused and locked (default: Base08)", + "type": "string", + "enum": [ + "Base00", + "Base01", + "Base02", + "Base03", + "Base04", + "Base05", + "Base06", + "Base07", + "Base08", + "Base09", + "Base0A", + "Base0B", + "Base0C", + "Base0D", + "Base0E", + "Base0F" + ] + } + } + } + } + }, "window_container_behaviour": { "description": "Determine what happens when a new window is opened (default: Create)", "oneOf": [