diff --git a/.cargo/config b/.cargo/config.toml similarity index 100% rename from .cargo/config rename to .cargo/config.toml diff --git a/.github/workflows/gen_fedora37.yml b/.github/workflows/gen_fedora40.yml similarity index 95% rename from .github/workflows/gen_fedora37.yml rename to .github/workflows/gen_fedora40.yml index d2e02d783..e5ac8e223 100644 --- a/.github/workflows/gen_fedora37.yml +++ b/.github/workflows/gen_fedora40.yml @@ -1,4 +1,4 @@ -name: fedora37 +name: fedora40 on: pull_request: @@ -8,7 +8,7 @@ on: - "**/*.rs" - "**/Cargo.lock" - "**/Cargo.toml" - - ".github/workflows/gen_fedora37.yml" + - ".github/workflows/gen_fedora40.yml" - "assets/fonts/**/*" - "assets/icon/*" - "assets/open-wezterm-here" @@ -25,7 +25,7 @@ on: jobs: build: runs-on: "ubuntu-latest" - container: "fedora:37" + container: "fedora:40" env: CARGO_INCREMENTAL: "0" SCCACHE_GHA_ENABLED: "true" @@ -89,7 +89,7 @@ jobs: uses: baptiste0928/cargo-install@v3 with: crate: "cargo-nextest" - cache-key: "fedora37" + cache-key: "fedora40" - name: "Test" shell: bash run: "cargo nextest run --all --no-fail-fast" @@ -102,5 +102,5 @@ jobs: - name: "Upload artifact" uses: actions/upload-artifact@v3 with: - name: "fedora37" + name: "fedora40" path: "wezterm-*.rpm" diff --git a/.github/workflows/gen_fedora37_continuous.yml b/.github/workflows/gen_fedora40_continuous.yml similarity index 93% rename from .github/workflows/gen_fedora37_continuous.yml rename to .github/workflows/gen_fedora40_continuous.yml index 25a1a06dd..9d2e06a31 100644 --- a/.github/workflows/gen_fedora37_continuous.yml +++ b/.github/workflows/gen_fedora40_continuous.yml @@ -1,4 +1,4 @@ -name: fedora37_continuous +name: fedora40_continuous on: schedule: @@ -10,7 +10,7 @@ on: - "**/*.rs" - "**/Cargo.lock" - "**/Cargo.toml" - - ".github/workflows/gen_fedora37_continuous.yml" + - ".github/workflows/gen_fedora40_continuous.yml" - "assets/fonts/**/*" - "assets/icon/*" - "assets/open-wezterm-here" @@ -27,7 +27,7 @@ on: jobs: build: runs-on: "ubuntu-latest" - container: "fedora:37" + container: "fedora:40" env: BUILD_REASON: "Schedule" CARGO_INCREMENTAL: "0" @@ -92,7 +92,7 @@ jobs: uses: baptiste0928/cargo-install@v3 with: crate: "cargo-nextest" - cache-key: "fedora37" + cache-key: "fedora40" - name: "Test" shell: bash run: "cargo nextest run --all --no-fail-fast" @@ -101,11 +101,11 @@ jobs: run: "bash ci/deploy.sh" - name: "Move RPM" shell: bash - run: "mv ~/rpmbuild/RPMS/*/*.rpm wezterm-nightly-fedora37.rpm" + run: "mv ~/rpmbuild/RPMS/*/*.rpm wezterm-nightly-fedora40.rpm" - name: "Upload artifact" uses: actions/upload-artifact@v3 with: - name: "fedora37" + name: "fedora40" path: "wezterm-*.rpm" retention-days: 5 @@ -122,7 +122,7 @@ jobs: - name: "Download artifact" uses: actions/download-artifact@v3 with: - name: "fedora37" + name: "fedora40" - name: "Checksum" shell: bash run: "for f in wezterm-*.rpm ; do sha256sum $f > $f.sha256 ; done" diff --git a/.github/workflows/gen_fedora37_tag.yml b/.github/workflows/gen_fedora40_tag.yml similarity index 96% rename from .github/workflows/gen_fedora37_tag.yml rename to .github/workflows/gen_fedora40_tag.yml index dad381e4a..e1d7d5eae 100644 --- a/.github/workflows/gen_fedora37_tag.yml +++ b/.github/workflows/gen_fedora40_tag.yml @@ -1,4 +1,4 @@ -name: fedora37_tag +name: fedora40_tag on: push: @@ -8,7 +8,7 @@ on: jobs: build: runs-on: "ubuntu-latest" - container: "fedora:37" + container: "fedora:40" env: CARGO_INCREMENTAL: "0" SCCACHE_GHA_ENABLED: "true" @@ -72,7 +72,7 @@ jobs: uses: baptiste0928/cargo-install@v3 with: crate: "cargo-nextest" - cache-key: "fedora37" + cache-key: "fedora40" - name: "Test" shell: bash run: "cargo nextest run --all --no-fail-fast" @@ -85,7 +85,7 @@ jobs: - name: "Upload artifact" uses: actions/upload-artifact@v3 with: - name: "fedora37" + name: "fedora40" path: "wezterm-*.rpm" upload: @@ -101,7 +101,7 @@ jobs: - name: "Download artifact" uses: actions/download-artifact@v3 with: - name: "fedora37" + name: "fedora40" - name: "Checksum" shell: bash run: "for f in wezterm-*.rpm ; do sha256sum $f > $f.sha256 ; done" diff --git a/.github/workflows/gen_windows.yml b/.github/workflows/gen_windows.yml index 22f36ec98..6dad080d1 100644 --- a/.github/workflows/gen_windows.yml +++ b/.github/workflows/gen_windows.yml @@ -23,6 +23,7 @@ jobs: CARGO_INCREMENTAL: "0" SCCACHE_GHA_ENABLED: "true" RUSTC_WRAPPER: "sccache" + RUSTUP_WINDOWS_PATH_ADD_BIN: "1" steps: - name: "checkout repo" diff --git a/.github/workflows/gen_windows_continuous.yml b/.github/workflows/gen_windows_continuous.yml index 0d9701ddc..4c6031f7a 100644 --- a/.github/workflows/gen_windows_continuous.yml +++ b/.github/workflows/gen_windows_continuous.yml @@ -26,6 +26,7 @@ jobs: CARGO_INCREMENTAL: "0" SCCACHE_GHA_ENABLED: "true" RUSTC_WRAPPER: "sccache" + RUSTUP_WINDOWS_PATH_ADD_BIN: "1" steps: - name: "checkout repo" diff --git a/.github/workflows/gen_windows_tag.yml b/.github/workflows/gen_windows_tag.yml index 9a067256f..235be6c33 100644 --- a/.github/workflows/gen_windows_tag.yml +++ b/.github/workflows/gen_windows_tag.yml @@ -13,6 +13,7 @@ jobs: CARGO_INCREMENTAL: "0" SCCACHE_GHA_ENABLED: "true" RUSTC_WRAPPER: "sccache" + RUSTUP_WINDOWS_PATH_ADD_BIN: "1" steps: - name: "checkout repo" diff --git a/.github/workflows/update-flake.yml b/.github/workflows/update-flake.yml index 166132b89..46bea0c46 100644 --- a/.github/workflows/update-flake.yml +++ b/.github/workflows/update-flake.yml @@ -25,3 +25,4 @@ jobs: automated pr-assignees: happenslol,gabyx,emiller88 # TODO pr-reviewers: SomeOtherGitHubUsername,SomeThirdGitHubUsername + path-to-flake-dir: 'nix/' diff --git a/.gitignore b/.gitignore index 7a435253f..eb713f8ad 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +/.tag .DS_Store dhat-heap.json /docs/_site diff --git a/Cargo.lock b/Cargo.lock index f781b18e5..2122da749 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -23,17 +23,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" -[[package]] -name = "ahash" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" -dependencies = [ - "getrandom", - "once_cell", - "version_check", -] - [[package]] name = "ahash" version = "0.8.11" @@ -57,10 +46,16 @@ dependencies = [ ] [[package]] -name = "allocator-api2" -version = "0.2.16" +name = "aligned-vec" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" + +[[package]] +name = "allocator-api2" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" [[package]] name = "android-tzdata" @@ -85,47 +80,48 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstream" -version = "0.6.13" +version = "0.6.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" +checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", + "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" +checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" [[package]] name = "anstyle-parse" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +checksum = "a64c907d4e79225ac72e2a354c9ce84d50ebb4586dee56c82b3ee73004f537f5" dependencies = [ "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.2" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" dependencies = [ "anstyle", "windows-sys 0.52.0", @@ -133,9 +129,26 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.81" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0952808a6c2afd1aa8947271f3a60f1a6763c7b912d210184c5149b5cf147247" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" + +[[package]] +name = "arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" + +[[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 2.0.65", +] [[package]] name = "arrayref" @@ -181,82 +194,50 @@ dependencies = [ [[package]] name = "async-broadcast" -version = "0.5.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c48ccdbf6ca6b121e0f586cbc0e73ae440e56c67c30fa0873b4e110d9c26d2b" +checksum = "258b52a1aa741b9f09783b2d86cf0aeeb617bbf847f6933340a39644227acbdb" dependencies = [ - "event-listener 2.5.3", - "futures-core", -] - -[[package]] -name = "async-channel" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" -dependencies = [ - "concurrent-queue", - "event-listener 2.5.3", - "futures-core", -] - -[[package]] -name = "async-channel" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28243a43d821d11341ab73c80bed182dc015c514b951616cf79bd4af39af0c3" -dependencies = [ - "concurrent-queue", "event-listener 5.3.0", - "event-listener-strategy 0.5.1", + "event-listener-strategy 0.5.2", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +dependencies = [ + "concurrent-queue", + "event-listener-strategy 0.5.2", "futures-core", "pin-project-lite", ] [[package]] name = "async-executor" -version = "1.9.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10b3e585719c2358d2660232671ca8ca4ddb4be4ce8a1842d6c2dc8685303316" +checksum = "b10202063978b3351199d68f8b22c4e47e4b1b822f8d43fd862d5ea8c006b29a" dependencies = [ - "async-lock 3.3.0", "async-task", "concurrent-queue", - "fastrand 2.0.2", - "futures-lite 2.3.0", + "fastrand", + "futures-lite", "slab", ] [[package]] name = "async-fs" -version = "1.6.0" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06" +checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" dependencies = [ - "async-lock 2.8.0", - "autocfg", + "async-lock", "blocking", - "futures-lite 1.13.0", -] - -[[package]] -name = "async-io" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" -dependencies = [ - "async-lock 2.8.0", - "autocfg", - "cfg-if", - "concurrent-queue", - "futures-lite 1.13.0", - "log", - "parking", - "polling 2.8.0", - "rustix 0.37.27", - "slab", - "socket2 0.4.10", - "waker-fn", + "futures-lite", ] [[package]] @@ -265,28 +246,19 @@ version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcccb0f599cfa2f8ace422d3555572f47424da5648a4382a9dd0310ff8210884" dependencies = [ - "async-lock 3.3.0", + "async-lock", "cfg-if", "concurrent-queue", "futures-io", - "futures-lite 2.3.0", + "futures-lite", "parking", - "polling 3.6.0", - "rustix 0.38.32", + "polling", + "rustix 0.38.34", "slab", "tracing", "windows-sys 0.52.0", ] -[[package]] -name = "async-lock" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" -dependencies = [ - "event-listener 2.5.3", -] - [[package]] name = "async-lock" version = "3.3.0" @@ -300,82 +272,86 @@ dependencies = [ [[package]] name = "async-net" -version = "1.8.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0434b1ed18ce1cf5769b8ac540e33f01fa9471058b5e89da9e06f3c882a8c12f" +checksum = "b948000fad4873c1c9339d60f2623323a0cfd3816e5181033c6a5cb68b2accf7" dependencies = [ - "async-io 1.13.0", + "async-io", "blocking", - "futures-lite 1.13.0", + "futures-lite", ] [[package]] name = "async-process" -version = "1.8.1" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6438ba0a08d81529c69b36700fa2f95837bfe3e776ab39cde9c14d9149da88" +checksum = "a53fc6301894e04a92cb2584fedde80cb25ba8e02d9dc39d4a87d036e22f397d" dependencies = [ - "async-io 1.13.0", - "async-lock 2.8.0", + "async-channel", + "async-io", + "async-lock", "async-signal", + "async-task", "blocking", "cfg-if", - "event-listener 3.1.0", - "futures-lite 1.13.0", - "rustix 0.38.32", - "windows-sys 0.48.0", + "event-listener 5.3.0", + "futures-lite", + "rustix 0.38.34", + "tracing", + "windows-sys 0.52.0", ] [[package]] name = "async-recursion" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30c5ef0ede93efbf733c1a727f3b6b5a1060bbedd5600183e66f6e4be4af0ec5" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.65", ] [[package]] name = "async-signal" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e47d90f65a225c4527103a8d747001fc56e375203592b25ad103e1ca13124c5" +checksum = "afe66191c335039c7bb78f99dc7520b0cbb166b3a1cb33a03f53d8a1c6f2afda" dependencies = [ - "async-io 2.3.2", - "async-lock 2.8.0", + "async-io", + "async-lock", "atomic-waker", "cfg-if", "futures-core", "futures-io", - "rustix 0.38.32", + "rustix 0.38.34", "signal-hook-registry", "slab", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "async-task" -version = "4.7.0" +version = "4.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.79" +version = "0.1.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507401cad91ec6a857ed5513a2073c82a9b9048762b885bb98655b306964681" +checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.65", ] [[package]] name = "async_ossl" version = "0.1.0" dependencies = [ + "async-io", "openssl", ] @@ -392,21 +368,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] -name = "atty" -version = "0.2.14" +name = "autocfg" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" + +[[package]] +name = "av1-grain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", + "anyhow", + "arrayvec", + "log", + "nom", + "num-rational", + "v_frame", ] [[package]] -name = "autocfg" -version = "1.2.0" +name = "avif-serialize" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" +checksum = "876c75a42f6364451a033496a14c44bffe41f5f4a8236f697391f11024e596d2" +dependencies = [ + "arrayvec", +] [[package]] name = "az" @@ -424,7 +412,7 @@ dependencies = [ "cc", "cfg-if", "libc", - "miniz_oxide 0.7.2", + "miniz_oxide", "object", "rustc-demangle", ] @@ -441,6 +429,12 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + [[package]] name = "base91" version = "0.1.0" @@ -458,9 +452,9 @@ dependencies = [ [[package]] name = "benchmarking" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32842502e72b27b30b2681692d16bf47a8a375c5a2795613f0dc699bed9a48bb" +checksum = "6c335a9de639ba6a3e4107fe7763c9dcd4eb9422575f1191c2b8f2009f03fe4a" [[package]] name = "bintree" @@ -502,6 +496,12 @@ dependencies = [ "serde", ] +[[package]] +name = "bitstream-io" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c12d1856e42f0d817a835fe55853957c85c8c8a470114029143d3f12671446e" + [[package]] name = "block" version = "0.1.6" @@ -519,29 +519,16 @@ dependencies = [ [[package]] name = "blocking" -version = "1.5.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" +checksum = "495f7104e962b7356f0aeb34247aca1fe7d2e783b346582db7f2904cb5717e88" dependencies = [ - "async-channel 2.2.0", - "async-lock 3.3.0", + "async-channel", + "async-lock", "async-task", - "fastrand 2.0.2", "futures-io", - "futures-lite 2.3.0", + "futures-lite", "piper", - "tracing", -] - -[[package]] -name = "bstr" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59604ece62a407dc9164732e5adea02467898954c3a5811fd2dc140af14ef15b" -dependencies = [ - "lazy_static", - "memchr", - "regex-automata 0.1.10", ] [[package]] @@ -551,21 +538,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05efc5cfd9110c8416e471df0e96702d58690178e206e61b7173706673c93706" dependencies = [ "memchr", - "regex-automata 0.4.6", + "regex-automata", "serde", ] [[package]] -name = "bumpalo" -version = "3.15.4" +name = "built" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" +checksum = "41bfbdb21256b87a8b5e80fab81a8eed158178e812fd7ba451907518b2742f16" + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" +checksum = "78834c15cb5d5efe3452d58b1e8ba890dd62d21907f867f383358198e56ebca5" dependencies = [ "bytemuck_derive", ] @@ -578,7 +571,7 @@ checksum = "4da9a32f3fed317401fa3c862968128267c3106685286e15d5aaa3d7389c2f60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.65", ] [[package]] @@ -587,6 +580,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + [[package]] name = "bytes" version = "1.6.0" @@ -616,9 +615,9 @@ dependencies = [ [[package]] name = "camino" -version = "1.1.6" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" +checksum = "e0ec6b951b160caa93cc0c7b209e5a3bff7aae9062213451ac99493cd844c239" [[package]] name = "cassowary" @@ -634,12 +633,23 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.0.90" +version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" +checksum = "41c270e7540d725e65ac7f1b212ac8ce349719624d7bcff99f8e2e488e8cf03f" dependencies = [ "jobserver", "libc", + "once_cell", +] + +[[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]] @@ -648,6 +658,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + [[package]] name = "cgl" version = "0.3.2" @@ -659,16 +675,16 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.37" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d04d43504c61aa6c7531f1871dd0d418d91130162063b789da00fd7057a5e" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "android-tzdata", "iana-time-zone", "num-traits", "pure-rust-locales", "serde", - "windows-targets 0.52.4", + "windows-targets 0.52.5", ] [[package]] @@ -695,30 +711,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" dependencies = [ "ciborium-io", - "half 2.4.0", -] - -[[package]] -name = "clap" -version = "2.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" -dependencies = [ - "bitflags 1.3.2", - "textwrap 0.11.0", - "unicode-width", -] - -[[package]] -name = "clap" -version = "3.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" -dependencies = [ - "bitflags 1.3.2", - "clap_lex 0.2.4", - "indexmap 1.9.3", - "textwrap 0.16.1", + "half", ] [[package]] @@ -739,18 +732,18 @@ checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" dependencies = [ "anstream", "anstyle", - "clap_lex 0.7.0", - "strsim 0.11.1", + "clap_lex", + "strsim", "terminal_size 0.3.0", ] [[package]] name = "clap_complete" -version = "4.5.1" +version = "4.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "885e4d7d5af40bfb99ae6f9433e292feac98d452dcb3ec3d25dfe7552b77da8c" +checksum = "dd79504325bf38b10165b02e89b4347300f855f273c4cb30c4a3209e6583275e" dependencies = [ - "clap 4.5.4", + "clap", ] [[package]] @@ -759,7 +752,7 @@ version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "54b3e65f91fabdd23cac3d57d39d5d938b4daabd070c335c006dccb866a61110" dependencies = [ - "clap 4.5.4", + "clap", "clap_complete", ] @@ -772,16 +765,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.58", -] - -[[package]] -name = "clap_lex" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" -dependencies = [ - "os_str_bytes", + "syn 2.0.65", ] [[package]] @@ -799,21 +783,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "cocoa" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c49e86fc36d5704151f5996b7b3795385f50ce09e3be0f47a0cfde869681cf8" -dependencies = [ - "bitflags 1.3.2", - "block", - "core-foundation 0.7.0", - "core-graphics 0.19.2", - "foreign-types 0.3.2", - "libc", - "objc", -] - [[package]] name = "cocoa" version = "0.25.0" @@ -823,8 +792,8 @@ dependencies = [ "bitflags 1.3.2", "block", "cocoa-foundation", - "core-foundation 0.9.4", - "core-graphics 0.23.2", + "core-foundation", + "core-graphics", "foreign-types 0.5.0", "libc", "objc", @@ -838,7 +807,7 @@ checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" dependencies = [ "bitflags 1.3.2", "block", - "core-foundation 0.9.4", + "core-foundation", "core-graphics-types", "libc", "objc", @@ -905,20 +874,9 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" - -[[package]] -name = "colored" -version = "1.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f741c91823341bebf717d4c71bda820630ce065443b58bd1b7451af008355" -dependencies = [ - "is-terminal", - "lazy_static", - "winapi", -] +checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" [[package]] name = "colored" @@ -947,9 +905,9 @@ checksum = "bf43edc576402991846b093a7ca18a3477e0ef9c588cde84964b5d3e43016642" [[package]] name = "concurrent-queue" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" dependencies = [ "crossbeam-utils", ] @@ -970,7 +928,7 @@ dependencies = [ "log", "luahelper", "mlua", - "nix 0.26.4", + "nix", "notify", "once_cell", "ordered-float", @@ -981,7 +939,7 @@ dependencies = [ "shlex", "smol", "termwiz", - "toml 0.8.12", + "toml 0.8.13", "umask", "wezterm-bidi", "wezterm-config-derive", @@ -992,50 +950,22 @@ dependencies = [ "winapi", ] -[[package]] -name = "core-foundation" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57d24c7a13c43e870e37c1556b74555437870a04514f7685f5b354e090567171" -dependencies = [ - "core-foundation-sys 0.7.0", - "libc", -] - [[package]] name = "core-foundation" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ - "core-foundation-sys 0.8.6", + "core-foundation-sys", "libc", ] -[[package]] -name = "core-foundation-sys" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac" - [[package]] name = "core-foundation-sys" version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" -[[package]] -name = "core-graphics" -version = "0.19.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3889374e6ea6ab25dba90bb5d96202f61108058361f6dc72e8b03e6f8bbe923" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.7.0", - "foreign-types 0.3.2", - "libc", -] - [[package]] name = "core-graphics" version = "0.23.2" @@ -1043,7 +973,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" dependencies = [ "bitflags 1.3.2", - "core-foundation 0.9.4", + "core-foundation", "core-graphics-types", "foreign-types 0.5.0", "libc", @@ -1056,7 +986,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" dependencies = [ "bitflags 1.3.2", - "core-foundation 0.9.4", + "core-foundation", "libc", ] @@ -1066,8 +996,8 @@ version = "20.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c9d2790b5c08465d49f8dc05c8bcae9fea467855947db39b0f8145c091aaced5" dependencies = [ - "core-foundation 0.9.4", - "core-graphics 0.23.2", + "core-foundation", + "core-graphics", "foreign-types 0.5.0", "libc", ] @@ -1101,45 +1031,19 @@ dependencies = [ [[package]] name = "criterion" -version = "0.3.6" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b01d6de93b2b6c65e17c634a26653a29d107b3c98c607c765bf38d041531cd8f" -dependencies = [ - "atty", - "cast", - "clap 2.34.0", - "criterion-plot 0.4.5", - "csv", - "itertools", - "lazy_static", - "num-traits", - "oorandom", - "plotters", - "rayon", - "regex", - "serde", - "serde_cbor", - "serde_derive", - "serde_json", - "tinytemplate", - "walkdir", -] - -[[package]] -name = "criterion" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c76e09c1aae2bc52b3d2f29e13c6572553b30c4aa1b8a49fd70de6412654cb" +checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" dependencies = [ "anes", - "atty", "cast", "ciborium", - "clap 3.2.25", - "criterion-plot 0.5.0", - "itertools", - "lazy_static", + "clap", + "criterion-plot", + "is-terminal", + "itertools 0.10.5", "num-traits", + "once_cell", "oorandom", "plotters", "rayon", @@ -1151,16 +1055,6 @@ dependencies = [ "walkdir", ] -[[package]] -name = "criterion-plot" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2673cc8207403546f45f5fd319a974b1e6983ad1a3ee7e6041650013be041876" -dependencies = [ - "cast", - "itertools", -] - [[package]] name = "criterion-plot" version = "0.5.0" @@ -1168,7 +1062,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" dependencies = [ "cast", - "itertools", + "itertools 0.10.5", ] [[package]] @@ -1186,9 +1080,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.12" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" dependencies = [ "crossbeam-utils", ] @@ -1223,9 +1117,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "crunchy" @@ -1254,25 +1148,10 @@ dependencies = [ ] [[package]] -name = "csv" -version = "1.3.0" +name = "cursor-icon" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" -dependencies = [ - "csv-core", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "csv-core" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" -dependencies = [ - "memchr", -] +checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" [[package]] name = "d3d12" @@ -1287,9 +1166,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" +checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" dependencies = [ "darling_core", "darling_macro", @@ -1297,27 +1176,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" +checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim 0.10.0", - "syn 2.0.58", + "strsim", + "syn 2.0.65", ] [[package]] name = "darling_macro" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" +checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" dependencies = [ "darling_core", "quote", - "syn 2.0.58", + "syn 2.0.65", ] [[package]] @@ -1328,9 +1207,9 @@ checksum = "7762d17f1241643615821a8455a0b2c3e803784b058693d990b11f2dce25a0ca" [[package]] name = "data-encoding" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" [[package]] name = "deltae" @@ -1348,17 +1227,6 @@ dependencies = [ "serde", ] -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "dhat" version = "0.3.3" @@ -1368,7 +1236,7 @@ dependencies = [ "backtrace", "lazy_static", "mintex", - "parking_lot 0.12.1", + "parking_lot 0.12.2", "rustc-hash", "serde", "serde_json", @@ -1397,15 +1265,6 @@ dependencies = [ "crypto-common", ] -[[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-next" version = "2.0.0" @@ -1416,17 +1275,6 @@ dependencies = [ "dirs-sys-next", ] -[[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 = "dirs-sys-next" version = "0.1.2" @@ -1455,9 +1303,9 @@ checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" [[package]] name = "downcast-rs" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "dwrote" @@ -1475,9 +1323,9 @@ dependencies = [ [[package]] name = "either" -version = "1.10.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" +checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" [[package]] name = "embed-resource" @@ -1494,22 +1342,28 @@ dependencies = [ [[package]] name = "emojis" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee61eb945bff65ee7d19d157d39c67c33290ff0742907413fd5eefd29edc979" +checksum = "9f619a926616ae7149a0d82610b051134a0d6c4ae2962d990c06c847a445c5d9" dependencies = [ "phf", ] [[package]] name = "encoding_rs" -version = "0.8.33" +version = "0.8.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" dependencies = [ "cfg-if", ] +[[package]] +name = "endi" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" + [[package]] name = "enum-display-derive" version = "0.1.1" @@ -1539,7 +1393,7 @@ checksum = "5c785274071b1b420972453b306eeca06acf4633829db4223b58a2a8c5953bc4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.65", ] [[package]] @@ -1549,7 +1403,7 @@ dependencies = [ "backtrace", "battery", "chrono", - "cocoa 0.20.2", + "cocoa", "color-funcs", "config", "dirs-next", @@ -1619,9 +1473,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ "libc", "windows-sys 0.52.0", @@ -1636,23 +1490,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "event-listener" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d93877bcde0eb80ca09131a08d23f0a5c18a620b01db137dba666d18cd9b30c2" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - [[package]] name = "event-listener" version = "4.0.3" @@ -1687,9 +1524,9 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "332f51cb23d20b0de8458b86580878211da09bcd4503cb579c225b3d124cabb3" +checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" dependencies = [ "event-listener 5.3.0", "pin-project-lite", @@ -1702,10 +1539,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "887d93f60543e9a9362ef8a21beedd0a833c5d9610e18c67abe15a5963dcb1a4" dependencies = [ "bit_field", - "flume 0.11.0", - "half 2.4.0", + "flume", + "half", "lebe", - "miniz_oxide 0.7.2", + "miniz_oxide", "rayon-core", "smallvec", "zune-inflate", @@ -1713,9 +1550,9 @@ dependencies = [ [[package]] name = "fallible-iterator" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" [[package]] name = "fallible-streaming-iterator" @@ -1735,18 +1572,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "1.9.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] - -[[package]] -name = "fastrand" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "fdeflate" @@ -1768,12 +1596,12 @@ dependencies = [ [[package]] name = "filenamegen" -version = "0.2.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b2da6e8ef70499318bc50abd003fd66dbf6d8a46c23f9e90158f388a788976a" +checksum = "6f40529622e8c4e7c28f600abb501b0ca07047d4e15d576aff1837cca8318ab6" dependencies = [ "anyhow", - "bstr 0.1.4", + "bstr", "regex", "walkdir", ] @@ -1815,7 +1643,7 @@ checksum = "2fc715d38bea7b5bf487fcd79bcf8c209f0b58014f3018a7a19c2b855f472048" dependencies = [ "az", "bytemuck", - "half 2.4.0", + "half", "typenum", ] @@ -1827,12 +1655,12 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.28" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" dependencies = [ "crc32fast", - "miniz_oxide 0.7.2", + "miniz_oxide", ] [[package]] @@ -1844,19 +1672,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "flume" -version = "0.10.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" -dependencies = [ - "futures-core", - "futures-sink", - "nanorand", - "pin-project", - "spin", -] - [[package]] name = "flume" version = "0.11.0" @@ -1910,7 +1725,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.65", ] [[package]] @@ -2009,28 +1824,13 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" -[[package]] -name = "futures-lite" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" -dependencies = [ - "fastrand 1.9.0", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite", - "waker-fn", -] - [[package]] name = "futures-lite" version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" dependencies = [ - "fastrand 2.0.2", + "fastrand", "futures-core", "futures-io", "parking", @@ -2045,7 +1845,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.65", ] [[package]] @@ -2122,9 +1922,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.12" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "js-sys", @@ -2185,7 +1985,7 @@ dependencies = [ "fnv", "gl_generator", "lazy_static", - "memoffset 0.9.1", + "memoffset", "smallvec", "takeable-option", ] @@ -2203,9 +2003,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1" dependencies = [ "aho-corasick", - "bstr 1.9.1", + "bstr", "log", - "regex-automata 0.4.6", + "regex-automata", "regex-syntax", ] @@ -2252,7 +2052,7 @@ dependencies = [ "futures-timer", "no-std-compat", "nonzero_ext", - "parking_lot 0.12.1", + "parking_lot 0.12.2", "smallvec", ] @@ -2297,7 +2097,7 @@ checksum = "cc11df1ace8e7e564511f53af41f3e42ddc95b56fd07b3f4445d2a6048bc682c" dependencies = [ "bitflags 2.5.0", "gpu-descriptor-types", - "hashbrown 0.14.3", + "hashbrown 0.14.5", ] [[package]] @@ -2321,15 +2121,15 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.26" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" dependencies = [ + "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "futures-util", "http", "indexmap 2.2.6", "slab", @@ -2340,15 +2140,9 @@ dependencies = [ [[package]] name = "half" -version = "1.8.3" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" - -[[package]] -name = "half" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5eceaaeec696539ddaf7b333340f1af35a5aa87ae3e4f3ead0532f72affab2e" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" dependencies = [ "cfg-if", "crunchy", @@ -2362,50 +2156,29 @@ dependencies = [ "freetype", ] -[[package]] -name = "hashbrown" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" -dependencies = [ - "ahash 0.7.8", -] - [[package]] name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash 0.7.8", -] [[package]] name = "hashbrown" -version = "0.13.2" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ - "ahash 0.8.11", -] - -[[package]] -name = "hashbrown" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" -dependencies = [ - "ahash 0.8.11", + "ahash", "allocator-api2", ] [[package]] name = "hashlink" -version = "0.7.0" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7249a3129cbc1ffccd74857f81464a323a152173cdb134e0fd81bc803b29facf" +checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" dependencies = [ - "hashbrown 0.11.2", + "hashbrown 0.14.5", ] [[package]] @@ -2443,15 +2216,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - [[package]] name = "hermit-abi" version = "0.3.9" @@ -2481,20 +2245,20 @@ dependencies = [ [[package]] name = "hostname" -version = "0.3.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" +checksum = "f9c7c7c8ac16c798734b8a24560c1362120597c40d5e1459f09498f8f6c8f2ba" dependencies = [ + "cfg-if", "libc", - "match_cfg", - "winapi", + "windows 0.52.0", ] [[package]] name = "http" -version = "0.2.12" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" dependencies = [ "bytes", "fnv", @@ -2503,20 +2267,32 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.6" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" dependencies = [ "bytes", "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", "pin-project-lite", ] [[package]] name = "http_req" -version = "0.10.2" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90394b01e9de1f7eca6ca0664cc64bd92add9603c1aa4f961813f23789035e10" +checksum = "3d9a9b34d2d0a2440774af1b1c09b045fe82ccdc4f4f37d089fbc4cc8a03104e" dependencies = [ "native-tls", "unicase", @@ -2528,12 +2304,6 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - [[package]] name = "humansize" version = "2.1.3" @@ -2551,39 +2321,58 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.28" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" dependencies = [ "bytes", "futures-channel", - "futures-core", "futures-util", "h2", "http", "http-body", "httparse", - "httpdate", "itoa", "pin-project-lite", - "socket2 0.5.6", + "smallvec", "tokio", - "tower-service", - "tracing", "want", ] [[package]] name = "hyper-tls" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", + "http-body-util", "hyper", + "hyper-util", "native-tls", "tokio", "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "pin-project-lite", + "socket2", + "tokio", + "tower", + "tower-service", + "tracing", ] [[package]] @@ -2593,7 +2382,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" dependencies = [ "android_system_properties", - "core-foundation-sys 0.8.6", + "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", @@ -2635,7 +2424,7 @@ dependencies = [ "globset", "log", "memchr", - "regex-automata 0.4.6", + "regex-automata", "same-file", "walkdir", "winapi-util", @@ -2643,22 +2432,43 @@ dependencies = [ [[package]] name = "image" -version = "0.24.9" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" +checksum = "fd54d660e773627692c524beaad361aca785a4f9f5730ce91f42aabe5bce3d11" dependencies = [ "bytemuck", "byteorder", "color_quant", "exr", "gif", - "jpeg-decoder", + "image-webp", "num-traits", "png", "qoi", + "ravif", + "rayon", + "rgb", "tiff", + "zune-core", + "zune-jpeg", ] +[[package]] +name = "image-webp" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d730b085583c4d789dfd07fdcf185be59501666a90c97c40162b37e4fdad272d" +dependencies = [ + "byteorder-lite", + "thiserror", +] + +[[package]] +name = "imgref" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44feda355f4159a7c757171a77de25daf6411e217b4cabd03bd6650690468126" + [[package]] name = "indexmap" version = "1.9.3" @@ -2677,7 +2487,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", - "hashbrown 0.14.3", + "hashbrown 0.14.5", ] [[package]] @@ -2702,20 +2512,31 @@ dependencies = [ [[package]] name = "instant" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ "cfg-if", ] +[[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 2.0.65", +] + [[package]] name = "intrusive-collections" version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b694dc9f70c3bda874626d2aed13b780f137aab435f4e9814121955cf706122e" dependencies = [ - "memoffset 0.9.1", + "memoffset", ] [[package]] @@ -2724,7 +2545,7 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ - "hermit-abi 0.3.9", + "hermit-abi", "libc", "windows-sys 0.48.0", ] @@ -2750,11 +2571,17 @@ version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" dependencies = [ - "hermit-abi 0.3.9", + "hermit-abi", "libc", "windows-sys 0.52.0", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" + [[package]] name = "itertools" version = "0.10.5" @@ -2764,6 +2591,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.11" @@ -2772,9 +2608,9 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jobserver" -version = "0.1.28" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab46a6e9526ddef3ae7f787c06f0f2600639ba80ea3eade3d8e670a2230f51d6" +checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" dependencies = [ "libc", ] @@ -2784,9 +2620,6 @@ name = "jpeg-decoder" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" -dependencies = [ - "rayon", -] [[package]] name = "js-sys" @@ -2797,23 +2630,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "k9" -version = "0.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32ddb58b0079a063218472916af599f2753ccb40942cdaba9d1f3fefccef17a9" -dependencies = [ - "anyhow", - "colored 1.9.4", - "diff", - "lazy_static", - "libc", - "proc-macro2", - "regex", - "syn 1.0.109", - "term_size", -] - [[package]] name = "k9" version = "0.12.0" @@ -2821,13 +2637,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "088bcebb5b68b1b14b64d7f05b0f802719250b97fdc0338ec42529ea777ed614" dependencies = [ "anyhow", - "colored 2.1.0", + "colored", "diff", "lazy_static", "libc", "proc-macro2", "regex", - "syn 2.0.58", + "syn 2.0.65", "terminal_size 0.2.6", ] @@ -2902,25 +2718,25 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" name = "lfucache" version = "0.1.0" dependencies = [ - "ahash 0.8.11", + "ahash", "config", "fnv", "intrusive-collections", - "k9 0.11.6", + "k9", "metrics", ] [[package]] name = "libc" -version = "0.2.153" +version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libflate" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7d5654ae1795afc7ff76f4365c2c8791b0feb18e8996a96adad8ffd7c3b2bf" +checksum = "45d9dfdc14ea4ef0900c1cddbc8dcd553fbaacd8a4a282cf4018ae9dd04fb21e" dependencies = [ "adler32", "core2", @@ -2931,15 +2747,26 @@ dependencies = [ [[package]] name = "libflate_lz77" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be5f52fb8c451576ec6b79d3f4deb327398bc05bbdbd99021a6e77a4c855d524" +checksum = "e6e0d73b369f386f1c44abd9c570d5318f55ccde816ff4b562fa452e5182863d" dependencies = [ "core2", - "hashbrown 0.13.2", + "hashbrown 0.14.5", "rle-decode-fast", ] +[[package]] +name = "libfuzzer-sys" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a96cfd5557eb82f2b83fed4955246c988d331975a002961b07c81584d107e7f7" +dependencies = [ + "arbitrary", + "cc", + "once_cell", +] + [[package]] name = "libgit2-sys" version = "0.16.2+1.7.2" @@ -2953,16 +2780,6 @@ dependencies = [ "pkg-config", ] -[[package]] -name = "libloading" -version = "0.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "351a32417a12d5f7e82c368a66781e307834dae04c6ce0cd4456d52989229883" -dependencies = [ - "cfg-if", - "winapi", -] - [[package]] name = "libloading" version = "0.7.4" @@ -2980,7 +2797,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" dependencies = [ "cfg-if", - "windows-targets 0.52.4", + "windows-targets 0.52.5", ] [[package]] @@ -3001,9 +2818,9 @@ dependencies = [ [[package]] name = "libsqlite3-sys" -version = "0.24.2" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "898745e570c7d0453cc1fbc4a701eb6c662ed54e8fec8b7d14be137ebeeb9d14" +checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716" dependencies = [ "cc", "pkg-config", @@ -3012,11 +2829,12 @@ dependencies = [ [[package]] name = "libssh-rs" -version = "0.2.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3fe324fb06b71d28abb81382ac547f25b4895e853a9968482dc5002fb3db08" +checksum = "4d46682cfd8dc53c52471cfed5eedcc9248c318f3c8df174ec1b8c4f41565f98" dependencies = [ "bitflags 1.3.2", + "libc", "libssh-rs-sys", "openssl-sys", "thiserror", @@ -3024,9 +2842,9 @@ dependencies = [ [[package]] name = "libssh-rs-sys" -version = "0.2.2" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3af07827858d82a7b74d6f935ad4201ff764fb1de8efcc26aeaa33e5f9c89ca2" +checksum = "205ceca5947f473c76f34175de70b15d9e8fadbbdb1bba45d4973037bbdb5fc7" dependencies = [ "cc", "libz-sys", @@ -3075,12 +2893,6 @@ dependencies = [ "num-traits", ] -[[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.3.8" @@ -3089,15 +2901,15 @@ checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" [[package]] name = "linux-raw-sys" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -3120,12 +2932,21 @@ dependencies = [ ] [[package]] -name = "lru" -version = "0.7.8" +name = "loop9" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999beba7b6e8345721bd280141ed958096a2e4abdf74f67ff4ce49b4b54e47a" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" dependencies = [ - "hashbrown 0.12.3", + "imgref", +] + +[[package]] +name = "lru" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" +dependencies = [ + "hashbrown 0.14.5", ] [[package]] @@ -3141,7 +2962,7 @@ dependencies = [ name = "luahelper" version = "0.1.0" dependencies = [ - "bstr 1.9.1", + "bstr", "log", "mlua", "wezterm-dynamic", @@ -3149,9 +2970,9 @@ dependencies = [ [[package]] name = "luajit-src" -version = "210.5.7+d06beb0" +version = "210.5.8+5790d25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d251fdacdabbf87704cf48ac1f8b1eb23d6e10855c3ee08e5beb25b4be2e9e4" +checksum = "441f18d9ad792e871fc2f7f2cb8902c386f6f56fdbddef3b835b61475e375346" dependencies = [ "cc", "which", @@ -3159,19 +2980,19 @@ dependencies = [ [[package]] name = "mac_address" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4863ee94f19ed315bf3bc00299338d857d4b5bc856af375cc97d237382ad3856" +checksum = "5aa12182b93606fff55b70a5cfe6130eaf7407c2ea4f2c2bcc8b113b67c9928f" dependencies = [ - "nix 0.23.2", + "nix", "winapi", ] [[package]] -name = "mach" -version = "0.3.2" +name = "mach2" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" +checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" dependencies = [ "libc", ] @@ -3192,10 +3013,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" [[package]] -name = "match_cfg" -version = "0.1.0" +name = "maybe-rayon" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", + "rayon", +] [[package]] name = "memchr" @@ -3203,24 +3028,6 @@ version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" -[[package]] -name = "memmap2" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "723e3ebdcdc5c023db1df315364573789f8857c11b631a2fdfad7c00f5c046b4" -dependencies = [ - "libc", -] - -[[package]] -name = "memmap2" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" -dependencies = [ - "libc", -] - [[package]] name = "memmap2" version = "0.8.0" @@ -3230,30 +3037,21 @@ dependencies = [ "libc", ] +[[package]] +name = "memmap2" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322" +dependencies = [ + "libc", +] + [[package]] name = "memmem" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a64a92489e2744ce060c349162be1c5f33c6969234104dbd99ddb5feb08b8c15" -[[package]] -name = "memoffset" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" -dependencies = [ - "autocfg", -] - -[[package]] -name = "memoffset" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" -dependencies = [ - "autocfg", -] - [[package]] name = "memoffset" version = "0.9.1" @@ -3280,25 +3078,12 @@ dependencies = [ [[package]] name = "metrics" -version = "0.17.1" +version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55586aa936c35f34ba8aa5d97356d554311206e1ce1f9e68fe7b07288e5ad827" +checksum = "2be3cbd384d4e955b231c895ce10685e3d8260c5ccffae898c96c723b0772835" dependencies = [ - "ahash 0.7.8", - "metrics-macros", -] - -[[package]] -name = "metrics-macros" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0daa0ab3a0ae956d0e2c1f42511422850e577d36a255357d1a7d08d45ee3a2f1" -dependencies = [ - "lazy_static", - "proc-macro2", - "quote", - "regex", - "syn 1.0.109", + "ahash", + "portable-atomic", ] [[package]] @@ -3315,19 +3100,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.4.4" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" -dependencies = [ - "adler", - "autocfg", -] - -[[package]] -name = "miniz_oxide" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +checksum = "87dfd01fe195c66b572b37921ad8803d010623c0aca821bea2302239d155cdae" dependencies = [ "adler", "simd-adler32", @@ -3353,11 +3128,11 @@ dependencies = [ [[package]] name = "mlua" -version = "0.9.7" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d9bed6bce296397a9d6a86f995dd10a547a4e6949825d45225906bdcbfe7367" +checksum = "e340c022072f3208a4105458286f4985ba5355bfe243c3073afe45cbe9ecf491" dependencies = [ - "bstr 1.9.1", + "bstr", "futures-util", "mlua-sys", "num-traits", @@ -3367,9 +3142,9 @@ dependencies = [ [[package]] name = "mlua-sys" -version = "0.5.2" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d16a9ba1dd2c6ac971b204262d434c24d65067038598f0638b64e5dca28d52b8" +checksum = "5552e7e4e22ada0463dfdeee6caf6dc057a189fdc83136408a8f950a5e5c5540" dependencies = [ "cc", "cfg-if", @@ -3394,9 +3169,8 @@ dependencies = [ "fancy-regex", "filedescriptor", "finl_unicode", - "flume 0.10.14", "hostname", - "k9 0.11.6", + "k9", "lazy_static", "libc", "log", @@ -3404,9 +3178,9 @@ dependencies = [ "metrics", "mlua", "names", - "nix 0.25.1", + "nix", "ntapi", - "parking_lot 0.12.1", + "parking_lot 0.12.2", "percent-encoding", "portable-pty", "procinfo", @@ -3419,7 +3193,7 @@ dependencies = [ "terminfo", "termwiz", "termwiz-funcs", - "textwrap 0.16.1", + "textwrap", "thiserror", "url", "wezterm-dynamic", @@ -3438,7 +3212,7 @@ dependencies = [ "log", "luahelper", "mux", - "parking_lot 0.12.1", + "parking_lot 0.12.2", "portable-pty", "smol", "termwiz", @@ -3505,43 +3279,22 @@ dependencies = [ ] [[package]] -name = "nix" -version = "0.23.2" +name = "new_debug_unreachable" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c" -dependencies = [ - "bitflags 1.3.2", - "cc", - "cfg-if", - "libc", - "memoffset 0.6.5", -] +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" [[package]] name = "nix" -version = "0.25.1" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f346ff70e7dbfd675fe90590b92d59ef2de15a8779ae305ebcbfd3f0caf59be4" +checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" dependencies = [ - "autocfg", - "bitflags 1.3.2", + "bitflags 2.5.0", "cfg-if", + "cfg_aliases", "libc", - "memoffset 0.6.5", - "pin-utils", -] - -[[package]] -name = "nix" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" -dependencies = [ - "bitflags 1.3.2", - "cfg-if", - "libc", - "memoffset 0.7.1", - "pin-utils", + "memoffset", ] [[package]] @@ -3566,6 +3319,12 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38bf9645c8b145698bb0b18a4637dcacbc421ea49bef2317e4fd8065a387cf21" +[[package]] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" + [[package]] name = "normalize-line-endings" version = "0.3.0" @@ -3601,9 +3360,9 @@ dependencies = [ [[package]] name = "num" -version = "0.3.1" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b7a8e9be5e039e2ff869df49155f1c06bd01ade2117ec783e56ab0932b67a8f" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" dependencies = [ "num-bigint", "num-complex", @@ -3615,20 +3374,19 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.3.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6f7833f2cbf2360a6cfd58cd41a53aa7a90bd4c202f5b1c7dd2ed73c57b2c3" +checksum = "c165a9ab64cf766f73521c0dd2cfdff64f488b8f0b3e621face3462d3db536d7" dependencies = [ - "autocfg", "num-integer", "num-traits", ] [[package]] name = "num-complex" -version = "0.3.1" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "747d632c0c558b87dbabbe6a82f3b4ae03720d0646ac5b7b4dae89394be5f2c5" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" dependencies = [ "num-traits", ] @@ -3641,13 +3399,13 @@ checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" [[package]] name = "num-derive" -version = "0.3.3" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.65", ] [[package]] @@ -3661,9 +3419,9 @@ dependencies = [ [[package]] name = "num-iter" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" dependencies = [ "autocfg", "num-integer", @@ -3672,11 +3430,10 @@ dependencies = [ [[package]] name = "num-rational" -version = "0.3.2" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" dependencies = [ - "autocfg", "num-bigint", "num-integer", "num-traits", @@ -3684,9 +3441,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] @@ -3697,7 +3454,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.3.9", + "hermit-abi", "libc", ] @@ -3764,7 +3521,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.65", ] [[package]] @@ -3816,12 +3573,6 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "os_str_bytes" -version = "6.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" - [[package]] name = "parking" version = "2.2.0" @@ -3841,12 +3592,12 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" dependencies = [ "lock_api", - "parking_lot_core 0.9.9", + "parking_lot_core 0.9.10", ] [[package]] @@ -3865,30 +3616,30 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.4.1", + "redox_syscall 0.5.1", "smallvec", - "windows-targets 0.48.5", + "windows-targets 0.52.5", ] [[package]] name = "paste" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pem" -version = "3.0.3" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8fcc794035347fb64beda2d3b462595dd2753e3f268d89c5aae77e8cf2c310" +checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "serde", ] @@ -3900,9 +3651,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.9" +version = "2.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "311fb059dee1a7b802f036316d790138c613a4e8b180c822e3925a662e9f0c95" +checksum = "560131c633294438da9f7c4b08189194b20946c8274c6b9e38881a7874dc8ee8" dependencies = [ "memchr", "thiserror", @@ -3911,9 +3662,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.7.9" +version = "2.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f73541b156d32197eecda1a4014d7f868fd2bcb3c550d5386087cfba442bf69c" +checksum = "26293c9193fbca7b1a3bf9b79dc1e388e927e6cacaa78b4a3ab705a1d3d41459" dependencies = [ "pest", "pest_generator", @@ -3921,22 +3672,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.9" +version = "2.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c35eeed0a3fab112f75165fdc026b3913f4183133f19b49be773ac9ea966e8bd" +checksum = "3ec22af7d3fb470a85dd2ca96b7c577a1eb4ef6f1683a9fe9a8c16e136c04687" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.65", ] [[package]] name = "pest_meta" -version = "2.7.9" +version = "2.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2adbf29bb9776f28caece835398781ab24435585fe0d4dc1374a61db5accedca" +checksum = "d7a240022f37c361ec1878d646fc5b7d7c4d28d5946e1a80ad5a7a4f4ca0bdcd" dependencies = [ "once_cell", "pest", @@ -3983,7 +3734,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.65", ] [[package]] @@ -4012,7 +3763,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.65", ] [[package]] @@ -4029,12 +3780,12 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "piper" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" +checksum = "464db0c665917b13ebb5d453ccdec4add5658ee1adc7affc7677615356a8afaf" dependencies = [ "atomic-waker", - "fastrand 2.0.2", + "fastrand", "futures-io", ] @@ -4109,40 +3860,30 @@ dependencies = [ "crc32fast", "fdeflate", "flate2", - "miniz_oxide 0.7.2", + "miniz_oxide", ] [[package]] name = "polling" -version = "2.8.0" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" -dependencies = [ - "autocfg", - "bitflags 1.3.2", - "cfg-if", - "concurrent-queue", - "libc", - "log", - "pin-project-lite", - "windows-sys 0.48.0", -] - -[[package]] -name = "polling" -version = "3.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0c976a60b2d7e99d6f229e414670a9b85d13ac305cc6d1e9c134de58c5aaaf6" +checksum = "645493cf344456ef24219d02a768cf1fb92ddf8c92161679ae3d91b91a637be3" dependencies = [ "cfg-if", "concurrent-queue", - "hermit-abi 0.3.9", + "hermit-abi", "pin-project-lite", - "rustix 0.38.32", + "rustix 0.38.34", "tracing", "windows-sys 0.52.0", ] +[[package]] +name = "portable-atomic" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" + [[package]] name = "portable-pty" version = "0.8.1" @@ -4155,7 +3896,7 @@ dependencies = [ "lazy_static", "libc", "log", - "nix 0.25.1", + "nix", "serde", "serde_derive", "serial", @@ -4216,19 +3957,18 @@ checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" [[package]] name = "proc-macro-crate" -version = "1.3.1" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" dependencies = [ - "once_cell", - "toml_edit 0.19.15", + "toml_edit 0.21.1", ] [[package]] name = "proc-macro2" -version = "1.0.79" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" +checksum = "0b33eb56c327dec362a9e55b3ad14f9d2f0904fb5a5b03b513ab5465399e9f43" dependencies = [ "unicode-ident", ] @@ -4262,6 +4002,19 @@ name = "profiling" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43d84d1d7a6ac92673717f9f6d1518374ef257669c24ebc5ac25d5033828be58" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8021cf59c8ec9c432cfc2526ac6b8aa508ecaf29cd415f271b8406c1b851c3fd" +dependencies = [ + "quote", + "syn 2.0.65", +] [[package]] name = "promise" @@ -4269,9 +4022,9 @@ version = "0.2.0" dependencies = [ "anyhow", "async-executor", - "async-io 1.13.0", + "async-io", "async-task", - "flume 0.10.14", + "flume", "lazy_static", "thiserror", ] @@ -4292,13 +4045,10 @@ dependencies = [ ] [[package]] -name = "quick-xml" -version = "0.28.2" +name = "quick-error" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce5e73202a820a31f8a0ee32ada5e21029c81fd9e3ebf668a40832e4219d9d1" -dependencies = [ - "memchr", -] +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] name = "quick-xml" @@ -4320,9 +4070,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.35" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -4369,7 +4119,7 @@ checksum = "9c8a99fddc9f0ba0a85884b8d14e3592853e787d581ca1816c91349b10e4eeab" name = "rangeset" version = "0.1.0" dependencies = [ - "criterion 0.3.6", + "criterion", "num", ] @@ -4381,6 +4131,56 @@ dependencies = [ "governor", ] +[[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 0.12.1", + "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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc13288f5ab39e6d7c9d501759712e6969fcc9734220846fc9ed26cae2cc4234" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rayon", + "rgb", +] + [[package]] name = "raw-window-handle" version = "0.5.2" @@ -4437,6 +4237,15 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "redox_syscall" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" +dependencies = [ + "bitflags 2.5.0", +] + [[package]] name = "redox_users" version = "0.4.5" @@ -4456,16 +4265,10 @@ checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.6", + "regex-automata", "regex-syntax", ] -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" - [[package]] name = "regex-automata" version = "0.4.6" @@ -4485,9 +4288,9 @@ checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" [[package]] name = "relative-path" -version = "1.9.2" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e898588f33fdd5b9420719948f9f2a32c922a246964576f71ba7f24f80610fbc" +checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" [[package]] name = "renderdoc-sys" @@ -4497,11 +4300,11 @@ checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" [[package]] name = "reqwest" -version = "0.11.27" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "bytes", "encoding_rs", "futures-core", @@ -4509,8 +4312,10 @@ dependencies = [ "h2", "http", "http-body", + "http-body-util", "hyper", "hyper-tls", + "hyper-util", "ipnet", "js-sys", "log", @@ -4532,7 +4337,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "winreg 0.50.0", + "winreg 0.52.0", ] [[package]] @@ -4576,9 +4381,9 @@ checksum = "3582f63211428f83597b51b2ddb88e2a91a9d52d12831f9d08f5e624e8977422" [[package]] name = "rstest" -version = "0.18.2" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97eeab2f3c0a199bc4be135c36c924b6590b88c377d416494288c14f2db30199" +checksum = "9d5316d2a1479eeef1ea21e7f9ddc67c191d497abc8fc3ba2467857abbb68330" dependencies = [ "futures", "futures-timer", @@ -4588,9 +4393,9 @@ dependencies = [ [[package]] name = "rstest_macros" -version = "0.18.2" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d428f8247852f894ee1be110b375111b586d4fa431f6c46e64ba5a0dcccbe605" +checksum = "04a9df72cc1f67020b0d63ad9bfe4a323e459ea7eb68e03bd9824db49f9a4c25" dependencies = [ "cfg-if", "glob", @@ -4599,30 +4404,29 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.58", + "syn 2.0.65", "unicode-ident", ] [[package]] name = "rusqlite" -version = "0.27.0" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85127183a999f7db96d1a976a309eebbfb6ea3b0b400ddd8340190129de6eb7a" +checksum = "a78046161564f5e7cd9008aff3b2990b3850dc8e0349119b98e8f251e099f24d" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.5.0", "fallible-iterator", "fallible-streaming-iterator", "hashlink", "libsqlite3-sys", - "memchr", "smallvec", ] [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc-hash" @@ -4636,7 +4440,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.22", + "semver", ] [[package]] @@ -4655,31 +4459,38 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.32" +version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ "bitflags 2.5.0", "errno", "libc", - "linux-raw-sys 0.4.13", + "linux-raw-sys 0.4.14", "windows-sys 0.52.0", ] [[package]] name = "rustls-pemfile" -version = "1.0.4" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", + "rustls-pki-types", ] [[package]] -name = "ryu" -version = "1.0.17" +name = "rustls-pki-types" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "same-file" @@ -4713,56 +4524,38 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "security-framework" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" +checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "core-foundation-sys 0.8.6", + "bitflags 2.5.0", + "core-foundation", + "core-foundation-sys", "libc", "security-framework-sys", ] [[package]] name = "security-framework-sys" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef" +checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" dependencies = [ - "core-foundation-sys 0.8.6", + "core-foundation-sys", "libc", ] [[package]] name = "semver" -version = "0.11.0" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" - -[[package]] -name = "semver-parser" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" -dependencies = [ - "pest", -] +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.197" +version = "1.0.202" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +checksum = "226b61a0d411b2ba5ff6d7f73a476ac4f8bb900373459cd00fab8512828ba395" dependencies = [ "serde_derive", ] @@ -4776,36 +4569,26 @@ dependencies = [ "luahelper", "serde_json", "serde_yaml", - "toml 0.8.12", + "toml 0.8.13", "wezterm-dynamic", ] -[[package]] -name = "serde_cbor" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5" -dependencies = [ - "half 1.8.3", - "serde", -] - [[package]] name = "serde_derive" -version = "1.0.197" +version = "1.0.202" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +checksum = "6048858004bcff69094cd972ed40a32500f153bd3be9f716b2eed2e8217c4838" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.65", ] [[package]] name = "serde_json" -version = "1.0.115" +version = "1.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12dc5c46daa8e9fdf4f5e71b6cf9a53f2487da0e86e55808e2d35539666497dd" +checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" dependencies = [ "itoa", "ryu", @@ -4814,20 +4597,20 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.18" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.65", ] [[package]] name = "serde_spanned" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" dependencies = [ "serde", ] @@ -4869,7 +4652,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.65", ] [[package]] @@ -4995,9 +4778,9 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" dependencies = [ "libc", ] @@ -5008,6 +4791,15 @@ 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 = "siphasher" version = "0.3.11" @@ -5046,78 +4838,49 @@ checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" [[package]] name = "smithay-client-toolkit" -version = "0.17.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1476c3d89bb67079264b88aaf4f14358353318397e083b7c4e8c14517f55de7" +checksum = "922fd3eeab3bd820d76537ce8f582b1cf951eceb5475c28500c7457d9d17f53a" dependencies = [ - "bitflags 1.3.2", - "dlib", - "lazy_static", + "bitflags 2.5.0", + "cursor-icon", + "libc", "log", - "memmap2 0.5.10", - "nix 0.26.4", + "memmap2 0.9.4", + "rustix 0.38.34", "thiserror", "wayland-backend", "wayland-client", + "wayland-csd-frame", "wayland-cursor", "wayland-protocols", "wayland-protocols-wlr", "wayland-scanner", + "xkeysym", ] [[package]] name = "smol" -version = "1.3.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13f2b548cd8447f8de0fdf1c592929f70f4fc7039a05e47404b0d096ec6987a1" +checksum = "e635339259e51ef85ac7aa29a1cd991b957047507288697a690e80ab97d07cad" dependencies = [ - "async-channel 1.9.0", + "async-channel", "async-executor", "async-fs", - "async-io 1.13.0", - "async-lock 2.8.0", + "async-io", + "async-lock", "async-net", "async-process", "blocking", - "futures-lite 1.13.0", -] - -[[package]] -name = "smol-potat" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "894ffa61af5c0fab697c8c29b1ab10cb6ec4978a1ccac4a81b5b312df1ffd88e" -dependencies = [ - "async-io 1.13.0", - "smol-potat-macro", -] - -[[package]] -name = "smol-potat-macro" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b7cd8129a18069385b4eadaa81182b1451fab312ad6f58d1d99253082bf3932" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", + "futures-lite", ] [[package]] name = "socket2" -version = "0.4.10" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "socket2" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", "windows-sys 0.52.0", @@ -5137,7 +4900,7 @@ name = "spawn-funcs" version = "0.1.0" dependencies = [ "anyhow", - "bstr 1.9.1", + "bstr", "config", "log", "luahelper", @@ -5169,8 +4932,7 @@ dependencies = [ [[package]] name = "sqlite-cache" version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "012429babedb75518d1b6935abcee30852d1650c05c6eaf4e29ae335ae6e173b" +source = "git+https://github.com/losfair/sqlite-cache?rev=0961b50385ff189bb12742716331c05ed0bf7805#0961b50385ff189bb12742716331c05ed0bf7805" dependencies = [ "data-encoding", "futures", @@ -5202,16 +4964,16 @@ dependencies = [ [[package]] name = "starship-battery" -version = "0.7.9" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3336198ad004af4447ae69be4f4e562c26814570f8f0c1e37858405a294e015d" +checksum = "725bc1c7374f435ef65746eb1a5789cb7d02b8e997f9a3edf979bfb42da68311" dependencies = [ "cfg-if", - "core-foundation 0.7.0", + "core-foundation", "lazycell", "libc", - "mach", - "nix 0.23.2", + "mach2", + "nix", "num-traits", "uom", "winapi", @@ -5233,16 +4995,10 @@ checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" name = "strip-ansi-escapes" version = "0.1.0" dependencies = [ - "clap 4.5.4", + "clap", "termwiz", ] -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "strsim" version = "0.11.1" @@ -5251,9 +5007,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "svg_fmt" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83ba502a3265efb76efb89b0a2f7782ad6f2675015d4ce37e4b547dda42b499" +checksum = "20e16a0f46cf5fd675563ef54f26e83e20f2366bcf027bcb3cc3ed2b98aaf2ca" [[package]] name = "syn" @@ -5268,9 +5024,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.58" +version = "2.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44cfb93f38070beee36b3fef7d4f5a16f27751d94b187b666a5cc5e9b0d30687" +checksum = "d2863d96a84c6439701d7a38f9de935ec562c8832cc55d1dde0f513b52fad106" dependencies = [ "proc-macro2", "quote", @@ -5293,13 +5049,13 @@ dependencies = [ "rusqlite", "serde", "serde_json", + "serde_yaml", "sqlite-cache", "tar", "tempfile", "tokio", - "toml 0.8.12", + "toml 0.8.13", "wezterm-dynamic", - "yaml-rust", ] [[package]] @@ -5315,7 +5071,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ "bitflags 1.3.2", - "core-foundation 0.9.4", + "core-foundation", "system-configuration-sys", ] @@ -5325,10 +5081,23 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" dependencies = [ - "core-foundation-sys 0.8.6", + "core-foundation-sys", "libc", ] +[[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 0.8.13", + "version-compare", +] + [[package]] name = "tabout" version = "0.3.0" @@ -5353,6 +5122,12 @@ dependencies = [ "xattr", ] +[[package]] +name = "target-lexicon" +version = "0.12.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f" + [[package]] name = "tempfile" version = "3.10.1" @@ -5360,21 +5135,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" dependencies = [ "cfg-if", - "fastrand 2.0.2", - "rustix 0.38.32", + "fastrand", + "rustix 0.38.34", "windows-sys 0.52.0", ] -[[package]] -name = "term_size" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e4129646ca0ed8f45d09b929036bafad5377103edd06e50bf574b353d2b08d9" -dependencies = [ - "libc", - "winapi", -] - [[package]] name = "termcolor" version = "1.4.1" @@ -5400,17 +5165,16 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7" dependencies = [ - "rustix 0.38.32", + "rustix 0.38.34", "windows-sys 0.48.0", ] [[package]] name = "terminfo" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "666cd3a6681775d22b200409aad3b089c5b99fb11ecdd8a204d9d62f8148498f" +checksum = "d4ea810f0692f9f51b382fff5893887bb4580f5fa246fde546e0b13e7fcee662" dependencies = [ - "dirs", "fnv", "nom", "phf", @@ -5449,7 +5213,7 @@ dependencies = [ "base64 0.21.7", "bitflags 2.5.0", "cassowary", - "criterion 0.4.0", + "criterion", "env_logger 0.11.3", "fancy-regex", "filedescriptor", @@ -5458,19 +5222,18 @@ dependencies = [ "fnv", "hex", "image", - "k9 0.11.6", + "k9", "lazy_static", "libc", "log", "memmem", - "nix 0.26.4", + "nix", "num-derive", "num-traits", "ordered-float", "pest", "pest_derive", "phf", - "semver 0.11.0", "serde", "sha2", "signal-hook", @@ -5506,15 +5269,6 @@ dependencies = [ "wezterm-input-types", ] -[[package]] -name = "textwrap" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -dependencies = [ - "unicode-width", -] - [[package]] name = "textwrap" version = "0.16.1" @@ -5528,22 +5282,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.58" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" +checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.58" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" +checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.65", ] [[package]] @@ -5575,9 +5329,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.34" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "itoa", @@ -5611,9 +5365,9 @@ dependencies = [ [[package]] name = "time-macros" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" dependencies = [ "num-conv", "time-core", @@ -5682,7 +5436,7 @@ dependencies = [ "mio", "num_cpus", "pin-project-lite", - "socket2 0.5.6", + "socket2", "tokio-macros", "windows-sys 0.48.0", ] @@ -5695,7 +5449,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.65", ] [[package]] @@ -5710,16 +5464,15 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" dependencies = [ "bytes", "futures-core", "futures-sink", "pin-project-lite", "tokio", - "tracing", ] [[package]] @@ -5733,30 +5486,30 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.12" +version = "0.8.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3" +checksum = "a4e43f8cc456c9704c851ae29c67e17ef65d2c30017c17a9765b89c382dc8bba" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.9", + "toml_edit 0.22.13", ] [[package]] name = "toml_datetime" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.19.15" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ "indexmap 2.2.6", "toml_datetime", @@ -5765,17 +5518,39 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.9" +version = "0.22.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e40bb779c5187258fd7aad0eb68cb8706a0a81fa712fbea808ab43c4b8374c4" +checksum = "c127785850e8c20836d49732ae6abfa47616e60bf9d9f57c43c250361a9db96c" dependencies = [ "indexmap 2.2.6", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.5", + "winnow 0.6.8", ] +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + [[package]] name = "tower-service" version = "0.3.2" @@ -5788,6 +5563,7 @@ version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ + "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -5801,7 +5577,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.65", ] [[package]] @@ -5837,7 +5613,7 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" dependencies = [ - "memoffset 0.9.1", + "memoffset", "tempfile", "winapi", ] @@ -5894,9 +5670,9 @@ checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" [[package]] name = "unicode-width" -version = "0.1.11" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" +checksum = "68f5e5f3158ecfd4b8ff6fe086db7c8467a2dfdac97fe420f2b7c4aa97af66d6" [[package]] name = "unicode-xid" @@ -5918,9 +5694,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "uom" -version = "0.30.0" +version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e76503e636584f1e10b9b3b9498538279561adcef5412927ba00c2b32c4ce5ed" +checksum = "ffd36e5350a65d112584053ee91843955826bf9e56ec0d1351214e01f6d7cd9c" dependencies = [ "num-traits", "typenum", @@ -5966,6 +5742,17 @@ dependencies = [ "serde", ] +[[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 = "varbincode" version = "0.1.0" @@ -5983,6 +5770,12 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[package]] +name = "version-compare" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" + [[package]] name = "version_check" version = "0.9.4" @@ -6013,16 +5806,10 @@ dependencies = [ name = "vtparse" version = "0.6.2" dependencies = [ - "k9 0.11.6", + "k9", "utf8parse", ] -[[package]] -name = "waker-fn" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690" - [[package]] name = "walkdir" version = "2.5.0" @@ -6075,7 +5862,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.65", "wasm-bindgen-shared", ] @@ -6109,7 +5896,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.65", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -6122,14 +5909,13 @@ checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "wayland-backend" -version = "0.1.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41b48e27457e8da3b2260ac60d0a94512f5cba36448679f3747c0865b7893ed8" +checksum = "9d50fa61ce90d76474c87f5fc002828d81b32677340112b4ef08079a9d459a40" dependencies = [ "cc", "downcast-rs", - "io-lifetimes", - "nix 0.26.4", + "rustix 0.38.34", "scoped-tls", "smallvec", "wayland-sys", @@ -6137,32 +5923,43 @@ dependencies = [ [[package]] name = "wayland-client" -version = "0.30.2" +version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "489c9654770f674fc7e266b3c579f4053d7551df0ceb392f153adb1f9ed06ac8" +checksum = "82fb96ee935c2cea6668ccb470fb7771f6215d1691746c2d896b447a00ad3f1f" dependencies = [ - "bitflags 1.3.2", - "nix 0.26.4", + "bitflags 2.5.0", + "rustix 0.38.34", "wayland-backend", "wayland-scanner", ] [[package]] -name = "wayland-cursor" -version = "0.30.0" +name = "wayland-csd-frame" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d0c3a0d5b4b688b07b0442362d3ed6bf04724fcc16cd69ab6285b90dbc487aa" +checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" dependencies = [ - "nix 0.26.4", + "bitflags 2.5.0", + "cursor-icon", + "wayland-backend", +] + +[[package]] +name = "wayland-cursor" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71ce5fa868dd13d11a0d04c5e2e65726d0897be8de247c0c5a65886e283231ba" +dependencies = [ + "rustix 0.38.34", "wayland-client", "xcursor", ] [[package]] name = "wayland-egl" -version = "0.30.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1187695fe81c3153c3163f9d2953149f638c5d7dbc6fe988914ca3f4961e28ed" +checksum = "355f652e5a24ae02d2ad536c8fc2d3dcc6c2bd635027cd6103a193e7d75eeda2" dependencies = [ "wayland-backend", "wayland-sys", @@ -6170,11 +5967,11 @@ dependencies = [ [[package]] name = "wayland-protocols" -version = "0.30.1" +version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b28101e5ca94f70461a6c2d610f76d85ad223d042dd76585ab23d3422dd9b4d" +checksum = "8f81f365b8b4a97f422ac0e8737c438024b5951734506b0e1d775c73030561f4" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.5.0", "wayland-backend", "wayland-client", "wayland-scanner", @@ -6182,11 +5979,11 @@ dependencies = [ [[package]] name = "wayland-protocols-wlr" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fce991093320e4a6a525876e6b629ab24da25f9baef0c2e0080ad173ec89588a" +checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.5.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -6195,20 +5992,20 @@ dependencies = [ [[package]] name = "wayland-scanner" -version = "0.30.1" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9b873b257fbc32ec909c0eb80dea312076a67014e65e245f5eb69a6b8ab330e" +checksum = "63b3a62929287001986fb58c789dce9b67604a397c15c611ad9f747300b6c283" dependencies = [ "proc-macro2", - "quick-xml 0.28.2", + "quick-xml 0.31.0", "quote", ] [[package]] name = "wayland-sys" -version = "0.30.1" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b2a02ac608e07132978689a6f9bf4214949c85998c247abadd4f4129b1aa06" +checksum = "15a0c8eaff5216d07f226cb7a549159267f3467b289d9a2e52fd3ef5aae2b7af" dependencies = [ "dlib", "log", @@ -6238,7 +6035,7 @@ dependencies = [ "anyhow", "cc", "chrono", - "clap 4.5.4", + "clap", "clap_complete", "clap_complete_fig", "codec", @@ -6247,6 +6044,7 @@ dependencies = [ "env-bootstrap", "filedescriptor", "hostname", + "humantime", "image", "libc", "log", @@ -6262,7 +6060,7 @@ dependencies = [ "termios 0.3.3", "termwiz", "termwiz-funcs", - "textwrap 0.16.1", + "textwrap", "umask", "url", "wezterm-client", @@ -6276,7 +6074,7 @@ name = "wezterm-bidi" version = "0.2.3" dependencies = [ "env_logger 0.11.3", - "k9 0.12.0", + "k9", "log", "wezterm-dynamic", ] @@ -6300,6 +6098,7 @@ name = "wezterm-client" version = "0.1.0" dependencies = [ "anyhow", + "async-io", "async-trait", "async_ossl", "codec", @@ -6313,21 +6112,21 @@ dependencies = [ "metrics", "mux", "openssl", - "parking_lot 0.12.1", + "parking_lot 0.12.2", "portable-pty", "promise", "rangeset", "ratelim", "smol", "termwiz", - "textwrap 0.16.1", + "textwrap", "thiserror", - "uds_windows", "umask", "url", "wezterm-dynamic", "wezterm-ssh", "wezterm-term", + "wezterm-uds", "winapi", ] @@ -6358,7 +6157,7 @@ dependencies = [ "log", "maplit", "ordered-float", - "strsim 0.10.0", + "strsim", "thiserror", "wezterm-dynamic-derive", ] @@ -6378,9 +6177,9 @@ version = "0.1.0" dependencies = [ "anyhow", "cairo-rs", - "cocoa 0.25.0", + "cocoa", "config", - "core-foundation 0.9.4", + "core-foundation", "core-text", "dwrote", "encoding_rs", @@ -6392,11 +6191,11 @@ dependencies = [ "freetype", "harfbuzz", "image", - "k9 0.11.6", + "k9", "lazy_static", "lfucache", "log", - "memmap2 0.2.3", + "memmap2 0.9.4", "metrics", "objc", "ordered-float", @@ -6422,7 +6221,7 @@ dependencies = [ "bytemuck", "cc", "chrono", - "clap 4.5.4", + "clap", "codec", "colorgrad", "config", @@ -6434,7 +6233,7 @@ dependencies = [ "env-bootstrap", "env_logger 0.11.3", "euclid", - "fastrand 2.0.2", + "fastrand", "filedescriptor", "finl_unicode", "frecency", @@ -6443,7 +6242,7 @@ dependencies = [ "hdrhistogram", "http_req", "image", - "k9 0.12.0", + "k9", "lazy_static", "lfucache", "libc", @@ -6455,7 +6254,7 @@ dependencies = [ "mux-lua", "once_cell", "ordered-float", - "parking_lot 0.12.1", + "parking_lot 0.12.2", "portable-pty", "promise", "rangeset", @@ -6472,10 +6271,9 @@ dependencies = [ "terminfo", "termwiz", "termwiz-funcs", - "textwrap 0.16.1", + "textwrap", "thiserror", "tiny-skia", - "uds_windows", "umask", "unicode-normalization", "unicode-segmentation", @@ -6506,7 +6304,7 @@ name = "wezterm-gui-subcommands" version = "0.1.0" dependencies = [ "anyhow", - "clap 4.5.4", + "clap", "config", ] @@ -6528,7 +6326,7 @@ dependencies = [ "anyhow", "async_ossl", "cc", - "clap 4.5.4", + "clap", "config", "embed-resource", "env-bootstrap", @@ -6552,6 +6350,7 @@ name = "wezterm-mux-server-impl" version = "0.1.0" dependencies = [ "anyhow", + "async-io", "async_ossl", "codec", "config", @@ -6566,10 +6365,10 @@ dependencies = [ "rcgen", "smol", "termwiz", - "uds_windows", "url", "wezterm-client", "wezterm-term", + "wezterm-uds", "winapi", ] @@ -6587,16 +6386,16 @@ dependencies = [ "anyhow", "assert_fs", "async_ossl", - "base64 0.21.7", + "base64 0.22.1", "bitflags 1.3.2", "camino", - "clap 4.5.4", + "clap", "dirs-next", "env_logger 0.11.3", "filedescriptor", "filenamegen", "gethostname", - "k9 0.12.0", + "k9", "libc", "libssh-rs", "log", @@ -6607,11 +6406,11 @@ dependencies = [ "rstest", "shell-words", "smol", - "smol-potat", - "socket2 0.5.6", + "socket2", "ssh2", "termwiz", "thiserror", + "wezterm-uds", "whoami", ] @@ -6628,11 +6427,11 @@ dependencies = [ "hex", "humansize", "image", - "k9 0.11.6", + "k9", "lazy_static", "log", "lru", - "miniz_oxide 0.4.4", + "miniz_oxide", "num-traits", "ordered-float", "serde", @@ -6648,9 +6447,9 @@ dependencies = [ name = "wezterm-toast-notification" version = "0.1.0" dependencies = [ - "async-io 1.13.0", - "cocoa 0.20.2", - "core-foundation 0.7.0", + "async-io", + "cocoa", + "core-foundation", "futures-util", "log", "objc", @@ -6662,6 +6461,14 @@ dependencies = [ "zvariant", ] +[[package]] +name = "wezterm-uds" +version = "0.1.0" +dependencies = [ + "async-io", + "uds_windows", +] + [[package]] name = "wezterm-version" version = "0.1.0" @@ -6677,11 +6484,11 @@ checksum = "30e7d227c9f961f2061c26f4cb0fbd4df0ef37e056edd0931783599d6c94ef24" dependencies = [ "arrayvec", "cfg-if", - "flume 0.11.0", + "flume", "js-sys", "log", "naga", - "parking_lot 0.12.1", + "parking_lot 0.12.2", "profiling", "raw-window-handle", "smallvec", @@ -6706,7 +6513,7 @@ dependencies = [ "codespan-reporting", "log", "naga", - "parking_lot 0.12.1", + "parking_lot 0.12.2", "profiling", "raw-window-handle", "rustc-hash", @@ -6746,7 +6553,7 @@ dependencies = [ "naga", "objc", "once_cell", - "parking_lot 0.12.1", + "parking_lot 0.12.2", "profiling", "range-alloc", "raw-window-handle", @@ -6779,7 +6586,7 @@ checksum = "8211e4f58a2b2805adfbefbc07bab82958fc91e3836339b1ab7ae32465dce0d7" dependencies = [ "either", "home", - "rustix 0.38.32", + "rustix 0.38.34", "winsafe", ] @@ -6796,9 +6603,9 @@ dependencies = [ [[package]] name = "widestring" -version = "1.0.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8" +checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" [[package]] name = "winapi" @@ -6818,11 +6625,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" dependencies = [ - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -6836,31 +6643,31 @@ name = "window" version = "0.1.0" dependencies = [ "anyhow", - "async-channel 1.9.0", - "async-io 1.13.0", + "async-channel", + "async-io", "async-task", "async-trait", "bitflags 1.3.2", "bytes", "cgl", "clipboard-win", - "cocoa 0.25.0", + "cocoa", "config", - "core-foundation 0.7.0", - "core-graphics 0.19.2", + "core-foundation", + "core-graphics", "dirs-next", "downcast-rs", "euclid", "filedescriptor", - "futures-lite 1.13.0", + "futures-lite", "futures-util", "gl_generator", "glium", "guillotiere", - "k9 0.11.6", + "k9", "lazy_static", "libc", - "libloading 0.6.7", + "libloading 0.8.3", "line_drawing", "log", "metrics", @@ -6929,6 +6736,16 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "windows" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" +dependencies = [ + "windows-core 0.52.0", + "windows-targets 0.52.5", +] + [[package]] name = "windows-core" version = "0.51.1" @@ -6944,7 +6761,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.4", + "windows-targets 0.52.5", ] [[package]] @@ -6971,7 +6788,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.4", + "windows-targets 0.52.5", ] [[package]] @@ -7006,17 +6823,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" dependencies = [ - "windows_aarch64_gnullvm 0.52.4", - "windows_aarch64_msvc 0.52.4", - "windows_i686_gnu 0.52.4", - "windows_i686_msvc 0.52.4", - "windows_x86_64_gnu 0.52.4", - "windows_x86_64_gnullvm 0.52.4", - "windows_x86_64_msvc 0.52.4", + "windows_aarch64_gnullvm 0.52.5", + "windows_aarch64_msvc 0.52.5", + "windows_i686_gnu 0.52.5", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.5", + "windows_x86_64_gnu 0.52.5", + "windows_x86_64_gnullvm 0.52.5", + "windows_x86_64_msvc 0.52.5", ] [[package]] @@ -7033,9 +6851,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" [[package]] name = "windows_aarch64_msvc" @@ -7057,9 +6875,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" [[package]] name = "windows_i686_gnu" @@ -7081,9 +6899,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" [[package]] name = "windows_i686_msvc" @@ -7105,9 +6929,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" [[package]] name = "windows_x86_64_gnu" @@ -7129,9 +6953,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" [[package]] name = "windows_x86_64_gnullvm" @@ -7147,9 +6971,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" [[package]] name = "windows_x86_64_msvc" @@ -7171,9 +6995,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" [[package]] name = "winnow" @@ -7186,9 +7010,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.5" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dffa400e67ed5a4dd237983829e66475f0a4a26938c4b04c21baede6262215b8" +checksum = "c3c52e9c97a68071b23e836c9380edae937f17b9c4667bd021973efc689f618d" dependencies = [ "memchr", ] @@ -7204,9 +7028,9 @@ dependencies = [ [[package]] name = "winreg" -version = "0.50.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" dependencies = [ "cfg-if", "windows-sys 0.48.0", @@ -7244,15 +7068,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" dependencies = [ "libc", - "linux-raw-sys 0.4.13", - "rustix 0.38.32", + "linux-raw-sys 0.4.14", + "rustix 0.38.34", ] [[package]] name = "xcb" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d27b37e69b8c05bfadcd968eb1a4fe27c9c52565b727f88512f43b89567e262" +checksum = "02e75181b5a62b6eeaa72f303d3cef7dbb841e22885bf6d3e66fe23e88c55dc6" dependencies = [ "as-raw-xcb-connection", "bitflags 1.3.2", @@ -7264,7 +7088,7 @@ dependencies = [ [[package]] name = "xcb-imdkit" version = "0.3.0" -source = "git+https://github.com/wez/xcb-imdkit-rs.git?rev=215ce4b08ac9c4822e541efd4f4ffb1062806051#215ce4b08ac9c4822e541efd4f4ffb1062806051" +source = "git+https://github.com/wez/xcb-imdkit-rs.git?rev=358e226573461fe540efb920e2aad740e3c6fab1#358e226573461fe540efb920e2aad740e3c6fab1" dependencies = [ "bitflags 1.3.2", "cc", @@ -7313,15 +7137,6 @@ version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "791978798f0597cfc70478424c2b4fdc2b7a8024aaff78497ef00f24ef674193" -[[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 = "yasna" version = "0.5.2" @@ -7333,30 +7148,27 @@ dependencies = [ [[package]] name = "zbus" -version = "3.15.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "675d170b632a6ad49804c8cf2105d7c31eddd3312555cffd4b740e08e97c25e6" +checksum = "e5915716dff34abef1351d2b10305b019c8ef33dcf6c72d31a6e227d5d9d7a21" dependencies = [ "async-broadcast", "async-executor", "async-fs", - "async-io 1.13.0", - "async-lock 2.8.0", + "async-io", + "async-lock", "async-process", "async-recursion", "async-task", "async-trait", "blocking", - "byteorder", - "derivative", "enumflags2", - "event-listener 2.5.3", + "event-listener 5.3.0", "futures-core", "futures-sink", "futures-util", "hex", - "nix 0.26.4", - "once_cell", + "nix", "ordered-stream", "rand", "serde", @@ -7365,7 +7177,7 @@ dependencies = [ "static_assertions", "tracing", "uds_windows", - "winapi", + "windows-sys 0.52.0", "xdg-home", "zbus_macros", "zbus_names", @@ -7374,23 +7186,22 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "3.15.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7131497b0f887e8061b430c530240063d33bf9455fa34438f388a245da69e0a5" +checksum = "66fceb36d0c1c4a6b98f3ce40f410e64e5a134707ed71892e1b178abc4c695d4" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "regex", "syn 1.0.109", "zvariant_utils", ] [[package]] name = "zbus_names" -version = "2.6.1" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "437d738d3750bed6ca9b8d423ccc7a8eb284f6b1d6d4e225a0e4e6258d864c8d" +checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" dependencies = [ "serde", "static_assertions", @@ -7399,22 +7210,22 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.32" +version = "0.7.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.32" +version = "0.7.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.65", ] [[package]] @@ -7446,6 +7257,12 @@ dependencies = [ "pkg-config", ] +[[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" @@ -7456,14 +7273,22 @@ dependencies = [ ] [[package]] -name = "zvariant" -version = "3.15.2" +name = "zune-jpeg" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eef2be88ba09b358d3b58aca6e41cd853631d44787f319a1383ca83424fb2db" +checksum = "ec866b44a2a1fd6133d363f073ca1b179f438f99e7e5bfb1e33f7181facfe448" dependencies = [ - "byteorder", + "zune-core", +] + +[[package]] +name = "zvariant" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877ef94e5e82b231d2a309c531f191a8152baba8241a7939ee04bd76b0171308" +dependencies = [ + "endi", "enumflags2", - "libc", "serde", "static_assertions", "zvariant_derive", @@ -7471,9 +7296,9 @@ dependencies = [ [[package]] name = "zvariant_derive" -version = "3.15.2" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37c24dc0bed72f5f90d1f8bb5b07228cbf63b3c6e9f82d82559d4bae666e7ed9" +checksum = "b7ca98581cc6a8120789d8f1f0997e9053837d6aa5346cbb43454d7121be6e39" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7484,9 +7309,9 @@ dependencies = [ [[package]] name = "zvariant_utils" -version = "1.0.1" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7234f0d811589db492d16893e3f21e8e2fd282e6d01b0cddee310322062cc200" +checksum = "75fa7291bdd68cd13c4f97cc9d78cbf16d96305856dfc7ac942aeff4c2de7d5a" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index ccc935819..02cf5464f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,8 @@ members = [ "wezterm-gui", "wezterm-mux-server", "wezterm-open-url", - "wezterm-ssh" + "wezterm-ssh", + "wezterm-uds", ] resolver = "2" exclude = [ diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..af01a973f --- /dev/null +++ b/Makefile @@ -0,0 +1,19 @@ +.PHONY: all fmt build check test + +all: build + +test: + cargo nextest run + +check: + cargo check + +build: + cargo build $(BUILD_OPTS) -p wezterm + cargo build $(BUILD_OPTS) -p wezterm-gui + cargo build $(BUILD_OPTS) -p wezterm-mux-server + cargo build $(BUILD_OPTS) -p strip-ansi-escapes + +fmt: + cargo +nightly fmt + diff --git a/async_ossl/Cargo.toml b/async_ossl/Cargo.toml index b52df89c3..bd7d81b07 100644 --- a/async_ossl/Cargo.toml +++ b/async_ossl/Cargo.toml @@ -4,9 +4,13 @@ version = "0.1.0" authors = ["Wez Furlong "] edition = "2018" resolver = "2" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[dependencies] +async-io = "2.3" + [target.'cfg(not(any(windows, target_os="macos")))'.dependencies] openssl = "0.10" diff --git a/async_ossl/src/lib.rs b/async_ossl/src/lib.rs index 6e7ed9930..38a3aa510 100644 --- a/async_ossl/src/lib.rs +++ b/async_ossl/src/lib.rs @@ -11,12 +11,21 @@ pub struct AsyncSslStream { s: SslStream, } +unsafe impl async_io::IoSafe for AsyncSslStream {} + impl AsyncSslStream { pub fn new(s: SslStream) -> Self { Self { s } } } +#[cfg(unix)] +impl std::os::fd::AsFd for AsyncSslStream { + fn as_fd(&self) -> std::os::fd::BorrowedFd { + self.s.get_ref().as_fd() + } +} + #[cfg(unix)] impl std::os::unix::io::AsRawFd for AsyncSslStream { fn as_raw_fd(&self) -> std::os::unix::io::RawFd { @@ -31,6 +40,13 @@ impl std::os::windows::io::AsRawSocket for AsyncSslStream { } } +#[cfg(windows)] +impl std::os::windows::io::AsSocket for AsyncSslStream { + fn as_socket(&self) -> std::os::windows::io::BorrowedSocket { + self.s.get_ref().as_socket() + } +} + impl AsRawDesc for AsyncSslStream {} impl std::io::Read for AsyncSslStream { diff --git a/base91/Cargo.toml b/base91/Cargo.toml index 4f01e2a5a..e3e2a0f03 100644 --- a/base91/Cargo.toml +++ b/base91/Cargo.toml @@ -3,5 +3,6 @@ authors = ["Wez Furlong "] name = "base91" version = "0.1.0" edition = "2018" +publish = false [dependencies] diff --git a/bidi/generate/Cargo.toml b/bidi/generate/Cargo.toml index b5cf44c46..385624483 100644 --- a/bidi/generate/Cargo.toml +++ b/bidi/generate/Cargo.toml @@ -2,6 +2,7 @@ name = "generate-bidi" version = "0.1.0" edition = "2021" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/bintree/Cargo.toml b/bintree/Cargo.toml index 56398023c..b1e37431f 100644 --- a/bintree/Cargo.toml +++ b/bintree/Cargo.toml @@ -3,6 +3,7 @@ name = "bintree" version = "0.1.0" authors = ["Wez Furlong "] edition = "2018" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/ci/generate-docs.py b/ci/generate-docs.py index a30c237ec..c69eb9587 100644 --- a/ci/generate-docs.py +++ b/ci/generate-docs.py @@ -79,6 +79,8 @@ def load_scheme(scheme): "[^a-z0-9_]", "_", scheme["metadata"]["name"].lower().replace("+", "plus") ) + if "ansi" not in scheme["colors"]: + raise Exception(f"scheme {scheme} is missing ansi colors!!?") colors = scheme["colors"]["ansi"] + scheme["colors"]["brights"] data = { diff --git a/ci/generate-workflows.py b/ci/generate-workflows.py index c241b16f0..ffb1a65fb 100755 --- a/ci/generate-workflows.py +++ b/ci/generate-workflows.py @@ -812,6 +812,8 @@ rustup default {toolchain} self.env["MACOSX_DEPLOYMENT_TARGET"] = "10.9" if "alpine" in self.name: self.env["RUSTFLAGS"] = "-C target-feature=-crt-static" + if "win" in self.name: + self.env["RUSTUP_WINDOWS_PATH_ADD_BIN"] = "1" return def prep_environment(self, cache=True): @@ -1003,9 +1005,9 @@ TARGETS = [ Target(name="centos9", container="quay.io/centos/centos:stream9"), Target(name="macos", os="macos-11"), # https://fedoraproject.org/wiki/End_of_life?rd=LifeCycle/EOL - Target(container="fedora:37"), Target(container="fedora:38"), Target(container="fedora:39"), + Target(container="fedora:40"), # Target(container="alpine:3.15"), Target(name="windows", os="windows-latest", rust_target="x86_64-pc-windows-msvc"), ] diff --git a/codec/Cargo.toml b/codec/Cargo.toml index 6ba4a6d80..5472a9a87 100644 --- a/codec/Cargo.toml +++ b/codec/Cargo.toml @@ -3,6 +3,7 @@ name = "codec" version = "0.1.0" authors = ["Wez Furlong "] edition = "2018" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -11,12 +12,12 @@ anyhow = "1.0" config = { path = "../config" } leb128 = "0.2" log = "0.4" -metrics = { version="0.17", features=["std"]} +metrics = "0.22" mux = { path = "../mux" } portable-pty = { path = "../pty", features = ["serde_support"]} rangeset = { path = "../rangeset" } serde = {version="1.0", features = ["rc", "derive"]} -smol = "1.2" +smol = "2.0" termwiz = { path = "../termwiz" } thiserror = "1.0" varbincode = "0.1" diff --git a/codec/src/lib.rs b/codec/src/lib.rs index f8d2f1362..1f200d877 100644 --- a/codec/src/lib.rs +++ b/codec/src/lib.rs @@ -37,8 +37,8 @@ use wezterm_term::color::ColorPalette; use wezterm_term::{Alert, ClipboardSelection, StableRowIndex, TerminalSize}; #[derive(Error, Debug)] -#[error("Corrupt Response")] -pub struct CorruptResponse; +#[error("Corrupt Response: {0}")] +pub struct CorruptResponse(String); /// Returns the encoded length of the leb128 representation of value fn encoded_length(value: u64) -> usize { @@ -81,9 +81,9 @@ fn encode_raw_as_vec( buffer.extend_from_slice(data); if is_compressed { - metrics::histogram!("pdu.encode.compressed.size", buffer.len() as f64); + metrics::histogram!("pdu.encode.compressed.size").record(buffer.len() as f64); } else { - metrics::histogram!("pdu.encode.size", buffer.len() as f64); + metrics::histogram!("pdu.encode.size").record(buffer.len() as f64); } Ok(buffer) @@ -173,44 +173,54 @@ async fn decode_raw_async( r: &mut R, max_serial: Option, ) -> anyhow::Result { - let len = read_u64_async(r).await.context("reading PDU length")?; + let len = read_u64_async(r) + .await + .context("decode_raw_async failed to read PDU length")?; let (len, is_compressed) = if (len & COMPRESSED_MASK) != 0 { (len & !COMPRESSED_MASK, true) } else { (len, false) }; - let serial = read_u64_async(r).await.context("reading PDU serial")?; + let serial = read_u64_async(r) + .await + .context("decode_raw_async failed to read PDU serial")?; if let Some(max_serial) = max_serial { if serial > max_serial && max_serial > 0 { - return Err(CorruptResponse).context("decode_raw"); + return Err(CorruptResponse(format!( + "decode_raw_async: serial {serial} is implausibly large \ + (bigger than {max_serial})" + )) + .into()); } } - let ident = read_u64_async(r).await.context("reading PDU ident")?; + let ident = read_u64_async(r) + .await + .context("decode_raw_async failed to read PDU ident")?; let data_len = match (len as usize).overflowing_sub(encoded_length(ident) + encoded_length(serial)) { (_, true) => { - anyhow::bail!( - "sizes don't make sense: len:{} serial:{} (enc={}) ident:{} (enc={})", - len, - serial, + return Err(CorruptResponse(format!( + "decode_raw_async: sizes don't make sense: \ + len:{len} serial:{serial} (enc={}) ident:{ident} (enc={})", encoded_length(serial), - ident, encoded_length(ident) - ); + )) + .into()); } (data_len, false) => data_len, }; if is_compressed { - metrics::histogram!("pdu.decode.compressed.size", data_len as f64); + metrics::histogram!("pdu.decode.compressed.size").record(data_len as f64); } else { - metrics::histogram!("pdu.decode.size", data_len as f64); + metrics::histogram!("pdu.decode.size").record(data_len as f64); } let mut data = vec![0u8; data_len]; r.read_exact(&mut data).await.with_context(|| { format!( - "reading {} bytes of data for PDU of length {} with serial={} ident={}", + "decode_raw_async failed to read {} bytes of data \ + for PDU of length {} with serial={} ident={}", data_len, len, serial, ident ) })?; @@ -249,9 +259,9 @@ fn decode_raw(mut r: R) -> anyhow::Result { }; if is_compressed { - metrics::histogram!("pdu.decode.compressed.size", data_len as f64); + metrics::histogram!("pdu.decode.compressed.size").record(data_len as f64); } else { - metrics::histogram!("pdu.decode.size", data_len as f64); + metrics::histogram!("pdu.decode.size").record(data_len as f64); } let mut data = vec![0u8; data_len]; @@ -340,8 +350,8 @@ macro_rules! pdu { let (data, is_compressed) = serialize(s)?; let encoded_size = encode_raw($vers, serial, &data, is_compressed, w)?; log::debug!("encode {} size={encoded_size}", stringify!($name)); - metrics::histogram!("pdu.size", encoded_size as f64, "pdu" => stringify!($name)); - metrics::histogram!("pdu.size.rate", encoded_size as f64, "pdu" => stringify!($name)); + metrics::histogram!("pdu.size", "pdu" => stringify!($name)).record(encoded_size as f64); + metrics::histogram!("pdu.size.rate", "pdu" => stringify!($name)).record(encoded_size as f64); Ok(()) } ,)* @@ -356,8 +366,8 @@ macro_rules! pdu { let (data, is_compressed) = serialize(s)?; let encoded_size = encode_raw_async($vers, serial, &data, is_compressed, w).await?; log::debug!("encode_async {} size={encoded_size}", stringify!($name)); - metrics::histogram!("pdu.size", encoded_size as f64, "pdu" => stringify!($name)); - metrics::histogram!("pdu.size.rate", encoded_size as f64, "pdu" => stringify!($name)); + metrics::histogram!("pdu.size", "pdu" => stringify!($name)).record(encoded_size as f64); + metrics::histogram!("pdu.size.rate", "pdu" => stringify!($name)).record(encoded_size as f64); Ok(()) } ,)* @@ -380,8 +390,8 @@ macro_rules! pdu { match decoded.ident { $( $vers => { - metrics::histogram!("pdu.size", decoded.data.len() as f64, "pdu" => stringify!($name)); - metrics::histogram!("pdu.size.rate", decoded.data.len() as f64, "pdu" => stringify!($name)); + metrics::histogram!("pdu.size", "pdu" => stringify!($name)).record(decoded.data.len() as f64); + metrics::histogram!("pdu.size.rate", "pdu" => stringify!($name)).record(decoded.data.len() as f64); Ok(DecodedPdu { serial: decoded.serial, pdu: Pdu::$name(deserialize(decoded.data.as_slice(), decoded.is_compressed)?) @@ -389,8 +399,8 @@ macro_rules! pdu { } ,)* _ => { - metrics::histogram!("pdu.size", decoded.data.len() as f64, "pdu" => "??"); - metrics::histogram!("pdu.size.rate", decoded.data.len() as f64, "pdu" => "??"); + metrics::histogram!("pdu.size", "pdu" => "??").record(decoded.data.len() as f64); + metrics::histogram!("pdu.size.rate", "pdu" => "??").record(decoded.data.len() as f64); Ok(DecodedPdu { serial: decoded.serial, pdu: Pdu::Invalid{ident:decoded.ident} @@ -408,7 +418,7 @@ macro_rules! pdu { match decoded.ident { $( $vers => { - metrics::histogram!("pdu.size", decoded.data.len() as f64, "pdu" => stringify!($name)); + metrics::histogram!("pdu.size", "pdu" => stringify!($name)).record(decoded.data.len() as f64); Ok(DecodedPdu { serial: decoded.serial, pdu: Pdu::$name(deserialize(decoded.data.as_slice(), decoded.is_compressed)?) @@ -416,7 +426,7 @@ macro_rules! pdu { } ,)* _ => { - metrics::histogram!("pdu.size", decoded.data.len() as f64, "pdu" => "??"); + metrics::histogram!("pdu.size", "pdu" => "??").record(decoded.data.len() as f64); Ok(DecodedPdu { serial: decoded.serial, pdu: Pdu::Invalid{ident:decoded.ident} @@ -431,7 +441,7 @@ macro_rules! pdu { /// The overall version of the codec. /// This must be bumped when backwards incompatible changes /// are made to the types and protocol. -pub const CODEC_VERSION: usize = 42; +pub const CODEC_VERSION: usize = 43; // Defines the Pdu enum. // Each struct has an explicit identifying number. @@ -823,6 +833,7 @@ pub struct WindowWorkspaceChanged { #[derive(Deserialize, Serialize, PartialEq, Debug)] pub struct SetClientId { pub client_id: ClientId, + pub is_proxy: bool, } #[derive(Deserialize, Serialize, PartialEq, Debug)] diff --git a/config/Cargo.toml b/config/Cargo.toml index 580920b9a..4328da90d 100644 --- a/config/Cargo.toml +++ b/config/Cargo.toml @@ -3,6 +3,7 @@ name = "config" version = "0.1.0" authors = ["Wez Furlong "] edition = "2018" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -18,7 +19,7 @@ bitflags = "1.3" colorgrad = "0.6" dirs-next = "2.0" enum-display-derive = "0.1" -hostname = "0.3" +hostname = "0.4" lazy_static = "1.4" libc = "0.2" log = "0.4" @@ -33,7 +34,7 @@ promise = { path = "../promise" } serde = {version="1.0", features = ["rc", "derive"]} serde_json = "1.0" shlex = "1.1" -smol = "1.2" +smol = "2.0" termwiz = { path = "../termwiz", features=["use_serde"] } toml = "0.8" umask = { path = "../umask" } @@ -45,7 +46,7 @@ wezterm-ssh = { path = "../wezterm-ssh" } wezterm-term = { path = "../term", features=["use_serde"] } [target."cfg(unix)".dependencies] -nix = "0.26" +nix = {version="0.28", features=["resource"]} [target."cfg(windows)".dependencies] winapi = { version = "0.3", features = ["winuser"]} diff --git a/config/src/color.rs b/config/src/color.rs index 306b88db8..ad16cf1cc 100644 --- a/config/src/color.rs +++ b/config/src/color.rs @@ -728,8 +728,15 @@ fn dynamic_to_toml(value: Value) -> anyhow::Result { impl ColorSchemeFile { pub fn from_toml_value(value: &toml::Value) -> anyhow::Result { - Self::from_dynamic(&crate::toml_to_dynamic(value), Default::default()) - .map_err(|e| anyhow::anyhow!("{}", e)) + let scheme = Self::from_dynamic(&crate::toml_to_dynamic(value), Default::default()) + .map_err(|e| anyhow::anyhow!("{}", e))?; + + anyhow::ensure!( + scheme.colors.ansi.is_some(), + "scheme is missing ANSI colors" + ); + + Ok(scheme) } pub fn from_toml_str(s: &str) -> anyhow::Result { diff --git a/config/src/config.rs b/config/src/config.rs index 8f52b91e5..5b099edc7 100644 --- a/config/src/config.rs +++ b/config/src/config.rs @@ -377,6 +377,12 @@ pub struct Config { #[dynamic(default = "default_mux_output_parser_buffer_size")] pub mux_output_parser_buffer_size: usize, + #[dynamic(default = "default_true")] + pub mux_enable_ssh_agent: bool, + + #[dynamic(default)] + pub default_ssh_auth_sock: Option, + /// How many ms to delay after reading a chunk of output /// in order to try to coalesce fragmented writes into /// a single bigger chunk of output and reduce the chances @@ -1729,10 +1735,17 @@ fn default_max_fps() -> u8 { } fn default_tiling_desktop_environments() -> Vec { - ["X11 LG3D", "X11 bspwm", "X11 i3", "X11 dwm", "X11 awesome"] - .iter() - .map(|s| s.to_string()) - .collect() + [ + "X11 LG3D", + "X11 Qtile", + "X11 awesome", + "X11 bspwm", + "X11 dwm", + "X11 i3", + ] + .iter() + .map(|s| s.to_string()) + .collect() } fn default_stateless_process_list() -> Vec { diff --git a/config/src/scheme_data.rs b/config/src/scheme_data.rs index c40326b49..d6e3df9c9 100644 --- a/config/src/scheme_data.rs +++ b/config/src/scheme_data.rs @@ -1,6 +1,6 @@ //! This file was generated by sync-color-schemes -pub const SCHEMES: [(&'static str, &'static str); 966] = [ +pub const SCHEMES: [(&'static str, &'static str); 993] = [ // Start here ("3024 (base16)", "[colors]\nansi = [\n \"#090300\",\n \"#db2d20\",\n \"#01a252\",\n \"#fded02\",\n \"#01a0e4\",\n \"#a16a94\",\n \"#b5e4f4\",\n \"#a5a2a2\",\n]\nbackground = \"#090300\"\nbrights = [\n \"#5c5855\",\n \"#db2d20\",\n \"#01a252\",\n \"#fded02\",\n \"#01a0e4\",\n \"#a16a94\",\n \"#b5e4f4\",\n \"#f7f7f7\",\n]\ncursor_bg = \"#a5a2a2\"\ncursor_border = \"#a5a2a2\"\ncursor_fg = \"#090300\"\nforeground = \"#a5a2a2\"\nselection_bg = \"#a5a2a2\"\nselection_fg = \"#090300\"\n\n[colors.indexed]\n16 = \"#e8bbd0\"\n17 = \"#cdab53\"\n18 = \"#3a3432\"\n19 = \"#4a4543\"\n20 = \"#807d7c\"\n21 = \"#d6d5d4\"\n\n[metadata]\naliases = [\"3024 (dark) (terminal.sexy)\"]\nauthor = \"Jan T. Sott (http://github.com/idleberg)\"\nname = \"3024 (base16)\"\norigin_url = \"https://github.com/chriskempson/base16-unclaimed-schemes\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), @@ -10,7 +10,7 @@ pub const SCHEMES: [(&'static str, &'static str); 966] = [ ("3024 Day (Gogh)", "[colors]\nansi = [\n \"#090300\",\n \"#db2d20\",\n \"#01a252\",\n \"#fded02\",\n \"#01a0e4\",\n \"#a16a94\",\n \"#b5e4f4\",\n \"#a5a2a2\",\n]\nbackground = \"#f7f7f7\"\nbrights = [\n \"#5c5855\",\n \"#e8bbd0\",\n \"#3a3432\",\n \"#4a4543\",\n \"#807d7c\",\n \"#d6d5d4\",\n \"#cdab53\",\n \"#f7f7f7\",\n]\ncursor_bg = \"#4a4543\"\ncursor_border = \"#4a4543\"\ncursor_fg = \"#f7f7f7\"\nforeground = \"#4a4543\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"3024 Day (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), ("3024 Night", "[colors]\nansi = [\n \"#090300\",\n \"#db2d20\",\n \"#01a252\",\n \"#fded02\",\n \"#01a0e4\",\n \"#a16a94\",\n \"#b5e4f4\",\n \"#a5a2a2\",\n]\nbackground = \"#090300\"\nbrights = [\n \"#5c5855\",\n \"#e8bbd0\",\n \"#3a3432\",\n \"#4a4543\",\n \"#807d7c\",\n \"#d6d5d4\",\n \"#cdab53\",\n \"#f7f7f7\",\n]\ncursor_bg = \"#a5a2a2\"\ncursor_border = \"#a5a2a2\"\ncursor_fg = \"#090300\"\nforeground = \"#a5a2a2\"\nselection_bg = \"#4a4543\"\nselection_fg = \"#a5a2a2\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\n \"3024 Night (Gogh)\",\n \"3024Night (Gogh)\",\n]\nauthor = \"Jan T. Sott (http://github.com/idleberg)\"\nname = \"3024 Night\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("3024 Night (Gogh)", "[colors]\nansi = [\n \"#090300\",\n \"#db2d20\",\n \"#01a252\",\n \"#fded02\",\n \"#01a0e4\",\n \"#a16a94\",\n \"#b5e4f4\",\n \"#a5a2a2\",\n]\nbackground = \"#090300\"\nbrights = [\n \"#5c5855\",\n \"#e8bbd0\",\n \"#3a3432\",\n \"#4a4543\",\n \"#807d7c\",\n \"#d6d5d4\",\n \"#cdab53\",\n \"#f7f7f7\",\n]\ncursor_bg = \"#a5a2a2\"\ncursor_border = \"#a5a2a2\"\ncursor_fg = \"#090300\"\nforeground = \"#a5a2a2\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"3024 Night (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), -("Aardvark Blue", "[colors]\nansi = [\n \"#191919\",\n \"#aa342e\",\n \"#4b8c0f\",\n \"#dbba00\",\n \"#1370d3\",\n \"#c43ac3\",\n \"#008eb0\",\n \"#bebebe\",\n]\nbackground = \"#102040\"\nbrights = [\n \"#454545\",\n \"#f05b50\",\n \"#95dc55\",\n \"#ffe763\",\n \"#60a4ec\",\n \"#e26be2\",\n \"#60b6cb\",\n \"#f7f7f7\",\n]\ncursor_bg = \"#007acc\"\ncursor_border = \"#007acc\"\ncursor_fg = \"#bfdbfe\"\nforeground = \"#dddddd\"\nselection_bg = \"#bfdbfe\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Aardvark Blue\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"nightly builds only\"\n"), +("Aardvark Blue", "[colors]\nansi = [\n \"#191919\",\n \"#aa342e\",\n \"#4b8c0f\",\n \"#dbba00\",\n \"#1370d3\",\n \"#c43ac3\",\n \"#008eb0\",\n \"#bebebe\",\n]\nbackground = \"#102040\"\nbrights = [\n \"#454545\",\n \"#f05b50\",\n \"#95dc55\",\n \"#ffe763\",\n \"#60a4ec\",\n \"#e26be2\",\n \"#60b6cb\",\n \"#f7f7f7\",\n]\ncursor_bg = \"#007acc\"\ncursor_border = \"#007acc\"\ncursor_fg = \"#bfdbfe\"\nforeground = \"#dddddd\"\nselection_bg = \"#bfdbfe\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Aardvark Blue\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), ("Abernathy", "[colors]\nansi = [\n \"#000000\",\n \"#cd0000\",\n \"#00cd00\",\n \"#cdcd00\",\n \"#1093f5\",\n \"#cd00cd\",\n \"#00cdcd\",\n \"#faebd7\",\n]\nbackground = \"#111416\"\nbrights = [\n \"#404040\",\n \"#ff0000\",\n \"#00ff00\",\n \"#ffff00\",\n \"#11b5f6\",\n \"#ff00ff\",\n \"#00ffff\",\n \"#ffffff\",\n]\ncursor_bg = \"#bbbbbb\"\ncursor_border = \"#bbbbbb\"\ncursor_fg = \"#ffffff\"\nforeground = \"#eeeeec\"\nselection_bg = \"#eeeeec\"\nselection_fg = \"#333333\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Abernathy\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Aci (Gogh)", "[colors]\nansi = [\n \"#363636\",\n \"#ff0883\",\n \"#83ff08\",\n \"#ff8308\",\n \"#0883ff\",\n \"#8308ff\",\n \"#08ff83\",\n \"#b6b6b6\",\n]\nbackground = \"#0d1926\"\nbrights = [\n \"#424242\",\n \"#ff1e8e\",\n \"#8eff1e\",\n \"#ff8e1e\",\n \"#1e8eff\",\n \"#8e1eff\",\n \"#1eff8e\",\n \"#c2c2c2\",\n]\ncursor_bg = \"#b4e1fd\"\ncursor_border = \"#b4e1fd\"\ncursor_fg = \"#0d1926\"\nforeground = \"#b4e1fd\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Aci (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Aco (Gogh)", "[colors]\nansi = [\n \"#3f3f3f\",\n \"#ff0883\",\n \"#83ff08\",\n \"#ff8308\",\n \"#0883ff\",\n \"#8308ff\",\n \"#08ff83\",\n \"#bebebe\",\n]\nbackground = \"#1f1305\"\nbrights = [\n \"#474747\",\n \"#ff1e8e\",\n \"#8eff1e\",\n \"#ff8e1e\",\n \"#1e8eff\",\n \"#8e1eff\",\n \"#1eff8e\",\n \"#c4c4c4\",\n]\ncursor_bg = \"#b4e1fd\"\ncursor_border = \"#b4e1fd\"\ncursor_fg = \"#1f1305\"\nforeground = \"#b4e1fd\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Aco (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), @@ -21,13 +21,12 @@ pub const SCHEMES: [(&'static str, &'static str); 966] = [ ("Afterglow (Gogh)", "[colors]\nansi = [\n \"#151515\",\n \"#a53c23\",\n \"#7b9246\",\n \"#d3a04d\",\n \"#6c99bb\",\n \"#9f4e85\",\n \"#7dd6cf\",\n \"#d0d0d0\",\n]\nbackground = \"#222222\"\nbrights = [\n \"#505050\",\n \"#a53c23\",\n \"#7b9246\",\n \"#d3a04d\",\n \"#547c99\",\n \"#9f4e85\",\n \"#7dd6cf\",\n \"#f5f5f5\",\n]\ncursor_bg = \"#d0d0d0\"\ncursor_border = \"#d0d0d0\"\ncursor_fg = \"#222222\"\nforeground = \"#d0d0d0\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Afterglow (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("aikofog (terminal.sexy)", "[colors]\nansi = [\n \"#757475\",\n \"#936a6f\",\n \"#668462\",\n \"#7f7b62\",\n \"#6e7291\",\n \"#846887\",\n \"#637e7b\",\n \"#9a9a9a\",\n]\nbackground = \"#f1eee9\"\nbrights = [\n \"#4a4a4a\",\n \"#d76572\",\n \"#4fae42\",\n \"#a8981f\",\n \"#7782cf\",\n \"#b754c4\",\n \"#2ea89a\",\n \"#c4c4c4\",\n]\nforeground = \"#b2b3b8\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"Gutterslob\"\nname = \"aikofog (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Alabaster", "[colors]\nansi = [\n \"#000000\",\n \"#aa3731\",\n \"#448c27\",\n \"#cb9000\",\n \"#325cc0\",\n \"#7a3e9d\",\n \"#0083b2\",\n \"#f7f7f7\",\n]\nbackground = \"#f7f7f7\"\nbrights = [\n \"#777777\",\n \"#f05050\",\n \"#60cb00\",\n \"#ffbc5d\",\n \"#007acc\",\n \"#e64ce6\",\n \"#00aacb\",\n \"#f7f7f7\",\n]\ncursor_bg = \"#007acc\"\ncursor_border = \"#007acc\"\ncursor_fg = \"#bfdbfe\"\nforeground = \"#000000\"\nselection_bg = \"#bfdbfe\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Alabaster\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), -("alacritty", "[colors.indexed]\n\n[metadata]\naliases = [\n \"tokyonight_day\",\n \"tokyonight_moon\",\n \"tokyonight_night\",\n \"tokyonight_storm\",\n]\nname = \"alacritty\"\norigin_url = \"https://github.com/EdenEast/nightfox.nvim\"\nwezterm_version = \"nightly builds only\"\n"), ("Alien Blood (Gogh)", "[colors]\nansi = [\n \"#112616\",\n \"#7f2b27\",\n \"#2f7e25\",\n \"#717f24\",\n \"#2f6a7f\",\n \"#47587f\",\n \"#327f77\",\n \"#647d75\",\n]\nbackground = \"#0f1610\"\nbrights = [\n \"#3c4812\",\n \"#e08009\",\n \"#18e000\",\n \"#bde000\",\n \"#00aae0\",\n \"#0058e0\",\n \"#00e0c4\",\n \"#73fa91\",\n]\ncursor_bg = \"#637d75\"\ncursor_border = \"#637d75\"\ncursor_fg = \"#0f1610\"\nforeground = \"#637d75\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Alien Blood (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), ("AlienBlood", "[colors]\nansi = [\n \"#112616\",\n \"#7f2b27\",\n \"#2f7e25\",\n \"#717f24\",\n \"#2f6a7f\",\n \"#47587f\",\n \"#327f77\",\n \"#647d75\",\n]\nbackground = \"#0f1610\"\nbrights = [\n \"#3c4812\",\n \"#e08009\",\n \"#18e000\",\n \"#bde000\",\n \"#00aae0\",\n \"#0058e0\",\n \"#00e0c4\",\n \"#73fa91\",\n]\ncursor_bg = \"#73fa91\"\ncursor_border = \"#73fa91\"\ncursor_fg = \"#0f1610\"\nforeground = \"#637d75\"\nselection_bg = \"#1d4125\"\nselection_fg = \"#73fa91\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"Alien Blood (Gogh)\"]\nname = \"AlienBlood\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Andromeda", "[colors]\nansi = [\n \"#000000\",\n \"#cd3131\",\n \"#05bc79\",\n \"#e5e512\",\n \"#2472c8\",\n \"#bc3fbc\",\n \"#0fa8cd\",\n \"#e5e5e5\",\n]\nbackground = \"#262a33\"\nbrights = [\n \"#666666\",\n \"#cd3131\",\n \"#05bc79\",\n \"#e5e512\",\n \"#2472c8\",\n \"#bc3fbc\",\n \"#0fa8cd\",\n \"#e5e5e5\",\n]\ncursor_bg = \"#f8f8f0\"\ncursor_border = \"#f8f8f0\"\ncursor_fg = \"#cfcfc2\"\nforeground = \"#e5e5e5\"\nselection_bg = \"#5a5c62\"\nselection_fg = \"#ece7e7\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Andromeda\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Apathy (base16)", "[colors]\nansi = [\n \"#031a16\",\n \"#3e9688\",\n \"#883e96\",\n \"#3e4c96\",\n \"#96883e\",\n \"#4c963e\",\n \"#963e4c\",\n \"#81b5ac\",\n]\nbackground = \"#031a16\"\nbrights = [\n \"#2b685e\",\n \"#3e9688\",\n \"#883e96\",\n \"#3e4c96\",\n \"#96883e\",\n \"#4c963e\",\n \"#963e4c\",\n \"#d2e7e4\",\n]\ncursor_bg = \"#81b5ac\"\ncursor_border = \"#81b5ac\"\ncursor_fg = \"#031a16\"\nforeground = \"#81b5ac\"\nselection_bg = \"#81b5ac\"\nselection_fg = \"#031a16\"\n\n[colors.indexed]\n16 = \"#3e7996\"\n17 = \"#3e965b\"\n18 = \"#0b342d\"\n19 = \"#184e45\"\n20 = \"#5f9c92\"\n21 = \"#a7cec8\"\n\n[metadata]\naliases = []\nauthor = \"Jannik Siebert (https://github.com/janniks)\"\nname = \"Apathy (base16)\"\norigin_url = \"https://github.com/chriskempson/base16-unclaimed-schemes\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Apple Classic", "[colors]\nansi = [\n \"#000000\",\n \"#c91b00\",\n \"#00c200\",\n \"#c7c400\",\n \"#0225c7\",\n \"#ca30c7\",\n \"#00c5c7\",\n \"#c7c7c7\",\n]\nbackground = \"#2c2b2b\"\nbrights = [\n \"#686868\",\n \"#ff6e67\",\n \"#5ffa68\",\n \"#fffc67\",\n \"#6871ff\",\n \"#ff77ff\",\n \"#60fdff\",\n \"#ffffff\",\n]\ncursor_bg = \"#c7c7c7\"\ncursor_border = \"#c7c7c7\"\ncursor_fg = \"#ffffff\"\nforeground = \"#d5a200\"\nselection_bg = \"#6b5b02\"\nselection_fg = \"#67e000\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Apple Classic\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"20230320-124340-559cb7b0\"\n"), -("Apple System Colors", "[colors]\nansi = [\n \"#1a1a1a\",\n \"#cc372e\",\n \"#26a439\",\n \"#cdac08\",\n \"#0869cb\",\n \"#9647bf\",\n \"#479ec2\",\n \"#98989d\",\n]\nbackground = \"#1e1e1e\"\nbrights = [\n \"#464646\",\n \"#ff453a\",\n \"#32d74b\",\n \"#ffd60a\",\n \"#0a84ff\",\n \"#bf5af2\",\n \"#76d6ff\",\n \"#ffffff\",\n]\ncursor_bg = \"#98989d\"\ncursor_border = \"#98989d\"\ncursor_fg = \"#ffffff\"\nforeground = \"#ffffff\"\nselection_bg = \"#3f638b\"\nselection_fg = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Apple System Colors\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"nightly builds only\"\n"), +("Apple System Colors", "[colors]\nansi = [\n \"#1a1a1a\",\n \"#cc372e\",\n \"#26a439\",\n \"#cdac08\",\n \"#0869cb\",\n \"#9647bf\",\n \"#479ec2\",\n \"#98989d\",\n]\nbackground = \"#1e1e1e\"\nbrights = [\n \"#464646\",\n \"#ff453a\",\n \"#32d74b\",\n \"#ffd60a\",\n \"#0a84ff\",\n \"#bf5af2\",\n \"#76d6ff\",\n \"#ffffff\",\n]\ncursor_bg = \"#98989d\"\ncursor_border = \"#98989d\"\ncursor_fg = \"#ffffff\"\nforeground = \"#ffffff\"\nselection_bg = \"#3f638b\"\nselection_fg = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Apple System Colors\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), ("Apprentice (base16)", "[colors]\nansi = [\n \"#262626\",\n \"#444444\",\n \"#ffffaf\",\n \"#87af87\",\n \"#8787af\",\n \"#5fafaf\",\n \"#87afd7\",\n \"#5f5f87\",\n]\nbackground = \"#262626\"\nbrights = [\n \"#87875f\",\n \"#444444\",\n \"#ffffaf\",\n \"#87af87\",\n \"#8787af\",\n \"#5fafaf\",\n \"#87afd7\",\n \"#6c6c6c\",\n]\ncursor_bg = \"#5f5f87\"\ncursor_border = \"#5f5f87\"\ncursor_fg = \"#262626\"\nforeground = \"#5f5f87\"\nselection_bg = \"#5f5f87\"\nselection_fg = \"#262626\"\n\n[colors.indexed]\n16 = \"#ff8700\"\n17 = \"#bcbcbc\"\n18 = \"#af5f5f\"\n19 = \"#5f875f\"\n20 = \"#5f87af\"\n21 = \"#5f8787\"\n\n[metadata]\naliases = []\nauthor = \"romainl\"\nname = \"Apprentice (base16)\"\norigin_url = \"https://github.com/casonadams/base16-apprentice-scheme\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Apprentice (Gogh)", "[colors]\nansi = [\n \"#1c1c1c\",\n \"#af5f5f\",\n \"#5f875f\",\n \"#87875f\",\n \"#5f87af\",\n \"#5f5f87\",\n \"#5f8787\",\n \"#6c6c6c\",\n]\nbackground = \"#262626\"\nbrights = [\n \"#444444\",\n \"#ff8700\",\n \"#87af87\",\n \"#ffffaf\",\n \"#8fafd7\",\n \"#8787af\",\n \"#5fafaf\",\n \"#ffffff\",\n]\ncursor_bg = \"#bcbcbc\"\ncursor_border = \"#bcbcbc\"\ncursor_fg = \"#262626\"\nforeground = \"#bcbcbc\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Apprentice (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), ("arcoiris", "[colors]\nansi = [\n \"#333333\",\n \"#da2700\",\n \"#12c258\",\n \"#ffc656\",\n \"#518bfc\",\n \"#e37bd9\",\n \"#63fad5\",\n \"#bab2b2\",\n]\nbackground = \"#201f1e\"\nbrights = [\n \"#777777\",\n \"#ffb9b9\",\n \"#e3f6aa\",\n \"#ffddaa\",\n \"#b3e8f3\",\n \"#cbbaf9\",\n \"#bcffc7\",\n \"#efefef\",\n]\ncursor_bg = \"#7a1c1c\"\ncursor_border = \"#7a1c1c\"\ncursor_fg = \"#fffbf2\"\nforeground = \"#eee4d9\"\nselection_bg = \"#25524a\"\nselection_fg = \"#f3fffd\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"arcoiris\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), @@ -70,7 +69,7 @@ pub const SCHEMES: [(&'static str, &'static str); 966] = [ ("Atelierseaside (dark) (terminal.sexy)", "[colors]\nansi = [\n \"#131513\",\n \"#e6193c\",\n \"#29a329\",\n \"#c3c322\",\n \"#3d62f5\",\n \"#ad2bee\",\n \"#1999b3\",\n \"#8ca68c\",\n]\nbackground = \"#131513\"\nbrights = [\n \"#687d68\",\n \"#e6193c\",\n \"#29a329\",\n \"#c3c322\",\n \"#3d62f5\",\n \"#ad2bee\",\n \"#1999b3\",\n \"#f0fff0\",\n]\nforeground = \"#8ca68c\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"Chris Kempson\"\nname = \"Atelierseaside (dark) (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Atelierseaside (light) (terminal.sexy)", "[colors]\nansi = [\n \"#131513\",\n \"#e6193c\",\n \"#29a329\",\n \"#c3c322\",\n \"#3d62f5\",\n \"#ad2bee\",\n \"#1999b3\",\n \"#8ca68c\",\n]\nbackground = \"#f0fff0\"\nbrights = [\n \"#687d68\",\n \"#e6193c\",\n \"#29a329\",\n \"#c3c322\",\n \"#3d62f5\",\n \"#ad2bee\",\n \"#1999b3\",\n \"#f0fff0\",\n]\nforeground = \"#5e6e5e\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"Chris Kempson\"\nname = \"Atelierseaside (light) (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("AtelierSulphurpool", "[colors]\nansi = [\n \"#202746\",\n \"#c94922\",\n \"#ac9739\",\n \"#c08b30\",\n \"#3d8fd1\",\n \"#6679cc\",\n \"#22a2c9\",\n \"#979db4\",\n]\nbackground = \"#202746\"\nbrights = [\n \"#6b7394\",\n \"#c76b29\",\n \"#293256\",\n \"#5e6687\",\n \"#898ea4\",\n \"#dfe2f1\",\n \"#9c637a\",\n \"#f5f7ff\",\n]\ncursor_bg = \"#979db4\"\ncursor_border = \"#979db4\"\ncursor_fg = \"#202746\"\nforeground = \"#979db4\"\nselection_bg = \"#5e6687\"\nselection_fg = \"#979db4\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"AtelierSulphurpool\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), -("Atlas (base16)", "[colors]\nansi = [\n \"#002635\",\n \"#ff5a67\",\n \"#7fc06e\",\n \"#ffcc1b\",\n \"#5dd7b9\",\n \"#9a70a4\",\n \"#14747e\",\n \"#a1a19a\",\n]\nbackground = \"#002635\"\nbrights = [\n \"#6c8b91\",\n \"#ff5a67\",\n \"#7fc06e\",\n \"#ffcc1b\",\n \"#5dd7b9\",\n \"#9a70a4\",\n \"#14747e\",\n \"#fafaf8\",\n]\ncursor_bg = \"#a1a19a\"\ncursor_border = \"#a1a19a\"\ncursor_fg = \"#002635\"\nforeground = \"#a1a19a\"\nselection_bg = \"#a1a19a\"\nselection_fg = \"#002635\"\n\n[colors.indexed]\n16 = \"#f08e48\"\n17 = \"#c43060\"\n18 = \"#00384d\"\n19 = \"#517f8d\"\n20 = \"#869696\"\n21 = \"#e6e6dc\"\n\n[metadata]\naliases = []\nauthor = \"Alex Lende (https://ajlende.com)\"\nname = \"Atlas (base16)\"\norigin_url = \"https://github.com/ajlende/base16-atlas-scheme\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), +("Atlas (base16)", "[colors]\nansi = [\n \"#002635\",\n \"#ff5a67\",\n \"#7fc06e\",\n \"#ffcc1b\",\n \"#14747e\",\n \"#9a70a4\",\n \"#5dd7b9\",\n \"#a1a19a\",\n]\nbackground = \"#002635\"\nbrights = [\n \"#6c8b91\",\n \"#ff5a67\",\n \"#7fc06e\",\n \"#ffcc1b\",\n \"#14747e\",\n \"#9a70a4\",\n \"#5dd7b9\",\n \"#fafaf8\",\n]\ncursor_bg = \"#a1a19a\"\ncursor_border = \"#a1a19a\"\ncursor_fg = \"#002635\"\nforeground = \"#a1a19a\"\nselection_bg = \"#a1a19a\"\nselection_fg = \"#002635\"\n\n[colors.indexed]\n16 = \"#f08e48\"\n17 = \"#c43060\"\n18 = \"#00384d\"\n19 = \"#517f8d\"\n20 = \"#869696\"\n21 = \"#e6e6dc\"\n\n[metadata]\naliases = []\nauthor = \"Alex Lende (https://ajlende.com)\"\nname = \"Atlas (base16)\"\norigin_url = \"https://github.com/ajlende/base16-atlas-scheme\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Atom", "[colors]\nansi = [\n \"#000000\",\n \"#fd5ff1\",\n \"#87c38a\",\n \"#ffd7b1\",\n \"#85befd\",\n \"#b9b6fc\",\n \"#85befd\",\n \"#e0e0e0\",\n]\nbackground = \"#161719\"\nbrights = [\n \"#000000\",\n \"#fd5ff1\",\n \"#94fa36\",\n \"#f5ffa8\",\n \"#96cbfe\",\n \"#b9b6fc\",\n \"#85befd\",\n \"#e0e0e0\",\n]\ncursor_bg = \"#d0d0d0\"\ncursor_border = \"#d0d0d0\"\ncursor_fg = \"#151515\"\nforeground = \"#c5c8c6\"\nselection_bg = \"#444444\"\nselection_fg = \"#c5c8c6\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"Atom (Gogh)\"]\nname = \"Atom\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Atom (Gogh)", "[colors]\nansi = [\n \"#000000\",\n \"#fd5ff1\",\n \"#87c38a\",\n \"#ffd7b1\",\n \"#85befd\",\n \"#b9b6fc\",\n \"#85befd\",\n \"#e0e0e0\",\n]\nbackground = \"#161719\"\nbrights = [\n \"#000000\",\n \"#fd5ff1\",\n \"#94fa36\",\n \"#f5ffa8\",\n \"#96cbfe\",\n \"#b9b6fc\",\n \"#85befd\",\n \"#e0e0e0\",\n]\ncursor_bg = \"#c5c8c6\"\ncursor_border = \"#c5c8c6\"\ncursor_fg = \"#161719\"\nforeground = \"#c5c8c6\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Atom (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), ("AtomOneLight", "[colors]\nansi = [\n \"#000000\",\n \"#de3e35\",\n \"#3f953a\",\n \"#d2b67c\",\n \"#2f5af3\",\n \"#950095\",\n \"#3f953a\",\n \"#bbbbbb\",\n]\nbackground = \"#f9f9f9\"\nbrights = [\n \"#000000\",\n \"#de3e35\",\n \"#3f953a\",\n \"#d2b67c\",\n \"#2f5af3\",\n \"#a00095\",\n \"#3f953a\",\n \"#ffffff\",\n]\ncursor_bg = \"#bbbbbb\"\ncursor_border = \"#bbbbbb\"\ncursor_fg = \"#ffffff\"\nforeground = \"#2a2c33\"\nselection_bg = \"#ededed\"\nselection_fg = \"#2a2c33\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"AtomOneLight\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), @@ -83,9 +82,9 @@ pub const SCHEMES: [(&'static str, &'static str); 966] = [ ("Ayu Mirage (Gogh)", "[colors]\nansi = [\n \"#1f2430\",\n \"#ff3333\",\n \"#bae67e\",\n \"#ffa759\",\n \"#73d0ff\",\n \"#d4bfff\",\n \"#95e6cb\",\n \"#cbccc6\",\n]\nbackground = \"#1f2430\"\nbrights = [\n \"#707a8c\",\n \"#ff3333\",\n \"#bae67e\",\n \"#ffa759\",\n \"#73d0ff\",\n \"#d4bfff\",\n \"#95e6cb\",\n \"#cbccc6\",\n]\ncursor_bg = \"#ffcc66\"\ncursor_border = \"#ffcc66\"\ncursor_fg = \"#1f2430\"\nforeground = \"#cbccc6\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"AyuMirage (Gogh)\"]\nname = \"Ayu Mirage (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("ayu_light", "[colors]\nansi = [\n \"#000000\",\n \"#ff3333\",\n \"#86b300\",\n \"#f29718\",\n \"#41a6d9\",\n \"#f07178\",\n \"#4dbf99\",\n \"#ffffff\",\n]\nbackground = \"#fafafa\"\nbrights = [\n \"#323232\",\n \"#ff6565\",\n \"#b8e532\",\n \"#ffc94a\",\n \"#73d8ff\",\n \"#ffa3aa\",\n \"#7ff1cb\",\n \"#ffffff\",\n]\ncursor_bg = \"#ff6a00\"\ncursor_border = \"#ff6a00\"\ncursor_fg = \"#5c6773\"\nforeground = \"#5c6773\"\nselection_bg = \"#f0eee4\"\nselection_fg = \"#5c6773\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"ayu_light\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Azu (Gogh)", "[colors]\nansi = [\n \"#000000\",\n \"#ac6d74\",\n \"#74ac6d\",\n \"#aca46d\",\n \"#6d74ac\",\n \"#a46dac\",\n \"#6daca4\",\n \"#e6e6e6\",\n]\nbackground = \"#09111a\"\nbrights = [\n \"#262626\",\n \"#d6b8bc\",\n \"#bcd6b8\",\n \"#d6d3b8\",\n \"#b8bcd6\",\n \"#d3b8d6\",\n \"#b8d6d3\",\n \"#ffffff\",\n]\ncursor_bg = \"#d9e6f2\"\ncursor_border = \"#d9e6f2\"\ncursor_fg = \"#09111a\"\nforeground = \"#d9e6f2\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Azu (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), -("Bamboo", "[colors]\nansi = [\n \"#1c1e1b\",\n \"#e75a7c\",\n \"#8fb573\",\n \"#dbb671\",\n \"#57a5e5\",\n \"#aaaaff\",\n \"#70c2be\",\n \"#f1e9d2\",\n]\nbackground = \"#252623\"\nbrights = [\n \"#5b5e5a\",\n \"#e75a7c\",\n \"#8fb573\",\n \"#dbb671\",\n \"#57a5e5\",\n \"#aaaaff\",\n \"#70c2be\",\n \"#fff8f0\",\n]\ncompose_cursor = \"#ff9966\"\ncursor_bg = \"#fff8f0\"\ncursor_border = \"#fff8f0\"\ncursor_fg = \"#0f0800\"\nforeground = \"#f1e9d2\"\nscrollbar_thumb = \"#1c1e1b\"\nselection_bg = \"#5b5e5a\"\nselection_fg = \"#f1e9d2\"\nsplit = \"#838781\"\nvisual_bell = \"#383b35\"\n\n[colors.indexed]\n\n[colors.tab_bar]\nbackground = \"#1c1e1b\"\ninactive_tab_edge = \"#3a3d37\"\n\n[colors.tab_bar.active_tab]\nbg_color = \"#f1e9d2\"\nfg_color = \"#111210\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.inactive_tab]\nbg_color = \"#3a3d37\"\nfg_color = \"#5b5e5a\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.inactive_tab_hover]\nbg_color = \"#2f312c\"\nfg_color = \"#838781\"\nintensity = \"Normal\"\nitalic = true\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.new_tab]\nbg_color = \"#5b5e5a\"\nfg_color = \"#f1e9d2\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.new_tab_hover]\nbg_color = \"#838781\"\nfg_color = \"#f1e9d2\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[metadata]\naliases = []\nauthor = \"Riley Bruins\"\nname = \"Bamboo\"\norigin_url = \"https://github.com/ribru17/bamboo.nvim\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), -("Bamboo Light", "[colors]\nansi = [\n \"#dadac2\",\n \"#c72a3c\",\n \"#4fa533\",\n \"#bb9651\",\n \"#1765d5\",\n \"#8a4adf\",\n \"#00a2be\",\n \"#3a4238\",\n]\nbackground = \"#fafae0\"\nbrights = [\n \"#c7c7af\",\n \"#c72a3c\",\n \"#4fa533\",\n \"#bb9651\",\n \"#1765d5\",\n \"#8a4adf\",\n \"#00a2be\",\n \"#252623\",\n]\ncompose_cursor = \"#df7946\"\ncursor_bg = \"#0f0800\"\ncursor_border = \"#0f0800\"\ncursor_fg = \"#fff8f0\"\nforeground = \"#3a4238\"\nscrollbar_thumb = \"#c7c7af\"\nselection_bg = \"#a1a7a0\"\nselection_fg = \"#3a4238\"\nsplit = \"#838781\"\nvisual_bell = \"#e4e4cc\"\n\n[colors.indexed]\n\n[colors.tab_bar]\nbackground = \"#e4e4cc\"\ninactive_tab_edge = \"#dadac2\"\n\n[colors.tab_bar.active_tab]\nbg_color = \"#3a4238\"\nfg_color = \"#fafae0\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.inactive_tab]\nbg_color = \"#c7c7af\"\nfg_color = \"#5b5e5a\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.inactive_tab_hover]\nbg_color = \"#838781\"\nfg_color = \"#dadac2\"\nintensity = \"Normal\"\nitalic = true\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.new_tab]\nbg_color = \"#a1a7a0\"\nfg_color = \"#dadac2\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.new_tab_hover]\nbg_color = \"#838781\"\nfg_color = \"#3a4238\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[metadata]\naliases = []\nauthor = \"Riley Bruins\"\nname = \"Bamboo Light\"\norigin_url = \"https://github.com/ribru17/bamboo.nvim\"\nwezterm_version = \"nightly builds only\"\n"), -("Bamboo Multiplex", "[colors]\nansi = [\n \"#171f17\",\n \"#dc4f62\",\n \"#81af58\",\n \"#cebe69\",\n \"#5692c4\",\n \"#ae93e0\",\n \"#71ada2\",\n \"#ece1c0\",\n]\nbackground = \"#232923\"\nbrights = [\n \"#5a5e5a\",\n \"#dc4f62\",\n \"#81af58\",\n \"#cebe69\",\n \"#5692c4\",\n \"#ae93e0\",\n \"#71ada2\",\n \"#fff8f0\",\n]\ncompose_cursor = \"#d99058\"\ncursor_bg = \"#fff8f0\"\ncursor_border = \"#fff8f0\"\ncursor_fg = \"#0f0800\"\nforeground = \"#ece1c0\"\nscrollbar_thumb = \"#171f17\"\nselection_bg = \"#5a5e5a\"\nselection_fg = \"#ece1c0\"\nsplit = \"#818781\"\nvisual_bell = \"#363b35\"\n\n[colors.indexed]\n\n[colors.tab_bar]\nbackground = \"#171f17\"\ninactive_tab_edge = \"#383d37\"\n\n[colors.tab_bar.active_tab]\nbg_color = \"#ece1c0\"\nfg_color = \"#101210\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.inactive_tab]\nbg_color = \"#383d37\"\nfg_color = \"#5a5e5a\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.inactive_tab_hover]\nbg_color = \"#2d312c\"\nfg_color = \"#818781\"\nintensity = \"Normal\"\nitalic = true\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.new_tab]\nbg_color = \"#5a5e5a\"\nfg_color = \"#ece1c0\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.new_tab_hover]\nbg_color = \"#818781\"\nfg_color = \"#ece1c0\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[metadata]\naliases = []\nauthor = \"Riley Bruins\"\nname = \"Bamboo Multiplex\"\norigin_url = \"https://github.com/ribru17/bamboo.nvim\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), +("Bamboo", "[colors]\nansi = [\n \"#1c1e1b\",\n \"#e75a7c\",\n \"#8fb573\",\n \"#dbb651\",\n \"#57a5e5\",\n \"#aaaaff\",\n \"#70c2be\",\n \"#f1e9d2\",\n]\nbackground = \"#252623\"\nbrights = [\n \"#5b5e5a\",\n \"#e75a7c\",\n \"#8fb573\",\n \"#dbb651\",\n \"#57a5e5\",\n \"#aaaaff\",\n \"#70c2be\",\n \"#fff8f0\",\n]\ncompose_cursor = \"#ff9966\"\ncursor_bg = \"#fff8f0\"\ncursor_border = \"#fff8f0\"\ncursor_fg = \"#0f0800\"\nforeground = \"#f1e9d2\"\nscrollbar_thumb = \"#1c1e1b\"\nselection_bg = \"#5b5e5a\"\nselection_fg = \"#f1e9d2\"\nsplit = \"#838781\"\nvisual_bell = \"#383b35\"\n\n[colors.indexed]\n\n[colors.tab_bar]\nbackground = \"#1c1e1b\"\ninactive_tab_edge = \"#3a3d37\"\n\n[colors.tab_bar.active_tab]\nbg_color = \"#f1e9d2\"\nfg_color = \"#111210\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.inactive_tab]\nbg_color = \"#3a3d37\"\nfg_color = \"#5b5e5a\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.inactive_tab_hover]\nbg_color = \"#2f312c\"\nfg_color = \"#838781\"\nintensity = \"Normal\"\nitalic = true\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.new_tab]\nbg_color = \"#5b5e5a\"\nfg_color = \"#f1e9d2\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.new_tab_hover]\nbg_color = \"#838781\"\nfg_color = \"#f1e9d2\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[metadata]\naliases = []\nauthor = \"Riley Bruins\"\nname = \"Bamboo\"\norigin_url = \"https://github.com/ribru17/bamboo.nvim\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), +("Bamboo Light", "[colors]\nansi = [\n \"#dadac2\",\n \"#c72a3c\",\n \"#27850b\",\n \"#a77b00\",\n \"#1745d5\",\n \"#8a4adf\",\n \"#188a9e\",\n \"#3a4238\",\n]\nbackground = \"#fafae0\"\nbrights = [\n \"#c7c7af\",\n \"#c72a3c\",\n \"#27850b\",\n \"#a77b00\",\n \"#1745d5\",\n \"#8a4adf\",\n \"#188a9e\",\n \"#252623\",\n]\ncompose_cursor = \"#df5926\"\ncursor_bg = \"#0f0800\"\ncursor_border = \"#0f0800\"\ncursor_fg = \"#fff8f0\"\nforeground = \"#3a4238\"\nscrollbar_thumb = \"#c7c7af\"\nselection_bg = \"#a1a7a0\"\nselection_fg = \"#3a4238\"\nsplit = \"#838781\"\nvisual_bell = \"#e4e4cc\"\n\n[colors.indexed]\n\n[colors.tab_bar]\nbackground = \"#e4e4cc\"\ninactive_tab_edge = \"#dadac2\"\n\n[colors.tab_bar.active_tab]\nbg_color = \"#3a4238\"\nfg_color = \"#fafae0\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.inactive_tab]\nbg_color = \"#c7c7af\"\nfg_color = \"#5b5e5a\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.inactive_tab_hover]\nbg_color = \"#838781\"\nfg_color = \"#dadac2\"\nintensity = \"Normal\"\nitalic = true\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.new_tab]\nbg_color = \"#a1a7a0\"\nfg_color = \"#dadac2\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.new_tab_hover]\nbg_color = \"#838781\"\nfg_color = \"#3a4238\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[metadata]\naliases = []\nauthor = \"Riley Bruins\"\nname = \"Bamboo Light\"\norigin_url = \"https://github.com/ribru17/bamboo.nvim\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), +("Bamboo Multiplex", "[colors]\nansi = [\n \"#171f17\",\n \"#dc4f62\",\n \"#81af58\",\n \"#ceba49\",\n \"#409cdc\",\n \"#a09af8\",\n \"#68baae\",\n \"#ece1c0\",\n]\nbackground = \"#232923\"\nbrights = [\n \"#5a5e5a\",\n \"#dc4f62\",\n \"#81af58\",\n \"#ceba49\",\n \"#409cdc\",\n \"#a09af8\",\n \"#68baae\",\n \"#fff8f0\",\n]\ncompose_cursor = \"#ef9946\"\ncursor_bg = \"#fff8f0\"\ncursor_border = \"#fff8f0\"\ncursor_fg = \"#0f0800\"\nforeground = \"#ece1c0\"\nscrollbar_thumb = \"#171f17\"\nselection_bg = \"#5a5e5a\"\nselection_fg = \"#ece1c0\"\nsplit = \"#818781\"\nvisual_bell = \"#363b35\"\n\n[colors.indexed]\n\n[colors.tab_bar]\nbackground = \"#171f17\"\ninactive_tab_edge = \"#383d37\"\n\n[colors.tab_bar.active_tab]\nbg_color = \"#ece1c0\"\nfg_color = \"#101210\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.inactive_tab]\nbg_color = \"#383d37\"\nfg_color = \"#5a5e5a\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.inactive_tab_hover]\nbg_color = \"#2d312c\"\nfg_color = \"#818781\"\nintensity = \"Normal\"\nitalic = true\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.new_tab]\nbg_color = \"#5a5e5a\"\nfg_color = \"#ece1c0\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.new_tab_hover]\nbg_color = \"#818781\"\nfg_color = \"#ece1c0\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[metadata]\naliases = []\nauthor = \"Riley Bruins\"\nname = \"Bamboo Multiplex\"\norigin_url = \"https://github.com/ribru17/bamboo.nvim\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), ("Banana Blueberry", "[colors]\nansi = [\n \"#17141f\",\n \"#ff6b7f\",\n \"#00bd9c\",\n \"#e6c62f\",\n \"#22e8df\",\n \"#dc396a\",\n \"#56b6c2\",\n \"#f1f1f1\",\n]\nbackground = \"#191323\"\nbrights = [\n \"#495162\",\n \"#fe9ea1\",\n \"#98c379\",\n \"#f9e46b\",\n \"#91fff4\",\n \"#da70d6\",\n \"#bcf3ff\",\n \"#ffffff\",\n]\ncursor_bg = \"#e07d13\"\ncursor_border = \"#e07d13\"\ncursor_fg = \"#ffffff\"\nforeground = \"#cccccc\"\nselection_bg = \"#220525\"\nselection_fg = \"#f4f4f4\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Banana Blueberry\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Batman", "[colors]\nansi = [\n \"#1b1d1e\",\n \"#e6dc44\",\n \"#c8be46\",\n \"#f4fd22\",\n \"#737174\",\n \"#747271\",\n \"#62605f\",\n \"#c6c5bf\",\n]\nbackground = \"#1b1d1e\"\nbrights = [\n \"#505354\",\n \"#fff78e\",\n \"#fff27d\",\n \"#feed6c\",\n \"#919495\",\n \"#9a9a9d\",\n \"#a3a3a6\",\n \"#dadbd6\",\n]\ncursor_bg = \"#fcef0c\"\ncursor_border = \"#fcef0c\"\ncursor_fg = \"#000000\"\nforeground = \"#6f6f6f\"\nselection_bg = \"#4d504c\"\nselection_fg = \"#f0e04a\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Batman\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Belafonte Day", "[colors]\nansi = [\n \"#20111b\",\n \"#be100e\",\n \"#858162\",\n \"#eaa549\",\n \"#426a79\",\n \"#97522c\",\n \"#989a9c\",\n \"#968c83\",\n]\nbackground = \"#d5ccba\"\nbrights = [\n \"#5e5252\",\n \"#be100e\",\n \"#858162\",\n \"#eaa549\",\n \"#426a79\",\n \"#97522c\",\n \"#989a9c\",\n \"#d5ccba\",\n]\ncursor_bg = \"#45373c\"\ncursor_border = \"#45373c\"\ncursor_fg = \"#d5ccba\"\nforeground = \"#45373c\"\nselection_bg = \"#968c83\"\nselection_fg = \"#45373c\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\n \"Belafonte Day (Gogh)\",\n \"BelafonteDay (Gogh)\",\n]\nauthor = \"Jan T. Sott\"\nname = \"Belafonte Day\"\norigin_url = \"https://github.com/idleberg/Zissou-iTerm2\"\nwezterm_version = \"Always\"\n"), @@ -114,6 +113,7 @@ pub const SCHEMES: [(&'static str, &'static str); 966] = [ ("Blazer", "[colors]\nansi = [\n \"#000000\",\n \"#b87a7a\",\n \"#7ab87a\",\n \"#b8b87a\",\n \"#7a7ab8\",\n \"#b87ab8\",\n \"#7ab8b8\",\n \"#d9d9d9\",\n]\nbackground = \"#0d1926\"\nbrights = [\n \"#262626\",\n \"#dbbdbd\",\n \"#bddbbd\",\n \"#dbdbbd\",\n \"#bdbddb\",\n \"#dbbddb\",\n \"#bddbdb\",\n \"#ffffff\",\n]\ncursor_bg = \"#d9e6f2\"\ncursor_border = \"#d9e6f2\"\ncursor_fg = \"#0d1926\"\nforeground = \"#d9e6f2\"\nselection_bg = \"#c1ddff\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\n \"Blazer (Gogh)\",\n \"Miu (Gogh)\",\n]\nname = \"Blazer\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Blazer (Gogh)", "[colors]\nansi = [\n \"#000000\",\n \"#b87a7a\",\n \"#7ab87a\",\n \"#b8b87a\",\n \"#7a7ab8\",\n \"#b87ab8\",\n \"#7ab8b8\",\n \"#d9d9d9\",\n]\nbackground = \"#0d1926\"\nbrights = [\n \"#262626\",\n \"#dbbdbd\",\n \"#bddbbd\",\n \"#dbdbbd\",\n \"#bdbddb\",\n \"#dbbddb\",\n \"#bddbdb\",\n \"#ffffff\",\n]\ncursor_bg = \"#d9e6f2\"\ncursor_border = \"#d9e6f2\"\ncursor_fg = \"#0d1926\"\nforeground = \"#d9e6f2\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Blazer (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), ("Bleh-1 (terminal.sexy)", "[colors]\nansi = [\n \"#666666\",\n \"#996578\",\n \"#889965\",\n \"#998565\",\n \"#657a99\",\n \"#8b6599\",\n \"#65998d\",\n \"#a5a5a4\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#8c847f\",\n \"#bd4b76\",\n \"#95b548\",\n \"#bd814b\",\n \"#4c83bf\",\n \"#a04bbd\",\n \"#4dbda8\",\n \"#848484\",\n]\nforeground = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"\"\nname = \"Bleh-1 (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), +("Blue Dolphin (Gogh)", "[colors]\nansi = [\n \"#292d3e\",\n \"#ff8288\",\n \"#b4e88d\",\n \"#f4d69f\",\n \"#82aaff\",\n \"#e9c1ff\",\n \"#89ebff\",\n \"#d0d0d0\",\n]\nbackground = \"#006984\"\nbrights = [\n \"#434758\",\n \"#ff8b92\",\n \"#ddffa7\",\n \"#ffe585\",\n \"#9cc4ff\",\n \"#ddb0f6\",\n \"#a3f7ff\",\n \"#ffffff\",\n]\ncursor_bg = \"#ffcc00\"\ncursor_border = \"#ffcc00\"\ncursor_fg = \"#006984\"\nforeground = \"#c5f2ff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Blue Dolphin (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"nightly builds only\"\n"), ("Blue Matrix", "[colors]\nansi = [\n \"#101116\",\n \"#ff5680\",\n \"#00ff9c\",\n \"#fffc58\",\n \"#00b0ff\",\n \"#d57bff\",\n \"#76c1ff\",\n \"#c7c7c7\",\n]\nbackground = \"#101116\"\nbrights = [\n \"#686868\",\n \"#ff6e67\",\n \"#5ffa68\",\n \"#fffc67\",\n \"#6871ff\",\n \"#d682ec\",\n \"#60fdff\",\n \"#ffffff\",\n]\ncursor_bg = \"#76ff9f\"\ncursor_border = \"#76ff9f\"\ncursor_fg = \"#ffffff\"\nforeground = \"#00a2ff\"\nselection_bg = \"#c1deff\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Blue Matrix\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("BlueBerryPie", "[colors]\nansi = [\n \"#0a4c62\",\n \"#99246e\",\n \"#5cb1b3\",\n \"#eab9a8\",\n \"#90a5bd\",\n \"#9d54a7\",\n \"#7e83cc\",\n \"#f0e8d6\",\n]\nbackground = \"#1c0c28\"\nbrights = [\n \"#201637\",\n \"#c87272\",\n \"#0a6c7e\",\n \"#7a3188\",\n \"#39173d\",\n \"#bc94b7\",\n \"#5e6071\",\n \"#0a6c7e\",\n]\ncursor_bg = \"#fcfad6\"\ncursor_border = \"#fcfad6\"\ncursor_fg = \"#000000\"\nforeground = \"#babab9\"\nselection_bg = \"#606060\"\nselection_fg = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"BlueBerryPie\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("BlueDolphin", "[colors]\nansi = [\n \"#292d3e\",\n \"#ff8288\",\n \"#b4e88d\",\n \"#f4d69f\",\n \"#82aaff\",\n \"#e9c1ff\",\n \"#89ebff\",\n \"#d0d0d0\",\n]\nbackground = \"#006984\"\nbrights = [\n \"#434758\",\n \"#ff8b92\",\n \"#ddffa7\",\n \"#ffe585\",\n \"#9cc4ff\",\n \"#ddb0f6\",\n \"#a3f7ff\",\n \"#ffffff\",\n]\ncursor_bg = \"#ffcc00\"\ncursor_border = \"#ffcc00\"\ncursor_fg = \"#292d3e\"\nforeground = \"#c5f2ff\"\nselection_bg = \"#2baeca\"\nselection_fg = \"#eceff1\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"BlueDolphin\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), @@ -148,11 +148,12 @@ pub const SCHEMES: [(&'static str, &'static str); 966] = [ ("Builtin Solarized Light", "[colors]\nansi = [\n \"#073642\",\n \"#dc322f\",\n \"#859900\",\n \"#b58900\",\n \"#268bd2\",\n \"#d33682\",\n \"#2aa198\",\n \"#eee8d5\",\n]\nbackground = \"#fdf6e3\"\nbrights = [\n \"#002b36\",\n \"#cb4b16\",\n \"#586e75\",\n \"#657b83\",\n \"#839496\",\n \"#6c71c4\",\n \"#93a1a1\",\n \"#fdf6e3\",\n]\ncursor_bg = \"#657b83\"\ncursor_border = \"#657b83\"\ncursor_fg = \"#eee8d5\"\nforeground = \"#657b83\"\nselection_bg = \"#eee8d5\"\nselection_fg = \"#586e75\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\n \"Solarized Light (Gogh)\",\n \"SolarizedLight (Gogh)\",\n \"iTerm2 Solarized Light\",\n]\nname = \"Builtin Solarized Light\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Builtin Tango Dark", "[colors]\nansi = [\n \"#000000\",\n \"#cc0000\",\n \"#4e9a06\",\n \"#c4a000\",\n \"#3465a4\",\n \"#75507b\",\n \"#06989a\",\n \"#d3d7cf\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#555753\",\n \"#ef2929\",\n \"#8ae234\",\n \"#fce94f\",\n \"#729fcf\",\n \"#ad7fa8\",\n \"#34e2e2\",\n \"#eeeeec\",\n]\ncursor_bg = \"#ffffff\"\ncursor_border = \"#ffffff\"\ncursor_fg = \"#000000\"\nforeground = \"#ffffff\"\nselection_bg = \"#b5d5ff\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"Gnometerm (terminal.sexy)\"]\nname = \"Builtin Tango Dark\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Builtin Tango Light", "[colors]\nansi = [\n \"#000000\",\n \"#cc0000\",\n \"#4e9a06\",\n \"#c4a000\",\n \"#3465a4\",\n \"#75507b\",\n \"#06989a\",\n \"#d3d7cf\",\n]\nbackground = \"#ffffff\"\nbrights = [\n \"#555753\",\n \"#ef2929\",\n \"#8ae234\",\n \"#fce94f\",\n \"#729fcf\",\n \"#ad7fa8\",\n \"#34e2e2\",\n \"#eeeeec\",\n]\ncursor_bg = \"#000000\"\ncursor_border = \"#000000\"\ncursor_fg = \"#ffffff\"\nforeground = \"#000000\"\nselection_bg = \"#b5d5ff\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Builtin Tango Light\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), +("Butrin (Gogh)", "[colors]\nansi = [\n \"#8c7e78\",\n \"#e68a8a\",\n \"#99cc99\",\n \"#fad7a0\",\n \"#6699cc\",\n \"#c8a2c8\",\n \"#6fc3b2\",\n \"#e2cebe\",\n]\nbackground = \"#4b3b3c\"\nbrights = [\n \"#bfaca4\",\n \"#f2b1b1\",\n \"#b2d8b2\",\n \"#f7dcb4\",\n \"#87cefa\",\n \"#d8bfd8\",\n \"#64dbdb\",\n \"#f2f2f2\",\n]\ncursor_bg = \"#e39d93\"\ncursor_border = \"#e39d93\"\ncursor_fg = \"#4b3b3c\"\nforeground = \"#f2f2f2\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Butrin (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"nightly builds only\"\n"), ("C64", "[colors]\nansi = [\n \"#090300\",\n \"#883932\",\n \"#55a049\",\n \"#bfce72\",\n \"#40318d\",\n \"#8b3f96\",\n \"#67b6bd\",\n \"#ffffff\",\n]\nbackground = \"#40318d\"\nbrights = [\n \"#000000\",\n \"#883932\",\n \"#55a049\",\n \"#bfce72\",\n \"#40318d\",\n \"#8b3f96\",\n \"#67b6bd\",\n \"#f7f7f7\",\n]\ncursor_bg = \"#7869c4\"\ncursor_border = \"#7869c4\"\ncursor_fg = \"#40318d\"\nforeground = \"#7869c4\"\nselection_bg = \"#7869c4\"\nselection_fg = \"#40318d\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"C64 (Gogh)\"]\nauthor = \"Jan T. Sott\"\nname = \"C64\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("C64 (Gogh)", "[colors]\nansi = [\n \"#090300\",\n \"#883932\",\n \"#55a049\",\n \"#bfce72\",\n \"#40318d\",\n \"#8b3f96\",\n \"#67b6bd\",\n \"#ffffff\",\n]\nbackground = \"#40318d\"\nbrights = [\n \"#000000\",\n \"#883932\",\n \"#55a049\",\n \"#bfce72\",\n \"#40318d\",\n \"#8b3f96\",\n \"#67b6bd\",\n \"#f7f7f7\",\n]\ncursor_bg = \"#7869c4\"\ncursor_border = \"#7869c4\"\ncursor_fg = \"#40318d\"\nforeground = \"#7869c4\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"C64 (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), ("Cai (Gogh)", "[colors]\nansi = [\n \"#000000\",\n \"#ca274d\",\n \"#4dca27\",\n \"#caa427\",\n \"#274dca\",\n \"#a427ca\",\n \"#27caa4\",\n \"#808080\",\n]\nbackground = \"#09111a\"\nbrights = [\n \"#808080\",\n \"#e98da3\",\n \"#a3e98d\",\n \"#e9d48d\",\n \"#8da3e9\",\n \"#d48de9\",\n \"#8de9d4\",\n \"#ffffff\",\n]\ncursor_bg = \"#d9e6f2\"\ncursor_border = \"#d9e6f2\"\ncursor_fg = \"#09111a\"\nforeground = \"#d9e6f2\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Cai (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Calamity", "[colors]\nansi = [\n \"#2f2833\",\n \"#fc644d\",\n \"#a5f69c\",\n \"#e9d7a5\",\n \"#3b79c7\",\n \"#f92672\",\n \"#74d3de\",\n \"#d5ced9\",\n]\nbackground = \"#2f2833\"\nbrights = [\n \"#7e6c88\",\n \"#fc644d\",\n \"#a5f69c\",\n \"#e9d7a5\",\n \"#3b79c7\",\n \"#f92672\",\n \"#74d3de\",\n \"#ffffff\",\n]\ncursor_bg = \"#d5ced9\"\ncursor_border = \"#d5ced9\"\ncursor_fg = \"#2f2833\"\nforeground = \"#d5ced9\"\nselection_bg = \"#7e6c88\"\nselection_fg = \"#d5ced9\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Calamity\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), -("Campbell (Gogh)", "[colors]\nansi = [\n \"#0c0c0c\",\n \"#c50f1f\",\n \"#13a10e\",\n \"#c19c00\",\n \"#0037da\",\n \"#881798\",\n \"#3a96dd\",\n \"#cccccc\",\n]\nbackground = \"#0c0c0c\"\nbrights = [\n \"#767676\",\n \"#e74856\",\n \"#16c60c\",\n \"#f9f1a5\",\n \"#3b78ff\",\n \"#b4009e\",\n \"#61d6d6\",\n \"#f2f2f2\",\n]\ncursor_bg = \"#ffffff\"\ncursor_border = \"#ffffff\"\ncursor_fg = \"#0c0c0c\"\nforeground = \"#cccccc\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Campbell (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"nightly builds only\"\n"), +("Campbell (Gogh)", "[colors]\nansi = [\n \"#0c0c0c\",\n \"#c50f1f\",\n \"#13a10e\",\n \"#c19c00\",\n \"#0037da\",\n \"#881798\",\n \"#3a96dd\",\n \"#cccccc\",\n]\nbackground = \"#0c0c0c\"\nbrights = [\n \"#767676\",\n \"#e74856\",\n \"#16c60c\",\n \"#f9f1a5\",\n \"#3b78ff\",\n \"#b4009e\",\n \"#61d6d6\",\n \"#f2f2f2\",\n]\ncursor_bg = \"#ffffff\"\ncursor_border = \"#ffffff\"\ncursor_fg = \"#0c0c0c\"\nforeground = \"#cccccc\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Campbell (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), ("Canvased Pastel (terminal.sexy)", "[colors]\nansi = [\n \"#26251c\",\n \"#323027\",\n \"#3d4339\",\n \"#443b2c\",\n \"#534d35\",\n \"#646756\",\n \"#7b8574\",\n \"#837b61\",\n]\nbackground = \"#170f0d\"\nbrights = [\n \"#999f91\",\n \"#9b9773\",\n \"#b2b08c\",\n \"#c4bb8c\",\n \"#c4b67a\",\n \"#cfc995\",\n \"#d3d4b6\",\n \"#d6d3ac\",\n]\nforeground = \"#746c48\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"dkeg\"\nname = \"Canvased Pastel (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("carbonfox", "[colors]\nansi = [\n \"#282828\",\n \"#ee5396\",\n \"#25be6a\",\n \"#08bdba\",\n \"#78a9ff\",\n \"#be95ff\",\n \"#33b1ff\",\n \"#dfdfe0\",\n]\nbackground = \"#161616\"\nbrights = [\n \"#484848\",\n \"#f16da6\",\n \"#46c880\",\n \"#2dc7c4\",\n \"#8cb6ff\",\n \"#c8a5ff\",\n \"#52bdff\",\n \"#e4e4e5\",\n]\ncompose_cursor = \"#3ddbd9\"\ncursor_bg = \"#f2f4f8\"\ncursor_border = \"#f2f4f8\"\ncursor_fg = \"#161616\"\nforeground = \"#f2f4f8\"\nscrollbar_thumb = \"#7b7c7e\"\nselection_bg = \"#2a2a2a\"\nselection_fg = \"#f2f4f8\"\nsplit = \"#0c0c0c\"\nvisual_bell = \"#f2f4f8\"\n\n[colors.indexed]\n16 = \"#ff7eb6\"\n17 = \"#3ddbd9\"\n\n[colors.tab_bar]\nbackground = \"#0c0c0c\"\ninactive_tab_edge = \"#0c0c0c\"\ninactive_tab_edge_hover = \"#252525\"\n\n[colors.tab_bar.active_tab]\nbg_color = \"#7b7c7e\"\nfg_color = \"#161616\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.inactive_tab]\nbg_color = \"#252525\"\nfg_color = \"#b6b8bb\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.inactive_tab_hover]\nbg_color = \"#353535\"\nfg_color = \"#f2f4f8\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.new_tab]\nbg_color = \"#161616\"\nfg_color = \"#b6b8bb\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.new_tab_hover]\nbg_color = \"#353535\"\nfg_color = \"#f2f4f8\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[metadata]\naliases = []\nauthor = \"EdenEast\"\nname = \"carbonfox\"\norigin_url = \"https://github.com/EdenEast/nightfox.nvim\"\nwezterm_version = \"20220903-194523-3bb1ed61\"\n"), ("Catch Me If You Can (terminal.sexy)", "[colors]\nansi = [\n \"#130f0c\",\n \"#604c38\",\n \"#8d7f85\",\n \"#907256\",\n \"#aa8d70\",\n \"#b9a38d\",\n \"#c4bfbf\",\n \"#c4ae99\",\n]\nbackground = \"#170f0d\"\nbrights = [\n \"#c69f77\",\n \"#cab9a8\",\n \"#d5c6b8\",\n \"#dcd1c7\",\n \"#e0e0e2\",\n \"#e4dad2\",\n \"#eae3dc\",\n \"#f6f2f0\",\n]\nforeground = \"#f9f9f9\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"dkeg\"\nname = \"Catch Me If You Can (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), @@ -206,6 +207,7 @@ pub const SCHEMES: [(&'static str, &'static str); 966] = [ ("CrayonPonyFish", "[colors]\nansi = [\n \"#2b1b1d\",\n \"#91002b\",\n \"#579524\",\n \"#ab311b\",\n \"#8c87b0\",\n \"#692f50\",\n \"#e8a866\",\n \"#68525a\",\n]\nbackground = \"#150707\"\nbrights = [\n \"#3d2b2e\",\n \"#c5255d\",\n \"#8dff57\",\n \"#c8381d\",\n \"#cfc9ff\",\n \"#fc6cba\",\n \"#ffceaf\",\n \"#b0949d\",\n]\ncursor_bg = \"#68525a\"\ncursor_border = \"#68525a\"\ncursor_fg = \"#140707\"\nforeground = \"#68525a\"\nselection_bg = \"#2b1b1d\"\nselection_fg = \"#69525a\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"Crayon Pony Fish (Gogh)\"]\nname = \"CrayonPonyFish\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Cupcake (base16)", "[colors]\nansi = [\n \"#fbf1f2\",\n \"#d57e85\",\n \"#a3b367\",\n \"#dcb16c\",\n \"#7297b9\",\n \"#bb99b4\",\n \"#69a9a7\",\n \"#8b8198\",\n]\nbackground = \"#fbf1f2\"\nbrights = [\n \"#bfb9c6\",\n \"#d57e85\",\n \"#a3b367\",\n \"#dcb16c\",\n \"#7297b9\",\n \"#bb99b4\",\n \"#69a9a7\",\n \"#585062\",\n]\ncursor_bg = \"#8b8198\"\ncursor_border = \"#8b8198\"\ncursor_fg = \"#fbf1f2\"\nforeground = \"#8b8198\"\nselection_bg = \"#8b8198\"\nselection_fg = \"#fbf1f2\"\n\n[colors.indexed]\n16 = \"#ebb790\"\n17 = \"#baa58c\"\n18 = \"#f2f1f4\"\n19 = \"#d8d5dd\"\n20 = \"#a59daf\"\n21 = \"#72677e\"\n\n[metadata]\naliases = []\nauthor = \"Chris Kempson (http://chriskempson.com)\"\nname = \"Cupcake (base16)\"\norigin_url = \"https://github.com/chriskempson/base16-default-schemes\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Cupertino (base16)", "[colors]\nansi = [\n \"#ffffff\",\n \"#c41a15\",\n \"#007400\",\n \"#826b28\",\n \"#0000ff\",\n \"#a90d91\",\n \"#318495\",\n \"#404040\",\n]\nbackground = \"#ffffff\"\nbrights = [\n \"#808080\",\n \"#c41a15\",\n \"#007400\",\n \"#826b28\",\n \"#0000ff\",\n \"#a90d91\",\n \"#318495\",\n \"#5e5e5e\",\n]\ncursor_bg = \"#404040\"\ncursor_border = \"#404040\"\ncursor_fg = \"#ffffff\"\nforeground = \"#404040\"\nselection_bg = \"#404040\"\nselection_fg = \"#ffffff\"\n\n[colors.indexed]\n16 = \"#eb8500\"\n17 = \"#826b28\"\n18 = \"#c0c0c0\"\n19 = \"#c0c0c0\"\n20 = \"#808080\"\n21 = \"#404040\"\n\n[metadata]\naliases = []\nauthor = \"Defman21\"\nname = \"Cupertino (base16)\"\norigin_url = \"https://github.com/Defman21/base16-cupertino\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), +("CutiePro", "[colors]\nansi = [\n \"#000000\",\n \"#f56e7f\",\n \"#bec975\",\n \"#f58669\",\n \"#42d9c5\",\n \"#d286b7\",\n \"#37cb8a\",\n \"#d5c3c3\",\n]\nbackground = \"#181818\"\nbrights = [\n \"#373b41\",\n \"#e5a1a3\",\n \"#e8d6a7\",\n \"#f1bb79\",\n \"#80c5de\",\n \"#b294bb\",\n \"#9dccbb\",\n \"#ffffff\",\n]\ncursor_bg = \"#efc4cd\"\ncursor_border = \"#efc4cd\"\ncursor_fg = \"#181818\"\nforeground = \"#d5d0c9\"\nselection_bg = \"#363636\"\nselection_fg = \"#d5d0c9\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"CutiePro\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"nightly builds only\"\n"), ("Cyberdyne", "[colors]\nansi = [\n \"#080808\",\n \"#ff8373\",\n \"#00c172\",\n \"#d2a700\",\n \"#0071cf\",\n \"#ff90fe\",\n \"#6bffdd\",\n \"#f1f1f1\",\n]\nbackground = \"#151144\"\nbrights = [\n \"#2e2e2e\",\n \"#ffc4be\",\n \"#d6fcba\",\n \"#fffed5\",\n \"#c2e3ff\",\n \"#ffb2fe\",\n \"#e6e7fe\",\n \"#ffffff\",\n]\ncursor_bg = \"#00ff9c\"\ncursor_border = \"#00ff9c\"\ncursor_fg = \"#ffffff\"\nforeground = \"#00ff92\"\nselection_bg = \"#454d96\"\nselection_fg = \"#f4f4f4\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Cyberdyne\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("cyberpunk", "[colors]\nansi = [\n \"#000000\",\n \"#ff7092\",\n \"#00fbac\",\n \"#fffa6a\",\n \"#00bfff\",\n \"#df95ff\",\n \"#86cbfe\",\n \"#ffffff\",\n]\nbackground = \"#332a57\"\nbrights = [\n \"#000000\",\n \"#ff8aa4\",\n \"#21f6bc\",\n \"#fff787\",\n \"#1bccfd\",\n \"#e6aefe\",\n \"#99d6fc\",\n \"#ffffff\",\n]\ncursor_bg = \"#21f6bc\"\ncursor_border = \"#21f6bc\"\ncursor_fg = \"#ffffff\"\nforeground = \"#e6e6e6\"\nselection_bg = \"#c1deff\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"cyberpunk\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("DanQing (base16)", "[colors]\nansi = [\n \"#2d302f\",\n \"#f9906f\",\n \"#8ab361\",\n \"#f0c239\",\n \"#b0a4e3\",\n \"#cca4e3\",\n \"#30dff3\",\n \"#e0f0ef\",\n]\nbackground = \"#2d302f\"\nbrights = [\n \"#9da8a3\",\n \"#f9906f\",\n \"#8ab361\",\n \"#f0c239\",\n \"#b0a4e3\",\n \"#cca4e3\",\n \"#30dff3\",\n \"#fcfefd\",\n]\ncursor_bg = \"#e0f0ef\"\ncursor_border = \"#e0f0ef\"\ncursor_fg = \"#2d302f\"\nforeground = \"#e0f0ef\"\nselection_bg = \"#e0f0ef\"\nselection_fg = \"#2d302f\"\n\n[colors.indexed]\n16 = \"#b38a61\"\n17 = \"#ca6924\"\n18 = \"#434846\"\n19 = \"#5a605d\"\n20 = \"#cad8d2\"\n21 = \"#ecf6f2\"\n\n[metadata]\naliases = []\nauthor = \"Wenhan Zhu (Cosmos) (zhuwenhan950913@gmail.com)\"\nname = \"DanQing (base16)\"\norigin_url = \"https://github.com/CosmosAtlas/base16-danqing-scheme\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), @@ -261,40 +263,43 @@ pub const SCHEMES: [(&'static str, &'static str); 966] = [ ("Earthsong (Gogh)", "[colors]\nansi = [\n \"#121418\",\n \"#c94234\",\n \"#85c54c\",\n \"#f5ae2e\",\n \"#1398b9\",\n \"#d0633d\",\n \"#509552\",\n \"#e5c6aa\",\n]\nbackground = \"#292520\"\nbrights = [\n \"#675f54\",\n \"#ff645a\",\n \"#98e036\",\n \"#e0d561\",\n \"#5fdaff\",\n \"#ff9269\",\n \"#84f088\",\n \"#f6f7ec\",\n]\ncursor_bg = \"#e5c7a9\"\ncursor_border = \"#e5c7a9\"\ncursor_fg = \"#292520\"\nforeground = \"#e5c7a9\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Earthsong (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), ("Edge Dark (base16)", "[colors]\nansi = [\n \"#262729\",\n \"#e77171\",\n \"#a1bf78\",\n \"#dbb774\",\n \"#73b3e7\",\n \"#d390e7\",\n \"#5ebaa5\",\n \"#b7bec9\",\n]\nbackground = \"#262729\"\nbrights = [\n \"#3e4249\",\n \"#e77171\",\n \"#a1bf78\",\n \"#dbb774\",\n \"#73b3e7\",\n \"#d390e7\",\n \"#5ebaa5\",\n \"#3e4249\",\n]\ncursor_bg = \"#b7bec9\"\ncursor_border = \"#b7bec9\"\ncursor_fg = \"#262729\"\nforeground = \"#b7bec9\"\nselection_bg = \"#b7bec9\"\nselection_fg = \"#262729\"\n\n[colors.indexed]\n16 = \"#e77171\"\n17 = \"#5ebaa5\"\n18 = \"#88909f\"\n19 = \"#b7bec9\"\n20 = \"#73b3e7\"\n21 = \"#d390e7\"\n\n[metadata]\naliases = []\nauthor = \"cjayross (https://github.com/cjayross)\"\nname = \"Edge Dark (base16)\"\norigin_url = \"https://github.com/cjayross/base16-edge-schemes\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Edge Light (base16)", "[colors]\nansi = [\n \"#fafafa\",\n \"#db7070\",\n \"#7c9f4b\",\n \"#d69822\",\n \"#6587bf\",\n \"#b870ce\",\n \"#509c93\",\n \"#5e646f\",\n]\nbackground = \"#fafafa\"\nbrights = [\n \"#5e646f\",\n \"#db7070\",\n \"#7c9f4b\",\n \"#d69822\",\n \"#6587bf\",\n \"#b870ce\",\n \"#509c93\",\n \"#5e646f\",\n]\ncursor_bg = \"#5e646f\"\ncursor_border = \"#5e646f\"\ncursor_fg = \"#fafafa\"\nforeground = \"#5e646f\"\nselection_bg = \"#5e646f\"\nselection_fg = \"#fafafa\"\n\n[colors.indexed]\n16 = \"#db7070\"\n17 = \"#509c93\"\n18 = \"#7c9f4b\"\n19 = \"#d69822\"\n20 = \"#6587bf\"\n21 = \"#b870ce\"\n\n[metadata]\naliases = []\nauthor = \"cjayross (https://github.com/cjayross)\"\nname = \"Edge Light (base16)\"\norigin_url = \"https://github.com/cjayross/base16-edge-schemes\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), -("Ef-Arbutus", "[colors]\nansi = [\n \"#f0d8cf\",\n \"#b0000f\",\n \"#007000\",\n \"#906200\",\n \"#375cc6\",\n \"#a23ea4\",\n \"#3f69af\",\n \"#393330\",\n]\nbackground = \"#ffead8\"\nbrights = [\n \"#c7b2ab\",\n \"#aa184f\",\n \"#00704f\",\n \"#8a6340\",\n \"#265fbf\",\n \"#6448ca\",\n \"#0f7688\",\n \"#6e678f\",\n]\ncursor_bg = \"#208f10\"\ncursor_border = \"#208f10\"\ncursor_fg = \"#ffead8\"\nforeground = \"#393330\"\nselection_bg = \"#dbe0c0\"\nselection_fg = \"#393330\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Arbutus\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-arbutus-theme.el\"\nwezterm_version = \"nightly builds only\"\n"), -("Ef-Autumn", "[colors]\nansi = [\n \"#26211d\",\n \"#ef656a\",\n \"#2fa526\",\n \"#c48702\",\n \"#379cf6\",\n \"#d570af\",\n \"#4fb0cf\",\n \"#cfbcba\",\n]\nbackground = \"#0f0e06\"\nbrights = [\n \"#56524f\",\n \"#ff7a7f\",\n \"#00b066\",\n \"#df8f6f\",\n \"#029fff\",\n \"#af8aff\",\n \"#3dbbb0\",\n \"#887c8a\",\n]\ncursor_bg = \"#ffaa33\"\ncursor_border = \"#ffaa33\"\ncursor_fg = \"#0f0e06\"\nforeground = \"#cfbcba\"\nselection_bg = \"#3f1020\"\nselection_fg = \"#cfbcba\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Autumn\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-autumn-theme.el\"\nwezterm_version = \"20230408-112425-69ae8472\"\n"), +("Ef-Arbutus", "[colors]\nansi = [\n \"#f0d8cf\",\n \"#b0000f\",\n \"#007000\",\n \"#906200\",\n \"#375cc6\",\n \"#a23ea4\",\n \"#3f69af\",\n \"#393330\",\n]\nbackground = \"#ffead8\"\nbrights = [\n \"#c7b2ab\",\n \"#aa184f\",\n \"#00704f\",\n \"#8a6340\",\n \"#265fbf\",\n \"#6448ca\",\n \"#0f7688\",\n \"#6e678f\",\n]\ncursor_bg = \"#208f10\"\ncursor_border = \"#208f10\"\ncursor_fg = \"#ffead8\"\nforeground = \"#393330\"\nselection_bg = \"#dbe0c0\"\nselection_fg = \"#393330\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Arbutus\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-arbutus-theme.el\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), +("Ef-Autumn", "[colors]\nansi = [\n \"#26211d\",\n \"#ef656a\",\n \"#2fa526\",\n \"#c48702\",\n \"#379cf6\",\n \"#d570af\",\n \"#4fb0cf\",\n \"#cfbcba\",\n]\nbackground = \"#0f0e06\"\nbrights = [\n \"#56524f\",\n \"#ff7a7f\",\n \"#00b066\",\n \"#df8f6f\",\n \"#029fff\",\n \"#af8aff\",\n \"#3dbbb0\",\n \"#887c8a\",\n]\ncursor_bg = \"#ffaa33\"\ncursor_border = \"#ffaa33\"\ncursor_fg = \"#0f0e06\"\nforeground = \"#cfbcba\"\nselection_bg = \"#3f1324\"\nselection_fg = \"#cfbcba\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Autumn\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-autumn-theme.el\"\nwezterm_version = \"20230408-112425-69ae8472\"\n"), ("Ef-Bio", "[colors]\nansi = [\n \"#222522\",\n \"#ef6560\",\n \"#3fb83f\",\n \"#d4aa02\",\n \"#37aff6\",\n \"#d38faf\",\n \"#6fc5ef\",\n \"#cfdfd5\",\n]\nbackground = \"#111111\"\nbrights = [\n \"#505250\",\n \"#ff778f\",\n \"#00c089\",\n \"#cfc04f\",\n \"#32cfef\",\n \"#af9fff\",\n \"#5dc0aa\",\n \"#808f80\",\n]\ncursor_bg = \"#35f038\"\ncursor_border = \"#35f038\"\ncursor_fg = \"#111111\"\nforeground = \"#cfdfd5\"\nselection_bg = \"#3a3027\"\nselection_fg = \"#cfdfd5\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Bio\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-bio-theme.el\"\nwezterm_version = \"20230408-112425-69ae8472\"\n"), ("Ef-Cherie", "[colors]\nansi = [\n \"#291f26\",\n \"#ff7359\",\n \"#60b444\",\n \"#e5b76f\",\n \"#8fa5f6\",\n \"#ef80bf\",\n \"#8fbaef\",\n \"#d3cfcf\",\n]\nbackground = \"#190a0f\"\nbrights = [\n \"#594a4f\",\n \"#ff78aa\",\n \"#60bf88\",\n \"#f59280\",\n \"#7fa5ff\",\n \"#df7fff\",\n \"#8fcfdf\",\n \"#808898\",\n]\ncursor_bg = \"#ff5aaf\"\ncursor_border = \"#ff5aaf\"\ncursor_fg = \"#190a0f\"\nforeground = \"#d3cfcf\"\nselection_bg = \"#232f3f\"\nselection_fg = \"#d3cfcf\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Cherie\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-cherie-theme.el\"\nwezterm_version = \"20230408-112425-69ae8472\"\n"), -("Ef-Cyprus", "[colors]\nansi = [\n \"#f0ece0\",\n \"#9f0d0f\",\n \"#006f00\",\n \"#a7601f\",\n \"#375cc6\",\n \"#9a456f\",\n \"#1f70af\",\n \"#242521\",\n]\nbackground = \"#fcf7ef\"\nbrights = [\n \"#c5c3b8\",\n \"#ca3400\",\n \"#00824f\",\n \"#a2604f\",\n \"#065fbf\",\n \"#8448aa\",\n \"#007a9f\",\n \"#59786f\",\n]\ncursor_bg = \"#007f00\"\ncursor_border = \"#007f00\"\ncursor_fg = \"#fcf7ef\"\nforeground = \"#242521\"\nselection_bg = \"#e0e7e5\"\nselection_fg = \"#242521\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Cyprus\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-cyprus-theme.el\"\nwezterm_version = \"nightly builds only\"\n"), +("Ef-Cyprus", "[colors]\nansi = [\n \"#f0ece0\",\n \"#9f0d0f\",\n \"#006f00\",\n \"#a7601f\",\n \"#375cc6\",\n \"#9a456f\",\n \"#1f70af\",\n \"#242521\",\n]\nbackground = \"#fcf7ef\"\nbrights = [\n \"#c5c3b8\",\n \"#ca3400\",\n \"#00824f\",\n \"#a2604f\",\n \"#065fbf\",\n \"#8448aa\",\n \"#007a9f\",\n \"#59786f\",\n]\ncursor_bg = \"#007f00\"\ncursor_border = \"#007f00\"\ncursor_fg = \"#fcf7ef\"\nforeground = \"#242521\"\nselection_bg = \"#e0e7e5\"\nselection_fg = \"#242521\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Cyprus\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-cyprus-theme.el\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), ("Ef-Dark", "[colors]\nansi = [\n \"#1a1a1a\",\n \"#ef6560\",\n \"#0faa26\",\n \"#bf9032\",\n \"#3f95f6\",\n \"#d369af\",\n \"#4fbaef\",\n \"#d0d0d0\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#4b4b4b\",\n \"#ff5a7a\",\n \"#00a692\",\n \"#df8a5a\",\n \"#029fff\",\n \"#af85ff\",\n \"#1dbfcf\",\n \"#857f8f\",\n]\ncursor_bg = \"#ff76ff\"\ncursor_border = \"#ff76ff\"\ncursor_fg = \"#000000\"\nforeground = \"#d0d0d0\"\nselection_bg = \"#2a234a\"\nselection_fg = \"#d0d0d0\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Dark\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-dark-theme.el\"\nwezterm_version = \"20230408-112425-69ae8472\"\n"), -("Ef-Day", "[colors]\nansi = [\n \"#f2e9db\",\n \"#ba2d2f\",\n \"#007a0a\",\n \"#a45a22\",\n \"#375cc6\",\n \"#ca3e54\",\n \"#3f60af\",\n \"#584141\",\n]\nbackground = \"#fff5ea\"\nbrights = [\n \"#c9c0b8\",\n \"#cf2f4f\",\n \"#0f7f5f\",\n \"#aa4f30\",\n \"#265fbf\",\n \"#8448aa\",\n \"#0f7b8f\",\n \"#63728f\",\n]\ncursor_bg = \"#cf1f00\"\ncursor_border = \"#cf1f00\"\ncursor_fg = \"#fff5ea\"\nforeground = \"#584141\"\nselection_bg = \"#f0d2df\"\nselection_fg = \"#584141\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Day\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-day-theme.el\"\nwezterm_version = \"nightly builds only\"\n"), -("Ef-Deuteranopia-Dark", "[colors]\nansi = [\n \"#121f34\",\n \"#cf8560\",\n \"#3faa26\",\n \"#aa9f32\",\n \"#3f90f0\",\n \"#b379bf\",\n \"#5faaef\",\n \"#ddddee\",\n]\nbackground = \"#000a1f\"\nbrights = [\n \"#445165\",\n \"#cf7a7a\",\n \"#3fa672\",\n \"#bfaf7a\",\n \"#009fff\",\n \"#9f95ff\",\n \"#0db0ff\",\n \"#7f8797\",\n]\ncursor_bg = \"#ffff00\"\ncursor_border = \"#ffff00\"\ncursor_fg = \"#000a1f\"\nforeground = \"#ddddee\"\nselection_bg = \"#223848\"\nselection_fg = \"#ddddee\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Deuteranopia-Dark\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-deuteranopia-dark-theme.el\"\nwezterm_version = \"nightly builds only\"\n"), -("Ef-Deuteranopia-Light", "[colors]\nansi = [\n \"#e8e8ea\",\n \"#d3303a\",\n \"#217a3c\",\n \"#805d00\",\n \"#375cd8\",\n \"#ba35af\",\n \"#1f6fbf\",\n \"#1a1a2f\",\n]\nbackground = \"#f5f5ff\"\nbrights = [\n \"#b3b3c0\",\n \"#d50f7f\",\n \"#008058\",\n \"#765040\",\n \"#065fff\",\n \"#6052cf\",\n \"#1f77bb\",\n \"#70627f\",\n]\ncursor_bg = \"#0000bb\"\ncursor_border = \"#0000bb\"\ncursor_fg = \"#f5f5ff\"\nforeground = \"#1a1a2f\"\nselection_bg = \"#dadadf\"\nselection_fg = \"#1a1a2f\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Deuteranopia-Light\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-deuteranopia-light-theme.el\"\nwezterm_version = \"nightly builds only\"\n"), -("Ef-Duo-Dark", "[colors]\nansi = [\n \"#1d1a26\",\n \"#ef656a\",\n \"#1fa526\",\n \"#c48702\",\n \"#379cf6\",\n \"#d369af\",\n \"#5faaef\",\n \"#d0d0d0\",\n]\nbackground = \"#070019\"\nbrights = [\n \"#4a4759\",\n \"#ef798f\",\n \"#00b982\",\n \"#df805f\",\n \"#029fff\",\n \"#af85ff\",\n \"#0dafdf\",\n \"#857f8f\",\n]\ncursor_bg = \"#ef6f11\"\ncursor_border = \"#ef6f11\"\ncursor_fg = \"#070019\"\nforeground = \"#d0d0d0\"\nselection_bg = \"#042a50\"\nselection_fg = \"#d0d0d0\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Duo-Dark\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-duo-dark-theme.el\"\nwezterm_version = \"nightly builds only\"\n"), -("Ef-Duo-Light", "[colors]\nansi = [\n \"#f6ece8\",\n \"#cc3333\",\n \"#217a3c\",\n \"#8a5d00\",\n \"#375cd8\",\n \"#ba35af\",\n \"#1f6fbf\",\n \"#222222\",\n]\nbackground = \"#fff8f0\"\nbrights = [\n \"#c7c0ba\",\n \"#c04440\",\n \"#008058\",\n \"#8f5a3a\",\n \"#065fff\",\n \"#6052cf\",\n \"#1f77bb\",\n \"#63728f\",\n]\ncursor_bg = \"#1144ff\"\ncursor_border = \"#1144ff\"\ncursor_fg = \"#fff8f0\"\nforeground = \"#222222\"\nselection_bg = \"#caeafa\"\nselection_fg = \"#222222\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Duo-Light\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-duo-light-theme.el\"\nwezterm_version = \"nightly builds only\"\n"), -("Ef-Elea-Dark", "[colors]\nansi = [\n \"#303332\",\n \"#ff656a\",\n \"#7fc87f\",\n \"#cac85f\",\n \"#57aff6\",\n \"#f59acf\",\n \"#6fcfd2\",\n \"#eaf2ef\",\n]\nbackground = \"#222524\"\nbrights = [\n \"#5e6160\",\n \"#fa7f88\",\n \"#50cf89\",\n \"#cfb27f\",\n \"#62cfef\",\n \"#cfaaff\",\n \"#60d5c2\",\n \"#969faf\",\n]\ncursor_bg = \"#ef7fa8\"\ncursor_border = \"#ef7fa8\"\ncursor_fg = \"#222524\"\nforeground = \"#eaf2ef\"\nselection_bg = \"#543040\"\nselection_fg = \"#eaf2ef\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Elea-Dark\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-elea-dark-theme.el\"\nwezterm_version = \"nightly builds only\"\n"), -("Ef-Elea-Light", "[colors]\nansi = [\n \"#e3e9d6\",\n \"#c3303a\",\n \"#00601f\",\n \"#9a501f\",\n \"#375cc6\",\n \"#80308f\",\n \"#1f70af\",\n \"#221321\",\n]\nbackground = \"#edf5e2\"\nbrights = [\n \"#b0b7aa\",\n \"#b02440\",\n \"#007047\",\n \"#88541f\",\n \"#162f8f\",\n \"#5032aa\",\n \"#00677f\",\n \"#676470\",\n]\ncursor_bg = \"#770080\"\ncursor_border = \"#770080\"\ncursor_fg = \"#edf5e2\"\nforeground = \"#221321\"\nselection_bg = \"#d9d2ef\"\nselection_fg = \"#221321\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Elea-Light\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-elea-light-theme.el\"\nwezterm_version = \"nightly builds only\"\n"), -("Ef-Frost", "[colors]\nansi = [\n \"#eaefef\",\n \"#c42d2f\",\n \"#008a00\",\n \"#aa6100\",\n \"#004fc0\",\n \"#aa44c5\",\n \"#1f6fbf\",\n \"#232323\",\n]\nbackground = \"#fcffff\"\nbrights = [\n \"#b5b8b8\",\n \"#cf2f4f\",\n \"#00845f\",\n \"#996c4f\",\n \"#065fff\",\n \"#7f5ae0\",\n \"#007a85\",\n \"#66657f\",\n]\ncursor_bg = \"#0055bb\"\ncursor_border = \"#0055bb\"\ncursor_fg = \"#fcffff\"\nforeground = \"#232323\"\nselection_bg = \"#d4eaf3\"\nselection_fg = \"#232323\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Frost\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-frost-theme.el\"\nwezterm_version = \"nightly builds only\"\n"), -("Ef-Kassio", "[colors]\nansi = [\n \"#efe7e7\",\n \"#b00234\",\n \"#217a3c\",\n \"#9a6012\",\n \"#3c3bbe\",\n \"#a01f64\",\n \"#2f5f9f\",\n \"#201f36\",\n]\nbackground = \"#fff7f7\"\nbrights = [\n \"#c0bbbb\",\n \"#d5305f\",\n \"#008358\",\n \"#a04646\",\n \"#065fff\",\n \"#7022bf\",\n \"#1077ab\",\n \"#776f79\",\n]\ncursor_bg = \"#d06f30\"\ncursor_border = \"#d06f30\"\ncursor_fg = \"#fff7f7\"\nforeground = \"#201f36\"\nselection_bg = \"#dfe4f4\"\nselection_fg = \"#201f36\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Kassio\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-kassio-theme.el\"\nwezterm_version = \"nightly builds only\"\n"), -("Ef-Light", "[colors]\nansi = [\n \"#efefef\",\n \"#d3303a\",\n \"#217a3c\",\n \"#a45f22\",\n \"#375cd8\",\n \"#ba35af\",\n \"#1f6fbf\",\n \"#202020\",\n]\nbackground = \"#ffffff\"\nbrights = [\n \"#b3b3b3\",\n \"#d50f7f\",\n \"#008858\",\n \"#b65050\",\n \"#065fff\",\n \"#6052cf\",\n \"#1f77bb\",\n \"#70627f\",\n]\ncursor_bg = \"#0033cc\"\ncursor_border = \"#0033cc\"\ncursor_fg = \"#ffffff\"\nforeground = \"#202020\"\nselection_bg = \"#bfefff\"\nselection_fg = \"#202020\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Light\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-light-theme.el\"\nwezterm_version = \"nightly builds only\"\n"), -("Ef-Maris-Dark", "[colors]\nansi = [\n \"#1d2c39\",\n \"#ff6f6f\",\n \"#41bf4f\",\n \"#d0d24f\",\n \"#57b0ff\",\n \"#f59acf\",\n \"#2fd0db\",\n \"#eaedef\",\n]\nbackground = \"#131c2b\"\nbrights = [\n \"#4a5664\",\n \"#ff7788\",\n \"#30c489\",\n \"#cab27f\",\n \"#12b4ff\",\n \"#cf90ff\",\n \"#65d5a8\",\n \"#969faf\",\n]\ncursor_bg = \"#8fdfff\"\ncursor_border = \"#8fdfff\"\ncursor_fg = \"#131c2b\"\nforeground = \"#eaedef\"\nselection_bg = \"#183c65\"\nselection_fg = \"#eaedef\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Maris-Dark\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-maris-dark-theme.el\"\nwezterm_version = \"nightly builds only\"\n"), -("Ef-Maris-Light", "[colors]\nansi = [\n \"#e0e7ef\",\n \"#c3303a\",\n \"#007010\",\n \"#805a1f\",\n \"#375cc6\",\n \"#80308f\",\n \"#1f66af\",\n \"#151a27\",\n]\nbackground = \"#edf4f8\"\nbrights = [\n \"#afb8c3\",\n \"#b02440\",\n \"#007047\",\n \"#78542f\",\n \"#003faf\",\n \"#5f2fba\",\n \"#006f70\",\n \"#676470\",\n]\ncursor_bg = \"#036f99\"\ncursor_border = \"#036f99\"\ncursor_fg = \"#edf4f8\"\nforeground = \"#151a27\"\nselection_bg = \"#c8dcff\"\nselection_fg = \"#151a27\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Maris-Light\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-maris-light-theme.el\"\nwezterm_version = \"nightly builds only\"\n"), -("Ef-Melissa-Dark", "[colors]\nansi = [\n \"#483426\",\n \"#ff7f7f\",\n \"#6fd560\",\n \"#e4b53f\",\n \"#57aff6\",\n \"#f0aac5\",\n \"#6fcad0\",\n \"#e8e4b1\",\n]\nbackground = \"#352718\"\nbrights = [\n \"#79665f\",\n \"#ff8f98\",\n \"#65d590\",\n \"#e7a06f\",\n \"#62cfef\",\n \"#c6a2fe\",\n \"#70e0cf\",\n \"#90918a\",\n]\ncursor_bg = \"#f9cf7a\"\ncursor_border = \"#f9cf7a\"\ncursor_fg = \"#352718\"\nforeground = \"#e8e4b1\"\nselection_bg = \"#443a4f\"\nselection_fg = \"#e8e4b1\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Melissa-Dark\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-melissa-dark-theme.el\"\nwezterm_version = \"nightly builds only\"\n"), -("Ef-Melissa-Light", "[colors]\nansi = [\n \"#f5e9cb\",\n \"#ba2d2f\",\n \"#007a0a\",\n \"#a46110\",\n \"#375cc6\",\n \"#aa3e74\",\n \"#3f60af\",\n \"#484431\",\n]\nbackground = \"#fff6d8\"\nbrights = [\n \"#c7b7a6\",\n \"#c03f3f\",\n \"#008250\",\n \"#946830\",\n \"#265fbf\",\n \"#6448ca\",\n \"#0f708a\",\n \"#68708a\",\n]\ncursor_bg = \"#a07f00\"\ncursor_border = \"#a07f00\"\ncursor_fg = \"#fff6d8\"\nforeground = \"#484431\"\nselection_bg = \"#f0d4d8\"\nselection_fg = \"#484431\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Melissa-Light\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-melissa-light-theme.el\"\nwezterm_version = \"nightly builds only\"\n"), -("Ef-Night", "[colors]\nansi = [\n \"#1a202b\",\n \"#ef656a\",\n \"#1fa526\",\n \"#c48502\",\n \"#379cf6\",\n \"#d570af\",\n \"#4fb0cf\",\n \"#afbcbf\",\n]\nbackground = \"#000e17\"\nbrights = [\n \"#444e59\",\n \"#ef798f\",\n \"#00a972\",\n \"#df8f6f\",\n \"#029fff\",\n \"#af8aff\",\n \"#3dc0b0\",\n \"#70819f\",\n]\ncursor_bg = \"#00ccff\"\ncursor_border = \"#00ccff\"\ncursor_fg = \"#000e17\"\nforeground = \"#afbcbf\"\nselection_bg = \"#222f40\"\nselection_fg = \"#afbcbf\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Night\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-night-theme.el\"\nwezterm_version = \"nightly builds only\"\n"), -("Ef-Rosa", "[colors]\nansi = [\n \"#432e32\",\n \"#ff707f\",\n \"#55cb56\",\n \"#e4c53f\",\n \"#57aff6\",\n \"#ffb2d6\",\n \"#5fc0dc\",\n \"#e4d3e1\",\n]\nbackground = \"#322023\"\nbrights = [\n \"#6a5862\",\n \"#f0888f\",\n \"#49d081\",\n \"#eec26f\",\n \"#62cff7\",\n \"#cfb1ff\",\n \"#80dfbf\",\n \"#9d9d9d\",\n]\ncursor_bg = \"#ef607a\"\ncursor_border = \"#ef607a\"\ncursor_fg = \"#322023\"\nforeground = \"#e4d3e1\"\nselection_bg = \"#45524a\"\nselection_fg = \"#e4d3e1\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Rosa\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-rosa-theme.el\"\nwezterm_version = \"nightly builds only\"\n"), +("Ef-Day", "[colors]\nansi = [\n \"#f2e9db\",\n \"#ba2d2f\",\n \"#007a0a\",\n \"#a45a22\",\n \"#375cc6\",\n \"#ca3e54\",\n \"#3f60af\",\n \"#584141\",\n]\nbackground = \"#fff5ea\"\nbrights = [\n \"#c9c0b8\",\n \"#cf2f4f\",\n \"#0f7f5f\",\n \"#aa4f30\",\n \"#265fbf\",\n \"#8448aa\",\n \"#0f7b8f\",\n \"#63728f\",\n]\ncursor_bg = \"#cf1f00\"\ncursor_border = \"#cf1f00\"\ncursor_fg = \"#fff5ea\"\nforeground = \"#584141\"\nselection_bg = \"#f0d2df\"\nselection_fg = \"#584141\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Day\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-day-theme.el\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), +("Ef-Deuteranopia-Dark", "[colors]\nansi = [\n \"#121f34\",\n \"#cf8560\",\n \"#3faa26\",\n \"#aa9f32\",\n \"#3f90f0\",\n \"#b379bf\",\n \"#5faaef\",\n \"#ddddee\",\n]\nbackground = \"#000a1f\"\nbrights = [\n \"#445165\",\n \"#cf7a7a\",\n \"#3fa672\",\n \"#bfaf7a\",\n \"#009fff\",\n \"#9f95ff\",\n \"#0db0ff\",\n \"#7f8797\",\n]\ncursor_bg = \"#ffff00\"\ncursor_border = \"#ffff00\"\ncursor_fg = \"#000a1f\"\nforeground = \"#ddddee\"\nselection_bg = \"#223848\"\nselection_fg = \"#ddddee\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Deuteranopia-Dark\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-deuteranopia-dark-theme.el\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), +("Ef-Deuteranopia-Light", "[colors]\nansi = [\n \"#e8e8ea\",\n \"#d3303a\",\n \"#217a3c\",\n \"#805d00\",\n \"#375cd8\",\n \"#ba35af\",\n \"#1f6fbf\",\n \"#1a1a2f\",\n]\nbackground = \"#f5f5ff\"\nbrights = [\n \"#b3b3c0\",\n \"#d50f7f\",\n \"#008058\",\n \"#765040\",\n \"#065fff\",\n \"#6052cf\",\n \"#1f77bb\",\n \"#70627f\",\n]\ncursor_bg = \"#0000bb\"\ncursor_border = \"#0000bb\"\ncursor_fg = \"#f5f5ff\"\nforeground = \"#1a1a2f\"\nselection_bg = \"#dadadf\"\nselection_fg = \"#1a1a2f\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Deuteranopia-Light\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-deuteranopia-light-theme.el\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), +("Ef-Dream", "[colors]\nansi = [\n \"#322f34\",\n \"#ff6f6f\",\n \"#51b04f\",\n \"#c0b24f\",\n \"#57b0ff\",\n \"#ffaacf\",\n \"#6fb3c0\",\n \"#efd5c5\",\n]\nbackground = \"#232025\"\nbrights = [\n \"#5b595e\",\n \"#e47980\",\n \"#3fc489\",\n \"#deb07a\",\n \"#12b4ff\",\n \"#d0b0ff\",\n \"#65c5a8\",\n \"#8f8886\",\n]\ncursor_bg = \"#f3c09a\"\ncursor_border = \"#f3c09a\"\ncursor_fg = \"#232025\"\nforeground = \"#efd5c5\"\nselection_bg = \"#544a50\"\nselection_fg = \"#efd5c5\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Dream\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-dream-theme.el\"\nwezterm_version = \"nightly builds only\"\n"), +("Ef-Duo-Dark", "[colors]\nansi = [\n \"#1d1a26\",\n \"#ef656a\",\n \"#1fa526\",\n \"#c48702\",\n \"#379cf6\",\n \"#d369af\",\n \"#5faaef\",\n \"#d0d0d0\",\n]\nbackground = \"#070019\"\nbrights = [\n \"#4a4759\",\n \"#ef798f\",\n \"#00b982\",\n \"#df805f\",\n \"#029fff\",\n \"#af85ff\",\n \"#0dafdf\",\n \"#857f8f\",\n]\ncursor_bg = \"#ef6f11\"\ncursor_border = \"#ef6f11\"\ncursor_fg = \"#070019\"\nforeground = \"#d0d0d0\"\nselection_bg = \"#042a50\"\nselection_fg = \"#d0d0d0\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Duo-Dark\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-duo-dark-theme.el\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), +("Ef-Duo-Light", "[colors]\nansi = [\n \"#f6ece8\",\n \"#cc3333\",\n \"#217a3c\",\n \"#8a5d00\",\n \"#375cd8\",\n \"#ba35af\",\n \"#1f6fbf\",\n \"#222222\",\n]\nbackground = \"#fff8f0\"\nbrights = [\n \"#c7c0ba\",\n \"#c04440\",\n \"#008058\",\n \"#8f5a3a\",\n \"#065fff\",\n \"#6052cf\",\n \"#1f77bb\",\n \"#63728f\",\n]\ncursor_bg = \"#1144ff\"\ncursor_border = \"#1144ff\"\ncursor_fg = \"#fff8f0\"\nforeground = \"#222222\"\nselection_bg = \"#caeafa\"\nselection_fg = \"#222222\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Duo-Light\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-duo-light-theme.el\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), +("Ef-Elea-Dark", "[colors]\nansi = [\n \"#303332\",\n \"#ff656a\",\n \"#7fc87f\",\n \"#cac85f\",\n \"#57aff6\",\n \"#f59acf\",\n \"#6fcfd2\",\n \"#eaf2ef\",\n]\nbackground = \"#222524\"\nbrights = [\n \"#5e6160\",\n \"#fa7f88\",\n \"#50cf89\",\n \"#cfb27f\",\n \"#62cfef\",\n \"#cfaaff\",\n \"#60d5c2\",\n \"#969faf\",\n]\ncursor_bg = \"#ef7fa8\"\ncursor_border = \"#ef7fa8\"\ncursor_fg = \"#222524\"\nforeground = \"#eaf2ef\"\nselection_bg = \"#543040\"\nselection_fg = \"#eaf2ef\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Elea-Dark\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-elea-dark-theme.el\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), +("Ef-Elea-Light", "[colors]\nansi = [\n \"#e3e9d6\",\n \"#c3303a\",\n \"#00601f\",\n \"#9a501f\",\n \"#375cc6\",\n \"#80308f\",\n \"#1f70af\",\n \"#221321\",\n]\nbackground = \"#edf5e2\"\nbrights = [\n \"#b0b7aa\",\n \"#b02440\",\n \"#007047\",\n \"#88541f\",\n \"#162f8f\",\n \"#5032aa\",\n \"#00677f\",\n \"#676470\",\n]\ncursor_bg = \"#770080\"\ncursor_border = \"#770080\"\ncursor_fg = \"#edf5e2\"\nforeground = \"#221321\"\nselection_bg = \"#d9d2ef\"\nselection_fg = \"#221321\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Elea-Light\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-elea-light-theme.el\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), +("Ef-Frost", "[colors]\nansi = [\n \"#eaefef\",\n \"#c42d2f\",\n \"#008a00\",\n \"#aa6100\",\n \"#004fc0\",\n \"#aa44c5\",\n \"#1f6fbf\",\n \"#232323\",\n]\nbackground = \"#fcffff\"\nbrights = [\n \"#b5b8b8\",\n \"#cf2f4f\",\n \"#00845f\",\n \"#996c4f\",\n \"#065fff\",\n \"#7f5ae0\",\n \"#007a85\",\n \"#66657f\",\n]\ncursor_bg = \"#0055bb\"\ncursor_border = \"#0055bb\"\ncursor_fg = \"#fcffff\"\nforeground = \"#232323\"\nselection_bg = \"#d4eaf3\"\nselection_fg = \"#232323\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Frost\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-frost-theme.el\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), +("Ef-Kassio", "[colors]\nansi = [\n \"#efe7e7\",\n \"#b00234\",\n \"#217a3c\",\n \"#9a6012\",\n \"#3c3bbe\",\n \"#a01f64\",\n \"#2f5f9f\",\n \"#201f36\",\n]\nbackground = \"#fff7f7\"\nbrights = [\n \"#c0bbbb\",\n \"#d5305f\",\n \"#008358\",\n \"#a04646\",\n \"#065fff\",\n \"#7022bf\",\n \"#1077ab\",\n \"#776f79\",\n]\ncursor_bg = \"#d06f30\"\ncursor_border = \"#d06f30\"\ncursor_fg = \"#fff7f7\"\nforeground = \"#201f36\"\nselection_bg = \"#dfe4f4\"\nselection_fg = \"#201f36\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Kassio\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-kassio-theme.el\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), +("Ef-Light", "[colors]\nansi = [\n \"#efefef\",\n \"#d3303a\",\n \"#217a3c\",\n \"#a45f22\",\n \"#3740cf\",\n \"#ba35af\",\n \"#1f6fbf\",\n \"#202020\",\n]\nbackground = \"#ffffff\"\nbrights = [\n \"#b3b3b3\",\n \"#d50f7f\",\n \"#008858\",\n \"#b65050\",\n \"#065fff\",\n \"#6052cf\",\n \"#1f77bb\",\n \"#70627f\",\n]\ncursor_bg = \"#0033cc\"\ncursor_border = \"#0033cc\"\ncursor_fg = \"#ffffff\"\nforeground = \"#202020\"\nselection_bg = \"#bfefff\"\nselection_fg = \"#202020\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Light\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-light-theme.el\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), +("Ef-Maris-Dark", "[colors]\nansi = [\n \"#1d2c39\",\n \"#ff6f6f\",\n \"#41bf4f\",\n \"#d0d24f\",\n \"#57b0ff\",\n \"#f59acf\",\n \"#2fd0db\",\n \"#eaedef\",\n]\nbackground = \"#131c2b\"\nbrights = [\n \"#4a5664\",\n \"#ff7788\",\n \"#30c489\",\n \"#cab27f\",\n \"#12b4ff\",\n \"#cf90ff\",\n \"#65d5a8\",\n \"#969faf\",\n]\ncursor_bg = \"#8fdfff\"\ncursor_border = \"#8fdfff\"\ncursor_fg = \"#131c2b\"\nforeground = \"#eaedef\"\nselection_bg = \"#183c65\"\nselection_fg = \"#eaedef\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Maris-Dark\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-maris-dark-theme.el\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), +("Ef-Maris-Light", "[colors]\nansi = [\n \"#e0e7ef\",\n \"#c3303a\",\n \"#007010\",\n \"#805a1f\",\n \"#375cc6\",\n \"#80308f\",\n \"#1f66af\",\n \"#151a27\",\n]\nbackground = \"#edf4f8\"\nbrights = [\n \"#afb8c3\",\n \"#b02440\",\n \"#007047\",\n \"#78542f\",\n \"#003faf\",\n \"#5f2fba\",\n \"#006f70\",\n \"#676470\",\n]\ncursor_bg = \"#036f99\"\ncursor_border = \"#036f99\"\ncursor_fg = \"#edf4f8\"\nforeground = \"#151a27\"\nselection_bg = \"#c8dcff\"\nselection_fg = \"#151a27\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Maris-Light\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-maris-light-theme.el\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), +("Ef-Melissa-Dark", "[colors]\nansi = [\n \"#483426\",\n \"#ff7f7f\",\n \"#6fd560\",\n \"#e4b53f\",\n \"#57aff6\",\n \"#f0aac5\",\n \"#6fcad0\",\n \"#e8e4b1\",\n]\nbackground = \"#352718\"\nbrights = [\n \"#79665f\",\n \"#ff8f98\",\n \"#65d590\",\n \"#e7a06f\",\n \"#62cfef\",\n \"#c6a2fe\",\n \"#70e0cf\",\n \"#90918a\",\n]\ncursor_bg = \"#f9cf7a\"\ncursor_border = \"#f9cf7a\"\ncursor_fg = \"#352718\"\nforeground = \"#e8e4b1\"\nselection_bg = \"#443a4f\"\nselection_fg = \"#e8e4b1\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Melissa-Dark\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-melissa-dark-theme.el\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), +("Ef-Melissa-Light", "[colors]\nansi = [\n \"#f5e9cb\",\n \"#ba2d2f\",\n \"#007a0a\",\n \"#a26310\",\n \"#375cc6\",\n \"#aa3e74\",\n \"#3f60af\",\n \"#484431\",\n]\nbackground = \"#fff6d8\"\nbrights = [\n \"#c7b7a6\",\n \"#c02945\",\n \"#008250\",\n \"#946830\",\n \"#265fbf\",\n \"#6448ca\",\n \"#0f708a\",\n \"#68708a\",\n]\ncursor_bg = \"#a07f00\"\ncursor_border = \"#a07f00\"\ncursor_fg = \"#fff6d8\"\nforeground = \"#484431\"\nselection_bg = \"#f0d4d8\"\nselection_fg = \"#484431\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Melissa-Light\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-melissa-light-theme.el\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), +("Ef-Night", "[colors]\nansi = [\n \"#1a202b\",\n \"#ef656a\",\n \"#1fa526\",\n \"#c48502\",\n \"#379cf6\",\n \"#d570af\",\n \"#4fb0cf\",\n \"#afbcbf\",\n]\nbackground = \"#000e17\"\nbrights = [\n \"#444e59\",\n \"#ef798f\",\n \"#00a972\",\n \"#df8f6f\",\n \"#029fff\",\n \"#af8aff\",\n \"#3dc0b0\",\n \"#70819f\",\n]\ncursor_bg = \"#00ccff\"\ncursor_border = \"#00ccff\"\ncursor_fg = \"#000e17\"\nforeground = \"#afbcbf\"\nselection_bg = \"#253146\"\nselection_fg = \"#afbcbf\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Night\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-night-theme.el\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), +("Ef-Reverie", "[colors]\nansi = [\n \"#e5d6d4\",\n \"#ba2d2f\",\n \"#007a0a\",\n \"#87591f\",\n \"#375cc6\",\n \"#9f4e74\",\n \"#3060af\",\n \"#4f204f\",\n]\nbackground = \"#f3eddf\"\nbrights = [\n \"#b9aaa8\",\n \"#a83058\",\n \"#008250\",\n \"#906045\",\n \"#265fbf\",\n \"#7755b4\",\n \"#0b6e8a\",\n \"#6f6877\",\n]\ncursor_bg = \"#9d5744\"\ncursor_border = \"#9d5744\"\ncursor_fg = \"#f3eddf\"\nforeground = \"#4f204f\"\nselection_bg = \"#e0d0ba\"\nselection_fg = \"#4f204f\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Reverie\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-reverie-theme.el\"\nwezterm_version = \"nightly builds only\"\n"), +("Ef-Rosa", "[colors]\nansi = [\n \"#432e32\",\n \"#ff707f\",\n \"#5fbb5f\",\n \"#e4c53f\",\n \"#57aff6\",\n \"#ffb2d6\",\n \"#5fc0dc\",\n \"#e4d3e1\",\n]\nbackground = \"#322023\"\nbrights = [\n \"#6a5862\",\n \"#f0888f\",\n \"#49d081\",\n \"#eec26f\",\n \"#62cff7\",\n \"#cfb1ff\",\n \"#80dfbf\",\n \"#9d9d9d\",\n]\ncursor_bg = \"#ef607a\"\ncursor_border = \"#ef607a\"\ncursor_fg = \"#322023\"\nforeground = \"#e4d3e1\"\nselection_bg = \"#45524a\"\nselection_fg = \"#e4d3e1\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Rosa\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-rosa-theme.el\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), ("Ef-Spring", "[colors]\nansi = [\n \"#e8f0f0\",\n \"#c42d2f\",\n \"#1a870f\",\n \"#a45f22\",\n \"#375cc6\",\n \"#d5206f\",\n \"#1f6fbf\",\n \"#34494a\",\n]\nbackground = \"#f6fff9\"\nbrights = [\n \"#c0c6c3\",\n \"#cf2f4f\",\n \"#007f68\",\n \"#ae5a30\",\n \"#265fbf\",\n \"#9435b4\",\n \"#0f7b8f\",\n \"#777294\",\n]\ncursor_bg = \"#bf005f\"\ncursor_border = \"#bf005f\"\ncursor_fg = \"#f6fff9\"\nforeground = \"#34494a\"\nselection_bg = \"#d0e6ff\"\nselection_fg = \"#34494a\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Spring\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-spring-theme.el\"\nwezterm_version = \"20230408-112425-69ae8472\"\n"), ("Ef-Summer", "[colors]\nansi = [\n \"#f2e4ea\",\n \"#d3303a\",\n \"#217a3c\",\n \"#a45f22\",\n \"#375ce6\",\n \"#ba35af\",\n \"#1f6fbf\",\n \"#4f4073\",\n]\nbackground = \"#fff2f3\"\nbrights = [\n \"#cfb3c4\",\n \"#d50f7f\",\n \"#007f68\",\n \"#b65050\",\n \"#065fff\",\n \"#8e44f3\",\n \"#0f7b8f\",\n \"#786e74\",\n]\ncursor_bg = \"#cf0090\"\ncursor_border = \"#cf0090\"\ncursor_fg = \"#fff2f3\"\nforeground = \"#4f4073\"\nselection_bg = \"#eecfff\"\nselection_fg = \"#4f4073\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Summer\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-summer-theme.el\"\nwezterm_version = \"20230408-112425-69ae8472\"\n"), -("Ef-Symbiosis", "[colors]\nansi = [\n \"#221920\",\n \"#ef6360\",\n \"#0faa26\",\n \"#bf9032\",\n \"#3f95f6\",\n \"#d369af\",\n \"#4fbaef\",\n \"#d0d0d0\",\n]\nbackground = \"#130911\"\nbrights = [\n \"#4b3f47\",\n \"#fe5a7a\",\n \"#00a692\",\n \"#df8a5a\",\n \"#029fff\",\n \"#af85ff\",\n \"#1dbfcf\",\n \"#857f8f\",\n]\ncursor_bg = \"#f0af7f\"\ncursor_border = \"#f0af7f\"\ncursor_fg = \"#130911\"\nforeground = \"#d0d0d0\"\nselection_bg = \"#2f2630\"\nselection_fg = \"#d0d0d0\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Symbiosis\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-symbiosis-theme.el\"\nwezterm_version = \"nightly builds only\"\n"), +("Ef-Symbiosis", "[colors]\nansi = [\n \"#221920\",\n \"#ef6360\",\n \"#0faa26\",\n \"#bf9032\",\n \"#3f95f6\",\n \"#d369af\",\n \"#4fbaef\",\n \"#d0d0d0\",\n]\nbackground = \"#130911\"\nbrights = [\n \"#4b3f47\",\n \"#fe5a7a\",\n \"#00a692\",\n \"#df8a5a\",\n \"#029fff\",\n \"#af85ff\",\n \"#1dbfcf\",\n \"#857f8f\",\n]\ncursor_bg = \"#f0af7f\"\ncursor_border = \"#f0af7f\"\ncursor_fg = \"#130911\"\nforeground = \"#d0d0d0\"\nselection_bg = \"#3f2f40\"\nselection_fg = \"#d0d0d0\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Symbiosis\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-symbiosis-theme.el\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), ("Ef-Trio-Dark", "[colors]\nansi = [\n \"#2a2228\",\n \"#f48359\",\n \"#60b444\",\n \"#d4a052\",\n \"#7fa5f6\",\n \"#d37faf\",\n \"#8fbaff\",\n \"#d8cfd5\",\n]\nbackground = \"#160f0f\"\nbrights = [\n \"#564f55\",\n \"#ff85aa\",\n \"#60bf88\",\n \"#ef9680\",\n \"#72afff\",\n \"#a698ef\",\n \"#8fcfdf\",\n \"#908890\",\n]\ncursor_bg = \"#ff99ff\"\ncursor_border = \"#ff99ff\"\ncursor_fg = \"#160f0f\"\nforeground = \"#d8cfd5\"\nselection_bg = \"#16304f\"\nselection_fg = \"#d8cfd5\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Trio-Dark\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-trio-dark-theme.el\"\nwezterm_version = \"20230408-112425-69ae8472\"\n"), ("Ef-Trio-Light", "[colors]\nansi = [\n \"#ebe7f1\",\n \"#c3303a\",\n \"#057800\",\n \"#a45f22\",\n \"#375cd6\",\n \"#ad45ba\",\n \"#1f6fbf\",\n \"#4f3363\",\n]\nbackground = \"#f8f5ff\"\nbrights = [\n \"#c3c0c9\",\n \"#c01f5f\",\n \"#007f6f\",\n \"#b65050\",\n \"#065fbf\",\n \"#705ae3\",\n \"#0f7a9d\",\n \"#786e74\",\n]\ncursor_bg = \"#4f45ff\"\ncursor_border = \"#4f45ff\"\ncursor_fg = \"#f8f5ff\"\nforeground = \"#4f3363\"\nselection_bg = \"#eed0ff\"\nselection_fg = \"#4f3363\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Trio-Light\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-trio-light-theme.el\"\nwezterm_version = \"20230408-112425-69ae8472\"\n"), -("Ef-Tritanopia-Dark", "[colors]\nansi = [\n \"#282026\",\n \"#cf4f5f\",\n \"#2fa526\",\n \"#c48702\",\n \"#379cf6\",\n \"#b2608f\",\n \"#3fafcf\",\n \"#dfd0d5\",\n]\nbackground = \"#15050f\"\nbrights = [\n \"#554f4f\",\n \"#d24f7f\",\n \"#00b066\",\n \"#df8f6f\",\n \"#029fff\",\n \"#a6699f\",\n \"#4fafaf\",\n \"#908890\",\n]\ncursor_bg = \"#fd3333\"\ncursor_border = \"#fd3333\"\ncursor_fg = \"#15050f\"\nforeground = \"#dfd0d5\"\nselection_bg = \"#202d3f\"\nselection_fg = \"#dfd0d5\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Tritanopia-Dark\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-tritanopia-dark-theme.el\"\nwezterm_version = \"20230408-112425-69ae8472\"\n"), +("Ef-Tritanopia-Dark", "[colors]\nansi = [\n \"#282026\",\n \"#cf4f5f\",\n \"#2fa526\",\n \"#c48702\",\n \"#379cf6\",\n \"#b0648f\",\n \"#3fafcf\",\n \"#dfd0d5\",\n]\nbackground = \"#15050f\"\nbrights = [\n \"#554f4f\",\n \"#d24f7f\",\n \"#00b066\",\n \"#df8f6f\",\n \"#029fff\",\n \"#a6699f\",\n \"#4fafaf\",\n \"#908890\",\n]\ncursor_bg = \"#fd3333\"\ncursor_border = \"#fd3333\"\ncursor_fg = \"#15050f\"\nforeground = \"#dfd0d5\"\nselection_bg = \"#293140\"\nselection_fg = \"#dfd0d5\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Tritanopia-Dark\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-tritanopia-dark-theme.el\"\nwezterm_version = \"20230408-112425-69ae8472\"\n"), ("Ef-Tritanopia-Light", "[colors]\nansi = [\n \"#efecec\",\n \"#aa0010\",\n \"#217a3c\",\n \"#805d00\",\n \"#375cd8\",\n \"#aa357f\",\n \"#2070af\",\n \"#1a1a1a\",\n]\nbackground = \"#fff9f9\"\nbrights = [\n \"#bdb9b9\",\n \"#c50f4f\",\n \"#008058\",\n \"#765040\",\n \"#065fff\",\n \"#af40af\",\n \"#007faa\",\n \"#756275\",\n]\ncursor_bg = \"#bb0000\"\ncursor_border = \"#bb0000\"\ncursor_fg = \"#fff9f9\"\nforeground = \"#1a1a1a\"\nselection_bg = \"#dadadf\"\nselection_fg = \"#1a1a1a\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Tritanopia-Light\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-tritanopia-light-theme.el\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), ("Ef-Winter", "[colors]\nansi = [\n \"#1d202f\",\n \"#f47359\",\n \"#29a444\",\n \"#b58a52\",\n \"#3f95f6\",\n \"#d369af\",\n \"#4fbaef\",\n \"#b8c6d5\",\n]\nbackground = \"#0f0b15\"\nbrights = [\n \"#4a4f62\",\n \"#ff6a7a\",\n \"#00a392\",\n \"#df9080\",\n \"#029fff\",\n \"#af85ea\",\n \"#35afbf\",\n \"#807c9f\",\n]\ncursor_bg = \"#ff6ff0\"\ncursor_border = \"#ff6ff0\"\ncursor_fg = \"#0f0b15\"\nforeground = \"#b8c6d5\"\nselection_bg = \"#342464\"\nselection_fg = \"#b8c6d5\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Ef-Winter\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-winter-theme.el\"\nwezterm_version = \"20230408-112425-69ae8472\"\n"), ("Eighties (base16)", "[colors]\nansi = [\n \"#2d2d2d\",\n \"#f2777a\",\n \"#99cc99\",\n \"#ffcc66\",\n \"#6699cc\",\n \"#cc99cc\",\n \"#66cccc\",\n \"#d3d0c8\",\n]\nbackground = \"#2d2d2d\"\nbrights = [\n \"#747369\",\n \"#f2777a\",\n \"#99cc99\",\n \"#ffcc66\",\n \"#6699cc\",\n \"#cc99cc\",\n \"#66cccc\",\n \"#f2f0ec\",\n]\ncursor_bg = \"#d3d0c8\"\ncursor_border = \"#d3d0c8\"\ncursor_fg = \"#2d2d2d\"\nforeground = \"#d3d0c8\"\nselection_bg = \"#d3d0c8\"\nselection_fg = \"#2d2d2d\"\n\n[colors.indexed]\n16 = \"#f99157\"\n17 = \"#d27b53\"\n18 = \"#393939\"\n19 = \"#515151\"\n20 = \"#a09f93\"\n21 = \"#e8e6df\"\n\n[metadata]\naliases = [\"Eighties (dark) (terminal.sexy)\"]\nauthor = \"Chris Kempson (http://chriskempson.com)\"\nname = \"Eighties (base16)\"\norigin_url = \"https://github.com/chriskempson/base16-default-schemes\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Eighties (dark) (terminal.sexy)", "[colors]\nansi = [\n \"#2d2d2d\",\n \"#f2777a\",\n \"#99cc99\",\n \"#ffcc66\",\n \"#6699cc\",\n \"#cc99cc\",\n \"#66cccc\",\n \"#d3d0c8\",\n]\nbackground = \"#2d2d2d\"\nbrights = [\n \"#747369\",\n \"#f2777a\",\n \"#99cc99\",\n \"#ffcc66\",\n \"#6699cc\",\n \"#cc99cc\",\n \"#66cccc\",\n \"#f2f0ec\",\n]\nforeground = \"#d3d0c8\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"Chris Kempson\"\nname = \"Eighties (dark) (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), ("Eighties (light) (terminal.sexy)", "[colors]\nansi = [\n \"#2d2d2d\",\n \"#f2777a\",\n \"#99cc99\",\n \"#ffcc66\",\n \"#6699cc\",\n \"#cc99cc\",\n \"#66cccc\",\n \"#d3d0c8\",\n]\nbackground = \"#f2f0ec\"\nbrights = [\n \"#747369\",\n \"#f2777a\",\n \"#99cc99\",\n \"#ffcc66\",\n \"#6699cc\",\n \"#cc99cc\",\n \"#66cccc\",\n \"#f2f0ec\",\n]\nforeground = \"#515151\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"Chris Kempson\"\nname = \"Eighties (light) (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Eldorado dark (terminal.sexy)", "[colors]\nansi = [\n \"#4e4e4e\",\n \"#a9635d\",\n \"#468459\",\n \"#84763d\",\n \"#5879af\",\n \"#9c6594\",\n \"#008592\",\n \"#cfcfcf\",\n]\nbackground = \"#292929\"\nbrights = [\n \"#777777\",\n \"#ffbbb2\",\n \"#9ddeaf\",\n \"#e0ce91\",\n \"#b3d1ff\",\n \"#fabdf0\",\n \"#79e0ed\",\n \"#ffffff\",\n]\nforeground = \"#a2a2a2\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"Baskerville\"\nname = \"Eldorado dark (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), +("Eldritch", "[colors]\nansi = [\n \"#212337\",\n \"#f16c75\",\n \"#37f499\",\n \"#f7c67f\",\n \"#a48cf2\",\n \"#f265b5\",\n \"#04d1f9\",\n \"#ebfafa\",\n]\nbackground = \"#212337\"\nbrights = [\n \"#323449\",\n \"#f9515d\",\n \"#37f499\",\n \"#e9f941\",\n \"#9071f4\",\n \"#f265b5\",\n \"#66e4fd\",\n \"#ffffff\",\n]\ncompose_cursor = \"#f7c67f\"\ncursor_bg = \"#37f499\"\ncursor_border = \"#04d1f9\"\ncursor_fg = \"#212337\"\nforeground = \"#ebfafa\"\nscrollbar_thumb = \"#37f499\"\nselection_bg = \"rgba(26.666668% 27.843138% 35.294117% 50%)\"\nselection_fg = \"rgba(0% 0% 0% 0%)\"\nsplit = \"#a48cf2\"\n\n[colors.indexed]\n\n[colors.tab_bar]\nbackground = \"#212337\"\n\n[colors.tab_bar.active_tab]\nbg_color = \"#37f499\"\nfg_color = \"#212337\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.inactive_tab]\nbg_color = \"#212337\"\nfg_color = \"#04d1f9\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.inactive_tab_hover]\nbg_color = \"#37f499\"\nfg_color = \"#212337\"\nintensity = \"Normal\"\nitalic = true\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.new_tab]\nbg_color = \"#212337\"\nfg_color = \"#ebfafa\"\nintensity = \"Normal\"\nitalic = false\nstrikethrough = false\nunderline = \"None\"\n\n[colors.tab_bar.new_tab_hover]\nbg_color = \"#37f499\"\nfg_color = \"#ebfafa\"\nintensity = \"Normal\"\nitalic = true\nstrikethrough = false\nunderline = \"None\"\n\n[metadata]\naliases = []\nauthor = \"jacobrreed\"\nname = \"Eldritch\"\norigin_url = \"https://github.com/eldritch-theme/eldritch/ports/terminal/wezterm\"\nwezterm_version = \"nightly builds only\"\n"), ("Elemental", "[colors]\nansi = [\n \"#3c3c30\",\n \"#98290f\",\n \"#479a43\",\n \"#7f7111\",\n \"#497f7d\",\n \"#7f4e2f\",\n \"#387f58\",\n \"#807974\",\n]\nbackground = \"#22211d\"\nbrights = [\n \"#555445\",\n \"#e0502a\",\n \"#61e070\",\n \"#d69927\",\n \"#79d9d9\",\n \"#cd7c54\",\n \"#59d599\",\n \"#fff1e9\",\n]\ncursor_bg = \"#facb80\"\ncursor_border = \"#facb80\"\ncursor_fg = \"#161611\"\nforeground = \"#807a74\"\nselection_bg = \"#413829\"\nselection_fg = \"#facd77\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"Elemental (Gogh)\"]\nname = \"Elemental\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Elemental (Gogh)", "[colors]\nansi = [\n \"#3c3c30\",\n \"#98290f\",\n \"#479a43\",\n \"#7f7111\",\n \"#497f7d\",\n \"#7f4e2f\",\n \"#387f58\",\n \"#807974\",\n]\nbackground = \"#22211d\"\nbrights = [\n \"#555445\",\n \"#e0502a\",\n \"#61e070\",\n \"#d69927\",\n \"#79d9d9\",\n \"#cd7c54\",\n \"#59d599\",\n \"#fff1e9\",\n]\ncursor_bg = \"#807a74\"\ncursor_border = \"#807a74\"\ncursor_fg = \"#22211d\"\nforeground = \"#807a74\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Elemental (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), ("Elementary", "[colors]\nansi = [\n \"#242424\",\n \"#d71c15\",\n \"#5aa513\",\n \"#fdb40c\",\n \"#063b8c\",\n \"#e40038\",\n \"#2595e1\",\n \"#efefef\",\n]\nbackground = \"#181818\"\nbrights = [\n \"#4b4b4b\",\n \"#fc1c18\",\n \"#6bc219\",\n \"#fec80e\",\n \"#0955ff\",\n \"#fb0050\",\n \"#3ea8fc\",\n \"#8c00ec\",\n]\ncursor_bg = \"#bbbbbb\"\ncursor_border = \"#bbbbbb\"\ncursor_fg = \"#ffffff\"\nforeground = \"#efefef\"\nselection_bg = \"#b5d5ff\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Elementary\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), @@ -323,16 +328,22 @@ pub const SCHEMES: [(&'static str, &'static str); 966] = [ ("Everblush", "[colors]\nansi = [\n \"#232a2d\",\n \"#e57474\",\n \"#8ccf7e\",\n \"#e5c76b\",\n \"#67b0e8\",\n \"#c47fd5\",\n \"#6cbfbf\",\n \"#b3b9b8\",\n]\nbackground = \"#141b1e\"\nbrights = [\n \"#2d3437\",\n \"#ef7e7e\",\n \"#96d988\",\n \"#f4d67a\",\n \"#71baf2\",\n \"#ce89df\",\n \"#67cbe7\",\n \"#bdc3c2\",\n]\ncursor_bg = \"#dadada\"\ncursor_border = \"#dadada\"\ncursor_fg = \"#141b1e\"\nforeground = \"#dadada\"\nselection_bg = \"#141b1e\"\nselection_fg = \"#dadada\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"Everblush (Gogh)\"]\nname = \"Everblush\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"20230320-124340-559cb7b0\"\n"), ("Everblush (Gogh)", "[colors]\nansi = [\n \"#232a2d\",\n \"#e57474\",\n \"#8ccf7e\",\n \"#e5c76b\",\n \"#67b0e8\",\n \"#c47fd5\",\n \"#6cbfbf\",\n \"#b3b9b8\",\n]\nbackground = \"#141b1e\"\nbrights = [\n \"#2d3437\",\n \"#ef7e7e\",\n \"#96d988\",\n \"#f4d67a\",\n \"#71baf2\",\n \"#ce89df\",\n \"#67cbe7\",\n \"#bdc3c2\",\n]\ncursor_bg = \"#dadada\"\ncursor_border = \"#dadada\"\ncursor_fg = \"#141b1e\"\nforeground = \"#dadada\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Everblush (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), ("Everforest Dark (Gogh)", "[colors]\nansi = [\n \"#4b565c\",\n \"#e67e80\",\n \"#a7c080\",\n \"#dbbc7f\",\n \"#7fbbb3\",\n \"#d699b6\",\n \"#83c092\",\n \"#d3c6aa\",\n]\nbackground = \"#2d353b\"\nbrights = [\n \"#5c6a72\",\n \"#f85552\",\n \"#8da101\",\n \"#dfa000\",\n \"#3a94c5\",\n \"#df69ba\",\n \"#35a77c\",\n \"#dfddc8\",\n]\ncursor_bg = \"#d3c6aa\"\ncursor_border = \"#d3c6aa\"\ncursor_fg = \"#2d353b\"\nforeground = \"#d3c6aa\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"EverforestDark (Gogh)\"]\nname = \"Everforest Dark (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230320-124340-559cb7b0\"\n"), +("Everforest Dark Hard (Gogh)", "[colors]\nansi = [\n \"#2e383c\",\n \"#e67e80\",\n \"#a7c080\",\n \"#dbbc7f\",\n \"#7fbbb3\",\n \"#d699b6\",\n \"#83c092\",\n \"#d3c6aa\",\n]\nbackground = \"#272e33\"\nbrights = [\n \"#5c6a72\",\n \"#f85552\",\n \"#8da101\",\n \"#dfa000\",\n \"#3a94c5\",\n \"#df69ba\",\n \"#35a77c\",\n \"#dfddc8\",\n]\ncursor_bg = \"#d3c6aa\"\ncursor_border = \"#d3c6aa\"\ncursor_fg = \"#272e33\"\nforeground = \"#d3c6aa\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Everforest Dark Hard (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"nightly builds only\"\n"), +("Everforest Dark Medium (Gogh)", "[colors]\nansi = [\n \"#343f44\",\n \"#e67e80\",\n \"#a7c080\",\n \"#dbbc7f\",\n \"#7fbbb3\",\n \"#d699b6\",\n \"#83c092\",\n \"#d3c6aa\",\n]\nbackground = \"#2d353b\"\nbrights = [\n \"#5c6a72\",\n \"#f85552\",\n \"#8da101\",\n \"#dfa000\",\n \"#3a94c5\",\n \"#df69ba\",\n \"#35a77c\",\n \"#dfddc8\",\n]\ncursor_bg = \"#d3c6aa\"\ncursor_border = \"#d3c6aa\"\ncursor_fg = \"#2d353b\"\nforeground = \"#d3c6aa\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Everforest Dark Medium (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"nightly builds only\"\n"), +("Everforest Dark Soft (Gogh)", "[colors]\nansi = [\n \"#3a464c\",\n \"#e67e80\",\n \"#a7c080\",\n \"#dbbc7f\",\n \"#7fbbb3\",\n \"#d699b6\",\n \"#83c092\",\n \"#d3c6aa\",\n]\nbackground = \"#333c43\"\nbrights = [\n \"#5c6a72\",\n \"#f85552\",\n \"#8da101\",\n \"#dfa000\",\n \"#3a94c5\",\n \"#df69ba\",\n \"#35a77c\",\n \"#dfddc8\",\n]\ncursor_bg = \"#d3c6aa\"\ncursor_border = \"#d3c6aa\"\ncursor_fg = \"#333c43\"\nforeground = \"#d3c6aa\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Everforest Dark Soft (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"nightly builds only\"\n"), ("Everforest Light (Gogh)", "[colors]\nansi = [\n \"#5c6a72\",\n \"#f85552\",\n \"#8da101\",\n \"#dfa000\",\n \"#3a94c5\",\n \"#df69ba\",\n \"#35a77c\",\n \"#dfddc8\",\n]\nbackground = \"#fdf6e3\"\nbrights = [\n \"#4b565c\",\n \"#e67e80\",\n \"#a7c080\",\n \"#dbbc7f\",\n \"#7fbbb3\",\n \"#d699b6\",\n \"#83c092\",\n \"#d3c6aa\",\n]\ncursor_bg = \"#5c6a72\"\ncursor_border = \"#5c6a72\"\ncursor_fg = \"#fdf6e3\"\nforeground = \"#5c6a72\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"EverforestLight (Gogh)\"]\nname = \"Everforest Light (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230320-124340-559cb7b0\"\n"), +("Everforest Light Hard (Gogh)", "[colors]\nansi = [\n \"#5c6a72\",\n \"#f85552\",\n \"#8da101\",\n \"#dfa000\",\n \"#3a94c5\",\n \"#df69ba\",\n \"#35a77c\",\n \"#dfddc8\",\n]\nbackground = \"#fffbef\"\nbrights = [\n \"#2e383c\",\n \"#e67e80\",\n \"#a7c080\",\n \"#dbbc7f\",\n \"#7fbbb3\",\n \"#d699b6\",\n \"#83c092\",\n \"#d3c6aa\",\n]\ncursor_bg = \"#5c6a72\"\ncursor_border = \"#5c6a72\"\ncursor_fg = \"#fffbef\"\nforeground = \"#5c6a72\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Everforest Light Hard (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"nightly builds only\"\n"), +("Everforest Light Medium (Gogh)", "[colors]\nansi = [\n \"#5c6a72\",\n \"#f85552\",\n \"#8da101\",\n \"#dfa000\",\n \"#3a94c5\",\n \"#df69ba\",\n \"#35a77c\",\n \"#dfddc8\",\n]\nbackground = \"#fdf6e3\"\nbrights = [\n \"#343f44\",\n \"#e67e80\",\n \"#a7c080\",\n \"#dbbc7f\",\n \"#7fbbb3\",\n \"#d699b6\",\n \"#83c092\",\n \"#d3c6aa\",\n]\ncursor_bg = \"#5c6a72\"\ncursor_border = \"#5c6a72\"\ncursor_fg = \"#fdf6e3\"\nforeground = \"#5c6a72\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Everforest Light Medium (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"nightly builds only\"\n"), +("Everforest Light Soft (Gogh)", "[colors]\nansi = [\n \"#5c6a72\",\n \"#f85552\",\n \"#8da101\",\n \"#dfa000\",\n \"#3a94c5\",\n \"#df69ba\",\n \"#35a77c\",\n \"#dfddc8\",\n]\nbackground = \"#f3ead3\"\nbrights = [\n \"#3a464c\",\n \"#e67e80\",\n \"#a7c080\",\n \"#dbbc7f\",\n \"#7fbbb3\",\n \"#d699b6\",\n \"#83c092\",\n \"#d3c6aa\",\n]\ncursor_bg = \"#5c6a72\"\ncursor_border = \"#5c6a72\"\ncursor_fg = \"#f3ead3\"\nforeground = \"#5c6a72\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Everforest Light Soft (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"nightly builds only\"\n"), ("Fahrenheit", "[colors]\nansi = [\n \"#1d1d1d\",\n \"#cda074\",\n \"#9e744d\",\n \"#fecf75\",\n \"#720102\",\n \"#734c4d\",\n \"#979797\",\n \"#ffffce\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#000000\",\n \"#fecea0\",\n \"#cc734d\",\n \"#fd9f4d\",\n \"#cb4a05\",\n \"#4e739f\",\n \"#fed04d\",\n \"#ffffff\",\n]\ncursor_bg = \"#bbbbbb\"\ncursor_border = \"#bbbbbb\"\ncursor_fg = \"#ffffff\"\nforeground = \"#ffffce\"\nselection_bg = \"#4e739f\"\nselection_fg = \"#ffffce\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Fahrenheit\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Fairy Floss (Gogh)", "[colors]\nansi = [\n \"#42395d\",\n \"#a8757b\",\n \"#ff857f\",\n \"#e6c000\",\n \"#ae81ff\",\n \"#716799\",\n \"#c2ffdf\",\n \"#f8f8f2\",\n]\nbackground = \"#5a5475\"\nbrights = [\n \"#75507b\",\n \"#ffb8d1\",\n \"#f1568e\",\n \"#d5a425\",\n \"#c5a3ff\",\n \"#8077a8\",\n \"#c2ffff\",\n \"#f8f8f0\",\n]\ncursor_bg = \"#ffb8d1\"\ncursor_border = \"#ffb8d1\"\ncursor_fg = \"#5a5475\"\nforeground = \"#c2ffdf\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"FairyFloss (Gogh)\"]\nname = \"Fairy Floss (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Fairy Floss Dark (Gogh)", "[colors]\nansi = [\n \"#42395d\",\n \"#a8757b\",\n \"#ff857f\",\n \"#e6c000\",\n \"#ae81ff\",\n \"#716799\",\n \"#c2ffdf\",\n \"#f8f8f2\",\n]\nbackground = \"#42395d\"\nbrights = [\n \"#75507b\",\n \"#ffb8d1\",\n \"#f1568e\",\n \"#d5a425\",\n \"#c5a3ff\",\n \"#8077a8\",\n \"#c2ffff\",\n \"#f8f8f0\",\n]\ncursor_bg = \"#ffb8d1\"\ncursor_border = \"#ffb8d1\"\ncursor_fg = \"#42395d\"\nforeground = \"#c2ffdf\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"FairyFlossDark (Gogh)\"]\nname = \"Fairy Floss Dark (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Fairyfloss", "[colors]\nansi = [\n \"#040303\",\n \"#f92672\",\n \"#c2ffdf\",\n \"#e6c000\",\n \"#c2ffdf\",\n \"#ffb8d1\",\n \"#c5a3ff\",\n \"#f8f8f0\",\n]\nbackground = \"#5a5475\"\nbrights = [\n \"#6090cb\",\n \"#ff857f\",\n \"#c2ffdf\",\n \"#ffea00\",\n \"#c2ffdf\",\n \"#ffb8d1\",\n \"#c5a3ff\",\n \"#f8f8f0\",\n]\ncursor_bg = \"#f8f8f0\"\ncursor_border = \"#f8f8f0\"\ncursor_fg = \"#060709\"\nforeground = \"#f8f8f2\"\nselection_bg = \"#8077a8\"\nselection_fg = \"#f6e1ce\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Fairyfloss\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), -("farmhouse-dark", "[colors]\nansi = [\n \"#1d2027\",\n \"#ba0004\",\n \"#549d00\",\n \"#c87300\",\n \"#0049e6\",\n \"#9f1b61\",\n \"#1fb65c\",\n \"#e8e4e1\",\n]\nbackground = \"#1d2027\"\nbrights = [\n \"#394047\",\n \"#eb0009\",\n \"#7ac100\",\n \"#ea9a00\",\n \"#006efe\",\n \"#bf3b7f\",\n \"#19e062\",\n \"#f4eef0\",\n]\ncursor_bg = \"#006efe\"\ncursor_border = \"#006efe\"\ncursor_fg = \"#e8e4e1\"\nforeground = \"#e8e4e1\"\nselection_bg = \"#4d5658\"\nselection_fg = \"#b3b1aa\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"farmhouse-dark\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"nightly builds only\"\n"), -("farmhouse-light", "[colors]\nansi = [\n \"#1d2027\",\n \"#8d0003\",\n \"#3a7d00\",\n \"#a95600\",\n \"#092ccd\",\n \"#820046\",\n \"#229256\",\n \"#e8e4e1\",\n]\nbackground = \"#e8e4e1\"\nbrights = [\n \"#394047\",\n \"#eb0009\",\n \"#7ac100\",\n \"#ea9a00\",\n \"#006efe\",\n \"#bf3b7f\",\n \"#19e062\",\n \"#f4eef0\",\n]\ncursor_bg = \"#006efe\"\ncursor_border = \"#006efe\"\ncursor_fg = \"#1d2027\"\nforeground = \"#1d2027\"\nselection_bg = \"#b3b1aa\"\nselection_fg = \"#4d5658\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"farmhouse-light\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"nightly builds only\"\n"), +("farmhouse-dark", "[colors]\nansi = [\n \"#1d2027\",\n \"#ba0004\",\n \"#549d00\",\n \"#c87300\",\n \"#0049e6\",\n \"#9f1b61\",\n \"#1fb65c\",\n \"#e8e4e1\",\n]\nbackground = \"#1d2027\"\nbrights = [\n \"#394047\",\n \"#eb0009\",\n \"#7ac100\",\n \"#ea9a00\",\n \"#006efe\",\n \"#bf3b7f\",\n \"#19e062\",\n \"#f4eef0\",\n]\ncursor_bg = \"#006efe\"\ncursor_border = \"#006efe\"\ncursor_fg = \"#e8e4e1\"\nforeground = \"#e8e4e1\"\nselection_bg = \"#4d5658\"\nselection_fg = \"#b3b1aa\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"farmhouse-dark\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), +("farmhouse-light", "[colors]\nansi = [\n \"#1d2027\",\n \"#8d0003\",\n \"#3a7d00\",\n \"#a95600\",\n \"#092ccd\",\n \"#820046\",\n \"#229256\",\n \"#e8e4e1\",\n]\nbackground = \"#e8e4e1\"\nbrights = [\n \"#394047\",\n \"#eb0009\",\n \"#7ac100\",\n \"#ea9a00\",\n \"#006efe\",\n \"#bf3b7f\",\n \"#19e062\",\n \"#f4eef0\",\n]\ncursor_bg = \"#006efe\"\ncursor_border = \"#006efe\"\ncursor_fg = \"#1d2027\"\nforeground = \"#1d2027\"\nselection_bg = \"#b3b1aa\"\nselection_fg = \"#4d5658\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"farmhouse-light\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), ("FarSide (terminal.sexy)", "[colors]\nansi = [\n \"#303030\",\n \"#a43261\",\n \"#006ca5\",\n \"#007086\",\n \"#6751a6\",\n \"#913e88\",\n \"#0061b1\",\n \"#c6c6c6\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#5e5e5e\",\n \"#ff9fc9\",\n \"#3bd6ff\",\n \"#00ddf4\",\n \"#d5b8ff\",\n \"#ffa7f6\",\n \"#93c9ff\",\n \"#ffffff\",\n]\nforeground = \"#919191\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"Baskerville\"\nname = \"FarSide (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Fideloper", "[colors]\nansi = [\n \"#292f33\",\n \"#cb1e2d\",\n \"#edb8ac\",\n \"#b7ab9b\",\n \"#2e78c2\",\n \"#c0236f\",\n \"#309186\",\n \"#eae3ce\",\n]\nbackground = \"#292f33\"\nbrights = [\n \"#092028\",\n \"#d4605a\",\n \"#d4605a\",\n \"#a86671\",\n \"#7c85c4\",\n \"#5c5db2\",\n \"#819090\",\n \"#fcf4df\",\n]\ncursor_bg = \"#d4605a\"\ncursor_border = \"#d4605a\"\ncursor_fg = \"#fefff2\"\nforeground = \"#dbdae0\"\nselection_bg = \"#efb8ac\"\nselection_fg = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Fideloper\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), -("Firefly Traditional", "[colors]\nansi = [\n \"#000000\",\n \"#c23720\",\n \"#33bc26\",\n \"#afad24\",\n \"#5a63ff\",\n \"#d53ad2\",\n \"#33bbc7\",\n \"#cccccc\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#828282\",\n \"#ff3b1e\",\n \"#2ee720\",\n \"#ecec16\",\n \"#838dff\",\n \"#ff5cfe\",\n \"#29f0f0\",\n \"#ebebeb\",\n]\ncursor_bg = \"#00f900\"\ncursor_border = \"#00f900\"\ncursor_fg = \"#ffffff\"\nforeground = \"#f5f5f5\"\nselection_bg = \"#cfeac6\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Firefly Traditional\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"nightly builds only\"\n"), +("Firefly Traditional", "[colors]\nansi = [\n \"#000000\",\n \"#c23720\",\n \"#33bc26\",\n \"#afad24\",\n \"#5a63ff\",\n \"#d53ad2\",\n \"#33bbc7\",\n \"#cccccc\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#828282\",\n \"#ff3b1e\",\n \"#2ee720\",\n \"#ecec16\",\n \"#838dff\",\n \"#ff5cfe\",\n \"#29f0f0\",\n \"#ebebeb\",\n]\ncursor_bg = \"#00f900\"\ncursor_border = \"#00f900\"\ncursor_fg = \"#ffffff\"\nforeground = \"#f5f5f5\"\nselection_bg = \"#cfeac6\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Firefly Traditional\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), ("FirefoxDev", "[colors]\nansi = [\n \"#002831\",\n \"#e63853\",\n \"#5eb83c\",\n \"#a57706\",\n \"#359ddf\",\n \"#d75cff\",\n \"#4b73a2\",\n \"#dcdcdc\",\n]\nbackground = \"#0e1011\"\nbrights = [\n \"#001e27\",\n \"#e1003f\",\n \"#1d9000\",\n \"#cd9409\",\n \"#006fc0\",\n \"#a200da\",\n \"#005794\",\n \"#e2e2e2\",\n]\ncursor_bg = \"#708284\"\ncursor_border = \"#708284\"\ncursor_fg = \"#002831\"\nforeground = \"#7c8fa4\"\nselection_bg = \"#163c61\"\nselection_fg = \"#f2f5f9\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"FirefoxDev\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Firewatch", "[colors]\nansi = [\n \"#585f6d\",\n \"#d95360\",\n \"#5ab977\",\n \"#dfb563\",\n \"#4d89c4\",\n \"#d55119\",\n \"#44a8b6\",\n \"#e6e5ff\",\n]\nbackground = \"#1e2027\"\nbrights = [\n \"#585f6d\",\n \"#d95360\",\n \"#5ab977\",\n \"#dfb563\",\n \"#4c89c5\",\n \"#d55119\",\n \"#44a8b6\",\n \"#e6e5ff\",\n]\ncursor_bg = \"#f6f7ec\"\ncursor_border = \"#f6f7ec\"\ncursor_fg = \"#c4c5b5\"\nforeground = \"#9ba2b2\"\nselection_bg = \"#2f363e\"\nselection_fg = \"#7d8fa4\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Firewatch\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Fishbone (terminal.sexy)", "[colors]\nansi = [\n \"#293b3b\",\n \"#bf5357\",\n \"#41a551\",\n \"#aea64f\",\n \"#416ea5\",\n \"#bf6053\",\n \"#714da5\",\n \"#876868\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#344040\",\n \"#bf6367\",\n \"#51a55f\",\n \"#aea75d\",\n \"#5177a5\",\n \"#bf6e63\",\n \"#7859a5\",\n \"#876f6f\",\n]\nforeground = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"\"\nname = \"Fishbone (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), @@ -344,8 +355,8 @@ pub const SCHEMES: [(&'static str, &'static str); 966] = [ ("Flat Remix (Gogh)", "[colors]\nansi = [\n \"#1f2229\",\n \"#d41919\",\n \"#5ebdab\",\n \"#fea44c\",\n \"#367bf0\",\n \"#bf2e5d\",\n \"#49aee6\",\n \"#e6e6e6\",\n]\nbackground = \"#272a34\"\nbrights = [\n \"#8c42ab\",\n \"#ec0101\",\n \"#47d4b9\",\n \"#ff8a18\",\n \"#277fff\",\n \"#d71655\",\n \"#05a1f7\",\n \"#ffffff\",\n]\ncursor_bg = \"#ffffff\"\ncursor_border = \"#ffffff\"\ncursor_fg = \"#272a34\"\nforeground = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"FlatRemix (Gogh)\"]\nname = \"Flat Remix (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Flatland", "[colors]\nansi = [\n \"#1d1d19\",\n \"#f18339\",\n \"#9fd364\",\n \"#f4ef6d\",\n \"#5096be\",\n \"#695abc\",\n \"#d63865\",\n \"#ffffff\",\n]\nbackground = \"#1d1f21\"\nbrights = [\n \"#1d1d19\",\n \"#d22a24\",\n \"#a7d42c\",\n \"#ff8949\",\n \"#61b9d0\",\n \"#695abc\",\n \"#d63865\",\n \"#ffffff\",\n]\ncursor_bg = \"#708284\"\ncursor_border = \"#708284\"\ncursor_fg = \"#002831\"\nforeground = \"#b8dbef\"\nselection_bg = \"#2b2a24\"\nselection_fg = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"Flatland (Gogh)\"]\nname = \"Flatland\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Flatland (Gogh)", "[colors]\nansi = [\n \"#1d1d19\",\n \"#f18339\",\n \"#9fd364\",\n \"#f4ef6d\",\n \"#5096be\",\n \"#695abc\",\n \"#d63865\",\n \"#ffffff\",\n]\nbackground = \"#1d1f21\"\nbrights = [\n \"#1d1d19\",\n \"#d22a24\",\n \"#a7d42c\",\n \"#ff8949\",\n \"#61b9d0\",\n \"#695abc\",\n \"#d63865\",\n \"#ffffff\",\n]\ncursor_bg = \"#b8dbef\"\ncursor_border = \"#b8dbef\"\ncursor_fg = \"#1d1f21\"\nforeground = \"#b8dbef\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Flatland (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), -("flexoki-dark", "[colors]\nansi = [\n \"#1c1b1a\",\n \"#d14d41\",\n \"#879a39\",\n \"#d0a215\",\n \"#4385be\",\n \"#ce5d97\",\n \"#3aa99f\",\n \"#b7b5ac\",\n]\nbackground = \"#1c1b1a\"\nbrights = [\n \"#575653\",\n \"#d14d41\",\n \"#879a39\",\n \"#d0a215\",\n \"#4385be\",\n \"#ce5d97\",\n \"#3aa99f\",\n \"#cecdc3\",\n]\ncursor_bg = \"#cecdc3\"\ncursor_border = \"#cecdc3\"\ncursor_fg = \"#1c1b1a\"\nforeground = \"#cecdc3\"\nselection_bg = \"#cecdc3\"\nselection_fg = \"#4385be\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"flexoki-dark\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"nightly builds only\"\n"), -("flexoki-light", "[colors]\nansi = [\n \"#100f0f\",\n \"#af3029\",\n \"#66800b\",\n \"#ad8301\",\n \"#205ea6\",\n \"#a02f6f\",\n \"#24837b\",\n \"#f2f0e5\",\n]\nbackground = \"#fffcf0\"\nbrights = [\n \"#575653\",\n \"#d14d41\",\n \"#879a39\",\n \"#d0a215\",\n \"#4385be\",\n \"#ce5d97\",\n \"#3aa99f\",\n \"#fffcf0\",\n]\ncursor_bg = \"#100f0f\"\ncursor_border = \"#100f0f\"\ncursor_fg = \"#fffcf0\"\nforeground = \"#100f0f\"\nselection_bg = \"#cecdc3\"\nselection_fg = \"#100f0f\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"flexoki-light\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"nightly builds only\"\n"), +("flexoki-dark", "[colors]\nansi = [\n \"#1c1b1a\",\n \"#d14d41\",\n \"#879a39\",\n \"#d0a215\",\n \"#4385be\",\n \"#ce5d97\",\n \"#3aa99f\",\n \"#b7b5ac\",\n]\nbackground = \"#1c1b1a\"\nbrights = [\n \"#575653\",\n \"#d14d41\",\n \"#879a39\",\n \"#d0a215\",\n \"#4385be\",\n \"#ce5d97\",\n \"#3aa99f\",\n \"#cecdc3\",\n]\ncursor_bg = \"#cecdc3\"\ncursor_border = \"#cecdc3\"\ncursor_fg = \"#1c1b1a\"\nforeground = \"#cecdc3\"\nselection_bg = \"#cecdc3\"\nselection_fg = \"#4385be\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"flexoki-dark\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), +("flexoki-light", "[colors]\nansi = [\n \"#100f0f\",\n \"#af3029\",\n \"#66800b\",\n \"#ad8301\",\n \"#205ea6\",\n \"#a02f6f\",\n \"#24837b\",\n \"#f2f0e5\",\n]\nbackground = \"#fffcf0\"\nbrights = [\n \"#575653\",\n \"#d14d41\",\n \"#879a39\",\n \"#d0a215\",\n \"#4385be\",\n \"#ce5d97\",\n \"#3aa99f\",\n \"#fffcf0\",\n]\ncursor_bg = \"#100f0f\"\ncursor_border = \"#100f0f\"\ncursor_fg = \"#fffcf0\"\nforeground = \"#100f0f\"\nselection_bg = \"#cecdc3\"\nselection_fg = \"#100f0f\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"flexoki-light\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), ("Floraverse", "[colors]\nansi = [\n \"#08002e\",\n \"#64002c\",\n \"#5d731a\",\n \"#cd751c\",\n \"#1d6da1\",\n \"#b7077e\",\n \"#42a38c\",\n \"#f3e0b8\",\n]\nbackground = \"#0e0d15\"\nbrights = [\n \"#331e4d\",\n \"#d02063\",\n \"#b4ce59\",\n \"#fac357\",\n \"#40a4cf\",\n \"#f12aae\",\n \"#62caa8\",\n \"#fff5db\",\n]\ncursor_bg = \"#bbbbbb\"\ncursor_border = \"#bbbbbb\"\ncursor_fg = \"#ffffff\"\nforeground = \"#dbd1b9\"\nselection_bg = \"#f3e0b8\"\nselection_fg = \"#08002e\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Floraverse\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("ForestBlue", "[colors]\nansi = [\n \"#333333\",\n \"#f8818e\",\n \"#92d3a2\",\n \"#1a8e63\",\n \"#8ed0ce\",\n \"#5e468c\",\n \"#31658c\",\n \"#e2d8cd\",\n]\nbackground = \"#051519\"\nbrights = [\n \"#3d3d3d\",\n \"#fb3d66\",\n \"#6bb48d\",\n \"#30c85a\",\n \"#39a7a2\",\n \"#7e62b3\",\n \"#6096bf\",\n \"#e2d8cd\",\n]\ncursor_bg = \"#9e9ecb\"\ncursor_border = \"#9e9ecb\"\ncursor_fg = \"#000000\"\nforeground = \"#e2d8cd\"\nselection_bg = \"#4d4d4d\"\nselection_fg = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"ForestBlue\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Foxnightly (Gogh)", "[colors]\nansi = [\n \"#2a2a2e\",\n \"#b98eff\",\n \"#ff7de9\",\n \"#729fcf\",\n \"#66a05b\",\n \"#75507b\",\n \"#acacae\",\n \"#ffffff\",\n]\nbackground = \"#2a2a2e\"\nbrights = [\n \"#a40000\",\n \"#bf4040\",\n \"#66a05b\",\n \"#ffb86c\",\n \"#729fcf\",\n \"#8f5902\",\n \"#c4a000\",\n \"#5c3566\",\n]\ncursor_bg = \"#d7d7db\"\ncursor_border = \"#d7d7db\"\ncursor_fg = \"#2a2a2e\"\nforeground = \"#d7d7db\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Foxnightly (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), @@ -366,7 +377,8 @@ pub const SCHEMES: [(&'static str, &'static str); 966] = [ ("Github (base16)", "[colors]\nansi = [\n \"#ffffff\",\n \"#ed6a43\",\n \"#183691\",\n \"#795da3\",\n \"#795da3\",\n \"#a71d5d\",\n \"#183691\",\n \"#333333\",\n]\nbackground = \"#ffffff\"\nbrights = [\n \"#969896\",\n \"#ed6a43\",\n \"#183691\",\n \"#795da3\",\n \"#795da3\",\n \"#a71d5d\",\n \"#183691\",\n \"#ffffff\",\n]\ncursor_bg = \"#333333\"\ncursor_border = \"#333333\"\ncursor_fg = \"#ffffff\"\nforeground = \"#333333\"\nselection_bg = \"#333333\"\nselection_fg = \"#ffffff\"\n\n[colors.indexed]\n16 = \"#0086b3\"\n17 = \"#333333\"\n18 = \"#f5f5f5\"\n19 = \"#c8c8fa\"\n20 = \"#e8e8e8\"\n21 = \"#ffffff\"\n\n[metadata]\naliases = []\nauthor = \"Defman21\"\nname = \"Github (base16)\"\norigin_url = \"https://github.com/Defman21/base16-github-scheme\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Github (Gogh)", "[colors]\nansi = [\n \"#3e3e3e\",\n \"#970b16\",\n \"#07962a\",\n \"#f8eec7\",\n \"#003e8a\",\n \"#e94691\",\n \"#89d1ec\",\n \"#ffffff\",\n]\nbackground = \"#f4f4f4\"\nbrights = [\n \"#666666\",\n \"#de0000\",\n \"#87d5a2\",\n \"#f1d007\",\n \"#2e6cba\",\n \"#ffa29f\",\n \"#1cfafe\",\n \"#ffffff\",\n]\ncursor_bg = \"#3e3e3e\"\ncursor_border = \"#3e3e3e\"\ncursor_fg = \"#f4f4f4\"\nforeground = \"#3e3e3e\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"Github Light (Gogh)\"]\nname = \"Github (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), ("GitHub Dark", "[colors]\nansi = [\n \"#000000\",\n \"#f78166\",\n \"#56d364\",\n \"#e3b341\",\n \"#6ca4f8\",\n \"#db61a2\",\n \"#2b7489\",\n \"#ffffff\",\n]\nbackground = \"#101216\"\nbrights = [\n \"#4d4d4d\",\n \"#f78166\",\n \"#56d364\",\n \"#e3b341\",\n \"#6ca4f8\",\n \"#db61a2\",\n \"#2b7489\",\n \"#ffffff\",\n]\ncursor_bg = \"#c9d1d9\"\ncursor_border = \"#c9d1d9\"\ncursor_fg = \"#101216\"\nforeground = \"#8b949e\"\nselection_bg = \"#3b5070\"\nselection_fg = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"GitHub Dark\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), -("Github Dark (Gogh)", "[colors]\nansi = [\n \"#000000\",\n \"#f78166\",\n \"#56d364\",\n \"#e3b341\",\n \"#6ca4f8\",\n \"#db61a2\",\n \"#2b7489\",\n \"#ffffff\",\n]\nbackground = \"#101216\"\nbrights = [\n \"#4d4d4d\",\n \"#f78166\",\n \"#56d364\",\n \"#e3b341\",\n \"#6ca4f8\",\n \"#db61a2\",\n \"#2b7489\",\n \"#ffffff\",\n]\ncursor_bg = \"#c9d1d9\"\ncursor_border = \"#c9d1d9\"\ncursor_fg = \"#101216\"\nforeground = \"#8b949e\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Github Dark (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"nightly builds only\"\n"), +("Github Dark (Gogh)", "[colors]\nansi = [\n \"#000000\",\n \"#f78166\",\n \"#56d364\",\n \"#e3b341\",\n \"#6ca4f8\",\n \"#db61a2\",\n \"#2b7489\",\n \"#ffffff\",\n]\nbackground = \"#101216\"\nbrights = [\n \"#4d4d4d\",\n \"#f78166\",\n \"#56d364\",\n \"#e3b341\",\n \"#6ca4f8\",\n \"#db61a2\",\n \"#2b7489\",\n \"#ffffff\",\n]\ncursor_bg = \"#c9d1d9\"\ncursor_border = \"#c9d1d9\"\ncursor_fg = \"#101216\"\nforeground = \"#8b949e\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Github Dark (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), +("Github Light (Gogh)", "[colors]\nansi = [\n \"#24292f\",\n \"#cf222e\",\n \"#1a7f37\",\n \"#9a6700\",\n \"#0969da\",\n \"#8250df\",\n \"#1b7c83\",\n \"#6e7781\",\n]\nbackground = \"#f6f8fa\"\nbrights = [\n \"#57606a\",\n \"#a40e26\",\n \"#2da44e\",\n \"#bf8700\",\n \"#218bff\",\n \"#a475f9\",\n \"#3192aa\",\n \"#8c959f\",\n]\ncursor_bg = \"#1f2328\"\ncursor_border = \"#1f2328\"\ncursor_fg = \"#f6f8fa\"\nforeground = \"#1f2328\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Github Light (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"nightly builds only\"\n"), ("GJM (terminal.sexy)", "[colors]\nansi = [\n \"#1c1c1c\",\n \"#ff005b\",\n \"#cee318\",\n \"#ffe755\",\n \"#048ac7\",\n \"#833c9f\",\n \"#0ac1cd\",\n \"#e5e5e5\",\n]\nbackground = \"#1c1c1c\"\nbrights = [\n \"#666666\",\n \"#ff00a0\",\n \"#ccff00\",\n \"#ff9f00\",\n \"#48c6ff\",\n \"#be67e1\",\n \"#63e7f0\",\n \"#f3f3f3\",\n]\nforeground = \"#c5c5c5\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"\"\nname = \"GJM (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Glacier", "[colors]\nansi = [\n \"#2e343c\",\n \"#bd0f2f\",\n \"#35a770\",\n \"#fb9435\",\n \"#1f5872\",\n \"#bd2523\",\n \"#778397\",\n \"#ffffff\",\n]\nbackground = \"#0c1115\"\nbrights = [\n \"#404a55\",\n \"#bd0f2f\",\n \"#49e998\",\n \"#fddf6e\",\n \"#2a8bc1\",\n \"#ea4727\",\n \"#a0b6d3\",\n \"#ffffff\",\n]\ncursor_bg = \"#6c6c6c\"\ncursor_border = \"#6c6c6c\"\ncursor_fg = \"#6c6c6c\"\nforeground = \"#ffffff\"\nselection_bg = \"#bd2523\"\nselection_fg = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Glacier\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Gnometerm (terminal.sexy)", "[colors]\nansi = [\n \"#000000\",\n \"#cc0000\",\n \"#4e9a06\",\n \"#c4a000\",\n \"#3465a4\",\n \"#75507b\",\n \"#06989a\",\n \"#d3d7cf\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#555753\",\n \"#ef2929\",\n \"#8ae234\",\n \"#fce94f\",\n \"#729fcf\",\n \"#ad7fa8\",\n \"#34e2e2\",\n \"#eeeeec\",\n]\nforeground = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"\"\nname = \"Gnometerm (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), @@ -470,13 +482,13 @@ pub const SCHEMES: [(&'static str, &'static str); 966] = [ ("Isotope (base16)", "[colors]\nansi = [\n \"#000000\",\n \"#ff0000\",\n \"#33ff00\",\n \"#ff0099\",\n \"#0066ff\",\n \"#cc00ff\",\n \"#00ffff\",\n \"#d0d0d0\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#808080\",\n \"#ff0000\",\n \"#33ff00\",\n \"#ff0099\",\n \"#0066ff\",\n \"#cc00ff\",\n \"#00ffff\",\n \"#ffffff\",\n]\ncursor_bg = \"#d0d0d0\"\ncursor_border = \"#d0d0d0\"\ncursor_fg = \"#000000\"\nforeground = \"#d0d0d0\"\nselection_bg = \"#d0d0d0\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n16 = \"#ff9900\"\n17 = \"#3300ff\"\n18 = \"#404040\"\n19 = \"#606060\"\n20 = \"#c0c0c0\"\n21 = \"#e0e0e0\"\n\n[metadata]\naliases = [\"Isotope (dark) (terminal.sexy)\"]\nauthor = \"Jan T. Sott\"\nname = \"Isotope (base16)\"\norigin_url = \"https://github.com/chriskempson/base16-unclaimed-schemes\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Isotope (dark) (terminal.sexy)", "[colors]\nansi = [\n \"#000000\",\n \"#ff0000\",\n \"#33ff00\",\n \"#ff0099\",\n \"#0066ff\",\n \"#cc00ff\",\n \"#00ffff\",\n \"#d0d0d0\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#808080\",\n \"#ff0000\",\n \"#33ff00\",\n \"#ff0099\",\n \"#0066ff\",\n \"#cc00ff\",\n \"#00ffff\",\n \"#ffffff\",\n]\nforeground = \"#d0d0d0\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"Chris Kempson\"\nname = \"Isotope (dark) (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), ("Isotope (light) (terminal.sexy)", "[colors]\nansi = [\n \"#000000\",\n \"#ff0000\",\n \"#33ff00\",\n \"#ff0099\",\n \"#0066ff\",\n \"#cc00ff\",\n \"#00ffff\",\n \"#d0d0d0\",\n]\nbackground = \"#ffffff\"\nbrights = [\n \"#808080\",\n \"#ff0000\",\n \"#33ff00\",\n \"#ff0099\",\n \"#0066ff\",\n \"#cc00ff\",\n \"#00ffff\",\n \"#ffffff\",\n]\nforeground = \"#606060\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"Chris Kempson\"\nname = \"Isotope (light) (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), -("iTerm2 Dark Background", "[colors]\nansi = [\n \"#000000\",\n \"#c91b00\",\n \"#00c200\",\n \"#c7c400\",\n \"#0225c7\",\n \"#ca30c7\",\n \"#00c5c7\",\n \"#c7c7c7\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#686868\",\n \"#ff6e67\",\n \"#5ffa68\",\n \"#fffc67\",\n \"#6871ff\",\n \"#ff77ff\",\n \"#60fdff\",\n \"#ffffff\",\n]\ncursor_bg = \"#c7c7c7\"\ncursor_border = \"#c7c7c7\"\ncursor_fg = \"#ffffff\"\nforeground = \"#c7c7c7\"\nselection_bg = \"#c1deff\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"iTerm2 Dark Background\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"nightly builds only\"\n"), -("iTerm2 Default", "[colors]\nansi = [\n \"#000000\",\n \"#c91b00\",\n \"#00c200\",\n \"#c7c400\",\n \"#2225c4\",\n \"#ca30c7\",\n \"#00c5c7\",\n \"#ffffff\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#686868\",\n \"#ff6e67\",\n \"#5ffa68\",\n \"#fffc67\",\n \"#6871ff\",\n \"#ff77ff\",\n \"#60fdff\",\n \"#ffffff\",\n]\ncursor_bg = \"#e6e6e6\"\ncursor_border = \"#e6e6e6\"\ncursor_fg = \"#000000\"\nforeground = \"#ffffff\"\nselection_bg = \"#c1deff\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"iTerm2 Default\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"nightly builds only\"\n"), -("iTerm2 Light Background", "[colors]\nansi = [\n \"#000000\",\n \"#c91b00\",\n \"#00c200\",\n \"#c7c400\",\n \"#0225c7\",\n \"#ca30c7\",\n \"#00c5c7\",\n \"#c7c7c7\",\n]\nbackground = \"#ffffff\"\nbrights = [\n \"#686868\",\n \"#ff6e67\",\n \"#5ffa68\",\n \"#fffc67\",\n \"#6871ff\",\n \"#ff77ff\",\n \"#60fdff\",\n \"#ffffff\",\n]\ncursor_bg = \"#000000\"\ncursor_border = \"#000000\"\ncursor_fg = \"#ffffff\"\nforeground = \"#000000\"\nselection_bg = \"#c1deff\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"iTerm2 Light Background\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"nightly builds only\"\n"), -("iTerm2 Pastel Dark Background", "[colors]\nansi = [\n \"#626262\",\n \"#ff8373\",\n \"#b4fb73\",\n \"#fffdc3\",\n \"#a5d5fe\",\n \"#ff90fe\",\n \"#d1d1fe\",\n \"#f1f1f1\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#8f8f8f\",\n \"#ffc4be\",\n \"#d6fcba\",\n \"#fffed5\",\n \"#c2e3ff\",\n \"#ffb2fe\",\n \"#e6e6fe\",\n \"#ffffff\",\n]\ncursor_bg = \"#ffb473\"\ncursor_border = \"#ffb473\"\ncursor_fg = \"#ffffff\"\nforeground = \"#c7c7c7\"\nselection_bg = \"#454d96\"\nselection_fg = \"#f4f4f4\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"iTerm2 Pastel Dark Background\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"nightly builds only\"\n"), -("iTerm2 Smoooooth", "[colors]\nansi = [\n \"#14191e\",\n \"#b43c2a\",\n \"#00c200\",\n \"#c7c400\",\n \"#2744c7\",\n \"#c040be\",\n \"#00c5c7\",\n \"#c7c7c7\",\n]\nbackground = \"#15191f\"\nbrights = [\n \"#686868\",\n \"#dd7975\",\n \"#58e790\",\n \"#ece100\",\n \"#a7abf2\",\n \"#e17ee1\",\n \"#60fdff\",\n \"#ffffff\",\n]\ncursor_bg = \"#ffffff\"\ncursor_border = \"#ffffff\"\ncursor_fg = \"#000000\"\nforeground = \"#dcdcdc\"\nselection_bg = \"#b3d7ff\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"iTerm2 Smoooooth\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"nightly builds only\"\n"), -("iTerm2 Tango Dark", "[colors]\nansi = [\n \"#000000\",\n \"#d81e00\",\n \"#5ea702\",\n \"#cfae00\",\n \"#427ab3\",\n \"#89658e\",\n \"#00a7aa\",\n \"#dbded8\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#686a66\",\n \"#f54235\",\n \"#99e343\",\n \"#fdeb61\",\n \"#84b0d8\",\n \"#bc94b7\",\n \"#37e6e8\",\n \"#f1f1f0\",\n]\ncursor_bg = \"#ffffff\"\ncursor_border = \"#ffffff\"\ncursor_fg = \"#000000\"\nforeground = \"#ffffff\"\nselection_bg = \"#c1deff\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"iTerm2 Tango Dark\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"nightly builds only\"\n"), -("iTerm2 Tango Light", "[colors]\nansi = [\n \"#000000\",\n \"#d81e00\",\n \"#5ea702\",\n \"#cfae00\",\n \"#427ab3\",\n \"#89658e\",\n \"#00a7aa\",\n \"#dbded8\",\n]\nbackground = \"#ffffff\"\nbrights = [\n \"#686a66\",\n \"#f54235\",\n \"#99e343\",\n \"#fdeb61\",\n \"#84b0d8\",\n \"#bc94b7\",\n \"#37e6e8\",\n \"#f1f1f0\",\n]\ncursor_bg = \"#000000\"\ncursor_border = \"#000000\"\ncursor_fg = \"#ffffff\"\nforeground = \"#000000\"\nselection_bg = \"#c1deff\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"iTerm2 Tango Light\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"nightly builds only\"\n"), +("iTerm2 Dark Background", "[colors]\nansi = [\n \"#000000\",\n \"#c91b00\",\n \"#00c200\",\n \"#c7c400\",\n \"#0225c7\",\n \"#ca30c7\",\n \"#00c5c7\",\n \"#c7c7c7\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#686868\",\n \"#ff6e67\",\n \"#5ffa68\",\n \"#fffc67\",\n \"#6871ff\",\n \"#ff77ff\",\n \"#60fdff\",\n \"#ffffff\",\n]\ncursor_bg = \"#c7c7c7\"\ncursor_border = \"#c7c7c7\"\ncursor_fg = \"#ffffff\"\nforeground = \"#c7c7c7\"\nselection_bg = \"#c1deff\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"iTerm2 Dark Background\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), +("iTerm2 Default", "[colors]\nansi = [\n \"#000000\",\n \"#c91b00\",\n \"#00c200\",\n \"#c7c400\",\n \"#2225c4\",\n \"#ca30c7\",\n \"#00c5c7\",\n \"#ffffff\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#686868\",\n \"#ff6e67\",\n \"#5ffa68\",\n \"#fffc67\",\n \"#6871ff\",\n \"#ff77ff\",\n \"#60fdff\",\n \"#ffffff\",\n]\ncursor_bg = \"#e6e6e6\"\ncursor_border = \"#e6e6e6\"\ncursor_fg = \"#000000\"\nforeground = \"#ffffff\"\nselection_bg = \"#c1deff\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"iTerm2 Default\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), +("iTerm2 Light Background", "[colors]\nansi = [\n \"#000000\",\n \"#c91b00\",\n \"#00c200\",\n \"#c7c400\",\n \"#0225c7\",\n \"#ca30c7\",\n \"#00c5c7\",\n \"#c7c7c7\",\n]\nbackground = \"#ffffff\"\nbrights = [\n \"#686868\",\n \"#ff6e67\",\n \"#5ffa68\",\n \"#fffc67\",\n \"#6871ff\",\n \"#ff77ff\",\n \"#60fdff\",\n \"#ffffff\",\n]\ncursor_bg = \"#000000\"\ncursor_border = \"#000000\"\ncursor_fg = \"#ffffff\"\nforeground = \"#000000\"\nselection_bg = \"#c1deff\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"iTerm2 Light Background\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), +("iTerm2 Pastel Dark Background", "[colors]\nansi = [\n \"#626262\",\n \"#ff8373\",\n \"#b4fb73\",\n \"#fffdc3\",\n \"#a5d5fe\",\n \"#ff90fe\",\n \"#d1d1fe\",\n \"#f1f1f1\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#8f8f8f\",\n \"#ffc4be\",\n \"#d6fcba\",\n \"#fffed5\",\n \"#c2e3ff\",\n \"#ffb2fe\",\n \"#e6e6fe\",\n \"#ffffff\",\n]\ncursor_bg = \"#ffb473\"\ncursor_border = \"#ffb473\"\ncursor_fg = \"#ffffff\"\nforeground = \"#c7c7c7\"\nselection_bg = \"#454d96\"\nselection_fg = \"#f4f4f4\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"iTerm2 Pastel Dark Background\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), +("iTerm2 Smoooooth", "[colors]\nansi = [\n \"#14191e\",\n \"#b43c2a\",\n \"#00c200\",\n \"#c7c400\",\n \"#2744c7\",\n \"#c040be\",\n \"#00c5c7\",\n \"#c7c7c7\",\n]\nbackground = \"#15191f\"\nbrights = [\n \"#686868\",\n \"#dd7975\",\n \"#58e790\",\n \"#ece100\",\n \"#a7abf2\",\n \"#e17ee1\",\n \"#60fdff\",\n \"#ffffff\",\n]\ncursor_bg = \"#ffffff\"\ncursor_border = \"#ffffff\"\ncursor_fg = \"#000000\"\nforeground = \"#dcdcdc\"\nselection_bg = \"#b3d7ff\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"iTerm2 Smoooooth\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), +("iTerm2 Tango Dark", "[colors]\nansi = [\n \"#000000\",\n \"#d81e00\",\n \"#5ea702\",\n \"#cfae00\",\n \"#427ab3\",\n \"#89658e\",\n \"#00a7aa\",\n \"#dbded8\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#686a66\",\n \"#f54235\",\n \"#99e343\",\n \"#fdeb61\",\n \"#84b0d8\",\n \"#bc94b7\",\n \"#37e6e8\",\n \"#f1f1f0\",\n]\ncursor_bg = \"#ffffff\"\ncursor_border = \"#ffffff\"\ncursor_fg = \"#000000\"\nforeground = \"#ffffff\"\nselection_bg = \"#c1deff\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"iTerm2 Tango Dark\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), +("iTerm2 Tango Light", "[colors]\nansi = [\n \"#000000\",\n \"#d81e00\",\n \"#5ea702\",\n \"#cfae00\",\n \"#427ab3\",\n \"#89658e\",\n \"#00a7aa\",\n \"#dbded8\",\n]\nbackground = \"#ffffff\"\nbrights = [\n \"#686a66\",\n \"#f54235\",\n \"#99e343\",\n \"#fdeb61\",\n \"#84b0d8\",\n \"#bc94b7\",\n \"#37e6e8\",\n \"#f1f1f0\",\n]\ncursor_bg = \"#000000\"\ncursor_border = \"#000000\"\ncursor_fg = \"#ffffff\"\nforeground = \"#000000\"\nselection_bg = \"#c1deff\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"iTerm2 Tango Light\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), ("Ivory Dark (terminal.sexy)", "[colors]\nansi = [\n \"#5b5955\",\n \"#c4756e\",\n \"#559a6a\",\n \"#9b8a4b\",\n \"#6a8dca\",\n \"#b577ac\",\n \"#019baa\",\n \"#dbdde2\",\n]\nbackground = \"#2d2c28\"\nbrights = [\n \"#707277\",\n \"#f6a299\",\n \"#82c896\",\n \"#cab775\",\n \"#98bbfb\",\n \"#e5a4db\",\n \"#53cad9\",\n \"#f7f9ff\",\n]\nforeground = \"#a4a6ab\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"Baskerville\"\nname = \"Ivory Dark (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Ivory Light (terminal.sexy)", "[colors]\nansi = [\n \"#c5c1b4\",\n \"#e75c58\",\n \"#00a250\",\n \"#a08a00\",\n \"#208ffb\",\n \"#d160c4\",\n \"#00a4c1\",\n \"#3e424d\",\n]\nbackground = \"#fef9ec\"\nbrights = [\n \"#a1a6b2\",\n \"#b22b31\",\n \"#007427\",\n \"#715f00\",\n \"#0065ca\",\n \"#a03196\",\n \"#007693\",\n \"#282c36\",\n]\nforeground = \"#6d727e\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"Baskerville\"\nname = \"Ivory Light (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Jackie Brown", "[colors]\nansi = [\n \"#2c1d16\",\n \"#ef5734\",\n \"#2baf2b\",\n \"#bebf00\",\n \"#246eb2\",\n \"#d05ec1\",\n \"#00acee\",\n \"#bfbfbf\",\n]\nbackground = \"#2c1d16\"\nbrights = [\n \"#666666\",\n \"#e50000\",\n \"#86a93e\",\n \"#e5e500\",\n \"#0000ff\",\n \"#e500e5\",\n \"#00e5e5\",\n \"#e5e5e5\",\n]\ncursor_bg = \"#23ff18\"\ncursor_border = \"#23ff18\"\ncursor_fg = \"#ff0018\"\nforeground = \"#ffcc2f\"\nselection_bg = \"#af8d21\"\nselection_fg = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\n \"Jackie Brown (Gogh)\",\n \"JackieBrown (Gogh)\",\n]\nname = \"Jackie Brown\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), @@ -492,6 +504,7 @@ pub const SCHEMES: [(&'static str, &'static str); 966] = [ ("Jup (Gogh)", "[colors]\nansi = [\n \"#000000\",\n \"#dd006f\",\n \"#6fdd00\",\n \"#dd6f00\",\n \"#006fdd\",\n \"#6f00dd\",\n \"#00dd6f\",\n \"#f2f2f2\",\n]\nbackground = \"#758480\"\nbrights = [\n \"#7d7d7d\",\n \"#ff74b9\",\n \"#b9ff74\",\n \"#ffb974\",\n \"#74b9ff\",\n \"#b974ff\",\n \"#74ffb9\",\n \"#ffffff\",\n]\ncursor_bg = \"#23476a\"\ncursor_border = \"#23476a\"\ncursor_fg = \"#758480\"\nforeground = \"#23476a\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Jup (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("JWR dark (terminal.sexy)", "[colors]\nansi = [\n \"#333333\",\n \"#8c4665\",\n \"#287373\",\n \"#7c7c99\",\n \"#395573\",\n \"#5e468c\",\n \"#31658c\",\n \"#899ca1\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#3d3d3d\",\n \"#bf4d80\",\n \"#53a6a6\",\n \"#9e9ecb\",\n \"#477ab3\",\n \"#7e62b3\",\n \"#6096bf\",\n \"#c0c0c0\",\n]\nforeground = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"\"\nname = \"JWR dark (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Kanagawa (Gogh)", "[colors]\nansi = [\n \"#090618\",\n \"#c34043\",\n \"#76946a\",\n \"#c0a36e\",\n \"#7e9cd8\",\n \"#957fb8\",\n \"#6a9589\",\n \"#dcd7ba\",\n]\nbackground = \"#1f1f28\"\nbrights = [\n \"#727169\",\n \"#e82424\",\n \"#98bb6c\",\n \"#e6c384\",\n \"#7fb4ca\",\n \"#938aa9\",\n \"#7aa89f\",\n \"#c8c093\",\n]\ncursor_bg = \"#dcd7ba\"\ncursor_border = \"#dcd7ba\"\ncursor_fg = \"#1f1f28\"\nforeground = \"#dcd7ba\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"kanagawa (Gogh)\"]\nname = \"Kanagawa (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230320-124340-559cb7b0\"\n"), +("Kanagawa Dragon (Gogh)", "[colors]\nansi = [\n \"#0d0c0c\",\n \"#c4746e\",\n \"#8a9a7b\",\n \"#c4b28a\",\n \"#8ba4b0\",\n \"#a292a3\",\n \"#8ea4a2\",\n \"#c8c093\",\n]\nbackground = \"#181616\"\nbrights = [\n \"#a6a69c\",\n \"#e46876\",\n \"#87a987\",\n \"#e6c384\",\n \"#7fb4ca\",\n \"#938aa9\",\n \"#7aa89f\",\n \"#c5c9c5\",\n]\ncursor_bg = \"#c8c093\"\ncursor_border = \"#c8c093\"\ncursor_fg = \"#181616\"\nforeground = \"#c5c9c5\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Kanagawa Dragon (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"nightly builds only\"\n"), ("kanagawabones", "[colors]\nansi = [\n \"#1f1f28\",\n \"#e46a78\",\n \"#98bc6d\",\n \"#e5c283\",\n \"#7eb3c9\",\n \"#957fb8\",\n \"#7eb3c9\",\n \"#ddd8bb\",\n]\nbackground = \"#1f1f28\"\nbrights = [\n \"#3c3c51\",\n \"#ec818c\",\n \"#9ec967\",\n \"#f1c982\",\n \"#7bc2df\",\n \"#a98fd2\",\n \"#7bc2df\",\n \"#a8a48d\",\n]\ncursor_bg = \"#e6e0c2\"\ncursor_border = \"#e6e0c2\"\ncursor_fg = \"#1f1f28\"\nforeground = \"#ddd8bb\"\nselection_bg = \"#49473e\"\nselection_fg = \"#ddd8bb\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"kanagawabones\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Kasugano (terminal.sexy)", "[colors]\nansi = [\n \"#3d3d3d\",\n \"#6673bf\",\n \"#3ea290\",\n \"#b0ead9\",\n \"#31658c\",\n \"#596196\",\n \"#8292b2\",\n \"#c8cacc\",\n]\nbackground = \"#1b1b1b\"\nbrights = [\n \"#4d4d4d\",\n \"#899aff\",\n \"#52ad91\",\n \"#98c9bb\",\n \"#477ab3\",\n \"#7882bf\",\n \"#95a7cc\",\n \"#edeff2\",\n]\nforeground = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"Kori Ayakashi\"\nname = \"Kasugano (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Kibble", "[colors]\nansi = [\n \"#4d4d4d\",\n \"#c70031\",\n \"#29cf13\",\n \"#d8e30e\",\n \"#3449d1\",\n \"#8400ff\",\n \"#0798ab\",\n \"#e2d1e3\",\n]\nbackground = \"#0e100a\"\nbrights = [\n \"#5a5a5a\",\n \"#f01578\",\n \"#6ce05c\",\n \"#f3f79e\",\n \"#97a4f7\",\n \"#c495f0\",\n \"#68f2e0\",\n \"#ffffff\",\n]\ncursor_bg = \"#9fda9c\"\ncursor_border = \"#9fda9c\"\ncursor_fg = \"#000000\"\nforeground = \"#f7f7f7\"\nselection_bg = \"#9ba787\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"Kibble (Gogh)\"]\nname = \"Kibble\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), @@ -552,24 +565,30 @@ pub const SCHEMES: [(&'static str, &'static str); 966] = [ ("Matrix (terminal.sexy)", "[colors]\nansi = [\n \"#000000\",\n \"#55ff55\",\n \"#00cc00\",\n \"#00cc00\",\n \"#005500\",\n \"#55ff55\",\n \"#00cc00\",\n \"#00cc00\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#000000\",\n \"#55ff55\",\n \"#55ff55\",\n \"#55ff55\",\n \"#005500\",\n \"#55ff55\",\n \"#55ff55\",\n \"#00cc00\",\n]\nforeground = \"#00cc00\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"OK100\"\nname = \"Matrix (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Medallion", "[colors]\nansi = [\n \"#000000\",\n \"#b64c00\",\n \"#7c8b16\",\n \"#d3bd26\",\n \"#616bb0\",\n \"#8c5a90\",\n \"#916c25\",\n \"#cac29a\",\n]\nbackground = \"#1d1908\"\nbrights = [\n \"#5e5219\",\n \"#ff9149\",\n \"#b2ca3b\",\n \"#ffe54a\",\n \"#acb8ff\",\n \"#ffa0ff\",\n \"#ffbc51\",\n \"#fed698\",\n]\ncursor_bg = \"#d3ba30\"\ncursor_border = \"#d3ba30\"\ncursor_fg = \"#d2bc3d\"\nforeground = \"#cac296\"\nselection_bg = \"#626dac\"\nselection_fg = \"#cac29a\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"Medallion (Gogh)\"]\nname = \"Medallion\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Medallion (Gogh)", "[colors]\nansi = [\n \"#000000\",\n \"#b64c00\",\n \"#7c8b16\",\n \"#d3bd26\",\n \"#616bb0\",\n \"#8c5a90\",\n \"#916c25\",\n \"#cac29a\",\n]\nbackground = \"#1d1908\"\nbrights = [\n \"#5e5219\",\n \"#ff9149\",\n \"#b2ca3b\",\n \"#ffe54a\",\n \"#acb8ff\",\n \"#ffa0ff\",\n \"#ffbc51\",\n \"#fed698\",\n]\ncursor_bg = \"#cac296\"\ncursor_border = \"#cac296\"\ncursor_fg = \"#1d1908\"\nforeground = \"#cac296\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Medallion (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), +("Mellifluous", "[colors]\nansi = [\n \"#1a1a1a\",\n \"#d29393\",\n \"#b3b393\",\n \"#cbaa89\",\n \"#a8a1be\",\n \"#b39fb0\",\n \"#c0af8c\",\n \"#dadada\",\n]\nbackground = \"#1a1a1a\"\nbrights = [\n \"#5b5b5b\",\n \"#c95954\",\n \"#828040\",\n \"#a6794c\",\n \"#5a6599\",\n \"#9c6995\",\n \"#74a39e\",\n \"#ffffff\",\n]\ncursor_bg = \"#bfad9e\"\ncursor_border = \"#bfad9e\"\ncursor_fg = \"#1a1a1a\"\nforeground = \"#dadada\"\nselection_bg = \"#2d2d2d\"\nselection_fg = \"#c0af8c\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"rektdeckard (http://github.com/rektdeckard)\"\nname = \"Mellifluous\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"nightly builds only\"\n"), ("Mellow Purple (base16)", "[colors]\nansi = [\n \"#1e0528\",\n \"#00d9e9\",\n \"#05cb0d\",\n \"#955ae7\",\n \"#550068\",\n \"#8991bb\",\n \"#b900b1\",\n \"#ffeeff\",\n]\nbackground = \"#1e0528\"\nbrights = [\n \"#320f55\",\n \"#00d9e9\",\n \"#05cb0d\",\n \"#955ae7\",\n \"#550068\",\n \"#8991bb\",\n \"#b900b1\",\n \"#f8c0ff\",\n]\ncursor_bg = \"#ffeeff\"\ncursor_border = \"#ffeeff\"\ncursor_fg = \"#1e0528\"\nforeground = \"#ffeeff\"\nselection_bg = \"#ffeeff\"\nselection_fg = \"#1e0528\"\n\n[colors.indexed]\n16 = \"#aa00a3\"\n17 = \"#4d6fff\"\n18 = \"#1a092d\"\n19 = \"#331354\"\n20 = \"#873582\"\n21 = \"#ffeeff\"\n\n[metadata]\naliases = []\nauthor = \"gidsi\"\nname = \"Mellow Purple (base16)\"\norigin_url = \"https://github.com/gidsi/base16-mellow-scheme\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Mexico Light (base16)", "[colors]\nansi = [\n \"#f8f8f8\",\n \"#ab4642\",\n \"#538947\",\n \"#f79a0e\",\n \"#7cafc2\",\n \"#96609e\",\n \"#4b8093\",\n \"#383838\",\n]\nbackground = \"#f8f8f8\"\nbrights = [\n \"#b8b8b8\",\n \"#ab4642\",\n \"#538947\",\n \"#f79a0e\",\n \"#7cafc2\",\n \"#96609e\",\n \"#4b8093\",\n \"#181818\",\n]\ncursor_bg = \"#383838\"\ncursor_border = \"#383838\"\ncursor_fg = \"#f8f8f8\"\nforeground = \"#383838\"\nselection_bg = \"#383838\"\nselection_fg = \"#f8f8f8\"\n\n[colors.indexed]\n16 = \"#dc9656\"\n17 = \"#a16946\"\n18 = \"#e8e8e8\"\n19 = \"#d8d8d8\"\n20 = \"#585858\"\n21 = \"#282828\"\n\n[metadata]\naliases = []\nauthor = \"Sheldon Johnson\"\nname = \"Mexico Light (base16)\"\norigin_url = \"https://github.com/drzel/base16-mexico-light-scheme\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("midnight-in-mojave", "[colors]\nansi = [\n \"#1e1e1e\",\n \"#ff453a\",\n \"#32d74b\",\n \"#ffd60a\",\n \"#0a84ff\",\n \"#bf5af2\",\n \"#5ac8fa\",\n \"#ffffff\",\n]\nbackground = \"#1e1e1e\"\nbrights = [\n \"#1e1e1e\",\n \"#ff453a\",\n \"#32d74b\",\n \"#ffd60a\",\n \"#0a84ff\",\n \"#bf5af2\",\n \"#5ac8fa\",\n \"#ffffff\",\n]\ncursor_bg = \"#32d74b\"\ncursor_border = \"#32d74b\"\ncursor_fg = \"#1c1c1c\"\nforeground = \"#ffffff\"\nselection_bg = \"#4a504d\"\nselection_fg = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"midnight-in-mojave\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Mikado (terminal.sexy)", "[colors]\nansi = [\n \"#322a2c\",\n \"#a04363\",\n \"#9b9329\",\n \"#bf7a29\",\n \"#6a8c8c\",\n \"#856774\",\n \"#757978\",\n \"#bcbcaf\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#46423b\",\n \"#ae837a\",\n \"#b4aa30\",\n \"#c7a551\",\n \"#74999e\",\n \"#9c818e\",\n \"#9fa590\",\n \"#c1c4bc\",\n]\nforeground = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"\"\nname = \"Mikado (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Mikazuki (terminal.sexy)", "[colors]\nansi = [\n \"#2a1d17\",\n \"#da1657\",\n \"#3ea250\",\n \"#e3d33d\",\n \"#3ea290\",\n \"#ff850d\",\n \"#8c16da\",\n \"#e9e9e9\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#4f362b\",\n \"#da4375\",\n \"#6cb87a\",\n \"#e3da84\",\n \"#8ca8a3\",\n \"#ffa64f\",\n \"#a167c7\",\n \"#fdfdfd\",\n]\nforeground = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"\"\nname = \"Mikazuki (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Mirage", "[colors]\nansi = [\n \"#011627\",\n \"#ff9999\",\n \"#85cc95\",\n \"#ffd700\",\n \"#7fb5ff\",\n \"#ddb3ff\",\n \"#21c7a8\",\n \"#ffffff\",\n]\nbackground = \"#1b2738\"\nbrights = [\n \"#575656\",\n \"#ff9999\",\n \"#85cc95\",\n \"#ffd700\",\n \"#7fb5ff\",\n \"#ddb3ff\",\n \"#85cc95\",\n \"#ffffff\",\n]\ncursor_bg = \"#ddb3ff\"\ncursor_border = \"#ddb3ff\"\ncursor_fg = \"#ffffff\"\nforeground = \"#a6b2c0\"\nselection_bg = \"#273951\"\nselection_fg = \"#d3dbe5\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Mirage\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), +("Miramare (Gogh)", "[colors]\nansi = [\n \"#242021\",\n \"#e68183\",\n \"#a7c080\",\n \"#d9bb80\",\n \"#89beba\",\n \"#d3a0bc\",\n \"#87c095\",\n \"#d8caac\",\n]\nbackground = \"#2a2426\"\nbrights = [\n \"#444444\",\n \"#e39b7b\",\n \"#a7c080\",\n \"#d9bb80\",\n \"#89beba\",\n \"#d3a0bc\",\n \"#87c095\",\n \"#e6d6ac\",\n]\ncursor_bg = \"#e6d6ac\"\ncursor_border = \"#e6d6ac\"\ncursor_fg = \"#2a2426\"\nforeground = \"#e6d6ac\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Miramare (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"nightly builds only\"\n"), ("Misterioso", "[colors]\nansi = [\n \"#000000\",\n \"#ff4242\",\n \"#74af68\",\n \"#ffad29\",\n \"#338f86\",\n \"#9414e6\",\n \"#23d7d7\",\n \"#e1e1e0\",\n]\nbackground = \"#2d3743\"\nbrights = [\n \"#555555\",\n \"#ff3242\",\n \"#74cd68\",\n \"#ffb929\",\n \"#23d7d7\",\n \"#ff37ff\",\n \"#00ede1\",\n \"#ffffff\",\n]\ncursor_bg = \"#000000\"\ncursor_border = \"#000000\"\ncursor_fg = \"#ffffff\"\nforeground = \"#e1e1e0\"\nselection_bg = \"#2d37ff\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"Misterioso (Gogh)\"]\nname = \"Misterioso\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Misterioso (Gogh)", "[colors]\nansi = [\n \"#000000\",\n \"#ff4242\",\n \"#74af68\",\n \"#ffad29\",\n \"#338f86\",\n \"#9414e6\",\n \"#23d7d7\",\n \"#e1e1e0\",\n]\nbackground = \"#2d3743\"\nbrights = [\n \"#555555\",\n \"#ff3242\",\n \"#74cd68\",\n \"#ffb929\",\n \"#23d7d7\",\n \"#ff37ff\",\n \"#00ede1\",\n \"#ffffff\",\n]\ncursor_bg = \"#e1e1e0\"\ncursor_border = \"#e1e1e0\"\ncursor_fg = \"#2d3743\"\nforeground = \"#e1e1e0\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Misterioso (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), ("Mocha (base16)", "[colors]\nansi = [\n \"#3b3228\",\n \"#cb6077\",\n \"#beb55b\",\n \"#f4bc87\",\n \"#8ab3b5\",\n \"#a89bb9\",\n \"#7bbda4\",\n \"#d0c8c6\",\n]\nbackground = \"#3b3228\"\nbrights = [\n \"#7e705a\",\n \"#cb6077\",\n \"#beb55b\",\n \"#f4bc87\",\n \"#8ab3b5\",\n \"#a89bb9\",\n \"#7bbda4\",\n \"#f5eeeb\",\n]\ncursor_bg = \"#d0c8c6\"\ncursor_border = \"#d0c8c6\"\ncursor_fg = \"#3b3228\"\nforeground = \"#d0c8c6\"\nselection_bg = \"#d0c8c6\"\nselection_fg = \"#3b3228\"\n\n[colors.indexed]\n16 = \"#d28b71\"\n17 = \"#bb9584\"\n18 = \"#534636\"\n19 = \"#645240\"\n20 = \"#b8afad\"\n21 = \"#e9e1dd\"\n\n[metadata]\naliases = [\"Mocha (dark) (terminal.sexy)\"]\nauthor = \"Chris Kempson (http://chriskempson.com)\"\nname = \"Mocha (base16)\"\norigin_url = \"https://github.com/chriskempson/base16-default-schemes\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Mocha (dark) (terminal.sexy)", "[colors]\nansi = [\n \"#3b3228\",\n \"#cb6077\",\n \"#beb55b\",\n \"#f4bc87\",\n \"#8ab3b5\",\n \"#a89bb9\",\n \"#7bbda4\",\n \"#d0c8c6\",\n]\nbackground = \"#3b3228\"\nbrights = [\n \"#7e705a\",\n \"#cb6077\",\n \"#beb55b\",\n \"#f4bc87\",\n \"#8ab3b5\",\n \"#a89bb9\",\n \"#7bbda4\",\n \"#f5eeeb\",\n]\nforeground = \"#d0c8c6\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"Chris Kempson\"\nname = \"Mocha (dark) (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), ("Mocha (light) (terminal.sexy)", "[colors]\nansi = [\n \"#3b3228\",\n \"#cb6077\",\n \"#beb55b\",\n \"#f4bc87\",\n \"#8ab3b5\",\n \"#a89bb9\",\n \"#7bbda4\",\n \"#d0c8c6\",\n]\nbackground = \"#f5eeeb\"\nbrights = [\n \"#7e705a\",\n \"#cb6077\",\n \"#beb55b\",\n \"#f4bc87\",\n \"#8ab3b5\",\n \"#a89bb9\",\n \"#7bbda4\",\n \"#f5eeeb\",\n]\nforeground = \"#645240\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"Chris Kempson\"\nname = \"Mocha (light) (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), +("Modus Operandi (Gogh)", "[colors]\nansi = [\n \"#ffffff\",\n \"#a60000\",\n \"#006800\",\n \"#6f5500\",\n \"#0031a9\",\n \"#721045\",\n \"#005e8b\",\n \"#000000\",\n]\nbackground = \"#ffffff\"\nbrights = [\n \"#f2f2f2\",\n \"#d00000\",\n \"#008900\",\n \"#808000\",\n \"#0000ff\",\n \"#dd22dd\",\n \"#008899\",\n \"#595959\",\n]\ncursor_bg = \"#000000\"\ncursor_border = \"#000000\"\ncursor_fg = \"#ffffff\"\nforeground = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Modus Operandi (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"nightly builds only\"\n"), +("Modus Operandi Tinted (Gogh)", "[colors]\nansi = [\n \"#fbf7f0\",\n \"#a60000\",\n \"#006800\",\n \"#6f5500\",\n \"#0031a9\",\n \"#721045\",\n \"#005e8b\",\n \"#000000\",\n]\nbackground = \"#fbf7f0\"\nbrights = [\n \"#efe9dd\",\n \"#d00000\",\n \"#008900\",\n \"#808000\",\n \"#0000ff\",\n \"#dd22dd\",\n \"#008899\",\n \"#595959\",\n]\ncursor_bg = \"#000000\"\ncursor_border = \"#000000\"\ncursor_fg = \"#fbf7f0\"\nforeground = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Modus Operandi Tinted (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"nightly builds only\"\n"), +("Modus Vivendi (Gogh)", "[colors]\nansi = [\n \"#000000\",\n \"#ff5f59\",\n \"#44bc44\",\n \"#d0bc00\",\n \"#2fafff\",\n \"#feacd0\",\n \"#00d3d0\",\n \"#ffffff\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#1e1e1e\",\n \"#ff5f5f\",\n \"#44df44\",\n \"#efef00\",\n \"#338fff\",\n \"#ff66ff\",\n \"#00eff0\",\n \"#989898\",\n]\ncursor_bg = \"#ffffff\"\ncursor_border = \"#ffffff\"\ncursor_fg = \"#000000\"\nforeground = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Modus Vivendi (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"nightly builds only\"\n"), +("Modus Vivendi Tinted (Gogh)", "[colors]\nansi = [\n \"#0d0e1c\",\n \"#ff5f59\",\n \"#44bc44\",\n \"#d0bc00\",\n \"#2fafff\",\n \"#feacd0\",\n \"#00d3d0\",\n \"#ffffff\",\n]\nbackground = \"#0d0e1c\"\nbrights = [\n \"#1d2235\",\n \"#ff5f5f\",\n \"#44df44\",\n \"#efef00\",\n \"#338fff\",\n \"#ff66ff\",\n \"#00eff0\",\n \"#989898\",\n]\ncursor_bg = \"#ffffff\"\ncursor_border = \"#ffffff\"\ncursor_fg = \"#0d0e1c\"\nforeground = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Modus Vivendi Tinted (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"nightly builds only\"\n"), ("Modus-Operandi", "[colors]\nansi = [\n \"#f2f2f2\",\n \"#a60000\",\n \"#006800\",\n \"#6f5500\",\n \"#0031a9\",\n \"#721045\",\n \"#005e8b\",\n \"#000000\",\n]\nbackground = \"#ffffff\"\nbrights = [\n \"#c4c4c4\",\n \"#a0132f\",\n \"#00663f\",\n \"#7a4f2f\",\n \"#0000b0\",\n \"#531ab6\",\n \"#005f5f\",\n \"#595959\",\n]\ncursor_bg = \"#000000\"\ncursor_border = \"#000000\"\ncursor_fg = \"#ffffff\"\nforeground = \"#000000\"\nselection_bg = \"#bdbdbd\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Modus-Operandi\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/modus-operandi-theme.el\"\nwezterm_version = \"20230408-112425-69ae8472\"\n"), -("Modus-Operandi-Deuteranopia", "[colors]\nansi = [\n \"#f2f2f2\",\n \"#a60000\",\n \"#006800\",\n \"#695500\",\n \"#0031a9\",\n \"#721045\",\n \"#005e8b\",\n \"#000000\",\n]\nbackground = \"#ffffff\"\nbrights = [\n \"#c4c4c4\",\n \"#a0132f\",\n \"#00663f\",\n \"#77492f\",\n \"#0000b0\",\n \"#531ab6\",\n \"#005f5f\",\n \"#595959\",\n]\ncursor_bg = \"#000000\"\ncursor_border = \"#000000\"\ncursor_fg = \"#ffffff\"\nforeground = \"#000000\"\nselection_bg = \"#bdbdbd\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"Modus-Operandi-Tritanopia\"]\nauthor = \"anhsirk0\"\nname = \"Modus-Operandi-Deuteranopia\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/modus-operandi-deuteranopia-theme.el\"\nwezterm_version = \"nightly builds only\"\n"), -("Modus-Operandi-Tinted", "[colors]\nansi = [\n \"#efe9dd\",\n \"#a60000\",\n \"#006800\",\n \"#6f5500\",\n \"#0031a9\",\n \"#721045\",\n \"#005e8b\",\n \"#000000\",\n]\nbackground = \"#fbf7f0\"\nbrights = [\n \"#c9b9b0\",\n \"#a0132f\",\n \"#00663f\",\n \"#7a4f2f\",\n \"#0000b0\",\n \"#531ab6\",\n \"#005f5f\",\n \"#595959\",\n]\ncursor_bg = \"#000000\"\ncursor_border = \"#000000\"\ncursor_fg = \"#fbf7f0\"\nforeground = \"#000000\"\nselection_bg = \"#c2bcb5\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Modus-Operandi-Tinted\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/modus-operandi-tinted-theme.el\"\nwezterm_version = \"nightly builds only\"\n"), +("Modus-Operandi-Deuteranopia", "[colors]\nansi = [\n \"#f2f2f2\",\n \"#a60000\",\n \"#006800\",\n \"#695500\",\n \"#0031a9\",\n \"#721045\",\n \"#005e8b\",\n \"#000000\",\n]\nbackground = \"#ffffff\"\nbrights = [\n \"#c4c4c4\",\n \"#a0132f\",\n \"#00663f\",\n \"#77492f\",\n \"#0000b0\",\n \"#531ab6\",\n \"#005f5f\",\n \"#595959\",\n]\ncursor_bg = \"#000000\"\ncursor_border = \"#000000\"\ncursor_fg = \"#ffffff\"\nforeground = \"#000000\"\nselection_bg = \"#bdbdbd\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"Modus-Operandi-Tritanopia\"]\nauthor = \"anhsirk0\"\nname = \"Modus-Operandi-Deuteranopia\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/modus-operandi-deuteranopia-theme.el\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), +("Modus-Operandi-Tinted", "[colors]\nansi = [\n \"#efe9dd\",\n \"#a60000\",\n \"#006800\",\n \"#6f5500\",\n \"#0031a9\",\n \"#721045\",\n \"#005e8b\",\n \"#000000\",\n]\nbackground = \"#fbf7f0\"\nbrights = [\n \"#c9b9b0\",\n \"#a0132f\",\n \"#00663f\",\n \"#7a4f2f\",\n \"#0000b0\",\n \"#531ab6\",\n \"#005f5f\",\n \"#595959\",\n]\ncursor_bg = \"#000000\"\ncursor_border = \"#000000\"\ncursor_fg = \"#fbf7f0\"\nforeground = \"#000000\"\nselection_bg = \"#c2bcb5\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Modus-Operandi-Tinted\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/modus-operandi-tinted-theme.el\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), ("Modus-Vivendi", "[colors]\nansi = [\n \"#1e1e1e\",\n \"#ff5f59\",\n \"#44bc44\",\n \"#d0bc00\",\n \"#2fafff\",\n \"#feacd0\",\n \"#00d3d0\",\n \"#ffffff\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#535353\",\n \"#ff7f9f\",\n \"#00c06f\",\n \"#dfaf7a\",\n \"#00bcff\",\n \"#b6a0ff\",\n \"#6ae4b9\",\n \"#989898\",\n]\ncursor_bg = \"#ffffff\"\ncursor_border = \"#ffffff\"\ncursor_fg = \"#000000\"\nforeground = \"#ffffff\"\nselection_bg = \"#5a5a5a\"\nselection_fg = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Modus-Vivendi\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/modus-vivendi-theme.el\"\nwezterm_version = \"20230408-112425-69ae8472\"\n"), -("Modus-Vivendi-Deuteranopia", "[colors]\nansi = [\n \"#1e1e1e\",\n \"#ff5f59\",\n \"#44bc44\",\n \"#cabf00\",\n \"#2fafff\",\n \"#feacd0\",\n \"#00d3d0\",\n \"#ffffff\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#535353\",\n \"#ff7f9f\",\n \"#00c06f\",\n \"#d8af7a\",\n \"#00bcff\",\n \"#b6a0ff\",\n \"#6ae4b9\",\n \"#989898\",\n]\ncursor_bg = \"#ffffff\"\ncursor_border = \"#ffffff\"\ncursor_fg = \"#000000\"\nforeground = \"#ffffff\"\nselection_bg = \"#5a5a5a\"\nselection_fg = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Modus-Vivendi-Deuteranopia\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/modus-vivendi-deuteranopia-theme.el\"\nwezterm_version = \"nightly builds only\"\n"), -("Modus-Vivendi-Tinted", "[colors]\nansi = [\n \"#1d2235\",\n \"#ff5f59\",\n \"#44bc44\",\n \"#d0bc00\",\n \"#2fafff\",\n \"#feacd0\",\n \"#00d3d0\",\n \"#ffffff\",\n]\nbackground = \"#0d0e1c\"\nbrights = [\n \"#4a4f69\",\n \"#ff7f9f\",\n \"#00c06f\",\n \"#dfaf7a\",\n \"#00bcff\",\n \"#b6a0ff\",\n \"#6ae4b9\",\n \"#989898\",\n]\ncursor_bg = \"#ffffff\"\ncursor_border = \"#ffffff\"\ncursor_fg = \"#0d0e1c\"\nforeground = \"#ffffff\"\nselection_bg = \"#555a66\"\nselection_fg = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Modus-Vivendi-Tinted\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/modus-vivendi-tinted-theme.el\"\nwezterm_version = \"nightly builds only\"\n"), -("Modus-Vivendi-Tritanopia", "[colors]\nansi = [\n \"#1e1e1e\",\n \"#ff5f59\",\n \"#44bc44\",\n \"#cabf00\",\n \"#2fafff\",\n \"#feacd0\",\n \"#00d3d0\",\n \"#ffffff\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#535353\",\n \"#ff6f9f\",\n \"#00c06f\",\n \"#d8af7a\",\n \"#00bcff\",\n \"#b6a0ff\",\n \"#6ae4b9\",\n \"#989898\",\n]\ncursor_bg = \"#ffffff\"\ncursor_border = \"#ffffff\"\ncursor_fg = \"#000000\"\nforeground = \"#ffffff\"\nselection_bg = \"#5a5a5a\"\nselection_fg = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Modus-Vivendi-Tritanopia\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/modus-vivendi-tritanopia-theme.el\"\nwezterm_version = \"nightly builds only\"\n"), +("Modus-Vivendi-Deuteranopia", "[colors]\nansi = [\n \"#1e1e1e\",\n \"#ff5f59\",\n \"#44bc44\",\n \"#cabf00\",\n \"#2fafff\",\n \"#feacd0\",\n \"#00d3d0\",\n \"#ffffff\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#535353\",\n \"#ff7f9f\",\n \"#00c06f\",\n \"#d8af7a\",\n \"#00bcff\",\n \"#b6a0ff\",\n \"#6ae4b9\",\n \"#989898\",\n]\ncursor_bg = \"#ffffff\"\ncursor_border = \"#ffffff\"\ncursor_fg = \"#000000\"\nforeground = \"#ffffff\"\nselection_bg = \"#5a5a5a\"\nselection_fg = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Modus-Vivendi-Deuteranopia\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/modus-vivendi-deuteranopia-theme.el\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), +("Modus-Vivendi-Tinted", "[colors]\nansi = [\n \"#1d2235\",\n \"#ff5f59\",\n \"#44bc44\",\n \"#d0bc00\",\n \"#2fafff\",\n \"#feacd0\",\n \"#00d3d0\",\n \"#ffffff\",\n]\nbackground = \"#0d0e1c\"\nbrights = [\n \"#4a4f69\",\n \"#ff7f9f\",\n \"#00c06f\",\n \"#dfaf7a\",\n \"#00bcff\",\n \"#b6a0ff\",\n \"#6ae4b9\",\n \"#989898\",\n]\ncursor_bg = \"#ffffff\"\ncursor_border = \"#ffffff\"\ncursor_fg = \"#0d0e1c\"\nforeground = \"#ffffff\"\nselection_bg = \"#555a66\"\nselection_fg = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Modus-Vivendi-Tinted\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/modus-vivendi-tinted-theme.el\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), +("Modus-Vivendi-Tritanopia", "[colors]\nansi = [\n \"#1e1e1e\",\n \"#ff5f59\",\n \"#44bc44\",\n \"#cabf00\",\n \"#2fafff\",\n \"#feacd0\",\n \"#00d3d0\",\n \"#ffffff\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#535353\",\n \"#ff6f9f\",\n \"#00c06f\",\n \"#d8af7a\",\n \"#00bcff\",\n \"#b6a0ff\",\n \"#6ae4b9\",\n \"#989898\",\n]\ncursor_bg = \"#ffffff\"\ncursor_border = \"#ffffff\"\ncursor_fg = \"#000000\"\nforeground = \"#ffffff\"\nselection_bg = \"#5a5a5a\"\nselection_fg = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"anhsirk0\"\nname = \"Modus-Vivendi-Tritanopia\"\norigin_url = \"https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/modus-vivendi-tritanopia-theme.el\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), ("Molokai", "[colors]\nansi = [\n \"#121212\",\n \"#fa2573\",\n \"#98e123\",\n \"#dfd460\",\n \"#1080d0\",\n \"#8700ff\",\n \"#43a8d0\",\n \"#bbbbbb\",\n]\nbackground = \"#121212\"\nbrights = [\n \"#555555\",\n \"#f6669d\",\n \"#b1e05f\",\n \"#fff26d\",\n \"#00afff\",\n \"#af87ff\",\n \"#51ceff\",\n \"#ffffff\",\n]\ncursor_bg = \"#bbbbbb\"\ncursor_border = \"#bbbbbb\"\ncursor_fg = \"#ffffff\"\nforeground = \"#bbbbbb\"\nselection_bg = \"#b5d5ff\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Molokai\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Molokai (Gogh)", "[colors]\nansi = [\n \"#1b1d1e\",\n \"#7325fa\",\n \"#23e298\",\n \"#60d4df\",\n \"#d08010\",\n \"#ff0087\",\n \"#d0a843\",\n \"#bbbbbb\",\n]\nbackground = \"#1b1d1e\"\nbrights = [\n \"#555555\",\n \"#9d66f6\",\n \"#5fe0b1\",\n \"#6df2ff\",\n \"#ffaf00\",\n \"#ff87af\",\n \"#ffce51\",\n \"#ffffff\",\n]\ncursor_bg = \"#bbbbbb\"\ncursor_border = \"#bbbbbb\"\ncursor_fg = \"#1b1d1e\"\nforeground = \"#bbbbbb\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Molokai (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Mona Lisa (Gogh)", "[colors]\nansi = [\n \"#351b0e\",\n \"#9b291c\",\n \"#636232\",\n \"#c36e28\",\n \"#515c5d\",\n \"#9b1d29\",\n \"#588056\",\n \"#f7d75c\",\n]\nbackground = \"#120b0d\"\nbrights = [\n \"#874228\",\n \"#ff4331\",\n \"#b4b264\",\n \"#ff9566\",\n \"#9eb2b4\",\n \"#ff5b6a\",\n \"#8acd8f\",\n \"#ffe598\",\n]\ncursor_bg = \"#f7d66a\"\ncursor_border = \"#f7d66a\"\ncursor_fg = \"#120b0d\"\nforeground = \"#f7d66a\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Mona Lisa (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), @@ -593,7 +612,7 @@ pub const SCHEMES: [(&'static str, &'static str); 966] = [ ("Monokai Soda", "[colors]\nansi = [\n \"#1a1a1a\",\n \"#f4005f\",\n \"#98e024\",\n \"#fa8419\",\n \"#9d65ff\",\n \"#f4005f\",\n \"#58d1eb\",\n \"#c4c5b5\",\n]\nbackground = \"#1a1a1a\"\nbrights = [\n \"#625e4c\",\n \"#f4005f\",\n \"#98e024\",\n \"#e0d561\",\n \"#9d65ff\",\n \"#f4005f\",\n \"#58d1eb\",\n \"#f6f6ef\",\n]\ncursor_bg = \"#f6f7ec\"\ncursor_border = \"#f6f7ec\"\ncursor_fg = \"#c4c5b5\"\nforeground = \"#c4c5b5\"\nselection_bg = \"#343434\"\nselection_fg = \"#c4c5b5\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\n \"Monokai Soda (Gogh)\",\n \"MonokaiSoda (Gogh)\",\n]\nname = \"Monokai Soda\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Monokai Soda (Gogh)", "[colors]\nansi = [\n \"#1a1a1a\",\n \"#f4005f\",\n \"#98e024\",\n \"#fa8419\",\n \"#9d65ff\",\n \"#f4005f\",\n \"#58d1eb\",\n \"#c4c5b5\",\n]\nbackground = \"#1a1a1a\"\nbrights = [\n \"#625e4c\",\n \"#f4005f\",\n \"#98e024\",\n \"#e0d561\",\n \"#9d65ff\",\n \"#f4005f\",\n \"#58d1eb\",\n \"#f6f6ef\",\n]\ncursor_bg = \"#c4c5b5\"\ncursor_border = \"#c4c5b5\"\ncursor_fg = \"#1a1a1a\"\nforeground = \"#c4c5b5\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Monokai Soda (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), ("Monokai Vivid", "[colors]\nansi = [\n \"#121212\",\n \"#fa2934\",\n \"#98e123\",\n \"#fff30a\",\n \"#0443ff\",\n \"#f800f8\",\n \"#01b6ed\",\n \"#ffffff\",\n]\nbackground = \"#121212\"\nbrights = [\n \"#838383\",\n \"#f6669d\",\n \"#b1e05f\",\n \"#fff26d\",\n \"#0443ff\",\n \"#f200f6\",\n \"#51ceff\",\n \"#ffffff\",\n]\ncursor_bg = \"#fb0007\"\ncursor_border = \"#fb0007\"\ncursor_fg = \"#ea0009\"\nforeground = \"#f9f9f9\"\nselection_bg = \"#ffffff\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Monokai Vivid\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), -("Moonfly (Gogh)", "[colors]\nansi = [\n \"#323437\",\n \"#ff5454\",\n \"#8cc85f\",\n \"#e3c78a\",\n \"#80a0ff\",\n \"#cf87e8\",\n \"#79dac8\",\n \"#c6c6c6\",\n]\nbackground = \"#080808\"\nbrights = [\n \"#949494\",\n \"#ff5189\",\n \"#36c692\",\n \"#c2c292\",\n \"#74b2ff\",\n \"#ae81ff\",\n \"#85dc85\",\n \"#e4e4e4\",\n]\ncursor_bg = \"#9e9e9e\"\ncursor_border = \"#9e9e9e\"\ncursor_fg = \"#080808\"\nforeground = \"#bdbdbd\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Moonfly (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"nightly builds only\"\n"), +("Moonfly (Gogh)", "[colors]\nansi = [\n \"#323437\",\n \"#ff5454\",\n \"#8cc85f\",\n \"#e3c78a\",\n \"#80a0ff\",\n \"#cf87e8\",\n \"#79dac8\",\n \"#c6c6c6\",\n]\nbackground = \"#080808\"\nbrights = [\n \"#949494\",\n \"#ff5189\",\n \"#36c692\",\n \"#c2c292\",\n \"#74b2ff\",\n \"#ae81ff\",\n \"#85dc85\",\n \"#e4e4e4\",\n]\ncursor_bg = \"#9e9e9e\"\ncursor_border = \"#9e9e9e\"\ncursor_fg = \"#080808\"\nforeground = \"#bdbdbd\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Moonfly (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), ("Morada (Gogh)", "[colors]\nansi = [\n \"#040404\",\n \"#0f49c4\",\n \"#48b117\",\n \"#e87324\",\n \"#bc0116\",\n \"#665b93\",\n \"#70a699\",\n \"#f5dcbe\",\n]\nbackground = \"#211f46\"\nbrights = [\n \"#4f7cbf\",\n \"#1c96c7\",\n \"#3bff6f\",\n \"#efc31c\",\n \"#fb605b\",\n \"#975b5a\",\n \"#1eff8e\",\n \"#f6f5fb\",\n]\ncursor_bg = \"#ffffff\"\ncursor_border = \"#ffffff\"\ncursor_fg = \"#211f46\"\nforeground = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Morada (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Mostly Bright (terminal.sexy)", "[colors]\nansi = [\n \"#d3d3d3\",\n \"#ef6b7b\",\n \"#a1d569\",\n \"#f59335\",\n \"#4ec2e8\",\n \"#fec7cd\",\n \"#95c1c0\",\n \"#707070\",\n]\nbackground = \"#f3f3f3\"\nbrights = [\n \"#b3b3b3\",\n \"#ed5466\",\n \"#afdb80\",\n \"#f59335\",\n \"#5dc7ea\",\n \"#d2a4b4\",\n \"#75a1a0\",\n \"#909090\",\n]\nforeground = \"#707070\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"m83\"\nname = \"Mostly Bright (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Muse (terminal.sexy)", "[colors]\nansi = [\n \"#2e3436\",\n \"#a31604\",\n \"#447241\",\n \"#c1951a\",\n \"#425387\",\n \"#965d98\",\n \"#06989a\",\n \"#d3d7cf\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#555753\",\n \"#c60001\",\n \"#27a343\",\n \"#d5a30e\",\n \"#4a5a8d\",\n \"#893c8c\",\n \"#12bccb\",\n \"#eeeeec\",\n]\nforeground = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"\"\nname = \"Muse (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), @@ -615,7 +634,7 @@ pub const SCHEMES: [(&'static str, &'static str); 966] = [ ("Neutron (Gogh)", "[colors]\nansi = [\n \"#23252b\",\n \"#b54036\",\n \"#5ab977\",\n \"#deb566\",\n \"#6a7c93\",\n \"#a4799d\",\n \"#3f94a8\",\n \"#e6e8ef\",\n]\nbackground = \"#1c1e22\"\nbrights = [\n \"#23252b\",\n \"#b54036\",\n \"#5ab977\",\n \"#deb566\",\n \"#6a7c93\",\n \"#a4799d\",\n \"#3f94a8\",\n \"#ebedf2\",\n]\ncursor_bg = \"#e6e8ef\"\ncursor_border = \"#e6e8ef\"\ncursor_fg = \"#1c1e22\"\nforeground = \"#e6e8ef\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Neutron (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), ("Night Owl (Gogh)", "[colors]\nansi = [\n \"#011627\",\n \"#ef5350\",\n \"#22da6e\",\n \"#addb67\",\n \"#82aaff\",\n \"#c792ea\",\n \"#21c7a8\",\n \"#ffffff\",\n]\nbackground = \"#011627\"\nbrights = [\n \"#575656\",\n \"#ef5350\",\n \"#22da6e\",\n \"#ffeb95\",\n \"#82aaff\",\n \"#c792ea\",\n \"#7fdbca\",\n \"#ffffff\",\n]\ncursor_bg = \"#d6deeb\"\ncursor_border = \"#d6deeb\"\ncursor_fg = \"#011627\"\nforeground = \"#d6deeb\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"NightOwl (Gogh)\"]\nname = \"Night Owl (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Night Owlish Light", "[colors]\nansi = [\n \"#011627\",\n \"#d3423e\",\n \"#2aa298\",\n \"#daaa01\",\n \"#4876d6\",\n \"#403f53\",\n \"#08916a\",\n \"#7a8181\",\n]\nbackground = \"#ffffff\"\nbrights = [\n \"#7a8181\",\n \"#f76e6e\",\n \"#49d0c5\",\n \"#dac26b\",\n \"#5ca7e4\",\n \"#697098\",\n \"#00c990\",\n \"#989fb1\",\n]\ncursor_bg = \"#403f53\"\ncursor_border = \"#403f53\"\ncursor_fg = \"#fbfbfb\"\nforeground = \"#403f53\"\nselection_bg = \"#f2f2f2\"\nselection_fg = \"#403f53\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Night Owlish Light\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), -("Nightfly (Gogh)", "[colors]\nansi = [\n \"#1d3b53\",\n \"#fc514e\",\n \"#a1cd5e\",\n \"#e3d18a\",\n \"#82aaff\",\n \"#c792ea\",\n \"#7fdbca\",\n \"#a1aab8\",\n]\nbackground = \"#011627\"\nbrights = [\n \"#7c8f8f\",\n \"#ff5874\",\n \"#21c7a8\",\n \"#ecc48d\",\n \"#82aaff\",\n \"#ae81ff\",\n \"#7fdbca\",\n \"#d6deeb\",\n]\ncursor_bg = \"#9ca1aa\"\ncursor_border = \"#9ca1aa\"\ncursor_fg = \"#011627\"\nforeground = \"#bdc1c6\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Nightfly (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"nightly builds only\"\n"), +("Nightfly (Gogh)", "[colors]\nansi = [\n \"#1d3b53\",\n \"#fc514e\",\n \"#a1cd5e\",\n \"#e3d18a\",\n \"#82aaff\",\n \"#c792ea\",\n \"#7fdbca\",\n \"#a1aab8\",\n]\nbackground = \"#011627\"\nbrights = [\n \"#7c8f8f\",\n \"#ff5874\",\n \"#21c7a8\",\n \"#ecc48d\",\n \"#82aaff\",\n \"#ae81ff\",\n \"#7fdbca\",\n \"#d6deeb\",\n]\ncursor_bg = \"#9ca1aa\"\ncursor_border = \"#9ca1aa\"\ncursor_fg = \"#011627\"\nforeground = \"#bdc1c6\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Nightfly (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), ("nightfox", "[colors]\nansi = [\n \"#393b44\",\n \"#c94f6d\",\n \"#81b29a\",\n \"#dbc074\",\n \"#719cd6\",\n \"#9d79d6\",\n \"#63cdcf\",\n \"#dfdfe0\",\n]\nbackground = \"#192330\"\nbrights = [\n \"#575860\",\n \"#d16983\",\n \"#8ebaa4\",\n \"#e0c989\",\n \"#86abdc\",\n \"#baa1e2\",\n \"#7ad5d6\",\n \"#e4e4e5\",\n]\ncursor_bg = \"#cdcecf\"\ncursor_border = \"#cdcecf\"\ncursor_fg = \"#192330\"\nforeground = \"#cdcecf\"\nselection_bg = \"#2b3b51\"\nselection_fg = \"#cdcecf\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"nightfox\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("NightLion v1", "[colors]\nansi = [\n \"#4c4c4c\",\n \"#bb0000\",\n \"#5fde8f\",\n \"#f3f167\",\n \"#276bd8\",\n \"#bb00bb\",\n \"#00dadf\",\n \"#bbbbbb\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#555555\",\n \"#ff5555\",\n \"#55ff55\",\n \"#ffff55\",\n \"#5555ff\",\n \"#ff55ff\",\n \"#55ffff\",\n \"#ffffff\",\n]\ncursor_bg = \"#bbbbbb\"\ncursor_border = \"#bbbbbb\"\ncursor_fg = \"#ffffff\"\nforeground = \"#bbbbbb\"\nselection_bg = \"#b5d5ff\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\n \"Nightlion V1 (Gogh)\",\n \"NightlionV1 (Gogh)\",\n]\nname = \"NightLion v1\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Nightlion V1 (Gogh)", "[colors]\nansi = [\n \"#4c4c4c\",\n \"#bb0000\",\n \"#5fde8f\",\n \"#f3f167\",\n \"#276bd8\",\n \"#bb00bb\",\n \"#00dadf\",\n \"#bbbbbb\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#555555\",\n \"#ff5555\",\n \"#55ff55\",\n \"#ffff55\",\n \"#5555ff\",\n \"#ff55ff\",\n \"#55ffff\",\n \"#ffffff\",\n]\ncursor_bg = \"#bbbbbb\"\ncursor_border = \"#bbbbbb\"\ncursor_fg = \"#000000\"\nforeground = \"#bbbbbb\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Nightlion V1 (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), @@ -636,6 +655,8 @@ pub const SCHEMES: [(&'static str, &'static str); 966] = [ ("Nucolors (terminal.sexy)", "[colors]\nansi = [\n \"#393939\",\n \"#ff9f95\",\n \"#e2ffc7\",\n \"#ffffb9\",\n \"#a8ceea\",\n \"#e2b5cc\",\n \"#c2efff\",\n \"#dddddd\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#474747\",\n \"#ff8d80\",\n \"#dbffb3\",\n \"#ffbe64\",\n \"#7eb6ff\",\n \"#e296ff\",\n \"#9ce9ff\",\n \"#dddddd\",\n]\nforeground = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"\"\nname = \"Nucolors (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Nudge (terminal.sexy)", "[colors]\nansi = [\n \"#658280\",\n \"#822f5d\",\n \"#184a31\",\n \"#9d4500\",\n \"#304465\",\n \"#330801\",\n \"#175552\",\n \"#110005\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#8ca8a6\",\n \"#a24b76\",\n \"#28634d\",\n \"#9d5823\",\n \"#415c77\",\n \"#532706\",\n \"#3a6868\",\n \"#330801\",\n]\nforeground = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"\"\nname = \"Nudge (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Numix Darkest (terminal.sexy)", "[colors]\nansi = [\n \"#555555\",\n \"#9c3528\",\n \"#61bc3b\",\n \"#f3b43a\",\n \"#0d68a8\",\n \"#744560\",\n \"#288e9c\",\n \"#a2a2a2\",\n]\nbackground = \"#282828\"\nbrights = [\n \"#888888\",\n \"#d64937\",\n \"#86df5d\",\n \"#fdd75a\",\n \"#0f75bd\",\n \"#9e5e83\",\n \"#37c3d6\",\n \"#f9f9f9\",\n]\nforeground = \"#a2a2a2\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"\"\nname = \"Numix Darkest (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), +("NvimDark", "[colors]\nansi = [\n \"#07080d\",\n \"#ffc0b9\",\n \"#b3f6c0\",\n \"#fce094\",\n \"#a6dbff\",\n \"#ffcaff\",\n \"#8cf8f7\",\n \"#eef1f8\",\n]\nbackground = \"#14161b\"\nbrights = [\n \"#4f5258\",\n \"#ffc0b9\",\n \"#b3f6c0\",\n \"#fce094\",\n \"#a6dbff\",\n \"#ffcaff\",\n \"#8cf8f7\",\n \"#eef1f8\",\n]\ncursor_bg = \"#9b9ea4\"\ncursor_border = \"#9b9ea4\"\ncursor_fg = \"#e0e2ea\"\nforeground = \"#e0e2ea\"\nselection_bg = \"#4f5258\"\nselection_fg = \"#e0e2ea\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"NvimDark\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"nightly builds only\"\n"), +("NvimLight", "[colors]\nansi = [\n \"#07080d\",\n \"#590008\",\n \"#005523\",\n \"#6b5300\",\n \"#004c73\",\n \"#470045\",\n \"#007373\",\n \"#eef1f8\",\n]\nbackground = \"#e0e2ea\"\nbrights = [\n \"#4f5258\",\n \"#590008\",\n \"#005523\",\n \"#6b5300\",\n \"#004c73\",\n \"#470045\",\n \"#007373\",\n \"#eef1f8\",\n]\ncursor_bg = \"#9b9ea4\"\ncursor_border = \"#9b9ea4\"\ncursor_fg = \"#14161b\"\nforeground = \"#14161b\"\nselection_bg = \"#9b9ea4\"\nselection_fg = \"#14161b\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"NvimLight\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"nightly builds only\"\n"), ("Obsidian", "[colors]\nansi = [\n \"#000000\",\n \"#a60001\",\n \"#00bb00\",\n \"#fecd22\",\n \"#3a9bdb\",\n \"#bb00bb\",\n \"#00bbbb\",\n \"#bbbbbb\",\n]\nbackground = \"#283033\"\nbrights = [\n \"#555555\",\n \"#ff0003\",\n \"#93c863\",\n \"#fef874\",\n \"#a1d7ff\",\n \"#ff55ff\",\n \"#55ffff\",\n \"#ffffff\",\n]\ncursor_bg = \"#c0cad0\"\ncursor_border = \"#c0cad0\"\ncursor_fg = \"#cdcdcd\"\nforeground = \"#cdcdcd\"\nselection_bg = \"#3e4c4f\"\nselection_fg = \"#dfe1e2\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"Obsidian (Gogh)\"]\nname = \"Obsidian\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Obsidian (Gogh)", "[colors]\nansi = [\n \"#000000\",\n \"#a60001\",\n \"#00bb00\",\n \"#fecd22\",\n \"#3a9bdb\",\n \"#bb00bb\",\n \"#00bbbb\",\n \"#bbbbbb\",\n]\nbackground = \"#283033\"\nbrights = [\n \"#555555\",\n \"#ff0003\",\n \"#93c863\",\n \"#fef874\",\n \"#a1d7ff\",\n \"#ff55ff\",\n \"#55ffff\",\n \"#ffffff\",\n]\ncursor_bg = \"#cdcdcd\"\ncursor_border = \"#cdcdcd\"\ncursor_fg = \"#283033\"\nforeground = \"#cdcdcd\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Obsidian (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), ("Ocean", "[colors]\nansi = [\n \"#000000\",\n \"#990000\",\n \"#00a600\",\n \"#999900\",\n \"#0000b2\",\n \"#b200b2\",\n \"#00a6b2\",\n \"#bfbfbf\",\n]\nbackground = \"#224fbc\"\nbrights = [\n \"#666666\",\n \"#e50000\",\n \"#00d900\",\n \"#e5e500\",\n \"#0000ff\",\n \"#e500e5\",\n \"#00e5e5\",\n \"#e5e5e5\",\n]\ncursor_bg = \"#7f7f7f\"\ncursor_border = \"#7f7f7f\"\ncursor_fg = \"#ffffff\"\nforeground = \"#ffffff\"\nselection_bg = \"#216dff\"\nselection_fg = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"Homebrew Ocean (Gogh)\"]\nname = \"Ocean\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), @@ -661,7 +682,7 @@ pub const SCHEMES: [(&'static str, &'static str); 966] = [ ("Orangish (terminal.sexy)", "[colors]\nansi = [\n \"#251f1f\",\n \"#eb4509\",\n \"#94e76b\",\n \"#ffac18\",\n \"#46aede\",\n \"#e32c57\",\n \"#d6dbac\",\n \"#efefef\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#5e5e5e\",\n \"#eb4509\",\n \"#95e76b\",\n \"#ffac18\",\n \"#46aede\",\n \"#e32c57\",\n \"#d6dbac\",\n \"#efefef\",\n]\nforeground = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"\"\nname = \"Orangish (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Outrun Dark (base16)", "[colors]\nansi = [\n \"#00002a\",\n \"#ff4242\",\n \"#59f176\",\n \"#f3e877\",\n \"#66b0ff\",\n \"#f10596\",\n \"#0ef0f0\",\n \"#d0d0fa\",\n]\nbackground = \"#00002a\"\nbrights = [\n \"#50507a\",\n \"#ff4242\",\n \"#59f176\",\n \"#f3e877\",\n \"#66b0ff\",\n \"#f10596\",\n \"#0ef0f0\",\n \"#f5f5ff\",\n]\ncursor_bg = \"#d0d0fa\"\ncursor_border = \"#d0d0fa\"\ncursor_fg = \"#00002a\"\nforeground = \"#d0d0fa\"\nselection_bg = \"#d0d0fa\"\nselection_fg = \"#00002a\"\n\n[colors.indexed]\n16 = \"#fc8d28\"\n17 = \"#f003ef\"\n18 = \"#20204a\"\n19 = \"#30305a\"\n20 = \"#b0b0da\"\n21 = \"#e0e0ff\"\n\n[metadata]\naliases = []\nauthor = \"Hugo Delahousse (http://github.com/hugodelahousse/)\"\nname = \"Outrun Dark (base16)\"\norigin_url = \"https://github.com/hugodelahousse/base16-outrun-schemes\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Overnight Slumber", "[colors]\nansi = [\n \"#0a1222\",\n \"#ffa7c4\",\n \"#85cc95\",\n \"#ffcb8b\",\n \"#8dabe1\",\n \"#c792eb\",\n \"#78ccf0\",\n \"#ffffff\",\n]\nbackground = \"#0e1729\"\nbrights = [\n \"#575656\",\n \"#ffa7c4\",\n \"#85cc95\",\n \"#ffcb8b\",\n \"#8dabe1\",\n \"#c792eb\",\n \"#ffa7c4\",\n \"#ffffff\",\n]\ncursor_bg = \"#ffa7c4\"\ncursor_border = \"#ffa7c4\"\ncursor_fg = \"#ffffff\"\nforeground = \"#ced2d6\"\nselection_bg = \"#1f2b41\"\nselection_fg = \"#ced2d6\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Overnight Slumber\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), -("Oxocarbon Dark (Gogh)", "[colors]\nansi = [\n \"#262626\",\n \"#ee5396\",\n \"#42be65\",\n \"#ffe97b\",\n \"#33b1ff\",\n \"#ff7eb6\",\n \"#3ddbd9\",\n \"#dde1e6\",\n]\nbackground = \"#161616\"\nbrights = [\n \"#393939\",\n \"#ee5396\",\n \"#42be65\",\n \"#ffe97b\",\n \"#33b1ff\",\n \"#ff7eb6\",\n \"#3ddbd9\",\n \"#ffffff\",\n]\ncursor_bg = \"#6f6f6f\"\ncursor_border = \"#6f6f6f\"\ncursor_fg = \"#161616\"\nforeground = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Oxocarbon Dark (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"nightly builds only\"\n"), +("Oxocarbon Dark (Gogh)", "[colors]\nansi = [\n \"#262626\",\n \"#ee5396\",\n \"#42be65\",\n \"#ffe97b\",\n \"#33b1ff\",\n \"#ff7eb6\",\n \"#3ddbd9\",\n \"#dde1e6\",\n]\nbackground = \"#161616\"\nbrights = [\n \"#393939\",\n \"#ee5396\",\n \"#42be65\",\n \"#ffe97b\",\n \"#33b1ff\",\n \"#ff7eb6\",\n \"#3ddbd9\",\n \"#ffffff\",\n]\ncursor_bg = \"#6f6f6f\"\ncursor_border = \"#6f6f6f\"\ncursor_fg = \"#161616\"\nforeground = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Oxocarbon Dark (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), ("Palenight (Gogh)", "[colors]\nansi = [\n \"#292d3e\",\n \"#f07178\",\n \"#c3e88d\",\n \"#ffcb6b\",\n \"#82aaff\",\n \"#c792ea\",\n \"#60adec\",\n \"#abb2bf\",\n]\nbackground = \"#292d3e\"\nbrights = [\n \"#959dcb\",\n \"#f07178\",\n \"#c3e88d\",\n \"#ff5572\",\n \"#82aaff\",\n \"#ffcb6b\",\n \"#676e95\",\n \"#fffefe\",\n]\ncursor_bg = \"#bfc7d5\"\ncursor_border = \"#bfc7d5\"\ncursor_fg = \"#292d3e\"\nforeground = \"#bfc7d5\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"palenight (Gogh)\"]\nname = \"Palenight (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("PaleNightHC", "[colors]\nansi = [\n \"#000000\",\n \"#f07178\",\n \"#c3e88d\",\n \"#ffcb6b\",\n \"#82aaff\",\n \"#c792ea\",\n \"#89ddff\",\n \"#ffffff\",\n]\nbackground = \"#3e4251\"\nbrights = [\n \"#666666\",\n \"#f6a9ae\",\n \"#dbf1ba\",\n \"#ffdfa6\",\n \"#b4ccff\",\n \"#ddbdf2\",\n \"#b8eaff\",\n \"#999999\",\n]\ncursor_bg = \"#ffcb6b\"\ncursor_border = \"#ffcb6b\"\ncursor_fg = \"#323232\"\nforeground = \"#cccccc\"\nselection_bg = \"#717cb4\"\nselection_fg = \"#80cbc4\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"PaleNightHC\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Pali (Gogh)", "[colors]\nansi = [\n \"#0a0a0a\",\n \"#ab8f74\",\n \"#74ab8f\",\n \"#8fab74\",\n \"#8f74ab\",\n \"#ab748f\",\n \"#748fab\",\n \"#f2f2f2\",\n]\nbackground = \"#232e37\"\nbrights = [\n \"#5d5d5d\",\n \"#ff1d62\",\n \"#9cc3af\",\n \"#ffd00a\",\n \"#af9cc3\",\n \"#ff1d62\",\n \"#4bb8fd\",\n \"#a020f0\",\n]\ncursor_bg = \"#d9e6f2\"\ncursor_border = \"#d9e6f2\"\ncursor_fg = \"#232e37\"\nforeground = \"#d9e6f2\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Pali (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), @@ -714,6 +735,7 @@ pub const SCHEMES: [(&'static str, &'static str); 966] = [ ("Purpledream (base16)", "[colors]\nansi = [\n \"#100510\",\n \"#ff1d0d\",\n \"#14cc64\",\n \"#f000a0\",\n \"#00a0f0\",\n \"#b000d0\",\n \"#0075b0\",\n \"#ddd0dd\",\n]\nbackground = \"#100510\"\nbrights = [\n \"#605060\",\n \"#ff1d0d\",\n \"#14cc64\",\n \"#f000a0\",\n \"#00a0f0\",\n \"#b000d0\",\n \"#0075b0\",\n \"#fff0ff\",\n]\ncursor_bg = \"#ddd0dd\"\ncursor_border = \"#ddd0dd\"\ncursor_fg = \"#100510\"\nforeground = \"#ddd0dd\"\nselection_bg = \"#ddd0dd\"\nselection_fg = \"#100510\"\n\n[colors.indexed]\n16 = \"#ccae14\"\n17 = \"#6a2a3c\"\n18 = \"#302030\"\n19 = \"#403040\"\n20 = \"#bbb0bb\"\n21 = \"#eee0ee\"\n\n[metadata]\naliases = []\nauthor = \"malet\"\nname = \"Purpledream (base16)\"\norigin_url = \"https://github.com/archmalet/base16-purpledream-scheme\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("purplepeter", "[colors]\nansi = [\n \"#0a0520\",\n \"#ff796d\",\n \"#99b481\",\n \"#efdfac\",\n \"#66d9ef\",\n \"#e78fcd\",\n \"#ba8cff\",\n \"#ffba81\",\n]\nbackground = \"#2a1a4a\"\nbrights = [\n \"#100b23\",\n \"#f99f92\",\n \"#b4be8f\",\n \"#f2e9bf\",\n \"#79daed\",\n \"#ba91d4\",\n \"#a0a0d6\",\n \"#b9aed3\",\n]\ncursor_bg = \"#c7c7c7\"\ncursor_border = \"#c7c7c7\"\ncursor_fg = \"#ffffff\"\nforeground = \"#ece7fa\"\nselection_bg = \"#8689c2\"\nselection_fg = \"#271c50\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"purplepeter\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Qualia (base16)", "[colors]\nansi = [\n \"#101010\",\n \"#efa6a2\",\n \"#80c990\",\n \"#e6a3dc\",\n \"#50cacd\",\n \"#e0af85\",\n \"#c8c874\",\n \"#c0c0c0\",\n]\nbackground = \"#101010\"\nbrights = [\n \"#454545\",\n \"#efa6a2\",\n \"#80c990\",\n \"#e6a3dc\",\n \"#50cacd\",\n \"#e0af85\",\n \"#c8c874\",\n \"#454545\",\n]\ncursor_bg = \"#c0c0c0\"\ncursor_border = \"#c0c0c0\"\ncursor_fg = \"#101010\"\nforeground = \"#c0c0c0\"\nselection_bg = \"#c0c0c0\"\nselection_fg = \"#101010\"\n\n[colors.indexed]\n16 = \"#a3b8ef\"\n17 = \"#808080\"\n18 = \"#454545\"\n19 = \"#454545\"\n20 = \"#808080\"\n21 = \"#c0c0c0\"\n\n[metadata]\naliases = []\nauthor = \"isaacwhanson\"\nname = \"Qualia (base16)\"\norigin_url = \"https://github.com/isaacwhanson/base16-qualia-scheme\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), +("Quiet (Gogh)", "[colors]\nansi = [\n \"#141414\",\n \"#c16262\",\n \"#49b685\",\n \"#c5b76d\",\n \"#4992b6\",\n \"#815bbe\",\n \"#41a4a4\",\n \"#c5c5c5\",\n]\nbackground = \"#141414\"\nbrights = [\n \"#505050\",\n \"#ed5e7a\",\n \"#7ece7e\",\n \"#dbdb70\",\n \"#4dbfff\",\n \"#c067e4\",\n \"#70dbd8\",\n \"#f0f0f0\",\n]\ncursor_bg = \"#a0a0a0\"\ncursor_border = \"#a0a0a0\"\ncursor_fg = \"#141414\"\nforeground = \"#b9b9b9\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Quiet (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"nightly builds only\"\n"), ("Railscasts (base16)", "[colors]\nansi = [\n \"#2b2b2b\",\n \"#da4939\",\n \"#a5c261\",\n \"#ffc66d\",\n \"#6d9cbe\",\n \"#b6b3eb\",\n \"#519f50\",\n \"#e6e1dc\",\n]\nbackground = \"#2b2b2b\"\nbrights = [\n \"#5a647e\",\n \"#da4939\",\n \"#a5c261\",\n \"#ffc66d\",\n \"#6d9cbe\",\n \"#b6b3eb\",\n \"#519f50\",\n \"#f9f7f3\",\n]\ncursor_bg = \"#e6e1dc\"\ncursor_border = \"#e6e1dc\"\ncursor_fg = \"#2b2b2b\"\nforeground = \"#e6e1dc\"\nselection_bg = \"#e6e1dc\"\nselection_fg = \"#2b2b2b\"\n\n[colors.indexed]\n16 = \"#cc7833\"\n17 = \"#bc9458\"\n18 = \"#272935\"\n19 = \"#3a4055\"\n20 = \"#d4cfc9\"\n21 = \"#f4f1ed\"\n\n[metadata]\naliases = [\"Railscasts (dark) (terminal.sexy)\"]\nauthor = \"Ryan Bates (http://railscasts.com)\"\nname = \"Railscasts (base16)\"\norigin_url = \"https://github.com/chriskempson/base16-unclaimed-schemes\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Railscasts (dark) (terminal.sexy)", "[colors]\nansi = [\n \"#2b2b2b\",\n \"#da4939\",\n \"#a5c261\",\n \"#ffc66d\",\n \"#6d9cbe\",\n \"#b6b3eb\",\n \"#519f50\",\n \"#e6e1dc\",\n]\nbackground = \"#2b2b2b\"\nbrights = [\n \"#5a647e\",\n \"#da4939\",\n \"#a5c261\",\n \"#ffc66d\",\n \"#6d9cbe\",\n \"#b6b3eb\",\n \"#519f50\",\n \"#f9f7f3\",\n]\nforeground = \"#e6e1dc\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"Chris Kempson\"\nname = \"Railscasts (dark) (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), ("Railscasts (light) (terminal.sexy)", "[colors]\nansi = [\n \"#2b2b2b\",\n \"#da4939\",\n \"#a5c261\",\n \"#ffc66d\",\n \"#6d9cbe\",\n \"#b6b3eb\",\n \"#519f50\",\n \"#e6e1dc\",\n]\nbackground = \"#f9f7f3\"\nbrights = [\n \"#5a647e\",\n \"#da4939\",\n \"#a5c261\",\n \"#ffc66d\",\n \"#6d9cbe\",\n \"#b6b3eb\",\n \"#519f50\",\n \"#f9f7f3\",\n]\nforeground = \"#3a4055\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"Chris Kempson\"\nname = \"Railscasts (light) (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), @@ -742,7 +764,7 @@ pub const SCHEMES: [(&'static str, &'static str); 966] = [ ("Ros\u{e9} Pine (Gogh)", "[colors]\nansi = [\n \"#26233a\",\n \"#eb6f92\",\n \"#9ccfd8\",\n \"#f6c177\",\n \"#31748f\",\n \"#c4a7e7\",\n \"#ebbcba\",\n \"#e0def4\",\n]\nbackground = \"#191724\"\nbrights = [\n \"#6e6a86\",\n \"#eb6f92\",\n \"#9ccfd8\",\n \"#f6c177\",\n \"#31748f\",\n \"#c4a7e7\",\n \"#ebbcba\",\n \"#e0def4\",\n]\ncursor_bg = \"#e0def4\"\ncursor_border = \"#e0def4\"\ncursor_fg = \"#191724\"\nforeground = \"#e0def4\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Ros\u{e9} Pine (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), ("Ros\u{e9} Pine Dawn (base16)", "[colors]\nansi = [\n \"#faf4ed\",\n \"#b4637a\",\n \"#286983\",\n \"#d7827e\",\n \"#907aa9\",\n \"#ea9d34\",\n \"#56949f\",\n \"#575279\",\n]\nbackground = \"#faf4ed\"\nbrights = [\n \"#9893a5\",\n \"#b4637a\",\n \"#286983\",\n \"#d7827e\",\n \"#907aa9\",\n \"#ea9d34\",\n \"#56949f\",\n \"#cecacd\",\n]\ncursor_bg = \"#575279\"\ncursor_border = \"#575279\"\ncursor_fg = \"#faf4ed\"\nforeground = \"#575279\"\nselection_bg = \"#575279\"\nselection_fg = \"#faf4ed\"\n\n[colors.indexed]\n16 = \"#ea9d34\"\n17 = \"#cecacd\"\n18 = \"#fffaf3\"\n19 = \"#f2e9de\"\n20 = \"#797593\"\n21 = \"#575279\"\n\n[metadata]\naliases = []\nauthor = \"Emilia Dunfelt \"\nname = \"Ros\u{e9} Pine Dawn (base16)\"\norigin_url = \"https://github.com/edunfelt/base16-rose-pine-scheme\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Ros\u{e9} Pine Dawn (Gogh)", "[colors]\nansi = [\n \"#f2e9e1\",\n \"#b4637a\",\n \"#56949f\",\n \"#ea9d34\",\n \"#286983\",\n \"#907aa9\",\n \"#d7827e\",\n \"#575279\",\n]\nbackground = \"#faf4ed\"\nbrights = [\n \"#9893a5\",\n \"#b4637a\",\n \"#56949f\",\n \"#ea9d34\",\n \"#286983\",\n \"#907aa9\",\n \"#d7827e\",\n \"#575279\",\n]\ncursor_bg = \"#575279\"\ncursor_border = \"#575279\"\ncursor_fg = \"#faf4ed\"\nforeground = \"#575279\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Ros\u{e9} Pine Dawn (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), -("Ros\u{e9} Pine Moon (base16)", "[colors]\nansi = [\n \"#232136\",\n \"#eb6f92\",\n \"#3e8fb0\",\n \"#ea9a97\",\n \"#c4a7e7\",\n \"#f6c177\",\n \"#9ccfd8\",\n \"#e0def4\",\n]\nbackground = \"#232136\"\nbrights = [\n \"#6e6a86\",\n \"#eb6f92\",\n \"#3e8fb0\",\n \"#ea9a97\",\n \"#c4a7e7\",\n \"#f6c177\",\n \"#9ccfd8\",\n \"#56526e\",\n]\ncursor_bg = \"#e0def4\"\ncursor_border = \"#e0def4\"\ncursor_fg = \"#232136\"\nforeground = \"#e0def4\"\nselection_bg = \"#e0def4\"\nselection_fg = \"#232136\"\n\n[colors.indexed]\n16 = \"#f6c177\"\n17 = \"#56526e\"\n18 = \"#2a273f\"\n19 = \"#393552\"\n20 = \"#908caa\"\n21 = \"#e0def4\"\n\n[metadata]\naliases = []\nauthor = \"Emilia Dunfelt \"\nname = \"Ros\u{e9} Pine Moon (base16)\"\norigin_url = \"https://github.com/edunfelt/base16-rose-pine-scheme\"\nwezterm_version = \"nightly builds only\"\n"), +("Ros\u{e9} Pine Moon (base16)", "[colors]\nansi = [\n \"#232136\",\n \"#eb6f92\",\n \"#3e8fb0\",\n \"#ea9a97\",\n \"#c4a7e7\",\n \"#f6c177\",\n \"#9ccfd8\",\n \"#e0def4\",\n]\nbackground = \"#232136\"\nbrights = [\n \"#6e6a86\",\n \"#eb6f92\",\n \"#3e8fb0\",\n \"#ea9a97\",\n \"#c4a7e7\",\n \"#f6c177\",\n \"#9ccfd8\",\n \"#56526e\",\n]\ncursor_bg = \"#e0def4\"\ncursor_border = \"#e0def4\"\ncursor_fg = \"#232136\"\nforeground = \"#e0def4\"\nselection_bg = \"#e0def4\"\nselection_fg = \"#232136\"\n\n[colors.indexed]\n16 = \"#f6c177\"\n17 = \"#56526e\"\n18 = \"#2a273f\"\n19 = \"#393552\"\n20 = \"#908caa\"\n21 = \"#e0def4\"\n\n[metadata]\naliases = []\nauthor = \"Emilia Dunfelt \"\nname = \"Ros\u{e9} Pine Moon (base16)\"\norigin_url = \"https://github.com/edunfelt/base16-rose-pine-scheme\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), ("Ros\u{e9} Pine Moon (Gogh)", "[colors]\nansi = [\n \"#393552\",\n \"#eb6f92\",\n \"#9ccfd8\",\n \"#f6c177\",\n \"#3e8fb0\",\n \"#c4a7e7\",\n \"#ea9a97\",\n \"#e0def4\",\n]\nbackground = \"#232136\"\nbrights = [\n \"#6e6a86\",\n \"#eb6f92\",\n \"#9ccfd8\",\n \"#f6c177\",\n \"#3e8fb0\",\n \"#c4a7e7\",\n \"#ea9a97\",\n \"#e0def4\",\n]\ncursor_bg = \"#e0def4\"\ncursor_border = \"#e0def4\"\ncursor_fg = \"#232136\"\nforeground = \"#e0def4\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Ros\u{e9} Pine Moon (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), ("Rouge 2", "[colors]\nansi = [\n \"#5d5d6b\",\n \"#c6797e\",\n \"#969e92\",\n \"#dbcdab\",\n \"#6e94b9\",\n \"#4c4e78\",\n \"#8ab6c1\",\n \"#e8e8ea\",\n]\nbackground = \"#17182b\"\nbrights = [\n \"#616274\",\n \"#c6797e\",\n \"#e6dcc4\",\n \"#e6dcc4\",\n \"#98b3cd\",\n \"#8283a1\",\n \"#abcbd3\",\n \"#e8e8ea\",\n]\ncursor_bg = \"#969e92\"\ncursor_border = \"#969e92\"\ncursor_fg = \"#ffffff\"\nforeground = \"#a2a3aa\"\nselection_bg = \"#5d5d6b\"\nselection_fg = \"#dfe5ee\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Rouge 2\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Royal", "[colors]\nansi = [\n \"#241f2b\",\n \"#91284c\",\n \"#23801c\",\n \"#b49d27\",\n \"#6580b0\",\n \"#674d96\",\n \"#8aaabe\",\n \"#524966\",\n]\nbackground = \"#100815\"\nbrights = [\n \"#312d3d\",\n \"#d5356c\",\n \"#2cd946\",\n \"#fde83b\",\n \"#90baf9\",\n \"#a479e3\",\n \"#acd4eb\",\n \"#9e8cbd\",\n]\ncursor_bg = \"#524966\"\ncursor_border = \"#524966\"\ncursor_fg = \"#100613\"\nforeground = \"#514968\"\nselection_bg = \"#1f1d2b\"\nselection_fg = \"#a593cd\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"Royal (Gogh)\"]\nname = \"Royal\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), @@ -760,8 +782,12 @@ pub const SCHEMES: [(&'static str, &'static str); 966] = [ ("Seafoam Pastel", "[colors]\nansi = [\n \"#757575\",\n \"#825d4d\",\n \"#728c62\",\n \"#ada16d\",\n \"#4d7b82\",\n \"#8a7267\",\n \"#729494\",\n \"#e0e0e0\",\n]\nbackground = \"#243435\"\nbrights = [\n \"#8a8a8a\",\n \"#cf937a\",\n \"#98d9aa\",\n \"#fae79d\",\n \"#7ac3cf\",\n \"#d6b2a1\",\n \"#ade0e0\",\n \"#e0e0e0\",\n]\ncursor_bg = \"#57647a\"\ncursor_border = \"#57647a\"\ncursor_fg = \"#323232\"\nforeground = \"#d4e7d4\"\nselection_bg = \"#ffffff\"\nselection_fg = \"#9e8b13\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\n \"Seafoam Pastel (Gogh)\",\n \"SeafoamPastel (Gogh)\",\n]\nname = \"Seafoam Pastel\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Seafoam Pastel (Gogh)", "[colors]\nansi = [\n \"#757575\",\n \"#825d4d\",\n \"#728c62\",\n \"#ada16d\",\n \"#4d7b82\",\n \"#8a7267\",\n \"#729494\",\n \"#e0e0e0\",\n]\nbackground = \"#243435\"\nbrights = [\n \"#8a8a8a\",\n \"#cf937a\",\n \"#98d9aa\",\n \"#fae79d\",\n \"#7ac3cf\",\n \"#d6b2a1\",\n \"#ade0e0\",\n \"#e0e0e0\",\n]\ncursor_bg = \"#d4e7d4\"\ncursor_border = \"#d4e7d4\"\ncursor_fg = \"#243435\"\nforeground = \"#d4e7d4\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Seafoam Pastel (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), ("SeaShells", "[colors]\nansi = [\n \"#17384c\",\n \"#d15123\",\n \"#027c9b\",\n \"#fca02f\",\n \"#1e4950\",\n \"#68d4f1\",\n \"#50a3b5\",\n \"#deb88d\",\n]\nbackground = \"#09141b\"\nbrights = [\n \"#434b53\",\n \"#d48678\",\n \"#628d98\",\n \"#fdd39f\",\n \"#1bbcdd\",\n \"#bbe3ee\",\n \"#87acb4\",\n \"#fee4ce\",\n]\ncursor_bg = \"#fca02f\"\ncursor_border = \"#fca02f\"\ncursor_fg = \"#08131a\"\nforeground = \"#deb88d\"\nselection_bg = \"#1e4962\"\nselection_fg = \"#fee4ce\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"Sea Shells (Gogh)\"]\nname = \"SeaShells\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), -("Selenized Dark (Gogh)", "[colors]\nansi = [\n \"#103c48\",\n \"#fa5750\",\n \"#75b938\",\n \"#dbb32d\",\n \"#4695f7\",\n \"#f275be\",\n \"#41c7b9\",\n \"#adbcbc\",\n]\nbackground = \"#103c48\"\nbrights = [\n \"#184956\",\n \"#ff665c\",\n \"#84c747\",\n \"#ebc13d\",\n \"#58a3ff\",\n \"#ff84cd\",\n \"#53d6c7\",\n \"#cad8d9\",\n]\ncursor_bg = \"#adbcbc\"\ncursor_border = \"#adbcbc\"\ncursor_fg = \"#103c48\"\nforeground = \"#adbcbc\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Selenized Dark (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"nightly builds only\"\n"), -("Selenized Light (Gogh)", "[colors]\nansi = [\n \"#fbf3db\",\n \"#d2212d\",\n \"#489100\",\n \"#ad8900\",\n \"#0072d4\",\n \"#ca4898\",\n \"#009c8f\",\n \"#53676d\",\n]\nbackground = \"#fbf3db\"\nbrights = [\n \"#ece3cc\",\n \"#cc1729\",\n \"#428b00\",\n \"#a78300\",\n \"#006dce\",\n \"#c44392\",\n \"#00978a\",\n \"#3a4d53\",\n]\ncursor_bg = \"#53676d\"\ncursor_border = \"#53676d\"\ncursor_fg = \"#fbf3db\"\nforeground = \"#53676d\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Selenized Light (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"nightly builds only\"\n"), +("Selenized Black (Gogh)", "[colors]\nansi = [\n \"#252525\",\n \"#ed4a46\",\n \"#70b433\",\n \"#dbb32d\",\n \"#368aeb\",\n \"#eb6eb7\",\n \"#3fc5b7\",\n \"#777777\",\n]\nbackground = \"#181818\"\nbrights = [\n \"#3b3b3b\",\n \"#ff5e56\",\n \"#83c746\",\n \"#efc541\",\n \"#4f9cfe\",\n \"#ff81ca\",\n \"#56d8c9\",\n \"#dedede\",\n]\ncursor_bg = \"#dedede\"\ncursor_border = \"#dedede\"\ncursor_fg = \"#181818\"\nforeground = \"#b9b9b9\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Selenized Black (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"nightly builds only\"\n"), +("Selenized Dark (Gogh)", "[colors]\nansi = [\n \"#184956\",\n \"#fa5750\",\n \"#75b938\",\n \"#dbb32d\",\n \"#4695f7\",\n \"#f275be\",\n \"#41c7b9\",\n \"#72898f\",\n]\nbackground = \"#103c48\"\nbrights = [\n \"#2d5b69\",\n \"#ff665c\",\n \"#84c747\",\n \"#ebc13d\",\n \"#58a3ff\",\n \"#ff84cd\",\n \"#53d6c7\",\n \"#cad8d9\",\n]\ncursor_bg = \"#cad8d9\"\ncursor_border = \"#cad8d9\"\ncursor_fg = \"#103c48\"\nforeground = \"#adbcbc\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Selenized Dark (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), +("Selenized Light (Gogh)", "[colors]\nansi = [\n \"#ece3cc\",\n \"#d2212d\",\n \"#489100\",\n \"#ad8900\",\n \"#0072d4\",\n \"#ca4898\",\n \"#009c8f\",\n \"#909995\",\n]\nbackground = \"#fbf3db\"\nbrights = [\n \"#d5cdb6\",\n \"#cc1729\",\n \"#428b00\",\n \"#a78300\",\n \"#006dce\",\n \"#c44392\",\n \"#00978a\",\n \"#3a4d53\",\n]\ncursor_bg = \"#3a4d53\"\ncursor_border = \"#3a4d53\"\ncursor_fg = \"#fbf3db\"\nforeground = \"#53676d\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Selenized Light (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), +("Selenized White (Gogh)", "[colors]\nansi = [\n \"#ebebeb\",\n \"#d6000c\",\n \"#1d9700\",\n \"#c49700\",\n \"#0064e4\",\n \"#dd0f9d\",\n \"#00ad9c\",\n \"#878787\",\n]\nbackground = \"#ffffff\"\nbrights = [\n \"#cdcdcd\",\n \"#bf0000\",\n \"#008400\",\n \"#af8500\",\n \"#0054cf\",\n \"#c7008b\",\n \"#009a8a\",\n \"#282828\",\n]\ncursor_bg = \"#282828\"\ncursor_border = \"#282828\"\ncursor_fg = \"#ffffff\"\nforeground = \"#474747\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Selenized White (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"nightly builds only\"\n"), +("Seoul256 (Gogh)", "[colors]\nansi = [\n \"#4e4e4e\",\n \"#d68787\",\n \"#5f865f\",\n \"#d8af5f\",\n \"#85add4\",\n \"#d7afaf\",\n \"#87afaf\",\n \"#d0d0d0\",\n]\nbackground = \"#3a3a3a\"\nbrights = [\n \"#626262\",\n \"#d75f87\",\n \"#87af87\",\n \"#ffd787\",\n \"#add4fb\",\n \"#ffafaf\",\n \"#87d7d7\",\n \"#e4e4e4\",\n]\ncursor_bg = \"#d0d0d0\"\ncursor_border = \"#d0d0d0\"\ncursor_fg = \"#3a3a3a\"\nforeground = \"#d0d0d0\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Seoul256 (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"nightly builds only\"\n"), +("Seoul256 Light (Gogh)", "[colors]\nansi = [\n \"#4e4e4e\",\n \"#af5f5f\",\n \"#5f885f\",\n \"#af8760\",\n \"#5f87ae\",\n \"#875f87\",\n \"#5f8787\",\n \"#e4e4e4\",\n]\nbackground = \"#dadada\"\nbrights = [\n \"#3a3a3a\",\n \"#870100\",\n \"#005f00\",\n \"#d8865f\",\n \"#0087af\",\n \"#87025f\",\n \"#008787\",\n \"#eeeeee\",\n]\ncursor_bg = \"#4e4e4e\"\ncursor_border = \"#4e4e4e\"\ncursor_fg = \"#dadada\"\nforeground = \"#4e4e4e\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Seoul256 Light (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"nightly builds only\"\n"), ("seoulbones_dark", "[colors]\nansi = [\n \"#4b4b4b\",\n \"#e388a3\",\n \"#98bd99\",\n \"#ffdf9b\",\n \"#97bdde\",\n \"#a5a6c5\",\n \"#6fbdbe\",\n \"#dddddd\",\n]\nbackground = \"#4b4b4b\"\nbrights = [\n \"#6c6465\",\n \"#eb99b1\",\n \"#8fcd92\",\n \"#ffe5b3\",\n \"#a2c8e9\",\n \"#b2b3da\",\n \"#6bcacb\",\n \"#a8a8a8\",\n]\ncursor_bg = \"#e2e2e2\"\ncursor_border = \"#e2e2e2\"\ncursor_fg = \"#4b4b4b\"\nforeground = \"#dddddd\"\nselection_bg = \"#777777\"\nselection_fg = \"#dddddd\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"seoulbones_dark\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("seoulbones_light", "[colors]\nansi = [\n \"#e2e2e2\",\n \"#dc5284\",\n \"#628562\",\n \"#c48562\",\n \"#0084a3\",\n \"#896788\",\n \"#008586\",\n \"#555555\",\n]\nbackground = \"#e2e2e2\"\nbrights = [\n \"#bfbabb\",\n \"#be3c6d\",\n \"#487249\",\n \"#a76b48\",\n \"#006f89\",\n \"#7f4c7e\",\n \"#006f70\",\n \"#777777\",\n]\ncursor_bg = \"#555555\"\ncursor_border = \"#555555\"\ncursor_fg = \"#e2e2e2\"\nforeground = \"#555555\"\nselection_bg = \"#cccccc\"\nselection_fg = \"#555555\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"seoulbones_light\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Sequoia Monochrome", "[colors]\nansi = [\n \"#131317\",\n \"#999eb2\",\n \"#626983\",\n \"#d3d5de\",\n \"#7c829d\",\n \"#e2e4ed\",\n \"#b6bac8\",\n \"#868690\",\n]\nbackground = \"#0f1014\"\nbrights = [\n \"#575861\",\n \"#999eb2\",\n \"#626983\",\n \"#d3d5de\",\n \"#7c829d\",\n \"#e2e4ed\",\n \"#b6bac8\",\n \"#868690\",\n]\ncursor_bg = \"#7c829d\"\ncursor_border = \"#7c829d\"\ncursor_fg = \"#868690\"\nforeground = \"#868690\"\nselection_bg = \"#22222a\"\nselection_fg = \"#93939c\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"Hiroya-W and Michael Andreuzza\"\nname = \"Sequoia Monochrome\"\norigin_url = \"https://github.com/Hiroya-W/wezterm-sequoia-theme\"\nwezterm_version = \"20220903-194523-3bb1ed61\"\n"), @@ -798,11 +824,11 @@ pub const SCHEMES: [(&'static str, &'static str); 966] = [ ("Solarized (light) (terminal.sexy)", "[colors]\nansi = [\n \"#002b36\",\n \"#dc322f\",\n \"#859900\",\n \"#b58900\",\n \"#268bd2\",\n \"#6c71c4\",\n \"#2aa198\",\n \"#93a1a1\",\n]\nbackground = \"#fdf6e3\"\nbrights = [\n \"#657b83\",\n \"#dc322f\",\n \"#859900\",\n \"#b58900\",\n \"#268bd2\",\n \"#6c71c4\",\n \"#2aa198\",\n \"#fdf6e3\",\n]\nforeground = \"#586e75\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"Chris Kempson\"\nname = \"Solarized (light) (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Solarized Darcula", "[colors]\nansi = [\n \"#25292a\",\n \"#f24840\",\n \"#629655\",\n \"#b68800\",\n \"#2075c7\",\n \"#797fd4\",\n \"#15968d\",\n \"#d2d8d9\",\n]\nbackground = \"#3d3f41\"\nbrights = [\n \"#25292a\",\n \"#f24840\",\n \"#629655\",\n \"#b68800\",\n \"#2075c7\",\n \"#797fd4\",\n \"#15968d\",\n \"#d2d8d9\",\n]\ncursor_bg = \"#708284\"\ncursor_border = \"#708284\"\ncursor_fg = \"#002831\"\nforeground = \"#d2d8d9\"\nselection_bg = \"#214283\"\nselection_fg = \"#d2d8d9\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\n \"Solarized Darcula (Gogh)\",\n \"SolarizedDarcula (Gogh)\",\n]\nname = \"Solarized Darcula\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Solarized Darcula (Gogh)", "[colors]\nansi = [\n \"#25292a\",\n \"#f24840\",\n \"#629655\",\n \"#b68800\",\n \"#2075c7\",\n \"#797fd4\",\n \"#15968d\",\n \"#d2d8d9\",\n]\nbackground = \"#3d3f41\"\nbrights = [\n \"#25292a\",\n \"#f24840\",\n \"#629655\",\n \"#b68800\",\n \"#2075c7\",\n \"#797fd4\",\n \"#15968d\",\n \"#d2d8d9\",\n]\ncursor_bg = \"#d2d8d9\"\ncursor_border = \"#d2d8d9\"\ncursor_fg = \"#3d3f41\"\nforeground = \"#d2d8d9\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Solarized Darcula (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), -("Solarized Dark (Gogh)", "[colors]\nansi = [\n \"#073642\",\n \"#dc322f\",\n \"#859900\",\n \"#cf9a6b\",\n \"#268bd2\",\n \"#d33682\",\n \"#2aa198\",\n \"#eee8d5\",\n]\nbackground = \"#002b36\"\nbrights = [\n \"#657b83\",\n \"#d87979\",\n \"#88cf76\",\n \"#657b83\",\n \"#2699ff\",\n \"#d33682\",\n \"#43b8c3\",\n \"#fdf6e3\",\n]\ncursor_bg = \"#839496\"\ncursor_border = \"#839496\"\ncursor_fg = \"#002b36\"\nforeground = \"#839496\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"SolarizedDark (Gogh)\"]\nname = \"Solarized Dark (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), +("Solarized Dark (Gogh)", "[colors]\nansi = [\n \"#073642\",\n \"#dc322f\",\n \"#859900\",\n \"#cf9a6b\",\n \"#268bd2\",\n \"#d33682\",\n \"#2aa198\",\n \"#eee8d5\",\n]\nbackground = \"#002b36\"\nbrights = [\n \"#657b83\",\n \"#cb4b16\",\n \"#859900\",\n \"#cf9a6b\",\n \"#6c71c4\",\n \"#d33682\",\n \"#2aa198\",\n \"#fdf6e3\",\n]\ncursor_bg = \"#839496\"\ncursor_border = \"#839496\"\ncursor_fg = \"#002b36\"\nforeground = \"#839496\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"SolarizedDark (Gogh)\"]\nname = \"Solarized Dark (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Solarized Dark - Patched", "[colors]\nansi = [\n \"#002831\",\n \"#d11c24\",\n \"#738a05\",\n \"#a57706\",\n \"#2176c7\",\n \"#c61c6f\",\n \"#259286\",\n \"#eae3cb\",\n]\nbackground = \"#001e27\"\nbrights = [\n \"#475b62\",\n \"#bd3613\",\n \"#475b62\",\n \"#536870\",\n \"#708284\",\n \"#5956ba\",\n \"#819090\",\n \"#fcf4dc\",\n]\ncursor_bg = \"#708284\"\ncursor_border = \"#708284\"\ncursor_fg = \"#002831\"\nforeground = \"#708284\"\nselection_bg = \"#002831\"\nselection_fg = \"#819090\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Solarized Dark - Patched\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Solarized Dark Higher Contrast", "[colors]\nansi = [\n \"#002831\",\n \"#d11c24\",\n \"#6cbe6c\",\n \"#a57706\",\n \"#2176c7\",\n \"#c61c6f\",\n \"#259286\",\n \"#eae3cb\",\n]\nbackground = \"#001e27\"\nbrights = [\n \"#006488\",\n \"#f5163b\",\n \"#51ef84\",\n \"#b27e28\",\n \"#178ec8\",\n \"#e24d8e\",\n \"#00b39e\",\n \"#fcf4dc\",\n]\ncursor_bg = \"#f34b00\"\ncursor_border = \"#f34b00\"\ncursor_fg = \"#002831\"\nforeground = \"#9cc2c3\"\nselection_bg = \"#003748\"\nselection_fg = \"#7a8f8e\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\n \"Solarized Dark Higher Contrast (Gogh)\",\n \"SolarizedDarkHigherContrast (Gogh)\",\n]\nname = \"Solarized Dark Higher Contrast\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Solarized Dark Higher Contrast (Gogh)", "[colors]\nansi = [\n \"#002831\",\n \"#d11c24\",\n \"#6cbe6c\",\n \"#a57706\",\n \"#2176c7\",\n \"#c61c6f\",\n \"#259286\",\n \"#eae3cb\",\n]\nbackground = \"#001e27\"\nbrights = [\n \"#006488\",\n \"#f5163b\",\n \"#51ef84\",\n \"#b27e28\",\n \"#178ec8\",\n \"#e24d8e\",\n \"#00b39e\",\n \"#fcf4dc\",\n]\ncursor_bg = \"#9cc2c3\"\ncursor_border = \"#9cc2c3\"\ncursor_fg = \"#001e27\"\nforeground = \"#9cc2c3\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Solarized Dark Higher Contrast (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), -("Solarized Light (Gogh)", "[colors]\nansi = [\n \"#073642\",\n \"#dc322f\",\n \"#859900\",\n \"#b58900\",\n \"#268bd2\",\n \"#d33682\",\n \"#2aa198\",\n \"#eee8d5\",\n]\nbackground = \"#fdf6e3\"\nbrights = [\n \"#002b36\",\n \"#cb4b16\",\n \"#586e75\",\n \"#657b83\",\n \"#839496\",\n \"#6c71c4\",\n \"#93a1a1\",\n \"#fdf6e3\",\n]\ncursor_bg = \"#657b83\"\ncursor_border = \"#657b83\"\ncursor_fg = \"#fdf6e3\"\nforeground = \"#657b83\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Solarized Light (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), +("Solarized Light (Gogh)", "[colors]\nansi = [\n \"#eee8d5\",\n \"#dc322f\",\n \"#859900\",\n \"#b58900\",\n \"#268bd2\",\n \"#d33682\",\n \"#2aa198\",\n \"#002b36\",\n]\nbackground = \"#fdf6e3\"\nbrights = [\n \"#657b83\",\n \"#cb4b16\",\n \"#859900\",\n \"#b58900\",\n \"#6c71c4\",\n \"#d33682\",\n \"#2aa198\",\n \"#073642\",\n]\ncursor_bg = \"#657b83\"\ncursor_border = \"#657b83\"\ncursor_fg = \"#fdf6e3\"\nforeground = \"#657b83\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Solarized Light (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), ("Sonokai (Gogh)", "[colors]\nansi = [\n \"#2c2e34\",\n \"#fc5d7c\",\n \"#9ed072\",\n \"#e7c664\",\n \"#f39660\",\n \"#b39df3\",\n \"#76cce0\",\n \"#e2e2e3\",\n]\nbackground = \"#2c2e34\"\nbrights = [\n \"#7f8490\",\n \"#fc5d7c\",\n \"#9ed072\",\n \"#e7c664\",\n \"#f39660\",\n \"#b39df3\",\n \"#76cce0\",\n \"#e2e2e3\",\n]\ncursor_bg = \"#e2e2e3\"\ncursor_border = \"#e2e2e3\"\ncursor_fg = \"#2c2e34\"\nforeground = \"#e2e2e3\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Sonokai (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("SOS (terminal.sexy)", "[colors]\nansi = [\n \"#373b43\",\n \"#fdcd39\",\n \"#fbfd59\",\n \"#deac40\",\n \"#afb171\",\n \"#b387e7\",\n \"#63e860\",\n \"#efdecb\",\n]\nbackground = \"#373b43\"\nbrights = [\n \"#373b43\",\n \"#fdcd39\",\n \"#fbfd59\",\n \"#deac40\",\n \"#afb171\",\n \"#b387e7\",\n \"#63e860\",\n \"#efdecb\",\n]\nforeground = \"#78796f\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"Rooster\"\nname = \"SOS (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Spacedust", "[colors]\nansi = [\n \"#6e5346\",\n \"#e35b00\",\n \"#5cab96\",\n \"#e3cd7b\",\n \"#0f548b\",\n \"#e35b00\",\n \"#06afc7\",\n \"#f0f1ce\",\n]\nbackground = \"#0a1e24\"\nbrights = [\n \"#684c31\",\n \"#ff8a3a\",\n \"#aecab8\",\n \"#ffc878\",\n \"#67a0ce\",\n \"#ff8a3a\",\n \"#83a7b4\",\n \"#fefff1\",\n]\ncursor_bg = \"#708284\"\ncursor_border = \"#708284\"\ncursor_fg = \"#002831\"\nforeground = \"#ecf0c1\"\nselection_bg = \"#0a385c\"\nselection_fg = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"Spacedust (Gogh)\"]\nname = \"Spacedust\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), @@ -814,6 +840,7 @@ pub const SCHEMES: [(&'static str, &'static str); 966] = [ ("SpaceGray Eighties Dull", "[colors]\nansi = [\n \"#15171c\",\n \"#b24a56\",\n \"#92b477\",\n \"#c6735a\",\n \"#7c8fa5\",\n \"#a5789e\",\n \"#80cdcb\",\n \"#b3b8c3\",\n]\nbackground = \"#222222\"\nbrights = [\n \"#555555\",\n \"#ec5f67\",\n \"#89e986\",\n \"#fec254\",\n \"#5486c0\",\n \"#bf83c1\",\n \"#58c2c1\",\n \"#ffffff\",\n]\ncursor_bg = \"#bbbbbb\"\ncursor_border = \"#bbbbbb\"\ncursor_fg = \"#ffffff\"\nforeground = \"#c9c6bc\"\nselection_bg = \"#272e36\"\nselection_fg = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\n \"SpaceGrayEightiesDull (Gogh)\",\n \"Spacegray Eighties Dull (Gogh)\",\n]\nname = \"SpaceGray Eighties Dull\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Spacegray Eighties Dull (Gogh)", "[colors]\nansi = [\n \"#15171c\",\n \"#b24a56\",\n \"#92b477\",\n \"#c6735a\",\n \"#7c8fa5\",\n \"#a5789e\",\n \"#80cdcb\",\n \"#b3b8c3\",\n]\nbackground = \"#222222\"\nbrights = [\n \"#555555\",\n \"#ec5f67\",\n \"#89e986\",\n \"#fec254\",\n \"#5486c0\",\n \"#bf83c1\",\n \"#58c2c1\",\n \"#ffffff\",\n]\ncursor_bg = \"#c9c6bc\"\ncursor_border = \"#c9c6bc\"\ncursor_fg = \"#222222\"\nforeground = \"#c9c6bc\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Spacegray Eighties Dull (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), ("Spacemacs (base16)", "[colors]\nansi = [\n \"#1f2022\",\n \"#f2241f\",\n \"#67b11d\",\n \"#b1951d\",\n \"#4f97d7\",\n \"#a31db1\",\n \"#2d9574\",\n \"#a3a3a3\",\n]\nbackground = \"#1f2022\"\nbrights = [\n \"#585858\",\n \"#f2241f\",\n \"#67b11d\",\n \"#b1951d\",\n \"#4f97d7\",\n \"#a31db1\",\n \"#2d9574\",\n \"#f8f8f8\",\n]\ncursor_bg = \"#a3a3a3\"\ncursor_border = \"#a3a3a3\"\ncursor_fg = \"#1f2022\"\nforeground = \"#a3a3a3\"\nselection_bg = \"#a3a3a3\"\nselection_fg = \"#1f2022\"\n\n[colors.indexed]\n16 = \"#ffa500\"\n17 = \"#b03060\"\n18 = \"#282828\"\n19 = \"#444155\"\n20 = \"#b8b8b8\"\n21 = \"#e8e8e8\"\n\n[metadata]\naliases = []\nauthor = \"Nasser Alshammari (https://github.com/nashamri/spacemacs-theme)\"\nname = \"Spacemacs (base16)\"\norigin_url = \"https://github.com/chriskempson/base16-unclaimed-schemes\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), +("Sparky (Gogh)", "[colors]\nansi = [\n \"#212322\",\n \"#ff585d\",\n \"#78d64b\",\n \"#fbdd40\",\n \"#4698cb\",\n \"#d59ed7\",\n \"#2dccd3\",\n \"#dee6de\",\n]\nbackground = \"#072b31\"\nbrights = [\n \"#4b4f54\",\n \"#ff7276\",\n \"#8edd65\",\n \"#f6eb61\",\n \"#69b3e7\",\n \"#f99fc9\",\n \"#00c1d5\",\n \"#d9e1e2\",\n]\ncursor_bg = \"#f4f5f0\"\ncursor_border = \"#f4f5f0\"\ncursor_fg = \"#072b31\"\nforeground = \"#f4f5f0\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Sparky (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"nightly builds only\"\n"), ("Spiderman", "[colors]\nansi = [\n \"#1b1d1e\",\n \"#e60813\",\n \"#e22928\",\n \"#e24756\",\n \"#2c3fff\",\n \"#2435db\",\n \"#3256ff\",\n \"#fffef6\",\n]\nbackground = \"#1b1d1e\"\nbrights = [\n \"#505354\",\n \"#ff0325\",\n \"#ff3338\",\n \"#fe3a35\",\n \"#1d50ff\",\n \"#747cff\",\n \"#6184ff\",\n \"#fffff9\",\n]\ncursor_bg = \"#2c3fff\"\ncursor_border = \"#2c3fff\"\ncursor_fg = \"#000000\"\nforeground = \"#e3e3e3\"\nselection_bg = \"#070e50\"\nselection_fg = \"#f0272d\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Spiderman\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Splurge (terminal.sexy)", "[colors]\nansi = [\n \"#4a4b4a\",\n \"#d7699a\",\n \"#80d468\",\n \"#d7a169\",\n \"#6985d7\",\n \"#c86ad4\",\n \"#6fccd1\",\n \"#dbdcdc\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#696969\",\n \"#f5a2b5\",\n \"#a3f2a0\",\n \"#f5cda2\",\n \"#a2c1f5\",\n \"#d2a2f5\",\n \"#a0e9f2\",\n \"#fdfdfd\",\n]\nforeground = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"\"\nname = \"Splurge (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Spring", "[colors]\nansi = [\n \"#000000\",\n \"#ff4d83\",\n \"#1f8c3b\",\n \"#1fc95b\",\n \"#1dd3ee\",\n \"#8959a8\",\n \"#3e999f\",\n \"#ffffff\",\n]\nbackground = \"#ffffff\"\nbrights = [\n \"#000000\",\n \"#ff0021\",\n \"#1fc231\",\n \"#d5b807\",\n \"#15a9fd\",\n \"#8959a8\",\n \"#3e999f\",\n \"#ffffff\",\n]\ncursor_bg = \"#4d4d4c\"\ncursor_border = \"#4d4d4c\"\ncursor_fg = \"#ffffff\"\nforeground = \"#4d4d4c\"\nselection_bg = \"#d6d6d6\"\nselection_fg = \"#4d4d4c\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Spring\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), @@ -935,7 +962,7 @@ pub const SCHEMES: [(&'static str, &'static str); 966] = [ ("VWbug (terminal.sexy)", "[colors]\nansi = [\n \"#261e26\",\n \"#312c38\",\n \"#4d353b\",\n \"#503b43\",\n \"#57403e\",\n \"#665453\",\n \"#6e5450\",\n \"#8e7266\",\n]\nbackground = \"#170f0d\"\nbrights = [\n \"#906756\",\n \"#927e7e\",\n \"#ad6042\",\n \"#b48b6f\",\n \"#c4ab98\",\n \"#d9c9b6\",\n \"#e7ddd1\",\n \"#faf7f2\",\n]\nforeground = \"#746c48\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"dkeg\"\nname = \"VWbug (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Warm Neon (Gogh)", "[colors]\nansi = [\n \"#000000\",\n \"#e24346\",\n \"#39b13a\",\n \"#dae145\",\n \"#4261c5\",\n \"#f920fb\",\n \"#2abbd4\",\n \"#d0b8a3\",\n]\nbackground = \"#404040\"\nbrights = [\n \"#fefcfc\",\n \"#e97071\",\n \"#9cc090\",\n \"#ddda7a\",\n \"#7b91d6\",\n \"#f674ba\",\n \"#5ed1e5\",\n \"#d8c8bb\",\n]\ncursor_bg = \"#afdab6\"\ncursor_border = \"#afdab6\"\ncursor_fg = \"#404040\"\nforeground = \"#afdab6\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Warm Neon (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), ("WarmNeon", "[colors]\nansi = [\n \"#000000\",\n \"#e24346\",\n \"#39b13a\",\n \"#dae145\",\n \"#4261c5\",\n \"#f920fb\",\n \"#2abbd4\",\n \"#d0b8a3\",\n]\nbackground = \"#404040\"\nbrights = [\n \"#fefcfc\",\n \"#e97071\",\n \"#9cc090\",\n \"#ddda7a\",\n \"#7b91d6\",\n \"#f674ba\",\n \"#5ed1e5\",\n \"#d8c8bb\",\n]\ncursor_bg = \"#30ff24\"\ncursor_border = \"#30ff24\"\ncursor_fg = \"#3eef37\"\nforeground = \"#afdab6\"\nselection_bg = \"#b0ad21\"\nselection_fg = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"Warm Neon (Gogh)\"]\nname = \"WarmNeon\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), -("Website (Gogh)", "[colors]\nansi = [\n \"#183c44\",\n \"#da4949\",\n \"#bcca15\",\n \"#ffb02e\",\n \"#35a6e6\",\n \"#d343a2\",\n \"#38c995\",\n \"#ffe8c1\",\n]\nbackground = \"#132f35\"\nbrights = [\n \"#235662\",\n \"#ff5757\",\n \"#ecff14\",\n \"#ffd694\",\n \"#4cbfff\",\n \"#ff4cc2\",\n \"#35ffb6\",\n \"#ffd48f\",\n]\ncursor_bg = \"#d1b890\"\ncursor_border = \"#d1b890\"\ncursor_fg = \"#132f35\"\nforeground = \"#d1b890\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Website (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"nightly builds only\"\n"), +("Website (Gogh)", "[colors]\nansi = [\n \"#183c44\",\n \"#da4949\",\n \"#bcca15\",\n \"#ffb02e\",\n \"#35a6e6\",\n \"#d343a2\",\n \"#38c995\",\n \"#ffe8c1\",\n]\nbackground = \"#132f35\"\nbrights = [\n \"#235662\",\n \"#ff5757\",\n \"#ecff14\",\n \"#ffd694\",\n \"#4cbfff\",\n \"#ff4cc2\",\n \"#35ffb6\",\n \"#ffd48f\",\n]\ncursor_bg = \"#d1b890\"\ncursor_border = \"#d1b890\"\ncursor_fg = \"#132f35\"\nforeground = \"#d1b890\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Website (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20240127-113634-bbcac864\"\n"), ("Wez", "[colors]\nansi = [\n \"#000000\",\n \"#cc5555\",\n \"#55cc55\",\n \"#cdcd55\",\n \"#5555cc\",\n \"#cc55cc\",\n \"#7acaca\",\n \"#cccccc\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#555555\",\n \"#ff5555\",\n \"#55ff55\",\n \"#ffff55\",\n \"#5555ff\",\n \"#ff55ff\",\n \"#55ffff\",\n \"#ffffff\",\n]\ncursor_bg = \"#53ae71\"\ncursor_border = \"#53ae71\"\ncursor_fg = \"#000000\"\nforeground = \"#b3b3b3\"\nselection_bg = \"#4d52f8\"\nselection_fg = \"#000000\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"Wez (Gogh)\"]\nname = \"Wez\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Wez (Gogh)", "[colors]\nansi = [\n \"#000000\",\n \"#cc5555\",\n \"#55cc55\",\n \"#cdcd55\",\n \"#5555cc\",\n \"#cc55cc\",\n \"#7acaca\",\n \"#cccccc\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#555555\",\n \"#ff5555\",\n \"#55ff55\",\n \"#ffff55\",\n \"#5555ff\",\n \"#ff55ff\",\n \"#55ffff\",\n \"#ffffff\",\n]\ncursor_bg = \"#b3b3b3\"\ncursor_border = \"#b3b3b3\"\ncursor_fg = \"#000000\"\nforeground = \"#b3b3b3\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Wez (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), ("Whimsy", "[colors]\nansi = [\n \"#535178\",\n \"#ef6487\",\n \"#5eca89\",\n \"#fdd877\",\n \"#65aef7\",\n \"#aa7ff0\",\n \"#43c1be\",\n \"#ffffff\",\n]\nbackground = \"#29283b\"\nbrights = [\n \"#535178\",\n \"#ef6487\",\n \"#5eca89\",\n \"#fdd877\",\n \"#65aef7\",\n \"#aa7ff0\",\n \"#43c1be\",\n \"#ffffff\",\n]\ncursor_bg = \"#b3b0d6\"\ncursor_border = \"#b3b0d6\"\ncursor_fg = \"#535178\"\nforeground = \"#b3b0d6\"\nselection_bg = \"#3d3c58\"\nselection_fg = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Whimsy\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), @@ -955,7 +982,7 @@ pub const SCHEMES: [(&'static str, &'static str); 966] = [ ("Woodland (base16)", "[colors]\nansi = [\n \"#231e18\",\n \"#d35c5c\",\n \"#b7ba53\",\n \"#e0ac16\",\n \"#88a4d3\",\n \"#bb90e2\",\n \"#6eb958\",\n \"#cabcb1\",\n]\nbackground = \"#231e18\"\nbrights = [\n \"#9d8b70\",\n \"#d35c5c\",\n \"#b7ba53\",\n \"#e0ac16\",\n \"#88a4d3\",\n \"#bb90e2\",\n \"#6eb958\",\n \"#e4d4c8\",\n]\ncursor_bg = \"#cabcb1\"\ncursor_border = \"#cabcb1\"\ncursor_fg = \"#231e18\"\nforeground = \"#cabcb1\"\nselection_bg = \"#cabcb1\"\nselection_fg = \"#231e18\"\n\n[colors.indexed]\n16 = \"#ca7f32\"\n17 = \"#b49368\"\n18 = \"#302b25\"\n19 = \"#48413a\"\n20 = \"#b4a490\"\n21 = \"#d7c8bc\"\n\n[metadata]\naliases = []\nauthor = \"Jay Cornwall (https://jcornwall.com)\"\nname = \"Woodland (base16)\"\norigin_url = \"https://github.com/jcornwall/base16-woodland-scheme\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("Wryan", "[colors]\nansi = [\n \"#333333\",\n \"#8c4665\",\n \"#287373\",\n \"#7c7c99\",\n \"#395573\",\n \"#5e468c\",\n \"#31658c\",\n \"#899ca1\",\n]\nbackground = \"#101010\"\nbrights = [\n \"#3d3d3d\",\n \"#bf4d80\",\n \"#53a6a6\",\n \"#9e9ecb\",\n \"#477ab3\",\n \"#7e62b3\",\n \"#6096bf\",\n \"#c0c0c0\",\n]\ncursor_bg = \"#9e9ecb\"\ncursor_border = \"#9e9ecb\"\ncursor_fg = \"#000000\"\nforeground = \"#999993\"\nselection_bg = \"#4d4d4d\"\nselection_fg = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"Wryan (Gogh)\"]\nname = \"Wryan\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Wryan (Gogh)", "[colors]\nansi = [\n \"#333333\",\n \"#8c4665\",\n \"#287373\",\n \"#7c7c99\",\n \"#395573\",\n \"#5e468c\",\n \"#31658c\",\n \"#899ca1\",\n]\nbackground = \"#101010\"\nbrights = [\n \"#3d3d3d\",\n \"#bf4d80\",\n \"#53a6a6\",\n \"#9e9ecb\",\n \"#477ab3\",\n \"#7e62b3\",\n \"#6096bf\",\n \"#c0c0c0\",\n]\ncursor_bg = \"#999993\"\ncursor_border = \"#999993\"\ncursor_fg = \"#101010\"\nforeground = \"#999993\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Wryan (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), -("Wzoreck (Gogh)", "[colors]\nansi = [\n \"#2e3436\",\n \"#fc6386\",\n \"#424043\",\n \"#fce94f\",\n \"#fb976b\",\n \"#75507b\",\n \"#34e2e2\",\n \"#ffffff\",\n]\nbackground = \"#424043\"\nbrights = [\n \"#989595\",\n \"#fc6386\",\n \"#a9dc76\",\n \"#fce94f\",\n \"#fb976b\",\n \"#ab9df2\",\n \"#34e2e2\",\n \"#d1d1c0\",\n]\ncursor_bg = \"#fcfcfa\"\ncursor_border = \"#fcfcfa\"\ncursor_fg = \"#424043\"\nforeground = \"#fcfcfa\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Wzoreck (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), +("Wzoreck (Gogh)", "[colors]\nansi = [\n \"#2e3436\",\n \"#fc6386\",\n \"#a9dc76\",\n \"#fce94f\",\n \"#fb976b\",\n \"#75507b\",\n \"#34e2e2\",\n \"#ffffff\",\n]\nbackground = \"#424043\"\nbrights = [\n \"#989595\",\n \"#fc6386\",\n \"#a9dc76\",\n \"#fce94f\",\n \"#fb976b\",\n \"#ab9df2\",\n \"#34e2e2\",\n \"#d1d1c0\",\n]\ncursor_bg = \"#fcfcfa\"\ncursor_border = \"#fcfcfa\"\ncursor_fg = \"#424043\"\nforeground = \"#fcfcfa\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Wzoreck (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("X::DotShare (terminal.sexy)", "[colors]\nansi = [\n \"#101010\",\n \"#e84f4f\",\n \"#b8d68c\",\n \"#e1aa5d\",\n \"#7dc1cf\",\n \"#9b64fb\",\n \"#6d878d\",\n \"#dddddd\",\n]\nbackground = \"#151515\"\nbrights = [\n \"#404040\",\n \"#d23d3d\",\n \"#a0cf5d\",\n \"#f39d21\",\n \"#4e9fb1\",\n \"#8542ff\",\n \"#42717b\",\n \"#dddddd\",\n]\nforeground = \"#d7d0c7\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"crshd\"\nname = \"X::DotShare (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("X::Erosion (terminal.sexy)", "[colors]\nansi = [\n \"#332d29\",\n \"#8c644c\",\n \"#746c48\",\n \"#908a66\",\n \"#646a6d\",\n \"#605655\",\n \"#4b5c5e\",\n \"#504339\",\n]\nbackground = \"#181512\"\nbrights = [\n \"#817267\",\n \"#9f7155\",\n \"#857b52\",\n \"#9c956e\",\n \"#71777a\",\n \"#656565\",\n \"#556d70\",\n \"#9a875f\",\n]\nforeground = \"#bea492\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"earsplit\"\nname = \"X::Erosion (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("XCode Dusk (base16)", "[colors]\nansi = [\n \"#282b35\",\n \"#b21889\",\n \"#df0002\",\n \"#438288\",\n \"#790ead\",\n \"#b21889\",\n \"#00a0be\",\n \"#939599\",\n]\nbackground = \"#282b35\"\nbrights = [\n \"#686a71\",\n \"#b21889\",\n \"#df0002\",\n \"#438288\",\n \"#790ead\",\n \"#b21889\",\n \"#00a0be\",\n \"#bebfc2\",\n]\ncursor_bg = \"#939599\"\ncursor_border = \"#939599\"\ncursor_fg = \"#282b35\"\nforeground = \"#939599\"\nselection_bg = \"#939599\"\nselection_fg = \"#282b35\"\n\n[colors.indexed]\n16 = \"#786dc5\"\n17 = \"#c77c48\"\n18 = \"#3d4048\"\n19 = \"#53555d\"\n20 = \"#7e8086\"\n21 = \"#a9aaae\"\n\n[metadata]\naliases = []\nauthor = \"Elsa Gonsiorowski (https://github.com/gonsie)\"\nname = \"XCode Dusk (base16)\"\norigin_url = \"https://github.com/gonsie/base16-xcode-dusk-scheme\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), @@ -964,7 +991,7 @@ pub const SCHEMES: [(&'static str, &'static str); 966] = [ ("zenbones_dark", "[colors]\nansi = [\n \"#1c1917\",\n \"#de6e7c\",\n \"#819b69\",\n \"#b77e64\",\n \"#6099c0\",\n \"#b279a7\",\n \"#66a5ad\",\n \"#b4bdc3\",\n]\nbackground = \"#1c1917\"\nbrights = [\n \"#403833\",\n \"#e8838f\",\n \"#8bae68\",\n \"#d68c67\",\n \"#61abda\",\n \"#cf86c1\",\n \"#65b8c1\",\n \"#888f94\",\n]\ncursor_bg = \"#c4cacf\"\ncursor_border = \"#c4cacf\"\ncursor_fg = \"#1c1917\"\nforeground = \"#b4bdc3\"\nselection_bg = \"#3d4042\"\nselection_fg = \"#b4bdc3\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"zenbones_dark\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Zenburn", "[colors]\nansi = [\n \"#4d4d4d\",\n \"#705050\",\n \"#60b48a\",\n \"#f0dfaf\",\n \"#506070\",\n \"#dc8cc3\",\n \"#8cd0d3\",\n \"#dcdccc\",\n]\nbackground = \"#3f3f3f\"\nbrights = [\n \"#709080\",\n \"#dca3a3\",\n \"#c3bf9f\",\n \"#e0cf9f\",\n \"#94bff3\",\n \"#ec93d3\",\n \"#93e0e3\",\n \"#ffffff\",\n]\ncursor_bg = \"#73635a\"\ncursor_border = \"#73635a\"\ncursor_fg = \"#000000\"\nforeground = \"#dcdccc\"\nselection_bg = \"#21322f\"\nselection_fg = \"#c2d87a\"\n\n[colors.indexed]\n\n[metadata]\naliases = [\"Zenburn (Gogh)\"]\nname = \"Zenburn\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("Zenburn (base16)", "[colors]\nansi = [\n \"#383838\",\n \"#dca3a3\",\n \"#5f7f5f\",\n \"#e0cf9f\",\n \"#7cb8bb\",\n \"#dc8cc3\",\n \"#93e0e3\",\n \"#dcdccc\",\n]\nbackground = \"#383838\"\nbrights = [\n \"#6f6f6f\",\n \"#dca3a3\",\n \"#5f7f5f\",\n \"#e0cf9f\",\n \"#7cb8bb\",\n \"#dc8cc3\",\n \"#93e0e3\",\n \"#ffffff\",\n]\ncursor_bg = \"#dcdccc\"\ncursor_border = \"#dcdccc\"\ncursor_fg = \"#383838\"\nforeground = \"#dcdccc\"\nselection_bg = \"#dcdccc\"\nselection_fg = \"#383838\"\n\n[colors.indexed]\n16 = \"#dfaf8f\"\n17 = \"#000000\"\n18 = \"#404040\"\n19 = \"#606060\"\n20 = \"#808080\"\n21 = \"#c0c0c0\"\n\n[metadata]\naliases = []\nauthor = \"elnawe\"\nname = \"Zenburn (base16)\"\norigin_url = \"https://github.com/elnawe/base16-zenburn-scheme\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), -("Zenburn (Gogh)", "[colors]\nansi = [\n \"#4d4d4d\",\n \"#705050\",\n \"#60b48a\",\n \"#f0dfaf\",\n \"#506070\",\n \"#dc8cc3\",\n \"#8cd0d3\",\n \"#dcdccc\",\n]\nbackground = \"#3f3f3f\"\nbrights = [\n \"#709080\",\n \"#dca3a3\",\n \"#c3bf9f\",\n \"#e0cf9f\",\n \"#94bff3\",\n \"#ec93d3\",\n \"#93e0e3\",\n \"#ffffff\",\n]\ncursor_bg = \"#dcdccc\"\ncursor_border = \"#dcdccc\"\ncursor_fg = \"#3f3f3f\"\nforeground = \"#dcdccc\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Zenburn (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), +("Zenburn (Gogh)", "[colors]\nansi = [\n \"#333333\",\n \"#cc9393\",\n \"#efef87\",\n \"#ffd7a7\",\n \"#c3bf97\",\n \"#bca3a3\",\n \"#93b3a3\",\n \"#f0efd0\",\n]\nbackground = \"#3a3a3a\"\nbrights = [\n \"#757575\",\n \"#dfaf87\",\n \"#ffff87\",\n \"#ffcfaf\",\n \"#d7d7af\",\n \"#d7afaf\",\n \"#93bea3\",\n \"#dcdccc\",\n]\ncursor_bg = \"#dcdccc\"\ncursor_border = \"#dcdccc\"\ncursor_fg = \"#3a3a3a\"\nforeground = \"#dcdccc\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"Zenburn (Gogh)\"\norigin_url = \"https://github.com/Gogh-Co/Gogh\"\nwezterm_version = \"20230712-072601-f4abf8fd\"\n"), ("zenburn (terminal.sexy)", "[colors]\nansi = [\n \"#1e2320\",\n \"#705050\",\n \"#60b48a\",\n \"#dfaf8f\",\n \"#506070\",\n \"#dc8cc3\",\n \"#8cd0d3\",\n \"#dcdccc\",\n]\nbackground = \"#000000\"\nbrights = [\n \"#709080\",\n \"#dca3a3\",\n \"#c3bf9f\",\n \"#f0dfaf\",\n \"#94bff3\",\n \"#ec93d3\",\n \"#93e0e3\",\n \"#ffffff\",\n]\nforeground = \"#ffffff\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nauthor = \"\"\nname = \"zenburn (terminal.sexy)\"\norigin_url = \"https://github.com/stayradiated/terminal.sexy\"\nwezterm_version = \"20220807-113146-c2fee766\"\n"), ("zenburned", "[colors]\nansi = [\n \"#404040\",\n \"#e3716e\",\n \"#819b69\",\n \"#b77e64\",\n \"#6099c0\",\n \"#b279a7\",\n \"#66a5ad\",\n \"#f0e4cf\",\n]\nbackground = \"#404040\"\nbrights = [\n \"#625a5b\",\n \"#ec8685\",\n \"#8bae68\",\n \"#d68c67\",\n \"#61abda\",\n \"#cf86c1\",\n \"#65b8c1\",\n \"#c0ab86\",\n]\ncursor_bg = \"#f3eadb\"\ncursor_border = \"#f3eadb\"\ncursor_fg = \"#404040\"\nforeground = \"#f0e4cf\"\nselection_bg = \"#746956\"\nselection_fg = \"#f0e4cf\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"zenburned\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), ("zenwritten_dark", "[colors]\nansi = [\n \"#191919\",\n \"#de6e7c\",\n \"#819b69\",\n \"#b77e64\",\n \"#6099c0\",\n \"#b279a7\",\n \"#66a5ad\",\n \"#bbbbbb\",\n]\nbackground = \"#191919\"\nbrights = [\n \"#3d3839\",\n \"#e8838f\",\n \"#8bae68\",\n \"#d68c67\",\n \"#61abda\",\n \"#cf86c1\",\n \"#65b8c1\",\n \"#8e8e8e\",\n]\ncursor_bg = \"#c9c9c9\"\ncursor_border = \"#c9c9c9\"\ncursor_fg = \"#191919\"\nforeground = \"#bbbbbb\"\nselection_bg = \"#404040\"\nselection_fg = \"#bbbbbb\"\n\n[colors.indexed]\n\n[metadata]\naliases = []\nname = \"zenwritten_dark\"\norigin_url = \"https://github.com/mbadolato/iTerm2-Color-Schemes\"\nwezterm_version = \"Always\"\n"), diff --git a/config/src/ssh.rs b/config/src/ssh.rs index 1680eab46..e725800fd 100644 --- a/config/src/ssh.rs +++ b/config/src/ssh.rs @@ -83,6 +83,9 @@ pub struct SshDomain { /// The path to the wezterm binary on the remote host pub remote_wezterm_path: Option, + /// Override the entire `wezterm cli proxy` invocation that would otherwise + /// be computed from remote_wezterm_path and other information. + pub override_proxy_command: Option, pub ssh_backend: Option, diff --git a/deny.toml b/deny.toml new file mode 100644 index 000000000..7a9290cd4 --- /dev/null +++ b/deny.toml @@ -0,0 +1,245 @@ +# This template contains all of the possible sections and their default values + +# Note that all fields that take a lint level have these possible values: +# * deny - An error will be produced and the check will fail +# * warn - A warning will be produced, but the check will not fail +# * allow - No warning or error will be produced, though in some cases a note +# will be + +# The values provided in this template are the default values that will be used +# when any section or field is not specified in your own configuration + +# Root options + +# The graph table configures how the dependency graph is constructed and thus +# which crates the checks are performed against +[graph] +# If 1 or more target triples (and optionally, target_features) are specified, +# only the specified targets will be checked when running `cargo deny check`. +# This means, if a particular package is only ever used as a target specific +# dependency, such as, for example, the `nix` crate only being used via the +# `target_family = "unix"` configuration, that only having windows targets in +# this list would mean the nix crate, as well as any of its exclusive +# dependencies not shared by any other crates, would be ignored, as the target +# list here is effectively saying which targets you are building for. +targets = [ + # The triple can be any string, but only the target triples built in to + # rustc (as of 1.40) can be checked against actual config expressions + #"x86_64-unknown-linux-musl", + # You can also specify which target_features you promise are enabled for a + # particular target. target_features are currently not validated against + # the actual valid features supported by the target architecture. + #{ triple = "wasm32-unknown-unknown", features = ["atomics"] }, +] +# When creating the dependency graph used as the source of truth when checks are +# executed, this field can be used to prune crates from the graph, removing them +# from the view of cargo-deny. This is an extremely heavy hammer, as if a crate +# is pruned from the graph, all of its dependencies will also be pruned unless +# they are connected to another crate in the graph that hasn't been pruned, +# so it should be used with care. The identifiers are [Package ID Specifications] +# (https://doc.rust-lang.org/cargo/reference/pkgid-spec.html) +#exclude = [] +# If true, metadata will be collected with `--all-features`. Note that this can't +# be toggled off if true, if you want to conditionally enable `--all-features` it +# is recommended to pass `--all-features` on the cmd line instead +all-features = false +# If true, metadata will be collected with `--no-default-features`. The same +# caveat with `all-features` applies +no-default-features = false +# If set, these feature will be enabled when collecting metadata. If `--features` +# is specified on the cmd line they will take precedence over this option. +#features = [] + +# The output table provides options for how/if diagnostics are outputted +[output] +# When outputting inclusion graphs in diagnostics that include features, this +# option can be used to specify the depth at which feature edges will be added. +# This option is included since the graphs can be quite large and the addition +# of features from the crate(s) to all of the graph roots can be far too verbose. +# This option can be overridden via `--feature-depth` on the cmd line +feature-depth = 1 + +# This section is considered when running `cargo deny check advisories` +# More documentation for the advisories section can be found here: +# https://embarkstudios.github.io/cargo-deny/checks/advisories/cfg.html +[advisories] +# The path where the advisory databases are cloned/fetched into +#db-path = "$CARGO_HOME/advisory-dbs" +# The url(s) of the advisory databases to use +#db-urls = ["https://github.com/rustsec/advisory-db"] +# A list of advisory IDs to ignore. Note that ignored advisories will still +# output a note when they are encountered. +ignore = [ + #"RUSTSEC-0000-0000", + #{ id = "RUSTSEC-0000-0000", reason = "you can specify a reason the advisory is ignored" }, + #"a-crate-that-is-yanked@0.1.1", # you can also ignore yanked crate versions if you wish + #{ crate = "a-crate-that-is-yanked@0.1.1", reason = "you can specify why you are ignoring the yanked crate" }, +] +# If this is true, then cargo deny will use the git executable to fetch advisory database. +# If this is false, then it uses a built-in git library. +# Setting this to true can be helpful if you have special authentication requirements that cargo-deny does not support. +# See Git Authentication for more information about setting up git authentication. +#git-fetch-with-cli = true + +# This section is considered when running `cargo deny check licenses` +# More documentation for the licenses section can be found here: +# https://embarkstudios.github.io/cargo-deny/checks/licenses/cfg.html +[licenses] +# List of explicitly allowed licenses +# See https://spdx.org/licenses/ for list of possible licenses +# [possible values: any SPDX 3.11 short identifier (+ optional exception)]. +allow = [ + "MIT", + "Apache-2.0", + "LGPL-2.1", + "Unicode-DFS-2016", + "Zlib", + "BSD-2-Clause", + "BSD-3-Clause", + "MPL-2.0", + "ISC", + "CC0-1.0", + "WTFPL", + "Apache-2.0 WITH LLVM-exception", + "OpenSSL", +] +# The confidence threshold for detecting a license from license text. +# The higher the value, the more closely the license text must be to the +# canonical license text of a valid SPDX license file. +# [possible values: any between 0.0 and 1.0]. +confidence-threshold = 0.8 +# Allow 1 or more licenses on a per-crate basis, so that particular licenses +# aren't accepted for every possible crate as with the normal allow list +exceptions = [ + # Each entry is the crate and version constraint, and its specific allow + # list + #{ allow = ["Zlib"], crate = "adler32" }, +] + +# Some crates don't have (easily) machine readable licensing information, +# adding a clarification entry for it allows you to manually specify the +# licensing information +[[licenses.clarify]] +# The package spec the clarification applies to +crate = "ring" +# The SPDX expression for the license requirements of the crate +expression = "MIT AND ISC AND OpenSSL" +# One or more files in the crate's source used as the "source of truth" for +# the license expression. If the contents match, the clarification will be used +# when running the license check, otherwise the clarification will be ignored +# and the crate will be checked normally, which may produce warnings or errors +# depending on the rest of your configuration +license-files = [ +# Each entry is a crate relative path, and the (opaque) hash of its contents +{ path = "LICENSE", hash = 0xbd0eed23 } +] + +[licenses.private] +# If true, ignores workspace crates that aren't published, or are only +# published to private registries. +# To see how to mark a crate as unpublished (to the official registry), +# visit https://doc.rust-lang.org/cargo/reference/manifest.html#the-publish-field. +ignore = true +# One or more private registries that you might publish crates to, if a crate +# is only published to private registries, and ignore is true, the crate will +# not have its license(s) checked +registries = [ + #"https://sekretz.com/registry +] + +# This section is considered when running `cargo deny check bans`. +# More documentation about the 'bans' section can be found here: +# https://embarkstudios.github.io/cargo-deny/checks/bans/cfg.html +[bans] +# Lint level for when multiple versions of the same crate are detected +multiple-versions = "warn" +# Lint level for when a crate version requirement is `*` +wildcards = "allow" +# The graph highlighting used when creating dotgraphs for crates +# with multiple versions +# * lowest-version - The path to the lowest versioned duplicate is highlighted +# * simplest-path - The path to the version with the fewest edges is highlighted +# * all - Both lowest-version and simplest-path are used +highlight = "all" +# The default lint level for `default` features for crates that are members of +# the workspace that is being checked. This can be overridden by allowing/denying +# `default` on a crate-by-crate basis if desired. +workspace-default-features = "allow" +# The default lint level for `default` features for external crates that are not +# members of the workspace. This can be overridden by allowing/denying `default` +# on a crate-by-crate basis if desired. +external-default-features = "allow" +# List of crates that are allowed. Use with care! +allow = [ + #"ansi_term@0.11.0", + #{ crate = "ansi_term@0.11.0", reason = "you can specify a reason it is allowed" }, +] +# List of crates to deny +deny = [ + #"ansi_term@0.11.0", + #{ crate = "ansi_term@0.11.0", reason = "you can specify a reason it is banned" }, + # Wrapper crates can optionally be specified to allow the crate when it + # is a direct dependency of the otherwise banned crate + #{ crate = "ansi_term@0.11.0", wrappers = ["this-crate-directly-depends-on-ansi_term"] }, +] + +# List of features to allow/deny +# Each entry the name of a crate and a version range. If version is +# not specified, all versions will be matched. +#[[bans.features]] +#crate = "reqwest" +# Features to not allow +#deny = ["json"] +# Features to allow +#allow = [ +# "rustls", +# "__rustls", +# "__tls", +# "hyper-rustls", +# "rustls", +# "rustls-pemfile", +# "rustls-tls-webpki-roots", +# "tokio-rustls", +# "webpki-roots", +#] +# If true, the allowed features must exactly match the enabled feature set. If +# this is set there is no point setting `deny` +#exact = true + +# Certain crates/versions that will be skipped when doing duplicate detection. +skip = [ + #"ansi_term@0.11.0", + #{ crate = "ansi_term@0.11.0", reason = "you can specify a reason why it can't be updated/removed" }, +] +# Similarly to `skip` allows you to skip certain crates during duplicate +# detection. Unlike skip, it also includes the entire tree of transitive +# dependencies starting at the specified crate, up to a certain depth, which is +# by default infinite. +skip-tree = [ + #"ansi_term@0.11.0", # will be skipped along with _all_ of its direct and transitive dependencies + #{ crate = "ansi_term@0.11.0", depth = 20 }, +] + +# This section is considered when running `cargo deny check sources`. +# More documentation about the 'sources' section can be found here: +# https://embarkstudios.github.io/cargo-deny/checks/sources/cfg.html +[sources] +# Lint level for what to happen when a crate from a crate registry that is not +# in the allow list is encountered +unknown-registry = "warn" +# Lint level for what to happen when a crate from a git repository that is not +# in the allow list is encountered +unknown-git = "warn" +# List of URLs for allowed crate registries. Defaults to the crates.io index +# if not specified. If it is specified but empty, no registries are allowed. +allow-registry = ["https://github.com/rust-lang/crates.io-index"] +# List of URLs for allowed Git repositories +allow-git = [] + +[sources.allow-org] +# 1 or more github.com organizations to allow git sources for +github = [""] +# 1 or more gitlab.com organizations to allow git sources for +gitlab = [""] +# 1 or more bitbucket.org organizations to allow git sources for +bitbucket = [""] diff --git a/deps/fontconfig/Cargo.toml b/deps/fontconfig/Cargo.toml index 36b0966a0..0eb860833 100644 --- a/deps/fontconfig/Cargo.toml +++ b/deps/fontconfig/Cargo.toml @@ -5,6 +5,7 @@ version = "0.1.0" edition = "2018" links = "fontconfig" build = "build.rs" +publish = false [dependencies] libc = "~0.2" diff --git a/deps/freetype/Cargo.toml b/deps/freetype/Cargo.toml index 41ffbaad9..81730ff97 100644 --- a/deps/freetype/Cargo.toml +++ b/deps/freetype/Cargo.toml @@ -5,6 +5,7 @@ version = "0.1.0" edition = "2018" links = "freetype" build = "build.rs" +publish = false [dependencies] fixed = "1.23" diff --git a/deps/harfbuzz/Cargo.toml b/deps/harfbuzz/Cargo.toml index 66e32fd8a..be3a470d8 100644 --- a/deps/harfbuzz/Cargo.toml +++ b/deps/harfbuzz/Cargo.toml @@ -5,6 +5,7 @@ version = "0.1.0" edition = "2018" links = "harfbuzz" build = "build.rs" +publish = false [dependencies] freetype = { path = "../freetype" } diff --git a/deps/harfbuzz/harfbuzz b/deps/harfbuzz/harfbuzz index 894a1f72e..63973005b 160000 --- a/deps/harfbuzz/harfbuzz +++ b/deps/harfbuzz/harfbuzz @@ -1 +1 @@ -Subproject commit 894a1f72ee93a1fd8dc1d9218cb3fd8f048be29a +Subproject commit 63973005bc07aba599b47fdd4cf788647b601ccd diff --git a/deps/harfbuzz/src/lib.rs b/deps/harfbuzz/src/lib.rs index b0cd3bf20..8d9f43ab7 100644 --- a/deps/harfbuzz/src/lib.rs +++ b/deps/harfbuzz/src/lib.rs @@ -1,4 +1,4 @@ -/* automatically generated by rust-bindgen 0.66.1 */ +/* automatically generated by rust-bindgen 0.69.4 */ #![allow(non_snake_case)] #![allow(non_camel_case_types)] @@ -2728,6 +2728,12 @@ extern "C" { extern "C" { pub fn hb_buffer_get_not_found_glyph(buffer: *const hb_buffer_t) -> hb_codepoint_t; } +extern "C" { + pub fn hb_buffer_set_random_state(buffer: *mut hb_buffer_t, state: ::std::os::raw::c_uint); +} +extern "C" { + pub fn hb_buffer_get_random_state(buffer: *const hb_buffer_t) -> ::std::os::raw::c_uint; +} extern "C" { pub fn hb_buffer_clear_contents(buffer: *mut hb_buffer_t); } diff --git a/docs/changelog.md b/docs/changelog.md index 2d5627a4e..fb75b0b00 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -28,12 +28,28 @@ As features stabilize some brief notes about them will accumulate here. * [show_update_window](config/lua/config/show_update_window.md) has been deprecated; it no longer has any effect and will be removed in a future release. +* X11: drag and drop is now supported for files, URLs and text. Thanks to + @ssiegel! #5316 #640 +* Added Unicode Symbols for Legacy Computing to the set of pixel-perfect block + drawing glyphs. See + [custom_block_glyphs](config/lua/config/custom_block_glyphs.md) for more + details. Thanks to @stribor14! #5051 #5169 + #### New * [wezterm.serde](config/lua/wezterm.serde/index.md) module for serialization and deserialization of JSON, TOML and YAML. Thanks to @expnn! #4969 +* `wezterm ssh` now supports agent forwarding. Thanks to @Riatre! #5345 +* SSH multiplexer domains now support agent forwarding, and will automatically + maintain `SSH_AUTH_SOCK` to an appropriate value on the destination host, + depending on the value of the new + [mux_enable_ssh_agent](config/lua/config/mux_enable_ssh_agent.md) option. + ?988 #1647 +* [default_ssh_auth_sock](config/lua/config/default_ssh_auth_sock.md) option + to manage `SSH_AUTH_SOCK`. + #### Fixed * Race condition when very quickly adjusting font scale, and other improvements - around resizing. Thanks to @jknockel! #4876 #5032 + around resizing. Thanks to @jknockel! #4876 #5032 #5033 * macOS: wacky initial window size with external monitors or certain font sizes. #4966 #4250 * macOS: dragging non-filename data over wezterm could cause it to crash. #4771 @@ -42,9 +58,55 @@ As features stabilize some brief notes about them will accumulate here. * Linux: the `divine_process_list` fallback function used the *vmwisze* rather than the intended *starttime* field to decide which process was the youngest. Thanks to @crides! #5001 +* Wayland: fixed startup on Hyprland >= 0.37.0. Thanks to @fioncat! #5264 #5103 +* Wayland: updated to SCTK 0.18. Thanks to @deviant! #5276 #5154 #5079 #5071 + #4604 #5209 +* Windows: Window buttons stopped working when using `win32_system_backdrop`. + Thanks to @Kushagra2569! #5362 #5348 +* `wezterm cli activate-pane` now respects `unzoom_on_switch_pane`. Thanks to + @quantonganh! #5306 #5305 +* wezterm-ssh now correctly handles two-phase processing of `%h` tokens. Thanks + to @emc2314 and @wheatdog! #5163 #4503 +* We now respect line wrapping in alt-screen mode. Thanks to @eternity74! #5396 + #3283 +* Wayland: hang when launched under ChromeOS Crostini. Thanks to @dberlin! + #5393 #5397 #### Updated * Bundled conpty.dll and OpenConsole.exe to build 1.19.240130002.nupkg +* Bundled harfbuzz to 8.4.0 +* image crate to 0.25, which means that JPEG images are now decoded via + [zune-jpeg](https://docs.rs/zune-jpeg/latest/zune_jpeg/), which improves + handling of non-conforming jpeg images. #5365 +* Color schemes: + [Blue Dolphin (Gogh)](colorschemes/b/index.md#blue-dolphin-gogh), + [Butrin (Gogh)](colorschemes/b/index.md#butrin-gogh), + [CutiePro](colorschemes/c/index.md#cutiepro), + [Ef-Dream](colorschemes/e/index.md#ef-dream), + [Ef-Reverie](colorschemes/e/index.md#ef-reverie), + [Eldritch](colorschemes/e/index.md#eldritch), + [Everforest Dark Hard (Gogh)](colorschemes/e/index.md#everforest-dark-hard-gogh), + [Everforest Dark Medium (Gogh)](colorschemes/e/index.md#everforest-dark-medium-gogh), + [Everforest Dark Soft (Gogh)](colorschemes/e/index.md#everforest-dark-soft-gogh), + [Everforest Light Hard (Gogh)](colorschemes/e/index.md#everforest-light-hard-gogh), + [Everforest Light Medium (Gogh)](colorschemes/e/index.md#everforest-light-medium-gogh), + [Everforest Light Soft (Gogh)](colorschemes/e/index.md#everforest-light-soft-gogh), + [Github Light (Gogh)](colorschemes/g/index.md#github-light-gogh), + [Kanagawa Dragon (Gogh)](colorschemes/k/index.md#kanagawa-dragon-gogh), + [Mellifluous](colorschemes/m/index.md#mellifluous), + [Miramare (Gogh)](colorschemes/m/index.md#miramare-gogh), + [Modus Operandi (Gogh)](colorschemes/m/index.md#modus-operandi-gogh), + [Modus Operandi Tinted (Gogh)](colorschemes/m/index.md#modus-operandi-tinted-gogh), + [Modus Vivendi (Gogh)](colorschemes/m/index.md#modus-vivendi-gogh), + [Modus Vivendi Tinted (Gogh)](colorschemes/m/index.md#modus-vivendi-tinted-gogh), + [NvimDark](colorschemes/n/index.md#nvimdark), + [NvimLight](colorschemes/n/index.md#nvimlight), + [Quiet (Gogh)](colorschemes/q/index.md#quiet-gogh), + [Selenized Black (Gogh)](colorschemes/s/index.md#selenized-black-gogh), + [Selenized White (Gogh)](colorschemes/s/index.md#selenized-white-gogh), + [Seoul256 (Gogh)](colorschemes/s/index.md#seoul256-gogh), + [Seoul256 Light (Gogh)](colorschemes/s/index.md#seoul256-light-gogh), + [Sparky (Gogh)](colorschemes/s/index.md#sparky-gogh) ### 20240203-110809-5046fc22 diff --git a/docs/colorschemes/data.json b/docs/colorschemes/data.json index 5591350f1..31627f2a2 100644 --- a/docs/colorschemes/data.json +++ b/docs/colorschemes/data.json @@ -2708,9 +2708,9 @@ "#ff5a67", "#7fc06e", "#ffcc1b", - "#5dd7b9", - "#9a70a4", "#14747e", + "#9a70a4", + "#5dd7b9", "#a1a19a" ], "background": "#002635", @@ -2719,9 +2719,9 @@ "#ff5a67", "#7fc06e", "#ffcc1b", - "#5dd7b9", - "#9a70a4", "#14747e", + "#9a70a4", + "#5dd7b9", "#fafaf8" ], "cursor_bg": "#a1a19a", @@ -3218,7 +3218,7 @@ "#1c1e1b", "#e75a7c", "#8fb573", - "#dbb671", + "#dbb651", "#57a5e5", "#aaaaff", "#70c2be", @@ -3229,7 +3229,7 @@ "#5b5e5a", "#e75a7c", "#8fb573", - "#dbb671", + "#dbb651", "#57a5e5", "#aaaaff", "#70c2be", @@ -3305,25 +3305,25 @@ "ansi": [ "#dadac2", "#c72a3c", - "#4fa533", - "#bb9651", - "#1765d5", + "#27850b", + "#a77b00", + "#1745d5", "#8a4adf", - "#00a2be", + "#188a9e", "#3a4238" ], "background": "#fafae0", "brights": [ "#c7c7af", "#c72a3c", - "#4fa533", - "#bb9651", - "#1765d5", + "#27850b", + "#a77b00", + "#1745d5", "#8a4adf", - "#00a2be", + "#188a9e", "#252623" ], - "compose_cursor": "#df7946", + "compose_cursor": "#df5926", "cursor_bg": "#0f0800", "cursor_border": "#0f0800", "cursor_fg": "#fff8f0", @@ -3394,10 +3394,10 @@ "#171f17", "#dc4f62", "#81af58", - "#cebe69", - "#5692c4", - "#ae93e0", - "#71ada2", + "#ceba49", + "#409cdc", + "#a09af8", + "#68baae", "#ece1c0" ], "background": "#232923", @@ -3405,13 +3405,13 @@ "#5a5e5a", "#dc4f62", "#81af58", - "#cebe69", - "#5692c4", - "#ae93e0", - "#71ada2", + "#ceba49", + "#409cdc", + "#a09af8", + "#68baae", "#fff8f0" ], - "compose_cursor": "#d99058", + "compose_cursor": "#ef9946", "cursor_bg": "#fff8f0", "cursor_border": "#fff8f0", "cursor_fg": "#0f0800", @@ -4649,6 +4649,43 @@ "wezterm_version": "20220807-113146-c2fee766" } }, + { + "colors": { + "ansi": [ + "#292d3e", + "#ff8288", + "#b4e88d", + "#f4d69f", + "#82aaff", + "#e9c1ff", + "#89ebff", + "#d0d0d0" + ], + "background": "#006984", + "brights": [ + "#434758", + "#ff8b92", + "#ddffa7", + "#ffe585", + "#9cc4ff", + "#ddb0f6", + "#a3f7ff", + "#ffffff" + ], + "cursor_bg": "#ffcc00", + "cursor_border": "#ffcc00", + "cursor_fg": "#006984", + "foreground": "#c5f2ff", + "indexed": {} + }, + "metadata": { + "aliases": [], + "name": "Blue Dolphin (Gogh)", + "origin_url": "https://github.com/Gogh-Co/Gogh", + "prefix": "b", + "wezterm_version": "nightly builds only" + } + }, { "colors": { "ansi": [ @@ -6011,6 +6048,43 @@ "wezterm_version": "Always" } }, + { + "colors": { + "ansi": [ + "#8c7e78", + "#e68a8a", + "#99cc99", + "#fad7a0", + "#6699cc", + "#c8a2c8", + "#6fc3b2", + "#e2cebe" + ], + "background": "#4b3b3c", + "brights": [ + "#bfaca4", + "#f2b1b1", + "#b2d8b2", + "#f7dcb4", + "#87cefa", + "#d8bfd8", + "#64dbdb", + "#f2f2f2" + ], + "cursor_bg": "#e39d93", + "cursor_border": "#e39d93", + "cursor_fg": "#4b3b3c", + "foreground": "#f2f2f2", + "indexed": {} + }, + "metadata": { + "aliases": [], + "name": "Butrin (Gogh)", + "origin_url": "https://github.com/Gogh-Co/Gogh", + "prefix": "b", + "wezterm_version": "nightly builds only" + } + }, { "colors": { "ansi": [ @@ -8555,6 +8629,45 @@ "wezterm_version": "20220807-113146-c2fee766" } }, + { + "colors": { + "ansi": [ + "#000000", + "#f56e7f", + "#bec975", + "#f58669", + "#42d9c5", + "#d286b7", + "#37cb8a", + "#d5c3c3" + ], + "background": "#181818", + "brights": [ + "#373b41", + "#e5a1a3", + "#e8d6a7", + "#f1bb79", + "#80c5de", + "#b294bb", + "#9dccbb", + "#ffffff" + ], + "cursor_bg": "#efc4cd", + "cursor_border": "#efc4cd", + "cursor_fg": "#181818", + "foreground": "#d5d0c9", + "indexed": {}, + "selection_bg": "#363636", + "selection_fg": "#d5d0c9" + }, + "metadata": { + "aliases": [], + "name": "CutiePro", + "origin_url": "https://github.com/mbadolato/iTerm2-Color-Schemes", + "prefix": "c", + "wezterm_version": "nightly builds only" + } + }, { "colors": { "ansi": [ @@ -10986,7 +11099,7 @@ "cursor_fg": "#0f0e06", "foreground": "#cfbcba", "indexed": {}, - "selection_bg": "#3f1020", + "selection_bg": "#3f1324", "selection_fg": "#cfbcba" }, "metadata": { @@ -11278,6 +11391,46 @@ "wezterm_version": "20240127-113634-bbcac864" } }, + { + "colors": { + "ansi": [ + "#322f34", + "#ff6f6f", + "#51b04f", + "#c0b24f", + "#57b0ff", + "#ffaacf", + "#6fb3c0", + "#efd5c5" + ], + "background": "#232025", + "brights": [ + "#5b595e", + "#e47980", + "#3fc489", + "#deb07a", + "#12b4ff", + "#d0b0ff", + "#65c5a8", + "#8f8886" + ], + "cursor_bg": "#f3c09a", + "cursor_border": "#f3c09a", + "cursor_fg": "#232025", + "foreground": "#efd5c5", + "indexed": {}, + "selection_bg": "#544a50", + "selection_fg": "#efd5c5" + }, + "metadata": { + "aliases": [], + "author": "anhsirk0", + "name": "Ef-Dream", + "origin_url": "https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-dream-theme.el", + "prefix": "e", + "wezterm_version": "nightly builds only" + } + }, { "colors": { "ansi": [ @@ -11525,7 +11678,7 @@ "#d3303a", "#217a3c", "#a45f22", - "#375cd8", + "#3740cf", "#ba35af", "#1f6fbf", "#202020" @@ -11684,7 +11837,7 @@ "#f5e9cb", "#ba2d2f", "#007a0a", - "#a46110", + "#a26310", "#375cc6", "#aa3e74", "#3f60af", @@ -11693,7 +11846,7 @@ "background": "#fff6d8", "brights": [ "#c7b7a6", - "#c03f3f", + "#c02945", "#008250", "#946830", "#265fbf", @@ -11746,7 +11899,7 @@ "cursor_fg": "#000e17", "foreground": "#afbcbf", "indexed": {}, - "selection_bg": "#222f40", + "selection_bg": "#253146", "selection_fg": "#afbcbf" }, "metadata": { @@ -11758,12 +11911,52 @@ "wezterm_version": "20240127-113634-bbcac864" } }, + { + "colors": { + "ansi": [ + "#e5d6d4", + "#ba2d2f", + "#007a0a", + "#87591f", + "#375cc6", + "#9f4e74", + "#3060af", + "#4f204f" + ], + "background": "#f3eddf", + "brights": [ + "#b9aaa8", + "#a83058", + "#008250", + "#906045", + "#265fbf", + "#7755b4", + "#0b6e8a", + "#6f6877" + ], + "cursor_bg": "#9d5744", + "cursor_border": "#9d5744", + "cursor_fg": "#f3eddf", + "foreground": "#4f204f", + "indexed": {}, + "selection_bg": "#e0d0ba", + "selection_fg": "#4f204f" + }, + "metadata": { + "aliases": [], + "author": "anhsirk0", + "name": "Ef-Reverie", + "origin_url": "https://git.sr.ht/~protesilaos/ef-themes/tree/main/item/ef-reverie-theme.el", + "prefix": "e", + "wezterm_version": "nightly builds only" + } + }, { "colors": { "ansi": [ "#432e32", "#ff707f", - "#55cb56", + "#5fbb5f", "#e4c53f", "#57aff6", "#ffb2d6", @@ -11906,7 +12099,7 @@ "cursor_fg": "#130911", "foreground": "#d0d0d0", "indexed": {}, - "selection_bg": "#2f2630", + "selection_bg": "#3f2f40", "selection_fg": "#d0d0d0" }, "metadata": { @@ -12006,7 +12199,7 @@ "#2fa526", "#c48702", "#379cf6", - "#b2608f", + "#b0648f", "#3fafcf", "#dfd0d5" ], @@ -12026,7 +12219,7 @@ "cursor_fg": "#15050f", "foreground": "#dfd0d5", "indexed": {}, - "selection_bg": "#202d3f", + "selection_bg": "#293140", "selection_fg": "#dfd0d5" }, "metadata": { @@ -12272,6 +12465,92 @@ "wezterm_version": "20220807-113146-c2fee766" } }, + { + "colors": { + "ansi": [ + "#212337", + "#f16c75", + "#37f499", + "#f7c67f", + "#a48cf2", + "#f265b5", + "#04d1f9", + "#ebfafa" + ], + "background": "#212337", + "brights": [ + "#323449", + "#f9515d", + "#37f499", + "#e9f941", + "#9071f4", + "#f265b5", + "#66e4fd", + "#ffffff" + ], + "compose_cursor": "#f7c67f", + "cursor_bg": "#37f499", + "cursor_border": "#04d1f9", + "cursor_fg": "#212337", + "foreground": "#ebfafa", + "indexed": {}, + "scrollbar_thumb": "#37f499", + "selection_bg": "rgba(26.666668% 27.843138% 35.294117% 50%)", + "selection_fg": "rgba(0% 0% 0% 0%)", + "split": "#a48cf2", + "tab_bar": { + "active_tab": { + "bg_color": "#37f499", + "fg_color": "#212337", + "intensity": "Normal", + "italic": false, + "strikethrough": false, + "underline": "None" + }, + "background": "#212337", + "inactive_tab": { + "bg_color": "#212337", + "fg_color": "#04d1f9", + "intensity": "Normal", + "italic": false, + "strikethrough": false, + "underline": "None" + }, + "inactive_tab_hover": { + "bg_color": "#37f499", + "fg_color": "#212337", + "intensity": "Normal", + "italic": true, + "strikethrough": false, + "underline": "None" + }, + "new_tab": { + "bg_color": "#212337", + "fg_color": "#ebfafa", + "intensity": "Normal", + "italic": false, + "strikethrough": false, + "underline": "None" + }, + "new_tab_hover": { + "bg_color": "#37f499", + "fg_color": "#ebfafa", + "intensity": "Normal", + "italic": true, + "strikethrough": false, + "underline": "None" + } + } + }, + "metadata": { + "aliases": [], + "author": "jacobrreed", + "name": "Eldritch", + "origin_url": "https://github.com/eldritch-theme/eldritch/ports/terminal/wezterm", + "prefix": "e", + "wezterm_version": "nightly builds only" + } + }, { "colors": { "ansi": [ @@ -13401,6 +13680,117 @@ "wezterm_version": "20230320-124340-559cb7b0" } }, + { + "colors": { + "ansi": [ + "#2e383c", + "#e67e80", + "#a7c080", + "#dbbc7f", + "#7fbbb3", + "#d699b6", + "#83c092", + "#d3c6aa" + ], + "background": "#272e33", + "brights": [ + "#5c6a72", + "#f85552", + "#8da101", + "#dfa000", + "#3a94c5", + "#df69ba", + "#35a77c", + "#dfddc8" + ], + "cursor_bg": "#d3c6aa", + "cursor_border": "#d3c6aa", + "cursor_fg": "#272e33", + "foreground": "#d3c6aa", + "indexed": {} + }, + "metadata": { + "aliases": [], + "name": "Everforest Dark Hard (Gogh)", + "origin_url": "https://github.com/Gogh-Co/Gogh", + "prefix": "e", + "wezterm_version": "nightly builds only" + } + }, + { + "colors": { + "ansi": [ + "#343f44", + "#e67e80", + "#a7c080", + "#dbbc7f", + "#7fbbb3", + "#d699b6", + "#83c092", + "#d3c6aa" + ], + "background": "#2d353b", + "brights": [ + "#5c6a72", + "#f85552", + "#8da101", + "#dfa000", + "#3a94c5", + "#df69ba", + "#35a77c", + "#dfddc8" + ], + "cursor_bg": "#d3c6aa", + "cursor_border": "#d3c6aa", + "cursor_fg": "#2d353b", + "foreground": "#d3c6aa", + "indexed": {} + }, + "metadata": { + "aliases": [], + "name": "Everforest Dark Medium (Gogh)", + "origin_url": "https://github.com/Gogh-Co/Gogh", + "prefix": "e", + "wezterm_version": "nightly builds only" + } + }, + { + "colors": { + "ansi": [ + "#3a464c", + "#e67e80", + "#a7c080", + "#dbbc7f", + "#7fbbb3", + "#d699b6", + "#83c092", + "#d3c6aa" + ], + "background": "#333c43", + "brights": [ + "#5c6a72", + "#f85552", + "#8da101", + "#dfa000", + "#3a94c5", + "#df69ba", + "#35a77c", + "#dfddc8" + ], + "cursor_bg": "#d3c6aa", + "cursor_border": "#d3c6aa", + "cursor_fg": "#333c43", + "foreground": "#d3c6aa", + "indexed": {} + }, + "metadata": { + "aliases": [], + "name": "Everforest Dark Soft (Gogh)", + "origin_url": "https://github.com/Gogh-Co/Gogh", + "prefix": "e", + "wezterm_version": "nightly builds only" + } + }, { "colors": { "ansi": [ @@ -13440,6 +13830,117 @@ "wezterm_version": "20230320-124340-559cb7b0" } }, + { + "colors": { + "ansi": [ + "#5c6a72", + "#f85552", + "#8da101", + "#dfa000", + "#3a94c5", + "#df69ba", + "#35a77c", + "#dfddc8" + ], + "background": "#fffbef", + "brights": [ + "#2e383c", + "#e67e80", + "#a7c080", + "#dbbc7f", + "#7fbbb3", + "#d699b6", + "#83c092", + "#d3c6aa" + ], + "cursor_bg": "#5c6a72", + "cursor_border": "#5c6a72", + "cursor_fg": "#fffbef", + "foreground": "#5c6a72", + "indexed": {} + }, + "metadata": { + "aliases": [], + "name": "Everforest Light Hard (Gogh)", + "origin_url": "https://github.com/Gogh-Co/Gogh", + "prefix": "e", + "wezterm_version": "nightly builds only" + } + }, + { + "colors": { + "ansi": [ + "#5c6a72", + "#f85552", + "#8da101", + "#dfa000", + "#3a94c5", + "#df69ba", + "#35a77c", + "#dfddc8" + ], + "background": "#fdf6e3", + "brights": [ + "#343f44", + "#e67e80", + "#a7c080", + "#dbbc7f", + "#7fbbb3", + "#d699b6", + "#83c092", + "#d3c6aa" + ], + "cursor_bg": "#5c6a72", + "cursor_border": "#5c6a72", + "cursor_fg": "#fdf6e3", + "foreground": "#5c6a72", + "indexed": {} + }, + "metadata": { + "aliases": [], + "name": "Everforest Light Medium (Gogh)", + "origin_url": "https://github.com/Gogh-Co/Gogh", + "prefix": "e", + "wezterm_version": "nightly builds only" + } + }, + { + "colors": { + "ansi": [ + "#5c6a72", + "#f85552", + "#8da101", + "#dfa000", + "#3a94c5", + "#df69ba", + "#35a77c", + "#dfddc8" + ], + "background": "#f3ead3", + "brights": [ + "#3a464c", + "#e67e80", + "#a7c080", + "#dbbc7f", + "#7fbbb3", + "#d699b6", + "#83c092", + "#d3c6aa" + ], + "cursor_bg": "#5c6a72", + "cursor_border": "#5c6a72", + "cursor_fg": "#f3ead3", + "foreground": "#5c6a72", + "indexed": {} + }, + "metadata": { + "aliases": [], + "name": "Everforest Light Soft (Gogh)", + "origin_url": "https://github.com/Gogh-Co/Gogh", + "prefix": "e", + "wezterm_version": "nightly builds only" + } + }, { "colors": { "ansi": [ @@ -15147,6 +15648,43 @@ "wezterm_version": "20240127-113634-bbcac864" } }, + { + "colors": { + "ansi": [ + "#24292f", + "#cf222e", + "#1a7f37", + "#9a6700", + "#0969da", + "#8250df", + "#1b7c83", + "#6e7781" + ], + "background": "#f6f8fa", + "brights": [ + "#57606a", + "#a40e26", + "#2da44e", + "#bf8700", + "#218bff", + "#a475f9", + "#3192aa", + "#8c959f" + ], + "cursor_bg": "#1f2328", + "cursor_border": "#1f2328", + "cursor_fg": "#f6f8fa", + "foreground": "#1f2328", + "indexed": {} + }, + "metadata": { + "aliases": [], + "name": "Github Light (Gogh)", + "origin_url": "https://github.com/Gogh-Co/Gogh", + "prefix": "g", + "wezterm_version": "nightly builds only" + } + }, { "colors": { "ansi": [ @@ -20200,6 +20738,43 @@ "wezterm_version": "20230320-124340-559cb7b0" } }, + { + "colors": { + "ansi": [ + "#0d0c0c", + "#c4746e", + "#8a9a7b", + "#c4b28a", + "#8ba4b0", + "#a292a3", + "#8ea4a2", + "#c8c093" + ], + "background": "#181616", + "brights": [ + "#a6a69c", + "#e46876", + "#87a987", + "#e6c384", + "#7fb4ca", + "#938aa9", + "#7aa89f", + "#c5c9c5" + ], + "cursor_bg": "#c8c093", + "cursor_border": "#c8c093", + "cursor_fg": "#181616", + "foreground": "#c5c9c5", + "indexed": {} + }, + "metadata": { + "aliases": [], + "name": "Kanagawa Dragon (Gogh)", + "origin_url": "https://github.com/Gogh-Co/Gogh", + "prefix": "k", + "wezterm_version": "nightly builds only" + } + }, { "colors": { "ansi": [ @@ -22572,6 +23147,46 @@ "wezterm_version": "20230712-072601-f4abf8fd" } }, + { + "colors": { + "ansi": [ + "#1a1a1a", + "#d29393", + "#b3b393", + "#cbaa89", + "#a8a1be", + "#b39fb0", + "#c0af8c", + "#dadada" + ], + "background": "#1a1a1a", + "brights": [ + "#5b5b5b", + "#c95954", + "#828040", + "#a6794c", + "#5a6599", + "#9c6995", + "#74a39e", + "#ffffff" + ], + "cursor_bg": "#bfad9e", + "cursor_border": "#bfad9e", + "cursor_fg": "#1a1a1a", + "foreground": "#dadada", + "indexed": {}, + "selection_bg": "#2d2d2d", + "selection_fg": "#c0af8c" + }, + "metadata": { + "aliases": [], + "author": "rektdeckard (http://github.com/rektdeckard)", + "name": "Mellifluous", + "origin_url": "https://github.com/mbadolato/iTerm2-Color-Schemes", + "prefix": "m", + "wezterm_version": "nightly builds only" + } + }, { "colors": { "ansi": [ @@ -22814,6 +23429,43 @@ "wezterm_version": "Always" } }, + { + "colors": { + "ansi": [ + "#242021", + "#e68183", + "#a7c080", + "#d9bb80", + "#89beba", + "#d3a0bc", + "#87c095", + "#d8caac" + ], + "background": "#2a2426", + "brights": [ + "#444444", + "#e39b7b", + "#a7c080", + "#d9bb80", + "#89beba", + "#d3a0bc", + "#87c095", + "#e6d6ac" + ], + "cursor_bg": "#e6d6ac", + "cursor_border": "#e6d6ac", + "cursor_fg": "#2a2426", + "foreground": "#e6d6ac", + "indexed": {} + }, + "metadata": { + "aliases": [], + "name": "Miramare (Gogh)", + "origin_url": "https://github.com/Gogh-Co/Gogh", + "prefix": "m", + "wezterm_version": "nightly builds only" + } + }, { "colors": { "ansi": [ @@ -23011,6 +23663,154 @@ "wezterm_version": "20220807-113146-c2fee766" } }, + { + "colors": { + "ansi": [ + "#ffffff", + "#a60000", + "#006800", + "#6f5500", + "#0031a9", + "#721045", + "#005e8b", + "#000000" + ], + "background": "#ffffff", + "brights": [ + "#f2f2f2", + "#d00000", + "#008900", + "#808000", + "#0000ff", + "#dd22dd", + "#008899", + "#595959" + ], + "cursor_bg": "#000000", + "cursor_border": "#000000", + "cursor_fg": "#ffffff", + "foreground": "#000000", + "indexed": {} + }, + "metadata": { + "aliases": [], + "name": "Modus Operandi (Gogh)", + "origin_url": "https://github.com/Gogh-Co/Gogh", + "prefix": "m", + "wezterm_version": "nightly builds only" + } + }, + { + "colors": { + "ansi": [ + "#fbf7f0", + "#a60000", + "#006800", + "#6f5500", + "#0031a9", + "#721045", + "#005e8b", + "#000000" + ], + "background": "#fbf7f0", + "brights": [ + "#efe9dd", + "#d00000", + "#008900", + "#808000", + "#0000ff", + "#dd22dd", + "#008899", + "#595959" + ], + "cursor_bg": "#000000", + "cursor_border": "#000000", + "cursor_fg": "#fbf7f0", + "foreground": "#000000", + "indexed": {} + }, + "metadata": { + "aliases": [], + "name": "Modus Operandi Tinted (Gogh)", + "origin_url": "https://github.com/Gogh-Co/Gogh", + "prefix": "m", + "wezterm_version": "nightly builds only" + } + }, + { + "colors": { + "ansi": [ + "#000000", + "#ff5f59", + "#44bc44", + "#d0bc00", + "#2fafff", + "#feacd0", + "#00d3d0", + "#ffffff" + ], + "background": "#000000", + "brights": [ + "#1e1e1e", + "#ff5f5f", + "#44df44", + "#efef00", + "#338fff", + "#ff66ff", + "#00eff0", + "#989898" + ], + "cursor_bg": "#ffffff", + "cursor_border": "#ffffff", + "cursor_fg": "#000000", + "foreground": "#ffffff", + "indexed": {} + }, + "metadata": { + "aliases": [], + "name": "Modus Vivendi (Gogh)", + "origin_url": "https://github.com/Gogh-Co/Gogh", + "prefix": "m", + "wezterm_version": "nightly builds only" + } + }, + { + "colors": { + "ansi": [ + "#0d0e1c", + "#ff5f59", + "#44bc44", + "#d0bc00", + "#2fafff", + "#feacd0", + "#00d3d0", + "#ffffff" + ], + "background": "#0d0e1c", + "brights": [ + "#1d2235", + "#ff5f5f", + "#44df44", + "#efef00", + "#338fff", + "#ff66ff", + "#00eff0", + "#989898" + ], + "cursor_bg": "#ffffff", + "cursor_border": "#ffffff", + "cursor_fg": "#0d0e1c", + "foreground": "#ffffff", + "indexed": {} + }, + "metadata": { + "aliases": [], + "name": "Modus Vivendi Tinted (Gogh)", + "origin_url": "https://github.com/Gogh-Co/Gogh", + "prefix": "m", + "wezterm_version": "nightly builds only" + } + }, { "colors": { "ansi": [ @@ -25891,6 +26691,84 @@ "wezterm_version": "20220807-113146-c2fee766" } }, + { + "colors": { + "ansi": [ + "#07080d", + "#ffc0b9", + "#b3f6c0", + "#fce094", + "#a6dbff", + "#ffcaff", + "#8cf8f7", + "#eef1f8" + ], + "background": "#14161b", + "brights": [ + "#4f5258", + "#ffc0b9", + "#b3f6c0", + "#fce094", + "#a6dbff", + "#ffcaff", + "#8cf8f7", + "#eef1f8" + ], + "cursor_bg": "#9b9ea4", + "cursor_border": "#9b9ea4", + "cursor_fg": "#e0e2ea", + "foreground": "#e0e2ea", + "indexed": {}, + "selection_bg": "#4f5258", + "selection_fg": "#e0e2ea" + }, + "metadata": { + "aliases": [], + "name": "NvimDark", + "origin_url": "https://github.com/mbadolato/iTerm2-Color-Schemes", + "prefix": "n", + "wezterm_version": "nightly builds only" + } + }, + { + "colors": { + "ansi": [ + "#07080d", + "#590008", + "#005523", + "#6b5300", + "#004c73", + "#470045", + "#007373", + "#eef1f8" + ], + "background": "#e0e2ea", + "brights": [ + "#4f5258", + "#590008", + "#005523", + "#6b5300", + "#004c73", + "#470045", + "#007373", + "#eef1f8" + ], + "cursor_bg": "#9b9ea4", + "cursor_border": "#9b9ea4", + "cursor_fg": "#14161b", + "foreground": "#14161b", + "indexed": {}, + "selection_bg": "#9b9ea4", + "selection_fg": "#14161b" + }, + "metadata": { + "aliases": [], + "name": "NvimLight", + "origin_url": "https://github.com/mbadolato/iTerm2-Color-Schemes", + "prefix": "n", + "wezterm_version": "nightly builds only" + } + }, { "colors": { "ansi": [ @@ -29116,6 +29994,43 @@ "wezterm_version": "20220807-113146-c2fee766" } }, + { + "colors": { + "ansi": [ + "#141414", + "#c16262", + "#49b685", + "#c5b76d", + "#4992b6", + "#815bbe", + "#41a4a4", + "#c5c5c5" + ], + "background": "#141414", + "brights": [ + "#505050", + "#ed5e7a", + "#7ece7e", + "#dbdb70", + "#4dbfff", + "#c067e4", + "#70dbd8", + "#f0f0f0" + ], + "cursor_bg": "#a0a0a0", + "cursor_border": "#a0a0a0", + "cursor_fg": "#141414", + "foreground": "#b9b9b9", + "indexed": {} + }, + "metadata": { + "aliases": [], + "name": "Quiet (Gogh)", + "origin_url": "https://github.com/Gogh-Co/Gogh", + "prefix": "q", + "wezterm_version": "nightly builds only" + } + }, { "colors": { "ansi": [ @@ -30955,18 +31870,55 @@ { "colors": { "ansi": [ - "#103c48", + "#252525", + "#ed4a46", + "#70b433", + "#dbb32d", + "#368aeb", + "#eb6eb7", + "#3fc5b7", + "#777777" + ], + "background": "#181818", + "brights": [ + "#3b3b3b", + "#ff5e56", + "#83c746", + "#efc541", + "#4f9cfe", + "#ff81ca", + "#56d8c9", + "#dedede" + ], + "cursor_bg": "#dedede", + "cursor_border": "#dedede", + "cursor_fg": "#181818", + "foreground": "#b9b9b9", + "indexed": {} + }, + "metadata": { + "aliases": [], + "name": "Selenized Black (Gogh)", + "origin_url": "https://github.com/Gogh-Co/Gogh", + "prefix": "s", + "wezterm_version": "nightly builds only" + } + }, + { + "colors": { + "ansi": [ + "#184956", "#fa5750", "#75b938", "#dbb32d", "#4695f7", "#f275be", "#41c7b9", - "#adbcbc" + "#72898f" ], "background": "#103c48", "brights": [ - "#184956", + "#2d5b69", "#ff665c", "#84c747", "#ebc13d", @@ -30975,8 +31927,8 @@ "#53d6c7", "#cad8d9" ], - "cursor_bg": "#adbcbc", - "cursor_border": "#adbcbc", + "cursor_bg": "#cad8d9", + "cursor_border": "#cad8d9", "cursor_fg": "#103c48", "foreground": "#adbcbc", "indexed": {} @@ -30992,18 +31944,18 @@ { "colors": { "ansi": [ - "#fbf3db", + "#ece3cc", "#d2212d", "#489100", "#ad8900", "#0072d4", "#ca4898", "#009c8f", - "#53676d" + "#909995" ], "background": "#fbf3db", "brights": [ - "#ece3cc", + "#d5cdb6", "#cc1729", "#428b00", "#a78300", @@ -31012,8 +31964,8 @@ "#00978a", "#3a4d53" ], - "cursor_bg": "#53676d", - "cursor_border": "#53676d", + "cursor_bg": "#3a4d53", + "cursor_border": "#3a4d53", "cursor_fg": "#fbf3db", "foreground": "#53676d", "indexed": {} @@ -31026,6 +31978,117 @@ "wezterm_version": "20240127-113634-bbcac864" } }, + { + "colors": { + "ansi": [ + "#ebebeb", + "#d6000c", + "#1d9700", + "#c49700", + "#0064e4", + "#dd0f9d", + "#00ad9c", + "#878787" + ], + "background": "#ffffff", + "brights": [ + "#cdcdcd", + "#bf0000", + "#008400", + "#af8500", + "#0054cf", + "#c7008b", + "#009a8a", + "#282828" + ], + "cursor_bg": "#282828", + "cursor_border": "#282828", + "cursor_fg": "#ffffff", + "foreground": "#474747", + "indexed": {} + }, + "metadata": { + "aliases": [], + "name": "Selenized White (Gogh)", + "origin_url": "https://github.com/Gogh-Co/Gogh", + "prefix": "s", + "wezterm_version": "nightly builds only" + } + }, + { + "colors": { + "ansi": [ + "#4e4e4e", + "#d68787", + "#5f865f", + "#d8af5f", + "#85add4", + "#d7afaf", + "#87afaf", + "#d0d0d0" + ], + "background": "#3a3a3a", + "brights": [ + "#626262", + "#d75f87", + "#87af87", + "#ffd787", + "#add4fb", + "#ffafaf", + "#87d7d7", + "#e4e4e4" + ], + "cursor_bg": "#d0d0d0", + "cursor_border": "#d0d0d0", + "cursor_fg": "#3a3a3a", + "foreground": "#d0d0d0", + "indexed": {} + }, + "metadata": { + "aliases": [], + "name": "Seoul256 (Gogh)", + "origin_url": "https://github.com/Gogh-Co/Gogh", + "prefix": "s", + "wezterm_version": "nightly builds only" + } + }, + { + "colors": { + "ansi": [ + "#4e4e4e", + "#af5f5f", + "#5f885f", + "#af8760", + "#5f87ae", + "#875f87", + "#5f8787", + "#e4e4e4" + ], + "background": "#dadada", + "brights": [ + "#3a3a3a", + "#870100", + "#005f00", + "#d8865f", + "#0087af", + "#87025f", + "#008787", + "#eeeeee" + ], + "cursor_bg": "#4e4e4e", + "cursor_border": "#4e4e4e", + "cursor_fg": "#dadada", + "foreground": "#4e4e4e", + "indexed": {} + }, + "metadata": { + "aliases": [], + "name": "Seoul256 Light (Gogh)", + "origin_url": "https://github.com/Gogh-Co/Gogh", + "prefix": "s", + "wezterm_version": "nightly builds only" + } + }, { "colors": { "ansi": [ @@ -32478,12 +33541,12 @@ "background": "#002b36", "brights": [ "#657b83", - "#d87979", - "#88cf76", - "#657b83", - "#2699ff", + "#cb4b16", + "#859900", + "#cf9a6b", + "#6c71c4", "#d33682", - "#43b8c3", + "#2aa198", "#fdf6e3" ], "cursor_bg": "#839496", @@ -32623,25 +33686,25 @@ { "colors": { "ansi": [ - "#073642", + "#eee8d5", "#dc322f", "#859900", "#b58900", "#268bd2", "#d33682", "#2aa198", - "#eee8d5" + "#002b36" ], "background": "#fdf6e3", "brights": [ - "#002b36", - "#cb4b16", - "#586e75", "#657b83", - "#839496", + "#cb4b16", + "#859900", + "#b58900", "#6c71c4", - "#93a1a1", - "#fdf6e3" + "#d33682", + "#2aa198", + "#073642" ], "cursor_bg": "#657b83", "cursor_border": "#657b83", @@ -33090,6 +34153,43 @@ "wezterm_version": "20220807-113146-c2fee766" } }, + { + "colors": { + "ansi": [ + "#212322", + "#ff585d", + "#78d64b", + "#fbdd40", + "#4698cb", + "#d59ed7", + "#2dccd3", + "#dee6de" + ], + "background": "#072b31", + "brights": [ + "#4b4f54", + "#ff7276", + "#8edd65", + "#f6eb61", + "#69b3e7", + "#f99fc9", + "#00c1d5", + "#d9e1e2" + ], + "cursor_bg": "#f4f5f0", + "cursor_border": "#f4f5f0", + "cursor_fg": "#072b31", + "foreground": "#f4f5f0", + "indexed": {} + }, + "metadata": { + "aliases": [], + "name": "Sparky (Gogh)", + "origin_url": "https://github.com/Gogh-Co/Gogh", + "prefix": "s", + "wezterm_version": "nightly builds only" + } + }, { "colors": { "ansi": [ @@ -39058,7 +40158,7 @@ "ansi": [ "#2e3436", "#fc6386", - "#424043", + "#a9dc76", "#fce94f", "#fb976b", "#75507b", @@ -39413,29 +40513,29 @@ { "colors": { "ansi": [ - "#4d4d4d", - "#705050", - "#60b48a", - "#f0dfaf", - "#506070", - "#dc8cc3", - "#8cd0d3", - "#dcdccc" + "#333333", + "#cc9393", + "#efef87", + "#ffd7a7", + "#c3bf97", + "#bca3a3", + "#93b3a3", + "#f0efd0" ], - "background": "#3f3f3f", + "background": "#3a3a3a", "brights": [ - "#709080", - "#dca3a3", - "#c3bf9f", - "#e0cf9f", - "#94bff3", - "#ec93d3", - "#93e0e3", - "#ffffff" + "#757575", + "#dfaf87", + "#ffff87", + "#ffcfaf", + "#d7d7af", + "#d7afaf", + "#93bea3", + "#dcdccc" ], "cursor_bg": "#dcdccc", "cursor_border": "#dcdccc", - "cursor_fg": "#3f3f3f", + "cursor_fg": "#3a3a3a", "foreground": "#dcdccc", "indexed": {} }, @@ -39599,4 +40699,4 @@ "wezterm_version": "Always" } } -] +] \ No newline at end of file diff --git a/docs/config/appearance.md b/docs/config/appearance.md index 151635677..8dc22009b 100644 --- a/docs/config/appearance.md +++ b/docs/config/appearance.md @@ -223,7 +223,7 @@ builting color scheme. If you'd like to factor your color schemes out into separate files, you can create a file with a `[colors]` section; take a look at [one of -the available color schemes for an example](https://github.com/wez/wezterm/blob/main/assets/colors/Builtin%20Dark.toml). +the available color schemes for an example](https://github.com/wez/wezterm/config/src/scheme_data.rs). It is recommended that you place your custom scheme in a directory named `$HOME/.config/wezterm/colors` if you're on a POSIX system. diff --git a/docs/config/lua/config/default_ssh_auth_sock.md b/docs/config/lua/config/default_ssh_auth_sock.md new file mode 100644 index 000000000..d03a3f657 --- /dev/null +++ b/docs/config/lua/config/default_ssh_auth_sock.md @@ -0,0 +1,47 @@ +--- +tags: + - multiplexing + - ssh +--- +# `default_ssh_auth_sock` + +{{since('nightly')}} + +Setting this value will cause wezterm to replace the the value of the +`SSH_AUTH_SOCK` environment when it first starts up, and to use this value for +the auth socket registered with the multiplexer server (visible via `wezterm +cli list-clients`). + +You won't normally need to set this, but if you are running with an alternative +identity agent and want to replace the default on your system, this gives +you that ability. + +For example, @wez currently uses the 1Password SSH Auth Agent, but when +running on Gnome the system default is Gnome's keyring agent. + +While you can fix this up in your shell startup files, those are not involved +when spawning the GUI directly from the desktop environment. + +The following wezterm configuration snippet shows how to detect when gnome +keyring is set and to selectively replace it with the 1Password agent: + +```lua +local config = wezterm.config_builder() + +-- Override gnome keyring with 1password's ssh agent +local SSH_AUTH_SOCK = os.getenv 'SSH_AUTH_SOCK' +if + SSH_AUTH_SOCK + == string.format('%s/keyring/ssh', os.getenv 'XDG_RUNTIME_DIR') +then + local onep_auth = + string.format('%s/.1password/agent.sock', wezterm.home_dir) + -- Glob is being used here as an indirect way to check to see if + -- the socket exists or not. If it didn't, the length of the result + -- would be 0 + if #wezterm.glob(onep_auth) == 1 then + config.default_ssh_auth_sock = onep_auth + end +end +``` + diff --git a/docs/config/lua/config/mux_enable_ssh_agent.md b/docs/config/lua/config/mux_enable_ssh_agent.md new file mode 100644 index 000000000..92d2eaecf --- /dev/null +++ b/docs/config/lua/config/mux_enable_ssh_agent.md @@ -0,0 +1,26 @@ +--- +tags: + - multiplexing + - ssh +--- +# `mux_enable_ssh_agent = true` + +{{since('nightly')}} + +When set to `true` (the default), wezterm will configure the `SSH_AUTH_SOCK` +environment variable for panes spawned in the `local` domain. + +The auth sock will point to a symbolic link that will in turn be pointed to the +authentication socket associated with the most recently active multiplexer +client. + +You can review the authentication socket that will be used for various clients +by running `wezterm cli list-clients` and inspecting the `SSH_AUTH_SOCK` +column. + +The symlink is updated within (at the time of writing this documentation) 100ms +of the active Mux client changing. + +You can set `mux_enable_ssh_agent = false` to prevent wezterm from assigning +`SSH_AUTH_SOCK` or updating the symlink. + diff --git a/docs/config/lua/config/quote_dropped_files.md b/docs/config/lua/config/quote_dropped_files.md index 6e1c03151..94921e741 100644 --- a/docs/config/lua/config/quote_dropped_files.md +++ b/docs/config/lua/config/quote_dropped_files.md @@ -27,5 +27,5 @@ Drag and drop support for files is a platform dependent feature |----------|-------------------| |macOS |20220624-141144-bd1b7c5d| |Windows |20220624-141144-bd1b7c5d| -|X11 |Not yet | +|X11 |{{since('nightly', inline=True)}}| |Wayland |20220624-141144-bd1b7c5d| diff --git a/docs/config/lua/config/swallow_mouse_click_on_window_focus.md b/docs/config/lua/config/swallow_mouse_click_on_window_focus.md index 9308bfe7d..32e440905 100644 --- a/docs/config/lua/config/swallow_mouse_click_on_window_focus.md +++ b/docs/config/lua/config/swallow_mouse_click_on_window_focus.md @@ -8,10 +8,9 @@ tags: When set to `true`, clicking on a wezterm window will focus it. -When set to `false`,clickong on a wezterm window will focus it and then pass +When set to `false`, clicking on a wezterm window will focus it and then pass through the click to the pane where the [swallow_mouse_click_on_pane_focus](swallow_mouse_click_on_pane_focus.md) option will further modify mouse event processing. The default is `true` on macOS but `false` on other systems. - diff --git a/docs/config/lua/config/window_frame.md b/docs/config/lua/config/window_frame.md index 97abfc4e7..e14838c9a 100644 --- a/docs/config/lua/config/window_frame.md +++ b/docs/config/lua/config/window_frame.md @@ -44,3 +44,13 @@ config.window_frame = { border_top_color = 'purple', } ``` + +You may specify the font and font size for the tabbar: +```lua +config.window_frame = { + font = require('wezterm').font 'Roboto', + font_size = 12, +} +``` + +The default font is `Roboto`. The default font_size is `10pt` on Windows and `12pt` on other systems. diff --git a/docs/config/lua/keyassignment/CopyMode/MoveForwardSemanticZone.md b/docs/config/lua/keyassignment/CopyMode/MoveForwardSemanticZone.md index 3ba327a30..144675dc6 100644 --- a/docs/config/lua/keyassignment/CopyMode/MoveForwardSemanticZone.md +++ b/docs/config/lua/keyassignment/CopyMode/MoveForwardSemanticZone.md @@ -1,4 +1,4 @@ -# CopyMode `MoveForewardSemanticZone` +# CopyMode `MoveForwardSemanticZone` {{since('20220903-194523-3bb1ed61')}} @@ -17,7 +17,7 @@ return { { key = 'Z', mods = 'NONE', - action = act.CopyMode 'MoveForewardSemanticZone', + action = act.CopyMode 'MoveForwardSemanticZone', }, }, }, diff --git a/docs/config/lua/keyassignment/CopyMode/MoveToSelectionOtherEndHoriz.md b/docs/config/lua/keyassignment/CopyMode/MoveToSelectionOtherEndHoriz.md index eed0fb411..76dc3e44d 100644 --- a/docs/config/lua/keyassignment/CopyMode/MoveToSelectionOtherEndHoriz.md +++ b/docs/config/lua/keyassignment/CopyMode/MoveToSelectionOtherEndHoriz.md @@ -17,7 +17,7 @@ return { { key = 'O', mods = 'NONE', - action = act.CopyMode 'MoveToSelectionOtherEnd', + action = act.CopyMode 'MoveToSelectionOtherEndHoriz', }, }, }, diff --git a/env-bootstrap/Cargo.toml b/env-bootstrap/Cargo.toml index d48e7df05..8787e62e1 100644 --- a/env-bootstrap/Cargo.toml +++ b/env-bootstrap/Cargo.toml @@ -3,6 +3,7 @@ name = "env-bootstrap" version = "0.1.0" authors = ["Wez Furlong "] edition = "2018" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -36,6 +37,6 @@ wezterm-version = { path = "../wezterm-version" } winapi = "0.3" [target.'cfg(target_os = "macos")'.dependencies] -cocoa = "0.20" +cocoa = "0.25" objc = "0.2" diff --git a/env-bootstrap/src/ringlog.rs b/env-bootstrap/src/ringlog.rs index 083d26d52..a733b937c 100644 --- a/env-bootstrap/src/ringlog.rs +++ b/env-bootstrap/src/ringlog.rs @@ -281,6 +281,8 @@ fn setup_pretty() -> (LevelFilter, Logger) { ("wgpu_core", LevelFilter::Error), ("wgpu_hal", LevelFilter::Error), ("gfx_backend_metal", LevelFilter::Error), + ("tracing", LevelFilter::Error), + ("zbus", LevelFilter::Error), ] { filters.filter_module(module, level); } diff --git a/filedescriptor/src/unix.rs b/filedescriptor/src/unix.rs index 5f7b41268..e88cecd16 100644 --- a/filedescriptor/src/unix.rs +++ b/filedescriptor/src/unix.rs @@ -61,6 +61,12 @@ impl Drop for OwnedHandle { } } +impl std::os::fd::AsFd for OwnedHandle { + fn as_fd(&self) -> std::os::fd::BorrowedFd { + unsafe { std::os::fd::BorrowedFd::borrow_raw(self.handle) } + } +} + impl AsRawFd for OwnedHandle { fn as_raw_fd(&self) -> RawFd { self.handle @@ -224,6 +230,12 @@ impl std::io::Write for FileDescriptor { } } +impl std::os::fd::AsFd for FileDescriptor { + fn as_fd(&self) -> std::os::fd::BorrowedFd { + self.handle.as_fd() + } +} + impl AsRawFd for FileDescriptor { fn as_raw_fd(&self) -> RawFd { self.handle.as_raw_fd() diff --git a/filedescriptor/src/windows.rs b/filedescriptor/src/windows.rs index 822c19abe..4502d09c7 100644 --- a/filedescriptor/src/windows.rs +++ b/filedescriptor/src/windows.rs @@ -320,6 +320,12 @@ impl AsRawSocket for FileDescriptor { } } +impl AsSocket for FileDescriptor { + fn as_socket(&self) -> BorrowedSocket { + unsafe { BorrowedSocket::borrow_raw(self.as_raw_socket()) } + } +} + impl FromRawSocket for FileDescriptor { unsafe fn from_raw_socket(handle: RawSocket) -> FileDescriptor { Self { diff --git a/frecency/Cargo.toml b/frecency/Cargo.toml index 0167d64f1..eea2a8d92 100644 --- a/frecency/Cargo.toml +++ b/frecency/Cargo.toml @@ -2,6 +2,7 @@ name = "frecency" version = "0.1.0" edition = "2021" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/lfucache/Cargo.toml b/lfucache/Cargo.toml index b8b0de8b1..95bd4bf2a 100644 --- a/lfucache/Cargo.toml +++ b/lfucache/Cargo.toml @@ -2,6 +2,7 @@ name = "lfucache" version = "0.1.0" edition = "2021" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -10,7 +11,7 @@ ahash = "0.8" config = { path = "../config" } fnv = "1.0" intrusive-collections = "0.9" -metrics = { version="0.17", features=["std"]} +metrics = "0.22" [dev-dependencies] -k9 = "0.11" +k9 = "0.12" diff --git a/lfucache/src/lib.rs b/lfucache/src/lib.rs index 325de1925..c2b32d794 100644 --- a/lfucache/src/lib.rs +++ b/lfucache/src/lib.rs @@ -242,7 +242,7 @@ impl LfuCache LfuCache(_: &'lua Lua, _: ()) -> mlua::Result> { State::Discharging => "Discharging", State::Empty => "Empty", State::Full => "Full", - State::Unknown | _ => "Unknown", + State::Unknown => "Unknown", } .to_string(), time_to_full: bat.time_to_full().map(|q| q.value), diff --git a/lua-api-crates/color-funcs/Cargo.toml b/lua-api-crates/color-funcs/Cargo.toml index 537946948..7976c4f92 100644 --- a/lua-api-crates/color-funcs/Cargo.toml +++ b/lua-api-crates/color-funcs/Cargo.toml @@ -2,6 +2,7 @@ name = "color-funcs" version = "0.1.0" edition = "2021" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -10,10 +11,10 @@ anyhow = "1.0" config = { path = "../../config" } csscolorparser = {version="0.6", features=["lab"]} deltae = "0.3" -image = "0.24.6" +image = "0.25" lazy_static = "1.4" log = "0.4" -lru = "0.7" +lru = "0.12" luahelper = { path = "../../luahelper" } plist = "1.3" serde = {version="1.0", features=["derive"]} diff --git a/lua-api-crates/color-funcs/src/image_colors.rs b/lua-api-crates/color-funcs/src/image_colors.rs index 905f72c1c..8dc0b79ee 100644 --- a/lua-api-crates/color-funcs/src/image_colors.rs +++ b/lua-api-crates/color-funcs/src/image_colors.rs @@ -19,6 +19,7 @@ use image::Pixel; use lru::LruCache; use luahelper::impl_lua_conversion_dynamic; use std::collections::HashMap; +use std::num::NonZeroUsize; use std::sync::Mutex; use std::time::SystemTime; use wezterm_dynamic::{FromDynamic, ToDynamic}; @@ -128,7 +129,7 @@ struct CachedAnalysis { } lazy_static::lazy_static! { - static ref IMG_COLOR_CACHE: Mutex> = Mutex::new(LruCache::new(16)); + static ref IMG_COLOR_CACHE: Mutex> = Mutex::new(LruCache::new(NonZeroUsize::new(16).unwrap())); } fn color_diff_lab(a: &LabValue, b: &LabValue) -> f32 { diff --git a/lua-api-crates/filesystem/Cargo.toml b/lua-api-crates/filesystem/Cargo.toml index 49a7f78f7..ac3192879 100644 --- a/lua-api-crates/filesystem/Cargo.toml +++ b/lua-api-crates/filesystem/Cargo.toml @@ -2,12 +2,13 @@ name = "filesystem" version = "0.1.0" edition = "2021" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -filenamegen = "0.2" +filenamegen = "0.2.6" anyhow = "1.0" config = { path = "../../config" } luahelper = { path = "../../luahelper" } -smol = "1.2" +smol = "2.0" diff --git a/lua-api-crates/logging/Cargo.toml b/lua-api-crates/logging/Cargo.toml index 3f59dc8fc..e9f32f3f3 100644 --- a/lua-api-crates/logging/Cargo.toml +++ b/lua-api-crates/logging/Cargo.toml @@ -2,6 +2,7 @@ name = "logging" version = "0.1.0" edition = "2021" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/lua-api-crates/mux/Cargo.toml b/lua-api-crates/mux/Cargo.toml index 9fc5f0045..2cdb349d5 100644 --- a/lua-api-crates/mux/Cargo.toml +++ b/lua-api-crates/mux/Cargo.toml @@ -2,6 +2,7 @@ name = "mux-lua" version = "0.1.0" edition = "2021" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -15,7 +16,7 @@ log = "0.4" luahelper = { path = "../../luahelper" } parking_lot = "0.12" portable-pty = { path = "../../pty" } -smol = "1.2" +smol = "2.0" termwiz = { path = "../../termwiz" } termwiz-funcs = { path = "../termwiz-funcs" } mux = { path = "../../mux" } diff --git a/lua-api-crates/plugin/Cargo.toml b/lua-api-crates/plugin/Cargo.toml index cc4f276e3..b181a59a0 100644 --- a/lua-api-crates/plugin/Cargo.toml +++ b/lua-api-crates/plugin/Cargo.toml @@ -2,6 +2,7 @@ name = "plugin" version = "0.1.0" edition = "2021" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/lua-api-crates/procinfo-funcs/Cargo.toml b/lua-api-crates/procinfo-funcs/Cargo.toml index acd7a6535..4c5aeb595 100644 --- a/lua-api-crates/procinfo-funcs/Cargo.toml +++ b/lua-api-crates/procinfo-funcs/Cargo.toml @@ -2,6 +2,7 @@ name = "procinfo-funcs" version = "0.1.0" edition = "2021" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/lua-api-crates/serde-funcs/Cargo.toml b/lua-api-crates/serde-funcs/Cargo.toml index 0b624b097..5b44aca38 100644 --- a/lua-api-crates/serde-funcs/Cargo.toml +++ b/lua-api-crates/serde-funcs/Cargo.toml @@ -2,6 +2,7 @@ name = "serde-funcs" version = "0.1.0" edition = "2021" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/lua-api-crates/share-data/Cargo.toml b/lua-api-crates/share-data/Cargo.toml index 8304b8923..8f71238f6 100644 --- a/lua-api-crates/share-data/Cargo.toml +++ b/lua-api-crates/share-data/Cargo.toml @@ -2,6 +2,7 @@ name = "share-data" version = "0.1.0" edition = "2021" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/lua-api-crates/spawn-funcs/Cargo.toml b/lua-api-crates/spawn-funcs/Cargo.toml index 4777c2068..4655c08ba 100644 --- a/lua-api-crates/spawn-funcs/Cargo.toml +++ b/lua-api-crates/spawn-funcs/Cargo.toml @@ -2,6 +2,7 @@ name = "spawn-funcs" version = "0.1.0" edition = "2021" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -11,7 +12,7 @@ config = { path = "../../config" } wezterm-dynamic = { path = "../../wezterm-dynamic" } log = "0.4" luahelper = { path = "../../luahelper" } -smol = "1.2" +smol = "2.0" bstr = "1.0" wezterm-open-url = { path = "../../wezterm-open-url" } diff --git a/lua-api-crates/ssh-funcs/Cargo.toml b/lua-api-crates/ssh-funcs/Cargo.toml index 190c9c8a9..2abec4256 100644 --- a/lua-api-crates/ssh-funcs/Cargo.toml +++ b/lua-api-crates/ssh-funcs/Cargo.toml @@ -2,6 +2,7 @@ name = "ssh-funcs" version = "0.1.0" edition = "2021" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/lua-api-crates/termwiz-funcs/Cargo.toml b/lua-api-crates/termwiz-funcs/Cargo.toml index 33a6e048a..7618ec13a 100644 --- a/lua-api-crates/termwiz-funcs/Cargo.toml +++ b/lua-api-crates/termwiz-funcs/Cargo.toml @@ -2,6 +2,7 @@ name = "termwiz-funcs" version = "0.1.0" edition = "2021" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -9,7 +10,7 @@ edition = "2021" anyhow = "1.0" config = { path = "../../config" } finl_unicode = "1.2" -terminfo = "0.8" +terminfo = "0.9" wezterm-dynamic = { path = "../../wezterm-dynamic" } wezterm-input-types = { path = "../../wezterm-input-types" } luahelper = { path = "../../luahelper" } diff --git a/lua-api-crates/time-funcs/Cargo.toml b/lua-api-crates/time-funcs/Cargo.toml index 11cbb982f..407c30a24 100644 --- a/lua-api-crates/time-funcs/Cargo.toml +++ b/lua-api-crates/time-funcs/Cargo.toml @@ -2,6 +2,7 @@ name = "time-funcs" version = "0.1.0" edition = "2021" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -12,6 +13,6 @@ config = { path = "../../config" } luahelper = { path = "../../luahelper" } lazy_static = "1.4" promise = { path = "../../promise" } -smol = "1.2" +smol = "2.0" spa = "0.3.1" wezterm-dynamic = { path = "../../wezterm-dynamic" } diff --git a/lua-api-crates/url-funcs/Cargo.toml b/lua-api-crates/url-funcs/Cargo.toml index 37e5f370b..a0a94cbb7 100644 --- a/lua-api-crates/url-funcs/Cargo.toml +++ b/lua-api-crates/url-funcs/Cargo.toml @@ -2,6 +2,7 @@ name = "url-funcs" version = "0.1.0" edition = "2021" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/lua-api-crates/window-funcs/Cargo.toml b/lua-api-crates/window-funcs/Cargo.toml index 11b38bb2a..e770a8195 100644 --- a/lua-api-crates/window-funcs/Cargo.toml +++ b/lua-api-crates/window-funcs/Cargo.toml @@ -2,6 +2,7 @@ name = "window-funcs" version = "0.1.0" edition = "2021" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/luahelper/Cargo.toml b/luahelper/Cargo.toml index e9c6dac54..7d2ef94fe 100644 --- a/luahelper/Cargo.toml +++ b/luahelper/Cargo.toml @@ -3,6 +3,7 @@ name = "luahelper" version = "0.1.0" authors = ["Wez Furlong "] edition = "2018" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/mux/Cargo.toml b/mux/Cargo.toml index 5e508f73a..e63e56f3e 100644 --- a/mux/Cargo.toml +++ b/mux/Cargo.toml @@ -3,6 +3,7 @@ name = "mux" version = "0.1.0" authors = ["Wez Furlong "] edition = "2018" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -19,15 +20,15 @@ downcast-rs = "1.0" fancy-regex = "0.11" filedescriptor = { version="0.8", path = "../filedescriptor" } finl_unicode = "1.2" -hostname = "0.3" +hostname = "0.4" lazy_static = "1.4" libc = "0.2" log = "0.4" luahelper = { path = "../luahelper" } -metrics = { version="0.17", features=["std"]} +metrics = "0.22" mlua = "0.9" names = { version = "0.12", default-features = false } -nix = {version="0.25", features=["term"]} +nix = {version="0.28", features=["term"]} parking_lot = "0.12" percent-encoding = "2" portable-pty = { path = "../pty", features = ["serde_support"]} @@ -37,8 +38,8 @@ rangeset = { path = "../rangeset" } serde = {version="1.0", features = ["rc", "derive"]} serial = "0.4" shell-words = "1.1" -smol = "1.2" -terminfo = "0.8" +smol = "2.0" +terminfo = "0.9" termwiz = { path = "../termwiz" } termwiz-funcs = { path = "../lua-api-crates/termwiz-funcs" } textwrap = "0.16" @@ -47,7 +48,6 @@ url = "2" wezterm-ssh = { path = "../wezterm-ssh" } wezterm-dynamic = { path = "../wezterm-dynamic" } wezterm-term = { path = "../term", features=["use_serde"] } -flume = "0.10" [target."cfg(windows)".dependencies] ntapi = "0.4" @@ -60,4 +60,4 @@ winapi = { version = "0.3", features = [ ]} [dev-dependencies] -k9 = "0.11" +k9 = "0.12" diff --git a/mux/src/client.rs b/mux/src/client.rs index 364854915..92a5e27c7 100644 --- a/mux/src/client.rs +++ b/mux/src/client.rs @@ -20,6 +20,7 @@ pub struct ClientId { pub pid: u32, pub epoch: u64, pub id: usize, + pub ssh_auth_sock: Option, } impl ClientId { @@ -33,6 +34,7 @@ impl ClientId { pid: unsafe { libc::getpid() as u32 }, epoch: *EPOCH, id, + ssh_auth_sock: crate::AgentProxy::default_ssh_auth_sock(), } } } diff --git a/mux/src/domain.rs b/mux/src/domain.rs index bb7d9b67d..3cb3767d5 100644 --- a/mux/src/domain.rs +++ b/mux/src/domain.rs @@ -468,6 +468,9 @@ impl LocalDomain { cmd.env("WEZTERM_UNIX_SOCKET", sock); } cmd.env("WEZTERM_PANE", pane_id.to_string()); + if let Some(agent) = Mux::get().agent.as_ref() { + cmd.env("SSH_AUTH_SOCK", agent.path()); + } self.fixup_command(&mut cmd).await?; Ok(cmd) } diff --git a/mux/src/lib.rs b/mux/src/lib.rs index 4f6b330f1..f46e5ee08 100644 --- a/mux/src/lib.rs +++ b/mux/src/lib.rs @@ -1,5 +1,6 @@ use crate::client::{ClientId, ClientInfo}; use crate::pane::{CachePolicy, Pane, PaneId}; +use crate::ssh_agent::AgentProxy; use crate::tab::{SplitRequest, Tab, TabId}; use crate::window::{Window, WindowId}; use anyhow::{anyhow, Context, Error}; @@ -38,6 +39,7 @@ pub mod localpane; pub mod pane; pub mod renderable; pub mod ssh; +pub mod ssh_agent; pub mod tab; pub mod termwiztermtab; pub mod tmux; @@ -108,6 +110,7 @@ pub struct Mux { identity: RwLock>>, num_panes_by_workspace: RwLock>, main_thread_id: std::thread::ThreadId, + agent: Option, } const BUFSIZE: usize = 1024 * 1024; @@ -119,10 +122,7 @@ fn send_actions_to_mux(pane: &Weak, dead: &Arc, actions: V match pane.upgrade() { Some(pane) => { pane.perform_actions(actions); - histogram!( - "send_actions_to_mux.perform_actions.latency", - start.elapsed() - ); + histogram!("send_actions_to_mux.perform_actions.latency").record(start.elapsed()); Mux::notify_from_any_thread(MuxNotification::PaneOutput(pane.pane_id())); } None => { @@ -132,7 +132,7 @@ fn send_actions_to_mux(pane: &Weak, dead: &Arc, actions: V dead.store(true, Ordering::Relaxed); } } - histogram!("send_actions_to_mux.rate", 1.); + histogram!("send_actions_to_mux.rate").record(1.); } fn parse_buffered_data(pane: Weak, dead: &Arc, mut rx: FileDescriptor) { @@ -320,7 +320,7 @@ fn read_from_pane_pty( break; } Ok(size) => { - histogram!("read_from_pane_pty.bytes.rate", size as f64); + histogram!("read_from_pane_pty.bytes.rate").record(size as f64); log::trace!("read_pty pane {pane_id} read {size} bytes"); if let Err(err) = tx.write_all(&buf[..size]) { error!( @@ -421,6 +421,12 @@ impl Mux { ); } + let agent = if config::configuration().mux_enable_ssh_agent { + Some(AgentProxy::new()) + } else { + None + }; + Self { tabs: RwLock::new(HashMap::new()), panes: RwLock::new(HashMap::new()), @@ -434,6 +440,7 @@ impl Mux { identity: RwLock::new(None), num_panes_by_workspace: RwLock::new(HashMap::new()), main_thread_id: std::thread::current().id(), + agent, } } @@ -471,6 +478,9 @@ impl Mux { if let Some(info) = self.clients.write().get_mut(client_id) { info.update_last_input(); } + if let Some(agent) = &self.agent { + agent.update_target(); + } } pub fn record_input_for_current_identity(&self) { diff --git a/mux/src/ssh_agent.rs b/mux/src/ssh_agent.rs new file mode 100644 index 000000000..0c9b96b8a --- /dev/null +++ b/mux/src/ssh_agent.rs @@ -0,0 +1,216 @@ +use crate::{ClientId, Mux}; +use anyhow::Context; +use chrono::{DateTime, Duration, Utc}; +use parking_lot::RwLock; +#[cfg(unix)] +use std::os::unix::fs::symlink as symlink_file; +#[cfg(windows)] +use std::os::windows::fs::symlink_file; +use std::path::{Path, PathBuf}; +use std::sync::mpsc::{sync_channel, Receiver, SyncSender}; +use std::sync::Arc; + +/// AgentProxy manages an agent.PID symlink in the wezterm runtime +/// directory. +/// The intent is to maintain the symlink and have it point to the +/// appropriate ssh agent socket path for the most recently active +/// mux client. +/// +/// Why symlink rather than running an agent proxy socket of our own? +/// Some agent implementations use low level unix socket operations +/// to decide whether the client process is allowed to consume +/// the agent or not, and us sitting in the middle breaks that. +/// +/// As a further complication, when a wezterm proxy client is +/// present, both the proxy and the mux instance inside a gui +/// tend to be updated together, with the gui often being +/// touched last. +/// +/// To deal with that we de-bounce input events and weight +/// proxy clients higher so that we can avoid thrashing +/// between gui and proxy. +/// +/// The consequence of this is that there is 100ms of artificial +/// latency to detect a change in the active client. +/// This number was selected because it is unlike for a human +/// to be able to switch devices that quickly. +/// +/// How is this used? The Mux::client_had_input function +/// will call AgentProxy::update_target to signal when +/// the active client may have changed. + +pub struct AgentProxy { + sock_path: PathBuf, + current_target: RwLock>>, + sender: SyncSender<()>, +} + +impl Drop for AgentProxy { + fn drop(&mut self) { + std::fs::remove_file(&self.sock_path).ok(); + } +} + +fn update_symlink, Q: AsRef>(original: P, link: Q) -> anyhow::Result<()> { + let original = original.as_ref(); + let link = link.as_ref(); + + match symlink_file(original, link) { + Ok(()) => Ok(()), + Err(err) => { + if err.kind() == std::io::ErrorKind::AlreadyExists { + std::fs::remove_file(link) + .with_context(|| format!("failed to remove {}", link.display()))?; + symlink_file(original, link).with_context(|| { + format!( + "failed to create symlink {} -> {}: {err:#}", + link.display(), + original.display() + ) + }) + } else { + anyhow::bail!( + "failed to create symlink {} -> {}: {err:#}", + link.display(), + original.display() + ); + } + } + } +} + +impl AgentProxy { + pub fn new() -> Self { + let pid = unsafe { libc::getpid() }; + let sock_path = config::RUNTIME_DIR.join(format!("agent.{pid}")); + + if let Some(inherited) = Self::default_ssh_auth_sock() { + if let Err(err) = update_symlink(&inherited, &sock_path) { + log::error!("failed to set {sock_path:?} to initial inherited SSH_AUTH_SOCK value of {inherited:?}: {err:#}"); + } + } + + let (sender, receiver) = sync_channel(16); + + std::thread::spawn(move || Self::process_updates(receiver)); + + Self { + sock_path, + current_target: RwLock::new(None), + sender, + } + } + + pub fn default_ssh_auth_sock() -> Option { + match &config::configuration().default_ssh_auth_sock { + Some(value) => Some(value.to_string()), + None => std::env::var("SSH_AUTH_SOCK").ok(), + } + } + + pub fn path(&self) -> &Path { + &self.sock_path + } + + pub fn update_target(&self) { + // If the send fails, the channel is most likely + // full, which means that the updater thread is + // going to observe the now-current state when + // it wakes up, so we needn't try any harder + self.sender.try_send(()).ok(); + } + + fn process_updates(receiver: Receiver<()>) { + while let Ok(_) = receiver.recv() { + // De-bounce multiple input events so that we don't quickly + // thrash between the host and proxy value + std::thread::sleep(std::time::Duration::from_millis(100)); + while receiver.try_recv().is_ok() {} + + if let Some(agent) = &Mux::get().agent { + agent.update_now(); + } + } + } + + fn update_now(&self) { + // Get list of clients from mux + // Order by most recent activity + // Take first one with auth sock -> that's the path + // If we find none, then we print an error and drop + // this stream. + + let mut clients = Mux::get().iter_clients(); + clients.retain(|info| info.client_id.ssh_auth_sock.is_some()); + + clients.sort_by(|a, b| { + // The biggest last_input time is most recent, so it sorts sooner. + // However, when using a proxy into a gui mux, both the proxy and the + // gui will update around the same time, with the gui often being + // updated fractionally after the proxy. + // In this situation we want the proxy to be selected, so we weight + // proxy entries slightly higher by adding a small Duration to + // the actual observed value. + // `via proxy pid` is coupled with the Pdu::SetClientId logic + // in wezterm-mux-server-impl/src/sessionhandler.rs + const PROXY_MARKER: &str = "via proxy pid"; + let a_proxy = a.client_id.hostname.contains(PROXY_MARKER); + let b_proxy = b.client_id.hostname.contains(PROXY_MARKER); + + fn adjust_for_proxy(time: DateTime, is_proxy: bool) -> DateTime { + if is_proxy { + time + Duration::milliseconds(100) + } else { + time + } + } + + let a_time = adjust_for_proxy(a.last_input, a_proxy); + let b_time = adjust_for_proxy(b.last_input, b_proxy); + + b_time.cmp(&a_time) + }); + + log::trace!("filtered to {clients:#?}"); + match clients.get(0) { + Some(info) => { + let current = self.current_target.read().clone(); + let needs_update = match (current, &info.client_id) { + (None, _) => true, + (Some(prior), current) => prior != *current, + }; + + if needs_update { + let ssh_auth_sock = info + .client_id + .ssh_auth_sock + .as_ref() + .expect("we checked in the retain above"); + log::trace!( + "Will update {} -> {ssh_auth_sock}", + self.sock_path.display(), + ); + self.current_target.write().replace(info.client_id.clone()); + + if let Err(err) = update_symlink(ssh_auth_sock, &self.sock_path) { + log::error!( + "Problem updating {} -> {ssh_auth_sock}: {err:#}", + self.sock_path.display(), + ); + } + } + } + None => { + if self.current_target.write().take().is_some() { + log::trace!("Updating agent to be bogus"); + if let Err(err) = update_symlink(".", &self.sock_path) { + log::error!( + "Problem updating {} -> .: {err:#}", + self.sock_path.display() + ); + } + } + } + } + } +} diff --git a/mux/src/tab.rs b/mux/src/tab.rs index 68b3d58ee..8eec504fb 100644 --- a/mux/src/tab.rs +++ b/mux/src/tab.rs @@ -1748,6 +1748,13 @@ impl TabInner { } fn set_active_pane(&mut self, pane: &Arc) { + if self.zoomed.is_some() { + if !configuration().unzoom_on_switch_pane { + return; + } + self.toggle_zoom(); + } + if let Some(item) = self .iter_panes_ignoring_zoom() .iter() diff --git a/nix/flake.lock b/nix/flake.lock index a25b957dc..809991bae 100644 --- a/nix/flake.lock +++ b/nix/flake.lock @@ -21,34 +21,34 @@ "freetype2": { "flake": false, "locked": { - "lastModified": 1675923892, - "narHash": "sha256-dOm8VKYdclTLLkqWMLv7DQI0Qyjit7S4SOCszKEkG3o=", + "lastModified": 1687587065, + "narHash": "sha256-+Fh+/k+NWL5Ow9sDLtp8Cv/8rLNA1oByQQCIQS/bysY=", "owner": "wez", "repo": "freetype2", - "rev": "de8b92dd7ec634e9e2b25ef534c54a3537555c11", + "rev": "e4586d960f339cf75e2e0b34aee30a0ed8353c0d", "type": "github" }, "original": { "owner": "wez", "repo": "freetype2", - "rev": "de8b92dd7ec634e9e2b25ef534c54a3537555c11", + "rev": "e4586d960f339cf75e2e0b34aee30a0ed8353c0d", "type": "github" } }, "harfbuzz": { "flake": false, "locked": { - "lastModified": 1677798343, - "narHash": "sha256-Lsd0Vrkrv67CMyV0ZveShfjUvqh/jDhI8rAK9ps+SZQ=", + "lastModified": 1711722720, + "narHash": "sha256-GdxcAPx5QyniSHPAN1ih28AD9JLUPR0ItqW9JEsl3pU=", "owner": "harfbuzz", "repo": "harfbuzz", - "rev": "60841e26187576bff477c1a09ee2ffe544844abc", + "rev": "63973005bc07aba599b47fdd4cf788647b601ccd", "type": "github" }, "original": { "owner": "harfbuzz", + "ref": "8.4.0", "repo": "harfbuzz", - "rev": "60841e26187576bff477c1a09ee2ffe544844abc", "type": "github" } }, @@ -146,8 +146,8 @@ }, "original": { "owner": "madler", + "ref": "v1.2.11", "repo": "zlib", - "rev": "cacf7f1d4e3d44d871b605da3b647f07d718623f", "type": "github" } } diff --git a/nix/flake.nix b/nix/flake.nix index fb85ef1ef..56ed4fc85 100644 --- a/nix/flake.nix +++ b/nix/flake.nix @@ -12,23 +12,31 @@ }; }; + # NOTE: @2024-05 Nix flakes does not support getting git submodules of 'self'. + # refs: + # - https://discourse.nixos.org/t/get-nix-flake-to-include-git-submodule/30324 + # - https://github.com/NixOS/nix/pull/7862 + # + # ... In the meantime we kinda duplicate the dependencies here then replace the submodules with + # links to each repo in package sources. + # + # Try to use tags when possible to increase readability + # (note: `git submodule status` in wezterm repo will show the `git describe` result for each + # submodule, can help finding a tag if any) freetype2 = { - url = "github:wez/freetype2/de8b92dd7ec634e9e2b25ef534c54a3537555c11"; + url = "github:wez/freetype2/e4586d960f339cf75e2e0b34aee30a0ed8353c0d"; flake = false; }; - harfbuzz = { - url = "github:harfbuzz/harfbuzz/60841e26187576bff477c1a09ee2ffe544844abc"; + url = "github:harfbuzz/harfbuzz/8.4.0"; flake = false; }; - libpng = { url = "github:glennrp/libpng/8439534daa1d3a5705ba92e653eda9251246dd61"; flake = false; }; - zlib = { - url = "github:madler/zlib/cacf7f1d4e3d44d871b605da3b647f07d718623f"; + url = "github:madler/zlib/v1.2.11"; flake = false; }; }; @@ -97,9 +105,7 @@ cargoLock = { lockFile = ../Cargo.lock; - outputHashes = { - "xcb-imdkit-0.3.0" = "sha256-fTpJ6uNhjmCWv7dZqVgYuS2Uic36XNYTbqlaly5QBjI="; - }; + allowBuiltinFetchGit = true; }; preConfigure = '' @@ -162,8 +168,12 @@ buildInputs = buildInputs ++ (with pkgs.rust-bin; [ - stable.latest.minimal - stable.latest.clippy + (stable.latest.minimal.override { + extensions = [ + "clippy" + "rust-src" + ]; + }) nightly.latest.rustfmt nightly.latest.rust-analyzer diff --git a/procinfo/Cargo.toml b/procinfo/Cargo.toml index a1320a130..f5a550eff 100644 --- a/procinfo/Cargo.toml +++ b/procinfo/Cargo.toml @@ -2,6 +2,7 @@ name = "procinfo" version = "0.1.0" edition = "2021" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [features] diff --git a/promise/Cargo.toml b/promise/Cargo.toml index 1f4a0248a..a556d3245 100644 --- a/promise/Cargo.toml +++ b/promise/Cargo.toml @@ -3,12 +3,13 @@ authors = ["Wez Furlong "] name = "promise" version = "0.2.0" edition = "2018" +publish = false [dependencies] -async-task = "4.0" -async-executor = "1.4" -async-io = "1.10" +async-task = "4.7" +async-executor = "1.11" +async-io = "2.3" anyhow = "1.0" thiserror = "1.0" lazy_static = "1.4" -flume = "0.10" +flume = "0.11" diff --git a/pty/Cargo.toml b/pty/Cargo.toml index 2e717483e..46e2f36e4 100644 --- a/pty/Cargo.toml +++ b/pty/Cargo.toml @@ -14,7 +14,7 @@ downcast-rs = "1.0" filedescriptor = { version="0.8", path = "../filedescriptor" } log = "0.4" libc = "0.2" -nix = {version="0.25", features=["term"]} +nix = {version="0.28", features=["term", "fs"]} shell-words = "1.1" serde_derive = {version="1.0", optional=true} serde = {version="1.0", optional=true} @@ -39,5 +39,5 @@ winapi = { version = "0.3", features = [ winreg = "0.10" [dev-dependencies] -smol = "1.2" +smol = "2.0" futures = "0.3" diff --git a/pty/src/cmdbuilder.rs b/pty/src/cmdbuilder.rs index 967e081e8..b4ce50a85 100644 --- a/pty/src/cmdbuilder.rs +++ b/pty/src/cmdbuilder.rs @@ -6,7 +6,9 @@ use std::collections::BTreeMap; use std::ffi::{OsStr, OsString}; #[cfg(windows)] use std::os::windows::ffi::OsStrExt; -use std::path::{Component, Path}; +#[cfg(unix)] +use std::path::Component; +use std::path::Path; /// Used to deal with Windows having case-insensitive environment variables. #[derive(Clone, Debug, PartialEq, PartialOrd)] @@ -605,8 +607,6 @@ impl CommandBuilder { } pub(crate) fn current_directory(&self) -> Option> { - use std::path::Path; - let home: Option<&OsStr> = self .get_env("USERPROFILE") .filter(|path| Path::new(path).is_dir()); @@ -745,6 +745,7 @@ impl CommandBuilder { } } +#[cfg(unix)] /// Returns true if the path begins with `./` or `../` fn is_cwd_relative_path>(p: P) -> bool { matches!( @@ -757,6 +758,7 @@ fn is_cwd_relative_path>(p: P) -> bool { mod tests { use super::*; + #[cfg(unix)] #[test] fn test_cwd_relative() { assert!(is_cwd_relative_path(".")); diff --git a/pty/src/unix.rs b/pty/src/unix.rs index cbe0f76fb..2fd7207a7 100644 --- a/pty/src/unix.rs +++ b/pty/src/unix.rs @@ -7,6 +7,7 @@ use libc::{self, winsize}; use std::cell::RefCell; use std::ffi::OsStr; use std::io::{Read, Write}; +use std::os::fd::AsFd; use std::os::unix::ffi::OsStrExt; use std::os::unix::io::{AsRawFd, FromRawFd}; use std::os::unix::process::CommandExt; @@ -378,7 +379,7 @@ impl MasterPty for UnixMasterPty { } fn get_termios(&self) -> Option { - nix::sys::termios::tcgetattr(self.fd.0.as_raw_fd()).ok() + nix::sys::termios::tcgetattr(self.fd.0.as_fd()).ok() } } diff --git a/pty/src/win/psuedocon.rs b/pty/src/win/psuedocon.rs index 48e10c040..13c7c5dba 100644 --- a/pty/src/win/psuedocon.rs +++ b/pty/src/win/psuedocon.rs @@ -24,6 +24,7 @@ use winapi::um::winnt::HANDLE; pub type HPCON = HANDLE; +pub const PSUEDOCONSOLE_INHERIT_CURSOR: DWORD = 0x1; pub const PSEUDOCONSOLE_RESIZE_QUIRK: DWORD = 0x2; pub const PSEUDOCONSOLE_WIN32_INPUT_MODE: DWORD = 0x4; #[allow(dead_code)] @@ -83,7 +84,9 @@ impl PsuedoCon { size, input.as_raw_handle() as _, output.as_raw_handle() as _, - PSEUDOCONSOLE_RESIZE_QUIRK | PSEUDOCONSOLE_WIN32_INPUT_MODE, + PSUEDOCONSOLE_INHERIT_CURSOR + | PSEUDOCONSOLE_RESIZE_QUIRK + | PSEUDOCONSOLE_WIN32_INPUT_MODE, &mut con, ) }; diff --git a/rangeset/Cargo.toml b/rangeset/Cargo.toml index a9886933c..1cdd94849 100644 --- a/rangeset/Cargo.toml +++ b/rangeset/Cargo.toml @@ -3,12 +3,13 @@ name = "rangeset" version = "0.1.0" authors = ["Wez Furlong "] edition = "2018" +publish = false [dependencies] -num = "0.3" +num = "0.4" [dev-dependencies] -criterion = "0.3" +criterion = "0.5" [[bench]] name = "rangeset" diff --git a/ratelim/Cargo.toml b/ratelim/Cargo.toml index 5bf163ccc..7b1cdb4c7 100644 --- a/ratelim/Cargo.toml +++ b/ratelim/Cargo.toml @@ -3,6 +3,7 @@ name = "ratelim" version = "0.1.0" authors = ["Wez Furlong "] edition = "2018" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/strip-ansi-escapes/Cargo.toml b/strip-ansi-escapes/Cargo.toml index 6e6414dfa..787b98f1f 100644 --- a/strip-ansi-escapes/Cargo.toml +++ b/strip-ansi-escapes/Cargo.toml @@ -3,6 +3,7 @@ name = "strip-ansi-escapes" version = "0.1.0" authors = ["Wez Furlong "] edition = "2018" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/sync-color-schemes/Cargo.toml b/sync-color-schemes/Cargo.toml index b1cc34f8a..31e228e05 100644 --- a/sync-color-schemes/Cargo.toml +++ b/sync-color-schemes/Cargo.toml @@ -2,6 +2,7 @@ name = "sync-color-schemes" version = "0.1.0" edition = "2021" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -14,14 +15,14 @@ futures = "0.3" lazy_static = "1.4" libflate = "2" log = "0.4" -reqwest = "0.11" -rusqlite = {version="0.27", features=["bundled", "blob"]} +reqwest = "0.12" +rusqlite = {version="0.30", features=["bundled", "blob"]} serde = {version="1.0", features=["derive"]} serde_json = "1.0" -sqlite-cache = "0.1.3" +serde_yaml = "0.9" +sqlite-cache = {git="https://github.com/losfair/sqlite-cache", rev="0961b50385ff189bb12742716331c05ed0bf7805" } tar = "0.4" tempfile = "3.3" tokio = { version = "1.19", features = ["rt-multi-thread", "sync", "macros"] } toml = "0.8" wezterm-dynamic = { path = "../wezterm-dynamic" } -yaml-rust = "0.4.5" diff --git a/sync-color-schemes/src/base16.rs b/sync-color-schemes/src/base16.rs index c809363db..2ce925bb3 100644 --- a/sync-color-schemes/src/base16.rs +++ b/sync-color-schemes/src/base16.rs @@ -11,23 +11,8 @@ async fn fetch_base16_list() -> anyhow::Result> { ) .await?; - let mut result = vec![]; - for doc in yaml_rust::YamlLoader::load_from_str(&data)? { - for value in doc - .into_hash() - .ok_or_else(|| anyhow::anyhow!("list.yaml isn't a hash"))? - .values() - { - result.push( - value - .clone() - .into_string() - .ok_or_else(|| anyhow::anyhow!("item {value:?} is not a string"))?, - ); - } - } - - Ok(result) + let mapping: HashMap = serde_yaml::from_str(&data)?; + Ok(mapping.into_values().collect()) } async fn fetch_repo_tarball(repo_url: &str, branch: &str) -> anyhow::Result> { diff --git a/sync-color-schemes/src/main.rs b/sync-color-schemes/src/main.rs index d164ed0ae..018451198 100644 --- a/sync-color-schemes/src/main.rs +++ b/sync-color-schemes/src/main.rs @@ -242,6 +242,9 @@ impl SchemeSet { let existing: Vec = serde_json::from_str(&data)?; for item in existing { let data = ColorSchemeFile::from_json_value(&item)?; + if data.colors.ansi.is_none() { + continue; + } let name = data.metadata.name.as_ref().unwrap().to_string(); by_name.insert( name.to_string(), @@ -417,6 +420,9 @@ async fn main() -> anyhow::Result<()> { schemeses .sync_toml("https://github.com/ribru17/bamboo.nvim", "master", "") .await?; + schemeses + .sync_toml("https://github.com/eldritch-theme/wezterm", "master", "") + .await?; schemeses.accumulate(iterm2::sync_iterm2().await.context("sync iterm2")?); schemeses.accumulate(base16::sync().await.context("sync base16")?); schemeses.accumulate(gogh::sync_gogh().await.context("sync gogh")?); diff --git a/term/Cargo.toml b/term/Cargo.toml index fc36addfa..7460c0345 100644 --- a/term/Cargo.toml +++ b/term/Cargo.toml @@ -19,17 +19,17 @@ bitflags = "1.3" csscolorparser = "0.6" downcast-rs = "1.0" humansize = "2.1" -miniz_oxide = "0.4" +miniz_oxide = "0.7" finl_unicode = "1.2" hex = "0.4" -image = "0.24.6" +image = "0.25" lazy_static = "1.4" log = "0.4" -lru = "0.7" +lru = "0.12" num-traits = "0.2" ordered-float = "4.1" serde = {version="1.0", features = ["rc"]} -terminfo = "0.8" +terminfo = "0.9" unicode-normalization = "0.1.21" url = "2" wezterm-bidi = { path = "../bidi" } @@ -37,7 +37,7 @@ wezterm-dynamic = { path = "../wezterm-dynamic" } [dev-dependencies] env_logger = "0.11" -k9 = "0.11.0" +k9 = "0.12.0" [dependencies.termwiz] version = "0.22" diff --git a/term/src/terminalstate/mod.rs b/term/src/terminalstate/mod.rs index ada148039..02d1690af 100644 --- a/term/src/terminalstate/mod.rs +++ b/term/src/terminalstate/mod.rs @@ -8,6 +8,7 @@ use log::debug; use num_traits::ToPrimitive; use std::collections::HashMap; use std::io::{BufWriter, Write}; +use std::num::NonZeroUsize; use std::sync::mpsc::{channel, Sender}; use std::sync::Arc; use terminfo::{Database, Value}; @@ -568,7 +569,7 @@ impl TerminalState { term_program: term_program.to_string(), term_version: term_version.to_string(), writer, - image_cache: lru::LruCache::new(16), + image_cache: lru::LruCache::new(NonZeroUsize::new(16).unwrap()), user_vars: HashMap::new(), kitty_img: Default::default(), seqno, diff --git a/term/src/terminalstate/performer.rs b/term/src/terminalstate/performer.rs index 80f9d6dd2..817b137ba 100644 --- a/term/src/terminalstate/performer.rs +++ b/term/src/terminalstate/performer.rs @@ -150,7 +150,6 @@ impl<'a> Performer<'a> { { let y = self.cursor.y; let is_conpty = self.state.enable_conpty_quirks; - let is_alt = self.state.screen.alt_screen_is_active; let screen = self.screen_mut(); let y = screen.phys_row(y); @@ -162,14 +161,13 @@ impl<'a> Performer<'a> { } } - let should_mark_wrapped = !is_alt - && (!is_conpty - || screen - .line_mut(y) - .visible_cells() - .last() - .map(|cell| makes_sense_to_wrap(cell.str())) - .unwrap_or(false)); + let should_mark_wrapped = !is_conpty + || screen + .line_mut(y) + .visible_cells() + .last() + .map(|cell| makes_sense_to_wrap(cell.str())) + .unwrap_or(false); if should_mark_wrapped { screen.line_mut(y).set_last_cell_was_wrapped(true, seqno); } diff --git a/termwiz/Cargo.toml b/termwiz/Cargo.toml index 2a74a30dc..f11de6176 100644 --- a/termwiz/Cargo.toml +++ b/termwiz/Cargo.toml @@ -22,22 +22,22 @@ finl_unicode = "1.2" fixedbitset = "0.4" fnv = {version="1.0", optional=true} hex = "0.4" -image = {version="0.24.6", optional=true} +image = {version="0.25", optional=true} lazy_static = "1.4" libc = "0.2" log = "0.4" memmem = "0.1" +num-derive = "0.4" num-traits = "0.2" ordered-float = "4.1" pest = "2.1" pest_derive = "2.1" phf = "0.11" -semver = "0.11" serde = {version="1.0", features = ["rc", "derive"], optional=true} siphasher = "0.3" sha2 = "0.10" tempfile = "3.4" -terminfo = "0.8" +terminfo = "0.9" thiserror = "1.0" unicode-segmentation = "1.8" ucd-trie = "0.1" @@ -55,19 +55,16 @@ use_image = ["image"] docs = ["widgets", "use_serde"] [dev-dependencies] -criterion = "0.4" +criterion = "0.5" varbincode = "0.1" -k9 = "0.11" +k9 = "0.12" env_logger = "0.11" -[dependencies.num-derive] -features = ["full-syntax"] -version = "0.3" [target."cfg(unix)".dependencies] signal-hook = "0.3" termios = "0.3" -nix = "0.26" +nix = {version="0.28", features=["mman", "fs"]} [target."cfg(windows)".dependencies.winapi] features = [ diff --git a/termwiz/codegen/Cargo.toml b/termwiz/codegen/Cargo.toml index 441d07609..11f51273f 100644 --- a/termwiz/codegen/Cargo.toml +++ b/termwiz/codegen/Cargo.toml @@ -6,5 +6,5 @@ edition = "2021" [dependencies] phf_codegen = "0.10" ucd-trie = "0.1" -reqwest = {version="0.11", features=["blocking"]} +reqwest = {version="0.12", features=["blocking"]} human-sort = "0.2" diff --git a/termwiz/src/caps/mod.rs b/termwiz/src/caps/mod.rs index 9d3c8bd71..c9b94e8d9 100644 --- a/termwiz/src/caps/mod.rs +++ b/termwiz/src/caps/mod.rs @@ -55,12 +55,15 @@ //! the terminal capabilities, but also offers a `ProbeHints` //! that can be used by the embedding application to override those choices. use crate::{builder, Result}; -use semver::Version; use std::env::var; use terminfo::{self, capability as cap}; pub mod probed; +/// Environment variable name indicating that color output should be disabled. +/// See +const NO_COLOR_ENV: &str = "NO_COLOR"; + builder! { /// Use the `ProbeHints` to configure an instance of /// the `ProbeHints` struct. `ProbeHints` are passed to the `Capabilities` @@ -121,12 +124,21 @@ builder! { impl ProbeHints { pub fn new_from_env() -> Self { - ProbeHints::default() + let mut probe_hints = ProbeHints::default() .term(var("TERM").ok()) .colorterm(var("COLORTERM").ok()) .colorterm_bce(var("COLORTERM_BCE").ok()) .term_program(var("TERM_PROGRAM").ok()) - .term_program_version(var("TERM_PROGRAM_VERSION").ok()) + .term_program_version(var("TERM_PROGRAM_VERSION").ok()); + + if !std::env::var(NO_COLOR_ENV) + .unwrap_or("".to_string()) + .is_empty() + { + probe_hints.color_level = Some(ColorLevel::MonoChrome); + } + + probe_hints } } @@ -146,6 +158,9 @@ pub enum ColorLevel { /// What we care about here is whether the terminal supports the escape /// sequence to specify RGB values rather than a palette index. TrueColor, + /// Describes monochrome (black and white) color support. + /// Enabled via NO_COLOR environment variable. + MonoChrome, } /// `Capabilities` holds information about the capabilities of a terminal. @@ -279,12 +294,13 @@ impl Capabilities { // here because the iTerm2 docs don't say when the // image protocol was first implemented, but do mention // the gif version. - Version::parse( + version_ge( hints .term_program_version .as_ref() .unwrap_or(&"0.0.0".to_owned()), - ) >= Version::parse("2.9.20150512") + "2.9.20150512", + ) } Some("WezTerm") => true, _ => false, @@ -360,10 +376,62 @@ impl Capabilities { } } +/// Returns true if the version string `a` is >= `b` +fn version_ge(a: &str, b: &str) -> bool { + let mut a = a.split('.'); + let mut b = b.split('.'); + + loop { + match (a.next(), b.next()) { + (Some(a), Some(b)) => match (a.parse::(), b.parse::()) { + (Ok(a), Ok(b)) => { + if a > b { + return true; + } + if a < b { + return false; + } + } + _ => { + if a > b { + return true; + } + if a < b { + return false; + } + } + }, + (Some(_), None) => { + // A is greater + return true; + } + (None, Some(_)) => { + // A is smaller + return false; + } + (None, None) => { + // Equal + return true; + } + } + } +} + #[cfg(test)] mod test { use super::*; + #[test] + fn version_cmp() { + assert!(version_ge("1", "0")); + assert!(version_ge("1.0", "0")); + assert!(!version_ge("0", "1")); + assert!(version_ge("3.2", "2.9")); + assert!(version_ge("3.2.0beta5", "2.9")); + assert!(version_ge("3.2.0beta5", "3.2.0")); + assert!(version_ge("3.2.0beta5", "3.2.0beta1")); + } + fn load_terminfo() -> terminfo::Database { // Load our own compiled data so that the tests have an // environment that doesn't vary machine by machine. diff --git a/termwiz/src/escape/apc.rs b/termwiz/src/escape/apc.rs index 78e2b9c3d..c9c0e2d60 100644 --- a/termwiz/src/escape/apc.rs +++ b/termwiz/src/escape/apc.rs @@ -273,9 +273,8 @@ fn read_shared_memory_data( ) -> std::result::Result, std::io::Error> { use nix::sys::mman::{shm_open, shm_unlink}; use std::fs::File; - use std::os::unix::io::FromRawFd; - let raw_fd = shm_open( + let fd = shm_open( name, nix::fcntl::OFlag::O_RDONLY, nix::sys::stat::Mode::empty(), @@ -287,7 +286,7 @@ fn read_shared_memory_data( format!("shm_open {} failed: {:#}", name, err), ) })?; - let mut f = unsafe { File::from_raw_fd(raw_fd) }; + let mut f = File::from(fd); if let Some(offset) = data_offset { f.seek(std::io::SeekFrom::Start(offset.into()))?; } diff --git a/termwiz/src/image.rs b/termwiz/src/image.rs index 4d7f8ebbf..522899810 100644 --- a/termwiz/src/image.rs +++ b/termwiz/src/image.rs @@ -387,8 +387,9 @@ impl ImageDataType { return Self::EncodedFile(data); } }; + let cursor = std::io::Cursor::new(&*data); match format { - ImageFormat::Gif => image::codecs::gif::GifDecoder::new(&*data) + ImageFormat::Gif => image::codecs::gif::GifDecoder::new(cursor) .and_then(|decoder| decoder.into_frames().collect_frames()) .and_then(|frames| { if frames.is_empty() { @@ -406,12 +407,15 @@ impl ImageDataType { Self::decode_single(data) }), ImageFormat::Png => { - let decoder = match image::codecs::png::PngDecoder::new(&*data) { + let decoder = match image::codecs::png::PngDecoder::new(cursor) { Ok(d) => d, _ => return Self::EncodedFile(data), }; - if decoder.is_apng() { - match decoder.apng().into_frames().collect_frames() { + if decoder.is_apng().unwrap_or(false) { + match decoder + .apng() + .and_then(|d| d.into_frames().collect_frames()) + { Ok(frames) if frames.is_empty() => { log::error!("decoded image has 0 frames, using placeholder"); Self::placeholder() @@ -424,7 +428,7 @@ impl ImageDataType { } } ImageFormat::WebP => { - let decoder = match image::codecs::webp::WebPDecoder::new(&*data) { + let decoder = match image::codecs::webp::WebPDecoder::new(cursor) { Ok(d) => d, _ => return Self::EncodedFile(data), }; diff --git a/termwiz/src/render/terminfo.rs b/termwiz/src/render/terminfo.rs index 8de007035..7b52b1bc6 100644 --- a/termwiz/src/render/terminfo.rs +++ b/termwiz/src/render/terminfo.rs @@ -149,7 +149,9 @@ impl TerminfoRenderer { None => 0, }; - if attr.foreground() != current_foreground { + if attr.foreground() != current_foreground + && self.caps.color_level() != ColorLevel::MonoChrome + { match (has_true_color, attr.foreground()) { (true, ColorAttribute::TrueColorWithPaletteFallback(tc, _)) | (true, ColorAttribute::TrueColorWithDefaultFallback(tc)) => { @@ -183,7 +185,9 @@ impl TerminfoRenderer { } } - if attr.background() != current_background { + if attr.background() != current_background + && self.caps.color_level() != ColorLevel::MonoChrome + { match (has_true_color, attr.background()) { (true, ColorAttribute::TrueColorWithPaletteFallback(tc, _)) | (true, ColorAttribute::TrueColorWithDefaultFallback(tc)) => { diff --git a/termwiz/src/render/windows.rs b/termwiz/src/render/windows.rs index 2dab26a3f..1e01172d0 100644 --- a/termwiz/src/render/windows.rs +++ b/termwiz/src/render/windows.rs @@ -1,6 +1,6 @@ //! A Renderer for windows consoles -use crate::caps::Capabilities; +use crate::caps::{Capabilities, ColorLevel}; use crate::cell::{AttributeChange, CellAttributes, Underline}; use crate::color::{AnsiColor, ColorAttribute}; use crate::surface::{Change, Position}; @@ -17,17 +17,19 @@ use winapi::um::wincon::{ pub struct WindowsConsoleRenderer { pending_attr: CellAttributes, + capabilities: Capabilities, } impl WindowsConsoleRenderer { - pub fn new(_caps: Capabilities) -> Self { + pub fn new(capabilities: Capabilities) -> Self { Self { pending_attr: CellAttributes::default(), + capabilities, } } } -fn to_attr_word(attr: &CellAttributes) -> u16 { +fn to_attr_word(capabilities: &Capabilities, attr: &CellAttributes) -> u16 { macro_rules! ansi_colors_impl { ($idx:expr, $default:ident, $red:ident, $green:ident, $blue:ident, @@ -69,6 +71,21 @@ fn to_attr_word(attr: &CellAttributes) -> u16 { }; } + let reverse = if attr.reverse() { + COMMON_LVB_REVERSE_VIDEO + } else { + 0 + }; + let underline = if attr.underline() != Underline::None { + COMMON_LVB_UNDERSCORE + } else { + 0 + }; + + if capabilities.color_level() == ColorLevel::MonoChrome { + return reverse | underline; + } + let fg = match attr.foreground() { ColorAttribute::TrueColorWithDefaultFallback(_) | ColorAttribute::Default => { FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN @@ -98,17 +115,6 @@ fn to_attr_word(attr: &CellAttributes) -> u16 { ), }; - let reverse = if attr.reverse() { - COMMON_LVB_REVERSE_VIDEO - } else { - 0 - }; - let underline = if attr.underline() != Underline::None { - COMMON_LVB_UNDERSCORE - } else { - 0 - }; - bg | fg | reverse | underline } @@ -308,7 +314,7 @@ impl WindowsConsoleRenderer { dirty: false, rows, cols, - pending_attr: to_attr_word(&CellAttributes::default()), + pending_attr: to_attr_word(&self.capabilities, &CellAttributes::default()), }; for change in changes { @@ -318,7 +324,13 @@ impl WindowsConsoleRenderer { .set_background(color.clone()) .clone(); - buffer.fill(' ', to_attr_word(&attr), 0, 0, cols * rows); + buffer.fill( + ' ', + to_attr_word(&self.capabilities, &attr), + 0, + 0, + cols * rows, + ); buffer.set_cursor(0, 0, out)?; } Change::ClearToEndOfLine(color) => { @@ -328,7 +340,7 @@ impl WindowsConsoleRenderer { buffer.fill( ' ', - to_attr_word(&attr), + to_attr_word(&self.capabilities, &attr), buffer.cursor_x, buffer.cursor_y, cols.saturating_sub(buffer.cursor_x), @@ -341,14 +353,18 @@ impl WindowsConsoleRenderer { buffer.fill( ' ', - to_attr_word(&attr), + to_attr_word(&self.capabilities, &attr), buffer.cursor_x, buffer.cursor_y, cols * rows, ); } Change::Text(text) => { - buffer.write_text(&text, to_attr_word(&self.pending_attr), out)?; + buffer.write_text( + &text, + to_attr_word(&self.capabilities, &self.pending_attr), + out, + )?; } Change::CursorPosition { x, y } => { let x = match x { diff --git a/umask/Cargo.toml b/umask/Cargo.toml index 933b394d1..279fd9516 100644 --- a/umask/Cargo.toml +++ b/umask/Cargo.toml @@ -3,6 +3,7 @@ name = "umask" version = "0.1.0" authors = ["Wez Furlong "] edition = "2018" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/vtparse/Cargo.toml b/vtparse/Cargo.toml index a14141c3b..89f388817 100644 --- a/vtparse/Cargo.toml +++ b/vtparse/Cargo.toml @@ -14,4 +14,4 @@ readme = "README.md" utf8parse = "0.2" [dev-dependencies] -k9 = "0.11" +k9 = "0.12" diff --git a/wezterm-client/Cargo.toml b/wezterm-client/Cargo.toml index 6e63609c1..b2861b394 100644 --- a/wezterm-client/Cargo.toml +++ b/wezterm-client/Cargo.toml @@ -3,6 +3,7 @@ name = "wezterm-client" version = "0.1.0" authors = ["Wez Furlong "] edition = "2018" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -10,6 +11,7 @@ edition = "2018" anyhow = "1.0" async-trait = "0.1" async_ossl = { path = "../async_ossl" } +async-io = "2.3" codec = { path = "../codec" } config = { path = "../config" } filedescriptor = { version="0.8", path = "../filedescriptor" } @@ -17,8 +19,8 @@ futures = "0.3" lazy_static = "1.4" log = "0.4" libc = "0.2" -lru = "0.7" -metrics = { version="0.17", features=["std"]} +lru = "0.12" +metrics = "0.22" mux = { path = "../mux" } openssl = "0.10.57" parking_lot = "0.12" @@ -26,7 +28,7 @@ portable-pty = { path = "../pty", features = ["serde_support"]} promise = { path = "../promise" } rangeset = { path = "../rangeset" } ratelim= { path = "../ratelim" } -smol = "1.2" +smol = "2.0" termwiz = { path = "../termwiz" } textwrap = "0.16" thiserror = "1.0" @@ -35,9 +37,9 @@ url = "2" wezterm-dynamic = { path = "../wezterm-dynamic" } wezterm-ssh = { path = "../wezterm-ssh" } wezterm-term = { path = "../term", features=["use_serde"] } +wezterm-uds = { path = "../wezterm-uds" } [target."cfg(windows)".dependencies] -uds_windows = "1.0" winapi = { version = "0.3", features = [ "winuser", ]} diff --git a/wezterm-client/src/client.rs b/wezterm-client/src/client.rs index 788085be1..0b07d6d95 100644 --- a/wezterm-client/src/client.rs +++ b/wezterm-client/src/client.rs @@ -1,6 +1,5 @@ use crate::domain::{ClientDomain, ClientDomainConfig}; use crate::pane::ClientPane; -use crate::UnixStream; use anyhow::{anyhow, bail, Context}; use async_ossl::AsyncSslStream; use async_trait::async_trait; @@ -25,11 +24,16 @@ use std::io::{Read, Write}; use std::marker::Unpin; use std::net::TcpStream; #[cfg(unix)] +use std::os::fd::{AsFd, AsRawFd, BorrowedFd, RawFd}; +#[cfg(unix)] use std::os::unix::process::CommandExt; +#[cfg(windows)] +use std::os::windows::io::{AsRawSocket, AsSocket, BorrowedSocket, RawSocket}; use std::path::{Path, PathBuf}; use std::thread; use std::time::Duration; use thiserror::Error; +use wezterm_uds::UnixStream; #[derive(Error, Debug)] #[error("Timeout")] @@ -51,7 +55,8 @@ enum ReaderMessage { pub struct Client { sender: Sender, local_domain_id: Option, - client_id: ClientId, + pub client_id: ClientId, + client_domain_config: ClientDomainConfig, pub is_reconnectable: bool, pub is_local: bool, } @@ -78,8 +83,8 @@ macro_rules! rpc { let start = std::time::Instant::now(); let result = self.send_pdu(Pdu::$request_type(pdu)).await; let elapsed = start.elapsed(); - metrics::histogram!("rpc", elapsed, "method" => stringify!($method_name)); - metrics::counter!("rpc.count", 1, "method" => stringify!($method_name)); + metrics::histogram!("rpc", "method" => stringify!($method_name)).record(elapsed); + metrics::counter!("rpc.count", "method" => stringify!($method_name)).increment(1); match result { Ok(Pdu::$response_type(res)) => Ok(res), Ok(_) => bail!("unexpected response {:?}", result), @@ -97,8 +102,8 @@ macro_rules! rpc { let start = std::time::Instant::now(); let result = self.send_pdu(Pdu::$request_type($request_type{})).await; let elapsed = start.elapsed(); - metrics::histogram!("rpc", elapsed, "method" => stringify!($method_name)); - metrics::counter!("rpc.count", 1, "method" => stringify!($method_name)); + metrics::histogram!("rpc", "method" => stringify!($method_name)).record(elapsed); + metrics::counter!("rpc.count", "method" => stringify!($method_name)).increment(1); match result { Ok(Pdu::$response_type(res)) => Ok(res), Ok(_) => bail!("unexpected response {:?}", result), @@ -523,6 +528,7 @@ where T: std::io::Write, T: std::io::Read, T: Send, + T: async_io::IoSafe, { async fn wait_for_readable(&self) -> anyhow::Result<()> { Ok(self.readable().await?) @@ -541,6 +547,8 @@ struct SshStream { stdout: FileDescriptor, } +unsafe impl async_io::IoSafe for SshStream {} + impl std::fmt::Debug for SshStream { fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::result::Result<(), std::fmt::Error> { write!(fmt, "SshStream {{...}}") @@ -548,19 +556,33 @@ impl std::fmt::Debug for SshStream { } #[cfg(unix)] -impl std::os::unix::io::AsRawFd for SshStream { - fn as_raw_fd(&self) -> std::os::unix::io::RawFd { +impl AsFd for SshStream { + fn as_fd(&self) -> BorrowedFd { + self.stdout.as_fd() + } +} + +#[cfg(unix)] +impl AsRawFd for SshStream { + fn as_raw_fd(&self) -> RawFd { self.stdout.as_raw_fd() } } #[cfg(windows)] -impl std::os::windows::io::AsRawSocket for SshStream { - fn as_raw_socket(&self) -> std::os::windows::io::RawSocket { +impl AsRawSocket for SshStream { + fn as_raw_socket(&self) -> RawSocket { self.stdout.as_raw_socket() } } +#[cfg(windows)] +impl AsSocket for SshStream { + fn as_socket(&self) -> BorrowedSocket { + self.stdout.as_socket() + } +} + impl Read for SshStream { fn read(&mut self, buf: &mut [u8]) -> Result { self.stdout.read(buf) @@ -663,7 +685,9 @@ impl Reconnectable { let sess = ssh_connect_with_ui(ssh_config, ui)?; let proxy_bin = Self::wezterm_bin_path(&ssh_dom.remote_wezterm_path); - let cmd = if initial { + let cmd = if let Some(cmd) = ssh_dom.override_proxy_command.clone() { + cmd + } else if initial { format!("{} cli --prefer-mux proxy", proxy_bin) } else { format!("{} cli --prefer-mux --no-auto-start proxy", proxy_bin) @@ -1015,6 +1039,7 @@ impl Reconnectable { impl Client { fn new(local_domain_id: Option, mut reconnectable: Reconnectable) -> Self { + let client_domain_config = reconnectable.config.clone(); let is_reconnectable = reconnectable.reconnectable(); let is_local = reconnectable.is_local(); let (sender, mut receiver) = unbounded(); @@ -1112,9 +1137,14 @@ impl Client { is_reconnectable, is_local, client_id, + client_domain_config, } } + pub fn into_client_domain_config(self) -> ClientDomainConfig { + self.client_domain_config + } + pub async fn verify_version_compat( &self, ui: &ConnectionUI, @@ -1135,6 +1165,7 @@ impl Client { ); self.set_client_id(SetClientId { client_id: self.client_id.clone(), + is_proxy: false, }) .await?; Ok(info) @@ -1157,21 +1188,24 @@ impl Client { } else if err.root_cause().is::() { "Received an implausible and likely corrupt response from \ the server. This can happen if the remote host outputs \ - to stdout prior to running commands." + to stdout prior to running commands. \ + Check your shell startup!" .to_string() } else if err.root_cause().is::() { "Internal channel was closed prior to sending request. \ This may indicate that the remote host output invalid data \ - to stdout prior to running the requested command" + to stdout prior to running the requested command. \ + Check your shell startup!" .to_string() } else { format!( "Please install the same version of wezterm on both \ the client and server! \ - The server reported error '{}' while being asked for its \ + The server reported error '{err}' while being asked for its \ version. This likely means that the server is older \ - than the client.\n", - err + than the client, but it could also happen if the remote \ + host outputs to stdout prior to running commands. \ + Check your shell startup!", ) }; ui.output_str(&msg); diff --git a/wezterm-client/src/discovery.rs b/wezterm-client/src/discovery.rs index 34d6d34cc..9a97bd929 100644 --- a/wezterm-client/src/discovery.rs +++ b/wezterm-client/src/discovery.rs @@ -1,7 +1,7 @@ -use crate::UnixStream; use anyhow::Context; use std::path::{Path, PathBuf}; use std::time::{Duration, SystemTime}; +use wezterm_uds::UnixStream; /// There's a lot more code in this windows module than I thought I would need /// to write. Ostensibly, we could get away with making a symlink by taking diff --git a/wezterm-client/src/lib.rs b/wezterm-client/src/lib.rs index 4f7c1d7df..073521152 100644 --- a/wezterm-client/src/lib.rs +++ b/wezterm-client/src/lib.rs @@ -1,8 +1,3 @@ -#[cfg(unix)] -use std::os::unix::net::UnixStream; -#[cfg(windows)] -use uds_windows::UnixStream; - pub mod client; pub mod discovery; pub mod domain; diff --git a/wezterm-client/src/pane/renderable.rs b/wezterm-client/src/pane/renderable.rs index 60a522cec..68fa518f8 100644 --- a/wezterm-client/src/pane/renderable.rs +++ b/wezterm-client/src/pane/renderable.rs @@ -12,6 +12,7 @@ use rangeset::*; use ratelim::RateLimiter; use std::cell::RefCell; use std::collections::HashMap; +use std::num::NonZeroUsize; use std::ops::Range; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::{Arc, Mutex}; @@ -104,7 +105,9 @@ impl RenderableInner { poll_interval: BASE_POLL_INTERVAL, cursor_position: StableCursorPosition::default(), dimensions, - lines: LruCache::new(configuration().scrollback_lines), + lines: LruCache::new( + NonZeroUsize::new(configuration().scrollback_lines.max(128)).unwrap(), + ), title: title.to_string(), working_dir: None, fetch_limiter, @@ -634,7 +637,7 @@ impl RenderableInner { } lazy_static::lazy_static! { - static ref IMAGE_LRU: Mutex>> = Mutex::new(LruCache::new(128)); + static ref IMAGE_LRU: Mutex>> = Mutex::new(LruCache::new(NonZeroUsize::new(128).unwrap())); } pub(crate) async fn hydrate_lines( diff --git a/wezterm-dynamic/Cargo.toml b/wezterm-dynamic/Cargo.toml index 5113099dd..e9f9bc430 100644 --- a/wezterm-dynamic/Cargo.toml +++ b/wezterm-dynamic/Cargo.toml @@ -10,7 +10,7 @@ license = "MIT" wezterm-dynamic-derive = { version="0.1", path="derive" } ordered-float = "4.1" thiserror = "1.0" -strsim = "0.10" +strsim = "0.11" log = "0.4" [dev-dependencies] diff --git a/wezterm-font/Cargo.toml b/wezterm-font/Cargo.toml index 9475048ed..834868322 100644 --- a/wezterm-font/Cargo.toml +++ b/wezterm-font/Cargo.toml @@ -3,6 +3,7 @@ name = "wezterm-font" version = "0.1.0" authors = ["Wez Furlong "] edition = "2021" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -22,12 +23,12 @@ euclid = "0.22" finl_unicode = "1.2" freetype = { path = "../deps/freetype" } harfbuzz = { path = "../deps/harfbuzz" } -image = "0.24.6" +image = "0.25" lazy_static = "1.4" lfucache = { path = "../lfucache" } log = "0.4" -memmap2 = "0.2" -metrics = { version="0.17", features=["std"]} +memmap2 = "0.9" +metrics = "0.22" ordered-float = "4.1" rangeset = { path = "../rangeset" } termwiz = { path = "../termwiz" } @@ -53,5 +54,5 @@ core-text = "20.0" objc = "0.2" [dev-dependencies] -k9 = "0.11.0" +k9 = "0.12.0" env_logger = "0.11" diff --git a/wezterm-font/src/ftwrap.rs b/wezterm-font/src/ftwrap.rs index 0d4bb50b4..5c9bf1286 100644 --- a/wezterm-font/src/ftwrap.rs +++ b/wezterm-font/src/ftwrap.rs @@ -260,10 +260,7 @@ impl Face { } let bytes = unsafe { - std::slice::from_raw_parts( - sfnt_name.string as *const u8, - sfnt_name.string_len as usize, - ) + from_raw_parts(sfnt_name.string as *const u8, sfnt_name.string_len as usize) }; let encoding = match (sfnt_name.platform_id as u32, sfnt_name.encoding_id as u32) { @@ -350,14 +347,12 @@ impl Face { { let mm = &*mm; - let styles = - std::slice::from_raw_parts(mm.namedstyle, mm.num_namedstyles as usize); + let styles = from_raw_parts(mm.namedstyle, mm.num_namedstyles as usize); let instance = &styles[vidx]; - let axes = std::slice::from_raw_parts(mm.axis, mm.num_axis as usize); + let axes = from_raw_parts(mm.axis, mm.num_axis as usize); for (i, axis) in axes.iter().enumerate() { - let coords = - std::slice::from_raw_parts(instance.coords, mm.num_axis as usize); + let coords = from_raw_parts(instance.coords, mm.num_axis as usize); let value = coords[i].to_num::(); let default_value = axis.def.to_num::(); let scale = if default_value != 0. { @@ -436,7 +431,7 @@ impl Face { pub fn pixel_sizes(&self) -> Vec { let sizes = unsafe { let rec = &(*self.face); - std::slice::from_raw_parts(rec.available_sizes, rec.num_fixed_sizes as usize) + from_raw_parts(rec.available_sizes, rec.num_fixed_sizes as usize) }; sizes .iter() @@ -494,7 +489,7 @@ impl Face { let sizes = unsafe { let rec = &(*self.face); - std::slice::from_raw_parts(rec.available_sizes, rec.num_fixed_sizes as usize) + from_raw_parts(rec.available_sizes, rec.num_fixed_sizes as usize) }; if sizes.is_empty() { return Err(err); @@ -723,24 +718,12 @@ impl Face { let data = result.assume_init(); let mut palettes = vec![]; - let name_ids = if data.palette_name_ids.is_null() { - &[] - } else { - std::slice::from_raw_parts(data.palette_name_ids, data.num_palettes as usize) - }; - let flagses = if data.palette_flags.is_null() { - &[] - } else { - std::slice::from_raw_parts(data.palette_flags, data.num_palettes as usize) - }; - let entry_name_ids = if data.palette_entry_name_ids.is_null() { - &[] - } else { - std::slice::from_raw_parts( - data.palette_entry_name_ids, - data.num_palette_entries as usize, - ) - }; + let name_ids = from_raw_parts(data.palette_name_ids, data.num_palettes as usize); + let flagses = from_raw_parts(data.palette_flags, data.num_palettes as usize); + let entry_name_ids = from_raw_parts( + data.palette_entry_name_ids, + data.num_palette_entries as usize, + ); let entry_names: Vec = entry_name_ids .iter() @@ -777,10 +760,8 @@ impl Face { ft_result(FT_Get_Sfnt_Name(self.face, i, sfnt_name.as_mut_ptr()), ()) .context("FT_Get_Sfnt_Name")?; let sfnt_name = sfnt_name.assume_init(); - let bytes = std::slice::from_raw_parts( - sfnt_name.string as *const u8, - sfnt_name.string_len as usize, - ); + let bytes = + from_raw_parts(sfnt_name.string as *const u8, sfnt_name.string_len as usize); let encoding = match (sfnt_name.platform_id as u32, sfnt_name.encoding_id as u32) { (TT_PLATFORM_MACINTOSH, TT_MAC_ID_JAPANESE) @@ -1294,6 +1275,7 @@ struct FreeTypeStream { name: String, } +#[allow(dead_code)] enum StreamBacking { File(BufReader), Map(Mmap), @@ -1471,6 +1453,19 @@ impl FreeTypeStream { } } +/// Wrapper around std::slice::from_raw_parts that allows for ptr to be +/// null. In the null ptr case, an empty slice is returned. +/// This is necessary because it is common for freetype to encode +/// empty arrays in that way, and rust 1.78 will panic if a null +/// ptr is passed in. +pub(crate) unsafe fn from_raw_parts<'a, T>(ptr: *const T, size: usize) -> &'a [T] { + if ptr.is_null() { + &[] + } else { + std::slice::from_raw_parts(ptr, size) + } +} + #[derive(Debug)] pub struct PaletteInfo { pub num_palettes: usize, diff --git a/wezterm-font/src/parser.rs b/wezterm-font/src/parser.rs index 841d33423..1f56224ed 100644 --- a/wezterm-font/src/parser.rs +++ b/wezterm-font/src/parser.rs @@ -545,7 +545,7 @@ impl ParsedFont { let face = lib.face_from_locator(&self.handle)?; *cov = face.compute_coverage(); let elapsed = t.elapsed(); - metrics::histogram!("font.compute.codepoint.coverage", elapsed); + metrics::histogram!("font.compute.codepoint.coverage").record(elapsed); log::debug!( "{} codepoint coverage computed in {:?}", self.names.full_name, diff --git a/wezterm-font/src/rasterizer/freetype.rs b/wezterm-font/src/rasterizer/freetype.rs index 9f9cf3342..2e7a366a1 100644 --- a/wezterm-font/src/rasterizer/freetype.rs +++ b/wezterm-font/src/rasterizer/freetype.rs @@ -20,8 +20,8 @@ use cairo::{Content, Context, Extend, Format, ImageSurface, Matrix, Operator, Re use config::{DisplayPixelGeometry, FreeTypeLoadFlags, FreeTypeLoadTarget}; use std::cell::RefCell; use std::f64::consts::PI; +use std::mem; use std::mem::MaybeUninit; -use std::{mem, slice}; use wezterm_color_types::{linear_u8_to_srgb8, SrgbaPixel}; pub struct FreeTypeRasterizer { @@ -93,7 +93,7 @@ impl FontRasterizer for FreeTypeRasterizer { // pitch is the number of bytes per source row let pitch = ft_glyph.bitmap.pitch.abs() as usize; let data = unsafe { - slice::from_raw_parts_mut( + crate::ftwrap::from_raw_parts( ft_glyph.bitmap.buffer, ft_glyph.bitmap.rows as usize * pitch, ) diff --git a/wezterm-font/src/shaper/harfbuzz.rs b/wezterm-font/src/shaper/harfbuzz.rs index 9da18d524..fcba466b2 100644 --- a/wezterm-font/src/shaper/harfbuzz.rs +++ b/wezterm-font/src/shaper/harfbuzz.rs @@ -593,7 +593,7 @@ impl FontShaper for HarfbuzzShaper { range, presentation_width, ); - metrics::histogram!("shape.harfbuzz", start.elapsed()); + metrics::histogram!("shape.harfbuzz").record(start.elapsed()); /* if let Ok(glyphs) = &result { for g in glyphs { diff --git a/wezterm-gui-subcommands/Cargo.toml b/wezterm-gui-subcommands/Cargo.toml index e64cfe085..309d11e8f 100644 --- a/wezterm-gui-subcommands/Cargo.toml +++ b/wezterm-gui-subcommands/Cargo.toml @@ -3,6 +3,7 @@ name = "wezterm-gui-subcommands" version = "0.1.0" authors = ["Wez Furlong "] edition = "2018" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/wezterm-gui/Cargo.toml b/wezterm-gui/Cargo.toml index 463f37267..789ca0ec6 100644 --- a/wezterm-gui/Cargo.toml +++ b/wezterm-gui/Cargo.toml @@ -5,6 +5,7 @@ authors = ["Wez Furlong "] edition = "2018" build = "build.rs" resolver = "2" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -55,13 +56,13 @@ futures = "0.3" fuzzy-matcher = "0.3" hdrhistogram = "7.1" http_req = "0.10" -image = "0.24.6" +image = "0.25" lazy_static = "1.4" libc = "0.2" lfucache = { path = "../lfucache" } log = "0.4" luahelper = { path = "../luahelper" } -metrics = { version="0.17", features=["std"]} +metrics = "0.22" mlua = {version="0.9", features=["send"]} mux = { path = "../mux" } mux-lua = { path = "../lua-api-crates/mux" } @@ -77,10 +78,10 @@ regex = "1" serde = {version="1.0", features = ["rc", "derive"]} serde_json = "1.0" shlex = "1.1" -smol = "1.2" +smol = "2.0" tabout = { path = "../tabout" } tempfile = "3.4" -terminfo = "0.8" +terminfo = "0.9" termwiz = { path = "../termwiz" } termwiz-funcs = { path = "../lua-api-crates/termwiz-funcs" } textwrap = "0.16" @@ -110,7 +111,6 @@ window-funcs = { path = "../lua-api-crates/window-funcs" } [target."cfg(windows)".dependencies] shared_library = "0.1" -uds_windows = "1.0" winapi = { version = "0.3", features = [ "winuser", "consoleapi", diff --git a/wezterm-gui/src/customglyph.rs b/wezterm-gui/src/customglyph.rs index 1b9b7699c..6d35d3833 100644 --- a/wezterm-gui/src/customglyph.rs +++ b/wezterm-gui/src/customglyph.rs @@ -1,7 +1,7 @@ use crate::glyphcache::{GlyphCache, SizedBlockKey}; use crate::utilsprites::RenderMetrics; use ::window::bitmaps::atlas::Sprite; -use ::window::color::{LinearRgba, SrgbaPixel}; +use ::window::color::SrgbaPixel; use config::DimensionContext; use std::ops::Range; use termwiz::surface::CursorShape; @@ -16,7 +16,15 @@ pub enum PolyAA { } bitflags::bitflags! { - pub struct Quadrant: u8{ + // ╭──────╮ + // │UL╱╲UR│ + // │ ╱ ╲ │ + // │╱ ╲│ + // │╲ ╱│ + // │ ╲ ╱ │ + // │LL╲╱LR│ + // ╰──────╯ + pub struct CellDiagonal: u8{ const UPPER_LEFT = 1<<1; const UPPER_RIGHT = 1<<2; const LOWER_LEFT = 1<<3; @@ -25,19 +33,17 @@ bitflags::bitflags! { } bitflags::bitflags! { - pub struct Sextant: u8{ - /// Upper-left - const ONE = 1<<1; - /// Upper-right - const TWO = 1<<2; - /// Middle left - const THREE = 1<<3; - /// Middle Right - const FOUR = 1<<4; - /// Lower left - const FIVE = 1<<5; - /// Lower right - const SIX = 1<<6; + // ╭────╮ + // │╲U ╱│ + // │ ╲╱R│ + // │L╱╲ │ + // │╱ D╲│ + // ╰────╯ + pub struct Triangle: u8{ + const UPPER = 1<<1; + const RIGHT = 1<<2; + const LOWER = 1<<3; + const LEFT = 1<<4; } } @@ -131,31 +137,59 @@ impl BlockCoord { } #[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)] -pub enum Edge { +pub enum Block { + /// Number of 1/8ths: x0, x1, y0, y1 with custom alpha + Custom(u8, u8, u8, u8, BlockAlpha), /// Number of 1/8ths in the upper half - Upper(u8), + UpperBlock(u8), /// Number of 1/8ths in the lower half - Lower(u8), + LowerBlock(u8), /// Number of 1/8ths in the left half - Left(u8), + LeftBlock(u8), /// Number of 1/8ths in the right half - Right(u8), + RightBlock(u8), + /// Number of 1/8ths: x0, x1 + VerticalBlock(u8, u8), + /// Number of 1/8ths: y0, y1 + HorizontalBlock(u8, u8), + /// Quadrants + // ╭──┬──╮ + // │UL│UR│ + // ├──┼──┤ + // │LL│LR│ + // ╰──┴──╯ + QuadrantUL, + QuadrantUR, + QuadrantLL, + QuadrantLR, + /// Sextants by enum combination + // ╭───┬───╮ + // │ 1 │ 2 │ + // ├───┼───┤ + // │ 3 │ 4 │ + // ├───┼───┤ + // │ 5 │ 6 │ + // ╰───┴───╯ + Sextant1, + Sextant2, + Sextant3, + Sextant4, + Sextant5, + Sextant6, } /// Represents a Block Element glyph, decoded from /// /// +/// #[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)] pub enum BlockKey { - /// List of edge rectangles - Edges(&'static [Edge]), - - /// Full block with alpha level - Full(BlockAlpha), - /// A combination of quadrants - Quadrants(Quadrant), - /// A combination of sextants - Sextants(Sextant), + /// List of block rectangles + Blocks(&'static [Block]), + /// List of triangles + Triangles(Triangle, BlockAlpha), + /// A combination of small diagonal lines + CellDiagonals(CellDiagonal), /// A braille dot pattern Braille(u8), @@ -237,6 +271,7 @@ impl PolyCommand { #[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)] pub enum PolyStyle { Fill, + OutlineAlpha, OutlineThin, // A line with the thickness as underlines Outline, @@ -251,14 +286,20 @@ impl PolyStyle { pixmap.fill_path(path, paint, FillRule::Winding, Transform::identity(), None); } - PolyStyle::OutlineThin | PolyStyle::Outline | PolyStyle::OutlineHeavy => { + PolyStyle::OutlineThin + | PolyStyle::Outline + | PolyStyle::OutlineHeavy + | PolyStyle::OutlineAlpha => { let mut stroke = Stroke::default(); stroke.width = width; if self == PolyStyle::OutlineHeavy { stroke.width *= 3.01; // NOTE: Changing this makes block cursor disproportionate at different font sizes and resolutions } else if self == PolyStyle::OutlineThin { stroke.width = 1.2; + } else if self == PolyStyle::OutlineAlpha { + stroke.width = 0.25; // NOTE: This is for filling antialiased border between triangles when using the alpha style } + pixmap.stroke_path(path, paint, &stroke, Transform::identity(), None); } } @@ -3203,233 +3244,300 @@ impl BlockKey { ]), // [▀] UPPER HALF BLOCK - 0x2580 => Self::Edges(&[Edge::Upper(4)]), + 0x2580 => Self::Blocks(&[Block::UpperBlock(4)]), // [▁] LOWER 1 EIGHTH BLOCK - 0x2581 => Self::Edges(&[Edge::Lower(1)]), + 0x2581 => Self::Blocks(&[Block::LowerBlock(1)]), // [▂] LOWER 2 EIGHTHS BLOCK - 0x2582 => Self::Edges(&[Edge::Lower(2)]), + 0x2582 => Self::Blocks(&[Block::LowerBlock(2)]), // [▃] LOWER 3 EIGHTHS BLOCK - 0x2583 => Self::Edges(&[Edge::Lower(3)]), + 0x2583 => Self::Blocks(&[Block::LowerBlock(3)]), // [▄] LOWER 4 EIGHTHS BLOCK - 0x2584 => Self::Edges(&[Edge::Lower(4)]), + 0x2584 => Self::Blocks(&[Block::LowerBlock(4)]), // [▅] LOWER 5 EIGHTHS BLOCK - 0x2585 => Self::Edges(&[Edge::Lower(5)]), + 0x2585 => Self::Blocks(&[Block::LowerBlock(5)]), // [▆] LOWER 6 EIGHTHS BLOCK - 0x2586 => Self::Edges(&[Edge::Lower(6)]), + 0x2586 => Self::Blocks(&[Block::LowerBlock(6)]), // [▇] LOWER 7 EIGHTHS BLOCK - 0x2587 => Self::Edges(&[Edge::Lower(7)]), + 0x2587 => Self::Blocks(&[Block::LowerBlock(7)]), // [█] FULL BLOCK - 0x2588 => Self::Full(BlockAlpha::Full), + 0x2588 => Self::Blocks(&[Block::Custom(0, 8, 0, 8, BlockAlpha::Full)]), // [▉] LEFT 7 EIGHTHS BLOCK - 0x2589 => Self::Edges(&[Edge::Left(7)]), + 0x2589 => Self::Blocks(&[Block::LeftBlock(7)]), // [▊] LEFT 6 EIGHTHS BLOCK - 0x258a => Self::Edges(&[Edge::Left(6)]), + 0x258a => Self::Blocks(&[Block::LeftBlock(6)]), // [▋] LEFT 5 EIGHTHS BLOCK - 0x258b => Self::Edges(&[Edge::Left(5)]), + 0x258b => Self::Blocks(&[Block::LeftBlock(5)]), // [▌] LEFT 4 EIGHTHS BLOCK - 0x258c => Self::Edges(&[Edge::Left(4)]), + 0x258c => Self::Blocks(&[Block::LeftBlock(4)]), // [▍] LEFT 3 EIGHTHS BLOCK - 0x258d => Self::Edges(&[Edge::Left(3)]), + 0x258d => Self::Blocks(&[Block::LeftBlock(3)]), // [▎] LEFT 2 EIGHTHS BLOCK - 0x258e => Self::Edges(&[Edge::Left(2)]), + 0x258e => Self::Blocks(&[Block::LeftBlock(2)]), // [▏] LEFT 1 EIGHTHS BLOCK - 0x258f => Self::Edges(&[Edge::Left(1)]), + 0x258f => Self::Blocks(&[Block::LeftBlock(1)]), // [▐] RIGHT HALF BLOCK - 0x2590 => Self::Edges(&[Edge::Right(4)]), + 0x2590 => Self::Blocks(&[Block::RightBlock(4)]), // [░] LIGHT SHADE - 0x2591 => Self::Full(BlockAlpha::Light), + 0x2591 => Self::Blocks(&[Block::Custom(0, 8, 0, 8, BlockAlpha::Light)]), // [▒] MEDIUM SHADE - 0x2592 => Self::Full(BlockAlpha::Medium), + 0x2592 => Self::Blocks(&[Block::Custom(0, 8, 0, 8, BlockAlpha::Medium)]), // [▓] DARK SHADE - 0x2593 => Self::Full(BlockAlpha::Dark), + 0x2593 => Self::Blocks(&[Block::Custom(0, 8, 0, 8, BlockAlpha::Dark)]), // [▔] UPPER ONE EIGHTH BLOCK - 0x2594 => Self::Edges(&[Edge::Upper(1)]), + 0x2594 => Self::Blocks(&[Block::UpperBlock(1)]), // [▕] RIGHT ONE EIGHTH BLOCK - 0x2595 => Self::Edges(&[Edge::Right(1)]), + 0x2595 => Self::Blocks(&[Block::RightBlock(1)]), // [▖] QUADRANT LOWER LEFT - 0x2596 => Self::Quadrants(Quadrant::LOWER_LEFT), + 0x2596 => Self::Blocks(&[Block::QuadrantLL]), // [▗] QUADRANT LOWER RIGHT - 0x2597 => Self::Quadrants(Quadrant::LOWER_RIGHT), + 0x2597 => Self::Blocks(&[Block::QuadrantLR]), // [▘] QUADRANT UPPER LEFT - 0x2598 => Self::Quadrants(Quadrant::UPPER_LEFT), + 0x2598 => Self::Blocks(&[Block::QuadrantUL]), // [▙] QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT - 0x2599 => { - Self::Quadrants(Quadrant::UPPER_LEFT | Quadrant::LOWER_LEFT | Quadrant::LOWER_RIGHT) - } + 0x2599 => Self::Blocks(&[Block::QuadrantUL, Block::QuadrantLL, Block::QuadrantLR]), // [▚] QUADRANT UPPER LEFT AND LOWER RIGHT - 0x259a => Self::Quadrants(Quadrant::UPPER_LEFT | Quadrant::LOWER_RIGHT), + 0x259a => Self::Blocks(&[Block::QuadrantUL, Block::QuadrantLR]), // [▛] QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT - 0x259b => { - Self::Quadrants(Quadrant::UPPER_LEFT | Quadrant::UPPER_RIGHT | Quadrant::LOWER_LEFT) - } + 0x259b => Self::Blocks(&[Block::QuadrantUL, Block::QuadrantUR, Block::QuadrantLL]), // [▜] QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT - 0x259c => Self::Quadrants( - Quadrant::UPPER_LEFT | Quadrant::UPPER_RIGHT | Quadrant::LOWER_RIGHT, - ), + 0x259c => Self::Blocks(&[Block::QuadrantUL, Block::QuadrantUR, Block::QuadrantLR]), // [▝] QUADRANT UPPER RIGHT - 0x259d => Self::Quadrants(Quadrant::UPPER_RIGHT), + 0x259d => Self::Blocks(&[Block::QuadrantUR]), // [▞] QUADRANT UPPER RIGHT AND LOWER LEFT - 0x259e => Self::Quadrants(Quadrant::UPPER_RIGHT | Quadrant::LOWER_LEFT), + 0x259e => Self::Blocks(&[Block::QuadrantUR, Block::QuadrantLL]), // [▟] QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT - 0x259f => Self::Quadrants( - Quadrant::UPPER_RIGHT | Quadrant::LOWER_LEFT | Quadrant::LOWER_RIGHT, - ), + 0x259f => Self::Blocks(&[Block::QuadrantUR, Block::QuadrantLL, Block::QuadrantLR]), // [🬀] BLOCK SEXTANT-1 - 0x1fb00 => Self::Sextants(Sextant::ONE), + 0x1fb00 => Self::Blocks(&[Block::Sextant1]), // [🬁] BLOCK SEXTANT-2 - 0x1fb01 => Self::Sextants(Sextant::TWO), + 0x1fb01 => Self::Blocks(&[Block::Sextant2]), // [🬂] BLOCK SEXTANT-12 - 0x1fb02 => Self::Sextants(Sextant::ONE | Sextant::TWO), + 0x1fb02 => Self::Blocks(&[Block::Sextant1, Block::Sextant2]), // [🬃] BLOCK SEXTANT-3 - 0x1fb03 => Self::Sextants(Sextant::THREE), + 0x1fb03 => Self::Blocks(&[Block::Sextant3]), // [🬄] BLOCK SEXTANT-13 - 0x1fb04 => Self::Sextants(Sextant::ONE | Sextant::THREE), + 0x1fb04 => Self::Blocks(&[Block::Sextant1, Block::Sextant3]), // [🬅] BLOCK SEXTANT-23 - 0x1fb05 => Self::Sextants(Sextant::TWO | Sextant::THREE), + 0x1fb05 => Self::Blocks(&[Block::Sextant2, Block::Sextant3]), // [🬆] BLOCK SEXTANT-123 - 0x1fb06 => Self::Sextants(Sextant::ONE | Sextant::TWO | Sextant::THREE), + 0x1fb06 => Self::Blocks(&[Block::Sextant1, Block::Sextant2, Block::Sextant3]), // [🬇] BLOCK SEXTANT-4 - 0x1fb07 => Self::Sextants(Sextant::FOUR), + 0x1fb07 => Self::Blocks(&[Block::Sextant4]), // [🬈] BLOCK SEXTANT-14 - 0x1fb08 => Self::Sextants(Sextant::ONE | Sextant::FOUR), + 0x1fb08 => Self::Blocks(&[Block::Sextant1, Block::Sextant4]), // [🬉] BLOCK SEXTANT-24 - 0x1fb09 => Self::Sextants(Sextant::TWO | Sextant::FOUR), + 0x1fb09 => Self::Blocks(&[Block::Sextant2, Block::Sextant4]), // [🬊] BLOCK SEXTANT-124 - 0x1fb0a => Self::Sextants(Sextant::ONE | Sextant::TWO | Sextant::FOUR), + 0x1fb0a => Self::Blocks(&[Block::Sextant1, Block::Sextant2, Block::Sextant4]), // [🬋] BLOCK SEXTANT-34 - 0x1fb0b => Self::Sextants(Sextant::THREE | Sextant::FOUR), + 0x1fb0b => Self::Blocks(&[Block::Sextant3, Block::Sextant4]), // [🬌] BLOCK SEXTANT-134 - 0x1fb0c => Self::Sextants(Sextant::ONE | Sextant::THREE | Sextant::FOUR), + 0x1fb0c => Self::Blocks(&[Block::Sextant1, Block::Sextant3, Block::Sextant4]), // [🬍] BLOCK SEXTANT-234 - 0x1fb0d => Self::Sextants(Sextant::TWO | Sextant::THREE | Sextant::FOUR), + 0x1fb0d => Self::Blocks(&[Block::Sextant2, Block::Sextant3, Block::Sextant4]), // [🬎] BLOCK SEXTANT-1234 - 0x1fb0e => Self::Sextants(Sextant::ONE | Sextant::TWO | Sextant::THREE | Sextant::FOUR), + 0x1fb0e => Self::Blocks(&[ + Block::Sextant1, + Block::Sextant2, + Block::Sextant3, + Block::Sextant4, + ]), // [🬏] BLOCK SEXTANT-5 - 0x1fb0f => Self::Sextants(Sextant::FIVE), + 0x1fb0f => Self::Blocks(&[Block::Sextant5]), // [🬐] BLOCK SEXTANT-15 - 0x1fb10 => Self::Sextants(Sextant::ONE | Sextant::FIVE), + 0x1fb10 => Self::Blocks(&[Block::Sextant1, Block::Sextant5]), // [🬑] BLOCK SEXTANT-25 - 0x1fb11 => Self::Sextants(Sextant::TWO | Sextant::FIVE), + 0x1fb11 => Self::Blocks(&[Block::Sextant2, Block::Sextant5]), // [🬒] BLOCK SEXTANT-125 - 0x1fb12 => Self::Sextants(Sextant::ONE | Sextant::TWO | Sextant::FIVE), + 0x1fb12 => Self::Blocks(&[Block::Sextant1, Block::Sextant2, Block::Sextant5]), // [🬓] BLOCK SEXTANT-35 - 0x1fb13 => Self::Sextants(Sextant::THREE | Sextant::FIVE), + 0x1fb13 => Self::Blocks(&[Block::Sextant3, Block::Sextant5]), // [🬔] BLOCK SEXTANT-235 - 0x1fb14 => Self::Sextants(Sextant::TWO | Sextant::THREE | Sextant::FIVE), + 0x1fb14 => Self::Blocks(&[Block::Sextant2, Block::Sextant3, Block::Sextant5]), // [🬕] BLOCK SEXTANT-1235 - 0x1fb15 => Self::Sextants(Sextant::ONE | Sextant::TWO | Sextant::THREE | Sextant::FIVE), + 0x1fb15 => Self::Blocks(&[ + Block::Sextant1, + Block::Sextant2, + Block::Sextant3, + Block::Sextant5, + ]), // [🬖] BLOCK SEXTANT-45 - 0x1fb16 => Self::Sextants(Sextant::FOUR | Sextant::FIVE), + 0x1fb16 => Self::Blocks(&[Block::Sextant4, Block::Sextant5]), // [🬗] BLOCK SEXTANT-145 - 0x1fb17 => Self::Sextants(Sextant::ONE | Sextant::FOUR | Sextant::FIVE), + 0x1fb17 => Self::Blocks(&[Block::Sextant1, Block::Sextant4, Block::Sextant5]), // [🬘] BLOCK SEXTANT-245 - 0x1fb18 => Self::Sextants(Sextant::TWO | Sextant::FOUR | Sextant::FIVE), + 0x1fb18 => Self::Blocks(&[Block::Sextant2, Block::Sextant4, Block::Sextant5]), // [🬙] BLOCK SEXTANT-1245 - 0x1fb19 => Self::Sextants(Sextant::ONE | Sextant::TWO | Sextant::FOUR | Sextant::FIVE), + 0x1fb19 => Self::Blocks(&[ + Block::Sextant1, + Block::Sextant2, + Block::Sextant4, + Block::Sextant5, + ]), // [🬚] BLOCK SEXTANT-345 - 0x1fb1a => Self::Sextants(Sextant::THREE | Sextant::FOUR | Sextant::FIVE), + 0x1fb1a => Self::Blocks(&[Block::Sextant3, Block::Sextant4, Block::Sextant5]), // [🬛] BLOCK SEXTANT-1345 - 0x1fb1b => { - Self::Sextants(Sextant::ONE | Sextant::THREE | Sextant::FOUR | Sextant::FIVE) - } - // Braille dot patterns - // ⠀ ⠁ ⠂ ⠃ ⠄ ⠅ ⠆ ⠇ ⠈ ⠉ ⠊ ⠋ ⠌ ⠍ ⠎ ⠏ - // ⠐ ⠑ ⠒ ⠓ ⠔ ⠕ ⠖ ⠗ ⠘ ⠙ ⠚ ⠛ ⠜ ⠝ ⠞ ⠟ - // ⠠ ⠡ ⠢ ⠣ ⠤ ⠥ ⠦ ⠧ ⠨ ⠩ ⠪ ⠫ ⠬ ⠭ ⠮ ⠯ - // ⠰ ⠱ ⠲ ⠳ ⠴ ⠵ ⠶ ⠷ ⠸ ⠹ ⠺ ⠻ ⠼ ⠽ ⠾ ⠿ - // ⡀ ⡁ ⡂ ⡃ ⡄ ⡅ ⡆ ⡇ ⡈ ⡉ ⡊ ⡋ ⡌ ⡍ ⡎ ⡏ - // ⡐ ⡑ ⡒ ⡓ ⡔ ⡕ ⡖ ⡗ ⡘ ⡙ ⡚ ⡛ ⡜ ⡝ ⡞ ⡟ - // ⡠ ⡡ ⡢ ⡣ ⡤ ⡥ ⡦ ⡧ ⡨ ⡩ ⡪ ⡫ ⡬ ⡭ ⡮ ⡯ - // ⡰ ⡱ ⡲ ⡳ ⡴ ⡵ ⡶ ⡷ ⡸ ⡹ ⡺ ⡻ ⡼ ⡽ ⡾ ⡿ - // ⢀ ⢁ ⢂ ⢃ ⢄ ⢅ ⢆ ⢇ ⢈ ⢉ ⢊ ⢋ ⢌ ⢍ ⢎ ⢏ - // ⢐ ⢑ ⢒ ⢓ ⢔ ⢕ ⢖ ⢗ ⢘ ⢙ ⢚ ⢛ ⢜ ⢝ ⢞ ⢟ - // ⢠ ⢡ ⢢ ⢣ ⢤ ⢥ ⢦ ⢧ ⢨ ⢩ ⢪ ⢫ ⢬ ⢭ ⢮ ⢯ - // ⢰ ⢱ ⢲ ⢳ ⢴ ⢵ ⢶ ⢷ ⢸ ⢹ ⢺ ⢻ ⢼ ⢽ ⢾ ⢿ - // ⣀ ⣁ ⣂ ⣃ ⣄ ⣅ ⣆ ⣇ ⣈ ⣉ ⣊ ⣋ ⣌ ⣍ ⣎ ⣏ - // ⣐ ⣑ ⣒ ⣓ ⣔ ⣕ ⣖ ⣗ ⣘ ⣙ ⣚ ⣛ ⣜ ⣝ ⣞ ⣟ - // ⣠ ⣡ ⣢ ⣣ ⣤ ⣥ ⣦ ⣧ ⣨ ⣩ ⣪ ⣫ ⣬ ⣭ ⣮ ⣯ - // ⣰ ⣱ ⣲ ⣳ ⣴ ⣵ ⣶ ⣷ ⣸ ⣹ ⣺ ⣻ ⣼ ⣽ ⣾ ⣿ - n @ 0x2800..=0x28ff => Self::Braille((n & 0xff) as u8), + 0x1fb1b => Self::Blocks(&[ + Block::Sextant1, + Block::Sextant3, + Block::Sextant4, + Block::Sextant5, + ]), // [🬜] BLOCK SEXTANT-2345 - 0x1fb1c => { - Self::Sextants(Sextant::TWO | Sextant::THREE | Sextant::FOUR | Sextant::FIVE) - } + 0x1fb1c => Self::Blocks(&[ + Block::Sextant2, + Block::Sextant3, + Block::Sextant4, + Block::Sextant5, + ]), // [🬝] BLOCK SEXTANT-12345 - 0x1fb1d => Self::Sextants( - Sextant::ONE | Sextant::TWO | Sextant::THREE | Sextant::FOUR | Sextant::FIVE, - ), + 0x1fb1d => Self::Blocks(&[ + Block::Sextant1, + Block::Sextant2, + Block::Sextant3, + Block::Sextant4, + Block::Sextant5, + ]), // [🬞] BLOCK SEXTANT-6 - 0x1fb1e => Self::Sextants(Sextant::SIX), + 0x1fb1e => Self::Blocks(&[Block::Sextant6]), // [🬟] BLOCK SEXTANT-16 - 0x1fb1f => Self::Sextants(Sextant::ONE | Sextant::SIX), + 0x1fb1f => Self::Blocks(&[Block::Sextant1, Block::Sextant6]), // [🬠] BLOCK SEXTANT-26 - 0x1fb20 => Self::Sextants(Sextant::TWO | Sextant::SIX), + 0x1fb20 => Self::Blocks(&[Block::Sextant2, Block::Sextant6]), // [🬡] BLOCK SEXTANT-126 - 0x1fb21 => Self::Sextants(Sextant::ONE | Sextant::TWO | Sextant::SIX), + 0x1fb21 => Self::Blocks(&[Block::Sextant1, Block::Sextant2, Block::Sextant6]), // [🬢] BLOCK SEXTANT-36 - 0x1fb22 => Self::Sextants(Sextant::THREE | Sextant::SIX), + 0x1fb22 => Self::Blocks(&[Block::Sextant3, Block::Sextant6]), // [🬣] BLOCK SEXTANT-136 - 0x1fb23 => Self::Sextants(Sextant::ONE | Sextant::THREE | Sextant::SIX), + 0x1fb23 => Self::Blocks(&[Block::Sextant1, Block::Sextant3, Block::Sextant6]), // [🬤] BLOCK SEXTANT-236 - 0x1fb24 => Self::Sextants(Sextant::TWO | Sextant::THREE | Sextant::SIX), + 0x1fb24 => Self::Blocks(&[Block::Sextant2, Block::Sextant3, Block::Sextant6]), // [🬥] BLOCK SEXTANT-1236 - 0x1fb25 => Self::Sextants(Sextant::ONE | Sextant::TWO | Sextant::THREE | Sextant::SIX), + 0x1fb25 => Self::Blocks(&[ + Block::Sextant1, + Block::Sextant2, + Block::Sextant3, + Block::Sextant6, + ]), // [🬦] BLOCK SEXTANT-46 - 0x1fb26 => Self::Sextants(Sextant::FOUR | Sextant::SIX), + 0x1fb26 => Self::Blocks(&[Block::Sextant4, Block::Sextant6]), // [🬧] BLOCK SEXTANT-146 - 0x1fb27 => Self::Sextants(Sextant::ONE | Sextant::FOUR | Sextant::SIX), + 0x1fb27 => Self::Blocks(&[Block::Sextant1, Block::Sextant4, Block::Sextant6]), // [🬨] BLOCK SEXTANT-1246 - 0x1fb28 => Self::Sextants(Sextant::ONE | Sextant::TWO | Sextant::FOUR | Sextant::SIX), + 0x1fb28 => Self::Blocks(&[ + Block::Sextant1, + Block::Sextant2, + Block::Sextant4, + Block::Sextant6, + ]), // [🬩] BLOCK SEXTANT-346 - 0x1fb29 => Self::Sextants(Sextant::THREE | Sextant::FOUR | Sextant::SIX), + 0x1fb29 => Self::Blocks(&[Block::Sextant3, Block::Sextant4, Block::Sextant6]), // [🬪] BLOCK SEXTANT-1346 - 0x1fb2a => Self::Sextants(Sextant::ONE | Sextant::THREE | Sextant::FOUR | Sextant::SIX), + 0x1fb2a => Self::Blocks(&[ + Block::Sextant1, + Block::Sextant3, + Block::Sextant4, + Block::Sextant6, + ]), // [🬫] BLOCK SEXTANT-2346 - 0x1fb2b => Self::Sextants(Sextant::TWO | Sextant::THREE | Sextant::FOUR | Sextant::SIX), + 0x1fb2b => Self::Blocks(&[ + Block::Sextant2, + Block::Sextant3, + Block::Sextant4, + Block::Sextant6, + ]), // [🬬] BLOCK SEXTANT-12346 - 0x1fb2c => Self::Sextants( - Sextant::ONE | Sextant::TWO | Sextant::THREE | Sextant::FOUR | Sextant::SIX, - ), + 0x1fb2c => Self::Blocks(&[ + Block::Sextant1, + Block::Sextant2, + Block::Sextant3, + Block::Sextant4, + Block::Sextant6, + ]), // [🬭] BLOCK SEXTANT-56 - 0x1fb2d => Self::Sextants(Sextant::FIVE | Sextant::SIX), + 0x1fb2d => Self::Blocks(&[Block::Sextant5, Block::Sextant6]), // [🬮] BLOCK SEXTANT-156 - 0x1fb2e => Self::Sextants(Sextant::ONE | Sextant::FIVE | Sextant::SIX), + 0x1fb2e => Self::Blocks(&[Block::Sextant1, Block::Sextant5, Block::Sextant6]), // [🬯] BLOCK SEXTANT-256 - 0x1fb2f => Self::Sextants(Sextant::TWO | Sextant::FIVE | Sextant::SIX), + 0x1fb2f => Self::Blocks(&[Block::Sextant2, Block::Sextant5, Block::Sextant6]), // [🬰] BLOCK SEXTANT-1256 - 0x1fb30 => Self::Sextants(Sextant::ONE | Sextant::TWO | Sextant::FIVE | Sextant::SIX), + 0x1fb30 => Self::Blocks(&[ + Block::Sextant1, + Block::Sextant2, + Block::Sextant5, + Block::Sextant6, + ]), // [🬱] BLOCK SEXTANT-356 - 0x1fb31 => Self::Sextants(Sextant::THREE | Sextant::FIVE | Sextant::SIX), + 0x1fb31 => Self::Blocks(&[Block::Sextant3, Block::Sextant5, Block::Sextant6]), // [🬲] BLOCK SEXTANT-1356 - 0x1fb32 => Self::Sextants(Sextant::ONE | Sextant::THREE | Sextant::FIVE | Sextant::SIX), + 0x1fb32 => Self::Blocks(&[ + Block::Sextant1, + Block::Sextant3, + Block::Sextant5, + Block::Sextant6, + ]), // [🬳] BLOCK SEXTANT-2356 - 0x1fb33 => Self::Sextants(Sextant::TWO | Sextant::THREE | Sextant::FIVE | Sextant::SIX), + 0x1fb33 => Self::Blocks(&[ + Block::Sextant2, + Block::Sextant3, + Block::Sextant5, + Block::Sextant6, + ]), // [🬴] BLOCK SEXTANT-12356 - 0x1fb34 => Self::Sextants( - Sextant::ONE | Sextant::TWO | Sextant::THREE | Sextant::FIVE | Sextant::SIX, - ), + 0x1fb34 => Self::Blocks(&[ + Block::Sextant1, + Block::Sextant2, + Block::Sextant3, + Block::Sextant5, + Block::Sextant6, + ]), // [🬵] BLOCK SEXTANT-456 - 0x1fb35 => Self::Sextants(Sextant::FOUR | Sextant::FIVE | Sextant::SIX), + 0x1fb35 => Self::Blocks(&[Block::Sextant4, Block::Sextant5, Block::Sextant6]), // [🬶] BLOCK SEXTANT-1456 - 0x1fb36 => Self::Sextants(Sextant::ONE | Sextant::FOUR | Sextant::FIVE | Sextant::SIX), + 0x1fb36 => Self::Blocks(&[ + Block::Sextant1, + Block::Sextant4, + Block::Sextant5, + Block::Sextant6, + ]), // [🬷] BLOCK SEXTANT-2456 - 0x1fb37 => Self::Sextants(Sextant::TWO | Sextant::FOUR | Sextant::FIVE | Sextant::SIX), + 0x1fb37 => Self::Blocks(&[ + Block::Sextant2, + Block::Sextant4, + Block::Sextant5, + Block::Sextant6, + ]), // [🬸] BLOCK SEXTANT-12456 - 0x1fb38 => Self::Sextants( - Sextant::ONE | Sextant::TWO | Sextant::FOUR | Sextant::FIVE | Sextant::SIX, - ), + 0x1fb38 => Self::Blocks(&[ + Block::Sextant1, + Block::Sextant2, + Block::Sextant4, + Block::Sextant5, + Block::Sextant6, + ]), // [🬹] BLOCK SEXTANT-3456 - 0x1fb39 => { - Self::Sextants(Sextant::THREE | Sextant::FOUR | Sextant::FIVE | Sextant::SIX) - } + 0x1fb39 => Self::Blocks(&[ + Block::Sextant3, + Block::Sextant4, + Block::Sextant5, + Block::Sextant6, + ]), // [🬺] BLOCK SEXTANT-13456 - 0x1fb3a => Self::Sextants( - Sextant::ONE | Sextant::THREE | Sextant::FOUR | Sextant::FIVE | Sextant::SIX, - ), + 0x1fb3a => Self::Blocks(&[ + Block::Sextant1, + Block::Sextant3, + Block::Sextant4, + Block::Sextant5, + Block::Sextant6, + ]), // [🬻] BLOCK SEXTANT-23456 - 0x1fb3b => Self::Sextants( - Sextant::TWO | Sextant::THREE | Sextant::FOUR | Sextant::FIVE | Sextant::SIX, - ), + 0x1fb3b => Self::Blocks(&[ + Block::Sextant2, + Block::Sextant3, + Block::Sextant4, + Block::Sextant5, + Block::Sextant6, + ]), // [🬼] LOWER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO LOWER CENTRE 0x1fb3c => Self::Poly(&[Poly { path: &[ @@ -3485,34 +3593,858 @@ impl BlockKey { intensity: BlockAlpha::Full, style: PolyStyle::Fill, }]), + // [🭁] LOWER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO UPPER CENTRE + 0x1fb41 => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Frac(1, 2), BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::Frac(1, 3)), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭂] LOWER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO UPPER RIGHT + 0x1fb42 => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::One, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::Frac(1, 3)), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭃] LOWER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER CENTRE + 0x1fb43 => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Frac(1, 2), BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::Frac(2, 3)), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭄] LOWER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER RIGHT + 0x1fb44 => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::One, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::Frac(2, 3)), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭅] LOWER RIGHT BLOCK DIAGONAL UPPER LEFT TO UPPER CENTRE + 0x1fb45 => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Frac(1, 2), BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭆] LOWER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER MIDDLE RIGHT + 0x1fb46 => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Frac(2, 3)), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(1, 3)), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭇] LOWER RIGHT BLOCK DIAGONAL LOWER CENTRE TO LOWER MIDDLE RIGHT + 0x1fb47 => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Frac(1, 2), BlockCoord::One), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(2, 3)), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭈] LOWER RIGHT BLOCK DIAGONAL LOWER LEFT TO LOWER MIDDLE RIGHT + 0x1fb48 => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::One), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(2, 3)), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭉] LOWER RIGHT BLOCK DIAGONAL LOWER CENTRE TO UPPER MIDDLE RIGHT + 0x1fb49 => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Frac(1, 2), BlockCoord::One), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(1, 3)), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭊] LOWER RIGHT BLOCK DIAGONAL LOWER LEFT TO UPPER MIDDLE RIGHT + 0x1fb4a => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::One), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(1, 3)), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭋] LOWER RIGHT BLOCK DIAGONAL LOWER CENTRE TO UPPER RIGHT + 0x1fb4b => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Frac(1, 2), BlockCoord::One), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭌] LOWER LEFT BLOCK DIAGONAL UPPER CENTRE TO UPPER MIDDLE RIGHT + 0x1fb4c => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::Frac(1, 2), BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(1, 3)), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭍] LOWER LEFT BLOCK DIAGONAL UPPER LEFT TO UPPER MIDDLE RIGHT + 0x1fb4d => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(1, 3)), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭎] LOWER LEFT BLOCK DIAGONAL UPPER CENTRE TO LOWER MIDDLE RIGHT + 0x1fb4e => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::Frac(1, 2), BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(2, 3)), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭏] LOWER LEFT BLOCK DIAGONAL UPPER LEFT TO LOWER MIDDLE RIGHT + 0x1fb4f => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(2, 3)), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭐] LOWER LEFT BLOCK DIAGONAL UPPER CENTRE TO LOWER RIGHT + 0x1fb50 => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::Frac(1, 2), BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭑] LOWER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER MIDDLE RIGHT + 0x1fb51 => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Frac(1, 3)), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(2, 3)), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭒] UPPER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO LOWER CENTRE + 0x1fb52 => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Frac(1, 2), BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::Frac(2, 3)), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭓] UPPER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO LOWER RIGHT + 0x1fb53 => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::Frac(2, 3)), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭔] UPPER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER CENTRE + 0x1fb54 => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Frac(1, 2), BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::Frac(1, 3)), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭕] UPPER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER RIGHT + 0x1fb55 => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::Frac(1, 3)), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭖] UPPER RIGHT BLOCK DIAGONAL UPPER LEFT TO LOWER CENTRE + 0x1fb56 => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Frac(1, 2), BlockCoord::One), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭗] UPPER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO UPPER CENTRE + 0x1fb57 => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::Frac(1, 2), BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::Frac(1, 3)), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭘] UPPER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO UPPER RIGHT + 0x1fb58 => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::Frac(1, 3)), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭙] UPPER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER CENTRE + 0x1fb59 => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::Frac(1, 2), BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::Frac(2, 3)), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭚] UPPER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER RIGHT + 0x1fb5a => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::Frac(2, 3)), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭛] UPPER LEFT BLOCK DIAGONAL LOWER LEFT TO UPPER CENTRE + 0x1fb5b => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::Frac(1, 2), BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭜] UPPER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER MIDDLE RIGHT + 0x1fb5c => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(1, 3)), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::Frac(2, 3)), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭝] UPPER LEFT BLOCK DIAGONAL LOWER CENTRE TO LOWER MIDDLE RIGHT + 0x1fb5d => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(2, 3)), + PolyCommand::LineTo(BlockCoord::Frac(1, 2), BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭞] UPPER LEFT BLOCK DIAGONAL LOWER LEFT TO LOWER MIDDLE RIGHT + 0x1fb5e => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(2, 3)), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭟] UPPER LEFT BLOCK DIAGONAL LOWER CENTRE TO UPPER MIDDLE RIGHT + 0x1fb5f => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(1, 3)), + PolyCommand::LineTo(BlockCoord::Frac(1, 2), BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭠] UPPER LEFT BLOCK DIAGONAL LOWER LEFT TO UPPER MIDDLE RIGHT + 0x1fb60 => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(1, 3)), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭡] UPPER LEFT BLOCK DIAGONAL LOWER CENTRE TO UPPER RIGHT + 0x1fb61 => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::Frac(1, 2), BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭢] UPPER RIGHT BLOCK DIAGONAL UPPER CENTRE TO UPPER MIDDLE RIGHT + 0x1fb62 => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Frac(1, 2), BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(1, 3)), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭣] UPPER RIGHT BLOCK DIAGONAL UPPER LEFT TO UPPER MIDDLE RIGHT + 0x1fb63 => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(1, 3)), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭤] UPPER RIGHT BLOCK DIAGONAL UPPER CENTRE TO LOWER MIDDLE RIGHT + 0x1fb64 => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Frac(1, 2), BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(2, 3)), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭥] UPPER RIGHT BLOCK DIAGONAL UPPER LEFT TO LOWER MIDDLE RIGHT + 0x1fb65 => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(2, 3)), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭦] UPPER RIGHT BLOCK DIAGONAL UPPER CENTRE TO LOWER RIGHT + 0x1fb66 => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Frac(1, 2), BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭧] UPPER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER MIDDLE RIGHT + 0x1fb67 => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(2, 3)), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::Frac(1, 3)), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }]), + // [🭨] UPPER AND RIGHT AND LOWER TRIANGULAR THREE QUARTERS BLOCK + 0x1fb68 => Self::Triangles( + Triangle::UPPER | Triangle::RIGHT | Triangle::LOWER, + BlockAlpha::Full, + ), + // [🭩] LEFT AND LOWER AND RIGHT TRIANGULAR THREE QUARTERS BLOCK + 0x1fb69 => Self::Triangles( + Triangle::LEFT | Triangle::LOWER | Triangle::RIGHT, + BlockAlpha::Full, + ), + // [🭪] UPPER AND LEFT AND LOWER TRIANGULAR THREE QUARTERS BLOCK + 0x1fb6a => Self::Triangles( + Triangle::UPPER | Triangle::LEFT | Triangle::LOWER, + BlockAlpha::Full, + ), + // [🭫] LEFT AND UPPER AND RIGHT TRIANGULAR THREE QUARTERS BLOCK + 0x1fb6b => Self::Triangles( + Triangle::LEFT | Triangle::UPPER | Triangle::RIGHT, + BlockAlpha::Full, + ), + // [🭬] LEFT TRIANGULAR ONE QUARTER BLOCK + 0x1fb6c => Self::Triangles(Triangle::LEFT, BlockAlpha::Full), + // [🭭] UPPER TRIANGULAR ONE QUARTER BLOCK + 0x1fb6d => Self::Triangles(Triangle::UPPER, BlockAlpha::Full), + // [🭮] RIGHT TRIANGULAR ONE QUARTER BLOCK + 0x1fb6e => Self::Triangles(Triangle::RIGHT, BlockAlpha::Full), + // [🭯] LOWER TRIANGULAR ONE QUARTER BLOCK + 0x1fb6f => Self::Triangles(Triangle::LOWER, BlockAlpha::Full), + // [🭰] VERTICAL ONE EIGHTH BLOCK-2 + 0x1fb70 => Self::Blocks(&[Block::VerticalBlock(1, 2)]), + // [🭱] VERTICAL ONE EIGHTH BLOCK-3 + 0x1fb71 => Self::Blocks(&[Block::VerticalBlock(2, 3)]), + // [🭲] VERTICAL ONE EIGHTH BLOCK-4 + 0x1fb72 => Self::Blocks(&[Block::VerticalBlock(3, 4)]), + // [🭳] VERTICAL ONE EIGHTH BLOCK-5 + 0x1fb73 => Self::Blocks(&[Block::VerticalBlock(4, 5)]), + // [🭴] VERTICAL ONE EIGHTH BLOCK-6 + 0x1fb74 => Self::Blocks(&[Block::VerticalBlock(5, 6)]), + // [🭵] VERTICAL ONE EIGHTH BLOCK-7 + 0x1fb75 => Self::Blocks(&[Block::VerticalBlock(6, 7)]), + // [🭶] HORIZONTAL ONE EIGHTH BLOCK-2 + 0x1fb76 => Self::Blocks(&[Block::HorizontalBlock(1, 2)]), + // [🭷] HORIZONTAL ONE EIGHTH BLOCK-3 + 0x1fb77 => Self::Blocks(&[Block::HorizontalBlock(2, 3)]), + // [🭸] HORIZONTAL ONE EIGHTH BLOCK-4 + 0x1fb78 => Self::Blocks(&[Block::HorizontalBlock(3, 4)]), + // [🭹] HORIZONTAL ONE EIGHTH BLOCK-5 + 0x1fb79 => Self::Blocks(&[Block::HorizontalBlock(4, 5)]), + // [🭺] HORIZONTAL ONE EIGHTH BLOCK-6 + 0x1fb7a => Self::Blocks(&[Block::HorizontalBlock(5, 6)]), + // [🭻] HORIZONTAL ONE EIGHTH BLOCK-7 + 0x1fb7b => Self::Blocks(&[Block::HorizontalBlock(6, 7)]), // [🭼] Left and lower one eighth block - 0x1fb7c => Self::Edges(&[Edge::Left(1), Edge::Lower(1)]), + 0x1fb7c => Self::Blocks(&[Block::LeftBlock(1), Block::LowerBlock(1)]), // [🭽] Left and upper one eighth block - 0x1fb7d => Self::Edges(&[Edge::Left(1), Edge::Upper(1)]), + 0x1fb7d => Self::Blocks(&[Block::LeftBlock(1), Block::UpperBlock(1)]), // [🭾] Right and upper one eighth block - 0x1fb7e => Self::Edges(&[Edge::Right(1), Edge::Upper(1)]), + 0x1fb7e => Self::Blocks(&[Block::RightBlock(1), Block::UpperBlock(1)]), // [🭿] Right and lower one eighth block - 0x1fb7f => Self::Edges(&[Edge::Right(1), Edge::Lower(1)]), + 0x1fb7f => Self::Blocks(&[Block::RightBlock(1), Block::LowerBlock(1)]), + // [🮀] UPPER AND LOWER ONE EIGHTH BLOCK + 0x1fb80 => Self::Blocks(&[Block::UpperBlock(1), Block::LowerBlock(1)]), + // [🮁] HORIZONTAL ONE EIGHTH BLOCK-1358 + 0x1fb81 => Self::Blocks(&[ + Block::UpperBlock(1), + Block::HorizontalBlock(2, 3), + Block::HorizontalBlock(4, 5), + Block::LowerBlock(1), + ]), // [🮂] Upper One Quarter Block - 0x1fb82 => Self::Edges(&[Edge::Upper(2)]), + 0x1fb82 => Self::Blocks(&[Block::UpperBlock(2)]), // [🮃] Upper three eighths block - 0x1fb83 => Self::Edges(&[Edge::Upper(3)]), + 0x1fb83 => Self::Blocks(&[Block::UpperBlock(3)]), // [🮄] Upper five eighths block - 0x1fb84 => Self::Edges(&[Edge::Upper(5)]), + 0x1fb84 => Self::Blocks(&[Block::UpperBlock(5)]), // [🮅] Upper three quarters block - 0x1fb85 => Self::Edges(&[Edge::Upper(6)]), + 0x1fb85 => Self::Blocks(&[Block::UpperBlock(6)]), // [🮆] Upper seven eighths block - 0x1fb86 => Self::Edges(&[Edge::Upper(7)]), + 0x1fb86 => Self::Blocks(&[Block::UpperBlock(7)]), // [🮇] Right One Quarter Block - 0x1fb87 => Self::Edges(&[Edge::Right(2)]), + 0x1fb87 => Self::Blocks(&[Block::RightBlock(2)]), // [🮈] Right three eighths block - 0x1fb88 => Self::Edges(&[Edge::Right(3)]), + 0x1fb88 => Self::Blocks(&[Block::RightBlock(3)]), // [🮉] Right five eighths block - 0x1fb89 => Self::Edges(&[Edge::Right(5)]), + 0x1fb89 => Self::Blocks(&[Block::RightBlock(5)]), // [🮊] Right three quarters block - 0x1fb8a => Self::Edges(&[Edge::Right(6)]), + 0x1fb8a => Self::Blocks(&[Block::RightBlock(6)]), // [🮋] Right seven eighths block - 0x1fb8b => Self::Edges(&[Edge::Right(7)]), + 0x1fb8b => Self::Blocks(&[Block::RightBlock(7)]), + // [🮌] LEFT HALF MEDIUM SHADE + 0x1fb8c => Self::Blocks(&[Block::Custom(0, 4, 0, 8, BlockAlpha::Medium)]), + // [🮍] RIGHT HALF MEDIUM SHADE + 0x1fb8d => Self::Blocks(&[Block::Custom(4, 8, 0, 8, BlockAlpha::Medium)]), + // [🮎] UPPER HALF MEDIUM SHADE + 0x1fb8e => Self::Blocks(&[Block::Custom(0, 8, 0, 4, BlockAlpha::Medium)]), + // [🮏] LOWER HALF MEDIUM SHADE + 0x1fb8f => Self::Blocks(&[Block::Custom(0, 8, 4, 8, BlockAlpha::Medium)]), + // [🮐] INVERSE MEDIUM SHADE + 0x1fb90 => Self::Blocks(&[Block::Custom(0, 8, 0, 8, BlockAlpha::Medium)]), + // [🮑] UPPER HALF BLOCK AND LOWER HALF INVERSE MEDIUM SHADE + 0x1fb91 => Self::Blocks(&[ + Block::UpperBlock(4), + Block::Custom(0, 8, 4, 8, BlockAlpha::Medium), + ]), + // [🮒] UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK + 0x1fb92 => Self::Blocks(&[ + Block::Custom(0, 8, 0, 4, BlockAlpha::Medium), + Block::LowerBlock(4), + ]), + // [🮓] LEFT HALF BLOCK AND RIGHT HALF INVERSE MEDIUM SHADE + // NOTE: not official! + 0x1fb93 => Self::Blocks(&[ + Block::LeftBlock(4), + Block::Custom(4, 8, 0, 8, BlockAlpha::Medium), + ]), + // [🮔] LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK + 0x1fb94 => Self::Blocks(&[ + Block::Custom(0, 4, 0, 8, BlockAlpha::Medium), + Block::RightBlock(4), + ]), + // [🮕] CHECKER BOARD FILL + 0x1fb95 => Self::Blocks(&[ + Block::Custom(0, 2, 0, 2, BlockAlpha::Full), + Block::Custom(0, 2, 4, 6, BlockAlpha::Full), + Block::Custom(2, 4, 2, 4, BlockAlpha::Full), + Block::Custom(2, 4, 6, 8, BlockAlpha::Full), + Block::Custom(4, 6, 0, 2, BlockAlpha::Full), + Block::Custom(4, 6, 4, 6, BlockAlpha::Full), + Block::Custom(6, 8, 2, 4, BlockAlpha::Full), + Block::Custom(6, 8, 6, 8, BlockAlpha::Full), + ]), + // [🮖] INVERSE CHECKER BOARD FILL + 0x1fb96 => Self::Blocks(&[ + Block::Custom(0, 2, 2, 4, BlockAlpha::Full), + Block::Custom(0, 2, 6, 8, BlockAlpha::Full), + Block::Custom(2, 4, 0, 2, BlockAlpha::Full), + Block::Custom(2, 4, 4, 6, BlockAlpha::Full), + Block::Custom(4, 6, 2, 4, BlockAlpha::Full), + Block::Custom(4, 6, 6, 8, BlockAlpha::Full), + Block::Custom(6, 8, 0, 2, BlockAlpha::Full), + Block::Custom(6, 8, 4, 6, BlockAlpha::Full), + ]), + // [🮗] HEAVY HORIZONTAL FILL + 0x1fb97 => Self::Blocks(&[Block::HorizontalBlock(2, 4), Block::HorizontalBlock(6, 8)]), + // [🮘] UPPER LEFT TO LOWER RIGHT FILL + // NOTE: This is a quick placeholder which doesn't scale correctly + 0x1fb98 => Self::Poly(&[ + Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Frac(1, 10)), + PolyCommand::LineTo(BlockCoord::Frac(1, 6), BlockCoord::Zero), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::OutlineThin, + }, + Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Frac(3, 10)), + PolyCommand::LineTo(BlockCoord::Frac(3, 6), BlockCoord::Zero), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::OutlineThin, + }, + Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Frac(5, 10)), + PolyCommand::LineTo(BlockCoord::Frac(5, 6), BlockCoord::Zero), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::OutlineThin, + }, + Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Frac(7, 10)), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(1, 10)), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::OutlineThin, + }, + Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Frac(9, 10)), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(3, 10)), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::OutlineThin, + }, + Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Frac(1, 6), BlockCoord::One), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(5, 10)), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::OutlineThin, + }, + Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Frac(3, 6), BlockCoord::One), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(7, 10)), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::OutlineThin, + }, + Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Frac(5, 6), BlockCoord::One), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(9, 10)), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::OutlineThin, + }, + ]), + // [🮙] UPPER RIGHT TO LOWER LEFT FILL + // NOTE: This is a quick placeholder which doesn't scale correctly + 0x1fb99 => Self::Poly(&[ + Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::One, BlockCoord::Frac(1, 10)), + PolyCommand::LineTo(BlockCoord::Frac(5, 6), BlockCoord::Zero), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::OutlineThin, + }, + Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::One, BlockCoord::Frac(3, 10)), + PolyCommand::LineTo(BlockCoord::Frac(3, 6), BlockCoord::Zero), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::OutlineThin, + }, + Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::One, BlockCoord::Frac(5, 10)), + PolyCommand::LineTo(BlockCoord::Frac(1, 6), BlockCoord::Zero), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::OutlineThin, + }, + Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::One, BlockCoord::Frac(7, 10)), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::Frac(1, 10)), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::OutlineThin, + }, + Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::One, BlockCoord::Frac(9, 10)), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::Frac(3, 10)), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::OutlineThin, + }, + Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Frac(5, 6), BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::Frac(5, 10)), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::OutlineThin, + }, + Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Frac(3, 6), BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::Frac(7, 10)), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::OutlineThin, + }, + Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Frac(1, 6), BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::Frac(9, 10)), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::OutlineThin, + }, + ]), + // [🮚] UPPER AND LOWER TRIANGULAR HALF BLOCK + 0x1fb9a => Self::Triangles(Triangle::UPPER | Triangle::LOWER, BlockAlpha::Full), + // [🮛] LEFT AND RIGHT TRIANGULAR HALF BLOCK + 0x1fb9b => Self::Triangles(Triangle::LEFT | Triangle::RIGHT, BlockAlpha::Full), + // [🮜] UPPER UPPER LEFT TRIANGULAR MEDIUM SHADE + 0x1fb9c => Self::Triangles(Triangle::LEFT | Triangle::UPPER, BlockAlpha::Medium), + // [🮝] UPPER RIGHT TRIANGULAR MEDIUM SHADE + 0x1fb9d => Self::Triangles(Triangle::RIGHT | Triangle::UPPER, BlockAlpha::Medium), + // [🮞] LOWER RIGHT TRIANGULAR MEDIUM SHADE + 0x1fb9e => Self::Triangles(Triangle::RIGHT | Triangle::LOWER, BlockAlpha::Medium), + // [🮟] LOWER LEFT TRIANGULAR MEDIUM SHADE + 0x1fb9f => Self::Triangles(Triangle::LEFT | Triangle::LOWER, BlockAlpha::Medium), + // [🮠] BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT + 0x1fba0 => Self::CellDiagonals(CellDiagonal::UPPER_LEFT), + // [🮡] BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT + 0x1fba1 => Self::CellDiagonals(CellDiagonal::UPPER_RIGHT), + // [🮢] BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO LOWER CENTRE + 0x1fba2 => Self::CellDiagonals(CellDiagonal::LOWER_LEFT), + // [🮣] BOX DRAWINGS LIGHT DIAGONAL MIDDLE RIGHT TO LOWER CENTRE + 0x1fba3 => Self::CellDiagonals(CellDiagonal::LOWER_RIGHT), + // [🮤] BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT TO LOWER CENTRE + 0x1fba4 => Self::CellDiagonals(CellDiagonal::UPPER_LEFT | CellDiagonal::LOWER_LEFT), + // [🮥] BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT TO LOWER CENTRE + 0x1fba5 => Self::CellDiagonals(CellDiagonal::UPPER_RIGHT | CellDiagonal::LOWER_RIGHT), + // [🮦] BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO LOWER CENTRE TO MIDDLE RIGHT + 0x1fba6 => Self::CellDiagonals(CellDiagonal::LOWER_LEFT | CellDiagonal::LOWER_RIGHT), + // [🮧] BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO UPPER CENTRE TO MIDDLE RIGHT + 0x1fba7 => Self::CellDiagonals(CellDiagonal::UPPER_LEFT | CellDiagonal::UPPER_RIGHT), + // [🮨] BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT AND MIDDLE RIGHT TO LOWER CENTRE + 0x1fba8 => Self::CellDiagonals(CellDiagonal::UPPER_LEFT | CellDiagonal::LOWER_RIGHT), + // [🮩] BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT AND MIDDLE LEFT TO LOWER CENTRE + 0x1fba9 => Self::CellDiagonals(CellDiagonal::UPPER_RIGHT | CellDiagonal::LOWER_LEFT), + // [🮪] BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT TO LOWER CENTRE TO MIDDLE LEFT + 0x1fbaa => Self::CellDiagonals( + CellDiagonal::UPPER_RIGHT | CellDiagonal::LOWER_LEFT | CellDiagonal::LOWER_RIGHT, + ), + // [🮫] BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT TO LOWER CENTRE TO MIDDLE RIGHT + 0x1fbab => Self::CellDiagonals( + CellDiagonal::UPPER_LEFT | CellDiagonal::LOWER_LEFT | CellDiagonal::LOWER_RIGHT, + ), + // [🮬] BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO UPPER CENTRE TO MIDDLE RIGHT TO LOWER CENTRE + 0x1fbac => Self::CellDiagonals( + CellDiagonal::UPPER_LEFT | CellDiagonal::UPPER_RIGHT | CellDiagonal::LOWER_RIGHT, + ), + // [🮭] BOX DRAWINGS LIGHT DIAGONAL MIDDLE RIGHT TO UPPER CENTRE TO MIDDLE LEFT TO LOWER CENTRE + 0x1fbad => Self::CellDiagonals( + CellDiagonal::UPPER_LEFT | CellDiagonal::UPPER_RIGHT | CellDiagonal::LOWER_LEFT, + ), + // [🮮] BOX DRAWINGS LIGHT DIAGONAL DIAMOND + 0x1fbae => Self::CellDiagonals( + CellDiagonal::UPPER_LEFT + | CellDiagonal::UPPER_RIGHT + | CellDiagonal::LOWER_LEFT + | CellDiagonal::LOWER_RIGHT, + ), + // [🮯] BOX DRAWINGS LIGHT HORIZONTAL WITH VERTICAL STROKE + 0x1fbaf => Self::Poly(&[ + Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Frac(1, 2), BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::Frac(1, 2), BlockCoord::One), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Outline, + }, + Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Frac(1, 2)), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(1, 2)), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Outline, + }, + ]), + + // Braille dot patterns + // ⠀ ⠁ ⠂ ⠃ ⠄ ⠅ ⠆ ⠇ ⠈ ⠉ ⠊ ⠋ ⠌ ⠍ ⠎ ⠏ + // ⠐ ⠑ ⠒ ⠓ ⠔ ⠕ ⠖ ⠗ ⠘ ⠙ ⠚ ⠛ ⠜ ⠝ ⠞ ⠟ + // ⠠ ⠡ ⠢ ⠣ ⠤ ⠥ ⠦ ⠧ ⠨ ⠩ ⠪ ⠫ ⠬ ⠭ ⠮ ⠯ + // ⠰ ⠱ ⠲ ⠳ ⠴ ⠵ ⠶ ⠷ ⠸ ⠹ ⠺ ⠻ ⠼ ⠽ ⠾ ⠿ + // ⡀ ⡁ ⡂ ⡃ ⡄ ⡅ ⡆ ⡇ ⡈ ⡉ ⡊ ⡋ ⡌ ⡍ ⡎ ⡏ + // ⡐ ⡑ ⡒ ⡓ ⡔ ⡕ ⡖ ⡗ ⡘ ⡙ ⡚ ⡛ ⡜ ⡝ ⡞ ⡟ + // ⡠ ⡡ ⡢ ⡣ ⡤ ⡥ ⡦ ⡧ ⡨ ⡩ ⡪ ⡫ ⡬ ⡭ ⡮ ⡯ + // ⡰ ⡱ ⡲ ⡳ ⡴ ⡵ ⡶ ⡷ ⡸ ⡹ ⡺ ⡻ ⡼ ⡽ ⡾ ⡿ + // ⢀ ⢁ ⢂ ⢃ ⢄ ⢅ ⢆ ⢇ ⢈ ⢉ ⢊ ⢋ ⢌ ⢍ ⢎ ⢏ + // ⢐ ⢑ ⢒ ⢓ ⢔ ⢕ ⢖ ⢗ ⢘ ⢙ ⢚ ⢛ ⢜ ⢝ ⢞ ⢟ + // ⢠ ⢡ ⢢ ⢣ ⢤ ⢥ ⢦ ⢧ ⢨ ⢩ ⢪ ⢫ ⢬ ⢭ ⢮ ⢯ + // ⢰ ⢱ ⢲ ⢳ ⢴ ⢵ ⢶ ⢷ ⢸ ⢹ ⢺ ⢻ ⢼ ⢽ ⢾ ⢿ + // ⣀ ⣁ ⣂ ⣃ ⣄ ⣅ ⣆ ⣇ ⣈ ⣉ ⣊ ⣋ ⣌ ⣍ ⣎ ⣏ + // ⣐ ⣑ ⣒ ⣓ ⣔ ⣕ ⣖ ⣗ ⣘ ⣙ ⣚ ⣛ ⣜ ⣝ ⣞ ⣟ + // ⣠ ⣡ ⣢ ⣣ ⣤ ⣥ ⣦ ⣧ ⣨ ⣩ ⣪ ⣫ ⣬ ⣭ ⣮ ⣯ + // ⣰ ⣱ ⣲ ⣳ ⣴ ⣵ ⣶ ⣷ ⣸ ⣹ ⣺ ⣻ ⣼ ⣽ ⣾ ⣿ + n @ 0x2800..=0x28ff => Self::Braille((n & 0xff) as u8), // [] Powerline filled right arrow 0xe0b0 => Self::Poly(&[Poly { path: &[ @@ -3616,16 +4548,7 @@ impl BlockKey { }]), // [] Powerline filled bottom left half triangle - 0xe0b8 => Self::Poly(&[Poly { - path: &[ - PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), - PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), - PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), - PolyCommand::Close, - ], - intensity: BlockAlpha::Full, - style: PolyStyle::Fill, - }]), + 0xe0b8 => Self::Triangles(Triangle::LEFT | Triangle::LOWER, BlockAlpha::Full), // [] Powerline outline bottom left half triangle 0xe0b9 => Self::Poly(&[Poly { path: &[ @@ -3636,16 +4559,7 @@ impl BlockKey { style: PolyStyle::Outline, }]), // [] Powerline filled bottom right half triangle - 0xe0ba => Self::Poly(&[Poly { - path: &[ - PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::One), - PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), - PolyCommand::LineTo(BlockCoord::One, BlockCoord::Zero), - PolyCommand::Close, - ], - intensity: BlockAlpha::Full, - style: PolyStyle::Fill, - }]), + 0xe0ba => Self::Triangles(Triangle::RIGHT | Triangle::LOWER, BlockAlpha::Full), // [] Powerline outline bottom right half triangle 0xe0bb => Self::Poly(&[Poly { path: &[ @@ -3676,16 +4590,7 @@ impl BlockKey { style: PolyStyle::Outline, }]), // [] Powerline filled top right half triangle - 0xe0be => Self::Poly(&[Poly { - path: &[ - PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), - PolyCommand::LineTo(BlockCoord::One, BlockCoord::Zero), - PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), - PolyCommand::Close, - ], - intensity: BlockAlpha::Full, - style: PolyStyle::Fill, - }]), + 0xe0be => Self::Triangles(Triangle::RIGHT | Triangle::UPPER, BlockAlpha::Full), // [] Powerline outline top right half triangle 0xe0bf => Self::Poly(&[Poly { path: &[ @@ -3877,94 +4782,224 @@ impl GlyphCache { buffer.clear_rect(cell_rect, black); match key.block { - BlockKey::Edges(edges) => { - for edge in edges.iter() { - match edge { - Edge::Upper(num) => { - let lower = metrics.cell_size.height as f32 * (*num as f32) / 8.; - let width = metrics.cell_size.width as usize; - fill_rect(&mut buffer, 0..width, 0..scale(lower)); + BlockKey::Blocks(blocks) => { + let width = metrics.cell_size.width as f32; + let height = metrics.cell_size.height as f32; + let (x_half, y_half, y_third) = (width / 2., height / 2., height / 3.); + let (x_eighth, y_eighth) = (width / 8., height / 8.); + + for block in blocks.iter() { + match block { + Block::Custom(x0, x1, y0, y1, alpha) => { + let left = (*x0 as f32) * x_eighth; + let right = (*x1 as f32) * x_eighth; + let top = (*y0 as f32) * y_eighth; + let bottom = (*y1 as f32) * y_eighth; + fill_rect(&mut buffer, left..right, top..bottom, *alpha); } - Edge::Lower(num) => { - let upper = metrics.cell_size.height as f32 * ((8 - num) as f32) / 8.; - let width = metrics.cell_size.width as usize; - let height = metrics.cell_size.height as usize; - fill_rect(&mut buffer, 0..width, scale(upper)..height); + Block::UpperBlock(num) => { + let lower = (*num as f32) * y_eighth; + fill_rect(&mut buffer, 0.0..width, 0.0..lower, BlockAlpha::Full); } - Edge::Left(num) => { - let width = metrics.cell_size.width as f32 * (*num as f32) / 8.; - let height = metrics.cell_size.height as usize; - fill_rect(&mut buffer, 0..scale(width), 0..height); + Block::LowerBlock(num) => { + let upper = ((8 - num) as f32) * y_eighth; + fill_rect(&mut buffer, 0.0..width, upper..height, BlockAlpha::Full); } - Edge::Right(num) => { - let left = metrics.cell_size.width as f32 * ((8 - num) as f32) / 8.; - let width = metrics.cell_size.width as usize; - let height = metrics.cell_size.height as usize; - fill_rect(&mut buffer, scale(left)..width, 0..height); + Block::LeftBlock(num) => { + let right = (*num as f32) * x_eighth; + fill_rect(&mut buffer, 0.0..right, 0.0..height, BlockAlpha::Full); } + Block::RightBlock(num) => { + let left = ((8 - num) as f32) * x_eighth; + fill_rect(&mut buffer, left..width, 0.0..height, BlockAlpha::Full); + } + Block::VerticalBlock(x0, x1) => { + let left = (*x0 as f32) * x_eighth; + let right = (*x1 as f32) * x_eighth; + fill_rect(&mut buffer, left..right, 0.0..height, BlockAlpha::Full); + } + Block::HorizontalBlock(y0, y1) => { + let top = (*y0 as f32) * y_eighth; + let bottom = (*y1 as f32) * y_eighth; + fill_rect(&mut buffer, 0.0..width, top..bottom, BlockAlpha::Full); + } + Block::QuadrantUL => { + fill_rect(&mut buffer, 0.0..x_half, 0.0..y_half, BlockAlpha::Full) + } + Block::QuadrantUR => { + fill_rect(&mut buffer, x_half..width, 0.0..y_half, BlockAlpha::Full) + } + Block::QuadrantLL => { + fill_rect(&mut buffer, 0.0..x_half, y_half..height, BlockAlpha::Full) + } + Block::QuadrantLR => { + fill_rect(&mut buffer, x_half..width, y_half..height, BlockAlpha::Full) + } + Block::Sextant1 => { + fill_rect(&mut buffer, 0.0..x_half, 0.0..y_third, BlockAlpha::Full) + } + Block::Sextant2 => { + fill_rect(&mut buffer, x_half..width, 0.0..y_third, BlockAlpha::Full) + } + Block::Sextant3 => fill_rect( + &mut buffer, + 0.0..x_half, + y_third..(y_third * 2.), + BlockAlpha::Full, + ), + Block::Sextant4 => fill_rect( + &mut buffer, + x_half..width, + y_third..(y_third * 2.), + BlockAlpha::Full, + ), + Block::Sextant5 => fill_rect( + &mut buffer, + 0.0..x_half, + (y_third * 2.)..height, + BlockAlpha::Full, + ), + Block::Sextant6 => fill_rect( + &mut buffer, + x_half..width, + (y_third * 2.)..height, + BlockAlpha::Full, + ), } } } + BlockKey::Triangles(triangles, alpha) => { + let mut draw = |cmd: &'static [PolyCommand], style: PolyStyle| { + self.draw_polys( + &metrics, + &[Poly { + path: cmd, + intensity: alpha, + style: style, + }], + &mut buffer, + if config::configuration().anti_alias_custom_block_glyphs { + PolyAA::AntiAlias + } else { + PolyAA::MoarPixels + }, + ); + }; - BlockKey::Full(alpha) => { - let alpha = alpha.to_scale(); - let fill = LinearRgba::with_components(alpha, alpha, alpha, alpha); + macro_rules! start { + () => { + PolyCommand::MoveTo(BlockCoord::Frac(1, 2), BlockCoord::Frac(1, 2)) + }; + } + macro_rules! close { + () => { + PolyCommand::Close + }; + } + macro_rules! p0 { + () => { + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::Zero) + }; + } + macro_rules! p1 { + () => { + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Zero) + }; + } + macro_rules! p2 { + () => { + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One) + }; + } + macro_rules! p3 { + () => { + PolyCommand::LineTo(BlockCoord::One, BlockCoord::One) + }; + } - buffer.clear_rect(cell_rect, fill.srgba_pixel()); - } - BlockKey::Quadrants(quads) => { - let y_half = metrics.cell_size.height as f32 / 2.; - let x_half = metrics.cell_size.width as f32 / 2.; - let width = metrics.cell_size.width as usize; - let height = metrics.cell_size.height as usize; - if quads.contains(Quadrant::UPPER_LEFT) { - fill_rect(&mut buffer, 0..scale(x_half), 0..scale(y_half)); + // Draw triangles + if triangles.contains(Triangle::UPPER) { + draw(&[start!(), p0!(), p1!(), close!()], PolyStyle::Fill); } - if quads.contains(Quadrant::UPPER_RIGHT) { - fill_rect(&mut buffer, scale(x_half)..width, 0..scale(y_half)); + if triangles.contains(Triangle::LOWER) { + draw(&[start!(), p2!(), p3!(), close!()], PolyStyle::Fill); } - if quads.contains(Quadrant::LOWER_LEFT) { - fill_rect(&mut buffer, 0..scale(x_half), scale(y_half)..height); + if triangles.contains(Triangle::LEFT) { + draw(&[start!(), p0!(), p2!(), close!()], PolyStyle::Fill); } - if quads.contains(Quadrant::LOWER_RIGHT) { - fill_rect(&mut buffer, scale(x_half)..width, scale(y_half)..height); + if triangles.contains(Triangle::RIGHT) { + draw(&[start!(), p1!(), p3!(), close!()], PolyStyle::Fill); + } + + // Fill antialiased lines between triangles + let style = if alpha == BlockAlpha::Full { + PolyStyle::Outline + } else { + PolyStyle::OutlineAlpha + }; + if triangles.contains(Triangle::UPPER | Triangle::LEFT) { + draw(&[start!(), p0!()], style); + } + if triangles.contains(Triangle::UPPER | Triangle::RIGHT) { + draw(&[start!(), p1!()], style); + } + if triangles.contains(Triangle::LOWER | Triangle::LEFT) { + draw(&[start!(), p2!()], style); + } + if triangles.contains(Triangle::LOWER | Triangle::RIGHT) { + draw(&[start!(), p3!()], style); } } - BlockKey::Sextants(s) => { - let y_third = metrics.cell_size.height as f32 / 3.; - let x_half = metrics.cell_size.width as f32 / 2.; - let width = metrics.cell_size.width as usize; - let height = metrics.cell_size.height as usize; + BlockKey::CellDiagonals(diagonals) => { + let mut draw = |cmd: &'static [PolyCommand]| { + self.draw_polys( + &metrics, + &[Poly { + path: cmd, + intensity: BlockAlpha::Full, + style: PolyStyle::Outline, + }], + &mut buffer, + if config::configuration().anti_alias_custom_block_glyphs { + PolyAA::AntiAlias + } else { + PolyAA::MoarPixels + }, + ); + }; - if s.contains(Sextant::ONE) { - fill_rect(&mut buffer, 0..scale(x_half), 0..scale(y_third)); + macro_rules! U { + () => { + PolyCommand::MoveTo(BlockCoord::Frac(1, 2), BlockCoord::Zero) + }; } - if s.contains(Sextant::TWO) { - fill_rect(&mut buffer, scale(x_half)..width, 0..scale(y_third)); + macro_rules! D { + () => { + PolyCommand::MoveTo(BlockCoord::Frac(1, 2), BlockCoord::One) + }; } - if s.contains(Sextant::THREE) { - fill_rect( - &mut buffer, - 0..scale(x_half), - scale(y_third)..scale(y_third * 2.), - ); + macro_rules! L { + () => { + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::Frac(1, 2)) + }; } - if s.contains(Sextant::FOUR) { - fill_rect( - &mut buffer, - scale(x_half)..width, - scale(y_third)..scale(y_third * 2.), - ); + macro_rules! R { + () => { + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(1, 2)) + }; } - if s.contains(Sextant::FIVE) { - fill_rect(&mut buffer, 0..scale(x_half), scale(y_third * 2.)..height); + + if diagonals.contains(CellDiagonal::UPPER_LEFT) { + draw(&[U!(), L!()]); } - if s.contains(Sextant::SIX) { - fill_rect( - &mut buffer, - scale(x_half)..width, - scale(y_third * 2.)..height, - ); + if diagonals.contains(CellDiagonal::UPPER_RIGHT) { + draw(&[U!(), R!()]); + } + if diagonals.contains(CellDiagonal::LOWER_LEFT) { + draw(&[D!(), L!()]); + } + if diagonals.contains(CellDiagonal::LOWER_RIGHT) { + draw(&[D!(), R!()]); } } BlockKey::Braille(dots_pattern) => { @@ -4053,22 +5088,23 @@ impl GlyphCache { } // Fill a rectangular region described by the x and y ranges -fn fill_rect(buffer: &mut Image, x: Range, y: Range) { +fn fill_rect(buffer: &mut Image, x: Range, y: Range, intensity: BlockAlpha) { let (width, height) = buffer.image_dimensions(); let mut pixmap = PixmapMut::from_bytes(buffer.pixel_data_slice_mut(), width as u32, height as u32) .expect("make pixmap from existing bitmap"); - let x = x.start as f32..x.end as f32; - let y = y.start as f32..y.end as f32; - let path = PathBuilder::from_rect( tiny_skia::Rect::from_xywh(x.start, y.start, x.end - x.start, y.end - y.start) .expect("valid rect"), ); let mut paint = Paint::default(); - paint.set_color(tiny_skia::Color::WHITE); + let intensity = intensity.to_scale(); + paint.set_color( + tiny_skia::Color::from_rgba(intensity, intensity, intensity, intensity).unwrap(), + ); + paint.anti_alias = false; paint.force_hq_pipeline = true; pixmap.fill_path( @@ -4079,7 +5115,3 @@ fn fill_rect(buffer: &mut Image, x: Range, y: Range) { None, ); } - -fn scale(f: f32) -> usize { - f.ceil().max(1.) as usize -} diff --git a/wezterm-gui/src/glyphcache.rs b/wezterm-gui/src/glyphcache.rs index f80b499d8..535a0eb27 100644 --- a/wezterm-gui/src/glyphcache.rs +++ b/wezterm-gui/src/glyphcache.rs @@ -268,8 +268,8 @@ impl FrameDecoder { reader.rewind().context("rewinding reader for png")?; let decoder = image::codecs::png::PngDecoder::with_limits(reader, limits.clone()) .context("PngDecoder::with_limits")?; - if decoder.is_apng() { - decoder.apng().into_frames() + if decoder.is_apng().unwrap_or(false) { + decoder.apng()?.into_frames() } else { let buf = DynamicImage::from_decoder(decoder)?.into_rgba8(); let delay = image::Delay::from_numer_denom_ms(u32::MAX, 1); @@ -634,10 +634,10 @@ impl GlyphCache { }; if let Some(entry) = self.glyph_cache.get(&key as &dyn GlyphKeyTrait) { - metrics::histogram!("glyph_cache.glyph_cache.hit.rate", 1.); + metrics::histogram!("glyph_cache.glyph_cache.hit.rate").record(1.); return Ok(Rc::clone(entry)); } - metrics::histogram!("glyph_cache.glyph_cache.miss.rate", 1.); + metrics::histogram!("glyph_cache.glyph_cache.miss.rate").record(1.); let glyph = match self.load_glyph(info, font, followed_by_space, num_cells) { Ok(g) => g, diff --git a/wezterm-gui/src/main.rs b/wezterm-gui/src/main.rs index a8a46afe7..f3b7688ac 100644 --- a/wezterm-gui/src/main.rs +++ b/wezterm-gui/src/main.rs @@ -1219,6 +1219,9 @@ fn run() -> anyhow::Result<()> { opts.skip_config, )?; let config = config::configuration(); + if let Some(value) = &config.default_ssh_auth_sock { + std::env::set_var("SSH_AUTH_SOCK", value); + } let sub = match opts.cmd.as_ref().cloned() { Some(SubCommand::BlockingStart(start)) => { diff --git a/wezterm-gui/src/quad.rs b/wezterm-gui/src/quad.rs index cbf8196af..3f7621ef6 100644 --- a/wezterm-gui/src/quad.rs +++ b/wezterm-gui/src/quad.rs @@ -329,7 +329,7 @@ impl HeapQuadAllocator { other.extend_with(layer_num, &quad.to_vertices()); } } - metrics::histogram!("quad_buffer_apply", start.elapsed()); + metrics::histogram!("quad_buffer_apply").record(start.elapsed()); Ok(()) } } diff --git a/wezterm-gui/src/stats.rs b/wezterm-gui/src/stats.rs index b046986fc..f518b9dbd 100644 --- a/wezterm-gui/src/stats.rs +++ b/wezterm-gui/src/stats.rs @@ -2,10 +2,11 @@ use config::configuration; use config::lua::get_or_create_sub_module; use config::lua::mlua::Lua; use hdrhistogram::Histogram; -use metrics::{GaugeValue, Key, Recorder, Unit}; +use metrics::{Counter, Gauge, Key, KeyName, Metadata, Recorder, SharedString, Unit}; +use parking_lot::Mutex; use std::collections::HashMap; -use std::sync::atomic::{AtomicBool, Ordering}; -use std::sync::{Arc, Mutex}; +use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; +use std::sync::Arc; use std::time::{Duration, Instant}; use tabout::{tabulate_output, Alignment, Column}; @@ -14,21 +15,40 @@ lazy_static::lazy_static! { static ref INNER: Arc> = make_inner(); } -struct Throughput { +struct ThroughputInner { hist: Histogram, last: Option, count: u64, } +struct Throughput { + inner: Mutex, +} + impl Throughput { fn new() -> Self { Self { - hist: Histogram::new(2).expect("failed to create histogram"), - last: None, - count: 0, + inner: Mutex::new(ThroughputInner { + hist: Histogram::new(2).expect("failed to create histogram"), + last: None, + count: 0, + }), } } + fn current(&self) -> u64 { + self.inner.lock().current() + } + fn percentiles(&self) -> (u64, u64, u64) { + let inner = self.inner.lock(); + let p50 = inner.hist.value_at_percentile(50.); + let p75 = inner.hist.value_at_percentile(75.); + let p95 = inner.hist.value_at_percentile(95.); + (p50, p75, p95) + } +} + +impl ThroughputInner { fn add(&mut self, value: u64) { if let Some(ref last) = self.last { let elapsed = last.elapsed(); @@ -57,14 +77,69 @@ impl Throughput { } } +impl metrics::HistogramFn for Throughput { + fn record(&self, value: f64) { + self.inner.lock().add(value as u64); + } +} + +struct ScaledHistogram { + hist: Mutex>, + scale: f64, +} + +impl ScaledHistogram { + fn new(scale: f64) -> Arc { + Arc::new(Self { + hist: Mutex::new(Histogram::new(2).expect("failed to create new Histogram")), + scale, + }) + } + fn percentiles(&self) -> (u64, u64, u64) { + let hist = self.hist.lock(); + let p50 = hist.value_at_percentile(50.); + let p75 = hist.value_at_percentile(75.); + let p95 = hist.value_at_percentile(95.); + (p50, p75, p95) + } + + fn latency_percentiles(&self) -> (Duration, Duration, Duration) { + let hist = self.hist.lock(); + let p50 = pctile_latency(&*hist, 50.); + let p75 = pctile_latency(&*hist, 75.); + let p95 = pctile_latency(&*hist, 95.); + (p50, p75, p95) + } +} + +impl metrics::HistogramFn for ScaledHistogram { + fn record(&self, value: f64) { + self.hist.lock().record((value * self.scale) as u64).ok(); + } +} + fn pctile_latency(histogram: &Histogram, p: f64) -> Duration { Duration::from_nanos(histogram.value_at_percentile(p)) } +struct MyCounter { + value: AtomicUsize, +} + +impl metrics::CounterFn for MyCounter { + fn increment(&self, value: u64) { + self.value.fetch_add(value as usize, Ordering::Relaxed); + } + + fn absolute(&self, value: u64) { + self.value.store(value as usize, Ordering::Relaxed); + } +} + struct Inner { - histograms: HashMap>, - throughput: HashMap, - counters: HashMap, + histograms: HashMap>, + throughput: HashMap>, + counters: HashMap>, } impl Inner { @@ -136,12 +211,10 @@ impl Inner { if last_print.elapsed() >= Duration::from_secs(seconds) { let mut data = vec![]; - let mut inner = inner.lock().unwrap(); + let mut inner = inner.lock(); for (key, tput) in &mut inner.throughput { let current = tput.current(); - let p50 = tput.hist.value_at_percentile(50.); - let p75 = tput.hist.value_at_percentile(75.); - let p95 = tput.hist.value_at_percentile(95.); + let (p50, p75, p95) = tput.percentiles(); data.push(vec![ key.to_string(), format!("{:.2?}", current), @@ -157,9 +230,7 @@ impl Inner { data.clear(); for (key, histogram) in &inner.histograms { if key.name().ends_with(".size") { - let p50 = histogram.value_at_percentile(50.); - let p75 = histogram.value_at_percentile(75.); - let p95 = histogram.value_at_percentile(95.); + let (p50, p75, p95) = histogram.percentiles(); data.push(vec![ key.to_string(), format!("{:.2?}", p50), @@ -167,9 +238,7 @@ impl Inner { format!("{:.2?}", p95), ]); } else { - let p50 = pctile_latency(histogram, 50.); - let p75 = pctile_latency(histogram, 75.); - let p95 = pctile_latency(histogram, 95.); + let (p50, p75, p95) = histogram.latency_percentiles(); data.push(vec![ key.to_string(), format!("{:.2?}", p50), @@ -184,7 +253,10 @@ impl Inner { data.clear(); for (key, count) in &inner.counters { - data.push(vec![key.to_string(), count.to_string()]); + data.push(vec![ + key.to_string(), + count.value.load(Ordering::Relaxed).to_string(), + ]); } data.sort_by(|a, b| a[0].cmp(&b[0])); eprintln!(); @@ -219,61 +291,65 @@ impl Stats { let stats = Self::new(); let inner = Arc::clone(&stats.inner); std::thread::spawn(move || Inner::run(inner)); - let rec = Box::new(stats); - metrics::set_boxed_recorder(rec) + metrics::set_global_recorder(stats) .map_err(|e| anyhow::anyhow!("Failed to set metrics recorder:{}", e)) } } impl Recorder for Stats { - fn register_counter( - &self, - _key: &Key, - _unit: Option, - _description: Option<&'static str>, - ) { + fn describe_counter(&self, _key: KeyName, _unit: Option, _description: SharedString) {} + + fn describe_gauge(&self, _key: KeyName, _unit: Option, _description: SharedString) {} + + fn describe_histogram(&self, _key: KeyName, _unit: Option, _description: SharedString) {} + + fn register_counter(&self, key: &Key, _metadata: &Metadata) -> Counter { + let mut inner = self.inner.lock(); + match inner.counters.get(key) { + Some(existing) => Counter::from_arc(existing.clone()), + None => { + let counter = Arc::new(MyCounter { + value: AtomicUsize::new(0), + }); + inner.counters.insert(key.clone(), counter.clone()); + metrics::Counter::from_arc(counter) + } + } } - fn register_gauge(&self, _key: &Key, _unit: Option, _description: Option<&'static str>) {} - - fn register_histogram( - &self, - _key: &Key, - _unit: Option, - _description: Option<&'static str>, - ) { + fn register_gauge(&self, _key: &Key, _metadata: &Metadata) -> Gauge { + Gauge::noop() } - fn increment_counter(&self, key: &Key, value: u64) { - let mut inner = self.inner.lock().unwrap(); - let counter = inner.counters.entry(key.clone()).or_insert_with(|| 0); - *counter = *counter + value; - } - - fn update_gauge(&self, key: &Key, value: GaugeValue) { - log::trace!("gauge '{}' -> {:?}", key, value); - } - - fn record_histogram(&self, key: &Key, value: f64) { - let mut inner = self.inner.lock().unwrap(); + fn register_histogram(&self, key: &Key, _metadata: &Metadata) -> metrics::Histogram { + let mut inner = self.inner.lock(); if key.name().ends_with(".rate") { - let tput = inner - .throughput - .entry(key.clone()) - .or_insert_with(|| Throughput::new()); - tput.add(value as u64); + match inner.throughput.get(key) { + Some(existing) => metrics::Histogram::from_arc(existing.clone()), + None => { + let tput = Arc::new(Throughput::new()); + inner.throughput.insert(key.clone(), tput.clone()); + + metrics::Histogram::from_arc(tput) + } + } } else { - let value = if key.name().ends_with(".size") { - value - } else { - // Assume seconds; convert to nanoseconds - value * 1_000_000_000.0 - }; - let histogram = inner - .histograms - .entry(key.clone()) - .or_insert_with(|| Histogram::new(2).expect("failed to crate new Histogram")); - histogram.record(value as u64).ok(); + match inner.histograms.get(key) { + Some(existing) => metrics::Histogram::from_arc(existing.clone()), + None => { + let scale = if key.name().ends_with(".size") { + 1.0 + } else { + // Assume seconds; convert to nanoseconds + 1_000_000_000.0 + }; + + let histogram = ScaledHistogram::new(scale); + inner.histograms.insert(key.clone(), histogram.clone()); + + metrics::Histogram::from_arc(histogram) + } + } } } } @@ -283,11 +359,11 @@ pub fn register(lua: &Lua) -> anyhow::Result<()> { metrics_mod.set( "get_counters", lua.create_function(|_, _: ()| { - let inner = INNER.lock().unwrap(); - let counters: HashMap = inner + let inner = INNER.lock(); + let counters: HashMap = inner .counters .iter() - .map(|(k, &v)| (k.name().to_string(), v)) + .map(|(k, v)| (k.name().to_string(), v.value.load(Ordering::Relaxed))) .collect(); Ok(counters) })?, @@ -295,16 +371,17 @@ pub fn register(lua: &Lua) -> anyhow::Result<()> { metrics_mod.set( "get_throughput", lua.create_function(|_, _: ()| { - let mut inner = INNER.lock().unwrap(); + let mut inner = INNER.lock(); let counters: HashMap> = inner .throughput .iter_mut() .map(|(k, tput)| { let mut res = HashMap::new(); res.insert("current".to_string(), tput.current()); - res.insert("p50".to_string(), tput.hist.value_at_percentile(50.)); - res.insert("p75".to_string(), tput.hist.value_at_percentile(75.)); - res.insert("p95".to_string(), tput.hist.value_at_percentile(95.)); + let (p50, p75, p95) = tput.percentiles(); + res.insert("p50".to_string(), p50); + res.insert("p75".to_string(), p75); + res.insert("p95".to_string(), p95); (k.name().to_string(), res) }) .collect(); @@ -314,16 +391,17 @@ pub fn register(lua: &Lua) -> anyhow::Result<()> { metrics_mod.set( "get_sizes", lua.create_function(|_, _: ()| { - let mut inner = INNER.lock().unwrap(); + let mut inner = INNER.lock(); let counters: HashMap> = inner .histograms .iter_mut() .filter_map(|(key, hist)| { if key.name().ends_with(".size") { let mut res = HashMap::new(); - res.insert("p50".to_string(), hist.value_at_percentile(50.)); - res.insert("p75".to_string(), hist.value_at_percentile(75.)); - res.insert("p95".to_string(), hist.value_at_percentile(95.)); + let (p50, p75, p95) = hist.percentiles(); + res.insert("p50".to_string(), p50); + res.insert("p75".to_string(), p75); + res.insert("p95".to_string(), p95); Some((key.name().to_string(), res)) } else { None @@ -336,25 +414,17 @@ pub fn register(lua: &Lua) -> anyhow::Result<()> { metrics_mod.set( "get_latency", lua.create_function(|_, _: ()| { - let mut inner = INNER.lock().unwrap(); + let mut inner = INNER.lock(); let counters: HashMap> = inner .histograms .iter_mut() .filter_map(|(key, hist)| { if !key.name().ends_with(".size") { let mut res = HashMap::new(); - res.insert( - "p50".to_string(), - format!("{:?}", pctile_latency(hist, 50.)), - ); - res.insert( - "p75".to_string(), - format!("{:?}", pctile_latency(hist, 75.)), - ); - res.insert( - "p95".to_string(), - format!("{:?}", pctile_latency(hist, 95.)), - ); + let (p50, p75, p95) = hist.latency_percentiles(); + res.insert("p50".to_string(), format!("{p50:?}")); + res.insert("p75".to_string(), format!("{p75:?}")); + res.insert("p95".to_string(), format!("{p95:?}")); Some((key.name().to_string(), res)) } else { None diff --git a/wezterm-gui/src/termwindow/mod.rs b/wezterm-gui/src/termwindow/mod.rs index c92e5a271..71ece24c2 100644 --- a/wezterm-gui/src/termwindow/mod.rs +++ b/wezterm-gui/src/termwindow/mod.rs @@ -1011,6 +1011,28 @@ impl TermWindow { } Ok(true) } + WindowEvent::DroppedString(text) => { + let pane = match self.get_active_pane_or_overlay() { + Some(pane) => pane, + None => return Ok(true), + }; + pane.send_paste(text.as_str())?; + Ok(true) + } + WindowEvent::DroppedUrl(urls) => { + let pane = match self.get_active_pane_or_overlay() { + Some(pane) => pane, + None => return Ok(true), + }; + let urls = urls + .iter() + .map(|url| self.config.quote_dropped_files.escape(&url.to_string())) + .collect::>() + .join(" ") + + " "; + pane.send_paste(urls.as_str())?; + Ok(true) + } WindowEvent::DroppedFile(paths) => { let pane = match self.get_active_pane_or_overlay() { Some(pane) => pane, @@ -1024,7 +1046,8 @@ impl TermWindow { .escape(&path.to_string_lossy()) }) .collect::>() - .join(" "); + .join(" ") + + " "; pane.send_paste(&paths)?; Ok(true) } @@ -1400,7 +1423,7 @@ impl TermWindow { } fn mux_pane_output_event(&mut self, pane_id: PaneId) { - metrics::histogram!("mux.pane_output_event.rate", 1.); + metrics::histogram!("mux.pane_output_event.rate").record(1.); if self.is_pane_visible(pane_id) { if let Some(ref win) = self.window { win.invalidate(); diff --git a/wezterm-gui/src/termwindow/render/mod.rs b/wezterm-gui/src/termwindow/render/mod.rs index f08137b4c..5e7696d54 100644 --- a/wezterm-gui/src/termwindow/render/mod.rs +++ b/wezterm-gui/src/termwindow/render/mod.rs @@ -788,7 +788,7 @@ impl crate::TermWindow { } } }; - metrics::histogram!("cached_cluster_shape", shape_resolve_start.elapsed()); + metrics::histogram!("cached_cluster_shape").record(shape_resolve_start.elapsed()); log::trace!( "shape_resolve for cluster len {} -> elapsed {:?}", cluster.text.len(), diff --git a/wezterm-gui/src/termwindow/render/paint.rs b/wezterm-gui/src/termwindow/render/paint.rs index a33f8d352..5218d2d77 100644 --- a/wezterm-gui/src/termwindow/render/paint.rs +++ b/wezterm-gui/src/termwindow/render/paint.rs @@ -112,8 +112,8 @@ impl crate::TermWindow { self.last_frame_duration, self.fps ); - metrics::histogram!("gui.paint.impl", self.last_frame_duration); - metrics::histogram!("gui.paint.impl.rate", 1.); + metrics::histogram!("gui.paint.impl").record(self.last_frame_duration); + metrics::histogram!("gui.paint.impl.rate").record(1.); // If self.has_animation is some, then the last render detected // image attachments with multiple frames, so we also need to @@ -181,7 +181,7 @@ impl crate::TermWindow { .context("layer_for_zindex(0)")?; let mut layers = layer.quad_allocator(); log::trace!("quad map elapsed {:?}", start.elapsed()); - metrics::histogram!("quad.map", start.elapsed()); + metrics::histogram!("quad.map").record(start.elapsed()); let mut paint_terminal_background = false; diff --git a/wezterm-gui/src/termwindow/render/pane.rs b/wezterm-gui/src/termwindow/render/pane.rs index a2160fa7a..a7c5f797f 100644 --- a/wezterm-gui/src/termwindow/render/pane.rs +++ b/wezterm-gui/src/termwindow/render/pane.rs @@ -577,7 +577,7 @@ impl crate::TermWindow { // TODO: render a thingy to jump to prior prompt } */ - metrics::histogram!("paint_pane.lines", start.elapsed()); + metrics::histogram!("paint_pane.lines").record(start.elapsed()); log::trace!("lines elapsed {:?}", start.elapsed()); Ok(()) diff --git a/wezterm-gui/src/termwindow/render/screen_line.rs b/wezterm-gui/src/termwindow/render/screen_line.rs index 2f2675a02..4a34b40b4 100644 --- a/wezterm-gui/src/termwindow/render/screen_line.rs +++ b/wezterm-gui/src/termwindow/render/screen_line.rs @@ -712,7 +712,7 @@ impl crate::TermWindow { .context("populate_image_quad")?; } - metrics::histogram!("render_screen_line", start.elapsed()); + metrics::histogram!("render_screen_line").record(start.elapsed()); Ok(RenderScreenLineResult { invalidate_on_hover_change, diff --git a/wezterm-mux-server-impl/Cargo.toml b/wezterm-mux-server-impl/Cargo.toml index cb03dce48..228931e42 100644 --- a/wezterm-mux-server-impl/Cargo.toml +++ b/wezterm-mux-server-impl/Cargo.toml @@ -3,16 +3,18 @@ name = "wezterm-mux-server-impl" version = "0.1.0" authors = ["Wez Furlong "] edition = "2018" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] anyhow = "1.0" async_ossl = { path = "../async_ossl" } +async-io = "2.3" codec = { path = "../codec" } config = { path = "../config" } futures = "0.3" -hostname = "0.3" +hostname = "0.4" lazy_static = "1.4" log = "0.4" mux = { path = "../mux" } @@ -20,12 +22,12 @@ portable-pty = { path = "../pty", features = ["serde_support"]} promise = { path = "../promise" } rangeset = { path = "../rangeset" } rcgen = "0.12" -smol = "1.2" +smol = "2.0" url = "2" wezterm-client = { path = "../wezterm-client" } wezterm-term = { path = "../term", features=["use_serde"] } +wezterm-uds = { path = "../wezterm-uds" } termwiz = { path = "../termwiz", features=["use_serde"] } [target."cfg(windows)".dependencies] -uds_windows = "1.0" winapi = { version = "0.3", features = [ "winuser" ]} diff --git a/wezterm-mux-server-impl/src/dispatch.rs b/wezterm-mux-server-impl/src/dispatch.rs index da3b5b502..c3728f1c2 100644 --- a/wezterm-mux-server-impl/src/dispatch.rs +++ b/wezterm-mux-server-impl/src/dispatch.rs @@ -1,5 +1,4 @@ use crate::sessionhandler::{PduSender, SessionHandler}; -use crate::UnixStream; use anyhow::Context; use async_ossl::AsyncSslStream; use codec::{DecodedPdu, Pdu}; @@ -7,11 +6,12 @@ use futures::FutureExt; use mux::{Mux, MuxNotification}; use smol::prelude::*; use smol::Async; +use wezterm_uds::UnixStream; #[cfg(unix)] -pub trait AsRawDesc: std::os::unix::io::AsRawFd {} +pub trait AsRawDesc: std::os::unix::io::AsRawFd + std::os::fd::AsFd {} #[cfg(windows)] -pub trait AsRawDesc: std::os::windows::io::AsRawSocket {} +pub trait AsRawDesc: std::os::windows::io::AsRawSocket + std::os::windows::io::AsSocket {} impl AsRawDesc for UnixStream {} impl AsRawDesc for AsyncSslStream {} @@ -30,6 +30,7 @@ where T: std::io::Write, T: AsRawDesc, T: std::fmt::Debug, + T: async_io::IoSafe, { let stream = smol::Async::new(stream)?; process_async(stream).await @@ -41,6 +42,7 @@ where T: std::io::Read, T: std::io::Write, T: std::fmt::Debug, + T: async_io::IoSafe, { log::trace!("process_async called"); diff --git a/wezterm-mux-server-impl/src/lib.rs b/wezterm-mux-server-impl/src/lib.rs index c36a87963..bc0b6968a 100644 --- a/wezterm-mux-server-impl/src/lib.rs +++ b/wezterm-mux-server-impl/src/lib.rs @@ -5,11 +5,6 @@ use mux::Mux; use std::sync::Arc; use wezterm_client::domain::{ClientDomain, ClientDomainConfig}; -#[cfg(unix)] -use std::os::unix::net::{UnixListener, UnixStream}; -#[cfg(windows)] -use uds_windows::{UnixListener, UnixStream}; - pub mod dispatch; pub mod local; pub mod pki; diff --git a/wezterm-mux-server-impl/src/local.rs b/wezterm-mux-server-impl/src/local.rs index ddc399df1..52d59087f 100644 --- a/wezterm-mux-server-impl/src/local.rs +++ b/wezterm-mux-server-impl/src/local.rs @@ -1,7 +1,7 @@ -use crate::UnixListener; use anyhow::{anyhow, Context as _}; use config::{create_user_owned_dirs, UnixDomain}; use promise::spawn::spawn_into_main_thread; +use wezterm_uds::UnixListener; pub struct LocalListener { listener: UnixListener, diff --git a/wezterm-mux-server-impl/src/sessionhandler.rs b/wezterm-mux-server-impl/src/sessionhandler.rs index 405a0166e..a8a497cdf 100644 --- a/wezterm-mux-server-impl/src/sessionhandler.rs +++ b/wezterm-mux-server-impl/src/sessionhandler.rs @@ -199,6 +199,7 @@ pub struct SessionHandler { to_write_tx: PduSender, per_pane: HashMap>>, client_id: Option>, + proxy_client_id: Option, } impl Drop for SessionHandler { @@ -216,6 +217,7 @@ impl SessionHandler { to_write_tx, per_pane: HashMap::new(), client_id: None, + proxy_client_id: None, } } @@ -292,14 +294,37 @@ impl SessionHandler { }) .detach(); } - Pdu::SetClientId(SetClientId { client_id }) => { - let client_id = Arc::new(client_id); - self.client_id.replace(client_id.clone()); - spawn_into_main_thread(async move { - let mux = Mux::get(); - mux.register_client(client_id); - }) - .detach(); + Pdu::SetClientId(SetClientId { + mut client_id, + is_proxy, + }) => { + if is_proxy { + if self.proxy_client_id.is_none() { + // Copy proxy identity, but don't assign it to the mux; + // we'll use it to annotate the actual clients own + // identity when they send it + self.proxy_client_id.replace(client_id); + } + } else { + // If this session is a proxy, override the incoming id with + // the proxy information so that it is clear what is going + // on from the `wezterm cli list-clients` information + if let Some(proxy_id) = &self.proxy_client_id { + client_id.ssh_auth_sock = proxy_id.ssh_auth_sock.clone(); + // Note that this `via proxy pid` string is coupled + // with the logic in mux/src/ssh_agent + client_id.hostname = + format!("{} (via proxy pid {})", client_id.hostname, proxy_id.pid); + } + + let client_id = Arc::new(client_id); + self.client_id.replace(client_id.clone()); + spawn_into_main_thread(async move { + let mux = Mux::get(); + mux.register_client(client_id); + }) + .detach(); + } send_response(Ok(Pdu::UnitResponse(UnitResponse {}))) } Pdu::SetFocusedPane(SetFocusedPane { pane_id }) => { diff --git a/wezterm-mux-server/Cargo.toml b/wezterm-mux-server/Cargo.toml index 4070049f1..4befffab9 100644 --- a/wezterm-mux-server/Cargo.toml +++ b/wezterm-mux-server/Cargo.toml @@ -4,6 +4,7 @@ version = "0.1.0" authors = ["Wez Furlong "] edition = "2018" resolver = "2" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/wezterm-mux-server/src/daemonize.rs b/wezterm-mux-server/src/daemonize.rs index c661750b5..ba4e7db03 100644 --- a/wezterm-mux-server/src/daemonize.rs +++ b/wezterm-mux-server/src/daemonize.rs @@ -5,6 +5,7 @@ use std::io::Write; use std::os::unix::io::{AsRawFd, IntoRawFd, RawFd}; enum Fork { + #[allow(dead_code)] Child(pid_t), Parent(pid_t), } diff --git a/wezterm-mux-server/src/main.rs b/wezterm-mux-server/src/main.rs index 3f9eac063..b92c03ae5 100644 --- a/wezterm-mux-server/src/main.rs +++ b/wezterm-mux-server/src/main.rs @@ -99,6 +99,9 @@ fn run() -> anyhow::Result<()> { let config = config::configuration(); config.update_ulimit()?; + if let Some(value) = &config.default_ssh_auth_sock { + std::env::set_var("SSH_AUTH_SOCK", value); + } #[cfg(unix)] let mut pid_file = None; diff --git a/wezterm-open-url/Cargo.toml b/wezterm-open-url/Cargo.toml index aa792764e..eec4fb2a8 100644 --- a/wezterm-open-url/Cargo.toml +++ b/wezterm-open-url/Cargo.toml @@ -2,6 +2,7 @@ name = "wezterm-open-url" version = "0.1.0" edition = "2021" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/wezterm-ssh/Cargo.toml b/wezterm-ssh/Cargo.toml index eb4b2129b..1fa5c0066 100644 --- a/wezterm-ssh/Cargo.toml +++ b/wezterm-ssh/Cargo.toml @@ -18,23 +18,24 @@ vendored-openssl-libssh-rs = ["libssh-rs/vendored-openssl"] [dependencies] anyhow = "1.0" -base64 = "0.21" +base64 = "0.22" bitflags = "1.3" camino = "1.0" dirs-next = "2.0" filedescriptor = { version="0.8", path = "../filedescriptor" } -filenamegen = "0.2" +filenamegen = "0.2.6" gethostname = "0.4" libc = "0.2" log = "0.4" portable-pty = { version="0.8", path = "../pty" } regex = "1" -smol = "1.2" +smol = "2.0" ssh2 = {version="0.9.3", features=["openssl-on-win32"], optional = true} -libssh-rs = {version="0.2.1", features=["vendored"], optional = true} +libssh-rs = {version="0.3.2", features=["vendored"], optional = true} #libssh-rs = {path="../../libssh-rs/libssh-rs", features=["vendored"], optional = true} thiserror = "1.0" socket2 = "0.5" +wezterm-uds = { path = "../wezterm-uds" } # Not used directly, but is used to centralize the openssl vendor feature selection async_ossl = { path = "../async_ossl" } @@ -46,8 +47,7 @@ k9 = "0.12.0" once_cell = "1.8" predicates = "3.0" env_logger = "0.11" -rstest = "0.18" +rstest = "0.19" shell-words = "1.1" -smol-potat = "1.1.2" termwiz = { version = "0.22", path = "../termwiz" } whoami = "1.5" diff --git a/wezterm-ssh/src/channelwrap.rs b/wezterm-ssh/src/channelwrap.rs index f7409cb52..db79dbcdc 100644 --- a/wezterm-ssh/src/channelwrap.rs +++ b/wezterm-ssh/src/channelwrap.rs @@ -146,6 +146,21 @@ impl ChannelWrap { } } + pub fn request_auth_agent_forwarding(&mut self) -> anyhow::Result<()> { + match self { + /* libssh2 doesn't properly support agent forwarding + * at this time: + * */ + #[cfg(feature = "ssh2")] + Self::Ssh2(_chan) => Err(anyhow::anyhow!( + "ssh2 does not support request_auth_agent_forwarding" + )), + + #[cfg(feature = "libssh-rs")] + Self::LibSsh(chan) => Ok(chan.request_auth_agent()?), + } + } + pub fn resize_pty(&mut self, resize: &ResizePty) -> anyhow::Result<()> { match self { #[cfg(feature = "ssh2")] diff --git a/wezterm-ssh/src/config.rs b/wezterm-ssh/src/config.rs index 0ccba7572..b96c10237 100644 --- a/wezterm-ssh/src/config.rs +++ b/wezterm-ssh/src/config.rs @@ -533,6 +533,15 @@ impl Config { let mut token_map = self.tokens.clone(); token_map.insert("%h".to_string(), host.to_string()); + result + .entry("hostname".to_string()) + .and_modify(|curr| { + if let Some(tokens) = self.should_expand_tokens("hostname") { + self.expand_tokens(curr, tokens, &token_map); + } + }) + .or_insert_with(|| host.to_string()); + token_map.insert("%h".to_string(), result["hostname"].to_string()); token_map.insert("%n".to_string(), host.to_string()); token_map.insert("%r".to_string(), target_user.to_string()); token_map.insert( @@ -553,10 +562,6 @@ impl Config { } } - result - .entry("hostname".to_string()) - .or_insert_with(|| host.to_string()); - result .entry("port".to_string()) .or_insert_with(|| "22".to_string()); @@ -960,6 +965,39 @@ Config { ); } + #[test] + fn parse_proxy_command_hostname_expansion() { + let mut config = Config::new(); + + let mut fake_env = ConfigMap::new(); + fake_env.insert("HOME".to_string(), "/home/me".to_string()); + fake_env.insert("USER".to_string(), "me".to_string()); + config.assign_environment(fake_env); + + config.add_config_string( + r#" + Host foo + HostName server-%h + ProxyCommand nc -x localhost:1080 %h %p + "#, + ); + + let opts = config.for_host("foo"); + snapshot!( + opts, + r#" +{ + "hostname": "server-foo", + "identityfile": "/home/me/.ssh/id_dsa /home/me/.ssh/id_ecdsa /home/me/.ssh/id_ed25519 /home/me/.ssh/id_rsa", + "port": "22", + "proxycommand": "nc -x localhost:1080 server-foo 22", + "user": "me", + "userknownhostsfile": "/home/me/.ssh/known_hosts /home/me/.ssh/known_hosts2", +} +"# + ); + } + #[test] fn multiple_identityfile() { let mut config = Config::new(); diff --git a/wezterm-ssh/src/pty.rs b/wezterm-ssh/src/pty.rs index 9136b29d8..175a3a311 100644 --- a/wezterm-ssh/src/pty.rs +++ b/wezterm-ssh/src/pty.rs @@ -218,17 +218,13 @@ impl crate::sessioninner::SessionInner { let mut channel = sess.open_session()?; - /* libssh2 doesn't properly support agent forwarding - * at this time: - * if let Some("yes") = self.config.get("forwardagent").map(|s| s.as_str()) { - log::info!("requesting agent forwarding"); - if let Err(err) = channel.request_auth_agent_forwarding() { - log::error!("Failed to establish agent forwarding: {:#}", err); + if self.identity_agent().is_some() { + if let Err(err) = channel.request_auth_agent_forwarding() { + log::error!("Failed to request agent forwarding: {:#}", err); + } } - log::info!("agent forwarding OK!"); } - */ channel.request_pty(&newpty)?; diff --git a/wezterm-ssh/src/sessioninner.rs b/wezterm-ssh/src/sessioninner.rs index a0f30d646..bbc145a15 100644 --- a/wezterm-ssh/src/sessioninner.rs +++ b/wezterm-ssh/src/sessioninner.rs @@ -243,6 +243,13 @@ impl SessionInner { .try_send(SessionEvent::Authenticated) .context("notifying user that session is authenticated")?; + if let Some("yes") = self.config.get("forwardagent").map(|s| s.as_str()) { + if self.identity_agent().is_some() { + sess.enable_accept_agent_forward(true); + } else { + log::error!("ForwardAgent is set to yes, but IdentityAgent is not set"); + } + } sess.set_blocking(false); let mut sess = SessionWrap::with_libssh(sess); self.request_loop(&mut sess) @@ -405,6 +412,7 @@ impl SessionInner { self.tick_io()?; self.drain_request_pipe(); self.dispatch_pending_requests(sess)?; + self.connect_pending_agent_forward_channels(sess); if self.channels.is_empty() && self.session_was_dropped { log::trace!( @@ -517,8 +525,16 @@ impl SessionInner { let stdin = &mut chan.descriptors[0]; if stdin.fd.is_some() && !stdin.buf.is_empty() { - write_from_buf(&mut chan.channel.writer(), &mut stdin.buf) - .context("writing to channel")?; + if let Err(err) = write_from_buf(&mut chan.channel.writer(), &mut stdin.buf) + .context("writing to channel") + { + log::trace!( + "Failed to write data to channel {} stdin: {:#}, closing pipe", + id, + err + ); + stdin.fd.take(); + } } for (idx, out) in chan @@ -805,6 +821,61 @@ impl SessionInner { } } + fn connect_pending_agent_forward_channels(&mut self, sess: &mut SessionWrap) { + fn process_one(sess: &mut SessionInner, channel: ChannelWrap) -> anyhow::Result<()> { + let identity_agent = sess + .identity_agent() + .ok_or_else(|| anyhow!("no identity agent in config"))?; + let mut fd = { + use wezterm_uds::UnixStream; + #[cfg(unix)] + { + FileDescriptor::new(UnixStream::connect(&identity_agent)?) + } + #[cfg(windows)] + unsafe { + use std::os::windows::io::{FromRawSocket, IntoRawSocket}; + FileDescriptor::from_raw_socket( + UnixStream::connect(&identity_agent)?.into_raw_socket(), + ) + } + }; + fd.set_non_blocking(true)?; + + let read_from_agent = fd; + let write_to_agent = read_from_agent.try_clone()?; + let channel_id = sess.next_channel_id; + sess.next_channel_id += 1; + let info = ChannelInfo { + channel_id, + channel, + exit: None, + exited: false, + descriptors: [ + DescriptorState { + fd: Some(read_from_agent), + buf: VecDeque::with_capacity(8192), + }, + DescriptorState { + fd: Some(write_to_agent), + buf: VecDeque::with_capacity(8192), + }, + DescriptorState { + fd: None, + buf: VecDeque::with_capacity(8192), + }, + ], + }; + sess.channels.insert(channel_id, info); + Ok(()) + } + while let Some(channel) = sess.accept_agent_forward() { + if let Err(err) = process_one(self, channel) { + log::error!("error connecting agent forward: {:#}", err); + } + } + } + pub fn signal_channel(&mut self, info: &SignalChannel) -> anyhow::Result<()> { let chan_info = self .channels @@ -818,6 +889,14 @@ impl SessionInner { pub fn exec(&mut self, sess: &mut SessionWrap, exec: Exec) -> anyhow::Result { let mut channel = sess.open_session()?; + if let Some("yes") = self.config.get("forwardagent").map(|s| s.as_str()) { + if self.identity_agent().is_some() { + if let Err(err) = channel.request_auth_agent_forwarding() { + log::error!("Failed to request agent forwarding: {:#}", err); + } + } + } + if let Some(env) = &exec.env { for (key, val) in env { if let Err(err) = channel.request_env(key, val) { @@ -944,6 +1023,13 @@ impl SessionInner { } } } + + pub fn identity_agent(&self) -> Option { + self.config + .get("identityagent") + .map(|s| s.to_owned()) + .or_else(|| std::env::var("SSH_AUTH_SOCK").ok()) + } } fn write_from_buf(w: &mut W, buf: &mut VecDeque) -> std::io::Result<()> { diff --git a/wezterm-ssh/src/sessionwrap.rs b/wezterm-ssh/src/sessionwrap.rs index 2a3d9449d..72578f219 100644 --- a/wezterm-ssh/src/sessionwrap.rs +++ b/wezterm-ssh/src/sessionwrap.rs @@ -92,4 +92,16 @@ impl SessionWrap { } } } + + pub fn accept_agent_forward(&mut self) -> Option { + match self { + // Unimplemented for now, an error message was printed earlier when the user tries to + // enable agent forwarding so just return nothing here. + #[cfg(feature = "ssh2")] + Self::Ssh2(_sess) => None, + + #[cfg(feature = "libssh-rs")] + Self::LibSsh(sess) => sess.sess.accept_agent_forward().map(ChannelWrap::LibSsh), + } + } } diff --git a/wezterm-ssh/src/sftpwrap.rs b/wezterm-ssh/src/sftpwrap.rs index 11939ddec..4335479e0 100644 --- a/wezterm-ssh/src/sftpwrap.rs +++ b/wezterm-ssh/src/sftpwrap.rs @@ -38,6 +38,7 @@ impl SftpWrap { Self::LibSsh(sftp) => { use crate::sftp::types::WriteMode; use libc::{O_APPEND, O_RDONLY, O_RDWR, O_WRONLY}; + use libssh_rs::OpenFlags; use std::convert::TryInto; let accesstype = match (opts.write, opts.read) { (Some(WriteMode::Append), true) => O_RDWR | O_APPEND, @@ -47,8 +48,11 @@ impl SftpWrap { (None, true) => O_RDONLY, (None, false) => 0, }; - let file = - sftp.open(filename.as_str(), accesstype, opts.mode.try_into().unwrap())?; + let file = sftp.open( + filename.as_str(), + OpenFlags::from_bits_truncate(accesstype), + opts.mode.try_into().unwrap(), + )?; Ok(FileWrap::LibSsh(file)) } } diff --git a/wezterm-ssh/tests/e2e/agent_forward.rs b/wezterm-ssh/tests/e2e/agent_forward.rs new file mode 100644 index 000000000..832a8b9dd --- /dev/null +++ b/wezterm-ssh/tests/e2e/agent_forward.rs @@ -0,0 +1,55 @@ +use crate::sshd::*; +use portable_pty::{MasterPty, PtySize}; +use rstest::*; +use std::io::Read; +use wezterm_ssh::Config; + +#[fixture] +async fn session_with_agent_forward( + #[future] + #[with({ let mut config = Config::new(); config.set_option("forwardagent", "yes"); config })] + session: SessionWithSshd, +) -> SessionWithSshd { + session.await +} + +#[rstest] +#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] +#[cfg_attr(not(feature = "libssh-rs"), ignore)] +fn ssh_add_should_be_able_to_list_identities_with_agent_forward( + #[future] session_with_agent_forward: SessionWithSshd, +) { + smol::block_on(async { + let session: SessionWithSshd = session_with_agent_forward.await; + + let (pty, _child_process) = session + .request_pty("dumb", PtySize::default(), Some("ssh-add -l"), None) + .await + .unwrap(); + let mut reader = pty.try_clone_reader().unwrap(); + let mut output: String = String::new(); + reader.read_to_string(&mut output).unwrap(); + assert_eq!(output, "The agent has no identities.\r\n"); + }) +} + +#[rstest] +#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] +#[cfg_attr(not(feature = "libssh-rs"), ignore)] +fn no_agent_forward_should_happen_when_disabled(#[future] session: SessionWithSshd) { + smol::block_on(async { + let session: SessionWithSshd = session.await; + + let (pty, _child_process) = session + .request_pty("dumb", PtySize::default(), Some("ssh-add -l"), None) + .await + .unwrap(); + let mut reader = pty.try_clone_reader().unwrap(); + let mut output: String = String::new(); + reader.read_to_string(&mut output).unwrap(); + assert_eq!( + output, + "Could not open a connection to your authentication agent.\r\n" + ); + }) +} diff --git a/wezterm-ssh/tests/e2e/mod.rs b/wezterm-ssh/tests/e2e/mod.rs index 4ce980ac5..fc3e9b248 100644 --- a/wezterm-ssh/tests/e2e/mod.rs +++ b/wezterm-ssh/tests/e2e/mod.rs @@ -1 +1,2 @@ +mod agent_forward; mod sftp; diff --git a/wezterm-ssh/tests/e2e/sftp.rs b/wezterm-ssh/tests/e2e/sftp.rs index 957d6982d..2fa8745f6 100644 --- a/wezterm-ssh/tests/e2e/sftp.rs +++ b/wezterm-ssh/tests/e2e/sftp.rs @@ -21,825 +21,852 @@ fn file_type_to_str(file_type: FileType) -> &'static str { } #[rstest] -#[smol_potat::test] #[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] -async fn read_dir_should_return_list_of_directories_files_and_symlinks( +fn read_dir_should_return_list_of_directories_files_and_symlinks( #[future] session: SessionWithSshd, ) { - let session: SessionWithSshd = session.await; + smol::block_on(async { + let session: SessionWithSshd = session.await; - // $TEMP/dir1/ - // $TEMP/dir2/ - // $TEMP/file1 - // $TEMP/file2 - // $TEMP/dir-link -> $TEMP/dir1/ - // $TEMP/file-link -> $TEMP/file1 - let temp = TempDir::new().unwrap(); - let dir1 = temp.child("dir1"); - dir1.create_dir_all().unwrap(); - let dir2 = temp.child("dir2"); - dir2.create_dir_all().unwrap(); - let file1 = temp.child("file1"); - file1.touch().unwrap(); - let file2 = temp.child("file2"); - file2.touch().unwrap(); - let link_dir = temp.child("link-dir"); - link_dir.symlink_to_dir(dir1.path()).unwrap(); - let link_file = temp.child("link-file"); - link_file.symlink_to_file(file1.path()).unwrap(); + // $TEMP/dir1/ + // $TEMP/dir2/ + // $TEMP/file1 + // $TEMP/file2 + // $TEMP/dir-link -> $TEMP/dir1/ + // $TEMP/file-link -> $TEMP/file1 + let temp = TempDir::new().unwrap(); + let dir1 = temp.child("dir1"); + dir1.create_dir_all().unwrap(); + let dir2 = temp.child("dir2"); + dir2.create_dir_all().unwrap(); + let file1 = temp.child("file1"); + file1.touch().unwrap(); + let file2 = temp.child("file2"); + file2.touch().unwrap(); + let link_dir = temp.child("link-dir"); + link_dir.symlink_to_dir(dir1.path()).unwrap(); + let link_file = temp.child("link-file"); + link_file.symlink_to_file(file1.path()).unwrap(); - let mut contents = session - .sftp() - .read_dir(temp.path().to_path_buf()) - .await - .expect("Failed to read directory") - .into_iter() - .map(|(p, s)| (p, file_type_to_str(s.ty))) - .collect::>(); - contents.sort_unstable_by_key(|(p, _)| p.to_path_buf()); + let mut contents = session + .sftp() + .read_dir(temp.path().to_path_buf()) + .await + .expect("Failed to read directory") + .into_iter() + .map(|(p, s)| (p, file_type_to_str(s.ty))) + .collect::>(); + contents.sort_unstable_by_key(|(p, _)| p.to_path_buf()); - assert_eq!( - contents, - vec![ - (dir1.path().to_path_buf().try_into().unwrap(), "dir"), - (dir2.path().to_path_buf().try_into().unwrap(), "dir"), - (file1.path().to_path_buf().try_into().unwrap(), "file"), - (file2.path().to_path_buf().try_into().unwrap(), "file"), - (link_dir.path().to_path_buf().try_into().unwrap(), "symlink"), - ( - link_file.path().to_path_buf().try_into().unwrap(), - "symlink" + assert_eq!( + contents, + vec![ + (dir1.path().to_path_buf().try_into().unwrap(), "dir"), + (dir2.path().to_path_buf().try_into().unwrap(), "dir"), + (file1.path().to_path_buf().try_into().unwrap(), "file"), + (file2.path().to_path_buf().try_into().unwrap(), "file"), + (link_dir.path().to_path_buf().try_into().unwrap(), "symlink"), + ( + link_file.path().to_path_buf().try_into().unwrap(), + "symlink" + ), + ] + ); + }) +} + +#[rstest] +#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] +fn create_dir_should_create_a_directory_on_the_remote_filesystem( + #[future] session: SessionWithSshd, +) { + smol::block_on(async { + let session: SessionWithSshd = session.await; + + let temp = TempDir::new().unwrap(); + + session + .sftp() + .create_dir(temp.child("dir").path().to_path_buf(), 0o644) + .await + .expect("Failed to create directory"); + + // Verify the path exists and is to a directory + temp.child("dir").assert(predicate::path::is_dir()); + }) +} + +#[rstest] +#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] +fn create_dir_should_return_error_if_unable_to_create_directory( + #[future] session: SessionWithSshd, +) { + smol::block_on(async { + let session: SessionWithSshd = session.await; + + let temp = TempDir::new().unwrap(); + + // Attempt to create a nested directory structure, which is not supported + let result = session + .sftp() + .create_dir(temp.child("dir").child("dir").path().to_path_buf(), 0o644) + .await; + assert!( + result.is_err(), + "Unexpectedly succeeded in creating directory: {:?}", + result + ); + + // Verify the path is not a directory + temp.child("dir") + .child("dir") + .assert(predicate::path::is_dir().not()); + temp.child("dir").assert(predicate::path::is_dir().not()); + }) +} + +#[rstest] +#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] +fn remove_dir_should_remove_a_remote_directory(#[future] session: SessionWithSshd) { + smol::block_on(async { + let session: SessionWithSshd = session.await; + + let temp = TempDir::new().unwrap(); + + // Removing an empty directory should succeed + let dir = temp.child("dir"); + dir.create_dir_all().unwrap(); + session + .sftp() + .remove_dir(dir.path().to_path_buf()) + .await + .expect("Failed to remove directory"); + + // Verify the directory no longer exists + dir.assert(predicate::path::is_dir().not()); + }) +} + +#[rstest] +#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] +fn remove_dir_should_return_an_error_if_failed_to_remove_directory( + #[future] session: SessionWithSshd, +) { + smol::block_on(async { + let session: SessionWithSshd = session.await; + + let temp = TempDir::new().unwrap(); + + // Attempt to remove a missing path + let result = session + .sftp() + .remove_dir(temp.child("missing-dir").path().to_path_buf()) + .await; + assert!( + result.is_err(), + "Unexpectedly succeeded in removing missing directory: {:?}", + result + ); + + // Attempt to remove a non-empty directory + let dir = temp.child("dir"); + dir.create_dir_all().unwrap(); + dir.child("file").touch().unwrap(); + + let result = session.sftp().remove_dir(dir.path().to_path_buf()).await; + assert!( + result.is_err(), + "Unexpectedly succeeded in removing non-empty directory: {:?}", + result + ); + + // Verify the non-empty directory still exists + dir.assert(predicate::path::is_dir()); + + // Attempt to remove a file (not a directory) + let file = temp.child("file"); + file.touch().unwrap(); + let result = session.sftp().remove_dir(file.path().to_path_buf()).await; + assert!( + result.is_err(), + "Unexpectedly succeeded in removing file: {:?}", + result + ); + + // Verify the file still exists + file.assert(predicate::path::is_file()); + }) +} + +#[rstest] +#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] +fn metadata_should_return_metadata_about_a_file(#[future] session: SessionWithSshd) { + smol::block_on(async { + let session: SessionWithSshd = session.await; + + let temp = TempDir::new().unwrap(); + let file = temp.child("file"); + file.touch().unwrap(); + + let metadata = session + .sftp() + .metadata(file.path().to_path_buf()) + .await + .expect("Failed to get metadata for file"); + + // Verify that file metadata makes sense + assert!(metadata.is_file(), "Invalid file metadata returned"); + }) +} + +#[rstest] +#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] +fn metadata_should_return_metadata_about_a_directory(#[future] session: SessionWithSshd) { + smol::block_on(async { + let session: SessionWithSshd = session.await; + + let temp = TempDir::new().unwrap(); + let dir = temp.child("dir"); + dir.create_dir_all().unwrap(); + + let metadata = session + .sftp() + .metadata(dir.path().to_path_buf()) + .await + .expect("Failed to get metadata for dir"); + + // Verify that file metadata makes sense + assert!(metadata.is_dir(), "Invalid file metadata returned"); + }) +} + +#[rstest] +#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] +fn metadata_should_return_metadata_about_the_file_pointed_to_by_a_symlink( + #[future] session: SessionWithSshd, +) { + smol::block_on(async { + let session: SessionWithSshd = session.await; + + let temp = TempDir::new().unwrap(); + + let file = temp.child("file"); + file.touch().unwrap(); + let link = temp.child("link"); + link.symlink_to_file(file.path()).unwrap(); + + let metadata = session + .sftp() + .metadata(link.path().to_path_buf()) + .await + .expect("Failed to get metadata for symlink"); + + // Verify that file metadata makes sense + assert!(metadata.is_file(), "Invalid file metadata returned"); + assert!(metadata.ty.is_file(), "Invalid file metadata returned"); + assert!(!metadata.ty.is_symlink(), "Invalid file metadata returned"); + }) +} + +#[rstest] +#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] +fn metadata_should_return_metadata_about_the_dir_pointed_to_by_a_symlink( + #[future] session: SessionWithSshd, +) { + smol::block_on(async { + let session: SessionWithSshd = session.await; + + let temp = TempDir::new().unwrap(); + + let dir = temp.child("dir"); + dir.create_dir_all().unwrap(); + let link = temp.child("link"); + link.symlink_to_dir(dir.path()).unwrap(); + + let metadata = session + .sftp() + .metadata(link.path().to_path_buf()) + .await + .expect("Failed to get metadata for symlink"); + + // Verify that file metadata makes sense + assert!(metadata.is_dir(), "Invalid file metadata returned"); + assert!(metadata.ty.is_dir(), "Invalid file metadata returned"); + assert!(!metadata.ty.is_symlink(), "Invalid file metadata returned"); + }) +} + +#[rstest] +#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] +fn metadata_should_fail_if_path_missing(#[future] session: SessionWithSshd) { + smol::block_on(async { + let session: SessionWithSshd = session.await; + + let temp = TempDir::new().unwrap(); + + let result = session + .sftp() + .metadata(temp.child("missing").path().to_path_buf()) + .await; + assert!( + result.is_err(), + "Metadata unexpectedly succeeded: {:?}", + result + ); + }) +} + +#[rstest] +#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] +fn symlink_metadata_should_return_metadata_about_a_file(#[future] session: SessionWithSshd) { + smol::block_on(async { + let session: SessionWithSshd = session.await; + + let temp = TempDir::new().unwrap(); + let file = temp.child("file"); + file.touch().unwrap(); + + let symlink_metadata = session + .sftp() + .symlink_metadata(file.path().to_path_buf()) + .await + .expect("Failed to get metadata for file"); + + // Verify that file metadata makes sense + assert!(symlink_metadata.is_file(), "Invalid file metadata returned"); + }) +} + +#[rstest] +#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] +fn symlink_metadata_should_return_metadata_about_a_directory(#[future] session: SessionWithSshd) { + smol::block_on(async { + let session: SessionWithSshd = session.await; + + let temp = TempDir::new().unwrap(); + let dir = temp.child("dir"); + dir.create_dir_all().unwrap(); + + let symlink_metadata = session + .sftp() + .symlink_metadata(dir.path().to_path_buf()) + .await + .expect("Failed to metadata for dir"); + + // Verify that file metadata makes sense + assert!(symlink_metadata.is_dir(), "Invalid file metadata returned"); + }) +} + +#[rstest] +#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] +fn symlink_metadata_should_return_metadata_about_symlink_pointing_to_a_file( + #[future] session: SessionWithSshd, +) { + smol::block_on(async { + let session: SessionWithSshd = session.await; + + let temp = TempDir::new().unwrap(); + + let file = temp.child("file"); + file.touch().unwrap(); + let link = temp.child("link"); + link.symlink_to_file(file.path()).unwrap(); + + let metadata = session + .sftp() + .symlink_metadata(link.path().to_path_buf()) + .await + .expect("Failed to get metadata for symlink"); + + // Verify that file metadata makes sense + assert!(!metadata.is_file(), "Invalid file metadata returned"); + assert!(!metadata.ty.is_file(), "Invalid file metadata returned"); + assert!(metadata.ty.is_symlink(), "Invalid file metadata returned"); + }) +} + +#[rstest] +#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] +fn symlink_metadata_should_return_metadata_about_symlink_pointing_to_a_directory( + #[future] session: SessionWithSshd, +) { + smol::block_on(async { + let session: SessionWithSshd = session.await; + + let temp = TempDir::new().unwrap(); + + let dir = temp.child("dir"); + dir.create_dir_all().unwrap(); + let link = temp.child("link"); + link.symlink_to_dir(dir.path()).unwrap(); + + let metadata = session + .sftp() + .symlink_metadata(link.path().to_path_buf()) + .await + .expect("Failed to get metadata for symlink"); + + // Verify that file metadata makes sense + assert!(!metadata.is_dir(), "Invalid file metadata returned"); + assert!(!metadata.ty.is_dir(), "Invalid file metadata returned"); + assert!(metadata.ty.is_symlink(), "Invalid file metadata returned"); + }) +} + +#[rstest] +#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] +fn symlink_metadata_should_fail_if_path_missing(#[future] session: SessionWithSshd) { + smol::block_on(async { + let session: SessionWithSshd = session.await; + + let temp = TempDir::new().unwrap(); + + let result = session + .sftp() + .symlink_metadata(temp.child("missing").path().to_path_buf()) + .await; + assert!( + result.is_err(), + "symlink_metadata unexpectedly succeeded: {:?}", + result + ); + }) +} + +#[rstest] +#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] +fn symlink_should_create_symlink_pointing_to_file(#[future] session: SessionWithSshd) { + smol::block_on(async { + let session: SessionWithSshd = session.await; + + let temp = TempDir::new().unwrap(); + let file = temp.child("file"); + file.touch().unwrap(); + + let link = temp.child("link"); + + session + .sftp() + .symlink(file.path().to_path_buf(), link.path().to_path_buf()) + .await + .expect("Failed to create symlink"); + + assert!( + std::fs::symlink_metadata(link.path()) + .unwrap() + .file_type() + .is_symlink(), + "Symlink is not a symlink!" + ); + + // TODO: This fails even though the type is a symlink: + // https://github.com/assert-rs/assert_fs/issues/70 + // link.assert(predicate::path::is_symlink()); + }) +} + +#[rstest] +#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] +fn symlink_should_create_symlink_pointing_to_directory(#[future] session: SessionWithSshd) { + smol::block_on(async { + let session: SessionWithSshd = session.await; + + let temp = TempDir::new().unwrap(); + let dir = temp.child("dir"); + dir.create_dir_all().unwrap(); + + let link = temp.child("link"); + + session + .sftp() + .symlink(dir.path().to_path_buf(), link.path().to_path_buf()) + .await + .expect("Failed to create symlink"); + + link.assert(predicate::path::is_symlink()); + }) +} + +#[rstest] +#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] +fn symlink_should_succeed_even_if_path_missing(#[future] session: SessionWithSshd) { + smol::block_on(async { + let session: SessionWithSshd = session.await; + + let temp = TempDir::new().unwrap(); + let file = temp.child("file"); + + let link = temp.child("link"); + + session + .sftp() + .symlink(file.path().to_path_buf(), link.path().to_path_buf()) + .await + .expect("Failed to create symlink"); + + link.assert(predicate::path::is_symlink()); + }) +} + +#[rstest] +#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] +fn read_link_should_return_the_target_of_the_symlink(#[future] session: SessionWithSshd) { + smol::block_on(async { + let session: SessionWithSshd = session.await; + + let temp = TempDir::new().unwrap(); + + // Test a symlink to a directory + let dir = temp.child("dir"); + dir.create_dir_all().unwrap(); + let link = temp.child("link"); + link.symlink_to_dir(dir.path()).unwrap(); + + let path = session + .sftp() + .read_link(link.path().to_path_buf()) + .await + .expect("Failed to read symlink"); + assert_eq!(path, dir.path()); + + // Test a symlink to a file + let file = temp.child("file"); + file.touch().unwrap(); + let link = temp.child("link2"); + link.symlink_to_file(file.path()).unwrap(); + + let path = session + .sftp() + .read_link(link.path().to_path_buf()) + .await + .expect("Failed to read symlink"); + assert_eq!(path, file.path()); + }) +} + +#[rstest] +#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] +fn read_link_should_fail_if_path_is_not_a_symlink(#[future] session: SessionWithSshd) { + smol::block_on(async { + let session: SessionWithSshd = session.await; + + let temp = TempDir::new().unwrap(); + + // Test missing path + let result = session + .sftp() + .read_link(temp.child("missing").path().to_path_buf()) + .await; + assert!( + result.is_err(), + "Unexpectedly read link for missing path: {:?}", + result + ); + + // Test a directory + let dir = temp.child("dir"); + dir.create_dir_all().unwrap(); + let result = session.sftp().read_link(dir.path().to_path_buf()).await; + assert!( + result.is_err(), + "Unexpectedly read link for directory: {:?}", + result + ); + + // Test a file + let file = temp.child("file"); + file.touch().unwrap(); + let result = session.sftp().read_link(file.path().to_path_buf()).await; + assert!( + result.is_err(), + "Unexpectedly read link for file: {:?}", + result + ); + }) +} + +#[rstest] +#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] +fn canonicalize_should_resolve_absolute_path_for_relative_path(#[future] session: SessionWithSshd) { + smol::block_on(async { + let session: SessionWithSshd = session.await; + + // For resolving parts of a path, all components must exist + let temp = TempDir::new().unwrap(); + temp.child("hello").create_dir_all().unwrap(); + temp.child("world").touch().unwrap(); + + let rel = temp.child(".").child("hello").child("..").child("world"); + + // NOTE: Because sftp realpath can still resolve symlinks within a missing path, there + // is no guarantee that the resulting path matches the missing path. In fact, + // on mac the /tmp dir is a symlink to /private/tmp; so, we cannot successfully + // check the accuracy of the path itself, meaning that we can only validate + // that the operation was okay. + let result = session.sftp().canonicalize(rel.path().to_path_buf()).await; + assert!( + result.is_ok(), + "Canonicalize unexpectedly failed: {:?}", + result + ); + }) +} + +#[rstest] +#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] +fn canonicalize_should_either_return_resolved_path_or_error_if_missing( + #[future] session: SessionWithSshd, +) { + smol::block_on(async { + let session: SessionWithSshd = session.await; + + let temp = TempDir::new().unwrap(); + let missing = temp.child("missing"); + + // NOTE: Because sftp realpath can still resolve symlinks within a missing path, there + // is no guarantee that the resulting path matches the missing path. In fact, + // on mac the /tmp dir is a symlink to /private/tmp; so, we cannot successfully + // check the accuracy of the path itself, meaning that we can only validate + // that the operation was okay. + // + // Additionally, this has divergent behavior. On some platforms, this returns + // the path as is whereas on others this returns a missing path error. We + // have to support both checks. + let result = session + .sftp() + .canonicalize(missing.path().to_path_buf()) + .await; + match result { + Ok(_) => {} + Err(SftpChannelError::Sftp(SftpError::NoSuchFile)) => {} + #[cfg(feature = "libssh-rs")] + Err(SftpChannelError::LibSsh(libssh_rs::Error::Sftp(_))) => {} + x => panic!( + "Unexpected result from canonicalize({}: {:?}", + missing.path().display(), + x ), - ] - ); + } + }) } #[rstest] -#[smol_potat::test] #[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] -async fn create_dir_should_create_a_directory_on_the_remote_filesystem( +fn canonicalize_should_fail_if_resolving_missing_path_with_dots( #[future] session: SessionWithSshd, ) { - let session: SessionWithSshd = session.await; + smol::block_on(async { + let session: SessionWithSshd = session.await; - let temp = TempDir::new().unwrap(); + let temp = TempDir::new().unwrap(); + let missing = temp.child(".").child("hello").child("..").child("world"); - session - .sftp() - .create_dir(temp.child("dir").path().to_path_buf(), 0o644) - .await - .expect("Failed to create directory"); - - // Verify the path exists and is to a directory - temp.child("dir").assert(predicate::path::is_dir()); + let result = session + .sftp() + .canonicalize(missing.path().to_path_buf()) + .await; + assert!(result.is_err(), "Canonicalize unexpectedly succeeded"); + }) } #[rstest] -#[smol_potat::test] #[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] -async fn create_dir_should_return_error_if_unable_to_create_directory( - #[future] session: SessionWithSshd, -) { - let session: SessionWithSshd = session.await; +fn rename_should_support_singular_file(#[future] session: SessionWithSshd) { + smol::block_on(async { + let session: SessionWithSshd = session.await; - let temp = TempDir::new().unwrap(); + let temp = TempDir::new().unwrap(); + let file = temp.child("file"); + file.write_str("some text").unwrap(); - // Attempt to create a nested directory structure, which is not supported - let result = session - .sftp() - .create_dir(temp.child("dir").child("dir").path().to_path_buf(), 0o644) - .await; - assert!( - result.is_err(), - "Unexpectedly succeeded in creating directory: {:?}", - result - ); + let dst = temp.child("dst"); - // Verify the path is not a directory - temp.child("dir") - .child("dir") - .assert(predicate::path::is_dir().not()); - temp.child("dir").assert(predicate::path::is_dir().not()); + session + .sftp() + .rename( + file.path().to_path_buf(), + dst.path().to_path_buf(), + Default::default(), + ) + .await + .expect("Failed to rename file"); + + // Verify that file was moved to destination + file.assert(predicate::path::missing()); + dst.assert("some text"); + }) } #[rstest] -#[smol_potat::test] #[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] -async fn remove_dir_should_remove_a_remote_directory(#[future] session: SessionWithSshd) { - let session: SessionWithSshd = session.await; +fn rename_should_support_dirtectory(#[future] session: SessionWithSshd) { + smol::block_on(async { + let session: SessionWithSshd = session.await; - let temp = TempDir::new().unwrap(); + let temp = TempDir::new().unwrap(); + let dir = temp.child("dir"); + dir.create_dir_all().unwrap(); + let dir_file = dir.child("file"); + dir_file.write_str("some text").unwrap(); + let dir_dir = dir.child("dir"); + dir_dir.create_dir_all().unwrap(); - // Removing an empty directory should succeed - let dir = temp.child("dir"); - dir.create_dir_all().unwrap(); - session - .sftp() - .remove_dir(dir.path().to_path_buf()) - .await - .expect("Failed to remove directory"); + let dst = temp.child("dst"); - // Verify the directory no longer exists - dir.assert(predicate::path::is_dir().not()); + session + .sftp() + .rename( + dir.path().to_path_buf(), + dst.path().to_path_buf(), + Default::default(), + ) + .await + .expect("Failed to rename directory"); + + // Verify that directory was moved to destination + dir.assert(predicate::path::missing()); + dir_file.assert(predicate::path::missing()); + dir_dir.assert(predicate::path::missing()); + + dst.assert(predicate::path::is_dir()); + dst.child("file").assert("some text"); + dst.child("dir").assert(predicate::path::is_dir()); + }) } #[rstest] -#[smol_potat::test] #[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] -async fn remove_dir_should_return_an_error_if_failed_to_remove_directory( - #[future] session: SessionWithSshd, -) { - let session: SessionWithSshd = session.await; +fn rename_should_fail_if_source_path_missing(#[future] session: SessionWithSshd) { + smol::block_on(async { + let session: SessionWithSshd = session.await; - let temp = TempDir::new().unwrap(); + let temp = TempDir::new().unwrap(); + let missing = temp.child("missing"); + let dst = temp.child("dst"); - // Attempt to remove a missing path - let result = session - .sftp() - .remove_dir(temp.child("missing-dir").path().to_path_buf()) - .await; - assert!( - result.is_err(), - "Unexpectedly succeeded in removing missing directory: {:?}", - result - ); - - // Attempt to remove a non-empty directory - let dir = temp.child("dir"); - dir.create_dir_all().unwrap(); - dir.child("file").touch().unwrap(); - - let result = session.sftp().remove_dir(dir.path().to_path_buf()).await; - assert!( - result.is_err(), - "Unexpectedly succeeded in removing non-empty directory: {:?}", - result - ); - - // Verify the non-empty directory still exists - dir.assert(predicate::path::is_dir()); - - // Attempt to remove a file (not a directory) - let file = temp.child("file"); - file.touch().unwrap(); - let result = session.sftp().remove_dir(file.path().to_path_buf()).await; - assert!( - result.is_err(), - "Unexpectedly succeeded in removing file: {:?}", - result - ); - - // Verify the file still exists - file.assert(predicate::path::is_file()); + let result = session + .sftp() + .rename( + missing.path().to_path_buf(), + dst.path().to_path_buf(), + Default::default(), + ) + .await; + assert!( + result.is_err(), + "Rename unexpectedly succeeded with missing path: {:?}", + result + ); + }) } #[rstest] -#[smol_potat::test] #[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] -async fn metadata_should_return_metadata_about_a_file(#[future] session: SessionWithSshd) { - let session: SessionWithSshd = session.await; +fn remove_file_should_remove_file(#[future] session: SessionWithSshd) { + smol::block_on(async { + let session: SessionWithSshd = session.await; - let temp = TempDir::new().unwrap(); - let file = temp.child("file"); - file.touch().unwrap(); + let temp = TempDir::new().unwrap(); + let file = temp.child("file"); + file.touch().unwrap(); - let metadata = session - .sftp() - .metadata(file.path().to_path_buf()) - .await - .expect("Failed to get metadata for file"); + session + .sftp() + .remove_file(file.path().to_path_buf()) + .await + .expect("Failed to remove file"); - // Verify that file metadata makes sense - assert!(metadata.is_file(), "Invalid file metadata returned"); + file.assert(predicate::path::missing()); + }) } #[rstest] -#[smol_potat::test] #[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] -async fn metadata_should_return_metadata_about_a_directory(#[future] session: SessionWithSshd) { - let session: SessionWithSshd = session.await; +fn remove_file_should_remove_symlink_to_file(#[future] session: SessionWithSshd) { + smol::block_on(async { + let session: SessionWithSshd = session.await; - let temp = TempDir::new().unwrap(); - let dir = temp.child("dir"); - dir.create_dir_all().unwrap(); + let temp = TempDir::new().unwrap(); + let file = temp.child("file"); + file.touch().unwrap(); + let link = temp.child("link"); + link.symlink_to_file(file.path()).unwrap(); - let metadata = session - .sftp() - .metadata(dir.path().to_path_buf()) - .await - .expect("Failed to get metadata for dir"); + session + .sftp() + .remove_file(link.path().to_path_buf()) + .await + .expect("Failed to remove symlink"); - // Verify that file metadata makes sense - assert!(metadata.is_dir(), "Invalid file metadata returned"); + // Verify link removed but file still exists + link.assert(predicate::path::missing()); + file.assert(predicate::path::is_file()); + }) } #[rstest] -#[smol_potat::test] #[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] -async fn metadata_should_return_metadata_about_the_file_pointed_to_by_a_symlink( - #[future] session: SessionWithSshd, -) { - let session: SessionWithSshd = session.await; +fn remove_file_should_remove_symlink_to_directory(#[future] session: SessionWithSshd) { + smol::block_on(async { + let session: SessionWithSshd = session.await; - let temp = TempDir::new().unwrap(); + let temp = TempDir::new().unwrap(); + let dir = temp.child("dir"); + dir.create_dir_all().unwrap(); + let link = temp.child("link"); + link.symlink_to_dir(dir.path()).unwrap(); - let file = temp.child("file"); - file.touch().unwrap(); - let link = temp.child("link"); - link.symlink_to_file(file.path()).unwrap(); + session + .sftp() + .remove_file(link.path().to_path_buf()) + .await + .expect("Failed to remove symlink"); - let metadata = session - .sftp() - .metadata(link.path().to_path_buf()) - .await - .expect("Failed to get metadata for symlink"); - - // Verify that file metadata makes sense - assert!(metadata.is_file(), "Invalid file metadata returned"); - assert!(metadata.ty.is_file(), "Invalid file metadata returned"); - assert!(!metadata.ty.is_symlink(), "Invalid file metadata returned"); + // Verify link removed but directory still exists + link.assert(predicate::path::missing()); + dir.assert(predicate::path::is_dir()); + }) } #[rstest] -#[smol_potat::test] #[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] -async fn metadata_should_return_metadata_about_the_dir_pointed_to_by_a_symlink( - #[future] session: SessionWithSshd, -) { - let session: SessionWithSshd = session.await; +fn remove_file_should_fail_if_path_to_directory(#[future] session: SessionWithSshd) { + smol::block_on(async { + let session: SessionWithSshd = session.await; - let temp = TempDir::new().unwrap(); + let temp = TempDir::new().unwrap(); + let dir = temp.child("dir"); + dir.create_dir_all().unwrap(); - let dir = temp.child("dir"); - dir.create_dir_all().unwrap(); - let link = temp.child("link"); - link.symlink_to_dir(dir.path()).unwrap(); + let result = session.sftp().remove_file(dir.path().to_path_buf()).await; + assert!( + result.is_err(), + "Unexpectedly removed directory: {:?}", + result + ); - let metadata = session - .sftp() - .metadata(link.path().to_path_buf()) - .await - .expect("Failed to get metadata for symlink"); - - // Verify that file metadata makes sense - assert!(metadata.is_dir(), "Invalid file metadata returned"); - assert!(metadata.ty.is_dir(), "Invalid file metadata returned"); - assert!(!metadata.ty.is_symlink(), "Invalid file metadata returned"); + // Verify directory still here + dir.assert(predicate::path::is_dir()); + }) } #[rstest] -#[smol_potat::test] #[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] -async fn metadata_should_fail_if_path_missing(#[future] session: SessionWithSshd) { - let session: SessionWithSshd = session.await; +fn remove_file_should_fail_if_path_missing(#[future] session: SessionWithSshd) { + smol::block_on(async { + let session: SessionWithSshd = session.await; - let temp = TempDir::new().unwrap(); + let temp = TempDir::new().unwrap(); - let result = session - .sftp() - .metadata(temp.child("missing").path().to_path_buf()) - .await; - assert!( - result.is_err(), - "Metadata unexpectedly succeeded: {:?}", - result - ); -} - -#[rstest] -#[smol_potat::test] -#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] -async fn symlink_metadata_should_return_metadata_about_a_file(#[future] session: SessionWithSshd) { - let session: SessionWithSshd = session.await; - - let temp = TempDir::new().unwrap(); - let file = temp.child("file"); - file.touch().unwrap(); - - let symlink_metadata = session - .sftp() - .symlink_metadata(file.path().to_path_buf()) - .await - .expect("Failed to get metadata for file"); - - // Verify that file metadata makes sense - assert!(symlink_metadata.is_file(), "Invalid file metadata returned"); -} - -#[rstest] -#[smol_potat::test] -#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] -async fn symlink_metadata_should_return_metadata_about_a_directory( - #[future] session: SessionWithSshd, -) { - let session: SessionWithSshd = session.await; - - let temp = TempDir::new().unwrap(); - let dir = temp.child("dir"); - dir.create_dir_all().unwrap(); - - let symlink_metadata = session - .sftp() - .symlink_metadata(dir.path().to_path_buf()) - .await - .expect("Failed to metadata for dir"); - - // Verify that file metadata makes sense - assert!(symlink_metadata.is_dir(), "Invalid file metadata returned"); -} - -#[rstest] -#[smol_potat::test] -#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] -async fn symlink_metadata_should_return_metadata_about_symlink_pointing_to_a_file( - #[future] session: SessionWithSshd, -) { - let session: SessionWithSshd = session.await; - - let temp = TempDir::new().unwrap(); - - let file = temp.child("file"); - file.touch().unwrap(); - let link = temp.child("link"); - link.symlink_to_file(file.path()).unwrap(); - - let metadata = session - .sftp() - .symlink_metadata(link.path().to_path_buf()) - .await - .expect("Failed to get metadata for symlink"); - - // Verify that file metadata makes sense - assert!(!metadata.is_file(), "Invalid file metadata returned"); - assert!(!metadata.ty.is_file(), "Invalid file metadata returned"); - assert!(metadata.ty.is_symlink(), "Invalid file metadata returned"); -} - -#[rstest] -#[smol_potat::test] -#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] -async fn symlink_metadata_should_return_metadata_about_symlink_pointing_to_a_directory( - #[future] session: SessionWithSshd, -) { - let session: SessionWithSshd = session.await; - - let temp = TempDir::new().unwrap(); - - let dir = temp.child("dir"); - dir.create_dir_all().unwrap(); - let link = temp.child("link"); - link.symlink_to_dir(dir.path()).unwrap(); - - let metadata = session - .sftp() - .symlink_metadata(link.path().to_path_buf()) - .await - .expect("Failed to get metadata for symlink"); - - // Verify that file metadata makes sense - assert!(!metadata.is_dir(), "Invalid file metadata returned"); - assert!(!metadata.ty.is_dir(), "Invalid file metadata returned"); - assert!(metadata.ty.is_symlink(), "Invalid file metadata returned"); -} - -#[rstest] -#[smol_potat::test] -#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] -async fn symlink_metadata_should_fail_if_path_missing(#[future] session: SessionWithSshd) { - let session: SessionWithSshd = session.await; - - let temp = TempDir::new().unwrap(); - - let result = session - .sftp() - .symlink_metadata(temp.child("missing").path().to_path_buf()) - .await; - assert!( - result.is_err(), - "symlink_metadata unexpectedly succeeded: {:?}", - result - ); -} - -#[rstest] -#[smol_potat::test] -#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] -async fn symlink_should_create_symlink_pointing_to_file(#[future] session: SessionWithSshd) { - let session: SessionWithSshd = session.await; - - let temp = TempDir::new().unwrap(); - let file = temp.child("file"); - file.touch().unwrap(); - - let link = temp.child("link"); - - session - .sftp() - .symlink(file.path().to_path_buf(), link.path().to_path_buf()) - .await - .expect("Failed to create symlink"); - - assert!( - std::fs::symlink_metadata(link.path()) - .unwrap() - .file_type() - .is_symlink(), - "Symlink is not a symlink!" - ); - - // TODO: This fails even though the type is a symlink: - // https://github.com/assert-rs/assert_fs/issues/70 - // link.assert(predicate::path::is_symlink()); -} - -#[rstest] -#[smol_potat::test] -#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] -async fn symlink_should_create_symlink_pointing_to_directory(#[future] session: SessionWithSshd) { - let session: SessionWithSshd = session.await; - - let temp = TempDir::new().unwrap(); - let dir = temp.child("dir"); - dir.create_dir_all().unwrap(); - - let link = temp.child("link"); - - session - .sftp() - .symlink(dir.path().to_path_buf(), link.path().to_path_buf()) - .await - .expect("Failed to create symlink"); - - link.assert(predicate::path::is_symlink()); -} - -#[rstest] -#[smol_potat::test] -#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] -async fn symlink_should_succeed_even_if_path_missing(#[future] session: SessionWithSshd) { - let session: SessionWithSshd = session.await; - - let temp = TempDir::new().unwrap(); - let file = temp.child("file"); - - let link = temp.child("link"); - - session - .sftp() - .symlink(file.path().to_path_buf(), link.path().to_path_buf()) - .await - .expect("Failed to create symlink"); - - link.assert(predicate::path::is_symlink()); -} - -#[rstest] -#[smol_potat::test] -#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] -async fn read_link_should_return_the_target_of_the_symlink(#[future] session: SessionWithSshd) { - let session: SessionWithSshd = session.await; - - let temp = TempDir::new().unwrap(); - - // Test a symlink to a directory - let dir = temp.child("dir"); - dir.create_dir_all().unwrap(); - let link = temp.child("link"); - link.symlink_to_dir(dir.path()).unwrap(); - - let path = session - .sftp() - .read_link(link.path().to_path_buf()) - .await - .expect("Failed to read symlink"); - assert_eq!(path, dir.path()); - - // Test a symlink to a file - let file = temp.child("file"); - file.touch().unwrap(); - let link = temp.child("link2"); - link.symlink_to_file(file.path()).unwrap(); - - let path = session - .sftp() - .read_link(link.path().to_path_buf()) - .await - .expect("Failed to read symlink"); - assert_eq!(path, file.path()); -} - -#[rstest] -#[smol_potat::test] -#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] -async fn read_link_should_fail_if_path_is_not_a_symlink(#[future] session: SessionWithSshd) { - let session: SessionWithSshd = session.await; - - let temp = TempDir::new().unwrap(); - - // Test missing path - let result = session - .sftp() - .read_link(temp.child("missing").path().to_path_buf()) - .await; - assert!( - result.is_err(), - "Unexpectedly read link for missing path: {:?}", - result - ); - - // Test a directory - let dir = temp.child("dir"); - dir.create_dir_all().unwrap(); - let result = session.sftp().read_link(dir.path().to_path_buf()).await; - assert!( - result.is_err(), - "Unexpectedly read link for directory: {:?}", - result - ); - - // Test a file - let file = temp.child("file"); - file.touch().unwrap(); - let result = session.sftp().read_link(file.path().to_path_buf()).await; - assert!( - result.is_err(), - "Unexpectedly read link for file: {:?}", - result - ); -} - -#[rstest] -#[smol_potat::test] -#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] -async fn canonicalize_should_resolve_absolute_path_for_relative_path( - #[future] session: SessionWithSshd, -) { - let session: SessionWithSshd = session.await; - - // For resolving parts of a path, all components must exist - let temp = TempDir::new().unwrap(); - temp.child("hello").create_dir_all().unwrap(); - temp.child("world").touch().unwrap(); - - let rel = temp.child(".").child("hello").child("..").child("world"); - - // NOTE: Because sftp realpath can still resolve symlinks within a missing path, there - // is no guarantee that the resulting path matches the missing path. In fact, - // on mac the /tmp dir is a symlink to /private/tmp; so, we cannot successfully - // check the accuracy of the path itself, meaning that we can only validate - // that the operation was okay. - let result = session.sftp().canonicalize(rel.path().to_path_buf()).await; - assert!( - result.is_ok(), - "Canonicalize unexpectedly failed: {:?}", - result - ); -} - -#[rstest] -#[smol_potat::test] -#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] -async fn canonicalize_should_either_return_resolved_path_or_error_if_missing( - #[future] session: SessionWithSshd, -) { - let session: SessionWithSshd = session.await; - - let temp = TempDir::new().unwrap(); - let missing = temp.child("missing"); - - // NOTE: Because sftp realpath can still resolve symlinks within a missing path, there - // is no guarantee that the resulting path matches the missing path. In fact, - // on mac the /tmp dir is a symlink to /private/tmp; so, we cannot successfully - // check the accuracy of the path itself, meaning that we can only validate - // that the operation was okay. - // - // Additionally, this has divergent behavior. On some platforms, this returns - // the path as is whereas on others this returns a missing path error. We - // have to support both checks. - let result = session - .sftp() - .canonicalize(missing.path().to_path_buf()) - .await; - match result { - Ok(_) => {} - Err(SftpChannelError::Sftp(SftpError::NoSuchFile)) => {} - #[cfg(feature = "libssh-rs")] - Err(SftpChannelError::LibSsh(libssh_rs::Error::Sftp(_))) => {} - x => panic!( - "Unexpected result from canonicalize({}: {:?}", - missing.path().display(), - x - ), - } -} - -#[rstest] -#[smol_potat::test] -#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] -async fn canonicalize_should_fail_if_resolving_missing_path_with_dots( - #[future] session: SessionWithSshd, -) { - let session: SessionWithSshd = session.await; - - let temp = TempDir::new().unwrap(); - let missing = temp.child(".").child("hello").child("..").child("world"); - - let result = session - .sftp() - .canonicalize(missing.path().to_path_buf()) - .await; - assert!(result.is_err(), "Canonicalize unexpectedly succeeded"); -} - -#[rstest] -#[smol_potat::test] -#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] -async fn rename_should_support_singular_file(#[future] session: SessionWithSshd) { - let session: SessionWithSshd = session.await; - - let temp = TempDir::new().unwrap(); - let file = temp.child("file"); - file.write_str("some text").unwrap(); - - let dst = temp.child("dst"); - - session - .sftp() - .rename( - file.path().to_path_buf(), - dst.path().to_path_buf(), - Default::default(), - ) - .await - .expect("Failed to rename file"); - - // Verify that file was moved to destination - file.assert(predicate::path::missing()); - dst.assert("some text"); -} - -#[rstest] -#[smol_potat::test] -#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] -async fn rename_should_support_dirtectory(#[future] session: SessionWithSshd) { - let session: SessionWithSshd = session.await; - - let temp = TempDir::new().unwrap(); - let dir = temp.child("dir"); - dir.create_dir_all().unwrap(); - let dir_file = dir.child("file"); - dir_file.write_str("some text").unwrap(); - let dir_dir = dir.child("dir"); - dir_dir.create_dir_all().unwrap(); - - let dst = temp.child("dst"); - - session - .sftp() - .rename( - dir.path().to_path_buf(), - dst.path().to_path_buf(), - Default::default(), - ) - .await - .expect("Failed to rename directory"); - - // Verify that directory was moved to destination - dir.assert(predicate::path::missing()); - dir_file.assert(predicate::path::missing()); - dir_dir.assert(predicate::path::missing()); - - dst.assert(predicate::path::is_dir()); - dst.child("file").assert("some text"); - dst.child("dir").assert(predicate::path::is_dir()); -} - -#[rstest] -#[smol_potat::test] -#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] -async fn rename_should_fail_if_source_path_missing(#[future] session: SessionWithSshd) { - let session: SessionWithSshd = session.await; - - let temp = TempDir::new().unwrap(); - let missing = temp.child("missing"); - let dst = temp.child("dst"); - - let result = session - .sftp() - .rename( - missing.path().to_path_buf(), - dst.path().to_path_buf(), - Default::default(), - ) - .await; - assert!( - result.is_err(), - "Rename unexpectedly succeeded with missing path: {:?}", - result - ); -} - -#[rstest] -#[smol_potat::test] -#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] -async fn remove_file_should_remove_file(#[future] session: SessionWithSshd) { - let session: SessionWithSshd = session.await; - - let temp = TempDir::new().unwrap(); - let file = temp.child("file"); - file.touch().unwrap(); - - session - .sftp() - .remove_file(file.path().to_path_buf()) - .await - .expect("Failed to remove file"); - - file.assert(predicate::path::missing()); -} - -#[rstest] -#[smol_potat::test] -#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] -async fn remove_file_should_remove_symlink_to_file(#[future] session: SessionWithSshd) { - let session: SessionWithSshd = session.await; - - let temp = TempDir::new().unwrap(); - let file = temp.child("file"); - file.touch().unwrap(); - let link = temp.child("link"); - link.symlink_to_file(file.path()).unwrap(); - - session - .sftp() - .remove_file(link.path().to_path_buf()) - .await - .expect("Failed to remove symlink"); - - // Verify link removed but file still exists - link.assert(predicate::path::missing()); - file.assert(predicate::path::is_file()); -} - -#[rstest] -#[smol_potat::test] -#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] -async fn remove_file_should_remove_symlink_to_directory(#[future] session: SessionWithSshd) { - let session: SessionWithSshd = session.await; - - let temp = TempDir::new().unwrap(); - let dir = temp.child("dir"); - dir.create_dir_all().unwrap(); - let link = temp.child("link"); - link.symlink_to_dir(dir.path()).unwrap(); - - session - .sftp() - .remove_file(link.path().to_path_buf()) - .await - .expect("Failed to remove symlink"); - - // Verify link removed but directory still exists - link.assert(predicate::path::missing()); - dir.assert(predicate::path::is_dir()); -} - -#[rstest] -#[smol_potat::test] -#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] -async fn remove_file_should_fail_if_path_to_directory(#[future] session: SessionWithSshd) { - let session: SessionWithSshd = session.await; - - let temp = TempDir::new().unwrap(); - let dir = temp.child("dir"); - dir.create_dir_all().unwrap(); - - let result = session.sftp().remove_file(dir.path().to_path_buf()).await; - assert!( - result.is_err(), - "Unexpectedly removed directory: {:?}", - result - ); - - // Verify directory still here - dir.assert(predicate::path::is_dir()); -} - -#[rstest] -#[smol_potat::test] -#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] -async fn remove_file_should_fail_if_path_missing(#[future] session: SessionWithSshd) { - let session: SessionWithSshd = session.await; - - let temp = TempDir::new().unwrap(); - - let result = session - .sftp() - .remove_file(temp.child("missing").path().to_path_buf()) - .await; - assert!( - result.is_err(), - "Unexpectedly removed missing path: {:?}", - result - ); + let result = session + .sftp() + .remove_file(temp.child("missing").path().to_path_buf()) + .await; + assert!( + result.is_err(), + "Unexpectedly removed missing path: {:?}", + result + ); + }) } diff --git a/wezterm-ssh/tests/e2e/sftp/file.rs b/wezterm-ssh/tests/e2e/sftp/file.rs index a7aa164af..8ccfb9c19 100644 --- a/wezterm-ssh/tests/e2e/sftp/file.rs +++ b/wezterm-ssh/tests/e2e/sftp/file.rs @@ -7,187 +7,193 @@ use std::convert::TryInto; use std::path::PathBuf; #[rstest] -#[smol_potat::test] #[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] -async fn metadata_should_retrieve_file_stat(#[future] session: SessionWithSshd) { - let session: SessionWithSshd = session.await; +fn metadata_should_retrieve_file_stat(#[future] session: SessionWithSshd) { + smol::block_on(async { + let session: SessionWithSshd = session.await; - let temp = TempDir::new().unwrap(); - let file = temp.child("test-file"); - file.touch().unwrap(); + let temp = TempDir::new().unwrap(); + let file = temp.child("test-file"); + file.touch().unwrap(); - let remote_file = session - .sftp() - .open(file.path().to_path_buf()) - .await - .expect("Failed to open remote file"); + let remote_file = session + .sftp() + .open(file.path().to_path_buf()) + .await + .expect("Failed to open remote file"); - let metadata = remote_file - .metadata() - .await - .expect("Failed to read file metadata"); + let metadata = remote_file + .metadata() + .await + .expect("Failed to read file metadata"); - // Verify that file stat makes sense - assert!(metadata.is_file(), "Invalid file metadata returned"); + // Verify that file stat makes sense + assert!(metadata.is_file(), "Invalid file metadata returned"); + }) } #[rstest] -#[smol_potat::test] #[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] -async fn read_dir_should_retrieve_next_dir_entry(#[future] session: SessionWithSshd) { - let session: SessionWithSshd = session.await; +fn read_dir_should_retrieve_next_dir_entry(#[future] session: SessionWithSshd) { + smol::block_on(async { + let session: SessionWithSshd = session.await; - let temp = TempDir::new().unwrap(); - let dir = temp.child("dir"); - dir.create_dir_all().unwrap(); - let file = temp.child("file"); - file.touch().unwrap(); - let link = temp.child("link"); - link.symlink_to_file(file.path()).unwrap(); + let temp = TempDir::new().unwrap(); + let dir = temp.child("dir"); + dir.create_dir_all().unwrap(); + let file = temp.child("file"); + file.touch().unwrap(); + let link = temp.child("link"); + link.symlink_to_file(file.path()).unwrap(); - let remote_dir = session - .sftp() - .open_dir(temp.path().to_path_buf()) - .await - .expect("Failed to open remote directory"); + let remote_dir = session + .sftp() + .open_dir(temp.path().to_path_buf()) + .await + .expect("Failed to open remote directory"); - // Collect all of the directory contents (. and .. are included) - let mut contents = Vec::new(); - while let Ok((path, metadata)) = remote_dir.read_dir().await { - let ft = metadata.ty; - contents.push(( - path, - if ft.is_dir() { - "dir" - } else if ft.is_file() { - "file" - } else { - "symlink" - }, - )); - } - contents.sort_unstable_by_key(|(p, _)| p.to_path_buf()); + // Collect all of the directory contents (. and .. are included) + let mut contents = Vec::new(); + while let Ok((path, metadata)) = remote_dir.read_dir().await { + let ft = metadata.ty; + contents.push(( + path, + if ft.is_dir() { + "dir" + } else if ft.is_file() { + "file" + } else { + "symlink" + }, + )); + } + contents.sort_unstable_by_key(|(p, _)| p.to_path_buf()); - assert_eq!( - contents, - vec![ - (PathBuf::from(".").try_into().unwrap(), "dir"), - (PathBuf::from("..").try_into().unwrap(), "dir"), - (PathBuf::from("dir").try_into().unwrap(), "dir"), - (PathBuf::from("file").try_into().unwrap(), "file"), - (PathBuf::from("link").try_into().unwrap(), "symlink"), - ] - ); + assert_eq!( + contents, + vec![ + (PathBuf::from(".").try_into().unwrap(), "dir"), + (PathBuf::from("..").try_into().unwrap(), "dir"), + (PathBuf::from("dir").try_into().unwrap(), "dir"), + (PathBuf::from("file").try_into().unwrap(), "file"), + (PathBuf::from("link").try_into().unwrap(), "symlink"), + ] + ); + }) } #[rstest] -#[smol_potat::test] #[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] -async fn should_support_async_reading(#[future] session: SessionWithSshd) { - let session: SessionWithSshd = session.await; +fn should_support_async_reading(#[future] session: SessionWithSshd) { + smol::block_on(async { + let session: SessionWithSshd = session.await; - let temp = TempDir::new().unwrap(); - let file = temp.child("test-file"); - file.write_str("some file contents").unwrap(); + let temp = TempDir::new().unwrap(); + let file = temp.child("test-file"); + file.write_str("some file contents").unwrap(); - let mut remote_file = session - .sftp() - .open(file.path().to_path_buf()) - .await - .expect("Failed to open remote file"); + let mut remote_file = session + .sftp() + .open(file.path().to_path_buf()) + .await + .expect("Failed to open remote file"); - let mut contents = String::new(); - remote_file - .read_to_string(&mut contents) - .await - .expect("Failed to read file to string"); + let mut contents = String::new(); + remote_file + .read_to_string(&mut contents) + .await + .expect("Failed to read file to string"); - assert_eq!(contents, "some file contents"); + assert_eq!(contents, "some file contents"); - // NOTE: Testing second time to ensure future is properly cleared - let mut contents = String::new(); - remote_file - .read_to_string(&mut contents) - .await - .expect("Failed to read file to string second time"); + // NOTE: Testing second time to ensure future is properly cleared + let mut contents = String::new(); + remote_file + .read_to_string(&mut contents) + .await + .expect("Failed to read file to string second time"); + }) } #[rstest] -#[smol_potat::test] #[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] -async fn should_support_async_writing(#[future] session: SessionWithSshd) { - let session: SessionWithSshd = session.await; +fn should_support_async_writing(#[future] session: SessionWithSshd) { + smol::block_on(async { + let session: SessionWithSshd = session.await; - let temp = TempDir::new().unwrap(); - let file = temp.child("test-file"); - file.write_str("some file contents").unwrap(); + let temp = TempDir::new().unwrap(); + let file = temp.child("test-file"); + file.write_str("some file contents").unwrap(); - let mut remote_file = session - .sftp() - .create(file.path().to_path_buf()) - .await - .expect("Failed to open remote file"); + let mut remote_file = session + .sftp() + .create(file.path().to_path_buf()) + .await + .expect("Failed to open remote file"); - remote_file - .write_all(b"new contents for file") - .await - .expect("Failed to write to file"); + remote_file + .write_all(b"new contents for file") + .await + .expect("Failed to write to file"); - file.assert("new contents for file"); + file.assert("new contents for file"); - // NOTE: Testing second time to ensure future is properly cleared - remote_file - .write_all(b"new contents for file") - .await - .expect("Failed to write to file second time"); + // NOTE: Testing second time to ensure future is properly cleared + remote_file + .write_all(b"new contents for file") + .await + .expect("Failed to write to file second time"); + }) } #[rstest] -#[smol_potat::test] #[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] -async fn should_support_async_flush(#[future] session: SessionWithSshd) { - let session: SessionWithSshd = session.await; +fn should_support_async_flush(#[future] session: SessionWithSshd) { + smol::block_on(async { + let session: SessionWithSshd = session.await; - let temp = TempDir::new().unwrap(); - let file = temp.child("test-file"); - file.write_str("some file contents").unwrap(); + let temp = TempDir::new().unwrap(); + let file = temp.child("test-file"); + file.write_str("some file contents").unwrap(); - let mut remote_file = session - .sftp() - .create(file.path().to_path_buf()) - .await - .expect("Failed to open remote file"); + let mut remote_file = session + .sftp() + .create(file.path().to_path_buf()) + .await + .expect("Failed to open remote file"); - remote_file.flush().await.expect("Failed to flush file"); + remote_file.flush().await.expect("Failed to flush file"); - // NOTE: Testing second time to ensure future is properly cleared - remote_file - .flush() - .await - .expect("Failed to flush file second time"); + // NOTE: Testing second time to ensure future is properly cleared + remote_file + .flush() + .await + .expect("Failed to flush file second time"); + }) } #[rstest] -#[smol_potat::test] #[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] -async fn should_support_async_close(#[future] session: SessionWithSshd) { - let session: SessionWithSshd = session.await; +fn should_support_async_close(#[future] session: SessionWithSshd) { + smol::block_on(async { + let session: SessionWithSshd = session.await; - let temp = TempDir::new().unwrap(); - let file = temp.child("test-file"); - file.write_str("some file contents").unwrap(); + let temp = TempDir::new().unwrap(); + let file = temp.child("test-file"); + file.write_str("some file contents").unwrap(); - let mut remote_file = session - .sftp() - .create(file.path().to_path_buf()) - .await - .expect("Failed to open remote file"); + let mut remote_file = session + .sftp() + .create(file.path().to_path_buf()) + .await + .expect("Failed to open remote file"); - remote_file.close().await.expect("Failed to close file"); + remote_file.close().await.expect("Failed to close file"); - // NOTE: Testing second time to ensure future is properly cleared - remote_file - .close() - .await - .expect("Failed to close file second time"); + // NOTE: Testing second time to ensure future is properly cleared + remote_file + .close() + .await + .expect("Failed to close file second time"); + }) } diff --git a/wezterm-ssh/tests/sshd.rs b/wezterm-ssh/tests/sshd.rs index e485c6736..619f78417 100644 --- a/wezterm-ssh/tests/sshd.rs +++ b/wezterm-ssh/tests/sshd.rs @@ -431,10 +431,9 @@ impl std::ops::DerefMut for SessionWithSshd { #[fixture] /// Stand up an sshd instance and then connect to it and perform authentication -pub async fn session(sshd: Sshd) -> SessionWithSshd { +pub async fn session(#[default(Config::new())] mut config: Config, sshd: Sshd) -> SessionWithSshd { let port = sshd.port; - let mut config = Config::new(); config.add_default_config_files(); // Load our config to point to ourselves, using current sshd instance's port, diff --git a/wezterm-toast-notification/Cargo.toml b/wezterm-toast-notification/Cargo.toml index f6172885e..d6c5ffcea 100644 --- a/wezterm-toast-notification/Cargo.toml +++ b/wezterm-toast-notification/Cargo.toml @@ -4,6 +4,7 @@ version = "0.1.0" authors = ["Wez Furlong "] edition = "2018" build = "build.rs" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -13,14 +14,14 @@ log = "0.4" [target.'cfg(all(not(windows), not(target_os="macos")))'.dependencies] serde = {version="1.0", features = ["derive"]} -zbus = "3.14" -zvariant = "3.15" -async-io = "1.10" +zbus = "4.2" +zvariant = "4.0" +async-io = "2.3" futures-util = "0.3" [target.'cfg(target_os="macos")'.dependencies] -cocoa = "0.20" -core-foundation = "0.7" +cocoa = "0.25" +core-foundation = "0.9" objc = "0.2" [target.'cfg(windows)'.dependencies] diff --git a/wezterm-toast-notification/src/dbus.rs b/wezterm-toast-notification/src/dbus.rs index 2ae2a2afe..040f098d2 100644 --- a/wezterm-toast-notification/src/dbus.rs +++ b/wezterm-toast-notification/src/dbus.rs @@ -5,7 +5,7 @@ use crate::ToastNotification; use futures_util::stream::{abortable, StreamExt}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; -use zbus::dbus_proxy; +use zbus::proxy; use zvariant::{Type, Value}; #[derive(Debug, Type, Serialize, Deserialize)] @@ -23,7 +23,7 @@ pub struct ServerInformation { pub spec_version: String, } -#[dbus_proxy( +#[proxy( interface = "org.freedesktop.Notifications", default_service = "org.freedesktop.Notifications", default_path = "/org/freedesktop/Notifications" @@ -52,11 +52,11 @@ trait Notifications { expire_timeout: i32, ) -> zbus::Result; - #[dbus_proxy(signal)] - fn action_invoked(&self, nid: u32, action_key: String) -> Result<()>; + #[zbus(signal)] + fn action_invoked(&self, nid: u32, action_key: String) -> zbus::Result<()>; - #[dbus_proxy(signal)] - fn notification_closed(&self, nid: u32, reason: u32) -> Result<()>; + #[zbus(signal)] + fn notification_closed(&self, nid: u32, reason: u32) -> zbus::Result<()>; } /// Timeout/expiration was reached @@ -71,6 +71,7 @@ enum Reason { Expired, Dismissed, Closed, + #[allow(dead_code)] Unknown(u32), } diff --git a/wezterm-uds/Cargo.toml b/wezterm-uds/Cargo.toml new file mode 100644 index 000000000..688f684b2 --- /dev/null +++ b/wezterm-uds/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "wezterm-uds" +version = "0.1.0" +edition = "2021" +repository = "https://github.com/wez/wezterm" +description = "Portable unix domain sockets" +license = "MIT" +documentation = "https://docs.rs/wezterm-uds" + +[dependencies] +async-io = "2.3" +uds_windows = "1.1" diff --git a/wezterm-uds/src/lib.rs b/wezterm-uds/src/lib.rs new file mode 100644 index 000000000..01f8bdf3d --- /dev/null +++ b/wezterm-uds/src/lib.rs @@ -0,0 +1,147 @@ +use std::io::{Read, Write}; +#[cfg(unix)] +use std::os::fd::{AsFd, AsRawFd, BorrowedFd, FromRawFd, IntoRawFd, RawFd}; +#[cfg(unix)] +use std::os::unix::net::UnixStream as StreamImpl; +#[cfg(windows)] +use std::os::windows::io::{ + AsRawSocket, AsSocket, BorrowedSocket, FromRawSocket, IntoRawSocket, RawSocket, +}; +use std::path::Path; +#[cfg(windows)] +use uds_windows::UnixStream as StreamImpl; + +#[cfg(unix)] +use std::os::unix::net::UnixListener as ListenerImpl; +#[cfg(windows)] +use uds_windows::UnixListener as ListenerImpl; + +#[cfg(unix)] +use std::os::unix::net::SocketAddr; +#[cfg(windows)] +use uds_windows::SocketAddr; + +/// This wrapper makes UnixStream IoSafe on all platforms. +/// This isn't strictly needed on unix, because async-io +/// includes an impl for the std UnixStream, but on Windows +/// the uds_windows crate doesn't have an impl. +/// Here we define it for all platforms in the interest of +/// minimizing platform differences. +#[derive(Debug)] +pub struct UnixStream(StreamImpl); + +#[cfg(unix)] +impl AsFd for UnixStream { + fn as_fd(&self) -> BorrowedFd { + self.0.as_fd() + } +} +#[cfg(unix)] +impl IntoRawFd for UnixStream { + fn into_raw_fd(self) -> RawFd { + self.0.into_raw_fd() + } +} +#[cfg(unix)] +impl FromRawFd for UnixStream { + unsafe fn from_raw_fd(fd: RawFd) -> UnixStream { + UnixStream(StreamImpl::from_raw_fd(fd)) + } +} +#[cfg(unix)] +impl AsRawFd for UnixStream { + fn as_raw_fd(&self) -> RawFd { + self.0.as_raw_fd() + } +} + +#[cfg(windows)] +impl IntoRawSocket for UnixStream { + fn into_raw_socket(self) -> RawSocket { + self.0.into_raw_socket() + } +} +#[cfg(windows)] +impl AsRawSocket for UnixStream { + fn as_raw_socket(&self) -> RawSocket { + self.0.as_raw_socket() + } +} +#[cfg(windows)] +impl AsSocket for UnixStream { + fn as_socket(&self) -> BorrowedSocket { + self.0.as_socket() + } +} +#[cfg(windows)] +impl FromRawSocket for UnixStream { + unsafe fn from_raw_socket(socket: RawSocket) -> UnixStream { + UnixStream(StreamImpl::from_raw_socket(socket)) + } +} + +impl Read for UnixStream { + fn read(&mut self, buf: &mut [u8]) -> Result { + self.0.read(buf) + } +} + +impl Write for UnixStream { + fn write(&mut self, buf: &[u8]) -> Result { + self.0.write(buf) + } + fn flush(&mut self) -> Result<(), std::io::Error> { + self.0.flush() + } +} + +unsafe impl async_io::IoSafe for UnixStream {} + +impl UnixStream { + pub fn connect>(path: P) -> std::io::Result { + Ok(Self(StreamImpl::connect(path)?)) + } +} + +impl std::ops::Deref for UnixStream { + type Target = StreamImpl; + fn deref(&self) -> &StreamImpl { + &self.0 + } +} + +impl std::ops::DerefMut for UnixStream { + fn deref_mut(&mut self) -> &mut StreamImpl { + &mut self.0 + } +} + +pub struct UnixListener(ListenerImpl); + +impl UnixListener { + pub fn bind>(path: P) -> std::io::Result { + Ok(Self(ListenerImpl::bind(path)?)) + } + + pub fn accept(&self) -> std::io::Result<(UnixStream, SocketAddr)> { + let (stream, addr) = self.0.accept()?; + Ok((UnixStream(stream), addr)) + } + + pub fn incoming(&self) -> impl Iterator> + '_ { + self.0.incoming().map(|r| r.map(UnixStream)) + } +} + +impl std::ops::Deref for UnixListener { + type Target = ListenerImpl; + fn deref(&self) -> &ListenerImpl { + &self.0 + } +} + +impl std::ops::DerefMut for UnixListener { + fn deref_mut(&mut self) -> &mut ListenerImpl { + &mut self.0 + } +} diff --git a/wezterm-version/Cargo.toml b/wezterm-version/Cargo.toml index b588aede7..83d686a7a 100644 --- a/wezterm-version/Cargo.toml +++ b/wezterm-version/Cargo.toml @@ -3,6 +3,7 @@ name = "wezterm-version" version = "0.1.0" edition = "2021" build = "build.rs" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/wezterm/Cargo.toml b/wezterm/Cargo.toml index 27e608fdb..4ebe6d762 100644 --- a/wezterm/Cargo.toml +++ b/wezterm/Cargo.toml @@ -3,6 +3,7 @@ name = "wezterm" version = "0.1.0" authors = ["Wez Furlong "] edition = "2018" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -16,8 +17,9 @@ codec = { path = "../codec" } config = { path = "../config" } env-bootstrap = { path = "../env-bootstrap" } filedescriptor = { version="0.8", path = "../filedescriptor" } -hostname = "0.3" -image = "0.24.6" +hostname = "0.4" +humantime = "2.1" +image = "0.25" libc = "0.2" log = "0.4" mux = { path = "../mux" } @@ -26,7 +28,7 @@ promise = { path = "../promise" } serde = {version="1.0", features = ["derive"]} serde_json = "1.0" shell-words = "1.1" -smol = "1.2" +smol = "2.0" tabout = { path = "../tabout" } tempfile = "3.3" termwiz = { path = "../termwiz" } diff --git a/wezterm/src/asciicast.rs b/wezterm/src/asciicast.rs index 13c20defc..7cc05fcd9 100644 --- a/wezterm/src/asciicast.rs +++ b/wezterm/src/asciicast.rs @@ -161,8 +161,8 @@ mod win { let mut saved_output = 0; let saved_cp; unsafe { - GetConsoleMode(read.as_raw_file_descriptor(), &mut saved_input); - GetConsoleMode(write.as_raw_file_descriptor(), &mut saved_output); + GetConsoleMode(read.as_raw_file_descriptor() as *mut _, &mut saved_input); + GetConsoleMode(write.as_raw_file_descriptor() as *mut _, &mut saved_output); saved_cp = GetConsoleOutputCP(); SetConsoleOutputCP(CP_UTF8); } @@ -179,8 +179,8 @@ mod win { pub fn set_cooked(&mut self) -> anyhow::Result<()> { unsafe { SetConsoleOutputCP(self.saved_cp); - SetConsoleMode(self.read.as_raw_handle(), self.saved_input); - SetConsoleMode(self.write.as_raw_handle(), self.saved_output); + SetConsoleMode(self.read.as_raw_handle() as *mut _, self.saved_input); + SetConsoleMode(self.write.as_raw_handle() as *mut _, self.saved_output); } Ok(()) } @@ -188,11 +188,11 @@ mod win { pub fn set_raw(&mut self) -> anyhow::Result<()> { unsafe { SetConsoleMode( - self.read.as_raw_file_descriptor(), + self.read.as_raw_file_descriptor() as *mut _, ENABLE_VIRTUAL_TERMINAL_INPUT, ); SetConsoleMode( - self.write.as_raw_file_descriptor(), + self.write.as_raw_file_descriptor() as *mut _, ENABLE_PROCESSED_OUTPUT | ENABLE_WRAP_AT_EOL_OUTPUT | ENABLE_VIRTUAL_TERMINAL_PROCESSING @@ -626,6 +626,7 @@ impl PlayCommand { } } +#[allow(dead_code)] #[derive(Debug)] enum Summarized { Action(Action), diff --git a/wezterm/src/cli/list_clients.rs b/wezterm/src/cli/list_clients.rs index 4bf116ec0..5697d07f2 100644 --- a/wezterm/src/cli/list_clients.rs +++ b/wezterm/src/cli/list_clients.rs @@ -57,13 +57,30 @@ impl ListClientsCommand { name: "FOCUS".to_string(), alignment: Alignment::Right, }, + Column { + name: "SSH_AUTH_SOCK".to_string(), + alignment: Alignment::Left, + }, ]; let mut data = vec![]; let now: DateTime = Utc::now(); fn duration_string(d: chrono::Duration) -> String { if let Ok(d) = d.to_std() { - format!("{:?}", d) + // The default is full precision, which is a bit + // overwhelming (https://github.com/tailhook/humantime/issues/35). + // Let's auto-adjust this to be a bit more reasonable. + use std::time::Duration; + + let seconds = d.as_secs(); + let adjusted = if seconds >= 60 { + Duration::from_secs(seconds) + } else { + Duration::from_millis(d.as_millis() as u64) + }; + let mut formatted = humantime::format_duration(adjusted).to_string(); + formatted.retain(|c| c != ' '); + formatted } else { d.to_string() } @@ -82,6 +99,11 @@ impl ListClientsCommand { info.focused_pane_id .map(|id| id.to_string()) .unwrap_or_else(String::new), + info.client_id + .ssh_auth_sock + .as_deref() + .unwrap_or("") + .to_string(), ]); } @@ -105,6 +127,7 @@ struct CliListClientsResultItem { idle_time: std::time::Duration, workspace: String, focused_pane_id: Option, + ssh_auth_sock: Option, } impl From for CliListClientsResultItem { @@ -124,6 +147,7 @@ impl From for CliListClientsResultItem { username, hostname, pid, + ssh_auth_sock, .. } = client_id.as_ref(); @@ -139,7 +163,8 @@ impl From for CliListClientsResultItem { .unwrap_or(std::time::Duration::ZERO), idle_time: idle_time.to_std().unwrap_or(std::time::Duration::ZERO), workspace: active_workspace.as_deref().unwrap_or("").to_string(), - focused_pane_id: focused_pane_id, + focused_pane_id, + ssh_auth_sock: ssh_auth_sock.as_ref().map(|s| s.to_string()), } } } diff --git a/wezterm/src/cli/proxy.rs b/wezterm/src/cli/proxy.rs index c815fa1cb..cbdc5c967 100644 --- a/wezterm/src/cli/proxy.rs +++ b/wezterm/src/cli/proxy.rs @@ -1,26 +1,42 @@ use clap::Parser; +use codec::{Pdu, SetClientId}; use config::ConfigHandle; use mux::activity::Activity; +use mux::client::ClientId; use mux::Mux; use std::io::{Read, Write}; use std::sync::Arc; use wezterm_client::client::{unix_connect_with_retry, Client}; +use wezterm_client::domain::ClientDomainConfig; #[derive(Debug, Parser, Clone)] pub struct ProxyCommand {} impl ProxyCommand { - pub async fn run(&self, client: Client, config: &ConfigHandle) -> anyhow::Result<()> { + pub async fn run(&self, client: Client, _config: &ConfigHandle) -> anyhow::Result<()> { // The client object we created above will have spawned // the server if needed, so now all we need to do is turn // ourselves into basically netcat. - drop(client); + + // Extract the selected configuration from the client, + // closing it in the process + let ClientDomainConfig::Unix(unix_dom) = client.into_client_domain_config() else { + anyhow::bail!("expected client to have connected to a unix domain"); + }; let mux = Arc::new(mux::Mux::new(None)); Mux::set_mux(&mux); - let unix_dom = config.unix_domains.first().unwrap(); + let target = unix_dom.target(); - let stream = unix_connect_with_retry(&target, false, None)?; + let mut stream = unix_connect_with_retry(&target, false, None)?; + + let pdu = Pdu::SetClientId(SetClientId { + client_id: ClientId::new(), + is_proxy: true, + }); + let serial = 1; + pdu.encode(&mut stream, serial)?; + Pdu::decode(&mut stream)?; // Spawn a thread to pull data from the socket and write // it to stdout diff --git a/wezterm/src/main.rs b/wezterm/src/main.rs index 0fdb34348..b9732ba19 100644 --- a/wezterm/src/main.rs +++ b/wezterm/src/main.rs @@ -717,6 +717,9 @@ fn init_config(opts: &Opt) -> anyhow::Result { .context("config::common_init")?; let config = config::configuration(); config.update_ulimit()?; + if let Some(value) = &config.default_ssh_auth_sock { + std::env::set_var("SSH_AUTH_SOCK", value); + } Ok(config) } diff --git a/window/Cargo.toml b/window/Cargo.toml index b4598297b..77419bc2e 100644 --- a/window/Cargo.toml +++ b/window/Cargo.toml @@ -9,7 +9,7 @@ license = "MIT" build = "build.rs" [dev-dependencies] -k9 = "0.11.0" +k9 = "0.12.0" [build-dependencies] gl_generator = "0.14" @@ -18,9 +18,9 @@ gl_generator = "0.14" wayland = ["wayland-client", "smithay-client-toolkit", "wayland-egl", "wayland-protocols"] [dependencies] -async-channel = "1.6" -async-io = "1.1" -async-task = "4.0" +async-channel = "2.3" +async-io = "2.3" +async-task = "4.7" async-trait = "0.1" anyhow = "1.0" bytes = "1.0" @@ -31,10 +31,10 @@ bitflags = "1.3" euclid = "0.22" guillotiere = "0.6" lazy_static = "1.4" -libloading = "0.6" +libloading = "0.8" line_drawing = "0.8" log = "0.4" -metrics = { version="0.17", features=["std"]} +metrics = "0.22" promise = { path = "../promise" } raw-window-handle = "0.5" resize = "0.5" @@ -71,26 +71,26 @@ winreg = "0.10" dirs-next = "2.0" filedescriptor = { version="0.8", path = "../filedescriptor" } futures-util = "0.3" -futures-lite = "1.12" +futures-lite = "2.3" x11 = {version ="2.21", features = ["xlib_xcb", "xlib"]} xcb = {version="1.3", features=["render", "randr", "dri2", "xkb", "xlib_xcb", "present", "as-raw-xcb-connection"]} xkbcommon = { version = "0.7.0", features = ["x11", "wayland"] } mio = {version="0.8", features=["os-ext"]} libc = "0.2" -xcb-imdkit = { version="0.3", git="https://github.com/wez/xcb-imdkit-rs.git", rev="215ce4b08ac9c4822e541efd4f4ffb1062806051"} -zbus = "3.14" -zvariant = "3.15" +xcb-imdkit = { version="0.3", git="https://github.com/wez/xcb-imdkit-rs.git", rev="358e226573461fe540efb920e2aad740e3c6fab1"} +zbus = "4.2" +zvariant = "4.0" -smithay-client-toolkit = {version = "0.17.0", default-features=false, optional=true} -wayland-protocols = {version="0.30", optional=true} -wayland-client = {version="0.30", optional=true} -wayland-egl = {version="0.30", optional=true} +smithay-client-toolkit = {version = "0.18", default-features=false, optional=true} +wayland-protocols = {version="0.31", optional=true} +wayland-client = {version="0.31", optional=true} +wayland-egl = {version="0.32", optional=true} [target.'cfg(target_os="macos")'.dependencies] cocoa = "0.25" objc = "0.2" -core-foundation = "0.7" -core-graphics = "0.19" +core-foundation = "0.9" +core-graphics = "0.23" cgl = "0.3" plist = "1.3" shlex = "1.1" diff --git a/window/build.rs b/window/build.rs index ed754edba..9da20d064 100644 --- a/window/build.rs +++ b/window/build.rs @@ -8,7 +8,7 @@ fn main() { let dest = PathBuf::from(&env::var("OUT_DIR").unwrap()); let target = env::var("TARGET").unwrap(); - let mut file = File::create(&dest.join("egl_bindings.rs")).unwrap(); + let mut file = File::create(dest.join("egl_bindings.rs")).unwrap(); let reg = Registry::new( Api::Egl, (1, 5), @@ -43,13 +43,13 @@ fn main() { } if target.contains("windows") { - let mut file = File::create(&dest.join("wgl_bindings.rs")).unwrap(); + let mut file = File::create(dest.join("wgl_bindings.rs")).unwrap(); let reg = Registry::new(Api::Wgl, (1, 0), Profile::Core, Fallbacks::All, []); reg.write_bindings(gl_generator::StructGenerator, &mut file) .unwrap(); - let mut file = File::create(&dest.join("wgl_extra_bindings.rs")).unwrap(); + let mut file = File::create(dest.join("wgl_extra_bindings.rs")).unwrap(); Registry::new( Api::Wgl, (1, 0), diff --git a/window/examples/async.rs b/window/examples/async.rs index a42b5040c..419e7a200 100644 --- a/window/examples/async.rs +++ b/window/examples/async.rs @@ -85,6 +85,8 @@ impl MyWindow { | WindowEvent::FocusChanged(_) | WindowEvent::DraggedFile(_) | WindowEvent::DroppedFile(_) + | WindowEvent::DroppedUrl(_) + | WindowEvent::DroppedString(_) | WindowEvent::PerformKeyAssignment(_) | WindowEvent::MouseLeave | WindowEvent::SetInnerSizeCompleted => {} diff --git a/window/src/bitmaps/atlas.rs b/window/src/bitmaps/atlas.rs index 5bc2aaa9d..d8b37066a 100644 --- a/window/src/bitmaps/atlas.rs +++ b/window/src/bitmaps/atlas.rs @@ -107,7 +107,7 @@ impl Atlas { self.texture.write(rect, im); - metrics::histogram!("window.atlas.allocate.success.rate", 1.); + metrics::histogram!("window.atlas.allocate.success.rate").record(1.); Ok(Sprite { texture: Rc::clone(&self.texture), coords: rect, @@ -115,13 +115,13 @@ impl Atlas { } else { // It's not possible to satisfy that request let size = (reserve_width.max(reserve_height) as usize).next_power_of_two(); - metrics::histogram!("window.atlas.allocate.failure.rate", 1.); + metrics::histogram!("window.atlas.allocate.failure.rate").record(1.); Err(OutOfTextureSpace { size: Some((self.side * 2).max(size)), current_size: self.side, }) }; - metrics::histogram!("window.atlas.allocate.latency", start.elapsed()); + metrics::histogram!("window.atlas.allocate.latency").record(start.elapsed()); res } diff --git a/window/src/egl.rs b/window/src/egl.rs index 6986a0ca0..a353ac1a9 100644 --- a/window/src/egl.rs +++ b/window/src/egl.rs @@ -440,7 +440,7 @@ impl GlState { std::env::set_var("LIBGL_ALWAYS_SOFTWARE", "true"); } for path in &paths { - match libloading::Library::new(path) { + match unsafe { libloading::Library::new(path) } { Ok(lib) => match EglWrapper::load_egl(lib) { Ok(egl) => match func(egl) { Ok(result) => { diff --git a/window/src/lib.rs b/window/src/lib.rs index ac97cc1dc..29c670b32 100644 --- a/window/src/lib.rs +++ b/window/src/lib.rs @@ -7,6 +7,7 @@ use std::any::Any; use std::path::PathBuf; use std::rc::Rc; use thiserror::Error; +use url::Url; pub mod bitmaps; pub use wezterm_color_types as color; mod configuration; @@ -205,6 +206,12 @@ pub enum WindowEvent { // Called when the files are dropped into the window DroppedFile(Vec), + // Called when urls are dropped into the window + DroppedUrl(Vec), + + // Called when text is dropped into the window + DroppedString(String), + /// Called by menubar dispatching stuff on some systems PerformKeyAssignment(config::keyassignment::KeyAssignment), diff --git a/window/src/os/wayland/connection.rs b/window/src/os/wayland/connection.rs index f917bdfca..d657374b1 100644 --- a/window/src/os/wayland/connection.rs +++ b/window/src/os/wayland/connection.rs @@ -13,7 +13,7 @@ use wayland_client::{Connection as WConnection, EventQueue}; use crate::screen::{ScreenInfo, Screens}; use crate::spawn::SPAWN_QUEUE; -use crate::{Connection, ConnectionOps, ScreenRect}; +use crate::{Appearance, Connection, ConnectionOps, ScreenRect}; use super::state::WaylandState; use super::WaylandWindowInner; @@ -46,7 +46,11 @@ impl WaylandConnection { Ok(wayland_connection) } - pub(crate) fn advise_of_appearance_change(&self, _appearance: crate::Appearance) {} + pub(crate) fn advise_of_appearance_change(&self, appearance: crate::Appearance) { + for win in self.wayland_state.borrow().windows.borrow().values() { + win.borrow_mut().appearance_changed(appearance); + } + } fn run_message_loop_impl(&self) -> anyhow::Result<()> { const TOK_WL: usize = 0xffff_fffc; @@ -58,7 +62,7 @@ impl WaylandConnection { let mut events = Events::with_capacity(8); let wl_fd = { - let read_guard = self.event_queue.borrow().prepare_read()?; + let read_guard = self.event_queue.borrow().prepare_read().unwrap(); read_guard.connection_fd().as_raw_fd() }; @@ -100,7 +104,7 @@ impl WaylandConnection { continue; } - if let Ok(guard) = event_q.prepare_read() { + if let Some(guard) = event_q.prepare_read() { if let Err(err) = guard.read() { log::trace!("Event Q error: {:?}", err); if let WaylandError::Protocol(perr) = err { @@ -172,6 +176,18 @@ impl ConnectionOps for WaylandConnection { res } + fn get_appearance(&self) -> Appearance { + match promise::spawn::block_on(crate::os::xdg_desktop_portal::get_appearance()) { + Ok(Some(appearance)) => return appearance, + Ok(None) => {} + Err(err) => { + log::warn!("Unable to resolve appearance using xdg-desktop-portal: {err:#}"); + } + } + // fallback + Appearance::Light + } + fn screens(&self) -> anyhow::Result { log::trace!("Getting screens for wayland connection"); diff --git a/window/src/os/wayland/copy_and_paste.rs b/window/src/os/wayland/copy_and_paste.rs index ad83e462b..fce9b75e7 100644 --- a/window/src/os/wayland/copy_and_paste.rs +++ b/window/src/os/wayland/copy_and_paste.rs @@ -1,17 +1,14 @@ -use anyhow::{anyhow, Error, bail}; -use filedescriptor::{FileDescriptor, Pipe}; +use anyhow::{anyhow, bail}; use smithay_client_toolkit as toolkit; -use toolkit::globals::GlobalData; -use wayland_client::{Dispatch, event_created_child}; -use wayland_client::globals::{GlobalList, BindError}; -use wayland_protocols::wp::primary_selection::zv1::client::zwp_primary_selection_device_manager_v1::ZwpPrimarySelectionDeviceManagerV1; -use wayland_protocols::wp::primary_selection::zv1::client::zwp_primary_selection_device_v1::{ZwpPrimarySelectionDeviceV1, self, Event as PrimarySelectionDeviceEvent}; -use wayland_protocols::wp::primary_selection::zv1::client::zwp_primary_selection_offer_v1::{ZwpPrimarySelectionOfferV1, Event as PrimarySelectionOfferEvent}; -use wayland_protocols::wp::primary_selection::zv1::client::zwp_primary_selection_source_v1::{ZwpPrimarySelectionSourceV1, Event as PrimarySelectionSourceEvent}; use std::io::Write; -use std::os::fd::{AsRawFd, FromRawFd, IntoRawFd}; +use std::os::fd::AsRawFd; use std::sync::{Arc, Mutex}; -use toolkit::reexports::client::protocol::wl_data_offer::WlDataOffer; +use toolkit::data_device_manager::data_offer::SelectionOffer; +use toolkit::data_device_manager::{ReadPipe, WritePipe}; +use toolkit::primary_selection::device::PrimarySelectionDeviceHandler; +use toolkit::primary_selection::selection::PrimarySelectionSourceHandler; +use wayland_protocols::wp::primary_selection::zv1::client::zwp_primary_selection_device_v1::ZwpPrimarySelectionDeviceV1; +use wayland_protocols::wp::primary_selection::zv1::client::zwp_primary_selection_source_v1::ZwpPrimarySelectionSourceV1; use crate::{Clipboard, ConnectionOps}; @@ -20,7 +17,7 @@ use super::state::WaylandState; #[derive(Default)] pub struct CopyAndPaste { - data_offer: Option, + data_offer: Option, } impl std::fmt::Debug for CopyAndPaste { @@ -36,37 +33,31 @@ impl CopyAndPaste { Arc::new(Mutex::new(Default::default())) } - pub(super) fn get_clipboard_data( - &mut self, - clipboard: Clipboard, - ) -> anyhow::Result { + pub(super) fn get_clipboard_data(&mut self, clipboard: Clipboard) -> anyhow::Result { let conn = crate::Connection::get().unwrap().wayland(); let wayland_state = conn.wayland_state.borrow(); let primary_selection = if let Clipboard::PrimarySelection = clipboard { - wayland_state.primary_selection_manager.as_ref() + wayland_state.primary_selection_device.as_ref() } else { None }; match primary_selection { Some(primary_selection) => { - let inner = primary_selection.inner.lock().unwrap(); - let offer = inner - .offer - .as_ref() + let offer = primary_selection + .data() + .selection_offer() .ok_or_else(|| anyhow!("no primary selection offer"))?; - let pipe = Pipe::new().map_err(Error::msg)?; - offer.receive(TEXT_MIME_TYPE.to_string(), pipe.write.as_raw_fd()); - Ok(pipe.read) + let pipe = offer.receive(TEXT_MIME_TYPE.to_string())?; + Ok(pipe) } None => { let offer = self .data_offer .as_ref() .ok_or_else(|| anyhow!("no data offer"))?; - let pipe = Pipe::new().map_err(Error::msg)?; - offer.receive(TEXT_MIME_TYPE.to_string(), pipe.write.as_raw_fd()); - Ok(pipe.read) + let pipe = offer.receive(TEXT_MIME_TYPE.to_string())?; + Ok(pipe) } } } @@ -78,18 +69,16 @@ impl CopyAndPaste { let last_serial = *wayland_state.last_serial.borrow(); let primary_selection = if let Clipboard::PrimarySelection = clipboard { - wayland_state.primary_selection_manager.as_ref() + wayland_state.primary_selection_device.as_ref() } else { None }; match primary_selection { Some(primary_selection) => { - let manager = &primary_selection.manager; - let selection_device = wayland_state.primary_select_device.as_ref().unwrap(); - let source = manager.create_source(&qh, PrimarySelectionManagerData::default()); - source.offer(TEXT_MIME_TYPE.to_string()); - selection_device.set_selection(Some(&source), last_serial); + let manager = wayland_state.primary_selection_manager.as_ref().unwrap(); + let source = manager.create_selection_source(&qh, [TEXT_MIME_TYPE]); + source.set_selection(&primary_selection, last_serial); wayland_state .primary_selection_source .replace((source, data)); @@ -105,7 +94,7 @@ impl CopyAndPaste { } } - pub(super) fn confirm_selection(&mut self, offer: WlDataOffer) { + pub(super) fn confirm_selection(&mut self, offer: SelectionOffer) { self.data_offer.replace(offer); } } @@ -122,14 +111,22 @@ impl WaylandState { } } -pub(super) fn write_selection_to_pipe(fd: FileDescriptor, text: &str) { +pub(super) fn write_selection_to_pipe(fd: WritePipe, text: &str) { if let Err(e) = write_pipe_with_timeout(fd, text.as_bytes()) { log::error!("while sending primary selection to pipe: {}", e); } } -fn write_pipe_with_timeout(mut file: FileDescriptor, data: &[u8]) -> anyhow::Result<()> { - file.set_non_blocking(true)?; +fn write_pipe_with_timeout(mut file: WritePipe, data: &[u8]) -> anyhow::Result<()> { + // set non-blocking I/O on the pipe + // (adapted from FileDescriptor::set_non_blocking_impl in /filedescriptor/src/unix.rs) + if unsafe { libc::fcntl(file.as_raw_fd(), libc::F_SETFL, libc::O_NONBLOCK) } != 0 { + bail!( + "failed to change non-blocking mode: {}", + std::io::Error::last_os_error() + ) + } + let mut pfd = libc::pollfd { fd: file.as_raw_fd(), events: libc::POLLOUT, @@ -157,150 +154,45 @@ fn write_pipe_with_timeout(mut file: FileDescriptor, data: &[u8]) -> anyhow::Res Ok(()) } -// Smithay has their own primary selection handler in 0.18 -// Some code borrowed from https://github.com/Smithay/client-toolkit/commit/4a5c4f59f640bc588a55277261bbed1bd2abea98 -pub(super) struct PrimarySelectionManagerState { - pub(super) manager: ZwpPrimarySelectionDeviceManagerV1, - inner: Mutex, -} - -#[derive(Default, Debug)] -struct PrimaryInner { - pending_offer: Option, - offer: Option, - valid_mime: bool, -} - -#[derive(Default)] -pub(super) struct PrimarySelectionManagerData {} - -impl PrimarySelectionManagerState { - pub(super) fn bind( - globals: &GlobalList, - queue_handle: &wayland_client::QueueHandle, - ) -> Result { - let manager = globals.bind(queue_handle, 1..=1, GlobalData)?; - Ok(Self { - manager, - inner: Mutex::new(PrimaryInner::default()), - }) - } -} - -impl Dispatch - for PrimarySelectionManagerState -{ - fn event( - _state: &mut WaylandState, - _proxy: &ZwpPrimarySelectionDeviceManagerV1, - _event: ::Event, - _data: &GlobalData, +impl PrimarySelectionDeviceHandler for WaylandState { + fn selection( + &mut self, _conn: &wayland_client::Connection, - _qhandle: &wayland_client::QueueHandle, - ) { - unreachable!("primary selection manager has no events"); - } -} - -impl Dispatch - for PrimarySelectionManagerState -{ - fn event( - state: &mut WaylandState, - source: &ZwpPrimarySelectionSourceV1, - event: ::Event, - _data: &PrimarySelectionManagerData, - _conn: &wayland_client::Connection, - _qhandle: &wayland_client::QueueHandle, - ) { - match event { - PrimarySelectionSourceEvent::Send { mime_type, fd } => { - if mime_type != TEXT_MIME_TYPE { - return; - }; - - if let Some((ps_source, data)) = &state.primary_selection_source { - if ps_source != source { - return; - } - let fd = unsafe { FileDescriptor::from_raw_fd(fd.into_raw_fd()) }; - write_selection_to_pipe(fd, data); - } - } - PrimarySelectionSourceEvent::Cancelled => { - state.primary_selection_source.take(); - source.destroy(); - } - _ => unreachable!(), - } - } -} - -impl Dispatch - for PrimarySelectionManagerState -{ - fn event( - state: &mut WaylandState, - _proxy: &ZwpPrimarySelectionOfferV1, - event: ::Event, - _data: &PrimarySelectionManagerData, - _conn: &wayland_client::Connection, - _qhandle: &wayland_client::QueueHandle, - ) { - match event { - PrimarySelectionOfferEvent::Offer { mime_type } => { - if mime_type == TEXT_MIME_TYPE { - let mgr = state.primary_selection_manager.as_ref().unwrap(); - let mut inner = mgr.inner.lock().unwrap(); - inner.valid_mime = true; - } - } - _ => unreachable!(), - } - } -} - -impl Dispatch - for PrimarySelectionManagerState -{ - event_created_child!(WaylandState, ZwpPrimarySelectionDeviceV1, [ - zwp_primary_selection_device_v1::EVT_DATA_OFFER_OPCODE => (ZwpPrimarySelectionOfferV1, PrimarySelectionManagerData::default()) - ]); - - fn event( - state: &mut WaylandState, + _qh: &wayland_client::QueueHandle, _primary_selection_device: &ZwpPrimarySelectionDeviceV1, - event: ::Event, - _data: &PrimarySelectionManagerData, - _conn: &wayland_client::Connection, - _qhandle: &wayland_client::QueueHandle, ) { - let psm = state.primary_selection_manager.as_ref().unwrap(); - let mut inner = psm.inner.lock().unwrap(); - match event { - PrimarySelectionDeviceEvent::DataOffer { offer } => { - inner.pending_offer = Some(offer); - } - PrimarySelectionDeviceEvent::Selection { id } => { - if !inner.valid_mime { - return; - } - - if let Some(offer) = inner.offer.take() { - offer.destroy(); - } - if id == inner.pending_offer { - inner.offer = inner.pending_offer.take(); - } else { - // Remove the pending offer, assign the new delivered one. - if let Some(offer) = inner.pending_offer.take() { - offer.destroy() - } - - inner.offer = id; - } - } - _ => unreachable!(), - } + // TODO: do we need to do anything here? + } +} + +impl PrimarySelectionSourceHandler for WaylandState { + fn send_request( + &mut self, + _conn: &wayland_client::Connection, + _qh: &wayland_client::QueueHandle, + source: &ZwpPrimarySelectionSourceV1, + mime: String, + write_pipe: toolkit::data_device_manager::WritePipe, + ) { + if mime != TEXT_MIME_TYPE { + return; + }; + + if let Some((ps_source, data)) = &self.primary_selection_source { + if ps_source.inner() != source { + return; + } + write_selection_to_pipe(write_pipe, data); + } + } + + fn cancelled( + &mut self, + _conn: &wayland_client::Connection, + _qh: &wayland_client::QueueHandle, + source: &ZwpPrimarySelectionSourceV1, + ) { + self.primary_selection_source.take(); + source.destroy(); } } diff --git a/window/src/os/wayland/data_device.rs b/window/src/os/wayland/data_device.rs index d14857df1..d2c9a570a 100644 --- a/window/src/os/wayland/data_device.rs +++ b/window/src/os/wayland/data_device.rs @@ -1,12 +1,8 @@ -use std::os::fd::{FromRawFd, IntoRawFd}; - -use filedescriptor::FileDescriptor; -use smithay_client_toolkit::data_device_manager::data_device::{ - DataDevice, DataDeviceDataExt, DataDeviceHandler, -}; +use smithay_client_toolkit::data_device_manager::data_device::DataDeviceHandler; use smithay_client_toolkit::data_device_manager::data_offer::DataOfferHandler; use smithay_client_toolkit::data_device_manager::data_source::DataSourceHandler; use smithay_client_toolkit::data_device_manager::WritePipe; +use smithay_client_toolkit::reexports::client::protocol::wl_data_device::WlDataDevice; use wayland_client::protocol::wl_data_device_manager::DndAction; use wayland_client::Proxy; @@ -26,24 +22,31 @@ impl DataDeviceHandler for WaylandState { &mut self, _conn: &wayland_client::Connection, _qh: &wayland_client::QueueHandle, - data_device: DataDevice, + data_device: &WlDataDevice, ) { - let mut drag_offer = data_device.drag_offer().unwrap(); - log::trace!( - "Data offer entered: {:?}, mime_types: {:?}", - drag_offer, - data_device.drag_mime_types() - ); + let data = match self.data_device { + Some(ref dv) if dv.inner() == data_device => dv.data(), + _ => { + log::warn!("No existing device manager for {:?}", data_device); + return; + } + }; - if let Some(m) = data_device - .drag_mime_types() - .iter() - .find(|s| *s == URI_MIME_TYPE) - { - drag_offer.accept_mime_type(*self.last_serial.borrow(), Some(m.clone())); - } + let offer = data.drag_offer().unwrap(); - drag_offer.set_actions(DndAction::None | DndAction::Copy, DndAction::None); + offer.with_mime_types(|mime_types| { + log::trace!( + "Data offer entered: {:?}, mime_types: {:?}", + offer, + mime_types + ); + + if let Some(mime) = mime_types.iter().find(|s| *s == URI_MIME_TYPE) { + offer.accept_mime_type(*self.last_serial.borrow(), Some(mime.clone())); + } + }); + + offer.set_actions(DndAction::None | DndAction::Copy, DndAction::None); let pointer = self.pointer.as_mut().unwrap(); let mut pstate = pointer @@ -54,8 +57,7 @@ impl DataDeviceHandler for WaylandState { .lock() .unwrap(); - let offer = drag_offer.inner().clone(); - let window_id = SurfaceUserData::from_wl(&drag_offer.surface).window_id; + let window_id = SurfaceUserData::from_wl(&offer.surface).window_id; pstate.drag_and_drop.offer = Some(SurfaceAndOffer { window_id, offer }); } @@ -64,7 +66,7 @@ impl DataDeviceHandler for WaylandState { &mut self, _conn: &wayland_client::Connection, _qh: &wayland_client::QueueHandle, - _data_device: DataDevice, + _data_device: &WlDataDevice, ) { let pointer = self.pointer.as_mut().unwrap(); let mut pstate = pointer @@ -83,7 +85,7 @@ impl DataDeviceHandler for WaylandState { &mut self, _conn: &wayland_client::Connection, _qh: &wayland_client::QueueHandle, - _data_device: DataDevice, + _data_device: &WlDataDevice, ) { } @@ -91,19 +93,21 @@ impl DataDeviceHandler for WaylandState { &mut self, _conn: &wayland_client::Connection, _qh: &wayland_client::QueueHandle, - data_device: DataDevice, + data_device: &WlDataDevice, ) { - let mime_types = data_device.selection_mime_types(); - if !mime_types.iter().any(|s| s == TEXT_MIME_TYPE) { - return; - } + let offer = match self.data_device { + Some(ref dv) if dv.inner() == data_device => dv.data().selection_offer(), + _ => { + return; + } + }; + if let Some(offer) = offer { + if !offer.with_mime_types(|mime_types| mime_types.iter().any(|s| s == TEXT_MIME_TYPE)) { + return; + } - if let Some(offer) = data_device.selection_offer() { if let Some(copy_and_paste) = self.resolve_copy_and_paste() { - copy_and_paste - .lock() - .unwrap() - .confirm_selection(offer.inner().clone()); + copy_and_paste.lock().unwrap().confirm_selection(offer); } } } @@ -112,7 +116,7 @@ impl DataDeviceHandler for WaylandState { &mut self, _conn: &wayland_client::Connection, _qh: &wayland_client::QueueHandle, - _data_device: DataDevice, + _data_device: &WlDataDevice, ) { let pointer = self.pointer.as_mut().unwrap(); let mut pstate = pointer @@ -135,22 +139,6 @@ impl DataDeviceHandler for WaylandState { } impl DataOfferHandler for WaylandState { - fn offer( - &mut self, - _conn: &wayland_client::Connection, - _qh: &wayland_client::QueueHandle, - offer: &mut smithay_client_toolkit::data_device_manager::data_offer::DataDeviceOffer, - mime_type: String, - ) { - log::trace!("Received offer with mime type: {mime_type}"); - if mime_type == TEXT_MIME_TYPE { - offer.accept_mime_type(*self.last_serial.borrow(), Some(mime_type)); - } else { - // Refuse other mime types - offer.accept_mime_type(*self.last_serial.borrow(), None); - } - } - // Ignore drag and drop events fn source_actions( &mut self, @@ -198,7 +186,6 @@ impl DataSourceHandler for WaylandState { if cp_source.inner() != source { return; } - let fd = unsafe { FileDescriptor::from_raw_fd(fd.into_raw_fd()) }; write_selection_to_pipe(fd, data); } } diff --git a/window/src/os/wayland/drag_and_drop.rs b/window/src/os/wayland/drag_and_drop.rs index 59dbfbe40..5de067656 100644 --- a/window/src/os/wayland/drag_and_drop.rs +++ b/window/src/os/wayland/drag_and_drop.rs @@ -1,10 +1,9 @@ use crate::wayland::read_pipe_with_timeout; use crate::ConnectionOps; -use filedescriptor::{FileDescriptor, Pipe}; use smithay_client_toolkit as toolkit; -use std::os::unix::io::AsRawFd; use std::path::PathBuf; -use toolkit::reexports::client::protocol::wl_data_offer::WlDataOffer; +use toolkit::data_device_manager::data_offer::DragOffer; +use toolkit::data_device_manager::ReadPipe; use url::Url; use super::data_device::URI_MIME_TYPE; @@ -17,12 +16,12 @@ pub struct DragAndDrop { pub(super) struct SurfaceAndOffer { pub(super) window_id: usize, - pub(super) offer: WlDataOffer, + pub(super) offer: DragOffer, } pub(super) struct SurfaceAndPipe { pub(super) window_id: usize, - pub(super) read: FileDescriptor, + pub(super) read: ReadPipe, } impl DragAndDrop { @@ -30,16 +29,15 @@ impl DragAndDrop { /// returning that surface and pipe descriptor. pub(super) fn create_pipe_for_drop(&mut self) -> Option { let SurfaceAndOffer { window_id, offer } = self.offer.take()?; - let pipe = Pipe::new() - .map_err(|err| log::error!("Unable to create pipe: {:#}", err)) + let read = offer + .receive(URI_MIME_TYPE.to_string()) + .map_err(|err| log::error!("Unable to receive data: {:#}", err)) .ok()?; - offer.receive(URI_MIME_TYPE.to_string(), pipe.write.as_raw_fd()); - let read = pipe.read; offer.finish(); Some(SurfaceAndPipe { window_id, read }) } - pub(super) fn read_paths_from_pipe(read: FileDescriptor) -> Option> { + pub(super) fn read_paths_from_pipe(read: ReadPipe) -> Option> { read_pipe_with_timeout(read) .map_err(|err| { log::error!("Error while reading pipe from drop result: {:#}", err); diff --git a/window/src/os/wayland/keyboard.rs b/window/src/os/wayland/keyboard.rs index e9c03ddaf..6542b7065 100644 --- a/window/src/os/wayland/keyboard.rs +++ b/window/src/os/wayland/keyboard.rs @@ -1,10 +1,9 @@ use std::borrow::BorrowMut; -use std::io::Read; -use std::os::fd::{AsRawFd, FromRawFd}; -use std::os::unix::fs::FileExt; use wayland_client::protocol::wl_keyboard::{Event as WlKeyboardEvent, KeymapFormat, WlKeyboard}; use wayland_client::{Dispatch, Proxy}; +use xkbcommon::xkb; +use xkbcommon::xkb::CONTEXT_NO_FLAGS; use crate::x11::KeyboardWithFallback; @@ -59,37 +58,37 @@ impl Dispatch for WaylandState { *state.key_repeat_delay.borrow_mut() = *delay; } WlKeyboardEvent::Keymap { format, fd, size } => { - let mut file = unsafe { std::fs::File::from_raw_fd(fd.as_raw_fd()) }; match format.into_result().unwrap() { KeymapFormat::XkbV1 => { - let mut data = vec![0u8; *size as usize]; - // If we weren't passed a pipe, be sure to explicitly - // read from the start of the file - match file.read_exact_at(&mut data, 0) { - Ok(_) => {} - Err(err) => { - // ideally: we check for: - // err.kind() == std::io::ErrorKind::NotSeekable - // but that is not yet in stable rust - if err.raw_os_error() == Some(libc::ESPIPE) { - // It's a pipe, which cannot be seeked, so we - // just try reading from the current pipe position - file.read(&mut data).expect("read from Keymap fd/pipe"); - } else { - return Err(err).expect("read_exact_at from Keymap fd"); + // In later protocol versions, the fd must be privately mmap'd. + // We let xkb handle this and then turn it back into a string. + #[allow(unused_unsafe)] // Upstream release will change this + match unsafe { + let context = xkb::Context::new(CONTEXT_NO_FLAGS); + let cloned_fd = fd.try_clone().expect("Couldn't clone owned fd"); + xkb::Keymap::new_from_fd( + &context, + cloned_fd, + *size as usize, + xkb::KEYMAP_FORMAT_TEXT_V1, + xkb::COMPILE_NO_FLAGS, + ) + } { + Ok(Some(keymap)) => { + let s = keymap.get_as_string(xkb::KEYMAP_FORMAT_TEXT_V1); + match KeyboardWithFallback::new_from_string(s) { + Ok(k) => { + state.keyboard_mapper.replace(k); + } + Err(err) => { + log::error!("Error processing keymap change: {:#}", err); + } } } - } - // Dance around CString panicing on the NUL terminator - // in the xkbcommon crate - while let Some(0) = data.last() { - data.pop(); - } - let s = String::from_utf8(data).expect("Failed to read string from data"); - match KeyboardWithFallback::new_from_string(s) { - Ok(k) => { - state.keyboard_mapper.replace(k); + Ok(None) => { + log::error!("invalid keymap"); } + Err(err) => { log::error!("Error processing keymap change: {:#}", err); } diff --git a/window/src/os/wayland/pointer.rs b/window/src/os/wayland/pointer.rs index faefdce89..3436d17f4 100644 --- a/window/src/os/wayland/pointer.rs +++ b/window/src/os/wayland/pointer.rs @@ -1,11 +1,12 @@ use std::cell::RefCell; use std::sync::{Arc, Mutex}; +use std::time::Duration; use smithay_client_toolkit::compositor::SurfaceData; +use smithay_client_toolkit::reexports::csd_frame::{DecorationsFrame, FrameClick}; use smithay_client_toolkit::seat::pointer::{ PointerData, PointerDataExt, PointerEvent, PointerEventKind, PointerHandler, }; -use smithay_client_toolkit::shell::xdg::frame::{DecorationsFrame, FrameClick}; use wayland_client::backend::ObjectId; use wayland_client::protocol::wl_pointer::{ButtonState, WlPointer}; use wayland_client::protocol::wl_seat::WlSeat; @@ -220,13 +221,23 @@ impl WaylandState { match evt.kind { PointerEventKind::Enter { .. } => { - inner.window_frame.click_point_moved(&evt.surface, x, y); + inner.window_frame.click_point_moved( + Duration::ZERO, + &evt.surface.id(), + x, + y, + ); } PointerEventKind::Leave { .. } => { inner.window_frame.click_point_left(); } PointerEventKind::Motion { .. } => { - inner.window_frame.click_point_moved(&evt.surface, x, y); + inner.window_frame.click_point_moved( + Duration::ZERO, + &evt.surface.id(), + x, + y, + ); } PointerEventKind::Press { button, serial, .. } | PointerEventKind::Release { button, serial, .. } => { @@ -240,7 +251,9 @@ impl WaylandState { 0x111 => FrameClick::Alternate, _ => continue, }; - if let Some(action) = inner.window_frame.on_click(click, pressed) { + if let Some(action) = + inner.window_frame.on_click(Duration::ZERO, click, pressed) + { inner.frame_action(pointer, serial, action); } } diff --git a/window/src/os/wayland/seat.rs b/window/src/os/wayland/seat.rs index 3798f4259..38bd25940 100644 --- a/window/src/os/wayland/seat.rs +++ b/window/src/os/wayland/seat.rs @@ -3,9 +3,9 @@ use smithay_client_toolkit::seat::{Capability, SeatHandler, SeatState}; use wayland_client::protocol::wl_seat::WlSeat; use wayland_client::{Connection, QueueHandle}; -use crate::wayland::copy_and_paste::PrimarySelectionManagerData; use crate::wayland::keyboard::KeyboardData; use crate::wayland::pointer::PointerUserData; +use crate::wayland::SurfaceUserData; use super::state::WaylandState; @@ -23,40 +23,50 @@ impl SeatHandler for WaylandState { _conn: &Connection, qh: &QueueHandle, seat: WlSeat, - capability: smithay_client_toolkit::seat::Capability, + capability: Capability, ) { - if capability == Capability::Keyboard && self.keyboard.is_none() { - log::trace!("Setting keyboard capability"); - let keyboard = seat.get_keyboard(qh, KeyboardData {}); - self.keyboard = Some(keyboard.clone()); + match capability { + Capability::Keyboard if self.keyboard.is_none() => { + log::trace!("Setting keyboard capability"); + let keyboard = seat.get_keyboard(qh, KeyboardData {}); + self.keyboard = Some(keyboard.clone()); - if let Some(text_input) = &self.text_input { - text_input.advise_seat(&seat, &keyboard, qh); + if let Some(text_input) = &self.text_input { + text_input.advise_seat(&seat, &keyboard, qh); + } } + Capability::Pointer if self.pointer.is_none() => { + log::trace!("Setting pointer capability"); + let surface = self.compositor.create_surface(qh); + let pointer = self + .seat + .get_pointer_with_theme_and_data::( + qh, + &seat, + &self.shm.wl_shm(), + surface, + ThemeSpec::System, + PointerUserData::new(seat.clone()), + ) + .expect("Failed to create pointer"); + self.pointer = Some(pointer); + } + Capability::Touch /* if self.touch.is_none() */ => { + log::trace!("Setting touch capability"); + // TODO + } + _ => {} } - if capability == Capability::Pointer && self.pointer.is_none() { - log::trace!("Setting pointer capability"); - let pointer = self - .seat - .get_pointer_with_theme_and_data( - qh, - &seat, - ThemeSpec::System, - PointerUserData::new(seat.clone()), - ) - .expect("Failed to create pointer"); - self.pointer = Some(pointer); - + // TODO: is there a better place to put this? It only needs to be run once. (presumably per-seat) + if self.data_device.is_none() { let data_device_manager = &self.data_device_manager_state; - let data_device = data_device_manager.get_data_device(qh, &seat); - self.data_device.replace(data_device); + self.data_device = Some(data_device_manager.get_data_device(qh, &seat)); - let primary_select_device = self.primary_selection_manager.as_ref().map(|m| { - m.manager - .get_device(&seat, qh, PrimarySelectionManagerData::default()) - }); - self.primary_select_device = primary_select_device; + self.primary_selection_device = self + .primary_selection_manager + .as_ref() + .map(|m| m.get_selection_device(qh, &seat)); } } @@ -65,9 +75,23 @@ impl SeatHandler for WaylandState { _conn: &Connection, _qh: &QueueHandle, _seat: WlSeat, - _capability: smithay_client_toolkit::seat::Capability, + capability: Capability, ) { - todo!() + match capability { + Capability::Keyboard => { + log::trace!("Lost keyboard capability"); + self.keyboard.take().map(|k| k.release()); + } + Capability::Pointer => { + log::trace!("Lost pointer capability"); + self.pointer.take(); // ThemedPointer's drop implementation calls wl_pointer.release() already. + } + Capability::Touch => { + log::trace!("Lost touch capability"); + // Nothing to do here. (yet) + } + _ => {} + } } fn remove_seat(&mut self, _conn: &Connection, _qh: &QueueHandle, _seat: WlSeat) { diff --git a/window/src/os/wayland/state.rs b/window/src/os/wayland/state.rs index c410e6817..fdb269e01 100644 --- a/window/src/os/wayland/state.rs +++ b/window/src/os/wayland/state.rs @@ -3,12 +3,15 @@ use std::collections::HashMap; use std::rc::Rc; use std::sync::{Arc, Mutex}; -use smithay_client_toolkit::compositor::CompositorState; +use smithay_client_toolkit::compositor::{CompositorState, SurfaceData}; use smithay_client_toolkit::data_device_manager::data_device::DataDevice; use smithay_client_toolkit::data_device_manager::data_source::CopyPasteSource; use smithay_client_toolkit::data_device_manager::DataDeviceManagerState; use smithay_client_toolkit::globals::GlobalData; use smithay_client_toolkit::output::{OutputHandler, OutputState}; +use smithay_client_toolkit::primary_selection::device::PrimarySelectionDevice; +use smithay_client_toolkit::primary_selection::selection::PrimarySelectionSource; +use smithay_client_toolkit::primary_selection::PrimarySelectionManagerState; use smithay_client_toolkit::reexports::protocols_wlr::output_management::v1::client::zwlr_output_head_v1::ZwlrOutputHeadV1; use smithay_client_toolkit::reexports::protocols_wlr::output_management::v1::client::zwlr_output_manager_v1::ZwlrOutputManagerV1; use smithay_client_toolkit::reexports::protocols_wlr::output_management::v1::client::zwlr_output_mode_v1::ZwlrOutputModeV1; @@ -20,25 +23,18 @@ use smithay_client_toolkit::shm::slot::SlotPool; use smithay_client_toolkit::shm::{Shm, ShmHandler}; use smithay_client_toolkit::subcompositor::SubcompositorState; use smithay_client_toolkit::{ - delegate_compositor, delegate_data_device, delegate_data_device_manager, delegate_data_offer, delegate_data_source, delegate_output, delegate_registry, delegate_seat, delegate_shm, delegate_subcompositor, delegate_xdg_shell, delegate_xdg_window, registry_handlers + delegate_compositor, delegate_data_device, delegate_output, delegate_pointer, delegate_primary_selection, delegate_registry, delegate_seat, delegate_shm, delegate_subcompositor, delegate_xdg_shell, delegate_xdg_window, registry_handlers }; use wayland_client::backend::ObjectId; use wayland_client::globals::GlobalList; use wayland_client::protocol::wl_keyboard::WlKeyboard; use wayland_client::protocol::wl_output::WlOutput; -use wayland_client::protocol::wl_pointer::WlPointer; -use wayland_client::protocol::wl_surface::WlSurface; use wayland_client::{delegate_dispatch, Connection, QueueHandle}; -use wayland_protocols::wp::primary_selection::zv1::client::zwp_primary_selection_device_manager_v1::ZwpPrimarySelectionDeviceManagerV1; -use wayland_protocols::wp::primary_selection::zv1::client::zwp_primary_selection_device_v1::ZwpPrimarySelectionDeviceV1; -use wayland_protocols::wp::primary_selection::zv1::client::zwp_primary_selection_offer_v1::ZwpPrimarySelectionOfferV1; -use wayland_protocols::wp::primary_selection::zv1::client::zwp_primary_selection_source_v1::ZwpPrimarySelectionSourceV1; use wayland_protocols::wp::text_input::zv3::client::zwp_text_input_manager_v3::ZwpTextInputManagerV3; use wayland_protocols::wp::text_input::zv3::client::zwp_text_input_v3::ZwpTextInputV3; use crate::x11::KeyboardWithFallback; -use super::copy_and_paste::{PrimarySelectionManagerData, PrimarySelectionManagerState}; use super::inputhandler::{TextInputData, TextInputState}; use super::pointer::{PendingMouse, PointerUserData}; use super::{OutputManagerData, OutputManagerState, SurfaceUserData, WaylandWindowInner}; @@ -71,8 +67,8 @@ pub(super) struct WaylandState { pub(super) data_device: Option, pub(super) copy_paste_source: Option<(CopyPasteSource, String)>, pub(super) primary_selection_manager: Option, - pub(super) primary_select_device: Option, - pub(super) primary_selection_source: Option<(ZwpPrimarySelectionSourceV1, String)>, + pub(super) primary_selection_device: Option, + pub(super) primary_selection_source: Option<(PrimarySelectionSource, String)>, pub(super) shm: Shm, pub(super) mem_pool: RefCell, } @@ -113,7 +109,7 @@ impl WaylandState { data_device: None, copy_paste_source: None, primary_selection_manager: PrimarySelectionManagerState::bind(globals, qh).ok(), - primary_select_device: None, + primary_selection_device: None, primary_selection_source: None, shm, mem_pool: RefCell::new(mem_pool), @@ -153,40 +149,29 @@ impl OutputHandler for WaylandState { log::trace!("output destroyed: OutputHandler"); } } -// Undocumented in sctk 0.17: This is required to use have user data with a surface -// Will be just delegate_compositor!(WaylandState, surface: [SurfaceData, SurfaceUserData]) in 0.18 -delegate_dispatch!(WaylandState: [ WlSurface: SurfaceUserData] => CompositorState); delegate_registry!(WaylandState); delegate_shm!(WaylandState); delegate_output!(WaylandState); -delegate_compositor!(WaylandState); +delegate_compositor!(WaylandState, surface: [SurfaceData, SurfaceUserData]); delegate_subcompositor!(WaylandState); delegate_seat!(WaylandState); -delegate_data_device_manager!(WaylandState); delegate_data_device!(WaylandState); -delegate_data_source!(WaylandState); -delegate_data_offer!(WaylandState); -// Updating to 0.18 should have this be able to work -// delegate_pointer!(WaylandState, pointer: [PointerUserData]); -delegate_dispatch!(WaylandState: [WlPointer: PointerUserData] => SeatState); +delegate_pointer!(WaylandState, pointer: [PointerUserData]); delegate_xdg_shell!(WaylandState); delegate_xdg_window!(WaylandState); +delegate_primary_selection!(WaylandState); + delegate_dispatch!(WaylandState: [ZwpTextInputManagerV3: GlobalData] => TextInputState); delegate_dispatch!(WaylandState: [ZwpTextInputV3: TextInputData] => TextInputState); delegate_dispatch!(WaylandState: [ZwlrOutputManagerV1: GlobalData] => OutputManagerState); delegate_dispatch!(WaylandState: [ZwlrOutputHeadV1: OutputManagerData] => OutputManagerState); delegate_dispatch!(WaylandState: [ZwlrOutputModeV1: OutputManagerData] => OutputManagerState); - -delegate_dispatch!(WaylandState: [ZwpPrimarySelectionDeviceManagerV1: GlobalData] => PrimarySelectionManagerState); -delegate_dispatch!(WaylandState: [ZwpPrimarySelectionDeviceV1: PrimarySelectionManagerData] => PrimarySelectionManagerState); -delegate_dispatch!(WaylandState: [ZwpPrimarySelectionSourceV1: PrimarySelectionManagerData] => PrimarySelectionManagerState); -delegate_dispatch!(WaylandState: [ZwpPrimarySelectionOfferV1: PrimarySelectionManagerData] => PrimarySelectionManagerState); diff --git a/window/src/os/wayland/window.rs b/window/src/os/wayland/window.rs index e6cd1d4f6..51a81a555 100644 --- a/window/src/os/wayland/window.rs +++ b/window/src/os/wayland/window.rs @@ -1,5 +1,5 @@ use std::any::Any; -use std::cell::{RefCell, RefMut}; +use std::cell::RefCell; use std::cmp::max; use std::convert::TryInto; use std::io::Read; @@ -14,18 +14,22 @@ use anyhow::{anyhow, bail}; use async_io::Timer; use async_trait::async_trait; use config::ConfigHandle; -use filedescriptor::FileDescriptor; use promise::{Future, Promise}; use raw_window_handle::{ HasRawDisplayHandle, HasRawWindowHandle, RawDisplayHandle, RawWindowHandle, WaylandDisplayHandle, WaylandWindowHandle, }; use smithay_client_toolkit::compositor::{CompositorHandler, SurfaceData, SurfaceDataExt}; -use smithay_client_toolkit::shell::xdg::frame::fallback_frame::FallbackFrame; -use smithay_client_toolkit::shell::xdg::frame::{DecorationsFrame, FrameAction}; +use smithay_client_toolkit::data_device_manager::ReadPipe; +use smithay_client_toolkit::reexports::csd_frame::{ + DecorationsFrame, FrameAction, ResizeEdge, WindowState as SCTKWindowState, +}; +use smithay_client_toolkit::reexports::protocols::xdg::shell::client::xdg_toplevel::ResizeEdge as XdgResizeEdge; +use smithay_client_toolkit::seat::pointer::CursorIcon; +use smithay_client_toolkit::shell::xdg::fallback_frame::FallbackFrame; use smithay_client_toolkit::shell::xdg::window::{ DecorationMode, Window as XdgWindow, WindowConfigure, WindowDecorations as Decorations, - WindowHandler, WindowState as SCTKWindowState, + WindowHandler, }; use smithay_client_toolkit::shell::xdg::XdgSurface; use smithay_client_toolkit::shell::WaylandSurface; @@ -44,7 +48,7 @@ use wezterm_input_types::{ use crate::wayland::WaylandConnection; use crate::x11::KeyboardWithFallback; use crate::{ - Clipboard, Connection, ConnectionOps, Dimensions, MouseCursor, Point, Rect, + Appearance, Clipboard, Connection, ConnectionOps, Dimensions, MouseCursor, Point, Rect, RequestedWindowGeometry, ResizeIncrement, ResolvedGeometry, Window, WindowEvent, WindowEventSender, WindowKeyEvent, WindowOps, WindowState, }; @@ -193,11 +197,6 @@ impl WaylandWindow { compositor.create_surface_with_data(&qh, surface_data) }; - let pointer_surface = { - let compositor = &conn.wayland_state.borrow().compositor; - compositor.create_surface(&qh) - }; - let ResolvedGeometry { x: _, y: _, @@ -269,6 +268,8 @@ impl WaylandWindow { surface_to_pending.insert(surface.id(), Arc::clone(&pending_mouse)); } + let appearance = conn.get_appearance(); + let inner = Rc::new(RefCell::new(WaylandWindowInner { events: WindowEventSender::new(event_handler), surface_factor: 1.0, @@ -290,12 +291,12 @@ impl WaylandWindow { key_repeat: None, pending_event, pending_mouse, - pointer_surface, pending_first_configure: Some(pending_first_configure), frame_callback: None, text_cursor: None, + appearance, config, @@ -465,10 +466,18 @@ pub(crate) struct PendingEvent { pub(crate) window_state: Option, } -pub(crate) fn read_pipe_with_timeout(mut file: FileDescriptor) -> anyhow::Result { +pub(crate) fn read_pipe_with_timeout(mut file: ReadPipe) -> anyhow::Result { let mut result = Vec::new(); - file.set_non_blocking(true)?; + // set non-blocking I/O on the pipe + // (adapted from FileDescriptor::set_non_blocking_impl in /filedescriptor/src/unix.rs) + if unsafe { libc::fcntl(file.as_raw_fd(), libc::F_SETFL, libc::O_NONBLOCK) } != 0 { + bail!( + "failed to change non-blocking mode: {}", + std::io::Error::last_os_error() + ) + } + let mut pfd = libc::pollfd { fd: file.as_raw_fd(), events: libc::POLLIN, @@ -505,7 +514,6 @@ pub struct WaylandWindowInner { dimensions: Dimensions, resize_increments: Option, window_state: WindowState, - pointer_surface: WlSurface, last_mouse_coords: Point, mouse_buttons: MouseButtons, hscroll_remainder: f64, @@ -520,7 +528,7 @@ pub struct WaylandWindowInner { invalidated: bool, // font_config: Rc, text_cursor: Option, - // appearance: Appearance, + appearance: Appearance, config: ConfigHandle, // cache the title for comparison to avoid spamming // the compositor with updates that don't actually change it @@ -544,6 +552,16 @@ impl WaylandWindowInner { return; } + // If the do_paint function has been called previously, calling it again will not + // send the NeedRepaint event. This results in the window not being displayed + // correctly. + // Therefore, when frame_callback is set to some, we need to send the NeedRepaint + // event again to ensure the window is displayed. + // Fix: https://github.com/wez/wezterm/issues/5103 + if self.frame_callback.is_some() { + self.events.dispatch(WindowEvent::NeedRepaint); + } + self.do_paint().unwrap(); } @@ -895,27 +913,33 @@ impl WaylandWindowInner { } fn set_cursor(&mut self, cursor: Option) { - let name = cursor.map_or("none", |cursor| match cursor { - MouseCursor::Arrow => "arrow", - MouseCursor::Hand => "hand", - MouseCursor::SizeUpDown => "ns-resize", - MouseCursor::SizeLeftRight => "ew-resize", - MouseCursor::Text => "xterm", - }); let conn = Connection::get().unwrap().wayland(); let state = conn.wayland_state.borrow_mut(); - let (shm, pointer) = - RefMut::map_split(state, |s| (&mut s.shm, s.pointer.as_mut().unwrap())); + let pointer = match &state.pointer { + Some(pointer) => pointer, + None => return, + }; - // Much different API in 0.18 - if let Err(err) = pointer.set_cursor( - &conn.connection, - name, - shm.wl_shm(), - &self.pointer_surface, - 1, - ) { - log::error!("set_cursor: {}", err); + match cursor { + Some(cursor) => { + if let Err(err) = pointer.set_cursor( + &conn.connection, + match cursor { + MouseCursor::Arrow => CursorIcon::Default, + MouseCursor::Hand => CursorIcon::Pointer, + MouseCursor::SizeUpDown => CursorIcon::NsResize, + MouseCursor::SizeLeftRight => CursorIcon::EwResize, + MouseCursor::Text => CursorIcon::Text, + }, + ) { + log::error!("set_cursor: {}", err); + } + } + None => { + if let Err(err) = pointer.hide_cursor() { + log::error!("hide_cursor: {}", err) + } + } } } @@ -1062,6 +1086,14 @@ impl WaylandWindowInner { self.text_cursor.take(); } + pub(crate) fn appearance_changed(&mut self, appearance: Appearance) { + if appearance != self.appearance { + self.appearance = appearance; + self.events + .dispatch(WindowEvent::AppearanceChanged(appearance)); + } + } + pub(super) fn keyboard_event( &mut self, mapper: &mut KeyboardWithFallback, @@ -1146,8 +1178,23 @@ impl WaylandWindowInner { .unwrap() .show_window_menu(seat, serial, (x, y)) } - FrameAction::Resize(edge) => self.window.as_ref().unwrap().resize(seat, serial, edge), + FrameAction::Resize(edge) => { + let edge = match edge { + ResizeEdge::None => XdgResizeEdge::None, + ResizeEdge::Top => XdgResizeEdge::Top, + ResizeEdge::Bottom => XdgResizeEdge::Bottom, + ResizeEdge::Left => XdgResizeEdge::Left, + ResizeEdge::TopLeft => XdgResizeEdge::TopLeft, + ResizeEdge::BottomLeft => XdgResizeEdge::BottomLeft, + ResizeEdge::Right => XdgResizeEdge::Right, + ResizeEdge::TopRight => XdgResizeEdge::TopRight, + ResizeEdge::BottomRight => XdgResizeEdge::BottomRight, + _ => return, // Realistically, there probably won't be any new edges added. + }; + self.window.as_ref().unwrap().resize(seat, serial, edge) + } FrameAction::Move => self.window.as_ref().unwrap().move_(seat, serial), + _ => log::warn!("unhandled FrameAction: {:?}", action), } } } @@ -1257,6 +1304,16 @@ impl CompositorHandler for WaylandState { Ok(()) }); } + + fn transform_changed( + &mut self, + _conn: &WConnection, + _qh: &wayland_client::QueueHandle, + _surface: &wayland_client::protocol::wl_surface::WlSurface, + _new_transform: wayland_client::protocol::wl_output::Transform, + ) { + // TODO: do we need to do anything here? + } } impl WindowHandler for WaylandState { diff --git a/window/src/os/windows/wgl.rs b/window/src/os/windows/wgl.rs index 25fc6e591..bdf493b98 100644 --- a/window/src/os/windows/wgl.rs +++ b/window/src/os/windows/wgl.rs @@ -106,7 +106,7 @@ impl WglWrapper { } } - let lib = libloading::Library::new("opengl32.dll").map_err(|e| { + let lib = unsafe { libloading::Library::new("opengl32.dll") }.map_err(|e| { log::error!("{:?}", e); e })?; diff --git a/window/src/os/windows/window.rs b/window/src/os/windows/window.rs index b38479c37..580533449 100644 --- a/window/src/os/windows/window.rs +++ b/window/src/os/windows/window.rs @@ -172,7 +172,7 @@ fn rc_from_pointer(lparam: LPVOID) -> Rc> { let cloned = Rc::clone(&arc); // We must not drop this ref though; turn it back into a raw pointer! - Rc::into_raw(arc); + let _ = Rc::into_raw(arc); cloned } @@ -1424,7 +1424,7 @@ fn apply_theme(hwnd: HWND) -> Option { if let Some(inner) = rc_from_hwnd(hwnd) { let mut inner = inner.borrow_mut(); - // Set Arylic or Mica system Backdrop + // Set Acrylic or Mica system Backdrop let pv_attribute = match inner.config.win32_system_backdrop { SystemBackdrop::Auto => DWM_SYSTEMBACKDROP_TYPE::DWMSBT_AUTO, SystemBackdrop::Disable => DWM_SYSTEMBACKDROP_TYPE::DWMSBT_NONE, @@ -1433,9 +1433,9 @@ fn apply_theme(hwnd: HWND) -> Option { SystemBackdrop::Tabbed => DWM_SYSTEMBACKDROP_TYPE::DWMSBT_TABBEDWINDOW, }; - let margins = match inner.config.win32_system_backdrop { - SystemBackdrop::Auto | SystemBackdrop::Disable => 0, - SystemBackdrop::Acrylic | SystemBackdrop::Mica | SystemBackdrop::Tabbed => -1, + let margins = match inner.config.window_decorations { + WindowDecorations::TITLE => -1, + _ => 0, }; DwmExtendFrameIntoClientArea( diff --git a/window/src/os/x11/connection.rs b/window/src/os/x11/connection.rs index 8398555eb..3f078b82f 100644 --- a/window/src/os/x11/connection.rs +++ b/window/src/os/x11/connection.rs @@ -34,6 +34,22 @@ pub struct XConnection { pub atom_xsel_data: Atom, pub atom_targets: Atom, pub atom_clipboard: Atom, + pub atom_texturilist: Atom, + pub atom_xmozurl: Atom, + pub atom_xdndaware: Atom, + pub atom_xdndtypelist: Atom, + pub atom_xdndselection: Atom, + pub atom_xdndenter: Atom, + pub atom_xdndposition: Atom, + pub atom_xdndstatus: Atom, + pub atom_xdndleave: Atom, + pub atom_xdnddrop: Atom, + pub atom_xdndfinished: Atom, + pub atom_xdndactioncopy: Atom, + pub atom_xdndactionmove: Atom, + pub atom_xdndactionlink: Atom, + pub atom_xdndactionask: Atom, + pub atom_xdndactionprivate: Atom, pub atom_gtk_edge_constraints: Atom, pub atom_xsettings_selection: Atom, pub atom_xsettings_settings: Atom, @@ -54,6 +70,7 @@ pub struct XConnection { pub atom_net_active_window: Atom, pub(crate) xrm: RefCell>, pub(crate) windows: RefCell>>>, + pub(crate) child_to_parent_id: RefCell>, should_terminate: RefCell, pub(crate) visual: xcb::x::Visualtype, pub(crate) depth: u8, @@ -562,6 +579,10 @@ impl XConnection { self.windows.borrow().get(&window_id).map(Arc::clone) } + fn parent_id_by_child_id(&self, child_id: xcb::x::Window) -> Option { + self.child_to_parent_id.borrow().get(&child_id).copied() + } + fn dispatch_pending_events(&self) -> anyhow::Result<()> { for window in self.windows.borrow().values() { let mut inner = window.lock().unwrap(); @@ -579,6 +600,11 @@ impl XConnection { if let Some(window) = self.window_by_id(window_id) { let mut inner = window.lock().unwrap(); inner.dispatch_event(event)?; + } else if let Some(parent_id) = self.parent_id_by_child_id(window_id) { + if let Some(window) = self.window_by_id(parent_id) { + let mut inner = window.lock().unwrap(); + inner.dispatch_event(event)?; + } } Ok(()) } @@ -610,6 +636,22 @@ impl XConnection { let atom_xsel_data = Self::intern_atom(&conn, "XSEL_DATA")?; let atom_targets = Self::intern_atom(&conn, "TARGETS")?; let atom_clipboard = Self::intern_atom(&conn, "CLIPBOARD")?; + let atom_texturilist = Self::intern_atom(&conn, "text/uri-list")?; + let atom_xmozurl = Self::intern_atom(&conn, "text/x-moz-url")?; + let atom_xdndaware = Self::intern_atom(&conn, "XdndAware")?; + let atom_xdndtypelist = Self::intern_atom(&conn, "XdndTypeList")?; + let atom_xdndselection = Self::intern_atom(&conn, "XdndSelection")?; + let atom_xdndenter = Self::intern_atom(&conn, "XdndEnter")?; + let atom_xdndposition = Self::intern_atom(&conn, "XdndPosition")?; + let atom_xdndstatus = Self::intern_atom(&conn, "XdndStatus")?; + let atom_xdndleave = Self::intern_atom(&conn, "XdndLeave")?; + let atom_xdnddrop = Self::intern_atom(&conn, "XdndDrop")?; + let atom_xdndfinished = Self::intern_atom(&conn, "XdndFinished")?; + let atom_xdndactioncopy = Self::intern_atom(&conn, "XdndActionCopy")?; + let atom_xdndactionmove = Self::intern_atom(&conn, "XdndActionMove")?; + let atom_xdndactionlink = Self::intern_atom(&conn, "XdndActionLink")?; + let atom_xdndactionask = Self::intern_atom(&conn, "XdndActionAsk")?; + let atom_xdndactionprivate = Self::intern_atom(&conn, "XdndActionPrivate")?; let atom_gtk_edge_constraints = Self::intern_atom(&conn, "_GTK_EDGE_CONSTRAINTS")?; let atom_xsettings_selection = Self::intern_atom(&conn, &format!("_XSETTINGS_S{}", screen_num))?; @@ -731,6 +773,22 @@ impl XConnection { xrm: RefCell::new(xrm), atom_protocols, atom_clipboard, + atom_texturilist, + atom_xmozurl, + atom_xdndaware, + atom_xdndtypelist, + atom_xdndselection, + atom_xdndenter, + atom_xdndposition, + atom_xdndstatus, + atom_xdndleave, + atom_xdnddrop, + atom_xdndfinished, + atom_xdndactioncopy, + atom_xdndactionmove, + atom_xdndactionlink, + atom_xdndactionask, + atom_xdndactionprivate, atom_gtk_edge_constraints, atom_xsettings_selection, atom_xsettings_settings, @@ -756,6 +814,7 @@ impl XConnection { atom_xsel_data, atom_targets, windows: RefCell::new(HashMap::new()), + child_to_parent_id: RefCell::new(HashMap::new()), should_terminate: RefCell::new(false), depth, visual, diff --git a/window/src/os/x11/window.rs b/window/src/os/x11/window.rs index b66da14fa..58ec4f893 100644 --- a/window/src/os/x11/window.rs +++ b/window/src/os/x11/window.rs @@ -18,8 +18,10 @@ use raw_window_handle::{ }; use std::any::Any; use std::convert::TryInto; +use std::path::PathBuf; use std::rc::{Rc, Weak}; use std::sync::{Arc, Mutex}; +use url::Url; use wezterm_font::FontConfiguration; use wezterm_input_types::{KeyCode, KeyEvent, KeyboardLedStatus, Modifiers}; use xcb::x::{Atom, PropMode}; @@ -57,8 +59,31 @@ impl CopyAndPaste { } } +struct DragAndDrop { + src_window: Option, + src_types: Vec, + src_action: Atom, + time: u32, + target_type: Atom, + target_action: Atom, +} + +impl Default for DragAndDrop { + fn default() -> DragAndDrop { + DragAndDrop { + src_window: None, + src_types: Vec::new(), + src_action: xcb::x::ATOM_NONE, + time: 0, + target_type: xcb::x::ATOM_NONE, + target_action: xcb::x::ATOM_NONE, + } + } +} + pub(crate) struct XWindowInner { pub window_id: xcb::x::Window, + pub child_id: xcb::x::Window, conn: Weak, pub events: WindowEventSender, width: u16, @@ -67,6 +92,7 @@ pub(crate) struct XWindowInner { dpi: f64, cursors: CursorInfo, copy_and_paste: CopyAndPaste, + drag_and_drop: DragAndDrop, config: ConfigHandle, appearance: Appearance, title: String, @@ -97,6 +123,9 @@ impl Drop for XWindowInner { .flush() .context("flush pending requests prior to issuing DestroyWindow") .ok(); + conn.send_request_no_reply_log(&xcb::x::DestroyWindow { + window: self.child_id, + }); conn.send_request_no_reply_log(&xcb::x::DestroyWindow { window: self.window_id, }); @@ -120,7 +149,7 @@ unsafe impl HasRawDisplayHandle for XWindowInner { unsafe impl HasRawWindowHandle for XWindowInner { fn raw_window_handle(&self) -> RawWindowHandle { let mut handle = XcbWindowHandle::empty(); - handle.window = self.window_id.resource_id(); + handle.window = self.child_id.resource_id(); handle.visual_id = self.conn.upgrade().unwrap().visual.visual_id(); RawWindowHandle::Xcb(handle) } @@ -133,11 +162,11 @@ impl XWindowInner { let gl_state = match conn.gl_connection.borrow().as_ref() { None => crate::egl::GlState::create( Some(conn.conn.get_raw_dpy() as *const _), - self.window_id.resource_id() as *mut _, + self.child_id.resource_id() as *mut _, ), Some(glconn) => crate::egl::GlState::create_with_existing_connection( glconn, - self.window_id.resource_id() as *mut _, + self.child_id.resource_id() as *mut _, ), }; @@ -236,6 +265,18 @@ impl XWindowInner { self.pending.push(event); } + fn resize_child(&self, width: u32, height: u32) { + self.conn() + .send_request_no_reply_log(&xcb::x::ConfigureWindow { + window: self.child_id, + value_list: &[ + xcb::x::ConfigWindow::Width(width as u32), + xcb::x::ConfigWindow::Height(height as u32), + ], + }); + // send_request_no_reply_log() is synchronous, so no further synchronization required + } + pub fn dispatch_pending_events(&mut self) -> anyhow::Result<()> { if self.pending.is_empty() { return Ok(()); @@ -330,6 +371,8 @@ impl XWindowInner { || self.height != geom.height() || self.last_wm_state != window_state { + self.resize_child(geom.width() as u32, geom.height() as u32); + self.width = geom.width(); self.height = geom.height(); self.last_wm_state = window_state; @@ -435,6 +478,7 @@ impl XWindowInner { fn configure_notify(&mut self, source: &str, width: u16, height: u16) -> anyhow::Result<()> { let conn = self.conn(); + self.update_ime_position(); let mut dpi = conn.default_dpi(); @@ -485,6 +529,8 @@ impl XWindowInner { return Ok(()); } + self.resize_child(width as u32, height as u32); + log::trace!( "{source}: width {} -> {}, height {} -> {}, dpi {} -> {}", self.width, @@ -516,6 +562,128 @@ impl XWindowInner { Ok(()) } + fn xdnd_event(&mut self, msgtype: Atom, data: &[u32]) -> anyhow::Result<()> { + use xcb::XidNew; + let conn = self.conn(); + let msgtype_name = conn.atom_name(msgtype); + let srcwin = unsafe { xcb::x::Window::new(data[0]) }; + if msgtype == conn.atom_xdndenter { + self.drag_and_drop.src_window = Some(srcwin); + let moretypes = data[1] & 0x01 != 0; + let xdndversion = data[1] >> 24 as u8; + log::trace!("ClientMessage {msgtype_name}, Version {xdndversion}, more than 3 types: {moretypes}"); + if !moretypes { + self.drag_and_drop.src_types = data[2..] + .into_iter() + .filter(|&&x| x != 0) + .map(|&x| unsafe { Atom::new(x) }) + .collect(); + } else { + self.drag_and_drop.src_types = + match conn.send_and_wait_request(&xcb::x::GetProperty { + delete: false, + window: srcwin, + property: conn.atom_xdndtypelist, + r#type: xcb::x::ATOM_ATOM, + long_offset: 0, + long_length: u32::max_value(), + }) { + Ok(prop) => prop.value::().to_vec(), + Err(err) => { + log::error!( + "xdnd: unable to get type list from source window: {:?}", + err + ); + Vec::::new() + } + }; + } + self.drag_and_drop.target_type = xcb::x::ATOM_NONE; + for t in [ + conn.atom_texturilist, + conn.atom_xmozurl, + conn.atom_utf8_string, + ] { + if self.drag_and_drop.src_types.contains(&t) { + self.drag_and_drop.target_type = t; + break; + } + } + for t in &self.drag_and_drop.src_types { + log::trace!("types offered: {}", conn.atom_name(*t)); + } + log::trace!( + "selected: {}", + conn.atom_name(self.drag_and_drop.target_type) + ); + } else if self.drag_and_drop.src_window != Some(srcwin) { + log::error!("ClientMessage {msgtype_name} received, but no Xdnd in progress or source window mismatch"); + } else if msgtype == conn.atom_xdndposition { + self.drag_and_drop.time = data[3]; + let (x, y) = (data[2] >> 16 as u16, data[2] as u16); + self.drag_and_drop.src_action = unsafe { Atom::new(data[4]) }; + self.drag_and_drop.target_action = conn.atom_xdndactioncopy; + log::trace!( + "ClientMessage {msgtype_name}, ({x}, {y}), timestamp: {}, action: {}", + self.drag_and_drop.time, + conn.atom_name(self.drag_and_drop.src_action) + ); + conn.send_request_no_reply_log(&xcb::x::SendEvent { + propagate: false, + destination: xcb::x::SendEventDest::Window(srcwin), + event_mask: xcb::x::EventMask::empty(), + event: &xcb::x::ClientMessageEvent::new( + srcwin, + conn.atom_xdndstatus, + xcb::x::ClientMessageData::Data32([ + self.window_id.resource_id(), + 2 | (self.drag_and_drop.target_type != xcb::x::ATOM_NONE) as u32, + 0, + 0, + self.drag_and_drop.target_action.resource_id(), + ]), + ), + }); + } else if msgtype == conn.atom_xdndleave { + self.drag_and_drop.src_window = None; + log::trace!("ClientMessage {msgtype_name}"); + } else if msgtype == conn.atom_xdnddrop { + self.drag_and_drop.time = data[2]; + log::trace!( + "ClientMessage {msgtype_name}, timestamp: {}", + self.drag_and_drop.time + ); + if self.drag_and_drop.target_type != xcb::x::ATOM_NONE { + conn.send_request_no_reply_log(&xcb::x::ConvertSelection { + requestor: self.window_id, + selection: conn.atom_xdndselection, + target: self.drag_and_drop.target_type, + property: conn.atom_xsel_data, + time: self.drag_and_drop.time, + }); + } else { + log::warn!("XdndDrop received, but no target type selected. Ignoring."); + conn.send_request_no_reply_log(&xcb::x::SendEvent { + propagate: false, + destination: xcb::x::SendEventDest::Window(srcwin), + event_mask: xcb::x::EventMask::empty(), + event: &xcb::x::ClientMessageEvent::new( + srcwin, + conn.atom_xdndfinished, + xcb::x::ClientMessageData::Data32([ + self.window_id.resource_id(), + 0, + 0, + 0, + 0, + ]), + ), + }); + } + } + return Ok(()); + } + pub fn dispatch_event(&mut self, event: &Event) -> anyhow::Result<()> { let conn = self.conn(); match event { @@ -589,19 +757,42 @@ impl XWindowInner { )?; } Event::X(xcb::x::Event::ClientMessage(msg)) => { + let type_atom_name = conn.atom_name(msg.r#type()); use xcb::x::ClientMessageData; - match msg.data() { - ClientMessageData::Data32(data) => { - if data[0] == conn.atom_delete().resource_id() { + use xcb::XidNew; + let xdnd_msgtype_atoms = [ + conn.atom_xdndenter, + conn.atom_xdndposition, + conn.atom_xdndstatus, + conn.atom_xdndleave, + conn.atom_xdnddrop, + conn.atom_xdndfinished, + ]; + if xdnd_msgtype_atoms.contains(&msg.r#type()) { + if let ClientMessageData::Data32(data) = msg.data() { + self.xdnd_event(msg.r#type(), &data)?; + } else { + log::warn!("Received ClientMessage {type_atom_name} with wrong format"); + } + } else if msg.r#type() == conn.atom_protocols { + if let ClientMessageData::Data32(data) = msg.data() { + let protocol_atom = unsafe { Atom::new(data[0]) }; + log::trace!( + "ClientMessage {type_atom_name}/{}", + conn.atom_name(protocol_atom) + ); + if protocol_atom == conn.atom_delete { self.events.dispatch(WindowEvent::CloseRequested); } + } else { + log::warn!("Received ClientMessage {type_atom_name} with wrong format"); } - ClientMessageData::Data8(_) | ClientMessageData::Data16(_) => {} } } Event::X(xcb::x::Event::DestroyNotify(_)) => { self.events.dispatch(WindowEvent::Destroyed); conn.windows.borrow_mut().remove(&self.window_id); + conn.child_to_parent_id.borrow_mut().remove(&self.child_id); } Event::X(xcb::x::Event::SelectionClear(e)) => { self.selection_clear(e)?; @@ -932,6 +1123,54 @@ impl XWindowInner { } } } + } else if selection.selection() == conn.atom_xdndselection + && selection.property() == conn.atom_xsel_data + { + if let Some(srcwin) = self.drag_and_drop.src_window { + match conn.send_and_wait_request(&xcb::x::GetProperty { + delete: true, + window: selection.requestor(), + property: selection.property(), + r#type: selection.target(), + long_offset: 0, + long_length: u32::max_value(), + }) { + Ok(prop) => { + if selection.target() == conn.atom_utf8_string { + let text = String::from_utf8_lossy(prop.value()).to_string(); + self.events.dispatch(WindowEvent::DroppedString(text)); + } else if selection.target() == conn.atom_xmozurl { + let data = decode_dropped_url_string(prop.value()); + let urls = parse_xmozurl_list(&data); + self.events.dispatch(WindowEvent::DroppedUrl(urls)); + } else if selection.target() == conn.atom_texturilist { + let paths = parse_texturi_list(prop.value()); + self.events.dispatch(WindowEvent::DroppedFile(paths)); + } + } + Err(err) => { + log::error!("clipboard: err while getting clipboard property: {err:#}"); + } + } + conn.send_request_no_reply_log(&xcb::x::SendEvent { + propagate: false, + destination: xcb::x::SendEventDest::Window(srcwin), + event_mask: xcb::x::EventMask::empty(), + event: &xcb::x::ClientMessageEvent::new( + srcwin, + conn.atom_xdndfinished, + xcb::x::ClientMessageData::Data32([ + window_id.resource_id(), + 1, + self.drag_and_drop.target_action.resource_id(), + 0, + 0, + ]), + ), + }); + } else { + log::warn!("No Xdnd in progress, but received Xdnd selection. Ignoring."); + } } else { log::trace!("SEL: window_id={window_id:?} unknown selection {selection_name}"); } @@ -1138,6 +1377,7 @@ impl XWindow { let mut events = WindowEventSender::new(event_handler); let window_id; + let child_id; let window = { let setup = conn.conn().get_setup(); let screen = setup @@ -1146,6 +1386,7 @@ impl XWindow { .ok_or_else(|| anyhow!("no screen?"))?; window_id = conn.conn().generate_id(); + child_id = conn.conn().generate_id(); let color_map_id = conn.conn().generate_id(); conn.send_request_no_reply(&xcb::x::CreateColormap { @@ -1171,10 +1412,10 @@ impl XWindow { // We have to specify both a border pixel color and a colormap // when specifying a depth that doesn't match the root window in // order to avoid a BadMatch - xcb::x::Cw::BorderPixel(0), + xcb::x::Cw::BackPixel(0), // transparent background + xcb::x::Cw::BorderPixel(screen.black_pixel()), xcb::x::Cw::EventMask( - xcb::x::EventMask::EXPOSURE - | xcb::x::EventMask::FOCUS_CHANGE + xcb::x::EventMask::FOCUS_CHANGE | xcb::x::EventMask::KEY_PRESS | xcb::x::EventMask::BUTTON_PRESS | xcb::x::EventMask::BUTTON_RELEASE @@ -1190,6 +1431,33 @@ impl XWindow { }) .context("xcb::create_window_checked")?; + conn.send_request_no_reply(&xcb::x::CreateWindow { + depth: conn.depth, + wid: child_id, + parent: window_id, + x: 0, + y: 0, + width: width.try_into()?, + height: height.try_into()?, + border_width: 0, + class: xcb::x::WindowClass::InputOutput, + visual: conn.visual.visual_id(), + value_list: &[ + // We have to specify both a border pixel color and a colormap + // when specifying a depth that doesn't match the root window in + // order to avoid a BadMatch + xcb::x::Cw::BackPixel(0), // transparent background + xcb::x::Cw::BorderPixel(screen.black_pixel()), + xcb::x::Cw::BitGravity(xcb::x::Gravity::NorthWest), + xcb::x::Cw::EventMask(xcb::x::EventMask::EXPOSURE), + xcb::x::Cw::Colormap(color_map_id), + ], + }) + .context("xcb::create_window_checked")?; + + conn.send_request_no_reply(&xcb::x::MapWindow { window: child_id }) + .context("xcb::map_window")?; + events.assign_window(Window::X11(XWindow::from_id(window_id))); let appearance = conn.get_appearance(); @@ -1198,12 +1466,14 @@ impl XWindow { title: String::new(), appearance, window_id, + child_id, conn: Rc::downgrade(&conn), events, width: width.try_into()?, height: height.try_into()?, dpi: conn.default_dpi(), copy_and_paste: CopyAndPaste::default(), + drag_and_drop: DragAndDrop::default(), cursors: CursorInfo::new(&config, &conn), config: config.clone(), has_focus: None, @@ -1253,6 +1523,14 @@ impl XWindow { data: &[conn.atom_delete], })?; + conn.send_request_no_reply(&xcb::x::ChangeProperty { + mode: PropMode::Replace, + window: window_id, + property: conn.atom_xdndaware, + r#type: xcb::x::ATOM_ATOM, + data: &[5u32], + })?; + window .lock() .unwrap() @@ -1261,6 +1539,9 @@ impl XWindow { let window_handle = Window::X11(XWindow::from_id(window_id)); conn.windows.borrow_mut().insert(window_id, window); + conn.child_to_parent_id + .borrow_mut() + .insert(child_id, window_id); window_handle.set_title(name); // Before we map the window, flush to ensure that all of the other properties @@ -1304,6 +1585,10 @@ impl XWindowInner { // Drop impl, and that cannot succeed after we've // destroyed the window at the X11 level. self.conn().windows.borrow_mut().remove(&self.window_id); + self.conn() + .child_to_parent_id + .borrow_mut() + .remove(&self.child_id); // Unmap the window first: calling DestroyWindow here may race // with some requests made either by EGL or the IME, but I haven't @@ -1313,6 +1598,10 @@ impl XWindowInner { window: self.window_id, }); + conn.send_request_no_reply_log(&xcb::x::DestroyWindow { + window: self.child_id, + }); + // Arrange to destroy the window after a couple of seconds; that // should give whatever stuff is still referencing the window // to finish and avoid triggering a protocol error. @@ -1763,6 +2052,7 @@ impl WindowOps for XWindow { xcb::x::ConfigWindow::Height(height as u32), ], }); + inner.resize_child(width as u32, height as u32); inner.outstanding_configure_requests += 1; Ok(()) }); @@ -1871,6 +2161,67 @@ impl WindowOps for XWindow { } } +fn parse_texturi_list(url_list: &[u8]) -> Vec { + String::from_utf8_lossy(url_list) + .lines() + .filter_map(|line| { + if line.starts_with('#') || line.trim().is_empty() { + // text/uri-list: Any lines beginning with the '#' character + // are comment lines and are ignored during processing + return None; + } + let url = Url::parse(line) + .map_err(|err| { + log::error!("Error parsing dropped file line {line} as url: {err:#}"); + }) + .ok()?; + url.to_file_path() + .map_err(|_| { + log::error!("Error converting url {url:?} from line {line} to pathbuf"); + }) + .ok() + }) + .collect() +} + +fn parse_xmozurl_list(url_list: &str) -> Vec { + url_list + .lines() + .step_by(2) + .filter_map(|line| { + // the lines alternate between the urls and their titles + Url::parse(line) + .map_err(|err| { + log::error!("Error parsing dropped file line {line} as url: {err:#}"); + }) + .ok() + }) + .collect() +} + +/// Data may be UTF16 in either byte order, or UTF8 +fn decode_dropped_url_string(raw: &[u8]) -> String { + if raw.len() >= 2 && ((raw[0], raw[1]) == (0xfe, 0xff) || (raw[0] != 0x00 && raw[1] == 0x00)) { + String::from_utf16_lossy( + raw.chunks_exact(2) + .map(|x: &[u8]| u16::from(x[1]) << 8 | u16::from(x[0])) + .collect::>() + .as_slice(), + ) + } else if raw.len() >= 2 + && ((raw[0], raw[1]) == (0xff, 0xfe) || (raw[0] == 0x00 && raw[1] != 0x00)) + { + String::from_utf16_lossy( + raw.chunks_exact(2) + .map(|x: &[u8]| u16::from(x[0]) << 8 | u16::from(x[1])) + .collect::>() + .as_slice(), + ) + } else { + String::from_utf8_lossy(raw).to_string() + } +} + #[derive(Debug, Clone, Copy, Eq, PartialEq)] #[repr(u32)] enum NetWmStateAction { diff --git a/window/src/os/xdg_desktop_portal.rs b/window/src/os/xdg_desktop_portal.rs index 9592ece8e..0709efec5 100644 --- a/window/src/os/xdg_desktop_portal.rs +++ b/window/src/os/xdg_desktop_portal.rs @@ -9,10 +9,10 @@ use futures_util::stream::StreamExt; use std::collections::HashMap; use std::sync::Mutex; use std::time::Instant; -use zbus::dbus_proxy; +use zbus::proxy; use zvariant::OwnedValue; -#[dbus_proxy( +#[proxy( interface = "org.freedesktop.portal.Settings", default_service = "org.freedesktop.portal.Desktop", default_path = "/org/freedesktop/portal/desktop" @@ -25,8 +25,8 @@ trait PortalSettings { fn Read(&self, namespace: &str, key: &str) -> zbus::Result; - #[dbus_proxy(signal)] - fn SettingChanged(&self, namespace: &str, key: &str, value: OwnedValue) -> Result<()>; + #[zbus(signal)] + fn SettingChanged(&self, namespace: &str, key: &str, value: OwnedValue) -> zbus::Result<()>; } #[derive(PartialEq)] @@ -89,12 +89,12 @@ pub async fn read_setting(namespace: &str, key: &str) -> anyhow::Result anyhow::Result { Ok(match value.downcast_ref::() { - Some(1) => Appearance::Dark, - Some(_) => Appearance::Light, - None => { + Ok(1) => Appearance::Dark, + Ok(_) => Appearance::Light, + Err(err) => { anyhow::bail!( "Unable to resolve appearance \ - using xdg-desktop-portal: expected a u32 value but got {value:#?}" + using xdg-desktop-portal: {err:#?}" ); } }) diff --git a/window/src/spawn.rs b/window/src/spawn.rs index 55da54e09..5363ef4b1 100644 --- a/window/src/spawn.rs +++ b/window/src/spawn.rs @@ -68,10 +68,10 @@ impl SpawnQueue { // returned function fn pop_func(&self) -> Option { if let Some(func) = self.spawned_funcs.lock().unwrap().pop_front() { - metrics::histogram!("executor.spawn_delay", func.at.elapsed()); + metrics::histogram!("executor.spawn_delay").record(func.at.elapsed()); Some(func.func) } else if let Some(func) = self.spawned_funcs_low_pri.lock().unwrap().pop_front() { - metrics::histogram!("executor.spawn_delay.low_pri", func.at.elapsed()); + metrics::histogram!("executor.spawn_delay.low_pri").record(func.at.elapsed()); Some(func.func) } else { None