From 7fd9c36efb6cb1d8e301f72e42ccb180936b9ff5 Mon Sep 17 00:00:00 2001 From: MLFlexer <75012728+MLFlexer@users.noreply.github.com> Date: Sat, 27 Apr 2024 11:40:31 +0200 Subject: [PATCH 001/140] Renamed MoveToSelectionOtherEnd to MoveToSelectionOtherEndHoriz in doc --- .../lua/keyassignment/CopyMode/MoveToSelectionOtherEndHoriz.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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', }, }, }, From 878b86f0f073f81454a396b1be16378ff1bf7c03 Mon Sep 17 00:00:00 2001 From: MLFlexer <75012728+MLFlexer@users.noreply.github.com> Date: Sat, 27 Apr 2024 17:47:05 +0200 Subject: [PATCH 002/140] fixed docs typo in MoveForwardSemanticZone --- .../lua/keyassignment/CopyMode/MoveForwardSemanticZone.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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', }, }, }, From a77ff4b84692bdd3cc5855d92c6de5588568962f Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Sun, 28 Apr 2024 19:54:54 -0700 Subject: [PATCH 003/140] fix some warnings with newer rust The warning is that some of the variants are never read. In the case of ftwrap, they are referenced via ffi. For the other locations, we want them for debug purposes. --- wezterm-font/src/ftwrap.rs | 1 + wezterm-mux-server/src/daemonize.rs | 1 + wezterm-toast-notification/src/dbus.rs | 1 + wezterm/src/asciicast.rs | 1 + 4 files changed, 4 insertions(+) diff --git a/wezterm-font/src/ftwrap.rs b/wezterm-font/src/ftwrap.rs index 0d4bb50b4..5f06a3fb8 100644 --- a/wezterm-font/src/ftwrap.rs +++ b/wezterm-font/src/ftwrap.rs @@ -1294,6 +1294,7 @@ struct FreeTypeStream { name: String, } +#[allow(dead_code)] enum StreamBacking { File(BufReader), Map(Mmap), 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-toast-notification/src/dbus.rs b/wezterm-toast-notification/src/dbus.rs index 2ae2a2afe..d00f034d2 100644 --- a/wezterm-toast-notification/src/dbus.rs +++ b/wezterm-toast-notification/src/dbus.rs @@ -71,6 +71,7 @@ enum Reason { Expired, Dismissed, Closed, + #[allow(dead_code)] Unknown(u32), } diff --git a/wezterm/src/asciicast.rs b/wezterm/src/asciicast.rs index 13c20defc..9ea044816 100644 --- a/wezterm/src/asciicast.rs +++ b/wezterm/src/asciicast.rs @@ -626,6 +626,7 @@ impl PlayCommand { } } +#[allow(dead_code)] #[derive(Debug)] enum Summarized { Action(Action), From eae41c753ef7b3d1aebc809ac4bb46a78dee7188 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Sun, 28 Apr 2024 19:56:02 -0700 Subject: [PATCH 004/140] cargo update --- Cargo.lock | 435 +++++++++++++++++++++++++++++------------------------ 1 file changed, 237 insertions(+), 198 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f781b18e5..645f6b4cf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -58,9 +58,9 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.16" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" [[package]] name = "android-tzdata" @@ -133,9 +133,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.81" +version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0952808a6c2afd1aa8947271f3a60f1a6763c7b912d210184c5149b5cf147247" +checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" [[package]] name = "arrayref" @@ -202,27 +202,26 @@ dependencies = [ [[package]] name = "async-channel" -version = "2.2.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28243a43d821d11341ab73c80bed182dc015c514b951616cf79bd4af39af0c3" +checksum = "136d4d23bcc79e27423727b36823d86233aad06dfea531837b038394d11e9928" 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-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", + "fastrand 2.1.0", "futures-lite 2.3.0", "slab", ] @@ -271,8 +270,8 @@ dependencies = [ "futures-io", "futures-lite 2.3.0", "parking", - "polling 3.6.0", - "rustix 0.38.32", + "polling 3.7.0", + "rustix 0.38.34", "slab", "tracing", "windows-sys 0.52.0", @@ -322,54 +321,54 @@ dependencies = [ "cfg-if", "event-listener 3.1.0", "futures-lite 1.13.0", - "rustix 0.38.32", + "rustix 0.38.34", "windows-sys 0.48.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.60", ] [[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-lock 3.3.0", "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.60", ] [[package]] @@ -441,6 +440,12 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +[[package]] +name = "base64" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51" + [[package]] name = "base91" version = "0.1.0" @@ -519,18 +524,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-channel 2.2.1", "async-lock 3.3.0", "async-task", - "fastrand 2.0.2", "futures-io", "futures-lite 2.3.0", "piper", - "tracing", ] [[package]] @@ -557,9 +560,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.15.4" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" @@ -578,7 +581,7 @@ checksum = "4da9a32f3fed317401fa3c862968128267c3106685286e15d5aaa3d7389c2f60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -634,12 +637,13 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.0.90" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" +checksum = "d32a725bc159af97c3e629873bb9f88fb8cf8a4867175f76dc987815ea07c83b" dependencies = [ "jobserver", "libc", + "once_cell", ] [[package]] @@ -648,6 +652,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 +669,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,7 +705,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" dependencies = [ "ciborium-io", - "half 2.4.0", + "half 2.4.1", ] [[package]] @@ -746,9 +756,9 @@ dependencies = [ [[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", ] @@ -772,7 +782,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -947,9 +957,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", ] @@ -1306,7 +1316,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.10.0", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -1317,7 +1327,7 @@ checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" dependencies = [ "darling_core", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -1328,9 +1338,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" @@ -1368,7 +1378,7 @@ dependencies = [ "backtrace", "lazy_static", "mintex", - "parking_lot 0.12.1", + "parking_lot 0.12.2", "rustc-hash", "serde", "serde_json", @@ -1455,9 +1465,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 +1485,9 @@ dependencies = [ [[package]] name = "either" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" +checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" [[package]] name = "embed-resource" @@ -1494,18 +1504,18 @@ 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", ] @@ -1539,7 +1549,7 @@ checksum = "5c785274071b1b420972453b306eeca06acf4633829db4223b58a2a8c5953bc4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -1687,9 +1697,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", @@ -1703,7 +1713,7 @@ checksum = "887d93f60543e9a9362ef8a21beedd0a833c5d9610e18c67abe15a5963dcb1a4" dependencies = [ "bit_field", "flume 0.11.0", - "half 2.4.0", + "half 2.4.1", "lebe", "miniz_oxide 0.7.2", "rayon-core", @@ -1744,9 +1754,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.0.2" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "fdeflate" @@ -1815,7 +1825,7 @@ checksum = "2fc715d38bea7b5bf487fcd79bcf8c209f0b58014f3018a7a19c2b855f472048" dependencies = [ "az", "bytemuck", - "half 2.4.0", + "half 2.4.1", "typenum", ] @@ -1827,9 +1837,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.28" +version = "1.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +checksum = "4556222738635b7a3417ae6130d8f52201e45a0c4d1a907f0826383adb5f85e7" dependencies = [ "crc32fast", "miniz_oxide 0.7.2", @@ -1910,7 +1920,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -2030,7 +2040,7 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" dependencies = [ - "fastrand 2.0.2", + "fastrand 2.1.0", "futures-core", "futures-io", "parking", @@ -2045,7 +2055,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -2122,9 +2132,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" dependencies = [ "cfg-if", "js-sys", @@ -2252,7 +2262,7 @@ dependencies = [ "futures-timer", "no-std-compat", "nonzero_ext", - "parking_lot 0.12.1", + "parking_lot 0.12.2", "smallvec", ] @@ -2297,7 +2307,7 @@ checksum = "cc11df1ace8e7e564511f53af41f3e42ddc95b56fd07b3f4445d2a6048bc682c" dependencies = [ "bitflags 2.5.0", "gpu-descriptor-types", - "hashbrown 0.14.3", + "hashbrown 0.14.5", ] [[package]] @@ -2346,9 +2356,9 @@ checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" [[package]] name = "half" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5eceaaeec696539ddaf7b333340f1af35a5aa87ae3e4f3ead0532f72affab2e" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" dependencies = [ "cfg-if", "crunchy", @@ -2391,9 +2401,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ "ahash 0.8.11", "allocator-api2", @@ -2514,9 +2524,9 @@ dependencies = [ [[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", @@ -2677,7 +2687,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", - "hashbrown 0.14.3", + "hashbrown 0.14.5", ] [[package]] @@ -2772,9 +2782,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", ] @@ -2827,7 +2837,7 @@ dependencies = [ "libc", "proc-macro2", "regex", - "syn 2.0.58", + "syn 2.0.60", "terminal_size 0.2.6", ] @@ -2980,7 +2990,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]] @@ -3095,9 +3105,9 @@ checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" [[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", @@ -3159,11 +3169,11 @@ 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 0.28.0", "winapi", ] @@ -3406,7 +3416,7 @@ dependencies = [ "names", "nix 0.25.1", "ntapi", - "parking_lot 0.12.1", + "parking_lot 0.12.2", "percent-encoding", "portable-pty", "procinfo", @@ -3438,7 +3448,7 @@ dependencies = [ "log", "luahelper", "mux", - "parking_lot 0.12.1", + "parking_lot 0.12.2", "portable-pty", "smol", "termwiz", @@ -3544,6 +3554,19 @@ dependencies = [ "pin-utils", ] +[[package]] +name = "nix" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" +dependencies = [ + "bitflags 2.5.0", + "cfg-if", + "cfg_aliases", + "libc", + "memoffset 0.9.1", +] + [[package]] name = "no-std-compat" version = "0.4.1" @@ -3764,7 +3787,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -3841,12 +3864,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,15 +3888,15 @@ 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]] @@ -3884,11 +3907,11 @@ checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" [[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.0", "serde", ] @@ -3929,7 +3952,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -3983,7 +4006,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -4012,7 +4035,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -4034,7 +4057,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" dependencies = [ "atomic-waker", - "fastrand 2.0.2", + "fastrand 2.1.0", "futures-io", ] @@ -4130,15 +4153,15 @@ dependencies = [ [[package]] name = "polling" -version = "3.6.0" +version = "3.7.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", "pin-project-lite", - "rustix 0.38.32", + "rustix 0.38.34", "tracing", "windows-sys 0.52.0", ] @@ -4226,9 +4249,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.79" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" +checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" dependencies = [ "unicode-ident", ] @@ -4320,9 +4343,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", ] @@ -4437,6 +4460,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" @@ -4599,7 +4631,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.58", + "syn 2.0.60", "unicode-ident", ] @@ -4655,9 +4687,9 @@ 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", @@ -4760,9 +4792,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.197" +version = "1.0.199" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +checksum = "0c9f6e76df036c77cd94996771fb40db98187f096dd0b9af39c6c6e452ba966a" dependencies = [ "serde_derive", ] @@ -4792,20 +4824,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.197" +version = "1.0.199" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +checksum = "11bd257a6541e141e42ca6d24ae26f7714887b47e89aa739099104c7e4d3b7fc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] name = "serde_json" -version = "1.0.115" +version = "1.0.116" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12dc5c46daa8e9fdf4f5e71b6cf9a53f2487da0e86e55808e2d35539666497dd" +checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" dependencies = [ "itoa", "ryu", @@ -4814,13 +4846,13 @@ 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.60", ] [[package]] @@ -4869,7 +4901,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -4995,9 +5027,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", ] @@ -5268,9 +5300,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.58" +version = "2.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44cfb93f38070beee36b3fef7d4f5a16f27751d94b187b666a5cc5e9b0d30687" +checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" dependencies = [ "proc-macro2", "quote", @@ -5360,8 +5392,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" dependencies = [ "cfg-if", - "fastrand 2.0.2", - "rustix 0.38.32", + "fastrand 2.1.0", + "rustix 0.38.34", "windows-sys 0.52.0", ] @@ -5400,7 +5432,7 @@ 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", ] @@ -5528,22 +5560,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.58" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" +checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.58" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" +checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -5575,9 +5607,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 +5643,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", @@ -5695,7 +5727,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -5740,7 +5772,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.9", + "toml_edit 0.22.12", ] [[package]] @@ -5765,15 +5797,15 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.9" +version = "0.22.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e40bb779c5187258fd7aad0eb68cb8706a0a81fa712fbea808ab43c4b8374c4" +checksum = "d3328d4f68a705b2a4498da1d580585d39a6510f98318a2cec3018a7ec61ddef" dependencies = [ "indexmap 2.2.6", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.5", + "winnow 0.6.7", ] [[package]] @@ -5801,7 +5833,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -5894,9 +5926,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" @@ -6075,7 +6107,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", "wasm-bindgen-shared", ] @@ -6109,7 +6141,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -6313,7 +6345,7 @@ dependencies = [ "metrics", "mux", "openssl", - "parking_lot 0.12.1", + "parking_lot 0.12.2", "portable-pty", "promise", "rangeset", @@ -6434,7 +6466,7 @@ dependencies = [ "env-bootstrap", "env_logger 0.11.3", "euclid", - "fastrand 2.0.2", + "fastrand 2.1.0", "filedescriptor", "finl_unicode", "frecency", @@ -6455,7 +6487,7 @@ dependencies = [ "mux-lua", "once_cell", "ordered-float", - "parking_lot 0.12.1", + "parking_lot 0.12.2", "portable-pty", "promise", "rangeset", @@ -6681,7 +6713,7 @@ dependencies = [ "js-sys", "log", "naga", - "parking_lot 0.12.1", + "parking_lot 0.12.2", "profiling", "raw-window-handle", "smallvec", @@ -6706,7 +6738,7 @@ dependencies = [ "codespan-reporting", "log", "naga", - "parking_lot 0.12.1", + "parking_lot 0.12.2", "profiling", "raw-window-handle", "rustc-hash", @@ -6746,7 +6778,7 @@ dependencies = [ "naga", "objc", "once_cell", - "parking_lot 0.12.1", + "parking_lot 0.12.2", "profiling", "range-alloc", "raw-window-handle", @@ -6779,7 +6811,7 @@ checksum = "8211e4f58a2b2805adfbefbc07bab82958fc91e3836339b1ab7ae32465dce0d7" dependencies = [ "either", "home", - "rustix 0.38.32", + "rustix 0.38.34", "winsafe", ] @@ -6796,9 +6828,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 +6850,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]] @@ -6944,7 +6976,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 +7003,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 +7038,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 +7066,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 +7090,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 +7114,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 +7144,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 +7168,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 +7186,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 +7210,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 +7225,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.5" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dffa400e67ed5a4dd237983829e66475f0a4a26938c4b04c21baede6262215b8" +checksum = "14b9415ee827af173ebb3f15f9083df5a122eb93572ec28741fb153356ea2578" dependencies = [ "memchr", ] @@ -7245,14 +7284,14 @@ checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" dependencies = [ "libc", "linux-raw-sys 0.4.13", - "rustix 0.38.32", + "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", @@ -7414,7 +7453,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] From 7554ef65707f13b622370fd1736e5404abdcdeeb Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Mon, 29 Apr 2024 06:25:56 -0700 Subject: [PATCH 005/140] maybe fixup windows build --- wezterm/src/asciicast.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/wezterm/src/asciicast.rs b/wezterm/src/asciicast.rs index 9ea044816..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 From 1266912629ab951f7ee2924f4f8d949f564090c0 Mon Sep 17 00:00:00 2001 From: fioncat Date: Thu, 4 Apr 2024 22:42:29 +0800 Subject: [PATCH 006/140] fix(wayland): ensure repaint event is sent in show Fix: https://github.com/wez/wezterm/issues/5103 --- window/src/os/wayland/window.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/window/src/os/wayland/window.rs b/window/src/os/wayland/window.rs index e6cd1d4f6..557d589ce 100644 --- a/window/src/os/wayland/window.rs +++ b/window/src/os/wayland/window.rs @@ -544,6 +544,17 @@ impl WaylandWindowInner { return; } + // If the do_paint function has been called previously, calling it again will not + // trigger the NeedRepaint event. This results in the window not being displayed + // correctly after show is called. + // Therefore, when frame_callback is set to some, it indicates that do_paint has + // been called before. We need to trigger the Repaint event again to ensure the + // window is displayed correctly. + // Fix: https://github.com/wez/wezterm/issues/5103 + if self.frame_callback.is_some() { + self.events.dispatch(WindowEvent::NeedRepaint); + } + self.do_paint().unwrap(); } From b21c3f6b3d4525a1e08a484028a954446e97c932 Mon Sep 17 00:00:00 2001 From: fioncat Date: Thu, 4 Apr 2024 22:51:01 +0800 Subject: [PATCH 007/140] doc(wayland): update comment in show --- window/src/os/wayland/window.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/window/src/os/wayland/window.rs b/window/src/os/wayland/window.rs index 557d589ce..4719a8bc7 100644 --- a/window/src/os/wayland/window.rs +++ b/window/src/os/wayland/window.rs @@ -545,11 +545,10 @@ impl WaylandWindowInner { } // If the do_paint function has been called previously, calling it again will not - // trigger the NeedRepaint event. This results in the window not being displayed - // correctly after show is called. + // send the NeedRepaint event. This results in the window not being displayed + // correctly. // Therefore, when frame_callback is set to some, it indicates that do_paint has - // been called before. We need to trigger the Repaint event again to ensure the - // window is displayed correctly. + // been called before. We need to send the NeedRepaint event again. // Fix: https://github.com/wez/wezterm/issues/5103 if self.frame_callback.is_some() { self.events.dispatch(WindowEvent::NeedRepaint); From 42d62faf6c18978f354394275ffed2311c9fcff8 Mon Sep 17 00:00:00 2001 From: fioncat Date: Thu, 4 Apr 2024 22:52:33 +0800 Subject: [PATCH 008/140] doc(wayland): update comments --- window/src/os/wayland/window.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/window/src/os/wayland/window.rs b/window/src/os/wayland/window.rs index 4719a8bc7..e17cba236 100644 --- a/window/src/os/wayland/window.rs +++ b/window/src/os/wayland/window.rs @@ -547,8 +547,8 @@ impl WaylandWindowInner { // 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, it indicates that do_paint has - // been called before. We need to send the NeedRepaint event again. + // 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); From 0184e88e97b6521df613df4ccdb2e896ce8b0ad0 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Mon, 29 Apr 2024 10:28:18 -0700 Subject: [PATCH 009/140] docs: changelog for https://github.com/wez/wezterm/pull/5264 --- docs/changelog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog.md b/docs/changelog.md index 2d5627a4e..1b0e2221b 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -42,6 +42,7 @@ 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 #### Updated * Bundled conpty.dll and OpenConsole.exe to build 1.19.240130002.nupkg From 76cf2e51e6affea309865c4d15fdd6681325c986 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Sat, 4 May 2024 15:34:47 -0700 Subject: [PATCH 010/140] rename .cargo/config -> .cargo/config.toml The old path is deprecated and current versions of rust warn about this. --- .cargo/{config => config.toml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .cargo/{config => config.toml} (100%) diff --git a/.cargo/config b/.cargo/config.toml similarity index 100% rename from .cargo/config rename to .cargo/config.toml From 67d4ba9f76470a7ff1f3e7609119cdbb9d33024c Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Sat, 4 May 2024 15:53:28 -0700 Subject: [PATCH 011/140] fix when running on rust 1.78 std::slice::from_raw_parts will now panic if the ptr is null. Resolve this by adding our own wrapper that translates that case to an empty slice. --- wezterm-font/src/ftwrap.rs | 60 +++++++++++-------------- wezterm-font/src/rasterizer/freetype.rs | 4 +- 2 files changed, 29 insertions(+), 35 deletions(-) diff --git a/wezterm-font/src/ftwrap.rs b/wezterm-font/src/ftwrap.rs index 5f06a3fb8..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) @@ -1472,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/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, ) From 1375e79a211b02dc5b6da8b29666637a5994db58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Orhun=20Parmaks=C4=B1z?= Date: Sun, 5 May 2024 02:01:47 +0300 Subject: [PATCH 012/140] termwiz: support NO_COLOR environment variable (#5020) * termwiz: support NO_COLOR environment variable * style: update formatting * refactor: use capabilities for enabling no-color --- termwiz/src/caps/mod.rs | 20 ++++++++++++++++++-- termwiz/src/render/terminfo.rs | 8 ++++++-- termwiz/src/render/windows.rs | 31 +++++++++++++++++++------------ 3 files changed, 43 insertions(+), 16 deletions(-) diff --git a/termwiz/src/caps/mod.rs b/termwiz/src/caps/mod.rs index 9d3c8bd71..964a5551f 100644 --- a/termwiz/src/caps/mod.rs +++ b/termwiz/src/caps/mod.rs @@ -61,6 +61,10 @@ 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 +125,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 +159,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. 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..9bff1fd16 100644 --- a/termwiz/src/render/windows.rs +++ b/termwiz/src/render/windows.rs @@ -1,6 +1,7 @@ //! A Renderer for windows consoles use crate::caps::Capabilities; +use crate::caps::ColorLevel; use crate::cell::{AttributeChange, CellAttributes, Underline}; use crate::color::{AnsiColor, ColorAttribute}; use crate::surface::{Change, Position}; @@ -17,12 +18,14 @@ 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, } } } @@ -69,6 +72,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 attr.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 +116,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 } From 2cb6e05c77ba01aaa693e717fd090c5bfd036650 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Sat, 4 May 2024 16:02:18 -0700 Subject: [PATCH 013/140] rustfmt --- termwiz/src/render/windows.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/termwiz/src/render/windows.rs b/termwiz/src/render/windows.rs index 9bff1fd16..e7c0cd70f 100644 --- a/termwiz/src/render/windows.rs +++ b/termwiz/src/render/windows.rs @@ -1,7 +1,6 @@ //! A Renderer for windows consoles -use crate::caps::Capabilities; -use crate::caps::ColorLevel; +use crate::caps::{Capabilities, ColorLevel}; use crate::cell::{AttributeChange, CellAttributes, Underline}; use crate::color::{AnsiColor, ColorAttribute}; use crate::surface::{Change, Position}; From 7c77f407fa2ce109b7fbd0616a3d269115d69a71 Mon Sep 17 00:00:00 2001 From: V Date: Mon, 8 Apr 2024 00:00:49 +0200 Subject: [PATCH 014/140] Update smithay-client-toolkit to v0.18 Also updates: - wayland-{client,protocols} to v0.31 - wayland-egl to v0.32 --- Cargo.lock | 99 ++++++++++++++++++++++++++--------------------- window/Cargo.toml | 8 ++-- 2 files changed, 58 insertions(+), 49 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 645f6b4cf..35de4db5c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1284,6 +1284,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "cursor-icon" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" + [[package]] name = "d3d12" version = "0.7.0" @@ -3224,18 +3230,18 @@ dependencies = [ [[package]] name = "memmap2" -version = "0.5.10" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +checksum = "43a5a03cefb0d953ec0be133036f14e109412fa594edc2f77227249db66cc3ed" dependencies = [ "libc", ] [[package]] name = "memmap2" -version = "0.8.0" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a5a03cefb0d953ec0be133036f14e109412fa594edc2f77227249db66cc3ed" +checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322" dependencies = [ "libc", ] @@ -4314,15 +4320,6 @@ dependencies = [ "bytemuck", ] -[[package]] -name = "quick-xml" -version = "0.28.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce5e73202a820a31f8a0ee32ada5e21029c81fd9e3ebf668a40832e4219d9d1" -dependencies = [ - "memchr", -] - [[package]] name = "quick-xml" version = "0.30.0" @@ -5078,23 +5075,25 @@ 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.32", "thiserror", "wayland-backend", "wayland-client", + "wayland-csd-frame", "wayland-cursor", "wayland-protocols", "wayland-protocols-wlr", "wayland-scanner", + "xkeysym", ] [[package]] @@ -6154,14 +6153,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.32", "scoped-tls", "smallvec", "wayland-sys", @@ -6169,32 +6167,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.32", "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.32", "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", @@ -6202,11 +6211,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", @@ -6214,11 +6223,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", @@ -6227,20 +6236,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", diff --git a/window/Cargo.toml b/window/Cargo.toml index b4598297b..2e55dbf0a 100644 --- a/window/Cargo.toml +++ b/window/Cargo.toml @@ -81,10 +81,10 @@ xcb-imdkit = { version="0.3", git="https://github.com/wez/xcb-imdkit-rs.git", re zbus = "3.14" zvariant = "3.15" -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" From fdc805bb2ecd9548d9d41c66d1050dadaa99673e Mon Sep 17 00:00:00 2001 From: V Date: Mon, 8 Apr 2024 03:26:58 +0200 Subject: [PATCH 015/140] Fix compilation --- window/src/os/wayland/connection.rs | 10 +++- window/src/os/wayland/copy_and_paste.rs | 4 +- window/src/os/wayland/cursor_shape.rs | 33 ++++++++++ window/src/os/wayland/data_device.rs | 80 ++++++++++++------------- window/src/os/wayland/drag_and_drop.rs | 3 +- window/src/os/wayland/mod.rs | 1 + window/src/os/wayland/pointer.rs | 12 ++-- window/src/os/wayland/seat.rs | 5 +- window/src/os/wayland/state.rs | 21 ++++--- window/src/os/wayland/window.rs | 33 +++++++--- 10 files changed, 131 insertions(+), 71 deletions(-) create mode 100644 window/src/os/wayland/cursor_shape.rs diff --git a/window/src/os/wayland/connection.rs b/window/src/os/wayland/connection.rs index f917bdfca..ee0a5fdea 100644 --- a/window/src/os/wayland/connection.rs +++ b/window/src/os/wayland/connection.rs @@ -4,7 +4,7 @@ use std::os::fd::AsRawFd; use std::rc::Rc; use std::sync::atomic::AtomicUsize; -use anyhow::{bail, Context}; +use anyhow::{anyhow, bail, Context}; use mio::unix::SourceFd; use mio::{Events, Interest, Poll, Token}; use wayland_client::backend::WaylandError; @@ -58,7 +58,11 @@ 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() + .ok_or_else(|| anyhow!(""))?; 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 { diff --git a/window/src/os/wayland/copy_and_paste.rs b/window/src/os/wayland/copy_and_paste.rs index ad83e462b..4004161d9 100644 --- a/window/src/os/wayland/copy_and_paste.rs +++ b/window/src/os/wayland/copy_and_paste.rs @@ -56,7 +56,7 @@ impl CopyAndPaste { .as_ref() .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()); + offer.receive(TEXT_MIME_TYPE.to_string(), todo!()); Ok(pipe.read) } None => { @@ -65,7 +65,7 @@ impl CopyAndPaste { .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()); + offer.receive(TEXT_MIME_TYPE.to_string(), todo!()); Ok(pipe.read) } } diff --git a/window/src/os/wayland/cursor_shape.rs b/window/src/os/wayland/cursor_shape.rs new file mode 100644 index 000000000..81e051a64 --- /dev/null +++ b/window/src/os/wayland/cursor_shape.rs @@ -0,0 +1,33 @@ +use smithay_client_toolkit::globals::GlobalData; +use wayland_client::Dispatch; +use wayland_protocols::wp::cursor_shape::v1::client::wp_cursor_shape_device_v1::WpCursorShapeDeviceV1; +use wayland_protocols::wp::cursor_shape::v1::client::wp_cursor_shape_manager_v1::WpCursorShapeManagerV1; + +use super::state::WaylandState; + +pub(super) struct CursorShapeManagerState {} + +impl Dispatch for CursorShapeManagerState { + fn event( + state: &mut WaylandState, + proxy: &WpCursorShapeManagerV1, + event: ::Event, + data: &GlobalData, + conn: &wayland_client::Connection, + qhandle: &wayland_client::QueueHandle, + ) { + todo!() + } +} +impl Dispatch for CursorShapeManagerState { + fn event( + state: &mut WaylandState, + proxy: &WpCursorShapeDeviceV1, + event: ::Event, + data: &GlobalData, + conn: &wayland_client::Connection, + qhandle: &wayland_client::QueueHandle, + ) { + todo!() + } +} diff --git a/window/src/os/wayland/data_device.rs b/window/src/os/wayland/data_device.rs index d14857df1..2b0bbf418 100644 --- a/window/src/os/wayland/data_device.rs +++ b/window/src/os/wayland/data_device.rs @@ -1,12 +1,13 @@ 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, DragOffer, SelectionOffer, }; -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,22 +27,20 @@ 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 mut drag_offer = data_device.data::().unwrap(); + drag_offer.with_mime_types(|mime_types| { + log::trace!( + "Data offer entered: {:?}, mime_types: {:?}", + drag_offer, + mime_types + ); - 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())); - } + if let Some(mime) = mime_types.iter().find(|s| *s == URI_MIME_TYPE) { + drag_offer.accept_mime_type(*self.last_serial.borrow(), Some(mime.clone())); + } + }); drag_offer.set_actions(DndAction::None | DndAction::Copy, DndAction::None); @@ -64,7 +63,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 +82,7 @@ impl DataDeviceHandler for WaylandState { &mut self, _conn: &wayland_client::Connection, _qh: &wayland_client::QueueHandle, - _data_device: DataDevice, + _data_device: &WlDataDevice, ) { } @@ -91,14 +90,13 @@ 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; - } + if let Some(offer) = data_device.data::() { + 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() @@ -112,7 +110,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,21 +133,21 @@ 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); - } - } + // 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( diff --git a/window/src/os/wayland/drag_and_drop.rs b/window/src/os/wayland/drag_and_drop.rs index 59dbfbe40..4b86b594b 100644 --- a/window/src/os/wayland/drag_and_drop.rs +++ b/window/src/os/wayland/drag_and_drop.rs @@ -2,7 +2,6 @@ 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 url::Url; @@ -33,7 +32,7 @@ impl DragAndDrop { let pipe = Pipe::new() .map_err(|err| log::error!("Unable to create pipe: {:#}", err)) .ok()?; - offer.receive(URI_MIME_TYPE.to_string(), pipe.write.as_raw_fd()); + offer.receive(URI_MIME_TYPE.to_string(), todo!()); let read = pipe.read; offer.finish(); Some(SurfaceAndPipe { window_id, read }) diff --git a/window/src/os/wayland/mod.rs b/window/src/os/wayland/mod.rs index 0a88143c8..b42dff73c 100644 --- a/window/src/os/wayland/mod.rs +++ b/window/src/os/wayland/mod.rs @@ -8,6 +8,7 @@ pub use self::window::*; pub use connection::*; pub use output::*; mod copy_and_paste; +mod cursor_shape; mod drag_and_drop; // mod frame; mod data_device; diff --git a/window/src/os/wayland/pointer.rs b/window/src/os/wayland/pointer.rs index faefdce89..ebc349f80 100644 --- a/window/src/os/wayland/pointer.rs +++ b/window/src/os/wayland/pointer.rs @@ -2,10 +2,10 @@ use std::cell::RefCell; use std::sync::{Arc, Mutex}; 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 +220,17 @@ impl WaylandState { match evt.kind { PointerEventKind::Enter { .. } => { - inner.window_frame.click_point_moved(&evt.surface, x, y); + inner + .window_frame + .click_point_moved(todo!(), &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(todo!(), &evt.surface.id(), x, y); } PointerEventKind::Press { button, serial, .. } | PointerEventKind::Release { button, serial, .. } => { @@ -240,7 +244,7 @@ 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(todo!(), 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..c70567fc2 100644 --- a/window/src/os/wayland/seat.rs +++ b/window/src/os/wayland/seat.rs @@ -6,6 +6,7 @@ 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; @@ -39,9 +40,11 @@ impl SeatHandler for WaylandState { log::trace!("Setting pointer capability"); let pointer = self .seat - .get_pointer_with_theme_and_data( + .get_pointer_with_theme_and_data::( qh, &seat, + todo!(), + todo!(), ThemeSpec::System, PointerUserData::new(seat.clone()), ) diff --git a/window/src/os/wayland/state.rs b/window/src/os/wayland/state.rs index c410e6817..da17ef7a2 100644 --- a/window/src/os/wayland/state.rs +++ b/window/src/os/wayland/state.rs @@ -3,7 +3,7 @@ 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; @@ -20,15 +20,16 @@ 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_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::cursor_shape::v1::client::wp_cursor_shape_device_v1::WpCursorShapeDeviceV1; +use wayland_protocols::wp::cursor_shape::v1::client::wp_cursor_shape_manager_v1::WpCursorShapeManagerV1; 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; @@ -39,6 +40,7 @@ use wayland_protocols::wp::text_input::zv3::client::zwp_text_input_v3::ZwpTextIn use crate::x11::KeyboardWithFallback; use super::copy_and_paste::{PrimarySelectionManagerData, PrimarySelectionManagerState}; +use super::cursor_shape::CursorShapeManagerState; use super::inputhandler::{TextInputData, TextInputState}; use super::pointer::{PendingMouse, PointerUserData}; use super::{OutputManagerData, OutputManagerState, SurfaceUserData, WaylandWindowInner}; @@ -154,23 +156,21 @@ impl OutputHandler for WaylandState { } } // 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); +// Will be just this in 0.18: +delegate_compositor!(WaylandState, surface: [SurfaceData, SurfaceUserData]); +// delegate_dispatch!(WaylandState: [ WlSurface: SurfaceUserData] => CompositorState); delegate_registry!(WaylandState); delegate_shm!(WaylandState); delegate_output!(WaylandState); -delegate_compositor!(WaylandState); +// delegate_compositor!(WaylandState); 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]); @@ -179,6 +179,9 @@ delegate_dispatch!(WaylandState: [WlPointer: PointerUserData] => SeatState); delegate_xdg_shell!(WaylandState); delegate_xdg_window!(WaylandState); +delegate_dispatch!(WaylandState: [WpCursorShapeManagerV1: GlobalData] => CursorShapeManagerState); +delegate_dispatch!(WaylandState: [WpCursorShapeDeviceV1: GlobalData] => CursorShapeManagerState); + delegate_dispatch!(WaylandState: [ZwpTextInputManagerV3: GlobalData] => TextInputState); delegate_dispatch!(WaylandState: [ZwpTextInputV3: TextInputData] => TextInputState); diff --git a/window/src/os/wayland/window.rs b/window/src/os/wayland/window.rs index e17cba236..33d7551dc 100644 --- a/window/src/os/wayland/window.rs +++ b/window/src/os/wayland/window.rs @@ -21,11 +21,13 @@ use raw_window_handle::{ 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::reexports::csd_frame::{ + DecorationsFrame, FrameAction, WindowState as SCTKWindowState, +}; +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; @@ -917,13 +919,13 @@ impl WaylandWindowInner { let (shm, pointer) = RefMut::map_split(state, |s| (&mut s.shm, s.pointer.as_mut().unwrap())); - // Much different API in 0.18 if let Err(err) = pointer.set_cursor( &conn.connection, - name, - shm.wl_shm(), - &self.pointer_surface, - 1, + todo!(), + // name, + // shm.wl_shm(), + // &self.pointer_surface, + // 1, ) { log::error!("set_cursor: {}", err); } @@ -1156,8 +1158,11 @@ 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) => { + self.window.as_ref().unwrap().resize(seat, serial, todo!()) + } FrameAction::Move => self.window.as_ref().unwrap().move_(seat, serial), + _ => todo!(), } } } @@ -1267,6 +1272,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!() + } } impl WindowHandler for WaylandState { From ccbdd4da6aeef35b406060cd1a10541f9651174f Mon Sep 17 00:00:00 2001 From: V Date: Mon, 8 Apr 2024 03:55:53 +0200 Subject: [PATCH 016/140] Fix cursor setting --- window/src/os/wayland/window.rs | 36 +++++++++++++-------------------- 1 file changed, 14 insertions(+), 22 deletions(-) diff --git a/window/src/os/wayland/window.rs b/window/src/os/wayland/window.rs index 33d7551dc..8030dbf3d 100644 --- a/window/src/os/wayland/window.rs +++ b/window/src/os/wayland/window.rs @@ -24,6 +24,7 @@ use smithay_client_toolkit::compositor::{CompositorHandler, SurfaceData, Surface use smithay_client_toolkit::reexports::csd_frame::{ DecorationsFrame, FrameAction, WindowState as SCTKWindowState, }; +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, @@ -195,11 +196,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: _, @@ -292,7 +288,6 @@ impl WaylandWindow { key_repeat: None, pending_event, pending_mouse, - pointer_surface, pending_first_configure: Some(pending_first_configure), frame_callback: None, @@ -507,7 +502,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, @@ -907,26 +901,24 @@ 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())); - if let Err(err) = pointer.set_cursor( - &conn.connection, - todo!(), - // name, - // shm.wl_shm(), - // &self.pointer_surface, - // 1, - ) { + if let Err(err) = match cursor { + Some(cursor) => 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, + }, + ), + None => pointer.hide_cursor(), + } { log::error!("set_cursor: {}", err); } } From 42e47ad92020c3d9a830cb0267fd9abd24d01367 Mon Sep 17 00:00:00 2001 From: V Date: Mon, 8 Apr 2024 04:18:37 +0200 Subject: [PATCH 017/140] It runs! (pointer now has a surface) --- window/src/os/wayland/seat.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/window/src/os/wayland/seat.rs b/window/src/os/wayland/seat.rs index c70567fc2..6f5443781 100644 --- a/window/src/os/wayland/seat.rs +++ b/window/src/os/wayland/seat.rs @@ -38,13 +38,14 @@ impl SeatHandler for WaylandState { if capability == Capability::Pointer && 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, - todo!(), - todo!(), + &self.shm.wl_shm(), + surface, ThemeSpec::System, PointerUserData::new(seat.clone()), ) From a7b122a2e18580ebb8f3e458c935a1fe40b892c3 Mon Sep 17 00:00:00 2001 From: V Date: Mon, 8 Apr 2024 04:35:27 +0200 Subject: [PATCH 018/140] Fix pointer todos --- window/src/os/wayland/pointer.rs | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/window/src/os/wayland/pointer.rs b/window/src/os/wayland/pointer.rs index ebc349f80..3436d17f4 100644 --- a/window/src/os/wayland/pointer.rs +++ b/window/src/os/wayland/pointer.rs @@ -1,5 +1,6 @@ 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}; @@ -220,17 +221,23 @@ impl WaylandState { match evt.kind { PointerEventKind::Enter { .. } => { - inner - .window_frame - .click_point_moved(todo!(), &evt.surface.id(), 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(todo!(), &evt.surface.id(), x, y); + inner.window_frame.click_point_moved( + Duration::ZERO, + &evt.surface.id(), + x, + y, + ); } PointerEventKind::Press { button, serial, .. } | PointerEventKind::Release { button, serial, .. } => { @@ -244,7 +251,9 @@ impl WaylandState { 0x111 => FrameClick::Alternate, _ => continue, }; - if let Some(action) = inner.window_frame.on_click(todo!(), click, pressed) { + if let Some(action) = + inner.window_frame.on_click(Duration::ZERO, click, pressed) + { inner.frame_action(pointer, serial, action); } } From 8ed444cffc0bf43cfbb33694efc416dd940beb18 Mon Sep 17 00:00:00 2001 From: V Date: Mon, 8 Apr 2024 04:45:15 +0200 Subject: [PATCH 019/140] Fix window todos --- window/src/os/wayland/window.rs | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/window/src/os/wayland/window.rs b/window/src/os/wayland/window.rs index 8030dbf3d..8ef5b09f4 100644 --- a/window/src/os/wayland/window.rs +++ b/window/src/os/wayland/window.rs @@ -22,8 +22,9 @@ use raw_window_handle::{ }; use smithay_client_toolkit::compositor::{CompositorHandler, SurfaceData, SurfaceDataExt}; use smithay_client_toolkit::reexports::csd_frame::{ - DecorationsFrame, FrameAction, WindowState as SCTKWindowState, + 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::{ @@ -1151,10 +1152,22 @@ impl WaylandWindowInner { .show_window_menu(seat, serial, (x, y)) } FrameAction::Resize(edge) => { - self.window.as_ref().unwrap().resize(seat, serial, todo!()) + 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), - _ => todo!(), + _ => log::warn!("unhandled FrameAction: {:?}", action), } } } @@ -1272,7 +1285,7 @@ impl CompositorHandler for WaylandState { surface: &wayland_client::protocol::wl_surface::WlSurface, new_transform: wayland_client::protocol::wl_output::Transform, ) { - todo!() + // TODO: do we need to do anything here? } } From ba18d0590cdac76b1fd495642f80de878ad117ba Mon Sep 17 00:00:00 2001 From: V Date: Mon, 8 Apr 2024 05:23:44 +0200 Subject: [PATCH 020/140] Fix drag/selection offer retrieval --- window/src/os/wayland/data_device.rs | 67 +++++++++++++--------------- 1 file changed, 31 insertions(+), 36 deletions(-) diff --git a/window/src/os/wayland/data_device.rs b/window/src/os/wayland/data_device.rs index 2b0bbf418..e43d3b802 100644 --- a/window/src/os/wayland/data_device.rs +++ b/window/src/os/wayland/data_device.rs @@ -2,9 +2,7 @@ use std::os::fd::{FromRawFd, IntoRawFd}; use filedescriptor::FileDescriptor; use smithay_client_toolkit::data_device_manager::data_device::DataDeviceHandler; -use smithay_client_toolkit::data_device_manager::data_offer::{ - DataOfferHandler, DragOffer, SelectionOffer, -}; +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; @@ -29,20 +27,27 @@ impl DataDeviceHandler for WaylandState { _qh: &wayland_client::QueueHandle, data_device: &WlDataDevice, ) { - let mut drag_offer = data_device.data::().unwrap(); - drag_offer.with_mime_types(|mime_types| { + let offer = self + .data_device + .as_ref() + .unwrap() + .data() + .drag_offer() + .unwrap(); + + offer.with_mime_types(|mime_types| { log::trace!( "Data offer entered: {:?}, mime_types: {:?}", - drag_offer, + offer, mime_types ); if let Some(mime) = mime_types.iter().find(|s| *s == URI_MIME_TYPE) { - drag_offer.accept_mime_type(*self.last_serial.borrow(), Some(mime.clone())); + offer.accept_mime_type(*self.last_serial.borrow(), Some(mime.clone())); } }); - drag_offer.set_actions(DndAction::None | DndAction::Copy, DndAction::None); + offer.set_actions(DndAction::None | DndAction::Copy, DndAction::None); let pointer = self.pointer.as_mut().unwrap(); let mut pstate = pointer @@ -53,8 +58,8 @@ 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; + let offer = offer.inner().clone(); pstate.drag_and_drop.offer = Some(SurfaceAndOffer { window_id, offer }); } @@ -92,17 +97,23 @@ impl DataDeviceHandler for WaylandState { _qh: &wayland_client::QueueHandle, data_device: &WlDataDevice, ) { - if let Some(offer) = data_device.data::() { - if !offer.with_mime_types(|mime_types| mime_types.iter().any(|s| s == TEXT_MIME_TYPE)) { - return; - } + let offer = self + .data_device + .as_ref() + .unwrap() + .data() + .selection_offer() + .unwrap(); - if let Some(copy_and_paste) = self.resolve_copy_and_paste() { - copy_and_paste - .lock() - .unwrap() - .confirm_selection(offer.inner().clone()); - } + if !offer.with_mime_types(|mime_types| mime_types.iter().any(|s| s == TEXT_MIME_TYPE)) { + return; + } + + if let Some(copy_and_paste) = self.resolve_copy_and_paste() { + copy_and_paste + .lock() + .unwrap() + .confirm_selection(offer.inner().clone()); } } @@ -133,22 +144,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, From 423859cef7c6fec31f3cbd57e482ec1b59ac01c7 Mon Sep 17 00:00:00 2001 From: V Date: Mon, 8 Apr 2024 05:46:14 +0200 Subject: [PATCH 021/140] Fix drag & drop --- window/src/os/wayland/drag_and_drop.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/window/src/os/wayland/drag_and_drop.rs b/window/src/os/wayland/drag_and_drop.rs index 4b86b594b..beb7d7194 100644 --- a/window/src/os/wayland/drag_and_drop.rs +++ b/window/src/os/wayland/drag_and_drop.rs @@ -2,6 +2,7 @@ use crate::wayland::read_pipe_with_timeout; use crate::ConnectionOps; use filedescriptor::{FileDescriptor, Pipe}; use smithay_client_toolkit as toolkit; +use std::os::fd::{AsRawFd, BorrowedFd}; use std::path::PathBuf; use toolkit::reexports::client::protocol::wl_data_offer::WlDataOffer; use url::Url; @@ -32,7 +33,9 @@ impl DragAndDrop { let pipe = Pipe::new() .map_err(|err| log::error!("Unable to create pipe: {:#}", err)) .ok()?; - offer.receive(URI_MIME_TYPE.to_string(), todo!()); + offer.receive(URI_MIME_TYPE.to_string(), unsafe { + BorrowedFd::borrow_raw(pipe.write.as_raw_fd()) + }); let read = pipe.read; offer.finish(); Some(SurfaceAndPipe { window_id, read }) From f5a69b8746f20697775cbfe959721aafdd2270b4 Mon Sep 17 00:00:00 2001 From: V Date: Mon, 8 Apr 2024 05:50:11 +0200 Subject: [PATCH 022/140] Fix copy & paste --- window/src/os/wayland/copy_and_paste.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/window/src/os/wayland/copy_and_paste.rs b/window/src/os/wayland/copy_and_paste.rs index 4004161d9..42db0a5d6 100644 --- a/window/src/os/wayland/copy_and_paste.rs +++ b/window/src/os/wayland/copy_and_paste.rs @@ -9,7 +9,7 @@ use wayland_protocols::wp::primary_selection::zv1::client::zwp_primary_selection 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, BorrowedFd, FromRawFd, IntoRawFd}; use std::sync::{Arc, Mutex}; use toolkit::reexports::client::protocol::wl_data_offer::WlDataOffer; @@ -56,7 +56,9 @@ impl CopyAndPaste { .as_ref() .ok_or_else(|| anyhow!("no primary selection offer"))?; let pipe = Pipe::new().map_err(Error::msg)?; - offer.receive(TEXT_MIME_TYPE.to_string(), todo!()); + offer.receive(TEXT_MIME_TYPE.to_string(), unsafe { + BorrowedFd::borrow_raw(pipe.write.as_raw_fd()) + }); Ok(pipe.read) } None => { @@ -65,7 +67,9 @@ impl CopyAndPaste { .as_ref() .ok_or_else(|| anyhow!("no data offer"))?; let pipe = Pipe::new().map_err(Error::msg)?; - offer.receive(TEXT_MIME_TYPE.to_string(), todo!()); + offer.receive(TEXT_MIME_TYPE.to_string(), unsafe { + BorrowedFd::borrow_raw(pipe.write.as_raw_fd()) + }); Ok(pipe.read) } } From 5b0e7bca9332234c8d43627005e9aa76eec06250 Mon Sep 17 00:00:00 2001 From: V Date: Mon, 8 Apr 2024 06:02:18 +0200 Subject: [PATCH 023/140] Remove/rename unused stuff --- window/src/os/wayland/cursor_shape.rs | 24 ++++++++++++------------ window/src/os/wayland/data_device.rs | 4 ++-- window/src/os/wayland/window.rs | 11 +++++------ 3 files changed, 19 insertions(+), 20 deletions(-) diff --git a/window/src/os/wayland/cursor_shape.rs b/window/src/os/wayland/cursor_shape.rs index 81e051a64..a710bf350 100644 --- a/window/src/os/wayland/cursor_shape.rs +++ b/window/src/os/wayland/cursor_shape.rs @@ -9,24 +9,24 @@ pub(super) struct CursorShapeManagerState {} impl Dispatch for CursorShapeManagerState { fn event( - state: &mut WaylandState, - proxy: &WpCursorShapeManagerV1, - event: ::Event, - data: &GlobalData, - conn: &wayland_client::Connection, - qhandle: &wayland_client::QueueHandle, + _state: &mut WaylandState, + _proxy: &WpCursorShapeManagerV1, + _event: ::Event, + _data: &GlobalData, + _conn: &wayland_client::Connection, + _qhandle: &wayland_client::QueueHandle, ) { todo!() } } impl Dispatch for CursorShapeManagerState { fn event( - state: &mut WaylandState, - proxy: &WpCursorShapeDeviceV1, - event: ::Event, - data: &GlobalData, - conn: &wayland_client::Connection, - qhandle: &wayland_client::QueueHandle, + _state: &mut WaylandState, + _proxy: &WpCursorShapeDeviceV1, + _event: ::Event, + _data: &GlobalData, + _conn: &wayland_client::Connection, + _qhandle: &wayland_client::QueueHandle, ) { todo!() } diff --git a/window/src/os/wayland/data_device.rs b/window/src/os/wayland/data_device.rs index e43d3b802..201f25d61 100644 --- a/window/src/os/wayland/data_device.rs +++ b/window/src/os/wayland/data_device.rs @@ -25,7 +25,7 @@ impl DataDeviceHandler for WaylandState { &mut self, _conn: &wayland_client::Connection, _qh: &wayland_client::QueueHandle, - data_device: &WlDataDevice, + _data_device: &WlDataDevice, ) { let offer = self .data_device @@ -95,7 +95,7 @@ impl DataDeviceHandler for WaylandState { &mut self, _conn: &wayland_client::Connection, _qh: &wayland_client::QueueHandle, - data_device: &WlDataDevice, + _data_device: &WlDataDevice, ) { let offer = self .data_device diff --git a/window/src/os/wayland/window.rs b/window/src/os/wayland/window.rs index 8ef5b09f4..be8382574 100644 --- a/window/src/os/wayland/window.rs +++ b/window/src/os/wayland/window.rs @@ -904,8 +904,7 @@ impl WaylandWindowInner { fn set_cursor(&mut self, cursor: Option) { 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 = RefMut::map(state, |s| s.pointer.as_mut().unwrap()); if let Err(err) = match cursor { Some(cursor) => pointer.set_cursor( @@ -1280,10 +1279,10 @@ impl CompositorHandler for WaylandState { 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, + _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? } From 5654bbff4776537aa8632e624cbc642c6b513291 Mon Sep 17 00:00:00 2001 From: V Date: Mon, 8 Apr 2024 06:02:45 +0200 Subject: [PATCH 024/140] Use the existing CursorShapeManager provided by SCTK --- window/src/os/wayland/cursor_shape.rs | 33 --------------------------- window/src/os/wayland/mod.rs | 1 - window/src/os/wayland/state.rs | 6 ++--- 3 files changed, 3 insertions(+), 37 deletions(-) delete mode 100644 window/src/os/wayland/cursor_shape.rs diff --git a/window/src/os/wayland/cursor_shape.rs b/window/src/os/wayland/cursor_shape.rs deleted file mode 100644 index a710bf350..000000000 --- a/window/src/os/wayland/cursor_shape.rs +++ /dev/null @@ -1,33 +0,0 @@ -use smithay_client_toolkit::globals::GlobalData; -use wayland_client::Dispatch; -use wayland_protocols::wp::cursor_shape::v1::client::wp_cursor_shape_device_v1::WpCursorShapeDeviceV1; -use wayland_protocols::wp::cursor_shape::v1::client::wp_cursor_shape_manager_v1::WpCursorShapeManagerV1; - -use super::state::WaylandState; - -pub(super) struct CursorShapeManagerState {} - -impl Dispatch for CursorShapeManagerState { - fn event( - _state: &mut WaylandState, - _proxy: &WpCursorShapeManagerV1, - _event: ::Event, - _data: &GlobalData, - _conn: &wayland_client::Connection, - _qhandle: &wayland_client::QueueHandle, - ) { - todo!() - } -} -impl Dispatch for CursorShapeManagerState { - fn event( - _state: &mut WaylandState, - _proxy: &WpCursorShapeDeviceV1, - _event: ::Event, - _data: &GlobalData, - _conn: &wayland_client::Connection, - _qhandle: &wayland_client::QueueHandle, - ) { - todo!() - } -} diff --git a/window/src/os/wayland/mod.rs b/window/src/os/wayland/mod.rs index b42dff73c..0a88143c8 100644 --- a/window/src/os/wayland/mod.rs +++ b/window/src/os/wayland/mod.rs @@ -8,7 +8,6 @@ pub use self::window::*; pub use connection::*; pub use output::*; mod copy_and_paste; -mod cursor_shape; mod drag_and_drop; // mod frame; mod data_device; diff --git a/window/src/os/wayland/state.rs b/window/src/os/wayland/state.rs index da17ef7a2..39c2efa24 100644 --- a/window/src/os/wayland/state.rs +++ b/window/src/os/wayland/state.rs @@ -13,6 +13,7 @@ use smithay_client_toolkit::reexports::protocols_wlr::output_management::v1::cli 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; use smithay_client_toolkit::registry::{ProvidesRegistryState, RegistryState}; +use smithay_client_toolkit::seat::pointer::cursor_shape::CursorShapeManager; use smithay_client_toolkit::seat::pointer::ThemedPointer; use smithay_client_toolkit::seat::SeatState; use smithay_client_toolkit::shell::xdg::XdgShell; @@ -40,7 +41,6 @@ use wayland_protocols::wp::text_input::zv3::client::zwp_text_input_v3::ZwpTextIn use crate::x11::KeyboardWithFallback; use super::copy_and_paste::{PrimarySelectionManagerData, PrimarySelectionManagerState}; -use super::cursor_shape::CursorShapeManagerState; use super::inputhandler::{TextInputData, TextInputState}; use super::pointer::{PendingMouse, PointerUserData}; use super::{OutputManagerData, OutputManagerState, SurfaceUserData, WaylandWindowInner}; @@ -179,8 +179,8 @@ delegate_dispatch!(WaylandState: [WlPointer: PointerUserData] => SeatState); delegate_xdg_shell!(WaylandState); delegate_xdg_window!(WaylandState); -delegate_dispatch!(WaylandState: [WpCursorShapeManagerV1: GlobalData] => CursorShapeManagerState); -delegate_dispatch!(WaylandState: [WpCursorShapeDeviceV1: GlobalData] => CursorShapeManagerState); +delegate_dispatch!(WaylandState: [WpCursorShapeManagerV1: GlobalData] => CursorShapeManager); +delegate_dispatch!(WaylandState: [WpCursorShapeDeviceV1: GlobalData] => CursorShapeManager); delegate_dispatch!(WaylandState: [ZwpTextInputManagerV3: GlobalData] => TextInputState); delegate_dispatch!(WaylandState: [ZwpTextInputV3: TextInputData] => TextInputState); From 2dd2a541cead7db0b3c63ee59e6fd9332b7780dc Mon Sep 17 00:00:00 2001 From: V Date: Mon, 8 Apr 2024 06:32:42 +0200 Subject: [PATCH 025/140] Clean up delegates --- window/src/os/wayland/state.rs | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/window/src/os/wayland/state.rs b/window/src/os/wayland/state.rs index 39c2efa24..c9d7a3dbe 100644 --- a/window/src/os/wayland/state.rs +++ b/window/src/os/wayland/state.rs @@ -13,7 +13,6 @@ use smithay_client_toolkit::reexports::protocols_wlr::output_management::v1::cli 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; use smithay_client_toolkit::registry::{ProvidesRegistryState, RegistryState}; -use smithay_client_toolkit::seat::pointer::cursor_shape::CursorShapeManager; use smithay_client_toolkit::seat::pointer::ThemedPointer; use smithay_client_toolkit::seat::SeatState; use smithay_client_toolkit::shell::xdg::XdgShell; @@ -21,16 +20,13 @@ 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_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_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::{delegate_dispatch, Connection, QueueHandle}; -use wayland_protocols::wp::cursor_shape::v1::client::wp_cursor_shape_device_v1::WpCursorShapeDeviceV1; -use wayland_protocols::wp::cursor_shape::v1::client::wp_cursor_shape_manager_v1::WpCursorShapeManagerV1; 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; @@ -155,33 +151,24 @@ 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 this in 0.18: -delegate_compositor!(WaylandState, surface: [SurfaceData, SurfaceUserData]); -// 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!(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_dispatch!(WaylandState: [WpCursorShapeManagerV1: GlobalData] => CursorShapeManager); -delegate_dispatch!(WaylandState: [WpCursorShapeDeviceV1: GlobalData] => CursorShapeManager); - delegate_dispatch!(WaylandState: [ZwpTextInputManagerV3: GlobalData] => TextInputState); delegate_dispatch!(WaylandState: [ZwpTextInputV3: TextInputData] => TextInputState); From b23a424e219f3d18521e7e26b9207bd466ea3d6c Mon Sep 17 00:00:00 2001 From: V Date: Mon, 8 Apr 2024 06:35:07 +0200 Subject: [PATCH 026/140] Improve error messages for set_cursor --- window/src/os/wayland/window.rs | 34 +++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/window/src/os/wayland/window.rs b/window/src/os/wayland/window.rs index be8382574..c9c4a8b67 100644 --- a/window/src/os/wayland/window.rs +++ b/window/src/os/wayland/window.rs @@ -906,20 +906,26 @@ impl WaylandWindowInner { let state = conn.wayland_state.borrow_mut(); let pointer = RefMut::map(state, |s| s.pointer.as_mut().unwrap()); - if let Err(err) = match cursor { - Some(cursor) => 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, - }, - ), - None => pointer.hide_cursor(), - } { - 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) + } + } } } From 84e8c966a13f12415d0e6591332be2d7f37a6b69 Mon Sep 17 00:00:00 2001 From: V Date: Mon, 8 Apr 2024 07:05:59 +0200 Subject: [PATCH 027/140] Use PrimarySelectionHandler provided by SCTK Also converts other DataDevice-handling code to use Read/WritePipe instead of the FileDescriptor API. --- window/src/os/wayland/copy_and_paste.rs | 121 ++++++++++++++++-------- window/src/os/wayland/data_device.rs | 10 +- window/src/os/wayland/drag_and_drop.rs | 20 ++-- window/src/os/wayland/seat.rs | 11 +-- window/src/os/wayland/state.rs | 23 ++--- window/src/os/wayland/window.rs | 14 ++- 6 files changed, 114 insertions(+), 85 deletions(-) diff --git a/window/src/os/wayland/copy_and_paste.rs b/window/src/os/wayland/copy_and_paste.rs index 42db0a5d6..23f07fb18 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, BorrowedFd, 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,41 +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(), unsafe { - BorrowedFd::borrow_raw(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(), unsafe { - BorrowedFd::borrow_raw(pipe.write.as_raw_fd()) - }); - Ok(pipe.read) + let pipe = offer.receive(TEXT_MIME_TYPE.to_string())?; + Ok(pipe) } } } @@ -82,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)); @@ -109,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); } } @@ -126,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, @@ -161,6 +154,8 @@ 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 { @@ -308,3 +303,47 @@ impl Dispatch, + _primary_selection_device: &ZwpPrimarySelectionDeviceV1, + ) { + // 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 201f25d61..8726cb0ec 100644 --- a/window/src/os/wayland/data_device.rs +++ b/window/src/os/wayland/data_device.rs @@ -1,6 +1,3 @@ -use std::os::fd::{FromRawFd, IntoRawFd}; - -use filedescriptor::FileDescriptor; 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; @@ -59,7 +56,6 @@ impl DataDeviceHandler for WaylandState { .unwrap(); let window_id = SurfaceUserData::from_wl(&offer.surface).window_id; - let offer = offer.inner().clone(); pstate.drag_and_drop.offer = Some(SurfaceAndOffer { window_id, offer }); } @@ -110,10 +106,7 @@ impl DataDeviceHandler for WaylandState { } 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); } } @@ -191,7 +184,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 beb7d7194..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::fd::{AsRawFd, BorrowedFd}; 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,18 +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(), unsafe { - BorrowedFd::borrow_raw(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/seat.rs b/window/src/os/wayland/seat.rs index 6f5443781..97d8af38a 100644 --- a/window/src/os/wayland/seat.rs +++ b/window/src/os/wayland/seat.rs @@ -3,7 +3,6 @@ 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; @@ -56,11 +55,11 @@ impl SeatHandler for WaylandState { let data_device = data_device_manager.get_data_device(qh, &seat); self.data_device.replace(data_device); - 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; + let primary_selection_device = self + .primary_selection_manager + .as_ref() + .map(|m| m.get_selection_device(qh, &seat)); + self.primary_selection_device = primary_selection_device; } } diff --git a/window/src/os/wayland/state.rs b/window/src/os/wayland/state.rs index c9d7a3dbe..fdb269e01 100644 --- a/window/src/os/wayland/state.rs +++ b/window/src/os/wayland/state.rs @@ -9,6 +9,9 @@ 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,23 +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_output, delegate_pointer, 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::{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}; @@ -69,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, } @@ -111,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), @@ -169,14 +167,11 @@ 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 c9c4a8b67..adc3ee0de 100644 --- a/window/src/os/wayland/window.rs +++ b/window/src/os/wayland/window.rs @@ -14,13 +14,13 @@ 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::data_device_manager::ReadPipe; use smithay_client_toolkit::reexports::csd_frame::{ DecorationsFrame, FrameAction, ResizeEdge, WindowState as SCTKWindowState, }; @@ -463,10 +463,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, From bbbe9c2ceadd1e66024d3baab8068c8d26fda2f6 Mon Sep 17 00:00:00 2001 From: V Date: Tue, 9 Apr 2024 08:40:40 +0200 Subject: [PATCH 028/140] Add rust-src to Nix development shell rust-analyzer can't find the standard library source code otherwise. --- nix/flake.nix | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/nix/flake.nix b/nix/flake.nix index 812b34f9c..b7a23921d 100644 --- a/nix/flake.nix +++ b/nix/flake.nix @@ -162,8 +162,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 From 004bfd3d9e5634c74b4ed9b18c88ae9579580d14 Mon Sep 17 00:00:00 2001 From: V Date: Tue, 9 Apr 2024 10:46:24 +0200 Subject: [PATCH 029/140] Unwrap wayland fd acquisition rather than erroring without a message --- window/src/os/wayland/connection.rs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/window/src/os/wayland/connection.rs b/window/src/os/wayland/connection.rs index ee0a5fdea..bd12b3668 100644 --- a/window/src/os/wayland/connection.rs +++ b/window/src/os/wayland/connection.rs @@ -4,7 +4,7 @@ use std::os::fd::AsRawFd; use std::rc::Rc; use std::sync::atomic::AtomicUsize; -use anyhow::{anyhow, bail, Context}; +use anyhow::{bail, Context}; use mio::unix::SourceFd; use mio::{Events, Interest, Poll, Token}; use wayland_client::backend::WaylandError; @@ -58,11 +58,7 @@ impl WaylandConnection { let mut events = Events::with_capacity(8); let wl_fd = { - let read_guard = self - .event_queue - .borrow() - .prepare_read() - .ok_or_else(|| anyhow!(""))?; + let read_guard = self.event_queue.borrow().prepare_read().unwrap(); read_guard.connection_fd().as_raw_fd() }; From b1069576b734049b2a3ec4b04bf935ec3ffdb80b Mon Sep 17 00:00:00 2001 From: V Date: Tue, 9 Apr 2024 10:56:54 +0200 Subject: [PATCH 030/140] Drop old primary selection code --- window/src/os/wayland/copy_and_paste.rs | 151 ------------------------ 1 file changed, 151 deletions(-) diff --git a/window/src/os/wayland/copy_and_paste.rs b/window/src/os/wayland/copy_and_paste.rs index 23f07fb18..fce9b75e7 100644 --- a/window/src/os/wayland/copy_and_paste.rs +++ b/window/src/os/wayland/copy_and_paste.rs @@ -154,157 +154,6 @@ fn write_pipe_with_timeout(mut file: WritePipe, data: &[u8]) -> anyhow::Result<( 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, - _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, - _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!(), - } - } -} -*/ - impl PrimarySelectionDeviceHandler for WaylandState { fn selection( &mut self, From 369fcb9928b2efa41ba790869a375e54b31cc374 Mon Sep 17 00:00:00 2001 From: V Date: Fri, 12 Apr 2024 06:19:25 +0200 Subject: [PATCH 031/140] Fix crash when switching TTYs --- window/src/os/wayland/seat.rs | 79 ++++++++++++++++++++++------------- 1 file changed, 50 insertions(+), 29 deletions(-) diff --git a/window/src/os/wayland/seat.rs b/window/src/os/wayland/seat.rs index 97d8af38a..90b322b77 100644 --- a/window/src/os/wayland/seat.rs +++ b/window/src/os/wayland/seat.rs @@ -23,43 +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 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); - + // 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_selection_device = self + self.primary_selection_device = self .primary_selection_manager .as_ref() .map(|m| m.get_selection_device(qh, &seat)); - self.primary_selection_device = primary_selection_device; } } @@ -68,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().unwrap().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) { From 48fa4ca4975d53e08dd00c1160ce8a2911d18279 Mon Sep 17 00:00:00 2001 From: V Date: Fri, 3 May 2024 03:42:03 +0200 Subject: [PATCH 032/140] Fix crash when setting cursor on non-existent pointer --- window/src/os/wayland/window.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/window/src/os/wayland/window.rs b/window/src/os/wayland/window.rs index adc3ee0de..816a989b1 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; @@ -912,7 +912,10 @@ impl WaylandWindowInner { fn set_cursor(&mut self, cursor: Option) { let conn = Connection::get().unwrap().wayland(); let state = conn.wayland_state.borrow_mut(); - let pointer = RefMut::map(state, |s| s.pointer.as_mut().unwrap()); + let pointer = match &state.pointer { + Some(pointer) => pointer, + None => return, + }; match cursor { Some(cursor) => { From 296f88675f1361932603be858caef2c050b99792 Mon Sep 17 00:00:00 2001 From: V Date: Fri, 3 May 2024 03:47:02 +0200 Subject: [PATCH 033/140] Fix clippy lints --- window/build.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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), From c7e4b7dda8ed996b0f80bdda98a90f80957d40d9 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Sat, 4 May 2024 16:17:14 -0700 Subject: [PATCH 034/140] update Cargo.lock for #5276 --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 35de4db5c..39db13ba6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5084,7 +5084,7 @@ dependencies = [ "libc", "log", "memmap2 0.9.4", - "rustix 0.38.32", + "rustix 0.38.34", "thiserror", "wayland-backend", "wayland-client", @@ -6159,7 +6159,7 @@ checksum = "9d50fa61ce90d76474c87f5fc002828d81b32677340112b4ef08079a9d459a40" dependencies = [ "cc", "downcast-rs", - "rustix 0.38.32", + "rustix 0.38.34", "scoped-tls", "smallvec", "wayland-sys", @@ -6172,7 +6172,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "82fb96ee935c2cea6668ccb470fb7771f6215d1691746c2d896b447a00ad3f1f" dependencies = [ "bitflags 2.5.0", - "rustix 0.38.32", + "rustix 0.38.34", "wayland-backend", "wayland-scanner", ] @@ -6194,7 +6194,7 @@ version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71ce5fa868dd13d11a0d04c5e2e65726d0897be8de247c0c5a65886e283231ba" dependencies = [ - "rustix 0.38.32", + "rustix 0.38.34", "wayland-client", "xcursor", ] From d8154bc450432e0b1a2c4ae0b31ab9072081cf53 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Sat, 4 May 2024 16:17:31 -0700 Subject: [PATCH 035/140] avoid unwrap when detaching seat refs: https://github.com/wez/wezterm/pull/5276 --- window/src/os/wayland/seat.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/window/src/os/wayland/seat.rs b/window/src/os/wayland/seat.rs index 90b322b77..38bd25940 100644 --- a/window/src/os/wayland/seat.rs +++ b/window/src/os/wayland/seat.rs @@ -80,7 +80,7 @@ impl SeatHandler for WaylandState { match capability { Capability::Keyboard => { log::trace!("Lost keyboard capability"); - self.keyboard.take().unwrap().release(); + self.keyboard.take().map(|k| k.release()); } Capability::Pointer => { log::trace!("Lost pointer capability"); From 54ddb6df06a09d10aaddc62bac99518647b8ed71 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Sat, 4 May 2024 16:18:41 -0700 Subject: [PATCH 036/140] docs: changelog for #5276 --- docs/changelog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog.md b/docs/changelog.md index 1b0e2221b..74900087d 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -43,6 +43,7 @@ As features stabilize some brief notes about them will accumulate here. 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 #### Updated * Bundled conpty.dll and OpenConsole.exe to build 1.19.240130002.nupkg From a082117bb800ca00f4c333cc7d25660484eb24ac Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Sat, 4 May 2024 16:34:22 -0700 Subject: [PATCH 037/140] docs: more changelog for sctk 0.18 update --- docs/changelog.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/changelog.md b/docs/changelog.md index 74900087d..fc809398d 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -43,7 +43,8 @@ As features stabilize some brief notes about them will accumulate here. 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 +* Wayland: updated to SCTK 0.18. Thanks to @deviant! #5276 #5154 #5079 #5071 + #4604 #5209 #### Updated * Bundled conpty.dll and OpenConsole.exe to build 1.19.240130002.nupkg From 8c9ab05fb49f34e37f57c1f12fc726dff1e542ef Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Sat, 4 May 2024 16:56:00 -0700 Subject: [PATCH 038/140] cargo update, update sqlite deps for sync-color-schemes This makes cargo audit happier --- Cargo.lock | 172 ++++++++++++++++------------------ sync-color-schemes/Cargo.toml | 4 +- 2 files changed, 81 insertions(+), 95 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 39db13ba6..1836f584a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -85,47 +85,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", @@ -403,9 +404,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "az" @@ -442,9 +443,9 @@ checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "base64" -version = "0.22.0" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base91" @@ -463,9 +464,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" @@ -637,9 +638,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.0.95" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d32a725bc159af97c3e629873bb9f88fb8cf8a4867175f76dc987815ea07c83b" +checksum = "065a29261d53ba54260972629f9ca6bffa69bac13cd1fed61420f7fa68b9f8bd" dependencies = [ "jobserver", "libc", @@ -915,9 +916,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" +checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" [[package]] name = "colored" @@ -1729,9 +1730,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" @@ -1843,9 +1844,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.29" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4556222738635b7a3417ae6130d8f52201e45a0c4d1a907f0826383adb5f85e7" +checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" dependencies = [ "crc32fast", "miniz_oxide 0.7.2", @@ -2378,15 +2379,6 @@ 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" @@ -2396,15 +2388,6 @@ dependencies = [ "ahash 0.7.8", ] -[[package]] -name = "hashbrown" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" -dependencies = [ - "ahash 0.8.11", -] - [[package]] name = "hashbrown" version = "0.14.5" @@ -2417,11 +2400,11 @@ dependencies = [ [[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]] @@ -2582,7 +2565,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.5.6", + "socket2 0.5.7", "tokio", "tower-service", "tracing", @@ -2771,6 +2754,12 @@ dependencies = [ "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" @@ -2928,15 +2917,15 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.153" +version = "0.2.154" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" [[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", @@ -2947,12 +2936,12 @@ 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", ] @@ -3017,9 +3006,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", @@ -3165,9 +3154,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", @@ -3690,9 +3679,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", @@ -3713,9 +3702,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", ] @@ -3917,7 +3906,7 @@ version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" dependencies = [ - "base64 0.22.0", + "base64 0.22.1", "serde", ] @@ -3929,9 +3918,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", @@ -3940,9 +3929,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", @@ -3950,9 +3939,9 @@ 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", @@ -3963,9 +3952,9 @@ dependencies = [ [[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", @@ -4514,9 +4503,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" @@ -4634,16 +4623,15 @@ dependencies = [ [[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", ] @@ -4789,9 +4777,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.199" +version = "1.0.200" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c9f6e76df036c77cd94996771fb40db98187f096dd0b9af39c6c6e452ba966a" +checksum = "ddc6f9cc94d67c0e21aaf7eda3a010fd3af78ebf6e096aa6e2e13c79749cce4f" dependencies = [ "serde_derive", ] @@ -4821,9 +4809,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.199" +version = "1.0.200" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11bd257a6541e141e42ca6d24ae26f7714887b47e89aa739099104c7e4d3b7fc" +checksum = "856f046b9400cee3c8c94ed572ecdb752444c24528c035cd35882aad6f492bcb" dependencies = [ "proc-macro2", "quote", @@ -5146,9 +5134,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", "windows-sys 0.52.0", @@ -5200,8 +5188,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", @@ -5713,7 +5700,7 @@ dependencies = [ "mio", "num_cpus", "pin-project-lite", - "socket2 0.5.6", + "socket2 0.5.7", "tokio-macros", "windows-sys 0.48.0", ] @@ -5741,16 +5728,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]] @@ -6649,7 +6635,7 @@ dependencies = [ "shell-words", "smol", "smol-potat", - "socket2 0.5.6", + "socket2 0.5.7", "ssh2", "termwiz", "thiserror", @@ -7447,18 +7433,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.32" +version = "0.7.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +checksum = "087eca3c1eaf8c47b94d02790dd086cd594b912d2043d4de4bfdd466b3befb7c" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.32" +version = "0.7.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +checksum = "6f4b6c273f496d8fd4eaf18853e6b448760225dc030ff2c485a786859aea6393" dependencies = [ "proc-macro2", "quote", diff --git a/sync-color-schemes/Cargo.toml b/sync-color-schemes/Cargo.toml index b1cc34f8a..0fbf28059 100644 --- a/sync-color-schemes/Cargo.toml +++ b/sync-color-schemes/Cargo.toml @@ -15,10 +15,10 @@ lazy_static = "1.4" libflate = "2" log = "0.4" reqwest = "0.11" -rusqlite = {version="0.27", features=["bundled", "blob"]} +rusqlite = {version="0.30", features=["bundled", "blob"]} serde = {version="1.0", features=["derive"]} serde_json = "1.0" -sqlite-cache = "0.1.3" +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"] } From fd45b407500e42da19be437a6c243b840855d53e Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Sat, 4 May 2024 16:59:45 -0700 Subject: [PATCH 039/140] deps: update criterion This also makes cargo audit happier --- Cargo.lock | 196 +++++++------------------------------------- rangeset/Cargo.toml | 2 +- termwiz/Cargo.toml | 2 +- 3 files changed, 30 insertions(+), 170 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1836f584a..5ae317fb5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -391,17 +391,6 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", -] - [[package]] name = "autocfg" version = "1.3.0" @@ -706,30 +695,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" dependencies = [ "ciborium-io", - "half 2.4.1", -] - -[[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]] @@ -750,7 +716,7 @@ checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" dependencies = [ "anstream", "anstyle", - "clap_lex 0.7.0", + "clap_lex", "strsim 0.11.1", "terminal_size 0.3.0", ] @@ -761,7 +727,7 @@ version = "4.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd79504325bf38b10165b02e89b4347300f855f273c4cb30c4a3209e6583275e" dependencies = [ - "clap 4.5.4", + "clap", ] [[package]] @@ -770,7 +736,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", ] @@ -786,15 +752,6 @@ dependencies = [ "syn 2.0.60", ] -[[package]] -name = "clap_lex" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" -dependencies = [ - "os_str_bytes", -] - [[package]] name = "clap_lex" version = "0.7.0" @@ -1112,45 +1069,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", + "clap", + "criterion-plot", + "is-terminal", "itertools", - "lazy_static", "num-traits", + "once_cell", "oorandom", "plotters", "rayon", @@ -1162,16 +1093,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" @@ -1264,27 +1185,6 @@ dependencies = [ "phf", ] -[[package]] -name = "csv" -version = "1.3.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", -] - [[package]] name = "cursor-icon" version = "1.1.0" @@ -1720,7 +1620,7 @@ checksum = "887d93f60543e9a9362ef8a21beedd0a833c5d9610e18c67abe15a5963dcb1a4" dependencies = [ "bit_field", "flume 0.11.0", - "half 2.4.1", + "half", "lebe", "miniz_oxide 0.7.2", "rayon-core", @@ -1832,7 +1732,7 @@ checksum = "2fc715d38bea7b5bf487fcd79bcf8c209f0b58014f3018a7a19c2b855f472048" dependencies = [ "az", "bytemuck", - "half 2.4.1", + "half", "typenum", ] @@ -2355,12 +2255,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "half" -version = "1.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" - [[package]] name = "half" version = "2.4.1" @@ -2442,15 +2336,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" @@ -2723,7 +2608,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", ] @@ -2749,7 +2634,7 @@ 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", ] @@ -3424,7 +3309,7 @@ dependencies = [ "terminfo", "termwiz", "termwiz-funcs", - "textwrap 0.16.1", + "textwrap", "thiserror", "url", "wezterm-dynamic", @@ -3715,7 +3600,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", ] @@ -3834,12 +3719,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" @@ -4154,7 +4033,7 @@ checksum = "645493cf344456ef24219d02a768cf1fb92ddf8c92161679ae3d91b91a637be3" dependencies = [ "cfg-if", "concurrent-queue", - "hermit-abi 0.3.9", + "hermit-abi", "pin-project-lite", "rustix 0.38.34", "tracing", @@ -4378,7 +4257,7 @@ checksum = "9c8a99fddc9f0ba0a85884b8d14e3592853e787d581ca1816c91349b10e4eeab" name = "rangeset" version = "0.1.0" dependencies = [ - "criterion 0.3.6", + "criterion", "num", ] @@ -4797,16 +4676,6 @@ dependencies = [ "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.200" @@ -5251,7 +5120,7 @@ checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" name = "strip-ansi-escapes" version = "0.1.0" dependencies = [ - "clap 4.5.4", + "clap", "termwiz", ] @@ -5467,7 +5336,7 @@ dependencies = [ "base64 0.21.7", "bitflags 2.5.0", "cassowary", - "criterion 0.4.0", + "criterion", "env_logger 0.11.3", "fancy-regex", "filedescriptor", @@ -5524,15 +5393,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" @@ -6265,7 +6125,7 @@ dependencies = [ "anyhow", "cc", "chrono", - "clap 4.5.4", + "clap", "clap_complete", "clap_complete_fig", "codec", @@ -6289,7 +6149,7 @@ dependencies = [ "termios 0.3.3", "termwiz", "termwiz-funcs", - "textwrap 0.16.1", + "textwrap", "umask", "url", "wezterm-client", @@ -6347,7 +6207,7 @@ dependencies = [ "ratelim", "smol", "termwiz", - "textwrap 0.16.1", + "textwrap", "thiserror", "uds_windows", "umask", @@ -6449,7 +6309,7 @@ dependencies = [ "bytemuck", "cc", "chrono", - "clap 4.5.4", + "clap", "codec", "colorgrad", "config", @@ -6499,7 +6359,7 @@ dependencies = [ "terminfo", "termwiz", "termwiz-funcs", - "textwrap 0.16.1", + "textwrap", "thiserror", "tiny-skia", "uds_windows", @@ -6533,7 +6393,7 @@ name = "wezterm-gui-subcommands" version = "0.1.0" dependencies = [ "anyhow", - "clap 4.5.4", + "clap", "config", ] @@ -6555,7 +6415,7 @@ dependencies = [ "anyhow", "async_ossl", "cc", - "clap 4.5.4", + "clap", "config", "embed-resource", "env-bootstrap", @@ -6617,7 +6477,7 @@ dependencies = [ "base64 0.21.7", "bitflags 1.3.2", "camino", - "clap 4.5.4", + "clap", "dirs-next", "env_logger 0.11.3", "filedescriptor", diff --git a/rangeset/Cargo.toml b/rangeset/Cargo.toml index a9886933c..a31fb973f 100644 --- a/rangeset/Cargo.toml +++ b/rangeset/Cargo.toml @@ -8,7 +8,7 @@ edition = "2018" num = "0.3" [dev-dependencies] -criterion = "0.3" +criterion = "0.5" [[bench]] name = "rangeset" diff --git a/termwiz/Cargo.toml b/termwiz/Cargo.toml index 2a74a30dc..0e279a4cc 100644 --- a/termwiz/Cargo.toml +++ b/termwiz/Cargo.toml @@ -55,7 +55,7 @@ use_image = ["image"] docs = ["widgets", "use_serde"] [dev-dependencies] -criterion = "0.4" +criterion = "0.5" varbincode = "0.1" k9 = "0.11" env_logger = "0.11" From cab8523f854a93a6883f21fb6e32ff078e5680ec Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Sat, 4 May 2024 17:01:24 -0700 Subject: [PATCH 040/140] deps: update starship battery --- Cargo.lock | 33 ++++++++++--------------------- lua-api-crates/battery/Cargo.toml | 2 +- lua-api-crates/battery/src/lib.rs | 2 +- 3 files changed, 12 insertions(+), 25 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5ae317fb5..23e0965bc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3058,10 +3058,10 @@ dependencies = [ ] [[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", ] @@ -3394,19 +3394,6 @@ dependencies = [ "tempfile", ] -[[package]] -name = "nix" -version = "0.23.2" -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", -] - [[package]] name = "nix" version = "0.25.1" @@ -5089,16 +5076,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 0.9.4", "lazycell", "libc", - "mach", - "nix 0.23.2", + "mach2", + "nix 0.28.0", "num-traits", "uom", "winapi", @@ -5795,9 +5782,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", diff --git a/lua-api-crates/battery/Cargo.toml b/lua-api-crates/battery/Cargo.toml index d6576188d..4887a1eac 100644 --- a/lua-api-crates/battery/Cargo.toml +++ b/lua-api-crates/battery/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" [dependencies] anyhow = "1.0" -starship-battery = "0.7" +starship-battery = "0.8" config = { path = "../../config" } wezterm-dynamic = { path = "../../wezterm-dynamic" } luahelper = { path = "../../luahelper" } diff --git a/lua-api-crates/battery/src/lib.rs b/lua-api-crates/battery/src/lib.rs index 86daf5818..c4a941d7d 100644 --- a/lua-api-crates/battery/src/lib.rs +++ b/lua-api-crates/battery/src/lib.rs @@ -37,7 +37,7 @@ fn battery_info<'lua>(_: &'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), From c4021d210902a960e8fdcdb18c8845f6919eb182 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Sat, 4 May 2024 17:05:12 -0700 Subject: [PATCH 041/140] deps: remove yaml-rust in favor of serde-yaml --- Cargo.lock | 17 +---------------- sync-color-schemes/Cargo.toml | 2 +- sync-color-schemes/src/base16.rs | 19 ++----------------- 3 files changed, 4 insertions(+), 34 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 23e0965bc..ab419f77b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2965,12 +2965,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" @@ -5167,13 +5161,13 @@ dependencies = [ "rusqlite", "serde", "serde_json", + "serde_yaml", "sqlite-cache", "tar", "tempfile", "tokio", "toml 0.8.12", "wezterm-dynamic", - "yaml-rust", ] [[package]] @@ -7194,15 +7188,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" diff --git a/sync-color-schemes/Cargo.toml b/sync-color-schemes/Cargo.toml index 0fbf28059..0e11baa9b 100644 --- a/sync-color-schemes/Cargo.toml +++ b/sync-color-schemes/Cargo.toml @@ -18,10 +18,10 @@ reqwest = "0.11" rusqlite = {version="0.30", features=["bundled", "blob"]} serde = {version="1.0", features=["derive"]} serde_json = "1.0" +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> { From 9fe8daaaa88aaaef05ae60381dbf9d171743d7a5 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Sat, 4 May 2024 17:07:29 -0700 Subject: [PATCH 042/140] deps: update reqwest to 0.12 --- Cargo.lock | 117 +++++++++++++++++++++++++--------- sync-color-schemes/Cargo.toml | 2 +- termwiz/codegen/Cargo.toml | 2 +- 3 files changed, 89 insertions(+), 32 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ab419f77b..dd80f842a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2238,9 +2238,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.26" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +checksum = "816ec7294445779408f36fe57bc5b7fc1cf59664059096c65f905c1c61f58069" dependencies = [ "bytes", "fnv", @@ -2376,9 +2376,9 @@ dependencies = [ [[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", @@ -2387,12 +2387,24 @@ 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", ] @@ -2412,12 +2424,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" @@ -2435,39 +2441,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.7", + "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 0.5.7", + "tokio", + "tower", + "tower-service", + "tracing", ] [[package]] @@ -4375,11 +4400,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", @@ -4387,8 +4412,10 @@ dependencies = [ "h2", "http", "http-body", + "http-body-util", "hyper", "hyper-tls", + "hyper-util", "ipnet", "js-sys", "log", @@ -4410,7 +4437,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "winreg 0.50.0", + "winreg 0.52.0", ] [[package]] @@ -4545,13 +4572,20 @@ dependencies = [ [[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 = "rustls-pki-types" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "beb461507cee2c2ff151784c52762cf4d9ff6a61f3e80968600ed24fa837fa54" + [[package]] name = "ryu" version = "1.0.17" @@ -5634,6 +5668,28 @@ dependencies = [ "winnow 0.6.7", ] +[[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" @@ -5646,6 +5702,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", @@ -7079,9 +7136,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", diff --git a/sync-color-schemes/Cargo.toml b/sync-color-schemes/Cargo.toml index 0e11baa9b..8e06784a7 100644 --- a/sync-color-schemes/Cargo.toml +++ b/sync-color-schemes/Cargo.toml @@ -14,7 +14,7 @@ futures = "0.3" lazy_static = "1.4" libflate = "2" log = "0.4" -reqwest = "0.11" +reqwest = "0.12" rusqlite = {version="0.30", features=["bundled", "blob"]} serde = {version="1.0", features=["derive"]} serde_json = "1.0" 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" From d22e97dcefb783654ca390eb80f8073c8d3f01e5 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Sat, 4 May 2024 17:11:47 -0700 Subject: [PATCH 043/140] deps: update hostname to 0.4 --- Cargo.lock | 24 ++++++++++++++---------- config/Cargo.toml | 2 +- mux/Cargo.toml | 2 +- wezterm-mux-server-impl/Cargo.toml | 2 +- wezterm/Cargo.toml | 2 +- 5 files changed, 18 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index dd80f842a..6b754a888 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2365,13 +2365,13 @@ 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]] @@ -3100,12 +3100,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" -[[package]] -name = "match_cfg" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" - [[package]] name = "memchr" version = "2.7.2" @@ -6854,6 +6848,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" diff --git a/config/Cargo.toml b/config/Cargo.toml index 580920b9a..0a38f1e67 100644 --- a/config/Cargo.toml +++ b/config/Cargo.toml @@ -18,7 +18,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" diff --git a/mux/Cargo.toml b/mux/Cargo.toml index 5e508f73a..dff96b12a 100644 --- a/mux/Cargo.toml +++ b/mux/Cargo.toml @@ -19,7 +19,7 @@ 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" diff --git a/wezterm-mux-server-impl/Cargo.toml b/wezterm-mux-server-impl/Cargo.toml index cb03dce48..146c38e36 100644 --- a/wezterm-mux-server-impl/Cargo.toml +++ b/wezterm-mux-server-impl/Cargo.toml @@ -12,7 +12,7 @@ async_ossl = { path = "../async_ossl" } 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" } diff --git a/wezterm/Cargo.toml b/wezterm/Cargo.toml index 27e608fdb..37ff44330 100644 --- a/wezterm/Cargo.toml +++ b/wezterm/Cargo.toml @@ -16,7 +16,7 @@ codec = { path = "../codec" } config = { path = "../config" } env-bootstrap = { path = "../env-bootstrap" } filedescriptor = { version="0.8", path = "../filedescriptor" } -hostname = "0.3" +hostname = "0.4" image = "0.24.6" libc = "0.2" log = "0.4" From 2eac806d8c6e226067ccec0e6880214c8ca4caa5 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Sat, 4 May 2024 17:12:55 -0700 Subject: [PATCH 044/140] deps: rstest to 0.19 --- Cargo.lock | 8 ++++---- wezterm-ssh/Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6b754a888..399b124ca 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4475,9 +4475,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", @@ -4487,9 +4487,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", diff --git a/wezterm-ssh/Cargo.toml b/wezterm-ssh/Cargo.toml index eb4b2129b..bb5c661f6 100644 --- a/wezterm-ssh/Cargo.toml +++ b/wezterm-ssh/Cargo.toml @@ -46,7 +46,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" } From 9070d4cb6d2a8427fd2b83a130f739b5c4f7079c Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Sat, 4 May 2024 17:15:35 -0700 Subject: [PATCH 045/140] windows: speculative compile fix for termwiz refs: #5020 --- termwiz/src/render/windows.rs | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/termwiz/src/render/windows.rs b/termwiz/src/render/windows.rs index e7c0cd70f..1e01172d0 100644 --- a/termwiz/src/render/windows.rs +++ b/termwiz/src/render/windows.rs @@ -29,7 +29,7 @@ impl WindowsConsoleRenderer { } } -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, @@ -82,7 +82,7 @@ fn to_attr_word(attr: &CellAttributes) -> u16 { 0 }; - if attr.capabilities.color_level() == ColorLevel::MonoChrome { + if capabilities.color_level() == ColorLevel::MonoChrome { return reverse | underline; } @@ -314,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 { @@ -324,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) => { @@ -334,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), @@ -347,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 { From e3f1cf6f4470762a5b3a0f7e74d57679e17e5951 Mon Sep 17 00:00:00 2001 From: jrreed Date: Thu, 28 Mar 2024 12:57:03 -0400 Subject: [PATCH 046/140] Eldritch theme done --- sync-color-schemes/src/main.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sync-color-schemes/src/main.rs b/sync-color-schemes/src/main.rs index d164ed0ae..901ad7b6c 100644 --- a/sync-color-schemes/src/main.rs +++ b/sync-color-schemes/src/main.rs @@ -417,6 +417,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")?); From f01397ead3522c10b77ca60aa71c88fda0caed44 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Sat, 4 May 2024 17:40:56 -0700 Subject: [PATCH 047/140] sync color schemes refs: https://github.com/wez/wezterm/pull/5232 --- config/src/scheme_data.rs | 146 ++-- docs/changelog.md | 29 + docs/colorschemes/data.json | 1272 ++++++++++++++++++++++++++++++++--- 3 files changed, 1312 insertions(+), 135 deletions(-) diff --git a/config/src/scheme_data.rs b/config/src/scheme_data.rs index c40326b49..20afb2738 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); 994] = [ // 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,13 @@ 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"), +("alacritty", "[colors.indexed]\n\n[metadata]\naliases = [\n \"bamboo\",\n \"bamboo_light\",\n \"bamboo_multiplex\",\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 +70,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 +83,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 +114,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 +149,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 +208,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 +264,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 +329,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 +356,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 +378,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 +483,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 +505,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 +566,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 +613,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 +635,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 +656,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 +683,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 +736,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 +765,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 +783,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 +825,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 +841,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 +963,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 +983,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 +992,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/docs/changelog.md b/docs/changelog.md index fc809398d..09a8700e1 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -48,6 +48,35 @@ As features stabilize some brief notes about them will accumulate here. #### Updated * Bundled conpty.dll and OpenConsole.exe to build 1.19.240130002.nupkg +* Color schemes: [alacritty](colorschemes/a/index.md#alacritty), + [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..edae6e7d3 100644 --- a/docs/colorschemes/data.json +++ b/docs/colorschemes/data.json @@ -697,6 +697,26 @@ "wezterm_version": "Always" } }, + { + "colors": { + "indexed": {} + }, + "metadata": { + "aliases": [ + "bamboo", + "bamboo_light", + "bamboo_multiplex", + "tokyonight_day", + "tokyonight_moon", + "tokyonight_night", + "tokyonight_storm" + ], + "name": "alacritty", + "origin_url": "https://github.com/EdenEast/nightfox.nvim", + "prefix": "a", + "wezterm_version": "nightly builds only" + } + }, { "colors": { "ansi": [ @@ -2708,9 +2728,9 @@ "#ff5a67", "#7fc06e", "#ffcc1b", - "#5dd7b9", - "#9a70a4", "#14747e", + "#9a70a4", + "#5dd7b9", "#a1a19a" ], "background": "#002635", @@ -2719,9 +2739,9 @@ "#ff5a67", "#7fc06e", "#ffcc1b", - "#5dd7b9", - "#9a70a4", "#14747e", + "#9a70a4", + "#5dd7b9", "#fafaf8" ], "cursor_bg": "#a1a19a", @@ -3218,7 +3238,7 @@ "#1c1e1b", "#e75a7c", "#8fb573", - "#dbb671", + "#dbb651", "#57a5e5", "#aaaaff", "#70c2be", @@ -3229,7 +3249,7 @@ "#5b5e5a", "#e75a7c", "#8fb573", - "#dbb671", + "#dbb651", "#57a5e5", "#aaaaff", "#70c2be", @@ -3305,25 +3325,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 +3414,10 @@ "#171f17", "#dc4f62", "#81af58", - "#cebe69", - "#5692c4", - "#ae93e0", - "#71ada2", + "#ceba49", + "#409cdc", + "#a09af8", + "#68baae", "#ece1c0" ], "background": "#232923", @@ -3405,13 +3425,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 +4669,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 +6068,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 +8649,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 +11119,7 @@ "cursor_fg": "#0f0e06", "foreground": "#cfbcba", "indexed": {}, - "selection_bg": "#3f1020", + "selection_bg": "#3f1324", "selection_fg": "#cfbcba" }, "metadata": { @@ -11278,6 +11411,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 +11698,7 @@ "#d3303a", "#217a3c", "#a45f22", - "#375cd8", + "#3740cf", "#ba35af", "#1f6fbf", "#202020" @@ -11684,7 +11857,7 @@ "#f5e9cb", "#ba2d2f", "#007a0a", - "#a46110", + "#a26310", "#375cc6", "#aa3e74", "#3f60af", @@ -11693,7 +11866,7 @@ "background": "#fff6d8", "brights": [ "#c7b7a6", - "#c03f3f", + "#c02945", "#008250", "#946830", "#265fbf", @@ -11746,7 +11919,7 @@ "cursor_fg": "#000e17", "foreground": "#afbcbf", "indexed": {}, - "selection_bg": "#222f40", + "selection_bg": "#253146", "selection_fg": "#afbcbf" }, "metadata": { @@ -11758,12 +11931,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 +12119,7 @@ "cursor_fg": "#130911", "foreground": "#d0d0d0", "indexed": {}, - "selection_bg": "#2f2630", + "selection_bg": "#3f2f40", "selection_fg": "#d0d0d0" }, "metadata": { @@ -12006,7 +12219,7 @@ "#2fa526", "#c48702", "#379cf6", - "#b2608f", + "#b0648f", "#3fafcf", "#dfd0d5" ], @@ -12026,7 +12239,7 @@ "cursor_fg": "#15050f", "foreground": "#dfd0d5", "indexed": {}, - "selection_bg": "#202d3f", + "selection_bg": "#293140", "selection_fg": "#dfd0d5" }, "metadata": { @@ -12272,6 +12485,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 +13700,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 +13850,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 +15668,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 +20758,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 +23167,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 +23449,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 +23683,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 +26711,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 +30014,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 +31890,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 +31947,8 @@ "#53d6c7", "#cad8d9" ], - "cursor_bg": "#adbcbc", - "cursor_border": "#adbcbc", + "cursor_bg": "#cad8d9", + "cursor_border": "#cad8d9", "cursor_fg": "#103c48", "foreground": "#adbcbc", "indexed": {} @@ -30992,18 +31964,18 @@ { "colors": { "ansi": [ - "#fbf3db", + "#ece3cc", "#d2212d", "#489100", "#ad8900", "#0072d4", "#ca4898", "#009c8f", - "#53676d" + "#909995" ], "background": "#fbf3db", "brights": [ - "#ece3cc", + "#d5cdb6", "#cc1729", "#428b00", "#a78300", @@ -31012,8 +31984,8 @@ "#00978a", "#3a4d53" ], - "cursor_bg": "#53676d", - "cursor_border": "#53676d", + "cursor_bg": "#3a4d53", + "cursor_border": "#3a4d53", "cursor_fg": "#fbf3db", "foreground": "#53676d", "indexed": {} @@ -31026,6 +31998,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 +33561,12 @@ "background": "#002b36", "brights": [ "#657b83", - "#d87979", - "#88cf76", - "#657b83", - "#2699ff", + "#cb4b16", + "#859900", + "#cf9a6b", + "#6c71c4", "#d33682", - "#43b8c3", + "#2aa198", "#fdf6e3" ], "cursor_bg": "#839496", @@ -32623,25 +33706,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 +34173,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 +40178,7 @@ "ansi": [ "#2e3436", "#fc6386", - "#424043", + "#a9dc76", "#fce94f", "#fb976b", "#75507b", @@ -39413,29 +40533,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 +40719,4 @@ "wezterm_version": "Always" } } -] +] \ No newline at end of file From 7f35aac7a96c645b6537c49492b679f7ec4e9a2e Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Sat, 4 May 2024 22:01:00 -0700 Subject: [PATCH 048/140] sync-color-schemes: fix mis-parse of color schemes Double check that what we got looked enough like our data when reading from a toml file --- ci/generate-docs.py | 2 ++ config/src/color.rs | 8 ++++++-- config/src/scheme_data.rs | 3 +-- docs/changelog.md | 2 +- docs/colorschemes/data.json | 20 -------------------- sync-color-schemes/src/main.rs | 3 +++ 6 files changed, 13 insertions(+), 25 deletions(-) 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/config/src/color.rs b/config/src/color.rs index 306b88db8..14f3b1c0c 100644 --- a/config/src/color.rs +++ b/config/src/color.rs @@ -728,8 +728,12 @@ 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/scheme_data.rs b/config/src/scheme_data.rs index 20afb2738..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); 994] = [ +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"), @@ -21,7 +21,6 @@ pub const SCHEMES: [(&'static str, &'static str); 994] = [ ("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 \"bamboo\",\n \"bamboo_light\",\n \"bamboo_multiplex\",\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"), diff --git a/docs/changelog.md b/docs/changelog.md index 09a8700e1..92be043cc 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -48,7 +48,7 @@ As features stabilize some brief notes about them will accumulate here. #### Updated * Bundled conpty.dll and OpenConsole.exe to build 1.19.240130002.nupkg -* Color schemes: [alacritty](colorschemes/a/index.md#alacritty), +* 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), diff --git a/docs/colorschemes/data.json b/docs/colorschemes/data.json index edae6e7d3..31627f2a2 100644 --- a/docs/colorschemes/data.json +++ b/docs/colorschemes/data.json @@ -697,26 +697,6 @@ "wezterm_version": "Always" } }, - { - "colors": { - "indexed": {} - }, - "metadata": { - "aliases": [ - "bamboo", - "bamboo_light", - "bamboo_multiplex", - "tokyonight_day", - "tokyonight_moon", - "tokyonight_night", - "tokyonight_storm" - ], - "name": "alacritty", - "origin_url": "https://github.com/EdenEast/nightfox.nvim", - "prefix": "a", - "wezterm_version": "nightly builds only" - } - }, { "colors": { "ansi": [ diff --git a/sync-color-schemes/src/main.rs b/sync-color-schemes/src/main.rs index 901ad7b6c..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(), From 030596a2d4bb8768959f7cc7611cb8edf5d3bb37 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Sat, 4 May 2024 22:24:34 -0700 Subject: [PATCH 049/140] rustfmt --- config/src/color.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/config/src/color.rs b/config/src/color.rs index 14f3b1c0c..ad16cf1cc 100644 --- a/config/src/color.rs +++ b/config/src/color.rs @@ -731,7 +731,10 @@ impl ColorSchemeFile { 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"); + anyhow::ensure!( + scheme.colors.ansi.is_some(), + "scheme is missing ANSI colors" + ); Ok(scheme) } From ee61e61e4fd6b674b09fa57c96cdce0e7fd939ff Mon Sep 17 00:00:00 2001 From: Pi-Cla Date: Mon, 25 Mar 2024 12:26:52 -0600 Subject: [PATCH 050/140] [PATCH] Fix various cargo audit errors closes: https://github.com/wez/wezterm/pull/5206 --- Cargo.lock | 60 ++++++++--------------------------------- lfucache/Cargo.toml | 2 +- mux/Cargo.toml | 2 +- term/Cargo.toml | 2 +- termwiz/Cargo.toml | 2 +- vtparse/Cargo.toml | 2 +- wezterm-font/Cargo.toml | 2 +- window/Cargo.toml | 2 +- 8 files changed, 18 insertions(+), 56 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 399b124ca..eaf7c47d5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -877,17 +877,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" -[[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", -] - [[package]] name = "colored" version = "2.1.0" @@ -2712,23 +2701,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" @@ -2736,7 +2708,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "088bcebb5b68b1b14b64d7f05b0f802719250b97fdc0338ec42529ea777ed614" dependencies = [ "anyhow", - "colored 2.1.0", + "colored", "diff", "lazy_static", "libc", @@ -2821,7 +2793,7 @@ dependencies = [ "config", "fnv", "intrusive-collections", - "k9 0.11.6", + "k9", "metrics", ] @@ -3299,7 +3271,7 @@ dependencies = [ "finl_unicode", "flume 0.10.14", "hostname", - "k9 0.11.6", + "k9", "lazy_static", "libc", "log", @@ -5261,16 +5233,6 @@ dependencies = [ "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" @@ -5354,7 +5316,7 @@ dependencies = [ "fnv", "hex", "image", - "k9 0.11.6", + "k9", "lazy_static", "libc", "log", @@ -5922,7 +5884,7 @@ dependencies = [ name = "vtparse" version = "0.6.2" dependencies = [ - "k9 0.11.6", + "k9", "utf8parse", ] @@ -6195,7 +6157,7 @@ name = "wezterm-bidi" version = "0.2.3" dependencies = [ "env_logger 0.11.3", - "k9 0.12.0", + "k9", "log", "wezterm-dynamic", ] @@ -6311,7 +6273,7 @@ dependencies = [ "freetype", "harfbuzz", "image", - "k9 0.11.6", + "k9", "lazy_static", "lfucache", "log", @@ -6362,7 +6324,7 @@ dependencies = [ "hdrhistogram", "http_req", "image", - "k9 0.12.0", + "k9", "lazy_static", "lfucache", "libc", @@ -6515,7 +6477,7 @@ dependencies = [ "filedescriptor", "filenamegen", "gethostname", - "k9 0.12.0", + "k9", "libc", "libssh-rs", "log", @@ -6547,7 +6509,7 @@ dependencies = [ "hex", "humansize", "image", - "k9 0.11.6", + "k9", "lazy_static", "log", "lru", @@ -6776,7 +6738,7 @@ dependencies = [ "gl_generator", "glium", "guillotiere", - "k9 0.11.6", + "k9", "lazy_static", "libc", "libloading 0.6.7", diff --git a/lfucache/Cargo.toml b/lfucache/Cargo.toml index b8b0de8b1..03347ae43 100644 --- a/lfucache/Cargo.toml +++ b/lfucache/Cargo.toml @@ -13,4 +13,4 @@ intrusive-collections = "0.9" metrics = { version="0.17", features=["std"]} [dev-dependencies] -k9 = "0.11" +k9 = "0.12" diff --git a/mux/Cargo.toml b/mux/Cargo.toml index dff96b12a..8640cecfd 100644 --- a/mux/Cargo.toml +++ b/mux/Cargo.toml @@ -60,4 +60,4 @@ winapi = { version = "0.3", features = [ ]} [dev-dependencies] -k9 = "0.11" +k9 = "0.12" diff --git a/term/Cargo.toml b/term/Cargo.toml index fc36addfa..fe729fdc5 100644 --- a/term/Cargo.toml +++ b/term/Cargo.toml @@ -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/termwiz/Cargo.toml b/termwiz/Cargo.toml index 0e279a4cc..c992546bf 100644 --- a/termwiz/Cargo.toml +++ b/termwiz/Cargo.toml @@ -57,7 +57,7 @@ docs = ["widgets", "use_serde"] [dev-dependencies] criterion = "0.5" varbincode = "0.1" -k9 = "0.11" +k9 = "0.12" env_logger = "0.11" [dependencies.num-derive] 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-font/Cargo.toml b/wezterm-font/Cargo.toml index 9475048ed..ff35a7905 100644 --- a/wezterm-font/Cargo.toml +++ b/wezterm-font/Cargo.toml @@ -53,5 +53,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/window/Cargo.toml b/window/Cargo.toml index 2e55dbf0a..39d94eac1 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" From e1755f369c81ce3990298665da12b8f445fbb95e Mon Sep 17 00:00:00 2001 From: Benoit de Chezelles Date: Sun, 5 May 2024 09:41:22 +0200 Subject: [PATCH 051/140] chore: Fix Nix build after recent dependencies updates The issue comes from 8c9ab05fb49f34e37f57c1f12fc726dff1e542ef which changed where `sqlite-cache` is retrieved from: ```diff diff --git a/sync-color-schemes/Cargo.toml b/sync-color-schemes/Cargo.toml index b1cc34f8a..0fbf28059 100644 --- a/sync-color-schemes/Cargo.toml +++ b/sync-color-schemes/Cargo.toml -sqlite-cache = "0.1.3" +sqlite-cache = {git="https://github.com/losfair/sqlite-cache", rev="0961b50385ff189bb12742716331c05ed0bf7805" } ``` When a dependency is retrieved from git, Nix needs the resulting hash in Nix format (a combination of sha256 + Nix stuff), hence this change. --- nix/flake.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/nix/flake.nix b/nix/flake.nix index b7a23921d..58323ff02 100644 --- a/nix/flake.nix +++ b/nix/flake.nix @@ -99,6 +99,7 @@ lockFile = ../Cargo.lock; outputHashes = { "xcb-imdkit-0.3.0" = "sha256-fTpJ6uNhjmCWv7dZqVgYuS2Uic36XNYTbqlaly5QBjI="; + "sqlite-cache-0.1.3" = "sha256-sBAC8MsQZgH+dcWpoxzq9iw5078vwzCijgyQnMOWIkk"; }; }; From b888c547db7b5fea2689748f0dab89b04686d8c3 Mon Sep 17 00:00:00 2001 From: Stefan Siegel Date: Thu, 18 Apr 2024 04:34:32 +0200 Subject: [PATCH 052/140] Implement drag and drop for X11 This is the last platform to resolve #640 --- window/src/os/x11/connection.rs | 45 ++++++ window/src/os/x11/window.rs | 246 +++++++++++++++++++++++++++++++- 2 files changed, 287 insertions(+), 4 deletions(-) diff --git a/window/src/os/x11/connection.rs b/window/src/os/x11/connection.rs index 8398555eb..5e55ca987 100644 --- a/window/src/os/x11/connection.rs +++ b/window/src/os/x11/connection.rs @@ -34,6 +34,21 @@ pub struct XConnection { pub atom_xsel_data: Atom, pub atom_targets: Atom, pub atom_clipboard: Atom, + pub atom_texturilist: 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, @@ -610,6 +625,21 @@ 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_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 +761,21 @@ impl XConnection { xrm: RefCell::new(xrm), atom_protocols, atom_clipboard, + atom_texturilist, + 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, diff --git a/window/src/os/x11/window.rs b/window/src/os/x11/window.rs index b66da14fa..299415f43 100644 --- a/window/src/os/x11/window.rs +++ b/window/src/os/x11/window.rs @@ -57,6 +57,28 @@ 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, conn: Weak, @@ -67,6 +89,7 @@ pub(crate) struct XWindowInner { dpi: f64, cursors: CursorInfo, copy_and_paste: CopyAndPaste, + drag_and_drop: DragAndDrop, config: ConfigHandle, appearance: Appearance, title: String, @@ -516,6 +539,121 @@ 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 &self.drag_and_drop.src_types { + if *t == conn.atom_texturilist { + self.drag_and_drop.target_type = conn.atom_texturilist; + } + 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,14 +727,36 @@ 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(_)) => { @@ -932,6 +1092,75 @@ 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_texturilist { + let paths = String::from_utf8_lossy(prop.value()) + .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; + } + use url::Url; + let url = Url::parse(line) + .map_err(|err| { + log::error!( + "Error parsing dropped file line {} as url: {:#}", + line, + err + ); + }) + .ok()?; + url.to_file_path() + .map_err(|_| { + log::error!( + "Error converting url {} from line {} to pathbuf", + url, + line + ); + }) + .ok() + }) + .collect::>(); + 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}"); } @@ -1204,6 +1433,7 @@ impl XWindow { 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 +1483,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() From 3d511bbd67060fbf4e1081dd8931a1dd121c96a7 Mon Sep 17 00:00:00 2001 From: Stefan Siegel Date: Thu, 18 Apr 2024 04:36:15 +0200 Subject: [PATCH 053/140] Accept drag and drop of URLs from browsers and plain text on X11 For filenames and urls an additional space is inserted after the last item to enable adding more files and urls with another drag-and-drop operation without the need to manually enter the space in between. --- wezterm-gui/src/termwindow/mod.rs | 25 ++++++++++++- window/examples/async.rs | 2 + window/src/lib.rs | 7 ++++ window/src/os/x11/connection.rs | 3 ++ window/src/os/x11/window.rs | 62 +++++++++++++++++++++++++++++-- 5 files changed, 94 insertions(+), 5 deletions(-) diff --git a/wezterm-gui/src/termwindow/mod.rs b/wezterm-gui/src/termwindow/mod.rs index c92e5a271..0ba025e42 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) } 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/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/x11/connection.rs b/window/src/os/x11/connection.rs index 5e55ca987..0a11d75d5 100644 --- a/window/src/os/x11/connection.rs +++ b/window/src/os/x11/connection.rs @@ -35,6 +35,7 @@ pub struct XConnection { 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, @@ -626,6 +627,7 @@ impl XConnection { 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")?; @@ -762,6 +764,7 @@ impl XConnection { atom_protocols, atom_clipboard, atom_texturilist, + atom_xmozurl, atom_xdndaware, atom_xdndtypelist, atom_xdndselection, diff --git a/window/src/os/x11/window.rs b/window/src/os/x11/window.rs index 299415f43..18024097a 100644 --- a/window/src/os/x11/window.rs +++ b/window/src/os/x11/window.rs @@ -576,10 +576,17 @@ impl XWindowInner { }; } self.drag_and_drop.target_type = xcb::x::ATOM_NONE; - for t in &self.drag_and_drop.src_types { - if *t == conn.atom_texturilist { - self.drag_and_drop.target_type = conn.atom_texturilist; + 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!( @@ -1105,7 +1112,54 @@ impl XWindowInner { long_length: u32::max_value(), }) { Ok(prop) => { - if selection.target() == conn.atom_texturilist { + 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 raw = prop.value(); + let data; + if raw.len() >= 2 + && ((raw[0], raw[1]) == (0xfe, 0xff) + || (raw[0] != 0x00 && raw[1] == 0x00)) + { + data = 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)) + { + data = String::from_utf16_lossy( + raw.chunks_exact(2) + .map(|x: &[u8]| u16::from(x[0]) << 8 | u16::from(x[1])) + .collect::>() + .as_slice(), + ); + } else { + data = String::from_utf8_lossy(prop.value()).to_string(); + } + use url::Url; + let urls = data + .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 {} as url: {:#}", + line, + err + ); + }) + .ok() + }) + .collect::>(); + self.events.dispatch(WindowEvent::DroppedUrl(urls)); + } else if selection.target() == conn.atom_texturilist { let paths = String::from_utf8_lossy(prop.value()) .lines() .filter_map(|line| { From 1598579551c3e84445631ddcdfd3b62f4344d357 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Sun, 5 May 2024 13:02:40 -0700 Subject: [PATCH 054/140] x11: refactor x11 dnd a little Reduce some nesting and make it a little easier to follow. refs: https://github.com/wez/wezterm/pull/5316 --- window/src/os/x11/window.rs | 139 +++++++++++++++++------------------- 1 file changed, 67 insertions(+), 72 deletions(-) diff --git a/window/src/os/x11/window.rs b/window/src/os/x11/window.rs index 18024097a..da0de8227 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}; @@ -1116,84 +1118,16 @@ impl XWindowInner { let text = String::from_utf8_lossy(prop.value()).to_string(); self.events.dispatch(WindowEvent::DroppedString(text)); } else if selection.target() == conn.atom_xmozurl { - let raw = prop.value(); - let data; - if raw.len() >= 2 - && ((raw[0], raw[1]) == (0xfe, 0xff) - || (raw[0] != 0x00 && raw[1] == 0x00)) - { - data = 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)) - { - data = String::from_utf16_lossy( - raw.chunks_exact(2) - .map(|x: &[u8]| u16::from(x[0]) << 8 | u16::from(x[1])) - .collect::>() - .as_slice(), - ); - } else { - data = String::from_utf8_lossy(prop.value()).to_string(); - } - use url::Url; - let urls = data - .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 {} as url: {:#}", - line, - err - ); - }) - .ok() - }) - .collect::>(); + 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 = String::from_utf8_lossy(prop.value()) - .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; - } - use url::Url; - let url = Url::parse(line) - .map_err(|err| { - log::error!( - "Error parsing dropped file line {} as url: {:#}", - line, - err - ); - }) - .ok()?; - url.to_file_path() - .map_err(|_| { - log::error!( - "Error converting url {} from line {} to pathbuf", - url, - line - ); - }) - .ok() - }) - .collect::>(); + let paths = parse_texturi_list(prop.value()); self.events.dispatch(WindowEvent::DroppedFile(paths)); } } Err(err) => { - log::error!("clipboard: err while getting clipboard property: {:?}", err); + log::error!("clipboard: err while getting clipboard property: {err:#}"); } } conn.send_request_no_reply_log(&xcb::x::SendEvent { @@ -2163,6 +2097,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 { From 65a84ddd60cc395fb442bfe2782a7eb75866e8c1 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Sun, 5 May 2024 13:05:53 -0700 Subject: [PATCH 055/140] docs: update for x11 dnd closes: https://github.com/wez/wezterm/pull/5316 closes: https://github.com/wez/wezterm/issues/640 --- docs/changelog.md | 3 +++ docs/config/lua/config/quote_dropped_files.md | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/changelog.md b/docs/changelog.md index 92be043cc..52b8d3c8d 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -28,6 +28,9 @@ 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 + #### New * [wezterm.serde](config/lua/wezterm.serde/index.md) module for serialization and deserialization of JSON, TOML and YAML. Thanks to @expnn! #4969 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| From d9455a45feff01323384a399f836adeffd09ab11 Mon Sep 17 00:00:00 2001 From: Kushagra Gupta Date: Thu, 2 May 2024 05:51:00 +0530 Subject: [PATCH 056/140] fixed the issue #5348 and a typo Fixed the issue #5348 for windows by setting margins check for window decoration instead and using value 0 margin for only the TITLE style --- window/src/os/windows/window.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/window/src/os/windows/window.rs b/window/src/os/windows/window.rs index b38479c37..bbeffb845 100644 --- a/window/src/os/windows/window.rs +++ b/window/src/os/windows/window.rs @@ -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( From 18d643510fdc6e5b45da102bca5c421f28e92223 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Sun, 5 May 2024 13:10:36 -0700 Subject: [PATCH 057/140] docs: changelog for #5362 #5348 --- docs/changelog.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/changelog.md b/docs/changelog.md index 52b8d3c8d..61571b0bc 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -48,6 +48,8 @@ As features stabilize some brief notes about them will accumulate here. * 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 #### Updated * Bundled conpty.dll and OpenConsole.exe to build 1.19.240130002.nupkg From ba25f7df78aa66021ef702cbae972e8fbe9066b4 Mon Sep 17 00:00:00 2001 From: Quan Tong Date: Tue, 16 Apr 2024 11:29:37 +0700 Subject: [PATCH 058/140] make activate-pane CLI honor unzoom_on_switch_pane --- mux/src/tab.rs | 7 +++++++ 1 file changed, 7 insertions(+) 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() From 0130c9960b3dcd40ad7d2f90dbd561d732c93ab3 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Sun, 5 May 2024 13:17:52 -0700 Subject: [PATCH 059/140] docs: changelog for #5306 --- docs/changelog.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/changelog.md b/docs/changelog.md index 61571b0bc..3481b5a95 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -50,6 +50,8 @@ As features stabilize some brief notes about them will accumulate here. #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 #### Updated * Bundled conpty.dll and OpenConsole.exe to build 1.19.240130002.nupkg From a38793110cc84e422178c1ee25544090046bad9d Mon Sep 17 00:00:00 2001 From: stribor14 Date: Fri, 15 Mar 2024 11:18:16 +0100 Subject: [PATCH 060/140] Smooth mosaic terminal graphic characters --- wezterm-gui/src/customglyph.rs | 497 +++++++++++++++++++++++++++++++-- 1 file changed, 479 insertions(+), 18 deletions(-) diff --git a/wezterm-gui/src/customglyph.rs b/wezterm-gui/src/customglyph.rs index 1b9b7699c..d34626a21 100644 --- a/wezterm-gui/src/customglyph.rs +++ b/wezterm-gui/src/customglyph.rs @@ -3332,24 +3332,6 @@ impl BlockKey { 0x1fb1b => { Self::Sextants(Sextant::ONE | Sextant::THREE | Sextant::FOUR | Sextant::FIVE) } - // Braille dot patterns - // ⠀ ⠁ ⠂ ⠃ ⠄ ⠅ ⠆ ⠇ ⠈ ⠉ ⠊ ⠋ ⠌ ⠍ ⠎ ⠏ - // ⠐ ⠑ ⠒ ⠓ ⠔ ⠕ ⠖ ⠗ ⠘ ⠙ ⠚ ⠛ ⠜ ⠝ ⠞ ⠟ - // ⠠ ⠡ ⠢ ⠣ ⠤ ⠥ ⠦ ⠧ ⠨ ⠩ ⠪ ⠫ ⠬ ⠭ ⠮ ⠯ - // ⠰ ⠱ ⠲ ⠳ ⠴ ⠵ ⠶ ⠷ ⠸ ⠹ ⠺ ⠻ ⠼ ⠽ ⠾ ⠿ - // ⡀ ⡁ ⡂ ⡃ ⡄ ⡅ ⡆ ⡇ ⡈ ⡉ ⡊ ⡋ ⡌ ⡍ ⡎ ⡏ - // ⡐ ⡑ ⡒ ⡓ ⡔ ⡕ ⡖ ⡗ ⡘ ⡙ ⡚ ⡛ ⡜ ⡝ ⡞ ⡟ - // ⡠ ⡡ ⡢ ⡣ ⡤ ⡥ ⡦ ⡧ ⡨ ⡩ ⡪ ⡫ ⡬ ⡭ ⡮ ⡯ - // ⡰ ⡱ ⡲ ⡳ ⡴ ⡵ ⡶ ⡷ ⡸ ⡹ ⡺ ⡻ ⡼ ⡽ ⡾ ⡿ - // ⢀ ⢁ ⢂ ⢃ ⢄ ⢅ ⢆ ⢇ ⢈ ⢉ ⢊ ⢋ ⢌ ⢍ ⢎ ⢏ - // ⢐ ⢑ ⢒ ⢓ ⢔ ⢕ ⢖ ⢗ ⢘ ⢙ ⢚ ⢛ ⢜ ⢝ ⢞ ⢟ - // ⢠ ⢡ ⢢ ⢣ ⢤ ⢥ ⢦ ⢧ ⢨ ⢩ ⢪ ⢫ ⢬ ⢭ ⢮ ⢯ - // ⢰ ⢱ ⢲ ⢳ ⢴ ⢵ ⢶ ⢷ ⢸ ⢹ ⢺ ⢻ ⢼ ⢽ ⢾ ⢿ - // ⣀ ⣁ ⣂ ⣃ ⣄ ⣅ ⣆ ⣇ ⣈ ⣉ ⣊ ⣋ ⣌ ⣍ ⣎ ⣏ - // ⣐ ⣑ ⣒ ⣓ ⣔ ⣕ ⣖ ⣗ ⣘ ⣙ ⣚ ⣛ ⣜ ⣝ ⣞ ⣟ - // ⣠ ⣡ ⣢ ⣣ ⣤ ⣥ ⣦ ⣧ ⣨ ⣩ ⣪ ⣫ ⣬ ⣭ ⣮ ⣯ - // ⣰ ⣱ ⣲ ⣳ ⣴ ⣵ ⣶ ⣷ ⣸ ⣹ ⣺ ⣻ ⣼ ⣽ ⣾ ⣿ - n @ 0x2800..=0x28ff => Self::Braille((n & 0xff) as u8), // [🬜] BLOCK SEXTANT-2345 0x1fb1c => { Self::Sextants(Sextant::TWO | Sextant::THREE | Sextant::FOUR | Sextant::FIVE) @@ -3485,6 +3467,467 @@ 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, + }]), // [🭼] Left and lower one eighth block 0x1fb7c => Self::Edges(&[Edge::Left(1), Edge::Lower(1)]), // [🭽] Left and upper one eighth block @@ -3513,6 +3956,24 @@ impl BlockKey { 0x1fb8a => Self::Edges(&[Edge::Right(6)]), // [🮋] Right seven eighths block 0x1fb8b => Self::Edges(&[Edge::Right(7)]), + // Braille dot patterns + // ⠀ ⠁ ⠂ ⠃ ⠄ ⠅ ⠆ ⠇ ⠈ ⠉ ⠊ ⠋ ⠌ ⠍ ⠎ ⠏ + // ⠐ ⠑ ⠒ ⠓ ⠔ ⠕ ⠖ ⠗ ⠘ ⠙ ⠚ ⠛ ⠜ ⠝ ⠞ ⠟ + // ⠠ ⠡ ⠢ ⠣ ⠤ ⠥ ⠦ ⠧ ⠨ ⠩ ⠪ ⠫ ⠬ ⠭ ⠮ ⠯ + // ⠰ ⠱ ⠲ ⠳ ⠴ ⠵ ⠶ ⠷ ⠸ ⠹ ⠺ ⠻ ⠼ ⠽ ⠾ ⠿ + // ⡀ ⡁ ⡂ ⡃ ⡄ ⡅ ⡆ ⡇ ⡈ ⡉ ⡊ ⡋ ⡌ ⡍ ⡎ ⡏ + // ⡐ ⡑ ⡒ ⡓ ⡔ ⡕ ⡖ ⡗ ⡘ ⡙ ⡚ ⡛ ⡜ ⡝ ⡞ ⡟ + // ⡠ ⡡ ⡢ ⡣ ⡤ ⡥ ⡦ ⡧ ⡨ ⡩ ⡪ ⡫ ⡬ ⡭ ⡮ ⡯ + // ⡰ ⡱ ⡲ ⡳ ⡴ ⡵ ⡶ ⡷ ⡸ ⡹ ⡺ ⡻ ⡼ ⡽ ⡾ ⡿ + // ⢀ ⢁ ⢂ ⢃ ⢄ ⢅ ⢆ ⢇ ⢈ ⢉ ⢊ ⢋ ⢌ ⢍ ⢎ ⢏ + // ⢐ ⢑ ⢒ ⢓ ⢔ ⢕ ⢖ ⢗ ⢘ ⢙ ⢚ ⢛ ⢜ ⢝ ⢞ ⢟ + // ⢠ ⢡ ⢢ ⢣ ⢤ ⢥ ⢦ ⢧ ⢨ ⢩ ⢪ ⢫ ⢬ ⢭ ⢮ ⢯ + // ⢰ ⢱ ⢲ ⢳ ⢴ ⢵ ⢶ ⢷ ⢸ ⢹ ⢺ ⢻ ⢼ ⢽ ⢾ ⢿ + // ⣀ ⣁ ⣂ ⣃ ⣄ ⣅ ⣆ ⣇ ⣈ ⣉ ⣊ ⣋ ⣌ ⣍ ⣎ ⣏ + // ⣐ ⣑ ⣒ ⣓ ⣔ ⣕ ⣖ ⣗ ⣘ ⣙ ⣚ ⣛ ⣜ ⣝ ⣞ ⣟ + // ⣠ ⣡ ⣢ ⣣ ⣤ ⣥ ⣦ ⣧ ⣨ ⣩ ⣪ ⣫ ⣬ ⣭ ⣮ ⣯ + // ⣰ ⣱ ⣲ ⣳ ⣴ ⣵ ⣶ ⣷ ⣸ ⣹ ⣺ ⣻ ⣼ ⣽ ⣾ ⣿ + n @ 0x2800..=0x28ff => Self::Braille((n & 0xff) as u8), // [] Powerline filled right arrow 0xe0b0 => Self::Poly(&[Poly { path: &[ From 314cb75a7798bc87fe59072f2aa2988954afe2f9 Mon Sep 17 00:00:00 2001 From: stribor14 Date: Fri, 15 Mar 2024 12:02:32 +0100 Subject: [PATCH 061/140] Smooth mosaic terminal graphic characters (quarter triangles) --- wezterm-gui/src/customglyph.rs | 148 +++++++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) diff --git a/wezterm-gui/src/customglyph.rs b/wezterm-gui/src/customglyph.rs index d34626a21..eb12c0b49 100644 --- a/wezterm-gui/src/customglyph.rs +++ b/wezterm-gui/src/customglyph.rs @@ -41,6 +41,15 @@ bitflags::bitflags! { } } +bitflags::bitflags! { + pub struct Triangle: u8{ + const UPPER = 1<<1; + const LOWER = 1<<2; + const LEFT = 1<<3; + const RIGHT = 1<<4; + } +} + #[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)] pub enum BlockAlpha { /// 100% @@ -156,6 +165,8 @@ pub enum BlockKey { Quadrants(Quadrant), /// A combination of sextants Sextants(Sextant), + /// A combination of triangles + Triangles(Triangle), /// A braille dot pattern Braille(u8), @@ -3928,6 +3939,23 @@ impl BlockKey { intensity: BlockAlpha::Full, style: PolyStyle::Fill, }]), + // [🭨] UPPER AND RIGHT AND LOWER TRIANGULAR THREE QUARTERS BLOCK + 0x1fb68 => Self::Triangles(Triangle::UPPER | Triangle::RIGHT | Triangle::LOWER), + // [🭩] LEFT AND LOWER AND RIGHT TRIANGULAR THREE QUARTERS BLOCK + 0x1fb69 => Self::Triangles(Triangle::LEFT | Triangle::LOWER | Triangle::RIGHT), + // [🭪] UPPER AND LEFT AND LOWER TRIANGULAR THREE QUARTERS BLOCK + 0x1fb6a => Self::Triangles(Triangle::UPPER | Triangle::LEFT | Triangle::LOWER), + // [🭫] LEFT AND UPPER AND RIGHT TRIANGULAR THREE QUARTERS BLOCK + 0x1fb6b => Self::Triangles(Triangle::LEFT | Triangle::UPPER | Triangle::RIGHT), + // [🭬] LEFT TRIANGULAR ONE QUARTER BLOCK + 0x1fb6c => Self::Triangles(Triangle::LEFT), + // [🭭] UPPER TRIANGULAR ONE QUARTER BLOCK + 0x1fb6d => Self::Triangles(Triangle::UPPER), + // [🭮] RIGHT TRIANGULAR ONE QUARTER BLOCK + 0x1fb6e => Self::Triangles(Triangle::RIGHT), + // [🭯] LOWER TRIANGULAR ONE QUARTER BLOCK + 0x1fb6f => Self::Triangles(Triangle::LOWER), + // [🭼] Left and lower one eighth block 0x1fb7c => Self::Edges(&[Edge::Left(1), Edge::Lower(1)]), // [🭽] Left and upper one eighth block @@ -3956,6 +3984,12 @@ impl BlockKey { 0x1fb8a => Self::Edges(&[Edge::Right(6)]), // [🮋] Right seven eighths block 0x1fb8b => Self::Edges(&[Edge::Right(7)]), + + // [🮚] UPPER AND LOWER TRIANGULAR HALF BLOCK + 0x1fb9a => Self::Triangles(Triangle::UPPER | Triangle::LOWER), + // [🮛] LEFT AND RIGHT TRIANGULAR HALF BLOCK + 0x1fb9b => Self::Triangles(Triangle::LEFT | Triangle::RIGHT), + // Braille dot patterns // ⠀ ⠁ ⠂ ⠃ ⠄ ⠅ ⠆ ⠇ ⠈ ⠉ ⠊ ⠋ ⠌ ⠍ ⠎ ⠏ // ⠐ ⠑ ⠒ ⠓ ⠔ ⠕ ⠖ ⠗ ⠘ ⠙ ⠚ ⠛ ⠜ ⠝ ⠞ ⠟ @@ -4391,6 +4425,120 @@ impl GlyphCache { fill_rect(&mut buffer, scale(x_half)..width, scale(y_half)..height); } } + BlockKey::Triangles(triangles) => { + if triangles.contains(Triangle::UPPER) { + self.draw_polys( + &metrics, + &[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::Frac(1 ,2), BlockCoord::Frac(1, 2)), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }], + &mut buffer, + if config::configuration().anti_alias_custom_block_glyphs { + PolyAA::AntiAlias + } else { + PolyAA::MoarPixels + }, + ); + } + if triangles.contains(Triangle::LOWER) { + self.draw_polys( + &metrics, + &[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Frac(1 ,2), BlockCoord::Frac(1, 2)), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }], + &mut buffer, + if config::configuration().anti_alias_custom_block_glyphs { + PolyAA::AntiAlias + } else { + PolyAA::MoarPixels + }, + ); + } + if triangles.contains(Triangle::LEFT) { + self.draw_polys( + &metrics, + &[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::Frac(1 ,2), BlockCoord::Frac(1, 2)), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }], + &mut buffer, + if config::configuration().anti_alias_custom_block_glyphs { + PolyAA::AntiAlias + } else { + PolyAA::MoarPixels + }, + ); + } + if triangles.contains(Triangle::RIGHT) { + self.draw_polys( + &metrics, + &[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::One, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Frac(1 ,2), BlockCoord::Frac(1, 2)), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }], + &mut buffer, + if config::configuration().anti_alias_custom_block_glyphs { + PolyAA::AntiAlias + } else { + PolyAA::MoarPixels + }, + ); + } + // check if multiple triangles are requested and fill anti-aliased X in the middle + if triangles.bits() & (triangles.bits() - 1) != 0 { + self.draw_polys( + &metrics, + &[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Outline, + }, + Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::One, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Outline, + }], + &mut buffer, + if config::configuration().anti_alias_custom_block_glyphs { + PolyAA::AntiAlias + } else { + PolyAA::MoarPixels + }, + ) + } + } BlockKey::Sextants(s) => { let y_third = metrics.cell_size.height as f32 / 3.; let x_half = metrics.cell_size.width as f32 / 2.; From 26ec91d4e66d1d394fc2a436c2fc8f375044e757 Mon Sep 17 00:00:00 2001 From: stribor14 Date: Fri, 15 Mar 2024 13:15:34 +0100 Subject: [PATCH 062/140] Rename Edge to Block, add 'Block Elements' --- wezterm-gui/src/customglyph.rs | 138 +++++++++++++++++++++++---------- 1 file changed, 95 insertions(+), 43 deletions(-) diff --git a/wezterm-gui/src/customglyph.rs b/wezterm-gui/src/customglyph.rs index eb12c0b49..249ba5148 100644 --- a/wezterm-gui/src/customglyph.rs +++ b/wezterm-gui/src/customglyph.rs @@ -140,7 +140,7 @@ impl BlockCoord { } #[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)] -pub enum Edge { +pub enum Block { /// Number of 1/8ths in the upper half Upper(u8), /// Number of 1/8ths in the lower half @@ -149,6 +149,12 @@ pub enum Edge { Left(u8), /// Number of 1/8ths in the right half Right(u8), + /// Number of 1/8ths: x0, x1 + Vertical(u8, u8), + /// Number of 1/8ths: y0, y1 + Horizontal(u8, u8), + /// Number of 1/8ths: x0, x1, y0, y1 + Custom(u8, u8, u8, u8), } /// Represents a Block Element glyph, decoded from @@ -156,8 +162,8 @@ pub enum Edge { /// #[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)] pub enum BlockKey { - /// List of edge rectangles - Edges(&'static [Edge]), + /// List of block rectangles + Blocks(&'static [Block]), /// Full block with alpha level Full(BlockAlpha), @@ -3214,39 +3220,39 @@ impl BlockKey { ]), // [▀] UPPER HALF BLOCK - 0x2580 => Self::Edges(&[Edge::Upper(4)]), + 0x2580 => Self::Blocks(&[Block::Upper(4)]), // [▁] LOWER 1 EIGHTH BLOCK - 0x2581 => Self::Edges(&[Edge::Lower(1)]), + 0x2581 => Self::Blocks(&[Block::Lower(1)]), // [▂] LOWER 2 EIGHTHS BLOCK - 0x2582 => Self::Edges(&[Edge::Lower(2)]), + 0x2582 => Self::Blocks(&[Block::Lower(2)]), // [▃] LOWER 3 EIGHTHS BLOCK - 0x2583 => Self::Edges(&[Edge::Lower(3)]), + 0x2583 => Self::Blocks(&[Block::Lower(3)]), // [▄] LOWER 4 EIGHTHS BLOCK - 0x2584 => Self::Edges(&[Edge::Lower(4)]), + 0x2584 => Self::Blocks(&[Block::Lower(4)]), // [▅] LOWER 5 EIGHTHS BLOCK - 0x2585 => Self::Edges(&[Edge::Lower(5)]), + 0x2585 => Self::Blocks(&[Block::Lower(5)]), // [▆] LOWER 6 EIGHTHS BLOCK - 0x2586 => Self::Edges(&[Edge::Lower(6)]), + 0x2586 => Self::Blocks(&[Block::Lower(6)]), // [▇] LOWER 7 EIGHTHS BLOCK - 0x2587 => Self::Edges(&[Edge::Lower(7)]), + 0x2587 => Self::Blocks(&[Block::Lower(7)]), // [█] FULL BLOCK 0x2588 => Self::Full(BlockAlpha::Full), // [▉] LEFT 7 EIGHTHS BLOCK - 0x2589 => Self::Edges(&[Edge::Left(7)]), + 0x2589 => Self::Blocks(&[Block::Left(7)]), // [▊] LEFT 6 EIGHTHS BLOCK - 0x258a => Self::Edges(&[Edge::Left(6)]), + 0x258a => Self::Blocks(&[Block::Left(6)]), // [▋] LEFT 5 EIGHTHS BLOCK - 0x258b => Self::Edges(&[Edge::Left(5)]), + 0x258b => Self::Blocks(&[Block::Left(5)]), // [▌] LEFT 4 EIGHTHS BLOCK - 0x258c => Self::Edges(&[Edge::Left(4)]), + 0x258c => Self::Blocks(&[Block::Left(4)]), // [▍] LEFT 3 EIGHTHS BLOCK - 0x258d => Self::Edges(&[Edge::Left(3)]), + 0x258d => Self::Blocks(&[Block::Left(3)]), // [▎] LEFT 2 EIGHTHS BLOCK - 0x258e => Self::Edges(&[Edge::Left(2)]), + 0x258e => Self::Blocks(&[Block::Left(2)]), // [▏] LEFT 1 EIGHTHS BLOCK - 0x258f => Self::Edges(&[Edge::Left(1)]), + 0x258f => Self::Blocks(&[Block::Left(1)]), // [▐] RIGHT HALF BLOCK - 0x2590 => Self::Edges(&[Edge::Right(4)]), + 0x2590 => Self::Blocks(&[Block::Right(4)]), // [░] LIGHT SHADE 0x2591 => Self::Full(BlockAlpha::Light), // [▒] MEDIUM SHADE @@ -3254,9 +3260,9 @@ impl BlockKey { // [▓] DARK SHADE 0x2593 => Self::Full(BlockAlpha::Dark), // [▔] UPPER ONE EIGHTH BLOCK - 0x2594 => Self::Edges(&[Edge::Upper(1)]), + 0x2594 => Self::Blocks(&[Block::Upper(1)]), // [▕] RIGHT ONE EIGHTH BLOCK - 0x2595 => Self::Edges(&[Edge::Right(1)]), + 0x2595 => Self::Blocks(&[Block::Right(1)]), // [▖] QUADRANT LOWER LEFT 0x2596 => Self::Quadrants(Quadrant::LOWER_LEFT), // [▗] QUADRANT LOWER RIGHT @@ -3955,35 +3961,62 @@ impl BlockKey { 0x1fb6e => Self::Triangles(Triangle::RIGHT), // [🭯] LOWER TRIANGULAR ONE QUARTER BLOCK 0x1fb6f => Self::Triangles(Triangle::LOWER), - + // [🭰] VERTICAL ONE EIGHTH BLOCK-2 + 0x1fb70 => Self::Blocks(&[Block::Vertical(1, 2)]), + // [🭱] VERTICAL ONE EIGHTH BLOCK-3 + 0x1fb71 => Self::Blocks(&[Block::Vertical(2, 3)]), + // [🭲] VERTICAL ONE EIGHTH BLOCK-4 + 0x1fb72 => Self::Blocks(&[Block::Vertical(3, 4)]), + // [🭳] VERTICAL ONE EIGHTH BLOCK-5 + 0x1fb73 => Self::Blocks(&[Block::Vertical(4, 5)]), + // [🭴] VERTICAL ONE EIGHTH BLOCK-6 + 0x1fb74 => Self::Blocks(&[Block::Vertical(5, 6)]), + // [🭵] VERTICAL ONE EIGHTH BLOCK-7 + 0x1fb75 => Self::Blocks(&[Block::Vertical(6, 7)]), + // [🭶] HORIZONTAL ONE EIGHTH BLOCK-2 + 0x1fb76 => Self::Blocks(&[Block::Horizontal(1, 2)]), + // [🭷] HORIZONTAL ONE EIGHTH BLOCK-3 + 0x1fb77 => Self::Blocks(&[Block::Horizontal(2, 3)]), + // [🭸] HORIZONTAL ONE EIGHTH BLOCK-4 + 0x1fb78 => Self::Blocks(&[Block::Horizontal(3, 4)]), + // [🭹] HORIZONTAL ONE EIGHTH BLOCK-5 + 0x1fb79 => Self::Blocks(&[Block::Horizontal(4, 5)]), + // [🭺] HORIZONTAL ONE EIGHTH BLOCK-6 + 0x1fb7a => Self::Blocks(&[Block::Horizontal(5, 6)]), + // [🭻] HORIZONTAL ONE EIGHTH BLOCK-7 + 0x1fb7b => Self::Blocks(&[Block::Horizontal(6, 7)]), // [🭼] Left and lower one eighth block - 0x1fb7c => Self::Edges(&[Edge::Left(1), Edge::Lower(1)]), + 0x1fb7c => Self::Blocks(&[Block::Left(1), Block::Lower(1)]), // [🭽] Left and upper one eighth block - 0x1fb7d => Self::Edges(&[Edge::Left(1), Edge::Upper(1)]), + 0x1fb7d => Self::Blocks(&[Block::Left(1), Block::Upper(1)]), // [🭾] Right and upper one eighth block - 0x1fb7e => Self::Edges(&[Edge::Right(1), Edge::Upper(1)]), + 0x1fb7e => Self::Blocks(&[Block::Right(1), Block::Upper(1)]), // [🭿] Right and lower one eighth block - 0x1fb7f => Self::Edges(&[Edge::Right(1), Edge::Lower(1)]), + 0x1fb7f => Self::Blocks(&[Block::Right(1), Block::Lower(1)]), + // [🮀] UPPER AND LOWER ONE EIGHTH BLOCK + 0x1fb80 => Self::Blocks(&[Block::Upper(1), Block::Lower(1)]), + // [🮁] HORIZONTAL ONE EIGHTH BLOCK-1358 + 0x1fb81 => Self::Blocks(&[Block::Upper(1), Block::Horizontal(2, 3), Block::Horizontal(4, 5), Block::Lower(1)]), // [🮂] Upper One Quarter Block - 0x1fb82 => Self::Edges(&[Edge::Upper(2)]), + 0x1fb82 => Self::Blocks(&[Block::Upper(2)]), // [🮃] Upper three eighths block - 0x1fb83 => Self::Edges(&[Edge::Upper(3)]), + 0x1fb83 => Self::Blocks(&[Block::Upper(3)]), // [🮄] Upper five eighths block - 0x1fb84 => Self::Edges(&[Edge::Upper(5)]), + 0x1fb84 => Self::Blocks(&[Block::Upper(5)]), // [🮅] Upper three quarters block - 0x1fb85 => Self::Edges(&[Edge::Upper(6)]), + 0x1fb85 => Self::Blocks(&[Block::Upper(6)]), // [🮆] Upper seven eighths block - 0x1fb86 => Self::Edges(&[Edge::Upper(7)]), + 0x1fb86 => Self::Blocks(&[Block::Upper(7)]), // [🮇] Right One Quarter Block - 0x1fb87 => Self::Edges(&[Edge::Right(2)]), + 0x1fb87 => Self::Blocks(&[Block::Right(2)]), // [🮈] Right three eighths block - 0x1fb88 => Self::Edges(&[Edge::Right(3)]), + 0x1fb88 => Self::Blocks(&[Block::Right(3)]), // [🮉] Right five eighths block - 0x1fb89 => Self::Edges(&[Edge::Right(5)]), + 0x1fb89 => Self::Blocks(&[Block::Right(5)]), // [🮊] Right three quarters block - 0x1fb8a => Self::Edges(&[Edge::Right(6)]), + 0x1fb8a => Self::Blocks(&[Block::Right(6)]), // [🮋] Right seven eighths block - 0x1fb8b => Self::Edges(&[Edge::Right(7)]), + 0x1fb8b => Self::Blocks(&[Block::Right(7)]), // [🮚] UPPER AND LOWER TRIANGULAR HALF BLOCK 0x1fb9a => Self::Triangles(Triangle::UPPER | Triangle::LOWER), @@ -4372,31 +4405,50 @@ impl GlyphCache { buffer.clear_rect(cell_rect, black); match key.block { - BlockKey::Edges(edges) => { - for edge in edges.iter() { - match edge { - Edge::Upper(num) => { + BlockKey::Blocks(blocks) => { + for block in blocks.iter() { + match block { + Block::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)); } - Edge::Lower(num) => { + Block::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); } - Edge::Left(num) => { + Block::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); } - Edge::Right(num) => { + Block::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::Vertical(x0, x1) => { + let left = metrics.cell_size.width as f32 * (*x0 as f32) / 8.; + let right = metrics.cell_size.width as f32 * (*x1 as f32) / 8.; + let height = metrics.cell_size.height as usize; + fill_rect(&mut buffer, scale(left)..scale(right), 0..height); + } + Block::Horizontal(y0, y1) => { + let top = metrics.cell_size.height as f32 * (*y0 as f32) / 8.; + let bottom = metrics.cell_size.height as f32 * (*y1 as f32) / 8.; + let width = metrics.cell_size.width as usize; + fill_rect(&mut buffer, 0..width, scale(top)..scale(bottom)); + } + Block::Custom(x0, x1, y0, y1) => { + let left = metrics.cell_size.width as f32 * (*x0 as f32) / 8.; + let right = metrics.cell_size.width as f32 * (*x1 as f32) / 8.; + let top = metrics.cell_size.height as f32 * (*y0 as f32) / 8.; + let bottom = metrics.cell_size.height as f32 * (*y1 as f32) / 8.; + fill_rect(&mut buffer, scale(left)..scale(right), scale(top)..scale(bottom)); + } } } } From 536767dc230321aff3048af790505844c3005307 Mon Sep 17 00:00:00 2001 From: stribor14 Date: Fri, 15 Mar 2024 14:26:02 +0100 Subject: [PATCH 063/140] Shade characters --- wezterm-gui/src/customglyph.rs | 196 +++++++++++++++++++++++++++++++++ 1 file changed, 196 insertions(+) diff --git a/wezterm-gui/src/customglyph.rs b/wezterm-gui/src/customglyph.rs index 249ba5148..5d275777b 100644 --- a/wezterm-gui/src/customglyph.rs +++ b/wezterm-gui/src/customglyph.rs @@ -4017,11 +4017,207 @@ impl BlockKey { 0x1fb8a => Self::Blocks(&[Block::Right(6)]), // [🮋] Right seven eighths block 0x1fb8b => Self::Blocks(&[Block::Right(7)]), + // [🮌] LEFT HALF MEDIUM SHADE + 0x1fb8c => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::Frac(1, 2), BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::Frac(1, 2), BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), + PolyCommand::Close, + ], + intensity: BlockAlpha::Medium, + style: PolyStyle::Fill, + }]), + // [🮍] RIGHT HALF MEDIUM SHADE + 0x1fb8d => 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::Frac(1, 2), BlockCoord::One), + PolyCommand::Close, + ], + intensity: BlockAlpha::Medium, + style: PolyStyle::Fill, + }]), + // [🮎] UPPER HALF MEDIUM SHADE + 0x1fb8e => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(1, 2)), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::Frac(1, 2)), + PolyCommand::Close, + ], + intensity: BlockAlpha::Medium, + style: PolyStyle::Fill, + }]), + // [🮏] LOWER HALF MEDIUM SHADE + 0x1fb8f => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Frac(1, 2)), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(1, 2)), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), + PolyCommand::Close, + ], + intensity: BlockAlpha::Medium, + style: PolyStyle::Fill, + }]), + // [🮐] INVERSE MEDIUM SHADE + 0x1fb90 => Self::Full(BlockAlpha::Medium), + // [🮑] UPPER HALF BLOCK AND LOWER HALF INVERSE MEDIUM SHADE + 0x1fb91 => Self::Poly(&[ + Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(1, 2)), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::Frac(1, 2)), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }, + Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Frac(1, 2)), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(1, 2)), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), + PolyCommand::Close, + ], + intensity: BlockAlpha::Medium, + style: PolyStyle::Fill, + } + ]), + // [🮒] UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK + 0x1fb92 => Self::Poly(&[ + Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(1, 2)), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::Frac(1, 2)), + PolyCommand::Close, + ], + intensity: BlockAlpha::Medium, + style: PolyStyle::Fill, + }, + Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Frac(1, 2)), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(1, 2)), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + } + ]), + // INFO: not official! + // [ ] LEFT HALF BLOCK AND RIGHT HALF INVERSE MEDIUM SHADE + 0x1fb93 => Self::Poly(&[ + Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::Frac(1, 2), BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::Frac(1, 2), BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + }, + 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::Frac(1, 2), BlockCoord::One), + PolyCommand::Close, + ], + intensity: BlockAlpha::Medium, + style: PolyStyle::Fill, + } + ]), + // [🮔] LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK + 0x1fb94 => Self::Poly(&[ + Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::Frac(1, 2), BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::Frac(1, 2), BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), + PolyCommand::Close, + ], + intensity: BlockAlpha::Medium, + style: PolyStyle::Fill, + }, + 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::Frac(1, 2), BlockCoord::One), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Fill, + } + ]), + // [🮚] UPPER AND LOWER TRIANGULAR HALF BLOCK 0x1fb9a => Self::Triangles(Triangle::UPPER | Triangle::LOWER), // [🮛] LEFT AND RIGHT TRIANGULAR HALF BLOCK 0x1fb9b => Self::Triangles(Triangle::LEFT | Triangle::RIGHT), + // [🮜] UPPER UPPER LEFT TRIANGULAR MEDIUM SHADE + 0x1fb9c => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), + PolyCommand::Close, + ], + intensity: BlockAlpha::Medium, + style: PolyStyle::Fill, + }]), + // [🮝] UPPER RIGHT TRIANGULAR MEDIUM SHADE + 0x1fb9d => 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::Medium, + style: PolyStyle::Fill, + }]), + // [🮞] LOWER RIGHT TRIANGULAR MEDIUM SHADE + 0x1fb9e => Self::Poly(&[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::One, BlockCoord::Zero), + PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), + PolyCommand::Close, + ], + intensity: BlockAlpha::Medium, + style: PolyStyle::Fill, + }]), + // [🮟] LOWER LEFT TRIANGULAR MEDIUM SHADE + 0x1fb9f => 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::Medium, + style: PolyStyle::Fill, + }]), // Braille dot patterns // ⠀ ⠁ ⠂ ⠃ ⠄ ⠅ ⠆ ⠇ ⠈ ⠉ ⠊ ⠋ ⠌ ⠍ ⠎ ⠏ From 4b04752ee57e5a8a1ab5dad98c5da8c8eb8b852b Mon Sep 17 00:00:00 2001 From: stribor14 Date: Fri, 15 Mar 2024 15:46:08 +0100 Subject: [PATCH 064/140] Fill characters --- wezterm-gui/src/customglyph.rs | 191 +++++++++++++++++++++++++++++++-- 1 file changed, 183 insertions(+), 8 deletions(-) diff --git a/wezterm-gui/src/customglyph.rs b/wezterm-gui/src/customglyph.rs index 5d275777b..e824fc9b9 100644 --- a/wezterm-gui/src/customglyph.rs +++ b/wezterm-gui/src/customglyph.rs @@ -4168,8 +4168,183 @@ impl BlockKey { style: PolyStyle::Fill, } ]), - - + // [🮕] CHECKER BOARD FILL + 0x1fb95 => Self::Blocks(&[ + Block::Custom(0, 2, 0 ,2), + Block::Custom(0, 2, 4, 6), + Block::Custom(2, 4, 2, 4), + Block::Custom(2, 4, 6, 8), + Block::Custom(4, 6, 0 ,2), + Block::Custom(4, 6, 4, 6), + Block::Custom(6, 8, 2, 4), + Block::Custom(6, 8, 6, 8), + ]), + // [🮖] INVERSE CHECKER BOARD FILL + 0x1fb96 => Self::Blocks(&[ + Block::Custom(0, 2, 2 ,4), + Block::Custom(0, 2, 6, 8), + Block::Custom(2, 4, 0 ,2), + Block::Custom(2, 4, 4, 6), + Block::Custom(4, 6, 2 ,4), + Block::Custom(4, 6, 6, 8), + Block::Custom(6, 8, 0 ,2), + Block::Custom(6, 8, 4, 6), + ]), + // [🮗] HEAVY HORIZONTAL FILL + 0x1fb97 => Self::Blocks(&[ + Block::Horizontal(2, 4), + Block::Horizontal(6, 8), + ]), + // [🮘] UPPER LEFT TO LOWER RIGHT FILL + 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::OutlineHeavy, + }, + 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::OutlineHeavy, + }, + 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::OutlineHeavy, + }, + 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::OutlineHeavy, + }, + 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::OutlineHeavy, + }, + 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::OutlineHeavy, + }, + 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::OutlineHeavy, + }, + 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::OutlineHeavy, + }, + ]), + // [🮙] UPPER RIGHT TO LOWER LEFT FILL + 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::OutlineHeavy, + }, + 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::OutlineHeavy, + }, + 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::OutlineHeavy, + }, + 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::OutlineHeavy, + }, + 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::OutlineHeavy, + }, + 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::OutlineHeavy, + }, + 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::OutlineHeavy, + }, + 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::OutlineHeavy, + }, + ]), // [🮚] UPPER AND LOWER TRIANGULAR HALF BLOCK 0x1fb9a => Self::Triangles(Triangle::UPPER | Triangle::LOWER), // [🮛] LEFT AND RIGHT TRIANGULAR HALF BLOCK @@ -4639,11 +4814,11 @@ impl GlyphCache { fill_rect(&mut buffer, 0..width, scale(top)..scale(bottom)); } Block::Custom(x0, x1, y0, y1) => { - let left = metrics.cell_size.width as f32 * (*x0 as f32) / 8.; - let right = metrics.cell_size.width as f32 * (*x1 as f32) / 8.; - let top = metrics.cell_size.height as f32 * (*y0 as f32) / 8.; - let bottom = metrics.cell_size.height as f32 * (*y1 as f32) / 8.; - fill_rect(&mut buffer, scale(left)..scale(right), scale(top)..scale(bottom)); + let left = if *x0 != 0 {scale(metrics.cell_size.width as f32 * (*x0 as f32) / 8.)} else {0}; + let right = scale(metrics.cell_size.width as f32 * (*x1 as f32) / 8.); + let top = if *y0 != 0 {scale(metrics.cell_size.height as f32 * (*y0 as f32) / 8.)} else {0}; + let bottom = scale(metrics.cell_size.height as f32 * (*y1 as f32) / 8.); + fill_rect(&mut buffer, left..right, top..bottom); } } } @@ -4938,5 +5113,5 @@ fn fill_rect(buffer: &mut Image, x: Range, y: Range) { } fn scale(f: f32) -> usize { - f.ceil().max(1.) as usize + f.round().max(1.) as usize } From 5f55624468767dea6b0fce1a1e20aff275889821 Mon Sep 17 00:00:00 2001 From: stribor14 Date: Sat, 16 Mar 2024 10:05:52 +0100 Subject: [PATCH 065/140] Cell diagonals --- wezterm-gui/src/customglyph.rs | 146 +++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) diff --git a/wezterm-gui/src/customglyph.rs b/wezterm-gui/src/customglyph.rs index e824fc9b9..fb08b734b 100644 --- a/wezterm-gui/src/customglyph.rs +++ b/wezterm-gui/src/customglyph.rs @@ -50,6 +50,15 @@ bitflags::bitflags! { } } +bitflags::bitflags! { + pub struct CellDiag: u8{ + const UPPER_LEFT = 1<<1; + const UPPER_RIGHT = 1<<2; + const LOWER_LEFT = 1<<3; + const LOWER_RIGHT = 1<<4; + } +} + #[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)] pub enum BlockAlpha { /// 100% @@ -173,6 +182,8 @@ pub enum BlockKey { Sextants(Sextant), /// A combination of triangles Triangles(Triangle), + /// A combination of small diagonal lines + CellDiags(CellDiag), /// A braille dot pattern Braille(u8), @@ -4393,6 +4404,59 @@ impl BlockKey { intensity: BlockAlpha::Medium, style: PolyStyle::Fill, }]), + // [🮠] BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT + 0x1fba0 => Self::CellDiags(CellDiag::UPPER_LEFT), + // [🮡] BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT + 0x1fba1 => Self::CellDiags(CellDiag::UPPER_RIGHT), + // [🮢] BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO LOWER CENTRE + 0x1fba2 => Self::CellDiags(CellDiag::LOWER_LEFT), + // [🮣] BOX DRAWINGS LIGHT DIAGONAL MIDDLE RIGHT TO LOWER CENTRE + 0x1fba3 => Self::CellDiags(CellDiag::LOWER_RIGHT), + // [🮤] BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT TO LOWER CENTRE + 0x1fba4 => Self::CellDiags(CellDiag::UPPER_LEFT | CellDiag::LOWER_LEFT), + // [🮥] BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT TO LOWER CENTRE + 0x1fba5 => Self::CellDiags(CellDiag::UPPER_RIGHT | CellDiag::LOWER_RIGHT), + // [🮦] BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO LOWER CENTRE TO MIDDLE RIGHT + 0x1fba6 => Self::CellDiags(CellDiag::LOWER_LEFT | CellDiag::LOWER_RIGHT), + // [🮧] BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO UPPER CENTRE TO MIDDLE RIGHT + 0x1fba7 => Self::CellDiags(CellDiag::UPPER_LEFT | CellDiag::UPPER_RIGHT), + // [🮨] BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT AND MIDDLE RIGHT TO LOWER CENTRE + 0x1fba8 => Self::CellDiags(CellDiag::UPPER_LEFT | CellDiag::LOWER_RIGHT), + // [🮩] BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT AND MIDDLE LEFT TO LOWER CENTRE + 0x1fba9 => Self::CellDiags(CellDiag::UPPER_RIGHT | CellDiag::LOWER_LEFT), + // [🮪] BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT TO LOWER CENTRE TO MIDDLE LEFT + 0x1fbaa => Self::CellDiags(CellDiag::UPPER_RIGHT | CellDiag::LOWER_LEFT | CellDiag::LOWER_RIGHT), + // [🮫] BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT TO LOWER CENTRE TO MIDDLE RIGHT + 0x1fbab => Self::CellDiags(CellDiag::UPPER_LEFT | CellDiag::LOWER_LEFT | CellDiag::LOWER_RIGHT), + // [🮬] BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO UPPER CENTRE TO MIDDLE RIGHT TO LOWER CENTRE + 0x1fbac => Self::CellDiags(CellDiag::UPPER_LEFT | CellDiag::UPPER_RIGHT | CellDiag::LOWER_RIGHT), + // [🮭] BOX DRAWINGS LIGHT DIAGONAL MIDDLE RIGHT TO UPPER CENTRE TO MIDDLE LEFT TO LOWER CENTRE + 0x1fbad => Self::CellDiags(CellDiag::UPPER_LEFT | CellDiag::UPPER_RIGHT | CellDiag::LOWER_LEFT), + // [🮮] BOX DRAWINGS LIGHT DIAGONAL DIAMOND + 0x1fbae => Self::CellDiags(CellDiag::UPPER_LEFT | CellDiag::UPPER_RIGHT | CellDiag::LOWER_LEFT | CellDiag::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 // ⠀ ⠁ ⠂ ⠃ ⠄ ⠅ ⠆ ⠇ ⠈ ⠉ ⠊ ⠋ ⠌ ⠍ ⠎ ⠏ @@ -4999,6 +5063,88 @@ impl GlyphCache { ); } } + BlockKey::CellDiags(diags) => { + if diags.contains(CellDiag::UPPER_LEFT) { + self.draw_polys( + &metrics, + &[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Frac(1, 2)), + PolyCommand::LineTo(BlockCoord::Frac(1, 2), BlockCoord::Zero), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Outline, + }], + &mut buffer, + if config::configuration().anti_alias_custom_block_glyphs { + PolyAA::AntiAlias + } else { + PolyAA::MoarPixels + }, + ); + } + if diags.contains(CellDiag::UPPER_RIGHT) { + self.draw_polys( + &metrics, + &[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::One, BlockCoord::Frac(1, 2)), + PolyCommand::LineTo(BlockCoord::Frac(1, 2), BlockCoord::Zero), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Outline, + }], + &mut buffer, + if config::configuration().anti_alias_custom_block_glyphs { + PolyAA::AntiAlias + } else { + PolyAA::MoarPixels + }, + ); + } + if diags.contains(CellDiag::LOWER_LEFT) { + self.draw_polys( + &metrics, + &[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Frac(1, 2)), + PolyCommand::LineTo(BlockCoord::Frac(1, 2), BlockCoord::One), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Outline, + }], + &mut buffer, + if config::configuration().anti_alias_custom_block_glyphs { + PolyAA::AntiAlias + } else { + PolyAA::MoarPixels + }, + ); + } + if diags.contains(CellDiag::LOWER_RIGHT) { + self.draw_polys( + &metrics, + &[Poly { + path: &[ + PolyCommand::MoveTo(BlockCoord::One, BlockCoord::Frac(1, 2)), + PolyCommand::LineTo(BlockCoord::Frac(1, 2), BlockCoord::One), + PolyCommand::Close, + ], + intensity: BlockAlpha::Full, + style: PolyStyle::Outline, + }], + &mut buffer, + if config::configuration().anti_alias_custom_block_glyphs { + PolyAA::AntiAlias + } else { + PolyAA::MoarPixels + }, + ); + } + } BlockKey::Braille(dots_pattern) => { // `dots_pattern` is a byte whose bits corresponds to dots // on a 2 by 4 dots-grid. From 1dd5d6deac760a4542a3212d34f4e3c8e2e0f910 Mon Sep 17 00:00:00 2001 From: stribor14 Date: Tue, 26 Mar 2024 11:56:12 +0100 Subject: [PATCH 066/140] Refactoring custom glyph drawing --- wezterm-gui/src/customglyph.rs | 1140 +++++++++++--------------------- 1 file changed, 373 insertions(+), 767 deletions(-) diff --git a/wezterm-gui/src/customglyph.rs b/wezterm-gui/src/customglyph.rs index fb08b734b..a889a318b 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,37 +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; - } -} - -bitflags::bitflags! { + // ╭────╮ + // │╲U ╱│ + // │ ╲╱R│ + // │L╱╲ │ + // │╱ D╲│ + // ╰────╯ pub struct Triangle: u8{ const UPPER = 1<<1; - const LOWER = 1<<2; - const LEFT = 1<<3; - const RIGHT = 1<<4; - } -} - -bitflags::bitflags! { - pub struct CellDiag: u8{ - const UPPER_LEFT = 1<<1; - const UPPER_RIGHT = 1<<2; - const LOWER_LEFT = 1<<3; - const LOWER_RIGHT = 1<<4; + const RIGHT = 1<<2; + const LOWER = 1<<3; + const LEFT = 1<<4; } } @@ -150,40 +138,59 @@ impl BlockCoord { #[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)] 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 - Vertical(u8, u8), + VerticalBlock(u8, u8), /// Number of 1/8ths: y0, y1 - Horizontal(u8, u8), - /// Number of 1/8ths: x0, x1, y0, y1 - Custom(u8, u8, u8, u8), + 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 block rectangles Blocks(&'static [Block]), - - /// Full block with alpha level - Full(BlockAlpha), - /// A combination of quadrants - Quadrants(Quadrant), - /// A combination of sextants - Sextants(Sextant), - /// A combination of triangles - Triangles(Triangle), - /// A combination of small diagonal lines - CellDiags(CellDiag), + /// List of triangles + Triangles(Triangle, BlockAlpha), + /// A combination of small diagonal lines + CellDiagonals(CellDiagonal), /// A braille dot pattern Braille(u8), @@ -265,6 +272,7 @@ impl PolyCommand { #[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)] pub enum PolyStyle { Fill, + OutlineAlpha, OutlineThin, // A line with the thickness as underlines Outline, @@ -279,14 +287,17 @@ 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); } } @@ -3231,215 +3242,189 @@ impl BlockKey { ]), // [▀] UPPER HALF BLOCK - 0x2580 => Self::Blocks(&[Block::Upper(4)]), + 0x2580 => Self::Blocks(&[Block::UpperBlock(4)]), // [▁] LOWER 1 EIGHTH BLOCK - 0x2581 => Self::Blocks(&[Block::Lower(1)]), + 0x2581 => Self::Blocks(&[Block::LowerBlock(1)]), // [▂] LOWER 2 EIGHTHS BLOCK - 0x2582 => Self::Blocks(&[Block::Lower(2)]), + 0x2582 => Self::Blocks(&[Block::LowerBlock(2)]), // [▃] LOWER 3 EIGHTHS BLOCK - 0x2583 => Self::Blocks(&[Block::Lower(3)]), + 0x2583 => Self::Blocks(&[Block::LowerBlock(3)]), // [▄] LOWER 4 EIGHTHS BLOCK - 0x2584 => Self::Blocks(&[Block::Lower(4)]), + 0x2584 => Self::Blocks(&[Block::LowerBlock(4)]), // [▅] LOWER 5 EIGHTHS BLOCK - 0x2585 => Self::Blocks(&[Block::Lower(5)]), + 0x2585 => Self::Blocks(&[Block::LowerBlock(5)]), // [▆] LOWER 6 EIGHTHS BLOCK - 0x2586 => Self::Blocks(&[Block::Lower(6)]), + 0x2586 => Self::Blocks(&[Block::LowerBlock(6)]), // [▇] LOWER 7 EIGHTHS BLOCK - 0x2587 => Self::Blocks(&[Block::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::Blocks(&[Block::Left(7)]), + 0x2589 => Self::Blocks(&[Block::LeftBlock(7)]), // [▊] LEFT 6 EIGHTHS BLOCK - 0x258a => Self::Blocks(&[Block::Left(6)]), + 0x258a => Self::Blocks(&[Block::LeftBlock(6)]), // [▋] LEFT 5 EIGHTHS BLOCK - 0x258b => Self::Blocks(&[Block::Left(5)]), + 0x258b => Self::Blocks(&[Block::LeftBlock(5)]), // [▌] LEFT 4 EIGHTHS BLOCK - 0x258c => Self::Blocks(&[Block::Left(4)]), + 0x258c => Self::Blocks(&[Block::LeftBlock(4)]), // [▍] LEFT 3 EIGHTHS BLOCK - 0x258d => Self::Blocks(&[Block::Left(3)]), + 0x258d => Self::Blocks(&[Block::LeftBlock(3)]), // [▎] LEFT 2 EIGHTHS BLOCK - 0x258e => Self::Blocks(&[Block::Left(2)]), + 0x258e => Self::Blocks(&[Block::LeftBlock(2)]), // [▏] LEFT 1 EIGHTHS BLOCK - 0x258f => Self::Blocks(&[Block::Left(1)]), + 0x258f => Self::Blocks(&[Block::LeftBlock(1)]), // [▐] RIGHT HALF BLOCK - 0x2590 => Self::Blocks(&[Block::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::Blocks(&[Block::Upper(1)]), + 0x2594 => Self::Blocks(&[Block::UpperBlock(1)]), // [▕] RIGHT ONE EIGHTH BLOCK - 0x2595 => Self::Blocks(&[Block::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) - } + 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: &[ @@ -3957,256 +3942,125 @@ impl BlockKey { style: PolyStyle::Fill, }]), // [🭨] UPPER AND RIGHT AND LOWER TRIANGULAR THREE QUARTERS BLOCK - 0x1fb68 => Self::Triangles(Triangle::UPPER | Triangle::RIGHT | Triangle::LOWER), + 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), + 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), + 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), + 0x1fb6b => Self::Triangles(Triangle::LEFT | Triangle::UPPER | Triangle::RIGHT, BlockAlpha::Full), // [🭬] LEFT TRIANGULAR ONE QUARTER BLOCK - 0x1fb6c => Self::Triangles(Triangle::LEFT), + 0x1fb6c => Self::Triangles(Triangle::LEFT, BlockAlpha::Full), // [🭭] UPPER TRIANGULAR ONE QUARTER BLOCK - 0x1fb6d => Self::Triangles(Triangle::UPPER), + 0x1fb6d => Self::Triangles(Triangle::UPPER, BlockAlpha::Full), // [🭮] RIGHT TRIANGULAR ONE QUARTER BLOCK - 0x1fb6e => Self::Triangles(Triangle::RIGHT), + 0x1fb6e => Self::Triangles(Triangle::RIGHT, BlockAlpha::Full), // [🭯] LOWER TRIANGULAR ONE QUARTER BLOCK - 0x1fb6f => Self::Triangles(Triangle::LOWER), + 0x1fb6f => Self::Triangles(Triangle::LOWER, BlockAlpha::Full), // [🭰] VERTICAL ONE EIGHTH BLOCK-2 - 0x1fb70 => Self::Blocks(&[Block::Vertical(1, 2)]), + 0x1fb70 => Self::Blocks(&[Block::VerticalBlock(1, 2)]), // [🭱] VERTICAL ONE EIGHTH BLOCK-3 - 0x1fb71 => Self::Blocks(&[Block::Vertical(2, 3)]), + 0x1fb71 => Self::Blocks(&[Block::VerticalBlock(2, 3)]), // [🭲] VERTICAL ONE EIGHTH BLOCK-4 - 0x1fb72 => Self::Blocks(&[Block::Vertical(3, 4)]), + 0x1fb72 => Self::Blocks(&[Block::VerticalBlock(3, 4)]), // [🭳] VERTICAL ONE EIGHTH BLOCK-5 - 0x1fb73 => Self::Blocks(&[Block::Vertical(4, 5)]), + 0x1fb73 => Self::Blocks(&[Block::VerticalBlock(4, 5)]), // [🭴] VERTICAL ONE EIGHTH BLOCK-6 - 0x1fb74 => Self::Blocks(&[Block::Vertical(5, 6)]), + 0x1fb74 => Self::Blocks(&[Block::VerticalBlock(5, 6)]), // [🭵] VERTICAL ONE EIGHTH BLOCK-7 - 0x1fb75 => Self::Blocks(&[Block::Vertical(6, 7)]), + 0x1fb75 => Self::Blocks(&[Block::VerticalBlock(6, 7)]), // [🭶] HORIZONTAL ONE EIGHTH BLOCK-2 - 0x1fb76 => Self::Blocks(&[Block::Horizontal(1, 2)]), + 0x1fb76 => Self::Blocks(&[Block::HorizontalBlock(1, 2)]), // [🭷] HORIZONTAL ONE EIGHTH BLOCK-3 - 0x1fb77 => Self::Blocks(&[Block::Horizontal(2, 3)]), + 0x1fb77 => Self::Blocks(&[Block::HorizontalBlock(2, 3)]), // [🭸] HORIZONTAL ONE EIGHTH BLOCK-4 - 0x1fb78 => Self::Blocks(&[Block::Horizontal(3, 4)]), + 0x1fb78 => Self::Blocks(&[Block::HorizontalBlock(3, 4)]), // [🭹] HORIZONTAL ONE EIGHTH BLOCK-5 - 0x1fb79 => Self::Blocks(&[Block::Horizontal(4, 5)]), + 0x1fb79 => Self::Blocks(&[Block::HorizontalBlock(4, 5)]), // [🭺] HORIZONTAL ONE EIGHTH BLOCK-6 - 0x1fb7a => Self::Blocks(&[Block::Horizontal(5, 6)]), + 0x1fb7a => Self::Blocks(&[Block::HorizontalBlock(5, 6)]), // [🭻] HORIZONTAL ONE EIGHTH BLOCK-7 - 0x1fb7b => Self::Blocks(&[Block::Horizontal(6, 7)]), + 0x1fb7b => Self::Blocks(&[Block::HorizontalBlock(6, 7)]), // [🭼] Left and lower one eighth block - 0x1fb7c => Self::Blocks(&[Block::Left(1), Block::Lower(1)]), + 0x1fb7c => Self::Blocks(&[Block::LeftBlock(1), Block::LowerBlock(1)]), // [🭽] Left and upper one eighth block - 0x1fb7d => Self::Blocks(&[Block::Left(1), Block::Upper(1)]), + 0x1fb7d => Self::Blocks(&[Block::LeftBlock(1), Block::UpperBlock(1)]), // [🭾] Right and upper one eighth block - 0x1fb7e => Self::Blocks(&[Block::Right(1), Block::Upper(1)]), + 0x1fb7e => Self::Blocks(&[Block::RightBlock(1), Block::UpperBlock(1)]), // [🭿] Right and lower one eighth block - 0x1fb7f => Self::Blocks(&[Block::Right(1), Block::Lower(1)]), + 0x1fb7f => Self::Blocks(&[Block::RightBlock(1), Block::LowerBlock(1)]), // [🮀] UPPER AND LOWER ONE EIGHTH BLOCK - 0x1fb80 => Self::Blocks(&[Block::Upper(1), Block::Lower(1)]), + 0x1fb80 => Self::Blocks(&[Block::UpperBlock(1), Block::LowerBlock(1)]), // [🮁] HORIZONTAL ONE EIGHTH BLOCK-1358 - 0x1fb81 => Self::Blocks(&[Block::Upper(1), Block::Horizontal(2, 3), Block::Horizontal(4, 5), Block::Lower(1)]), + 0x1fb81 => Self::Blocks(&[Block::UpperBlock(1), Block::HorizontalBlock(2, 3), Block::HorizontalBlock(4, 5), Block::LowerBlock(1)]), // [🮂] Upper One Quarter Block - 0x1fb82 => Self::Blocks(&[Block::Upper(2)]), + 0x1fb82 => Self::Blocks(&[Block::UpperBlock(2)]), // [🮃] Upper three eighths block - 0x1fb83 => Self::Blocks(&[Block::Upper(3)]), + 0x1fb83 => Self::Blocks(&[Block::UpperBlock(3)]), // [🮄] Upper five eighths block - 0x1fb84 => Self::Blocks(&[Block::Upper(5)]), + 0x1fb84 => Self::Blocks(&[Block::UpperBlock(5)]), // [🮅] Upper three quarters block - 0x1fb85 => Self::Blocks(&[Block::Upper(6)]), + 0x1fb85 => Self::Blocks(&[Block::UpperBlock(6)]), // [🮆] Upper seven eighths block - 0x1fb86 => Self::Blocks(&[Block::Upper(7)]), + 0x1fb86 => Self::Blocks(&[Block::UpperBlock(7)]), // [🮇] Right One Quarter Block - 0x1fb87 => Self::Blocks(&[Block::Right(2)]), + 0x1fb87 => Self::Blocks(&[Block::RightBlock(2)]), // [🮈] Right three eighths block - 0x1fb88 => Self::Blocks(&[Block::Right(3)]), + 0x1fb88 => Self::Blocks(&[Block::RightBlock(3)]), // [🮉] Right five eighths block - 0x1fb89 => Self::Blocks(&[Block::Right(5)]), + 0x1fb89 => Self::Blocks(&[Block::RightBlock(5)]), // [🮊] Right three quarters block - 0x1fb8a => Self::Blocks(&[Block::Right(6)]), + 0x1fb8a => Self::Blocks(&[Block::RightBlock(6)]), // [🮋] Right seven eighths block - 0x1fb8b => Self::Blocks(&[Block::Right(7)]), + 0x1fb8b => Self::Blocks(&[Block::RightBlock(7)]), // [🮌] LEFT HALF MEDIUM SHADE - 0x1fb8c => Self::Poly(&[Poly { - path: &[ - PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), - PolyCommand::LineTo(BlockCoord::Frac(1, 2), BlockCoord::Zero), - PolyCommand::LineTo(BlockCoord::Frac(1, 2), BlockCoord::One), - PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), - PolyCommand::Close, - ], - intensity: BlockAlpha::Medium, - style: PolyStyle::Fill, - }]), + 0x1fb8c => Self::Blocks(&[Block::Custom(0, 4, 0, 8, BlockAlpha::Medium)]), // [🮍] RIGHT HALF MEDIUM SHADE - 0x1fb8d => 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::Frac(1, 2), BlockCoord::One), - PolyCommand::Close, - ], - intensity: BlockAlpha::Medium, - style: PolyStyle::Fill, - }]), + 0x1fb8d => Self::Blocks(&[Block::Custom(4, 8, 0, 8, BlockAlpha::Medium)]), // [🮎] UPPER HALF MEDIUM SHADE - 0x1fb8e => Self::Poly(&[Poly { - path: &[ - PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), - PolyCommand::LineTo(BlockCoord::One, BlockCoord::Zero), - PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(1, 2)), - PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::Frac(1, 2)), - PolyCommand::Close, - ], - intensity: BlockAlpha::Medium, - style: PolyStyle::Fill, - }]), + 0x1fb8e => Self::Blocks(&[Block::Custom(0, 8, 0, 4, BlockAlpha::Medium)]), // [🮏] LOWER HALF MEDIUM SHADE - 0x1fb8f => Self::Poly(&[Poly { - path: &[ - PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Frac(1, 2)), - PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(1, 2)), - PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), - PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), - PolyCommand::Close, - ], - intensity: BlockAlpha::Medium, - style: PolyStyle::Fill, - }]), + 0x1fb8f => Self::Blocks(&[Block::Custom(0, 8, 4, 8, BlockAlpha::Medium)]), // [🮐] INVERSE MEDIUM SHADE - 0x1fb90 => Self::Full(BlockAlpha::Medium), + 0x1fb90 => Self::Blocks(&[Block::Custom(0, 8, 0, 8, BlockAlpha::Medium)]), // [🮑] UPPER HALF BLOCK AND LOWER HALF INVERSE MEDIUM SHADE - 0x1fb91 => Self::Poly(&[ - Poly { - path: &[ - PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), - PolyCommand::LineTo(BlockCoord::One, BlockCoord::Zero), - PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(1, 2)), - PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::Frac(1, 2)), - PolyCommand::Close, - ], - intensity: BlockAlpha::Full, - style: PolyStyle::Fill, - }, - Poly { - path: &[ - PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Frac(1, 2)), - PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(1, 2)), - PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), - PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), - PolyCommand::Close, - ], - intensity: BlockAlpha::Medium, - style: PolyStyle::Fill, - } - ]), + 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::Poly(&[ - Poly { - path: &[ - PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), - PolyCommand::LineTo(BlockCoord::One, BlockCoord::Zero), - PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(1, 2)), - PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::Frac(1, 2)), - PolyCommand::Close, - ], - intensity: BlockAlpha::Medium, - style: PolyStyle::Fill, - }, - Poly { - path: &[ - PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Frac(1, 2)), - PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(1, 2)), - PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), - PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), - PolyCommand::Close, - ], - intensity: BlockAlpha::Full, - style: PolyStyle::Fill, - } - ]), - // INFO: not official! - // [ ] LEFT HALF BLOCK AND RIGHT HALF INVERSE MEDIUM SHADE - 0x1fb93 => Self::Poly(&[ - Poly { - path: &[ - PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), - PolyCommand::LineTo(BlockCoord::Frac(1, 2), BlockCoord::Zero), - PolyCommand::LineTo(BlockCoord::Frac(1, 2), BlockCoord::One), - PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), - PolyCommand::Close, - ], - intensity: BlockAlpha::Full, - style: PolyStyle::Fill, - }, - 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::Frac(1, 2), BlockCoord::One), - PolyCommand::Close, - ], - intensity: BlockAlpha::Medium, - style: PolyStyle::Fill, - } - ]), + 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::Poly(&[ - Poly { - path: &[ - PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), - PolyCommand::LineTo(BlockCoord::Frac(1, 2), BlockCoord::Zero), - PolyCommand::LineTo(BlockCoord::Frac(1, 2), BlockCoord::One), - PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), - PolyCommand::Close, - ], - intensity: BlockAlpha::Medium, - style: PolyStyle::Fill, - }, - 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::Frac(1, 2), BlockCoord::One), - PolyCommand::Close, - ], - intensity: BlockAlpha::Full, - style: PolyStyle::Fill, - } - ]), + 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), - Block::Custom(0, 2, 4, 6), - Block::Custom(2, 4, 2, 4), - Block::Custom(2, 4, 6, 8), - Block::Custom(4, 6, 0 ,2), - Block::Custom(4, 6, 4, 6), - Block::Custom(6, 8, 2, 4), - Block::Custom(6, 8, 6, 8), + 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), - Block::Custom(0, 2, 6, 8), - Block::Custom(2, 4, 0 ,2), - Block::Custom(2, 4, 4, 6), - Block::Custom(4, 6, 2 ,4), - Block::Custom(4, 6, 6, 8), - Block::Custom(6, 8, 0 ,2), - Block::Custom(6, 8, 4, 6), + 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::Horizontal(2, 4), - Block::Horizontal(6, 8), + 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: &[ @@ -4215,7 +4069,7 @@ impl BlockKey { PolyCommand::Close, ], intensity: BlockAlpha::Full, - style: PolyStyle::OutlineHeavy, + style: PolyStyle::OutlineThin, }, Poly { path: &[ @@ -4224,7 +4078,7 @@ impl BlockKey { PolyCommand::Close, ], intensity: BlockAlpha::Full, - style: PolyStyle::OutlineHeavy, + style: PolyStyle::OutlineThin, }, Poly { path: &[ @@ -4233,7 +4087,7 @@ impl BlockKey { PolyCommand::Close, ], intensity: BlockAlpha::Full, - style: PolyStyle::OutlineHeavy, + style: PolyStyle::OutlineThin, }, Poly { path: &[ @@ -4242,7 +4096,7 @@ impl BlockKey { PolyCommand::Close, ], intensity: BlockAlpha::Full, - style: PolyStyle::OutlineHeavy, + style: PolyStyle::OutlineThin, }, Poly { path: &[ @@ -4251,7 +4105,7 @@ impl BlockKey { PolyCommand::Close, ], intensity: BlockAlpha::Full, - style: PolyStyle::OutlineHeavy, + style: PolyStyle::OutlineThin, }, Poly { path: &[ @@ -4260,7 +4114,7 @@ impl BlockKey { PolyCommand::Close, ], intensity: BlockAlpha::Full, - style: PolyStyle::OutlineHeavy, + style: PolyStyle::OutlineThin, }, Poly { path: &[ @@ -4269,7 +4123,7 @@ impl BlockKey { PolyCommand::Close, ], intensity: BlockAlpha::Full, - style: PolyStyle::OutlineHeavy, + style: PolyStyle::OutlineThin, }, Poly { path: &[ @@ -4278,10 +4132,11 @@ impl BlockKey { PolyCommand::Close, ], intensity: BlockAlpha::Full, - style: PolyStyle::OutlineHeavy, + 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: &[ @@ -4290,7 +4145,7 @@ impl BlockKey { PolyCommand::Close, ], intensity: BlockAlpha::Full, - style: PolyStyle::OutlineHeavy, + style: PolyStyle::OutlineThin, }, Poly { path: &[ @@ -4299,7 +4154,7 @@ impl BlockKey { PolyCommand::Close, ], intensity: BlockAlpha::Full, - style: PolyStyle::OutlineHeavy, + style: PolyStyle::OutlineThin, }, Poly { path: &[ @@ -4308,7 +4163,7 @@ impl BlockKey { PolyCommand::Close, ], intensity: BlockAlpha::Full, - style: PolyStyle::OutlineHeavy, + style: PolyStyle::OutlineThin, }, Poly { path: &[ @@ -4317,7 +4172,7 @@ impl BlockKey { PolyCommand::Close, ], intensity: BlockAlpha::Full, - style: PolyStyle::OutlineHeavy, + style: PolyStyle::OutlineThin, }, Poly { path: &[ @@ -4326,7 +4181,7 @@ impl BlockKey { PolyCommand::Close, ], intensity: BlockAlpha::Full, - style: PolyStyle::OutlineHeavy, + style: PolyStyle::OutlineThin, }, Poly { path: &[ @@ -4335,7 +4190,7 @@ impl BlockKey { PolyCommand::Close, ], intensity: BlockAlpha::Full, - style: PolyStyle::OutlineHeavy, + style: PolyStyle::OutlineThin, }, Poly { path: &[ @@ -4344,7 +4199,7 @@ impl BlockKey { PolyCommand::Close, ], intensity: BlockAlpha::Full, - style: PolyStyle::OutlineHeavy, + style: PolyStyle::OutlineThin, }, Poly { path: &[ @@ -4353,87 +4208,51 @@ impl BlockKey { PolyCommand::Close, ], intensity: BlockAlpha::Full, - style: PolyStyle::OutlineHeavy, + style: PolyStyle::OutlineThin, }, ]), // [🮚] UPPER AND LOWER TRIANGULAR HALF BLOCK - 0x1fb9a => Self::Triangles(Triangle::UPPER | Triangle::LOWER), + 0x1fb9a => Self::Triangles(Triangle::UPPER | Triangle::LOWER, BlockAlpha::Full), // [🮛] LEFT AND RIGHT TRIANGULAR HALF BLOCK - 0x1fb9b => Self::Triangles(Triangle::LEFT | Triangle::RIGHT), + 0x1fb9b => Self::Triangles(Triangle::LEFT | Triangle::RIGHT, BlockAlpha::Full), // [🮜] UPPER UPPER LEFT TRIANGULAR MEDIUM SHADE - 0x1fb9c => Self::Poly(&[Poly { - path: &[ - PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), - PolyCommand::LineTo(BlockCoord::One, BlockCoord::Zero), - PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), - PolyCommand::Close, - ], - intensity: BlockAlpha::Medium, - style: PolyStyle::Fill, - }]), + 0x1fb9c => Self::Triangles(Triangle::LEFT | Triangle::UPPER, BlockAlpha::Medium), // [🮝] UPPER RIGHT TRIANGULAR MEDIUM SHADE - 0x1fb9d => 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::Medium, - style: PolyStyle::Fill, - }]), + 0x1fb9d => Self::Triangles(Triangle::RIGHT | Triangle::UPPER, BlockAlpha::Medium), // [🮞] LOWER RIGHT TRIANGULAR MEDIUM SHADE - 0x1fb9e => Self::Poly(&[Poly { - path: &[ - PolyCommand::MoveTo(BlockCoord::One, BlockCoord::Zero), - PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), - PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), - PolyCommand::Close, - ], - intensity: BlockAlpha::Medium, - style: PolyStyle::Fill, - }]), + 0x1fb9e => Self::Triangles(Triangle::RIGHT | Triangle::LOWER, BlockAlpha::Medium), // [🮟] LOWER LEFT TRIANGULAR MEDIUM SHADE - 0x1fb9f => 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::Medium, - style: PolyStyle::Fill, - }]), + 0x1fb9f => Self::Triangles(Triangle::LEFT | Triangle::LOWER, BlockAlpha::Medium), // [🮠] BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT - 0x1fba0 => Self::CellDiags(CellDiag::UPPER_LEFT), + 0x1fba0 => Self::CellDiagonals(CellDiagonal::UPPER_LEFT), // [🮡] BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT - 0x1fba1 => Self::CellDiags(CellDiag::UPPER_RIGHT), + 0x1fba1 => Self::CellDiagonals(CellDiagonal::UPPER_RIGHT), // [🮢] BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO LOWER CENTRE - 0x1fba2 => Self::CellDiags(CellDiag::LOWER_LEFT), + 0x1fba2 => Self::CellDiagonals(CellDiagonal::LOWER_LEFT), // [🮣] BOX DRAWINGS LIGHT DIAGONAL MIDDLE RIGHT TO LOWER CENTRE - 0x1fba3 => Self::CellDiags(CellDiag::LOWER_RIGHT), + 0x1fba3 => Self::CellDiagonals(CellDiagonal::LOWER_RIGHT), // [🮤] BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT TO LOWER CENTRE - 0x1fba4 => Self::CellDiags(CellDiag::UPPER_LEFT | CellDiag::LOWER_LEFT), + 0x1fba4 => Self::CellDiagonals(CellDiagonal::UPPER_LEFT | CellDiagonal::LOWER_LEFT), // [🮥] BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT TO LOWER CENTRE - 0x1fba5 => Self::CellDiags(CellDiag::UPPER_RIGHT | CellDiag::LOWER_RIGHT), + 0x1fba5 => Self::CellDiagonals(CellDiagonal::UPPER_RIGHT | CellDiagonal::LOWER_RIGHT), // [🮦] BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO LOWER CENTRE TO MIDDLE RIGHT - 0x1fba6 => Self::CellDiags(CellDiag::LOWER_LEFT | CellDiag::LOWER_RIGHT), + 0x1fba6 => Self::CellDiagonals(CellDiagonal::LOWER_LEFT | CellDiagonal::LOWER_RIGHT), // [🮧] BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO UPPER CENTRE TO MIDDLE RIGHT - 0x1fba7 => Self::CellDiags(CellDiag::UPPER_LEFT | CellDiag::UPPER_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::CellDiags(CellDiag::UPPER_LEFT | CellDiag::LOWER_RIGHT), + 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::CellDiags(CellDiag::UPPER_RIGHT | CellDiag::LOWER_LEFT), + 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::CellDiags(CellDiag::UPPER_RIGHT | CellDiag::LOWER_LEFT | CellDiag::LOWER_RIGHT), + 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::CellDiags(CellDiag::UPPER_LEFT | CellDiag::LOWER_LEFT | CellDiag::LOWER_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::CellDiags(CellDiag::UPPER_LEFT | CellDiag::UPPER_RIGHT | CellDiag::LOWER_RIGHT), + 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::CellDiags(CellDiag::UPPER_LEFT | CellDiag::UPPER_RIGHT | CellDiag::LOWER_LEFT), + 0x1fbad => Self::CellDiagonals(CellDiagonal::UPPER_LEFT | CellDiagonal::UPPER_RIGHT | CellDiagonal::LOWER_LEFT), // [🮮] BOX DRAWINGS LIGHT DIAGONAL DIAMOND - 0x1fbae => Self::CellDiags(CellDiag::UPPER_LEFT | CellDiag::UPPER_RIGHT | CellDiag::LOWER_LEFT | CellDiag::LOWER_RIGHT), + 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 { @@ -4579,16 +4398,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: &[ @@ -4599,16 +4409,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: &[ @@ -4639,16 +4440,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: &[ @@ -4841,309 +4633,128 @@ impl GlyphCache { match key.block { 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::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)); + 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); } - Block::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); } - Block::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); } - Block::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::Vertical(x0, x1) => { - let left = metrics.cell_size.width as f32 * (*x0 as f32) / 8.; - let right = metrics.cell_size.width as f32 * (*x1 as f32) / 8.; - let height = metrics.cell_size.height as usize; - fill_rect(&mut buffer, scale(left)..scale(right), 0..height); + Block::RightBlock(num) => { + let left = ((8 - num) as f32) * x_eighth; + fill_rect(&mut buffer, left..width,0.0..height, BlockAlpha::Full); } - Block::Horizontal(y0, y1) => { - let top = metrics.cell_size.height as f32 * (*y0 as f32) / 8.; - let bottom = metrics.cell_size.height as f32 * (*y1 as f32) / 8.; - let width = metrics.cell_size.width as usize; - fill_rect(&mut buffer, 0..width, scale(top)..scale(bottom)); + 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::Custom(x0, x1, y0, y1) => { - let left = if *x0 != 0 {scale(metrics.cell_size.width as f32 * (*x0 as f32) / 8.)} else {0}; - let right = scale(metrics.cell_size.width as f32 * (*x1 as f32) / 8.); - let top = if *y0 != 0 {scale(metrics.cell_size.height as f32 * (*y0 as f32) / 8.)} else {0}; - let bottom = scale(metrics.cell_size.height as f32 * (*y1 as f32) / 8.); - fill_rect(&mut buffer, left..right, top..bottom); + 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 + }, + ); + }; + + 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)} } - BlockKey::Full(alpha) => { - let alpha = alpha.to_scale(); - let fill = LinearRgba::with_components(alpha, alpha, alpha, alpha); + // Draw triangles + if triangles.contains(Triangle::UPPER) { draw(&[start!(), p0!(), p1!(), close!()], PolyStyle::Fill); } + if triangles.contains(Triangle::LOWER) { draw(&[start!(), p2!(), p3!(), close!()], PolyStyle::Fill); } + if triangles.contains(Triangle::LEFT) { draw(&[start!(), p0!(), p2!(), close!()], PolyStyle::Fill); } + 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::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 + }, + ); + }; + + macro_rules! U { () => {PolyCommand::MoveTo(BlockCoord::Frac(1, 2), BlockCoord::Zero)} } + macro_rules! D { () => {PolyCommand::MoveTo(BlockCoord::Frac(1, 2), BlockCoord::One)} } + macro_rules! L { () => {PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::Frac(1, 2))} } + macro_rules! R { () => {PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(1, 2))} } - 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)); - } - if quads.contains(Quadrant::UPPER_RIGHT) { - fill_rect(&mut buffer, scale(x_half)..width, 0..scale(y_half)); - } - if quads.contains(Quadrant::LOWER_LEFT) { - fill_rect(&mut buffer, 0..scale(x_half), scale(y_half)..height); - } - if quads.contains(Quadrant::LOWER_RIGHT) { - fill_rect(&mut buffer, scale(x_half)..width, scale(y_half)..height); - } - } - BlockKey::Triangles(triangles) => { - if triangles.contains(Triangle::UPPER) { - self.draw_polys( - &metrics, - &[Poly { - path: &[ - PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), - PolyCommand::LineTo(BlockCoord::One, BlockCoord::Zero), - PolyCommand::LineTo(BlockCoord::Frac(1 ,2), BlockCoord::Frac(1, 2)), - PolyCommand::Close, - ], - intensity: BlockAlpha::Full, - style: PolyStyle::Fill, - }], - &mut buffer, - if config::configuration().anti_alias_custom_block_glyphs { - PolyAA::AntiAlias - } else { - PolyAA::MoarPixels - }, - ); - } - if triangles.contains(Triangle::LOWER) { - self.draw_polys( - &metrics, - &[Poly { - path: &[ - PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::One), - PolyCommand::LineTo(BlockCoord::Frac(1 ,2), BlockCoord::Frac(1, 2)), - PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), - PolyCommand::Close, - ], - intensity: BlockAlpha::Full, - style: PolyStyle::Fill, - }], - &mut buffer, - if config::configuration().anti_alias_custom_block_glyphs { - PolyAA::AntiAlias - } else { - PolyAA::MoarPixels - }, - ); - } - if triangles.contains(Triangle::LEFT) { - self.draw_polys( - &metrics, - &[Poly { - path: &[ - PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), - PolyCommand::LineTo(BlockCoord::Frac(1 ,2), BlockCoord::Frac(1, 2)), - PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), - PolyCommand::Close, - ], - intensity: BlockAlpha::Full, - style: PolyStyle::Fill, - }], - &mut buffer, - if config::configuration().anti_alias_custom_block_glyphs { - PolyAA::AntiAlias - } else { - PolyAA::MoarPixels - }, - ); - } - if triangles.contains(Triangle::RIGHT) { - self.draw_polys( - &metrics, - &[Poly { - path: &[ - PolyCommand::MoveTo(BlockCoord::One, BlockCoord::Zero), - PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), - PolyCommand::LineTo(BlockCoord::Frac(1 ,2), BlockCoord::Frac(1, 2)), - PolyCommand::Close, - ], - intensity: BlockAlpha::Full, - style: PolyStyle::Fill, - }], - &mut buffer, - if config::configuration().anti_alias_custom_block_glyphs { - PolyAA::AntiAlias - } else { - PolyAA::MoarPixels - }, - ); - } - // check if multiple triangles are requested and fill anti-aliased X in the middle - if triangles.bits() & (triangles.bits() - 1) != 0 { - self.draw_polys( - &metrics, - &[Poly { - path: &[ - PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Zero), - PolyCommand::LineTo(BlockCoord::One, BlockCoord::One), - ], - intensity: BlockAlpha::Full, - style: PolyStyle::Outline, - }, - Poly { - path: &[ - PolyCommand::MoveTo(BlockCoord::One, BlockCoord::Zero), - PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), - ], - intensity: BlockAlpha::Full, - style: PolyStyle::Outline, - }], - &mut buffer, - if config::configuration().anti_alias_custom_block_glyphs { - PolyAA::AntiAlias - } else { - PolyAA::MoarPixels - }, - ) - } - } - 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; - - if s.contains(Sextant::ONE) { - fill_rect(&mut buffer, 0..scale(x_half), 0..scale(y_third)); - } - if s.contains(Sextant::TWO) { - fill_rect(&mut buffer, scale(x_half)..width, 0..scale(y_third)); - } - if s.contains(Sextant::THREE) { - fill_rect( - &mut buffer, - 0..scale(x_half), - scale(y_third)..scale(y_third * 2.), - ); - } - if s.contains(Sextant::FOUR) { - fill_rect( - &mut buffer, - scale(x_half)..width, - scale(y_third)..scale(y_third * 2.), - ); - } - if s.contains(Sextant::FIVE) { - fill_rect(&mut buffer, 0..scale(x_half), scale(y_third * 2.)..height); - } - if s.contains(Sextant::SIX) { - fill_rect( - &mut buffer, - scale(x_half)..width, - scale(y_third * 2.)..height, - ); - } - } - BlockKey::CellDiags(diags) => { - if diags.contains(CellDiag::UPPER_LEFT) { - self.draw_polys( - &metrics, - &[Poly { - path: &[ - PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Frac(1, 2)), - PolyCommand::LineTo(BlockCoord::Frac(1, 2), BlockCoord::Zero), - PolyCommand::Close, - ], - intensity: BlockAlpha::Full, - style: PolyStyle::Outline, - }], - &mut buffer, - if config::configuration().anti_alias_custom_block_glyphs { - PolyAA::AntiAlias - } else { - PolyAA::MoarPixels - }, - ); - } - if diags.contains(CellDiag::UPPER_RIGHT) { - self.draw_polys( - &metrics, - &[Poly { - path: &[ - PolyCommand::MoveTo(BlockCoord::One, BlockCoord::Frac(1, 2)), - PolyCommand::LineTo(BlockCoord::Frac(1, 2), BlockCoord::Zero), - PolyCommand::Close, - ], - intensity: BlockAlpha::Full, - style: PolyStyle::Outline, - }], - &mut buffer, - if config::configuration().anti_alias_custom_block_glyphs { - PolyAA::AntiAlias - } else { - PolyAA::MoarPixels - }, - ); - } - if diags.contains(CellDiag::LOWER_LEFT) { - self.draw_polys( - &metrics, - &[Poly { - path: &[ - PolyCommand::MoveTo(BlockCoord::Zero, BlockCoord::Frac(1, 2)), - PolyCommand::LineTo(BlockCoord::Frac(1, 2), BlockCoord::One), - PolyCommand::Close, - ], - intensity: BlockAlpha::Full, - style: PolyStyle::Outline, - }], - &mut buffer, - if config::configuration().anti_alias_custom_block_glyphs { - PolyAA::AntiAlias - } else { - PolyAA::MoarPixels - }, - ); - } - if diags.contains(CellDiag::LOWER_RIGHT) { - self.draw_polys( - &metrics, - &[Poly { - path: &[ - PolyCommand::MoveTo(BlockCoord::One, BlockCoord::Frac(1, 2)), - PolyCommand::LineTo(BlockCoord::Frac(1, 2), BlockCoord::One), - PolyCommand::Close, - ], - intensity: BlockAlpha::Full, - style: PolyStyle::Outline, - }], - &mut buffer, - if config::configuration().anti_alias_custom_block_glyphs { - PolyAA::AntiAlias - } else { - PolyAA::MoarPixels - }, - ); - } + if diagonals.contains(CellDiagonal::UPPER_LEFT) { draw(&[U!(), L!()]); } + 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) => { // `dots_pattern` is a byte whose bits corresponds to dots @@ -5231,22 +4842,21 @@ 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( @@ -5257,7 +4867,3 @@ fn fill_rect(buffer: &mut Image, x: Range, y: Range) { None, ); } - -fn scale(f: f32) -> usize { - f.round().max(1.) as usize -} From 25257c6b382ffae98907c432f04ca8af12160c9d Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Sun, 5 May 2024 13:30:42 -0700 Subject: [PATCH 067/140] rustfmt --- wezterm-gui/src/customglyph.rs | 434 ++++++++++++++++++++++++++------- 1 file changed, 341 insertions(+), 93 deletions(-) diff --git a/wezterm-gui/src/customglyph.rs b/wezterm-gui/src/customglyph.rs index a889a318b..6d35d3833 100644 --- a/wezterm-gui/src/customglyph.rs +++ b/wezterm-gui/src/customglyph.rs @@ -158,7 +158,6 @@ pub enum Block { // ├──┼──┤ // │LL│LR│ // ╰──┴──╯ - QuadrantUL, QuadrantUR, QuadrantLL, @@ -166,7 +165,7 @@ pub enum Block { /// Sextants by enum combination // ╭───┬───╮ // │ 1 │ 2 │ - // ├───┼───┤ + // ├───┼───┤ // │ 3 │ 4 │ // ├───┼───┤ // │ 5 │ 6 │ @@ -287,7 +286,10 @@ impl PolyStyle { pixmap.fill_path(path, paint, FillRule::Winding, Transform::identity(), None); } - PolyStyle::OutlineThin | PolyStyle::Outline | PolyStyle::OutlineHeavy | PolyStyle::OutlineAlpha => { + PolyStyle::OutlineThin + | PolyStyle::Outline + | PolyStyle::OutlineHeavy + | PolyStyle::OutlineAlpha => { let mut stroke = Stroke::default(); stroke.width = width; if self == PolyStyle::OutlineHeavy { @@ -3334,7 +3336,12 @@ impl BlockKey { // [🬍] BLOCK SEXTANT-234 0x1fb0d => Self::Blocks(&[Block::Sextant2, Block::Sextant3, Block::Sextant4]), // [🬎] BLOCK SEXTANT-1234 - 0x1fb0e => Self::Blocks(&[Block::Sextant1, Block::Sextant2, Block::Sextant3, Block::Sextant4]), + 0x1fb0e => Self::Blocks(&[ + Block::Sextant1, + Block::Sextant2, + Block::Sextant3, + Block::Sextant4, + ]), // [🬏] BLOCK SEXTANT-5 0x1fb0f => Self::Blocks(&[Block::Sextant5]), // [🬐] BLOCK SEXTANT-15 @@ -3348,7 +3355,12 @@ impl BlockKey { // [🬔] BLOCK SEXTANT-235 0x1fb14 => Self::Blocks(&[Block::Sextant2, Block::Sextant3, Block::Sextant5]), // [🬕] BLOCK SEXTANT-1235 - 0x1fb15 => Self::Blocks(&[Block::Sextant1, Block::Sextant2, Block::Sextant3, Block::Sextant5]), + 0x1fb15 => Self::Blocks(&[ + Block::Sextant1, + Block::Sextant2, + Block::Sextant3, + Block::Sextant5, + ]), // [🬖] BLOCK SEXTANT-45 0x1fb16 => Self::Blocks(&[Block::Sextant4, Block::Sextant5]), // [🬗] BLOCK SEXTANT-145 @@ -3356,15 +3368,36 @@ impl BlockKey { // [🬘] BLOCK SEXTANT-245 0x1fb18 => Self::Blocks(&[Block::Sextant2, Block::Sextant4, Block::Sextant5]), // [🬙] BLOCK SEXTANT-1245 - 0x1fb19 => Self::Blocks(&[Block::Sextant1, Block::Sextant2, Block::Sextant4, Block::Sextant5]), + 0x1fb19 => Self::Blocks(&[ + Block::Sextant1, + Block::Sextant2, + Block::Sextant4, + Block::Sextant5, + ]), // [🬚] BLOCK SEXTANT-345 0x1fb1a => Self::Blocks(&[Block::Sextant3, Block::Sextant4, Block::Sextant5]), // [🬛] BLOCK SEXTANT-1345 - 0x1fb1b => Self::Blocks(&[Block::Sextant1, Block::Sextant3, Block::Sextant4, Block::Sextant5]), + 0x1fb1b => Self::Blocks(&[ + Block::Sextant1, + Block::Sextant3, + Block::Sextant4, + Block::Sextant5, + ]), // [🬜] BLOCK SEXTANT-2345 - 0x1fb1c => Self::Blocks(&[Block::Sextant2, Block::Sextant3, Block::Sextant4, Block::Sextant5]), + 0x1fb1c => Self::Blocks(&[ + Block::Sextant2, + Block::Sextant3, + Block::Sextant4, + Block::Sextant5, + ]), // [🬝] BLOCK SEXTANT-12345 - 0x1fb1d => Self::Blocks(&[Block::Sextant1, Block::Sextant2, Block::Sextant3, Block::Sextant4, Block::Sextant5]), + 0x1fb1d => Self::Blocks(&[ + Block::Sextant1, + Block::Sextant2, + Block::Sextant3, + Block::Sextant4, + Block::Sextant5, + ]), // [🬞] BLOCK SEXTANT-6 0x1fb1e => Self::Blocks(&[Block::Sextant6]), // [🬟] BLOCK SEXTANT-16 @@ -3380,21 +3413,47 @@ impl BlockKey { // [🬤] BLOCK SEXTANT-236 0x1fb24 => Self::Blocks(&[Block::Sextant2, Block::Sextant3, Block::Sextant6]), // [🬥] BLOCK SEXTANT-1236 - 0x1fb25 => Self::Blocks(&[Block::Sextant1, Block::Sextant2, Block::Sextant3, Block::Sextant6]), + 0x1fb25 => Self::Blocks(&[ + Block::Sextant1, + Block::Sextant2, + Block::Sextant3, + Block::Sextant6, + ]), // [🬦] BLOCK SEXTANT-46 0x1fb26 => Self::Blocks(&[Block::Sextant4, Block::Sextant6]), // [🬧] BLOCK SEXTANT-146 0x1fb27 => Self::Blocks(&[Block::Sextant1, Block::Sextant4, Block::Sextant6]), // [🬨] BLOCK SEXTANT-1246 - 0x1fb28 => Self::Blocks(&[Block::Sextant1, Block::Sextant2, Block::Sextant4, Block::Sextant6]), + 0x1fb28 => Self::Blocks(&[ + Block::Sextant1, + Block::Sextant2, + Block::Sextant4, + Block::Sextant6, + ]), // [🬩] BLOCK SEXTANT-346 0x1fb29 => Self::Blocks(&[Block::Sextant3, Block::Sextant4, Block::Sextant6]), // [🬪] BLOCK SEXTANT-1346 - 0x1fb2a => Self::Blocks(&[Block::Sextant1, Block::Sextant3, Block::Sextant4, Block::Sextant6]), + 0x1fb2a => Self::Blocks(&[ + Block::Sextant1, + Block::Sextant3, + Block::Sextant4, + Block::Sextant6, + ]), // [🬫] BLOCK SEXTANT-2346 - 0x1fb2b => Self::Blocks(&[Block::Sextant2, Block::Sextant3, Block::Sextant4, Block::Sextant6]), + 0x1fb2b => Self::Blocks(&[ + Block::Sextant2, + Block::Sextant3, + Block::Sextant4, + Block::Sextant6, + ]), // [🬬] BLOCK SEXTANT-12346 - 0x1fb2c => Self::Blocks(&[Block::Sextant1, Block::Sextant2, Block::Sextant3, Block::Sextant4, Block::Sextant6]), + 0x1fb2c => Self::Blocks(&[ + Block::Sextant1, + Block::Sextant2, + Block::Sextant3, + Block::Sextant4, + Block::Sextant6, + ]), // [🬭] BLOCK SEXTANT-56 0x1fb2d => Self::Blocks(&[Block::Sextant5, Block::Sextant6]), // [🬮] BLOCK SEXTANT-156 @@ -3402,29 +3461,83 @@ impl BlockKey { // [🬯] BLOCK SEXTANT-256 0x1fb2f => Self::Blocks(&[Block::Sextant2, Block::Sextant5, Block::Sextant6]), // [🬰] BLOCK SEXTANT-1256 - 0x1fb30 => Self::Blocks(&[Block::Sextant1, Block::Sextant2, Block::Sextant5, Block::Sextant6]), + 0x1fb30 => Self::Blocks(&[ + Block::Sextant1, + Block::Sextant2, + Block::Sextant5, + Block::Sextant6, + ]), // [🬱] BLOCK SEXTANT-356 0x1fb31 => Self::Blocks(&[Block::Sextant3, Block::Sextant5, Block::Sextant6]), // [🬲] BLOCK SEXTANT-1356 - 0x1fb32 => Self::Blocks(&[Block::Sextant1, Block::Sextant3, Block::Sextant5, Block::Sextant6]), + 0x1fb32 => Self::Blocks(&[ + Block::Sextant1, + Block::Sextant3, + Block::Sextant5, + Block::Sextant6, + ]), // [🬳] BLOCK SEXTANT-2356 - 0x1fb33 => Self::Blocks(&[Block::Sextant2, Block::Sextant3, Block::Sextant5, Block::Sextant6]), + 0x1fb33 => Self::Blocks(&[ + Block::Sextant2, + Block::Sextant3, + Block::Sextant5, + Block::Sextant6, + ]), // [🬴] BLOCK SEXTANT-12356 - 0x1fb34 => Self::Blocks(&[Block::Sextant1, Block::Sextant2, Block::Sextant3, Block::Sextant5, Block::Sextant6]), + 0x1fb34 => Self::Blocks(&[ + Block::Sextant1, + Block::Sextant2, + Block::Sextant3, + Block::Sextant5, + Block::Sextant6, + ]), // [🬵] BLOCK SEXTANT-456 0x1fb35 => Self::Blocks(&[Block::Sextant4, Block::Sextant5, Block::Sextant6]), // [🬶] BLOCK SEXTANT-1456 - 0x1fb36 => Self::Blocks(&[Block::Sextant1, Block::Sextant4, Block::Sextant5, Block::Sextant6]), + 0x1fb36 => Self::Blocks(&[ + Block::Sextant1, + Block::Sextant4, + Block::Sextant5, + Block::Sextant6, + ]), // [🬷] BLOCK SEXTANT-2456 - 0x1fb37 => Self::Blocks(&[Block::Sextant2, Block::Sextant4, Block::Sextant5, Block::Sextant6]), + 0x1fb37 => Self::Blocks(&[ + Block::Sextant2, + Block::Sextant4, + Block::Sextant5, + Block::Sextant6, + ]), // [🬸] BLOCK SEXTANT-12456 - 0x1fb38 => Self::Blocks(&[Block::Sextant1, Block::Sextant2, Block::Sextant4, Block::Sextant5, Block::Sextant6]), + 0x1fb38 => Self::Blocks(&[ + Block::Sextant1, + Block::Sextant2, + Block::Sextant4, + Block::Sextant5, + Block::Sextant6, + ]), // [🬹] BLOCK SEXTANT-3456 - 0x1fb39 => Self::Blocks(&[Block::Sextant3, Block::Sextant4, Block::Sextant5, Block::Sextant6]), + 0x1fb39 => Self::Blocks(&[ + Block::Sextant3, + Block::Sextant4, + Block::Sextant5, + Block::Sextant6, + ]), // [🬺] BLOCK SEXTANT-13456 - 0x1fb3a => Self::Blocks(&[Block::Sextant1, Block::Sextant3, Block::Sextant4, Block::Sextant5, Block::Sextant6]), + 0x1fb3a => Self::Blocks(&[ + Block::Sextant1, + Block::Sextant3, + Block::Sextant4, + Block::Sextant5, + Block::Sextant6, + ]), // [🬻] BLOCK SEXTANT-23456 - 0x1fb3b => Self::Blocks(&[Block::Sextant2, Block::Sextant3, Block::Sextant4, Block::Sextant5, Block::Sextant6]), + 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: &[ @@ -3843,7 +3956,7 @@ impl BlockKey { 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::Frac(1, 2), BlockCoord::One), PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::One), PolyCommand::Close, ], @@ -3942,13 +4055,25 @@ impl BlockKey { style: PolyStyle::Fill, }]), // [🭨] UPPER AND RIGHT AND LOWER TRIANGULAR THREE QUARTERS BLOCK - 0x1fb68 => Self::Triangles(Triangle::UPPER | Triangle::RIGHT | Triangle::LOWER, BlockAlpha::Full), + 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), + 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), + 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), + 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 @@ -3992,7 +4117,12 @@ impl BlockKey { // [🮀] 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)]), + 0x1fb81 => Self::Blocks(&[ + Block::UpperBlock(1), + Block::HorizontalBlock(2, 3), + Block::HorizontalBlock(4, 5), + Block::LowerBlock(1), + ]), // [🮂] Upper One Quarter Block 0x1fb82 => Self::Blocks(&[Block::UpperBlock(2)]), // [🮃] Upper three eighths block @@ -4024,41 +4154,50 @@ impl BlockKey { // [🮐] 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)]), + 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)]), + 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)]), + 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)]), + 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, 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, 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, 2, 4, BlockAlpha::Full), Block::Custom(0, 2, 6, 8, BlockAlpha::Full), - Block::Custom(2, 4, 0 ,2, 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, 2, 4, BlockAlpha::Full), Block::Custom(4, 6, 6, 8, BlockAlpha::Full), - Block::Custom(6, 8, 0 ,2, 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), - ]), + 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(&[ @@ -4244,15 +4383,28 @@ impl BlockKey { // [🮩] 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), + 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), + 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), + 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), + 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), + 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 { @@ -4275,8 +4427,6 @@ impl BlockKey { }, ]), - - // Braille dot patterns // ⠀ ⠁ ⠂ ⠃ ⠄ ⠅ ⠆ ⠇ ⠈ ⠉ ⠊ ⠋ ⠌ ⠍ ⠎ ⠏ // ⠐ ⠑ ⠒ ⠓ ⠔ ⠕ ⠖ ⠗ ⠘ ⠙ ⠚ ⠛ ⠜ ⠝ ⠞ ⠟ @@ -4649,40 +4799,72 @@ impl GlyphCache { } Block::UpperBlock(num) => { let lower = (*num as f32) * y_eighth; - fill_rect(&mut buffer,0.0..width,0.0..lower, BlockAlpha::Full); + fill_rect(&mut buffer, 0.0..width, 0.0..lower, BlockAlpha::Full); } Block::LowerBlock(num) => { let upper = ((8 - num) as f32) * y_eighth; - fill_rect(&mut buffer,0.0..width, upper..height, BlockAlpha::Full); + fill_rect(&mut buffer, 0.0..width, upper..height, BlockAlpha::Full); } Block::LeftBlock(num) => { let right = (*num as f32) * x_eighth; - fill_rect(&mut buffer,0.0..right,0.0..height, BlockAlpha::Full); + 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); + 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); + 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); + 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), + 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, + ), } } } @@ -4703,30 +4885,70 @@ impl GlyphCache { }, ); }; - - 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)} } + + 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) + }; + } // Draw triangles - if triangles.contains(Triangle::UPPER) { draw(&[start!(), p0!(), p1!(), close!()], PolyStyle::Fill); } - if triangles.contains(Triangle::LOWER) { draw(&[start!(), p2!(), p3!(), close!()], PolyStyle::Fill); } - if triangles.contains(Triangle::LEFT) { draw(&[start!(), p0!(), p2!(), close!()], PolyStyle::Fill); } - if triangles.contains(Triangle::RIGHT) { draw(&[start!(), p1!(), p3!(), close!()], PolyStyle::Fill); } - + if triangles.contains(Triangle::UPPER) { + draw(&[start!(), p0!(), p1!(), close!()], PolyStyle::Fill); + } + if triangles.contains(Triangle::LOWER) { + draw(&[start!(), p2!(), p3!(), close!()], PolyStyle::Fill); + } + if triangles.contains(Triangle::LEFT) { + draw(&[start!(), p0!(), p2!(), close!()], PolyStyle::Fill); + } + 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); } + 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::CellDiagonals(diagonals) => { let mut draw = |cmd: &'static [PolyCommand]| { @@ -4745,16 +4967,40 @@ impl GlyphCache { }, ); }; - - macro_rules! U { () => {PolyCommand::MoveTo(BlockCoord::Frac(1, 2), BlockCoord::Zero)} } - macro_rules! D { () => {PolyCommand::MoveTo(BlockCoord::Frac(1, 2), BlockCoord::One)} } - macro_rules! L { () => {PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::Frac(1, 2))} } - macro_rules! R { () => {PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(1, 2))} } - if diagonals.contains(CellDiagonal::UPPER_LEFT) { draw(&[U!(), L!()]); } - 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!()]); } + macro_rules! U { + () => { + PolyCommand::MoveTo(BlockCoord::Frac(1, 2), BlockCoord::Zero) + }; + } + macro_rules! D { + () => { + PolyCommand::MoveTo(BlockCoord::Frac(1, 2), BlockCoord::One) + }; + } + macro_rules! L { + () => { + PolyCommand::LineTo(BlockCoord::Zero, BlockCoord::Frac(1, 2)) + }; + } + macro_rules! R { + () => { + PolyCommand::LineTo(BlockCoord::One, BlockCoord::Frac(1, 2)) + }; + } + + if diagonals.contains(CellDiagonal::UPPER_LEFT) { + draw(&[U!(), L!()]); + } + 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) => { // `dots_pattern` is a byte whose bits corresponds to dots @@ -4855,7 +5101,9 @@ fn fill_rect(buffer: &mut Image, x: Range, y: Range, intensity: BlockA let mut paint = Paint::default(); let intensity = intensity.to_scale(); - paint.set_color(tiny_skia::Color::from_rgba(intensity, intensity, intensity, intensity).unwrap()); + paint.set_color( + tiny_skia::Color::from_rgba(intensity, intensity, intensity, intensity).unwrap(), + ); paint.anti_alias = false; paint.force_hq_pipeline = true; From 952af2e6e15622bc0345328b14f851f37dd357f4 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Sun, 5 May 2024 13:32:37 -0700 Subject: [PATCH 068/140] docs: changelog for #5051 #5169 --- docs/changelog.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/changelog.md b/docs/changelog.md index 3481b5a95..b38c5fcac 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -30,6 +30,10 @@ As features stabilize some brief notes about them will accumulate here. 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 From c2fb3cb760adbd3739b2571d862195073f863adc Mon Sep 17 00:00:00 2001 From: emc2314 Date: Mon, 6 May 2024 04:43:52 +0800 Subject: [PATCH 069/140] Fix SSH config %h using Host (#5163) * Fix SSH config %h using Host * Fix test and use workaround for 2nd pass parsing * Better implementation from @wheatdog --- wezterm-ssh/src/config.rs | 46 +++++++++++++++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 4 deletions(-) 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(); From 06139c11c01d6cca1442916eba4f15847e033551 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Sun, 5 May 2024 13:45:27 -0700 Subject: [PATCH 070/140] docs: changelog for #4503 #5163 closes: https://github.com/wez/wezterm/issues/4503 --- docs/changelog.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/changelog.md b/docs/changelog.md index b38c5fcac..d398f52ef 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -56,6 +56,8 @@ As features stabilize some brief notes about them will accumulate here. 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 #### Updated * Bundled conpty.dll and OpenConsole.exe to build 1.19.240130002.nupkg From 888366a15d48b0f8c1d815060baf8c48dd237aa9 Mon Sep 17 00:00:00 2001 From: Glenn Waters Date: Sun, 5 May 2024 16:47:14 -0400 Subject: [PATCH 071/140] Add missing docs, fix typo, bring to attention error. (#5150) * Update swallow_mouse_click_on_window_focus.md Fix typo. * Update appearance.md URL in docs is no longer value. As a placeholder I put in the file where color_schemes can be found. I'm thinking that's not the right fix, but there is now awareness of the broken URL. * Update window_frame.md Add font and font_size description for window_frame. * Update window_frame.md Fix typo --- docs/config/appearance.md | 2 +- .../lua/config/swallow_mouse_click_on_window_focus.md | 3 +-- docs/config/lua/config/window_frame.md | 10 ++++++++++ 3 files changed, 12 insertions(+), 3 deletions(-) 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/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. From d70624b169752778b8be0ea591f580b20be16d01 Mon Sep 17 00:00:00 2001 From: Martin Nowak Date: Fri, 8 Mar 2024 21:26:44 +0100 Subject: [PATCH 072/140] fix #4985 - reimplement get_appearance for wayland - was dropped with wayland reimplementation (#4777, 3eaba4e3d6) - get appearance from xdg desktop portal - advise all windows of appearance changes to reload config --- window/src/os/wayland/connection.rs | 20 ++++++++++++++++++-- window/src/os/wayland/window.rs | 14 +++++++++++++- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/window/src/os/wayland/connection.rs b/window/src/os/wayland/connection.rs index bd12b3668..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; @@ -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/window.rs b/window/src/os/wayland/window.rs index 816a989b1..bd877cbfc 100644 --- a/window/src/os/wayland/window.rs +++ b/window/src/os/wayland/window.rs @@ -48,6 +48,7 @@ use wezterm_input_types::{ use crate::wayland::WaylandConnection; use crate::x11::KeyboardWithFallback; use crate::{ + Appearance, Clipboard, Connection, ConnectionOps, Dimensions, MouseCursor, Point, Rect, RequestedWindowGeometry, ResizeIncrement, ResolvedGeometry, Window, WindowEvent, WindowEventSender, WindowKeyEvent, WindowOps, WindowState, @@ -268,6 +269,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, @@ -294,6 +297,7 @@ impl WaylandWindow { frame_callback: None, text_cursor: None, + appearance, config, @@ -525,7 +529,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 @@ -1083,6 +1087,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, From 809bcc55a5205c05bc5f2a660845506ac28a9675 Mon Sep 17 00:00:00 2001 From: Jeffrey Knockel Date: Sun, 18 Feb 2024 13:27:09 -0500 Subject: [PATCH 073/140] x11: fix window contents jumping on async resize We can't hope to keep the renderer's idea of the window size consistent with the actual window size when the user can asynchronously change its size at any moment. Therefore, we create a child window which we render to and which we synchronously resize in response to async resizes. Since by default the contents of X11 windows are undefined on resize, we take the additional steps of setting our windows' X11 background color and bit gravity as appropriate. --- window/src/os/x11/window.rs | 64 ++++++++++++++++++++++++++++++++++--- 1 file changed, 60 insertions(+), 4 deletions(-) diff --git a/window/src/os/x11/window.rs b/window/src/os/x11/window.rs index da0de8227..38da24876 100644 --- a/window/src/os/x11/window.rs +++ b/window/src/os/x11/window.rs @@ -83,6 +83,7 @@ impl Default for DragAndDrop { pub(crate) struct XWindowInner { pub window_id: xcb::x::Window, + pub child_id: xcb::x::Window, conn: Weak, pub events: WindowEventSender, width: u16, @@ -122,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, }); @@ -145,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) } @@ -158,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 _, ), }; @@ -261,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(()); @@ -355,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; @@ -460,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(); @@ -510,6 +529,8 @@ impl XWindowInner { return Ok(()); } + self.resize_child(width as u32, height as u32); + log::trace!( "{source}: width {} -> {}, height {} -> {}, dpi {} -> {}", self.width, @@ -1355,6 +1376,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 @@ -1363,6 +1385,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 { @@ -1388,7 +1411,8 @@ 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 @@ -1407,6 +1431,32 @@ 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: x.unwrap_or(0).try_into()?, + y: y.unwrap_or(0).try_into()?, + 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::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(); @@ -1415,6 +1465,7 @@ impl XWindow { title: String::new(), appearance, window_id, + child_id, conn: Rc::downgrade(&conn), events, width: width.try_into()?, @@ -1539,6 +1590,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. @@ -1989,6 +2044,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(()) }); From 962ba3af6ea7ded30642bc45b931846f400c4d06 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Sun, 5 May 2024 14:04:47 -0700 Subject: [PATCH 074/140] ringlog: suppress tracing, zbus INFO logs Something changed recently in those crates to make them log a bunch of info logs fairly often; suppress them from our default log filter. --- env-bootstrap/src/ringlog.rs | 2 ++ 1 file changed, 2 insertions(+) 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); } From c02973b852f730d98b2f66837c45c17eca4c903c Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Sun, 5 May 2024 14:07:36 -0700 Subject: [PATCH 075/140] docs: changelog for #5033 --- docs/changelog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changelog.md b/docs/changelog.md index d398f52ef..eb156bcab 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -40,7 +40,7 @@ As features stabilize some brief notes about them will accumulate here. and deserialization of JSON, TOML and YAML. Thanks to @expnn! #4969 #### 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 From 454ec0a7df443e373a6ed36bff59443ca9129e79 Mon Sep 17 00:00:00 2001 From: Jonathan Cammisuli Date: Wed, 7 Feb 2024 17:29:17 +0000 Subject: [PATCH 076/140] windows: set PSEUDOCONSOLE_INHERIT_CURSOR --- pty/src/win/psuedocon.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pty/src/win/psuedocon.rs b/pty/src/win/psuedocon.rs index 48e10c040..7a71b871b 100644 --- a/pty/src/win/psuedocon.rs +++ b/pty/src/win/psuedocon.rs @@ -83,7 +83,7 @@ impl PsuedoCon { size, input.as_raw_handle() as _, output.as_raw_handle() as _, - PSEUDOCONSOLE_RESIZE_QUIRK | PSEUDOCONSOLE_WIN32_INPUT_MODE, + 1, &mut con, ) }; From 9d83458632640e662e3bac6d1d693e4a0cad6e2a Mon Sep 17 00:00:00 2001 From: Jonathan Cammisuli Date: Thu, 8 Feb 2024 10:42:24 -0500 Subject: [PATCH 077/140] add PSUEDOCONSOLE_INHERIT_CURSOR as a flag --- pty/src/win/psuedocon.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pty/src/win/psuedocon.rs b/pty/src/win/psuedocon.rs index 7a71b871b..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 _, - 1, + PSUEDOCONSOLE_INHERIT_CURSOR + | PSEUDOCONSOLE_RESIZE_QUIRK + | PSEUDOCONSOLE_WIN32_INPUT_MODE, &mut con, ) }; From ec438e714c25f24783e2a23df5d3fb8eef192b55 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Sun, 5 May 2024 14:24:07 -0700 Subject: [PATCH 078/140] deps: update harfbuzz to 8.4.0 --- deps/harfbuzz/harfbuzz | 2 +- deps/harfbuzz/src/lib.rs | 8 +++++++- docs/changelog.md | 1 + 3 files changed, 9 insertions(+), 2 deletions(-) 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 eb156bcab..656ebb7b1 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -61,6 +61,7 @@ As features stabilize some brief notes about them will accumulate here. #### Updated * Bundled conpty.dll and OpenConsole.exe to build 1.19.240130002.nupkg +* Bundled harfbuzz to 8.4.0 * Color schemes: [Blue Dolphin (Gogh)](colorschemes/b/index.md#blue-dolphin-gogh), [Butrin (Gogh)](colorschemes/b/index.md#butrin-gogh), From 265b85be1d5b1251bc55e66648b098be001b6948 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Sun, 5 May 2024 16:14:46 -0700 Subject: [PATCH 079/140] update image to 0.25 This improves how non-conforming jpegs are decoded and displayed. refs: https://github.com/wez/wezterm/issues/5365 --- Cargo.lock | 341 +++++++++++++++++++++++++- docs/changelog.md | 3 + lua-api-crates/color-funcs/Cargo.toml | 2 +- term/Cargo.toml | 2 +- termwiz/Cargo.toml | 2 +- termwiz/src/image.rs | 14 +- wezterm-font/Cargo.toml | 2 +- wezterm-gui/Cargo.toml | 2 +- wezterm-gui/src/glyphcache.rs | 4 +- wezterm/Cargo.toml | 2 +- window/src/os/wayland/window.rs | 3 +- 11 files changed, 350 insertions(+), 27 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index eaf7c47d5..0b03553d9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -56,6 +56,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "aligned-vec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" + [[package]] name = "allocator-api2" version = "0.2.18" @@ -138,6 +144,23 @@ version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" +[[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.60", +] + [[package]] name = "arrayref" version = "0.3.7" @@ -397,6 +420,29 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +[[package]] +name = "av1-grain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" +dependencies = [ + "anyhow", + "arrayvec", + "log", + "nom", + "num-rational 0.4.1", + "v_frame", +] + +[[package]] +name = "avif-serialize" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876c75a42f6364451a033496a14c44bffe41f5f4a8236f697391f11024e596d2" +dependencies = [ + "arrayvec", +] + [[package]] name = "az" version = "1.2.1" @@ -497,6 +543,12 @@ dependencies = [ "serde", ] +[[package]] +name = "bitstream-io" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06c9989a51171e2e81038ab168b6ae22886fe9ded214430dbb4f41c28cf176da" + [[package]] name = "block" version = "0.1.6" @@ -548,6 +600,12 @@ dependencies = [ "serde", ] +[[package]] +name = "built" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41bfbdb21256b87a8b5e80fab81a8eed158178e812fd7ba451907518b2742f16" + [[package]] name = "bumpalo" version = "3.16.0" @@ -580,6 +638,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" @@ -636,6 +700,16 @@ dependencies = [ "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]] name = "cfg-if" version = "1.0.0" @@ -1068,7 +1142,7 @@ dependencies = [ "clap", "criterion-plot", "is-terminal", - "itertools", + "itertools 0.10.5", "num-traits", "once_cell", "oorandom", @@ -1089,7 +1163,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" dependencies = [ "cast", - "itertools", + "itertools 0.10.5", ] [[package]] @@ -2541,22 +2615,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" @@ -2607,6 +2702,17 @@ 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.60", +] + [[package]] name = "intrusive-collections" version = "0.9.6" @@ -2668,6 +2774,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" @@ -2688,9 +2803,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" @@ -2827,6 +2939,17 @@ dependencies = [ "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" @@ -3000,6 +3123,15 @@ dependencies = [ "luahelper", ] +[[package]] +name = "loop9" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", +] + [[package]] name = "lru" version = "0.7.8" @@ -3072,6 +3204,16 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" +[[package]] +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", + "rayon", +] + [[package]] name = "memchr" version = "2.7.2" @@ -3379,6 +3521,12 @@ dependencies = [ "tempfile", ] +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + [[package]] name = "nix" version = "0.25.1" @@ -3441,6 +3589,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" @@ -3480,11 +3634,11 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b7a8e9be5e039e2ff869df49155f1c06bd01ade2117ec783e56ab0932b67a8f" dependencies = [ - "num-bigint", + "num-bigint 0.3.3", "num-complex", "num-integer", "num-iter", - "num-rational", + "num-rational 0.3.2", "num-traits", ] @@ -3499,6 +3653,17 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-bigint" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-complex" version = "0.3.1" @@ -3525,6 +3690,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.60", +] + [[package]] name = "num-integer" version = "0.1.46" @@ -3552,7 +3728,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" dependencies = [ "autocfg", - "num-bigint", + "num-bigint 0.3.3", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +dependencies = [ + "autocfg", + "num-bigint 0.4.4", "num-integer", "num-traits", ] @@ -4131,6 +4319,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.60", +] [[package]] name = "promise" @@ -4160,6 +4361,12 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + [[package]] name = "quick-xml" version = "0.30.0" @@ -4241,6 +4448,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 0.4.2", + "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" @@ -4875,6 +5132,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" @@ -5197,6 +5463,19 @@ dependencies = [ "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.12", + "version-compare", +] + [[package]] name = "tabout" version = "0.3.0" @@ -5221,6 +5500,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" @@ -5322,7 +5607,7 @@ dependencies = [ "log", "memmem", "nix 0.26.4", - "num-derive", + "num-derive 0.3.3", "num-traits", "ordered-float", "pest", @@ -5837,6 +6122,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" @@ -5854,6 +6150,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" @@ -7335,6 +7637,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" @@ -7344,6 +7652,15 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "zune-jpeg" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec866b44a2a1fd6133d363f073ca1b179f438f99e7e5bfb1e33f7181facfe448" +dependencies = [ + "zune-core", +] + [[package]] name = "zvariant" version = "3.15.2" diff --git a/docs/changelog.md b/docs/changelog.md index 656ebb7b1..457d1d993 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -62,6 +62,9 @@ As features stabilize some brief notes about them will accumulate here. #### 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), diff --git a/lua-api-crates/color-funcs/Cargo.toml b/lua-api-crates/color-funcs/Cargo.toml index 537946948..18a7985a5 100644 --- a/lua-api-crates/color-funcs/Cargo.toml +++ b/lua-api-crates/color-funcs/Cargo.toml @@ -10,7 +10,7 @@ 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" diff --git a/term/Cargo.toml b/term/Cargo.toml index fe729fdc5..23de51d16 100644 --- a/term/Cargo.toml +++ b/term/Cargo.toml @@ -22,7 +22,7 @@ humansize = "2.1" miniz_oxide = "0.4" finl_unicode = "1.2" hex = "0.4" -image = "0.24.6" +image = "0.25" lazy_static = "1.4" log = "0.4" lru = "0.7" diff --git a/termwiz/Cargo.toml b/termwiz/Cargo.toml index c992546bf..a9344df99 100644 --- a/termwiz/Cargo.toml +++ b/termwiz/Cargo.toml @@ -22,7 +22,7 @@ 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" 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/wezterm-font/Cargo.toml b/wezterm-font/Cargo.toml index ff35a7905..1ce78250a 100644 --- a/wezterm-font/Cargo.toml +++ b/wezterm-font/Cargo.toml @@ -22,7 +22,7 @@ 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" diff --git a/wezterm-gui/Cargo.toml b/wezterm-gui/Cargo.toml index 463f37267..b437ef18c 100644 --- a/wezterm-gui/Cargo.toml +++ b/wezterm-gui/Cargo.toml @@ -55,7 +55,7 @@ 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" } diff --git a/wezterm-gui/src/glyphcache.rs b/wezterm-gui/src/glyphcache.rs index f80b499d8..2925d5a14 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); diff --git a/wezterm/Cargo.toml b/wezterm/Cargo.toml index 37ff44330..7f296377e 100644 --- a/wezterm/Cargo.toml +++ b/wezterm/Cargo.toml @@ -17,7 +17,7 @@ config = { path = "../config" } env-bootstrap = { path = "../env-bootstrap" } filedescriptor = { version="0.8", path = "../filedescriptor" } hostname = "0.4" -image = "0.24.6" +image = "0.25" libc = "0.2" log = "0.4" mux = { path = "../mux" } diff --git a/window/src/os/wayland/window.rs b/window/src/os/wayland/window.rs index bd877cbfc..51a81a555 100644 --- a/window/src/os/wayland/window.rs +++ b/window/src/os/wayland/window.rs @@ -48,8 +48,7 @@ use wezterm_input_types::{ use crate::wayland::WaylandConnection; use crate::x11::KeyboardWithFallback; use crate::{ - Appearance, - Clipboard, Connection, ConnectionOps, Dimensions, MouseCursor, Point, Rect, + Appearance, Clipboard, Connection, ConnectionOps, Dimensions, MouseCursor, Point, Rect, RequestedWindowGeometry, ResizeIncrement, ResolvedGeometry, Window, WindowEvent, WindowEventSender, WindowKeyEvent, WindowOps, WindowState, }; From 8fa4ba9ace4e3e9bb17246e6dcfe1ec175ff49aa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 5 May 2024 23:23:55 +0000 Subject: [PATCH 080/140] build(deps): bump base64 in the all group across 1 directory Bumps the all group with 1 update in the / directory: [base64](https://github.com/marshallpierce/rust-base64). Updates `base64` from 0.21.7 to 0.22.1 - [Changelog](https://github.com/marshallpierce/rust-base64/blob/master/RELEASE-NOTES.md) - [Commits](https://github.com/marshallpierce/rust-base64/compare/v0.21.7...v0.22.1) --- updated-dependencies: - dependency-name: base64 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all ... Signed-off-by: dependabot[bot] --- Cargo.lock | 2 +- wezterm-ssh/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0b03553d9..483dfe87d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6770,7 +6770,7 @@ dependencies = [ "anyhow", "assert_fs", "async_ossl", - "base64 0.21.7", + "base64 0.22.1", "bitflags 1.3.2", "camino", "clap", diff --git a/wezterm-ssh/Cargo.toml b/wezterm-ssh/Cargo.toml index bb5c661f6..dcf14b296 100644 --- a/wezterm-ssh/Cargo.toml +++ b/wezterm-ssh/Cargo.toml @@ -18,7 +18,7 @@ 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" From 0b50725f67154664292d83681f3f421c6567e3b5 Mon Sep 17 00:00:00 2001 From: Thayne McCombs Date: Mon, 1 Apr 2024 01:40:15 -0600 Subject: [PATCH 081/140] Handle missing data device manager more gracefully --- window/src/os/wayland/data_device.rs | 46 +++++++++++++++------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/window/src/os/wayland/data_device.rs b/window/src/os/wayland/data_device.rs index 8726cb0ec..d2c9a570a 100644 --- a/window/src/os/wayland/data_device.rs +++ b/window/src/os/wayland/data_device.rs @@ -22,15 +22,17 @@ impl DataDeviceHandler for WaylandState { &mut self, _conn: &wayland_client::Connection, _qh: &wayland_client::QueueHandle, - _data_device: &WlDataDevice, + data_device: &WlDataDevice, ) { - let offer = self - .data_device - .as_ref() - .unwrap() - .data() - .drag_offer() - .unwrap(); + 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; + } + }; + + let offer = data.drag_offer().unwrap(); offer.with_mime_types(|mime_types| { log::trace!( @@ -91,22 +93,22 @@ impl DataDeviceHandler for WaylandState { &mut self, _conn: &wayland_client::Connection, _qh: &wayland_client::QueueHandle, - _data_device: &WlDataDevice, + data_device: &WlDataDevice, ) { - let offer = self - .data_device - .as_ref() - .unwrap() - .data() - .selection_offer() - .unwrap(); + 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 !offer.with_mime_types(|mime_types| mime_types.iter().any(|s| s == TEXT_MIME_TYPE)) { - return; - } - - if let Some(copy_and_paste) = self.resolve_copy_and_paste() { - copy_and_paste.lock().unwrap().confirm_selection(offer); + if let Some(copy_and_paste) = self.resolve_copy_and_paste() { + copy_and_paste.lock().unwrap().confirm_selection(offer); + } } } From 9b811c7a16be20ea6daf197cf1b1b43bb7492330 Mon Sep 17 00:00:00 2001 From: Riatre Date: Wed, 8 May 2024 23:09:07 +0800 Subject: [PATCH 082/140] Wire up agent forward for libssh backend (#5345) * Wire up agent forward for libssh backend TSIA. There's a drive-by change in sftpwrap.rs for bumping to new libssh-rs. --- Cargo.lock | 6 +- wezterm-ssh/Cargo.toml | 3 +- wezterm-ssh/src/channelwrap.rs | 15 +++++ wezterm-ssh/src/pty.rs | 12 ++-- wezterm-ssh/src/sessioninner.rs | 83 +++++++++++++++++++++++++- wezterm-ssh/src/sessionwrap.rs | 12 ++++ wezterm-ssh/src/sftpwrap.rs | 8 ++- wezterm-ssh/tests/e2e/agent_forward.rs | 53 ++++++++++++++++ wezterm-ssh/tests/e2e/mod.rs | 1 + wezterm-ssh/tests/sshd.rs | 3 +- 10 files changed, 179 insertions(+), 17 deletions(-) create mode 100644 wezterm-ssh/tests/e2e/agent_forward.rs diff --git a/Cargo.lock b/Cargo.lock index 483dfe87d..fa58dd8db 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3022,11 +3022,12 @@ dependencies = [ [[package]] name = "libssh-rs" -version = "0.2.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3fe324fb06b71d28abb81382ac547f25b4895e853a9968482dc5002fb3db08" +checksum = "c13fbf28a79bb77f11a44716baca6327655198455b7c6f6189784279f3e331db" dependencies = [ "bitflags 1.3.2", + "libc", "libssh-rs-sys", "openssl-sys", "thiserror", @@ -6795,6 +6796,7 @@ dependencies = [ "ssh2", "termwiz", "thiserror", + "uds_windows", "whoami", ] diff --git a/wezterm-ssh/Cargo.toml b/wezterm-ssh/Cargo.toml index dcf14b296..5dd513a32 100644 --- a/wezterm-ssh/Cargo.toml +++ b/wezterm-ssh/Cargo.toml @@ -31,10 +31,11 @@ portable-pty = { version="0.8", path = "../pty" } regex = "1" smol = "1.2" 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.1", features=["vendored"], optional = true} #libssh-rs = {path="../../libssh-rs/libssh-rs", features=["vendored"], optional = true} thiserror = "1.0" socket2 = "0.5" +uds_windows = "1.1.0" # Not used directly, but is used to centralize the openssl vendor feature selection async_ossl = { path = "../async_ossl" } 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/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..7e5d50d10 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,62 @@ 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 = { + #[cfg(unix)] + { + use std::os::unix::net::UnixStream; + FileDescriptor::new(UnixStream::connect(&identity_agent)?) + } + #[cfg(windows)] + unsafe { + use std::os::windows::io::{FromRawSocket, IntoRawSocket}; + use uds_windows::UnixStream; + 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 @@ -944,6 +1016,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..2af6cfd02 --- /dev/null +++ b/wezterm-ssh/tests/e2e/agent_forward.rs @@ -0,0 +1,53 @@ +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] +#[smol_potat::test] +#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] +#[cfg_attr(not(feature = "libssh-rs"), ignore)] +async fn ssh_add_should_be_able_to_list_identities_with_agent_forward( + #[future] session_with_agent_forward: SessionWithSshd, +) { + 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] +#[smol_potat::test] +#[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] +#[cfg_attr(not(feature = "libssh-rs"), ignore)] +async fn no_agent_forward_should_happen_when_disabled(#[future] session: SessionWithSshd) { + 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/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, From d2fa4e9842bfa6a274c8a909c8f5fa12828db502 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Wed, 8 May 2024 08:14:13 -0700 Subject: [PATCH 083/140] docs: changelog for https://github.com/wez/wezterm/pull/5345 refs: https://github.com/wez/wezterm/issues/1647 --- docs/changelog.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/changelog.md b/docs/changelog.md index 457d1d993..e1076a4b1 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -38,6 +38,8 @@ As features stabilize some brief notes about them will accumulate here. #### 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 + #### Fixed * Race condition when very quickly adjusting font scale, and other improvements around resizing. Thanks to @jknockel! #4876 #5032 #5033 From 6b66b6674aab2b3d9b81097b51af9e3b93dd0d79 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Wed, 8 May 2024 15:14:22 -0700 Subject: [PATCH 084/140] mux: proxy: extract unix domain from connected client This resolves an issue where `WEZTERM_UNIX_SOCKET=something wezterm cli proxy` would use `something` for the unix domain path when checking that an existing instance was up and running, but would then use the default implicit socket path when dropping into the proxy passthrough stage. What we do here is transform the connected client into its configuration and use that instead of trying to re-derive the socket from incomplete information. The motivating example is using SSH to get into a workstation that is running a GUI wezterm with no explicit unix domain mux. --- wezterm-client/src/client.rs | 7 +++++++ wezterm/src/cli/proxy.rs | 12 +++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/wezterm-client/src/client.rs b/wezterm-client/src/client.rs index 788085be1..8e0a4816d 100644 --- a/wezterm-client/src/client.rs +++ b/wezterm-client/src/client.rs @@ -52,6 +52,7 @@ pub struct Client { sender: Sender, local_domain_id: Option, client_id: ClientId, + client_domain_config: ClientDomainConfig, pub is_reconnectable: bool, pub is_local: bool, } @@ -1015,6 +1016,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 +1114,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, diff --git a/wezterm/src/cli/proxy.rs b/wezterm/src/cli/proxy.rs index c815fa1cb..366e965a5 100644 --- a/wezterm/src/cli/proxy.rs +++ b/wezterm/src/cli/proxy.rs @@ -5,20 +5,26 @@ 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)?; From f6fdfeb9fdf3793132cd7147517c563293886290 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Wed, 8 May 2024 15:32:38 -0700 Subject: [PATCH 085/140] mux: ssh: add override_proxy_command to SshDomain This enables users to override the normal invocation completely, which is helpful for example when connecting into a gui from a remote host. I was wondering why prefer-mux was in here, and my commit message from 7afc9e4d56f13ed71c68148a6e9cd1a0dd05105f suggests that I hit an issue where the gui wasn't running and where I didn't care because I wanted to hit the mux. I think that makes it a little awkward to blanket remove the --prefer-mux flag, but for those that don't want it, they should now be able to configure to allow connected to the gui ``` ssh_domains = { { name = "shortname", remote_address = "hostname", override_proxy_command = "wezterm cli proxy", }, }, ``` --- config/src/ssh.rs | 3 +++ wezterm-client/src/client.rs | 4 +++- 2 files changed, 6 insertions(+), 1 deletion(-) 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/wezterm-client/src/client.rs b/wezterm-client/src/client.rs index 8e0a4816d..eddbabb81 100644 --- a/wezterm-client/src/client.rs +++ b/wezterm-client/src/client.rs @@ -664,7 +664,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) From 6b93ee19e7b34008e2da9246320de6e1f83ab71a Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Thu, 9 May 2024 07:45:19 -0700 Subject: [PATCH 086/140] mux: record client ssh_auth_sock information This commit expands the set of data that we track for each client to include the SSH_AUTH_SOCK. This defaults to the value of that env var on the machine where the ClientId is constructed, which may be remote from the mux server. For the proxy scenario, a remote SSH_AUTH_SOCK path is not addressable, and what we really want is the local SSH_AUTH_SOCK path from that SSH session, so we introduce awareness of whether the current session is a proxy session. Proxy sessions register the mux-local-proxy-id during the setup of the proxy, but we don't apply the identity to the mux. Instead, we wait for the remote client to send their identity and that is annotate to show that it has been routed via a proxy and, crucially, has the SSH_AUTH_SOCK replaced with the mux-local-proxy-id SSH_AUTH_SOCK. ``` ; wezterm cli list-clients USER HOST PID CONNECTED IDLE WORKSPACE FOCUS SSH_AUTH_SOCK wez foo 336500 86.944834352s 944.834352ms default 3 /home/wez/.1password/agent.sock wez foo (via proxy pid 337457) 337314 1.944834352s 944.834352ms 4 /tmp/ssh-XXXXTfGSp7/agent.337456 ``` For the SSH_AUTH_SOCK to be populated, ssh agent forwarding also needs to be enabled for SSH exec() calls; previously it was enabled only for pty channels. Since this commit changes the ABI of the mux protocol, the codec version has been bumped. --- codec/src/lib.rs | 3 +- mux/src/client.rs | 2 + wezterm-client/src/client.rs | 3 +- wezterm-mux-server-impl/src/sessionhandler.rs | 39 +++++++++++++++---- wezterm-ssh/src/sessioninner.rs | 8 ++++ wezterm/src/cli/list_clients.rs | 9 +++++ wezterm/src/cli/proxy.rs | 12 +++++- 7 files changed, 65 insertions(+), 11 deletions(-) diff --git a/codec/src/lib.rs b/codec/src/lib.rs index f8d2f1362..c6337598d 100644 --- a/codec/src/lib.rs +++ b/codec/src/lib.rs @@ -431,7 +431,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 +823,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/mux/src/client.rs b/mux/src/client.rs index 364854915..afd7d5c18 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: std::env::var("SSH_AUTH_SOCK").ok(), } } } diff --git a/wezterm-client/src/client.rs b/wezterm-client/src/client.rs index eddbabb81..7e6d7c78e 100644 --- a/wezterm-client/src/client.rs +++ b/wezterm-client/src/client.rs @@ -51,7 +51,7 @@ 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, @@ -1144,6 +1144,7 @@ impl Client { ); self.set_client_id(SetClientId { client_id: self.client_id.clone(), + is_proxy: false, }) .await?; Ok(info) diff --git a/wezterm-mux-server-impl/src/sessionhandler.rs b/wezterm-mux-server-impl/src/sessionhandler.rs index 405a0166e..0c5725af8 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,35 @@ 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(); + 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-ssh/src/sessioninner.rs b/wezterm-ssh/src/sessioninner.rs index 7e5d50d10..285115909 100644 --- a/wezterm-ssh/src/sessioninner.rs +++ b/wezterm-ssh/src/sessioninner.rs @@ -890,6 +890,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) { diff --git a/wezterm/src/cli/list_clients.rs b/wezterm/src/cli/list_clients.rs index 4bf116ec0..d92de5688 100644 --- a/wezterm/src/cli/list_clients.rs +++ b/wezterm/src/cli/list_clients.rs @@ -57,6 +57,10 @@ 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(); @@ -82,6 +86,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(), ]); } diff --git a/wezterm/src/cli/proxy.rs b/wezterm/src/cli/proxy.rs index 366e965a5..cbdc5c967 100644 --- a/wezterm/src/cli/proxy.rs +++ b/wezterm/src/cli/proxy.rs @@ -1,6 +1,8 @@ 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; @@ -26,7 +28,15 @@ impl ProxyCommand { Mux::set_mux(&mux); 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 From 4af418fddd0ed2d9a8861007112006fc657ecbac Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Thu, 9 May 2024 12:52:29 -0700 Subject: [PATCH 087/140] mux: enable ssh agent forwarding This is done with a wezterm twist: not only is the auth sock forwarded, but the mux on the remote end will automatically maintain a symlink to point to the auth sock of the most recently active mux client, and set SSH_AUTH_SOCK to that symlink so that your remote panes should always be referencing something sane. refs: https://github.com/wez/wezterm/issues/1647 refs: https://github.com/wez/wezterm/discussions/988 --- config/src/config.rs | 3 + docs/changelog.md | 5 + .../config/lua/config/mux_enable_ssh_agent.md | 26 +++ mux/src/domain.rs | 3 + mux/src/lib.rs | 13 ++ mux/src/ssh_agent.rs | 209 ++++++++++++++++++ wezterm-mux-server-impl/src/sessionhandler.rs | 2 + 7 files changed, 261 insertions(+) create mode 100644 docs/config/lua/config/mux_enable_ssh_agent.md create mode 100644 mux/src/ssh_agent.rs diff --git a/config/src/config.rs b/config/src/config.rs index 8f52b91e5..80110678a 100644 --- a/config/src/config.rs +++ b/config/src/config.rs @@ -377,6 +377,9 @@ 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, + /// 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 diff --git a/docs/changelog.md b/docs/changelog.md index e1076a4b1..150413c92 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -39,6 +39,11 @@ As features stabilize some brief notes about them will accumulate here. * [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 #### Fixed * Race condition when very quickly adjusting font scale, and other improvements 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/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..abb2e196e 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; @@ -421,6 +424,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 +443,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 +481,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..d751ffb79 --- /dev/null +++ b/mux/src/ssh_agent.rs @@ -0,0 +1,209 @@ +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 Ok(inherited) = std::env::var("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 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/wezterm-mux-server-impl/src/sessionhandler.rs b/wezterm-mux-server-impl/src/sessionhandler.rs index 0c5725af8..a8a497cdf 100644 --- a/wezterm-mux-server-impl/src/sessionhandler.rs +++ b/wezterm-mux-server-impl/src/sessionhandler.rs @@ -311,6 +311,8 @@ impl SessionHandler { // 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); } From 07114551357ecc0a136291930c76a45b0b122844 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Thu, 9 May 2024 14:27:03 -0700 Subject: [PATCH 088/140] add default_ssh_auth_sock option This is useful (essential!) for fixing up the default auth sock under gnome, as we do not have a way to do that via whatever logic may be present in the shell startup files. --- config/src/config.rs | 3 ++ docs/changelog.md | 2 + .../lua/config/default_ssh_auth_sock.md | 47 +++++++++++++++++++ mux/src/client.rs | 2 +- mux/src/ssh_agent.rs | 9 +++- wezterm-gui/src/main.rs | 3 ++ wezterm-mux-server/src/main.rs | 3 ++ wezterm/src/main.rs | 3 ++ 8 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 docs/config/lua/config/default_ssh_auth_sock.md diff --git a/config/src/config.rs b/config/src/config.rs index 80110678a..49f7248b9 100644 --- a/config/src/config.rs +++ b/config/src/config.rs @@ -380,6 +380,9 @@ pub struct Config { #[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 diff --git a/docs/changelog.md b/docs/changelog.md index 150413c92..77e260dbb 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -44,6 +44,8 @@ As features stabilize some brief notes about them will accumulate here. 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 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/mux/src/client.rs b/mux/src/client.rs index afd7d5c18..92a5e27c7 100644 --- a/mux/src/client.rs +++ b/mux/src/client.rs @@ -34,7 +34,7 @@ impl ClientId { pid: unsafe { libc::getpid() as u32 }, epoch: *EPOCH, id, - ssh_auth_sock: std::env::var("SSH_AUTH_SOCK").ok(), + ssh_auth_sock: crate::AgentProxy::default_ssh_auth_sock(), } } } diff --git a/mux/src/ssh_agent.rs b/mux/src/ssh_agent.rs index d751ffb79..0c9b96b8a 100644 --- a/mux/src/ssh_agent.rs +++ b/mux/src/ssh_agent.rs @@ -84,7 +84,7 @@ impl AgentProxy { let pid = unsafe { libc::getpid() }; let sock_path = config::RUNTIME_DIR.join(format!("agent.{pid}")); - if let Ok(inherited) = std::env::var("SSH_AUTH_SOCK") { + 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:#}"); } @@ -101,6 +101,13 @@ impl AgentProxy { } } + 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 } 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-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/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) } From efbafbc22904874fb9addcf558d2c935439c68de Mon Sep 17 00:00:00 2001 From: Wanchang Ryu Date: Thu, 9 May 2024 21:11:38 +0900 Subject: [PATCH 089/140] fix wrapped long line copy problem on tmux wezterm ignores wrapped long line when alt screen is used and tmux uses alt screen that makes copying wrapped long line into multiple lines. After testing on sevaral tui apps like tmux, w3m, htop it seems to show reasonable performance on resizing. Fixes #5283 --- term/src/terminalstate/performer.rs | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/term/src/terminalstate/performer.rs b/term/src/terminalstate/performer.rs index 80f9d6dd2..59c043319 100644 --- a/term/src/terminalstate/performer.rs +++ b/term/src/terminalstate/performer.rs @@ -162,14 +162,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); } From 31ca8205b7ea4be1d99eb1e973f32d17f575e76a Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Thu, 9 May 2024 14:37:07 -0700 Subject: [PATCH 090/140] docs: changelog for #5396 #5283 --- docs/changelog.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/changelog.md b/docs/changelog.md index 77e260dbb..5c12ab62f 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -67,6 +67,8 @@ As features stabilize some brief notes about them will accumulate here. @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 #### Updated * Bundled conpty.dll and OpenConsole.exe to build 1.19.240130002.nupkg From b08d2e01732f347683bb47699c28610f372716e0 Mon Sep 17 00:00:00 2001 From: Benoit de Chezelles Date: Tue, 7 May 2024 19:21:29 +0200 Subject: [PATCH 091/140] chore(nix): Update refs to submodules & explain why this is needed --- nix/flake.lock | 12 ++++++------ nix/flake.nix | 16 ++++++++++------ 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/nix/flake.lock b/nix/flake.lock index a25b957dc..612567f3f 100644 --- a/nix/flake.lock +++ b/nix/flake.lock @@ -30,25 +30,25 @@ }, "original": { "owner": "wez", + "ref": "VER-2-13-0", "repo": "freetype2", - "rev": "de8b92dd7ec634e9e2b25ef534c54a3537555c11", "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 58323ff02..f20ec8925 100644 --- a/nix/flake.nix +++ b/nix/flake.nix @@ -12,23 +12,27 @@ }; }; + # 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. freetype2 = { - url = "github:wez/freetype2/de8b92dd7ec634e9e2b25ef534c54a3537555c11"; + url = "github:wez/freetype2/VER-2-13-0"; 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; }; }; From 23e7c14a98955c652215f96fcbe6f99f3456ef1c Mon Sep 17 00:00:00 2001 From: Benoit de Chezelles Date: Tue, 7 May 2024 20:07:39 +0200 Subject: [PATCH 092/140] =?UTF-8?q?Revert=20freetype2=20to=20commit=20hash?= =?UTF-8?q?=20(was=20not=20actually=20at=20a=20tag=20=F0=9F=91=80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nix/flake.lock | 8 ++++---- nix/flake.nix | 6 +++++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/nix/flake.lock b/nix/flake.lock index 612567f3f..809991bae 100644 --- a/nix/flake.lock +++ b/nix/flake.lock @@ -21,17 +21,17 @@ "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", - "ref": "VER-2-13-0", "repo": "freetype2", + "rev": "e4586d960f339cf75e2e0b34aee30a0ed8353c0d", "type": "github" } }, diff --git a/nix/flake.nix b/nix/flake.nix index f20ec8925..05f36260a 100644 --- a/nix/flake.nix +++ b/nix/flake.nix @@ -19,8 +19,12 @@ # # ... 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/VER-2-13-0"; + url = "github:wez/freetype2/e4586d960f339cf75e2e0b34aee30a0ed8353c0d"; flake = false; }; harfbuzz = { From 814857cd69ca9592381c72a48a3c685c4aafcd15 Mon Sep 17 00:00:00 2001 From: Jeffrey Knockel Date: Thu, 9 May 2024 18:12:29 -0400 Subject: [PATCH 093/140] x11: fix positioning with --position arg The child window should always have position 0,0. This was a regression from commit 809bcc55. Fixes #5395. --- window/src/os/x11/window.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/window/src/os/x11/window.rs b/window/src/os/x11/window.rs index 38da24876..8b434c32a 100644 --- a/window/src/os/x11/window.rs +++ b/window/src/os/x11/window.rs @@ -1435,8 +1435,8 @@ impl XWindow { depth: conn.depth, wid: child_id, parent: window_id, - x: x.unwrap_or(0).try_into()?, - y: y.unwrap_or(0).try_into()?, + x: 0, + y: 0, width: width.try_into()?, height: height.try_into()?, border_width: 0, From 91a16e52240d37091cd02f7d403a19117fc00489 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Thu, 9 May 2024 22:30:25 -0700 Subject: [PATCH 094/140] remove unused local this should have happened in efbafbc22904874fb9addcf558d2c935439c68de --- term/src/terminalstate/performer.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/term/src/terminalstate/performer.rs b/term/src/terminalstate/performer.rs index 59c043319..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); From 5b0b657b30f63225ed00ff5f18edadd0233446ff Mon Sep 17 00:00:00 2001 From: Daniel Berlin Date: Thu, 9 May 2024 00:12:27 -0400 Subject: [PATCH 095/140] Update wayland keymap handling for protocol 7+. Newer wayland protocol expects us to mmap the keymap file descriptor (and do so with certain mmap flags). The current code tries to handle both normal files and pipes, but neither will work in some cases. This updates the code to use xkbcommon's new_from_fd, which is what the toolkit uses, and mmap's the file. This fixes #5393, which was caused by hanging when trying to read the file as if it was a pipe. --- window/src/os/wayland/keyboard.rs | 57 +++++++++++++++---------------- 1 file changed, 28 insertions(+), 29 deletions(-) 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); } From 107dd67bf288cb85058401c77e1f6d5bd221cf07 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Fri, 10 May 2024 05:50:45 -0700 Subject: [PATCH 096/140] docs: changelog for #5393 --- docs/changelog.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/changelog.md b/docs/changelog.md index 5c12ab62f..fb75b0b00 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -69,6 +69,8 @@ As features stabilize some brief notes about them will accumulate here. 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 From e19def7c9ada6005b587717a086b0eb92ec88ef3 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Fri, 10 May 2024 06:22:12 -0700 Subject: [PATCH 097/140] codec: improve error messaging when remote is misconfigured Work a bit harder to surface that the remote might be outputting stuff to stdout. closes: https://github.com/wez/wezterm/issues/5380 --- codec/src/lib.rs | 36 +++++++++++++++++++++++------------- wezterm-client/src/client.rs | 13 ++++++++----- 2 files changed, 31 insertions(+), 18 deletions(-) diff --git a/codec/src/lib.rs b/codec/src/lib.rs index c6337598d..164b033e1 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 { @@ -173,30 +173,39 @@ 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, }; @@ -210,7 +219,8 @@ async fn decode_raw_async( 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 ) })?; diff --git a/wezterm-client/src/client.rs b/wezterm-client/src/client.rs index 7e6d7c78e..7d43934d3 100644 --- a/wezterm-client/src/client.rs +++ b/wezterm-client/src/client.rs @@ -1167,21 +1167,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); From ca27f921e2f5b25fa1a1b4395f972676d685b62c Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Fri, 10 May 2024 08:27:05 -0700 Subject: [PATCH 098/140] wezterm cli list-clients: add ssh_auth_sock to json, tidy up duration Make longer durations a bit more intelligible. Add the auth sock to the json format output from the command. --- Cargo.lock | 1 + wezterm/Cargo.toml | 1 + wezterm/src/cli/list_clients.rs | 20 ++++++++++++++++++-- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fa58dd8db..6fb85bfdf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6431,6 +6431,7 @@ dependencies = [ "env-bootstrap", "filedescriptor", "hostname", + "humantime", "image", "libc", "log", diff --git a/wezterm/Cargo.toml b/wezterm/Cargo.toml index 7f296377e..64e6224bd 100644 --- a/wezterm/Cargo.toml +++ b/wezterm/Cargo.toml @@ -17,6 +17,7 @@ config = { path = "../config" } env-bootstrap = { path = "../env-bootstrap" } filedescriptor = { version="0.8", path = "../filedescriptor" } hostname = "0.4" +humantime = "2.1" image = "0.25" libc = "0.2" log = "0.4" diff --git a/wezterm/src/cli/list_clients.rs b/wezterm/src/cli/list_clients.rs index d92de5688..5697d07f2 100644 --- a/wezterm/src/cli/list_clients.rs +++ b/wezterm/src/cli/list_clients.rs @@ -67,7 +67,20 @@ impl ListClientsCommand { 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() } @@ -114,6 +127,7 @@ struct CliListClientsResultItem { idle_time: std::time::Duration, workspace: String, focused_pane_id: Option, + ssh_auth_sock: Option, } impl From for CliListClientsResultItem { @@ -133,6 +147,7 @@ impl From for CliListClientsResultItem { username, hostname, pid, + ssh_auth_sock, .. } = client_id.as_ref(); @@ -148,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()), } } } From 79ce027d3805ed43ff533b19802a4a2e7d9a9623 Mon Sep 17 00:00:00 2001 From: Jeffrey Knockel Date: Fri, 10 May 2024 14:53:35 -0400 Subject: [PATCH 099/140] x11: fix exposures on child window We should watch the child window for exposure events, not the parent window (the parent window is just a background color and we never paint to it). This was a regression from commit 809bcc55. Fixes #5405. --- window/src/os/x11/connection.rs | 11 +++++++++++ window/src/os/x11/window.rs | 12 ++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/window/src/os/x11/connection.rs b/window/src/os/x11/connection.rs index 0a11d75d5..3f078b82f 100644 --- a/window/src/os/x11/connection.rs +++ b/window/src/os/x11/connection.rs @@ -70,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, @@ -578,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(); @@ -595,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(()) } @@ -804,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 8b434c32a..58ec4f893 100644 --- a/window/src/os/x11/window.rs +++ b/window/src/os/x11/window.rs @@ -792,6 +792,7 @@ impl XWindowInner { 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)?; @@ -1414,8 +1415,7 @@ impl XWindow { 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 @@ -1449,6 +1449,7 @@ impl XWindow { 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), ], }) @@ -1538,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 @@ -1581,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 From 55de5b0e4e408c2e7ff100e6acebff77000d4e78 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Sat, 11 May 2024 07:11:31 -0700 Subject: [PATCH 100/140] update xcb-imdkit to pick up more from_raw_parts related fixes refs: https://github.com/wez/xcb-imdkit-rs/pull/1 --- Cargo.lock | 2 +- window/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6fb85bfdf..19bbfc428 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7467,7 +7467,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", diff --git a/window/Cargo.toml b/window/Cargo.toml index 39d94eac1..580c6d7aa 100644 --- a/window/Cargo.toml +++ b/window/Cargo.toml @@ -77,7 +77,7 @@ xcb = {version="1.3", features=["render", "randr", "dri2", "xkb", "xlib_xcb", "p 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"} +xcb-imdkit = { version="0.3", git="https://github.com/wez/xcb-imdkit-rs.git", rev="358e226573461fe540efb920e2aad740e3c6fab1"} zbus = "3.14" zvariant = "3.15" From f0e62d26f3842a0d5b4d932c3eee2a3ee64bc878 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Mon, 13 May 2024 07:19:17 -0700 Subject: [PATCH 101/140] update libssh-rs --- Cargo.lock | 8 ++++---- wezterm-ssh/Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 19bbfc428..dd434523a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3022,9 +3022,9 @@ dependencies = [ [[package]] name = "libssh-rs" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c13fbf28a79bb77f11a44716baca6327655198455b7c6f6189784279f3e331db" +checksum = "3fe5b617b2d56b06cc1166f074045b5c0d626160aa30ce8cd834191b9554a9c0" dependencies = [ "bitflags 1.3.2", "libc", @@ -3035,9 +3035,9 @@ dependencies = [ [[package]] name = "libssh-rs-sys" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3af07827858d82a7b74d6f935ad4201ff764fb1de8efcc26aeaa33e5f9c89ca2" +checksum = "36c1ac11240c1eb84950beff8eb6dd3dee21fab8d01947828269057fe63f14a9" dependencies = [ "cc", "libz-sys", diff --git a/wezterm-ssh/Cargo.toml b/wezterm-ssh/Cargo.toml index 5dd513a32..da47f7c7d 100644 --- a/wezterm-ssh/Cargo.toml +++ b/wezterm-ssh/Cargo.toml @@ -31,7 +31,7 @@ portable-pty = { version="0.8", path = "../pty" } regex = "1" smol = "1.2" ssh2 = {version="0.9.3", features=["openssl-on-win32"], optional = true} -libssh-rs = {version="0.3.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" From c4c6b723c0d7eccb8837945a4e164f720ab0c12d Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Mon, 13 May 2024 07:19:47 -0700 Subject: [PATCH 102/140] cargo update --- Cargo.lock | 178 ++++++++++++++++++++++++++--------------------------- 1 file changed, 88 insertions(+), 90 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index dd434523a..89dd71398 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -140,9 +140,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.82" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" +checksum = "25bdb32cbbdce2b519a9cd7df3a678443100e265d5e25ca763b7572a5104f5f3" [[package]] name = "arbitrary" @@ -158,7 +158,7 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.63", ] [[package]] @@ -226,9 +226,9 @@ dependencies = [ [[package]] name = "async-channel" -version = "2.2.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136d4d23bcc79e27423727b36823d86233aad06dfea531837b038394d11e9928" +checksum = "9f2776ead772134d55b62dd45e59a79e21612d85d0af729b8b7d3967d601a62a" dependencies = [ "concurrent-queue", "event-listener 5.3.0", @@ -357,7 +357,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.63", ] [[package]] @@ -392,7 +392,7 @@ checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.63", ] [[package]] @@ -430,7 +430,7 @@ dependencies = [ "arrayvec", "log", "nom", - "num-rational 0.4.1", + "num-rational 0.4.2", "v_frame", ] @@ -545,9 +545,9 @@ dependencies = [ [[package]] name = "bitstream-io" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06c9989a51171e2e81038ab168b6ae22886fe9ded214430dbb4f41c28cf176da" +checksum = "7c12d1856e42f0d817a835fe55853957c85c8c8a470114029143d3f12671446e" [[package]] name = "block" @@ -570,7 +570,7 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "495f7104e962b7356f0aeb34247aca1fe7d2e783b346582db7f2904cb5717e88" dependencies = [ - "async-channel 2.2.1", + "async-channel 2.3.0", "async-lock 3.3.0", "async-task", "futures-io", @@ -629,7 +629,7 @@ checksum = "4da9a32f3fed317401fa3c862968128267c3106685286e15d5aaa3d7389c2f60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.63", ] [[package]] @@ -691,9 +691,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.0.96" +version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "065a29261d53ba54260972629f9ca6bffa69bac13cd1fed61420f7fa68b9f8bd" +checksum = "099a5357d84c4c61eb35fc8eafa9a79a902c2f76911e5747ced4e032edd8d9b4" dependencies = [ "jobserver", "libc", @@ -823,7 +823,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.63", ] [[package]] @@ -1286,7 +1286,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.10.0", - "syn 2.0.60", + "syn 2.0.63", ] [[package]] @@ -1297,7 +1297,7 @@ checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" dependencies = [ "darling_core", "quote", - "syn 2.0.60", + "syn 2.0.63", ] [[package]] @@ -1519,7 +1519,7 @@ checksum = "5c785274071b1b420972453b306eeca06acf4633829db4223b58a2a8c5953bc4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.63", ] [[package]] @@ -1599,9 +1599,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", @@ -1890,7 +1890,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.63", ] [[package]] @@ -2025,7 +2025,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.63", ] [[package]] @@ -2102,9 +2102,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "js-sys", @@ -2710,7 +2710,7 @@ checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.63", ] [[package]] @@ -2826,7 +2826,7 @@ dependencies = [ "libc", "proc-macro2", "regex", - "syn 2.0.60", + "syn 2.0.63", "terminal_size 0.2.6", ] @@ -3656,11 +3656,10 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +checksum = "c165a9ab64cf766f73521c0dd2cfdff64f488b8f0b3e621face3462d3db536d7" dependencies = [ - "autocfg", "num-integer", "num-traits", ] @@ -3699,7 +3698,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.63", ] [[package]] @@ -3736,12 +3735,11 @@ dependencies = [ [[package]] name = "num-rational" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" dependencies = [ - "autocfg", - "num-bigint 0.4.4", + "num-bigint 0.4.5", "num-integer", "num-traits", ] @@ -3828,7 +3826,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.63", ] [[package]] @@ -3936,9 +3934,9 @@ dependencies = [ [[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" @@ -3987,7 +3985,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.63", ] [[package]] @@ -4041,7 +4039,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.63", ] [[package]] @@ -4070,7 +4068,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.63", ] [[package]] @@ -4087,9 +4085,9 @@ 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.1.0", @@ -4284,9 +4282,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.81" +version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" +checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b" dependencies = [ "unicode-ident", ] @@ -4331,7 +4329,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8021cf59c8ec9c432cfc2526ac6b8aa508ecaf29cd415f271b8406c1b851c3fd" dependencies = [ "quote", - "syn 2.0.60", + "syn 2.0.63", ] [[package]] @@ -4728,7 +4726,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.60", + "syn 2.0.63", "unicode-ident", ] @@ -4748,9 +4746,9 @@ dependencies = [ [[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" @@ -4764,7 +4762,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.22", + "semver 1.0.23", ] [[package]] @@ -4806,15 +4804,15 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.5.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "beb461507cee2c2ff151784c52762cf4d9ff6a61f3e80968600ed24fa837fa54" +checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" [[package]] name = "ryu" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "same-file" @@ -4848,11 +4846,11 @@ 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", + "bitflags 2.5.0", "core-foundation 0.9.4", "core-foundation-sys 0.8.6", "libc", @@ -4861,9 +4859,9 @@ dependencies = [ [[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", "libc", @@ -4880,9 +4878,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "semver-parser" @@ -4895,9 +4893,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.200" +version = "1.0.201" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddc6f9cc94d67c0e21aaf7eda3a010fd3af78ebf6e096aa6e2e13c79749cce4f" +checksum = "780f1cebed1629e4753a1a38a3c72d30b97ec044f0aef68cb26650a3c5cf363c" dependencies = [ "serde_derive", ] @@ -4917,20 +4915,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.200" +version = "1.0.201" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "856f046b9400cee3c8c94ed572ecdb752444c24528c035cd35882aad6f492bcb" +checksum = "c5e405930b9796f1c00bee880d03fc7e0bb4b9a11afc776885ffe84320da2865" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.63", ] [[package]] name = "serde_json" -version = "1.0.116" +version = "1.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" +checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" dependencies = [ "itoa", "ryu", @@ -4945,7 +4943,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.63", ] [[package]] @@ -4994,7 +4992,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.63", ] [[package]] @@ -5403,9 +5401,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.60" +version = "2.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" +checksum = "bf5be731623ca1a1fb7d8be6f261a3be6d3e2337b8a1f97be944d020c8fcb704" dependencies = [ "proc-macro2", "quote", @@ -5663,22 +5661,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.59" +version = "1.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa" +checksum = "579e9083ca58dd9dcf91a9923bb9054071b9ebbd800b342194c9feb0ee89fc18" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.59" +version = "1.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" +checksum = "e2470041c06ec3ac1ab38d0356a6119054dedaea53e12fbefc0de730a1c08524" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.63", ] [[package]] @@ -5830,7 +5828,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.63", ] [[package]] @@ -5907,7 +5905,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.7", + "winnow 0.6.8", ] [[package]] @@ -5958,7 +5956,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.63", ] [[package]] @@ -6193,9 +6191,9 @@ dependencies = [ [[package]] name = "waker-fn" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690" +checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" [[package]] name = "walkdir" @@ -6249,7 +6247,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.63", "wasm-bindgen-shared", ] @@ -6283,7 +6281,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.63", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -7389,9 +7387,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14b9415ee827af173ebb3f15f9083df5a122eb93572ec28741fb153356ea2578" +checksum = "c3c52e9c97a68071b23e836c9380edae937f17b9c4667bd021973efc689f618d" dependencies = [ "memchr", ] @@ -7593,22 +7591,22 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.33" +version = "0.7.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "087eca3c1eaf8c47b94d02790dd086cd594b912d2043d4de4bfdd466b3befb7c" +checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.33" +version = "0.7.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f4b6c273f496d8fd4eaf18853e6b448760225dc030ff2c485a786859aea6393" +checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.63", ] [[package]] From 14d426fea8ab14a1b7dc527ceb2b0d45702ca2df Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Mon, 13 May 2024 08:29:36 -0700 Subject: [PATCH 103/140] add cargo deny config, update lru --- Cargo.lock | 9 +- async_ossl/Cargo.toml | 1 + base91/Cargo.toml | 1 + bidi/generate/Cargo.toml | 1 + bintree/Cargo.toml | 1 + codec/Cargo.toml | 1 + config/Cargo.toml | 1 + deny.toml | 245 ++++++++++++++++++ deps/fontconfig/Cargo.toml | 1 + deps/freetype/Cargo.toml | 1 + deps/harfbuzz/Cargo.toml | 1 + env-bootstrap/Cargo.toml | 1 + frecency/Cargo.toml | 1 + lfucache/Cargo.toml | 1 + lua-api-crates/battery/Cargo.toml | 1 + lua-api-crates/color-funcs/Cargo.toml | 3 +- .../color-funcs/src/image_colors.rs | 3 +- lua-api-crates/filesystem/Cargo.toml | 1 + lua-api-crates/logging/Cargo.toml | 1 + lua-api-crates/mux/Cargo.toml | 1 + lua-api-crates/plugin/Cargo.toml | 1 + lua-api-crates/procinfo-funcs/Cargo.toml | 1 + lua-api-crates/serde-funcs/Cargo.toml | 1 + lua-api-crates/share-data/Cargo.toml | 1 + lua-api-crates/spawn-funcs/Cargo.toml | 1 + lua-api-crates/ssh-funcs/Cargo.toml | 1 + lua-api-crates/termwiz-funcs/Cargo.toml | 1 + lua-api-crates/time-funcs/Cargo.toml | 1 + lua-api-crates/url-funcs/Cargo.toml | 1 + lua-api-crates/window-funcs/Cargo.toml | 1 + luahelper/Cargo.toml | 1 + mux/Cargo.toml | 1 + procinfo/Cargo.toml | 1 + promise/Cargo.toml | 1 + rangeset/Cargo.toml | 1 + ratelim/Cargo.toml | 1 + strip-ansi-escapes/Cargo.toml | 1 + sync-color-schemes/Cargo.toml | 1 + term/Cargo.toml | 2 +- term/src/terminalstate/mod.rs | 3 +- umask/Cargo.toml | 1 + wezterm-client/Cargo.toml | 3 +- wezterm-client/src/pane/renderable.rs | 5 +- wezterm-font/Cargo.toml | 1 + wezterm-gui-subcommands/Cargo.toml | 1 + wezterm-gui/Cargo.toml | 1 + wezterm-mux-server-impl/Cargo.toml | 1 + wezterm-mux-server/Cargo.toml | 1 + wezterm-open-url/Cargo.toml | 1 + wezterm-toast-notification/Cargo.toml | 1 + wezterm-version/Cargo.toml | 1 + wezterm/Cargo.toml | 1 + 52 files changed, 304 insertions(+), 13 deletions(-) create mode 100644 deny.toml diff --git a/Cargo.lock b/Cargo.lock index 89dd71398..022aea768 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2341,9 +2341,6 @@ 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" @@ -3135,11 +3132,11 @@ dependencies = [ [[package]] name = "lru" -version = "0.7.8" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999beba7b6e8345721bd280141ed958096a2e4abdf74f67ff4ce49b4b54e47a" +checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" dependencies = [ - "hashbrown 0.12.3", + "hashbrown 0.14.5", ] [[package]] diff --git a/async_ossl/Cargo.toml b/async_ossl/Cargo.toml index b52df89c3..e5d77c319 100644 --- a/async_ossl/Cargo.toml +++ b/async_ossl/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/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/codec/Cargo.toml b/codec/Cargo.toml index 6ba4a6d80..52b250176 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 diff --git a/config/Cargo.toml b/config/Cargo.toml index 0a38f1e67..0adefcc92 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 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/env-bootstrap/Cargo.toml b/env-bootstrap/Cargo.toml index d48e7df05..1e7cf6db7 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 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 03347ae43..ce861ec41 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 diff --git a/lua-api-crates/battery/Cargo.toml b/lua-api-crates/battery/Cargo.toml index 4887a1eac..30b4167fd 100644 --- a/lua-api-crates/battery/Cargo.toml +++ b/lua-api-crates/battery/Cargo.toml @@ -2,6 +2,7 @@ name = "battery" 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/color-funcs/Cargo.toml b/lua-api-crates/color-funcs/Cargo.toml index 18a7985a5..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 @@ -13,7 +14,7 @@ deltae = "0.3" 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..d56967096 100644 --- a/lua-api-crates/color-funcs/src/image_colors.rs +++ b/lua-api-crates/color-funcs/src/image_colors.rs @@ -18,6 +18,7 @@ use deltae::LabValue; use image::Pixel; use lru::LruCache; use luahelper::impl_lua_conversion_dynamic; +use std::num::NonZeroUsize; use std::collections::HashMap; use std::sync::Mutex; use std::time::SystemTime; @@ -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..fbbebbc9e 100644 --- a/lua-api-crates/filesystem/Cargo.toml +++ b/lua-api-crates/filesystem/Cargo.toml @@ -2,6 +2,7 @@ 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 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..8595760a5 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 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..f8aef21be 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 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..b7f264132 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 diff --git a/lua-api-crates/time-funcs/Cargo.toml b/lua-api-crates/time-funcs/Cargo.toml index 11cbb982f..d95cc5cd8 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 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 8640cecfd..d7cd3c2e5 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 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..67639b085 100644 --- a/promise/Cargo.toml +++ b/promise/Cargo.toml @@ -3,6 +3,7 @@ authors = ["Wez Furlong "] name = "promise" version = "0.2.0" edition = "2018" +publish = false [dependencies] async-task = "4.0" diff --git a/rangeset/Cargo.toml b/rangeset/Cargo.toml index a31fb973f..b82cface1 100644 --- a/rangeset/Cargo.toml +++ b/rangeset/Cargo.toml @@ -3,6 +3,7 @@ name = "rangeset" version = "0.1.0" authors = ["Wez Furlong "] edition = "2018" +publish = false [dependencies] num = "0.3" 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 8e06784a7..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 diff --git a/term/Cargo.toml b/term/Cargo.toml index 23de51d16..7f75afa0d 100644 --- a/term/Cargo.toml +++ b/term/Cargo.toml @@ -25,7 +25,7 @@ hex = "0.4" 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"]} diff --git a/term/src/terminalstate/mod.rs b/term/src/terminalstate/mod.rs index ada148039..6a7f83739 100644 --- a/term/src/terminalstate/mod.rs +++ b/term/src/terminalstate/mod.rs @@ -5,6 +5,7 @@ use super::*; use crate::color::{ColorPalette, RgbColor}; use crate::config::{BidiMode, NewlineCanon}; use log::debug; +use std::num::NonZeroUsize; use num_traits::ToPrimitive; use std::collections::HashMap; use std::io::{BufWriter, Write}; @@ -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/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/wezterm-client/Cargo.toml b/wezterm-client/Cargo.toml index 6e63609c1..a868d1fa9 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 @@ -17,7 +18,7 @@ futures = "0.3" lazy_static = "1.4" log = "0.4" libc = "0.2" -lru = "0.7" +lru = "0.12" metrics = { version="0.17", features=["std"]} mux = { path = "../mux" } openssl = "0.10.57" diff --git a/wezterm-client/src/pane/renderable.rs b/wezterm-client/src/pane/renderable.rs index 60a522cec..0bb947129 100644 --- a/wezterm-client/src/pane/renderable.rs +++ b/wezterm-client/src/pane/renderable.rs @@ -1,4 +1,5 @@ use crate::domain::ClientInner; +use std::num::NonZeroUsize; use crate::pane::clientpane::ClientPane; use anyhow::anyhow; use codec::*; @@ -104,7 +105,7 @@ 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 +635,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-font/Cargo.toml b/wezterm-font/Cargo.toml index 1ce78250a..2a18e0a08 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 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 b437ef18c..e0dd3e0ce 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 diff --git a/wezterm-mux-server-impl/Cargo.toml b/wezterm-mux-server-impl/Cargo.toml index 146c38e36..225c8d472 100644 --- a/wezterm-mux-server-impl/Cargo.toml +++ b/wezterm-mux-server-impl/Cargo.toml @@ -3,6 +3,7 @@ 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 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-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-toast-notification/Cargo.toml b/wezterm-toast-notification/Cargo.toml index f6172885e..21f40e9b1 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 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 64e6224bd..a64bbf9e4 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 From 281b6e2740642447294c08973b7d3824ded2df80 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Mon, 13 May 2024 09:17:23 -0700 Subject: [PATCH 104/140] deps: update metrics to a more recent version This isn't the latest version of metrics; it's just a more recent version that allows us to remove a duplicate ahash dependency from the build graph. --- Cargo.lock | 36 ++- codec/Cargo.toml | 2 +- lfucache/Cargo.toml | 2 +- .../color-funcs/src/image_colors.rs | 2 +- mux/Cargo.toml | 2 +- term/src/terminalstate/mod.rs | 2 +- wezterm-client/Cargo.toml | 2 +- wezterm-client/src/pane/renderable.rs | 6 +- wezterm-font/Cargo.toml | 2 +- wezterm-gui/Cargo.toml | 2 +- wezterm-gui/src/stats.rs | 245 +++++++++++------- window/Cargo.toml | 2 +- 12 files changed, 186 insertions(+), 119 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 022aea768..1161ee447 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" @@ -2348,7 +2337,7 @@ version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ - "ahash 0.8.11", + "ahash", "allocator-api2", ] @@ -2898,7 +2887,7 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" name = "lfucache" version = "0.1.0" dependencies = [ - "ahash 0.8.11", + "ahash", "config", "fnv", "intrusive-collections", @@ -3295,25 +3284,24 @@ dependencies = [ [[package]] name = "metrics" -version = "0.17.1" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55586aa936c35f34ba8aa5d97356d554311206e1ce1f9e68fe7b07288e5ad827" +checksum = "fde3af1a009ed76a778cb84fdef9e7dbbdf5775ae3e4cc1f434a6a307f6f76c5" dependencies = [ - "ahash 0.7.8", + "ahash", "metrics-macros", + "portable-atomic", ] [[package]] name = "metrics-macros" -version = "0.4.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0daa0ab3a0ae956d0e2c1f42511422850e577d36a255357d1a7d08d45ee3a2f1" +checksum = "38b4faf00617defe497754acde3024865bc143d44a86799b24e191ecff91354f" dependencies = [ - "lazy_static", "proc-macro2", "quote", - "regex", - "syn 1.0.109", + "syn 2.0.63", ] [[package]] @@ -4196,6 +4184,12 @@ dependencies = [ "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" diff --git a/codec/Cargo.toml b/codec/Cargo.toml index 52b250176..9347bb5c3 100644 --- a/codec/Cargo.toml +++ b/codec/Cargo.toml @@ -12,7 +12,7 @@ anyhow = "1.0" config = { path = "../config" } leb128 = "0.2" log = "0.4" -metrics = { version="0.17", features=["std"]} +metrics = "0.21" mux = { path = "../mux" } portable-pty = { path = "../pty", features = ["serde_support"]} rangeset = { path = "../rangeset" } diff --git a/lfucache/Cargo.toml b/lfucache/Cargo.toml index ce861ec41..6aebc2350 100644 --- a/lfucache/Cargo.toml +++ b/lfucache/Cargo.toml @@ -11,7 +11,7 @@ ahash = "0.8" config = { path = "../config" } fnv = "1.0" intrusive-collections = "0.9" -metrics = { version="0.17", features=["std"]} +metrics = "0.21" [dev-dependencies] k9 = "0.12" diff --git a/lua-api-crates/color-funcs/src/image_colors.rs b/lua-api-crates/color-funcs/src/image_colors.rs index d56967096..8dc0b79ee 100644 --- a/lua-api-crates/color-funcs/src/image_colors.rs +++ b/lua-api-crates/color-funcs/src/image_colors.rs @@ -18,8 +18,8 @@ use deltae::LabValue; use image::Pixel; use lru::LruCache; use luahelper::impl_lua_conversion_dynamic; -use std::num::NonZeroUsize; use std::collections::HashMap; +use std::num::NonZeroUsize; use std::sync::Mutex; use std::time::SystemTime; use wezterm_dynamic::{FromDynamic, ToDynamic}; diff --git a/mux/Cargo.toml b/mux/Cargo.toml index d7cd3c2e5..85d808226 100644 --- a/mux/Cargo.toml +++ b/mux/Cargo.toml @@ -25,7 +25,7 @@ lazy_static = "1.4" libc = "0.2" log = "0.4" luahelper = { path = "../luahelper" } -metrics = { version="0.17", features=["std"]} +metrics = "0.21" mlua = "0.9" names = { version = "0.12", default-features = false } nix = {version="0.25", features=["term"]} diff --git a/term/src/terminalstate/mod.rs b/term/src/terminalstate/mod.rs index 6a7f83739..02d1690af 100644 --- a/term/src/terminalstate/mod.rs +++ b/term/src/terminalstate/mod.rs @@ -5,10 +5,10 @@ use super::*; use crate::color::{ColorPalette, RgbColor}; use crate::config::{BidiMode, NewlineCanon}; use log::debug; -use std::num::NonZeroUsize; 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}; diff --git a/wezterm-client/Cargo.toml b/wezterm-client/Cargo.toml index a868d1fa9..9ed0f26f2 100644 --- a/wezterm-client/Cargo.toml +++ b/wezterm-client/Cargo.toml @@ -19,7 +19,7 @@ lazy_static = "1.4" log = "0.4" libc = "0.2" lru = "0.12" -metrics = { version="0.17", features=["std"]} +metrics = "0.21" mux = { path = "../mux" } openssl = "0.10.57" parking_lot = "0.12" diff --git a/wezterm-client/src/pane/renderable.rs b/wezterm-client/src/pane/renderable.rs index 0bb947129..68fa518f8 100644 --- a/wezterm-client/src/pane/renderable.rs +++ b/wezterm-client/src/pane/renderable.rs @@ -1,5 +1,4 @@ use crate::domain::ClientInner; -use std::num::NonZeroUsize; use crate::pane::clientpane::ClientPane; use anyhow::anyhow; use codec::*; @@ -13,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}; @@ -105,7 +105,9 @@ impl RenderableInner { poll_interval: BASE_POLL_INTERVAL, cursor_position: StableCursorPosition::default(), dimensions, - lines: LruCache::new(NonZeroUsize::new(configuration().scrollback_lines.max(128)).unwrap()), + lines: LruCache::new( + NonZeroUsize::new(configuration().scrollback_lines.max(128)).unwrap(), + ), title: title.to_string(), working_dir: None, fetch_limiter, diff --git a/wezterm-font/Cargo.toml b/wezterm-font/Cargo.toml index 2a18e0a08..0cd073ece 100644 --- a/wezterm-font/Cargo.toml +++ b/wezterm-font/Cargo.toml @@ -28,7 +28,7 @@ lazy_static = "1.4" lfucache = { path = "../lfucache" } log = "0.4" memmap2 = "0.2" -metrics = { version="0.17", features=["std"]} +metrics = "0.21" ordered-float = "4.1" rangeset = { path = "../rangeset" } termwiz = { path = "../termwiz" } diff --git a/wezterm-gui/Cargo.toml b/wezterm-gui/Cargo.toml index e0dd3e0ce..6c6b91771 100644 --- a/wezterm-gui/Cargo.toml +++ b/wezterm-gui/Cargo.toml @@ -62,7 +62,7 @@ libc = "0.2" lfucache = { path = "../lfucache" } log = "0.4" luahelper = { path = "../luahelper" } -metrics = { version="0.17", features=["std"]} +metrics = "0.21" mlua = {version="0.9", features=["send"]} mux = { path = "../mux" } mux-lua = { path = "../lua-api-crates/mux" } diff --git a/wezterm-gui/src/stats.rs b/wezterm-gui/src/stats.rs index b046986fc..ee48b9cd1 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, 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!(); @@ -226,54 +298,59 @@ impl Stats { } 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) -> 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) -> 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) -> 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 +360,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 +372,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 +392,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 +415,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/window/Cargo.toml b/window/Cargo.toml index 580c6d7aa..1a96033cb 100644 --- a/window/Cargo.toml +++ b/window/Cargo.toml @@ -34,7 +34,7 @@ lazy_static = "1.4" libloading = "0.6" line_drawing = "0.8" log = "0.4" -metrics = { version="0.17", features=["std"]} +metrics = "0.21" promise = { path = "../promise" } raw-window-handle = "0.5" resize = "0.5" From 6c890c3995bac2131c427f140028a0b3b4e4bd74 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Mon, 13 May 2024 09:29:54 -0700 Subject: [PATCH 105/140] update metrics to latest version (0.22) --- Cargo.lock | 16 ++-------- codec/Cargo.toml | 2 +- codec/src/lib.rs | 32 +++++++++---------- lfucache/Cargo.toml | 2 +- lfucache/src/lib.rs | 4 +-- mux/Cargo.toml | 2 +- mux/src/lib.rs | 9 ++---- wezterm-client/Cargo.toml | 2 +- wezterm-client/src/client.rs | 8 ++--- wezterm-font/Cargo.toml | 2 +- wezterm-font/src/parser.rs | 2 +- wezterm-font/src/shaper/harfbuzz.rs | 2 +- wezterm-gui/Cargo.toml | 2 +- wezterm-gui/src/glyphcache.rs | 4 +-- wezterm-gui/src/quad.rs | 2 +- wezterm-gui/src/stats.rs | 11 +++---- wezterm-gui/src/termwindow/mod.rs | 2 +- wezterm-gui/src/termwindow/render/mod.rs | 2 +- wezterm-gui/src/termwindow/render/paint.rs | 6 ++-- wezterm-gui/src/termwindow/render/pane.rs | 2 +- .../src/termwindow/render/screen_line.rs | 2 +- window/Cargo.toml | 2 +- window/src/bitmaps/atlas.rs | 6 ++-- window/src/spawn.rs | 4 +-- 24 files changed, 56 insertions(+), 72 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1161ee447..f68506a45 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3284,26 +3284,14 @@ dependencies = [ [[package]] name = "metrics" -version = "0.21.1" +version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fde3af1a009ed76a778cb84fdef9e7dbbdf5775ae3e4cc1f434a6a307f6f76c5" +checksum = "2be3cbd384d4e955b231c895ce10685e3d8260c5ccffae898c96c723b0772835" dependencies = [ "ahash", - "metrics-macros", "portable-atomic", ] -[[package]] -name = "metrics-macros" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b4faf00617defe497754acde3024865bc143d44a86799b24e191ecff91354f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.63", -] - [[package]] name = "mime" version = "0.3.17" diff --git a/codec/Cargo.toml b/codec/Cargo.toml index 9347bb5c3..326ade547 100644 --- a/codec/Cargo.toml +++ b/codec/Cargo.toml @@ -12,7 +12,7 @@ anyhow = "1.0" config = { path = "../config" } leb128 = "0.2" log = "0.4" -metrics = "0.21" +metrics = "0.22" mux = { path = "../mux" } portable-pty = { path = "../pty", features = ["serde_support"]} rangeset = { path = "../rangeset" } diff --git a/codec/src/lib.rs b/codec/src/lib.rs index 164b033e1..1f200d877 100644 --- a/codec/src/lib.rs +++ b/codec/src/lib.rs @@ -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) @@ -211,9 +211,9 @@ async fn decode_raw_async( }; 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]; @@ -259,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]; @@ -350,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(()) } ,)* @@ -366,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(()) } ,)* @@ -390,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)?) @@ -399,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} @@ -418,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)?) @@ -426,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} diff --git a/lfucache/Cargo.toml b/lfucache/Cargo.toml index 6aebc2350..95bd4bf2a 100644 --- a/lfucache/Cargo.toml +++ b/lfucache/Cargo.toml @@ -11,7 +11,7 @@ ahash = "0.8" config = { path = "../config" } fnv = "1.0" intrusive-collections = "0.9" -metrics = "0.21" +metrics = "0.22" [dev-dependencies] 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, 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 => { @@ -135,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) { @@ -323,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!( diff --git a/wezterm-client/Cargo.toml b/wezterm-client/Cargo.toml index 9ed0f26f2..c32f1de39 100644 --- a/wezterm-client/Cargo.toml +++ b/wezterm-client/Cargo.toml @@ -19,7 +19,7 @@ lazy_static = "1.4" log = "0.4" libc = "0.2" lru = "0.12" -metrics = "0.21" +metrics = "0.22" mux = { path = "../mux" } openssl = "0.10.57" parking_lot = "0.12" diff --git a/wezterm-client/src/client.rs b/wezterm-client/src/client.rs index 7d43934d3..6148450ae 100644 --- a/wezterm-client/src/client.rs +++ b/wezterm-client/src/client.rs @@ -79,8 +79,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), @@ -98,8 +98,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), diff --git a/wezterm-font/Cargo.toml b/wezterm-font/Cargo.toml index 0cd073ece..99ea229b6 100644 --- a/wezterm-font/Cargo.toml +++ b/wezterm-font/Cargo.toml @@ -28,7 +28,7 @@ lazy_static = "1.4" lfucache = { path = "../lfucache" } log = "0.4" memmap2 = "0.2" -metrics = "0.21" +metrics = "0.22" ordered-float = "4.1" rangeset = { path = "../rangeset" } termwiz = { path = "../termwiz" } 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/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/Cargo.toml b/wezterm-gui/Cargo.toml index 6c6b91771..a99f6fe3b 100644 --- a/wezterm-gui/Cargo.toml +++ b/wezterm-gui/Cargo.toml @@ -62,7 +62,7 @@ libc = "0.2" lfucache = { path = "../lfucache" } log = "0.4" luahelper = { path = "../luahelper" } -metrics = "0.21" +metrics = "0.22" mlua = {version="0.9", features=["send"]} mux = { path = "../mux" } mux-lua = { path = "../lua-api-crates/mux" } diff --git a/wezterm-gui/src/glyphcache.rs b/wezterm-gui/src/glyphcache.rs index 2925d5a14..535a0eb27 100644 --- a/wezterm-gui/src/glyphcache.rs +++ b/wezterm-gui/src/glyphcache.rs @@ -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/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 ee48b9cd1..f518b9dbd 100644 --- a/wezterm-gui/src/stats.rs +++ b/wezterm-gui/src/stats.rs @@ -2,7 +2,7 @@ use config::configuration; use config::lua::get_or_create_sub_module; use config::lua::mlua::Lua; use hdrhistogram::Histogram; -use metrics::{Counter, Gauge, Key, KeyName, Recorder, SharedString, Unit}; +use metrics::{Counter, Gauge, Key, KeyName, Metadata, Recorder, SharedString, Unit}; use parking_lot::Mutex; use std::collections::HashMap; use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; @@ -291,8 +291,7 @@ 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)) } } @@ -304,7 +303,7 @@ impl Recorder for Stats { fn describe_histogram(&self, _key: KeyName, _unit: Option, _description: SharedString) {} - fn register_counter(&self, key: &Key) -> Counter { + 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()), @@ -318,11 +317,11 @@ impl Recorder for Stats { } } - fn register_gauge(&self, _key: &Key) -> Gauge { + fn register_gauge(&self, _key: &Key, _metadata: &Metadata) -> Gauge { Gauge::noop() } - fn register_histogram(&self, key: &Key) -> metrics::Histogram { + fn register_histogram(&self, key: &Key, _metadata: &Metadata) -> metrics::Histogram { let mut inner = self.inner.lock(); if key.name().ends_with(".rate") { match inner.throughput.get(key) { diff --git a/wezterm-gui/src/termwindow/mod.rs b/wezterm-gui/src/termwindow/mod.rs index 0ba025e42..71ece24c2 100644 --- a/wezterm-gui/src/termwindow/mod.rs +++ b/wezterm-gui/src/termwindow/mod.rs @@ -1423,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/window/Cargo.toml b/window/Cargo.toml index 1a96033cb..689168772 100644 --- a/window/Cargo.toml +++ b/window/Cargo.toml @@ -34,7 +34,7 @@ lazy_static = "1.4" libloading = "0.6" line_drawing = "0.8" log = "0.4" -metrics = "0.21" +metrics = "0.22" promise = { path = "../promise" } raw-window-handle = "0.5" resize = "0.5" 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/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 From c6ffe92853b7f88d923ee08a180353b7525b6be4 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Mon, 13 May 2024 09:45:45 -0700 Subject: [PATCH 106/140] deps: remove a duplicate version of libloading --- Cargo.lock | 12 +----------- window/Cargo.toml | 2 +- window/src/egl.rs | 2 +- 3 files changed, 3 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f68506a45..15fe4423d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2949,16 +2949,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" @@ -7023,7 +7013,7 @@ dependencies = [ "k9", "lazy_static", "libc", - "libloading 0.6.7", + "libloading 0.8.3", "line_drawing", "log", "metrics", diff --git a/window/Cargo.toml b/window/Cargo.toml index 689168772..a5ca48ae1 100644 --- a/window/Cargo.toml +++ b/window/Cargo.toml @@ -31,7 +31,7 @@ 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 = "0.22" 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) => { From 421ce4f0e11aff7b2403ebd53101d73c254624c2 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Mon, 13 May 2024 09:56:11 -0700 Subject: [PATCH 107/140] deps: update zbus --- Cargo.lock | 116 +++++++++++++++---------- wezterm-toast-notification/Cargo.toml | 4 +- wezterm-toast-notification/src/dbus.rs | 12 +-- window/Cargo.toml | 4 +- window/src/os/xdg_desktop_portal.rs | 16 ++-- 5 files changed, 87 insertions(+), 65 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 15fe4423d..5547cec6a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -194,12 +194,14 @@ 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", + "event-listener 5.3.0", + "event-listener-strategy 0.5.2", "futures-core", + "pin-project-lite", ] [[package]] @@ -251,6 +253,17 @@ dependencies = [ "futures-lite 1.13.0", ] +[[package]] +name = "async-fs" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" +dependencies = [ + "async-lock 3.3.0", + "blocking", + "futures-lite 2.3.0", +] + [[package]] name = "async-io" version = "1.13.0" @@ -338,6 +351,26 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "async-process" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a53fc6301894e04a92cb2584fedde80cb25ba8e02d9dc39d4a87d036e22f397d" +dependencies = [ + "async-channel 2.3.0", + "async-io 2.3.2", + "async-lock 3.3.0", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener 5.3.0", + "futures-lite 2.3.0", + "rustix 0.38.34", + "tracing", + "windows-sys 0.52.0", +] + [[package]] name = "async-recursion" version = "1.1.1" @@ -1317,17 +1350,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" @@ -1479,6 +1501,12 @@ 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" @@ -4241,12 +4269,11 @@ 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]] @@ -5176,11 +5203,11 @@ checksum = "13f2b548cd8447f8de0fdf1c592929f70f4fc7039a05e47404b0d096ec6987a1" dependencies = [ "async-channel 1.9.0", "async-executor", - "async-fs", + "async-fs 1.6.0", "async-io 1.13.0", "async-lock 2.8.0", "async-net", - "async-process", + "async-process 1.8.1", "blocking", "futures-lite 1.13.0", ] @@ -5855,9 +5882,9 @@ dependencies = [ [[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", @@ -7494,30 +7521,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-process", + "async-fs 2.1.2", + "async-io 2.3.2", + "async-lock 3.3.0", + "async-process 2.2.2", "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 0.28.0", "ordered-stream", "rand", "serde", @@ -7526,7 +7550,7 @@ dependencies = [ "static_assertions", "tracing", "uds_windows", - "winapi", + "windows-sys 0.52.0", "xdg-home", "zbus_macros", "zbus_names", @@ -7535,23 +7559,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", @@ -7633,13 +7656,12 @@ dependencies = [ [[package]] name = "zvariant" -version = "3.15.2" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eef2be88ba09b358d3b58aca6e41cd853631d44787f319a1383ca83424fb2db" +checksum = "877ef94e5e82b231d2a309c531f191a8152baba8241a7939ee04bd76b0171308" dependencies = [ - "byteorder", + "endi", "enumflags2", - "libc", "serde", "static_assertions", "zvariant_derive", @@ -7647,9 +7669,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", @@ -7660,9 +7682,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/wezterm-toast-notification/Cargo.toml b/wezterm-toast-notification/Cargo.toml index 21f40e9b1..942f85bb8 100644 --- a/wezterm-toast-notification/Cargo.toml +++ b/wezterm-toast-notification/Cargo.toml @@ -14,8 +14,8 @@ 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" +zbus = "4.2" +zvariant = "4.0" async-io = "1.10" futures-util = "0.3" diff --git a/wezterm-toast-notification/src/dbus.rs b/wezterm-toast-notification/src/dbus.rs index d00f034d2..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 diff --git a/window/Cargo.toml b/window/Cargo.toml index a5ca48ae1..2cb5330fe 100644 --- a/window/Cargo.toml +++ b/window/Cargo.toml @@ -78,8 +78,8 @@ 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="358e226573461fe540efb920e2aad740e3c6fab1"} -zbus = "3.14" -zvariant = "3.15" +zbus = "4.2" +zvariant = "4.0" smithay-client-toolkit = {version = "0.18", default-features=false, optional=true} wayland-protocols = {version="0.31", optional=true} 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:#?}" ); } }) From 1ca5e6cc90467d5e8195a02f08314faa04ab8c50 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Mon, 13 May 2024 10:01:35 -0700 Subject: [PATCH 108/140] deps: upgrade smol to 2.0 --- Cargo.lock | 94 ++++++------------------- async_ossl/Cargo.toml | 3 + async_ossl/src/lib.rs | 9 +++ codec/Cargo.toml | 2 +- config/Cargo.toml | 2 +- filedescriptor/src/unix.rs | 12 ++++ lua-api-crates/filesystem/Cargo.toml | 2 +- lua-api-crates/mux/Cargo.toml | 2 +- lua-api-crates/spawn-funcs/Cargo.toml | 2 +- lua-api-crates/time-funcs/Cargo.toml | 2 +- mux/Cargo.toml | 2 +- promise/Cargo.toml | 6 +- pty/Cargo.toml | 2 +- wezterm-client/Cargo.toml | 3 +- wezterm-client/src/client.rs | 10 +++ wezterm-gui/Cargo.toml | 2 +- wezterm-mux-server-impl/Cargo.toml | 3 +- wezterm-mux-server-impl/src/dispatch.rs | 4 +- wezterm-ssh/Cargo.toml | 2 +- wezterm-toast-notification/Cargo.toml | 2 +- wezterm/Cargo.toml | 2 +- window/Cargo.toml | 6 +- 22 files changed, 82 insertions(+), 92 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5547cec6a..8138dace8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -204,17 +204,6 @@ dependencies = [ "pin-project-lite", ] -[[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.3.0" @@ -241,18 +230,6 @@ dependencies = [ "slab", ] -[[package]] -name = "async-fs" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06" -dependencies = [ - "async-lock 2.8.0", - "autocfg", - "blocking", - "futures-lite 1.13.0", -] - [[package]] name = "async-fs" version = "2.1.2" @@ -325,30 +302,13 @@ 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 2.3.2", "blocking", - "futures-lite 1.13.0", -] - -[[package]] -name = "async-process" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6438ba0a08d81529c69b36700fa2f95837bfe3e776ab39cde9c14d9149da88" -dependencies = [ - "async-io 1.13.0", - "async-lock 2.8.0", - "async-signal", - "blocking", - "cfg-if", - "event-listener 3.1.0", - "futures-lite 1.13.0", - "rustix 0.38.34", - "windows-sys 0.48.0", + "futures-lite 2.3.0", ] [[package]] @@ -357,7 +317,7 @@ version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a53fc6301894e04a92cb2584fedde80cb25ba8e02d9dc39d4a87d036e22f397d" dependencies = [ - "async-channel 2.3.0", + "async-channel", "async-io 2.3.2", "async-lock 3.3.0", "async-signal", @@ -421,6 +381,7 @@ dependencies = [ name = "async_ossl" version = "0.1.0" dependencies = [ + "async-io 2.3.2", "openssl", ] @@ -592,7 +553,7 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "495f7104e962b7356f0aeb34247aca1fe7d2e783b346582db7f2904cb5717e88" dependencies = [ - "async-channel 2.3.0", + "async-channel", "async-lock 3.3.0", "async-task", "futures-io", @@ -1639,17 +1600,6 @@ 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" @@ -4334,7 +4284,7 @@ version = "0.2.0" dependencies = [ "anyhow", "async-executor", - "async-io 1.13.0", + "async-io 2.3.2", "async-task", "flume 0.10.14", "lazy_static", @@ -5197,19 +5147,19 @@ dependencies = [ [[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 1.6.0", - "async-io 1.13.0", - "async-lock 2.8.0", + "async-fs", + "async-io 2.3.2", + "async-lock 3.3.0", "async-net", - "async-process 1.8.1", + "async-process", "blocking", - "futures-lite 1.13.0", + "futures-lite 2.3.0", ] [[package]] @@ -6479,6 +6429,7 @@ name = "wezterm-client" version = "0.1.0" dependencies = [ "anyhow", + "async-io 2.3.2", "async-trait", "async_ossl", "codec", @@ -6731,6 +6682,7 @@ name = "wezterm-mux-server-impl" version = "0.1.0" dependencies = [ "anyhow", + "async-io 2.3.2", "async_ossl", "codec", "config", @@ -6828,7 +6780,7 @@ dependencies = [ name = "wezterm-toast-notification" version = "0.1.0" dependencies = [ - "async-io 1.13.0", + "async-io 2.3.2", "cocoa 0.20.2", "core-foundation 0.7.0", "futures-util", @@ -7016,8 +6968,8 @@ name = "window" version = "0.1.0" dependencies = [ "anyhow", - "async-channel 1.9.0", - "async-io 1.13.0", + "async-channel", + "async-io 2.3.2", "async-task", "async-trait", "bitflags 1.3.2", @@ -7527,10 +7479,10 @@ checksum = "e5915716dff34abef1351d2b10305b019c8ef33dcf6c72d31a6e227d5d9d7a21" dependencies = [ "async-broadcast", "async-executor", - "async-fs 2.1.2", + "async-fs", "async-io 2.3.2", "async-lock 3.3.0", - "async-process 2.2.2", + "async-process", "async-recursion", "async-task", "async-trait", diff --git a/async_ossl/Cargo.toml b/async_ossl/Cargo.toml index e5d77c319..bd7d81b07 100644 --- a/async_ossl/Cargo.toml +++ b/async_ossl/Cargo.toml @@ -8,6 +8,9 @@ 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..47f23c14c 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 { diff --git a/codec/Cargo.toml b/codec/Cargo.toml index 326ade547..5472a9a87 100644 --- a/codec/Cargo.toml +++ b/codec/Cargo.toml @@ -17,7 +17,7 @@ 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/config/Cargo.toml b/config/Cargo.toml index 0adefcc92..5ac9f79a3 100644 --- a/config/Cargo.toml +++ b/config/Cargo.toml @@ -34,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" } 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/lua-api-crates/filesystem/Cargo.toml b/lua-api-crates/filesystem/Cargo.toml index fbbebbc9e..cc07bb425 100644 --- a/lua-api-crates/filesystem/Cargo.toml +++ b/lua-api-crates/filesystem/Cargo.toml @@ -11,4 +11,4 @@ filenamegen = "0.2" anyhow = "1.0" config = { path = "../../config" } luahelper = { path = "../../luahelper" } -smol = "1.2" +smol = "2.0" diff --git a/lua-api-crates/mux/Cargo.toml b/lua-api-crates/mux/Cargo.toml index 8595760a5..2cdb349d5 100644 --- a/lua-api-crates/mux/Cargo.toml +++ b/lua-api-crates/mux/Cargo.toml @@ -16,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/spawn-funcs/Cargo.toml b/lua-api-crates/spawn-funcs/Cargo.toml index f8aef21be..4655c08ba 100644 --- a/lua-api-crates/spawn-funcs/Cargo.toml +++ b/lua-api-crates/spawn-funcs/Cargo.toml @@ -12,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/time-funcs/Cargo.toml b/lua-api-crates/time-funcs/Cargo.toml index d95cc5cd8..407c30a24 100644 --- a/lua-api-crates/time-funcs/Cargo.toml +++ b/lua-api-crates/time-funcs/Cargo.toml @@ -13,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/mux/Cargo.toml b/mux/Cargo.toml index 68fe6f289..5ca45a6e8 100644 --- a/mux/Cargo.toml +++ b/mux/Cargo.toml @@ -38,7 +38,7 @@ rangeset = { path = "../rangeset" } serde = {version="1.0", features = ["rc", "derive"]} serial = "0.4" shell-words = "1.1" -smol = "1.2" +smol = "2.0" terminfo = "0.8" termwiz = { path = "../termwiz" } termwiz-funcs = { path = "../lua-api-crates/termwiz-funcs" } diff --git a/promise/Cargo.toml b/promise/Cargo.toml index 67639b085..06df0b229 100644 --- a/promise/Cargo.toml +++ b/promise/Cargo.toml @@ -6,9 +6,9 @@ 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" diff --git a/pty/Cargo.toml b/pty/Cargo.toml index 2e717483e..8da92c3d8 100644 --- a/pty/Cargo.toml +++ b/pty/Cargo.toml @@ -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/wezterm-client/Cargo.toml b/wezterm-client/Cargo.toml index c32f1de39..48f189ddc 100644 --- a/wezterm-client/Cargo.toml +++ b/wezterm-client/Cargo.toml @@ -11,6 +11,7 @@ publish = false 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" } @@ -27,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" diff --git a/wezterm-client/src/client.rs b/wezterm-client/src/client.rs index 6148450ae..0cd461974 100644 --- a/wezterm-client/src/client.rs +++ b/wezterm-client/src/client.rs @@ -524,6 +524,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?) @@ -542,12 +543,21 @@ 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 {{...}}") } } +#[cfg(unix)] +impl std::os::fd::AsFd for SshStream { + fn as_fd(&self) -> std::os::fd::BorrowedFd { + self.stdout.as_fd() + } +} + #[cfg(unix)] impl std::os::unix::io::AsRawFd for SshStream { fn as_raw_fd(&self) -> std::os::unix::io::RawFd { diff --git a/wezterm-gui/Cargo.toml b/wezterm-gui/Cargo.toml index a99f6fe3b..e2b512a6c 100644 --- a/wezterm-gui/Cargo.toml +++ b/wezterm-gui/Cargo.toml @@ -78,7 +78,7 @@ 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" diff --git a/wezterm-mux-server-impl/Cargo.toml b/wezterm-mux-server-impl/Cargo.toml index 225c8d472..8fbdd43bf 100644 --- a/wezterm-mux-server-impl/Cargo.toml +++ b/wezterm-mux-server-impl/Cargo.toml @@ -10,6 +10,7 @@ publish = false [dependencies] anyhow = "1.0" async_ossl = { path = "../async_ossl" } +async-io = "2.3" codec = { path = "../codec" } config = { path = "../config" } futures = "0.3" @@ -21,7 +22,7 @@ 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"] } diff --git a/wezterm-mux-server-impl/src/dispatch.rs b/wezterm-mux-server-impl/src/dispatch.rs index da3b5b502..7b3109753 100644 --- a/wezterm-mux-server-impl/src/dispatch.rs +++ b/wezterm-mux-server-impl/src/dispatch.rs @@ -9,7 +9,7 @@ use smol::prelude::*; use smol::Async; #[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 {} @@ -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-ssh/Cargo.toml b/wezterm-ssh/Cargo.toml index da47f7c7d..82c01cd38 100644 --- a/wezterm-ssh/Cargo.toml +++ b/wezterm-ssh/Cargo.toml @@ -29,7 +29,7 @@ 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.3.2", features=["vendored"], optional = true} #libssh-rs = {path="../../libssh-rs/libssh-rs", features=["vendored"], optional = true} diff --git a/wezterm-toast-notification/Cargo.toml b/wezterm-toast-notification/Cargo.toml index 942f85bb8..d697019f9 100644 --- a/wezterm-toast-notification/Cargo.toml +++ b/wezterm-toast-notification/Cargo.toml @@ -16,7 +16,7 @@ log = "0.4" serde = {version="1.0", features = ["derive"]} zbus = "4.2" zvariant = "4.0" -async-io = "1.10" +async-io = "2.3" futures-util = "0.3" [target.'cfg(target_os="macos")'.dependencies] diff --git a/wezterm/Cargo.toml b/wezterm/Cargo.toml index a64bbf9e4..4ebe6d762 100644 --- a/wezterm/Cargo.toml +++ b/wezterm/Cargo.toml @@ -28,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/window/Cargo.toml b/window/Cargo.toml index 2cb5330fe..4cbf86c14 100644 --- a/window/Cargo.toml +++ b/window/Cargo.toml @@ -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" From 70c4e037500c3f4ae400fe9e0e8bf75eeaecdd82 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Mon, 13 May 2024 10:29:12 -0700 Subject: [PATCH 109/140] deps: update flume --- Cargo.lock | 20 +++----------------- mux/Cargo.toml | 1 - promise/Cargo.toml | 2 +- 3 files changed, 4 insertions(+), 19 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8138dace8..e0fd65aa8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1649,7 +1649,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "887d93f60543e9a9362ef8a21beedd0a833c5d9610e18c67abe15a5963dcb1a4" dependencies = [ "bit_field", - "flume 0.11.0", + "flume", "half", "lebe", "miniz_oxide 0.7.2", @@ -1791,19 +1791,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" @@ -3353,7 +3340,6 @@ dependencies = [ "fancy-regex", "filedescriptor", "finl_unicode", - "flume 0.10.14", "hostname", "k9", "lazy_static", @@ -4286,7 +4272,7 @@ dependencies = [ "async-executor", "async-io 2.3.2", "async-task", - "flume 0.10.14", + "flume", "lazy_static", "thiserror", ] @@ -6809,7 +6795,7 @@ checksum = "30e7d227c9f961f2061c26f4cb0fbd4df0ef37e056edd0931783599d6c94ef24" dependencies = [ "arrayvec", "cfg-if", - "flume 0.11.0", + "flume", "js-sys", "log", "naga", diff --git a/mux/Cargo.toml b/mux/Cargo.toml index 5ca45a6e8..8083df507 100644 --- a/mux/Cargo.toml +++ b/mux/Cargo.toml @@ -48,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" diff --git a/promise/Cargo.toml b/promise/Cargo.toml index 06df0b229..a556d3245 100644 --- a/promise/Cargo.toml +++ b/promise/Cargo.toml @@ -12,4 +12,4 @@ async-io = "2.3" anyhow = "1.0" thiserror = "1.0" lazy_static = "1.4" -flume = "0.10" +flume = "0.11" From 944e0b29b60ce882df95553841b623fd0d271551 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Mon, 13 May 2024 11:05:02 -0700 Subject: [PATCH 110/140] deps: update to new filenamegen --- Cargo.lock | 43 +++++++++------------------- lua-api-crates/filesystem/Cargo.toml | 2 +- wezterm-ssh/Cargo.toml | 2 +- 3 files changed, 15 insertions(+), 32 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e0fd65aa8..1327dc7a2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -561,17 +561,6 @@ dependencies = [ "piper", ] -[[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]] name = "bstr" version = "1.9.1" @@ -579,7 +568,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05efc5cfd9110c8416e471df0e96702d58690178e206e61b7173706673c93706" dependencies = [ "memchr", - "regex-automata 0.4.6", + "regex-automata", "serde", ] @@ -597,9 +586,9 @@ 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", ] @@ -1715,12 +1704,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", ] @@ -2137,9 +2126,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", ] @@ -2558,7 +2547,7 @@ dependencies = [ "globset", "log", "memchr", - "regex-automata 0.4.6", + "regex-automata", "same-file", "walkdir", "winapi-util", @@ -3096,7 +3085,7 @@ dependencies = [ name = "luahelper" version = "0.1.0" dependencies = [ - "bstr 1.9.1", + "bstr", "log", "mlua", "wezterm-dynamic", @@ -3303,7 +3292,7 @@ version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d9bed6bce296397a9d6a86f995dd10a547a4e6949825d45225906bdcbfe7367" dependencies = [ - "bstr 1.9.1", + "bstr", "futures-util", "mlua-sys", "num-traits", @@ -4513,16 +4502,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" @@ -5203,7 +5186,7 @@ name = "spawn-funcs" version = "0.1.0" dependencies = [ "anyhow", - "bstr 1.9.1", + "bstr", "config", "log", "luahelper", diff --git a/lua-api-crates/filesystem/Cargo.toml b/lua-api-crates/filesystem/Cargo.toml index cc07bb425..ac3192879 100644 --- a/lua-api-crates/filesystem/Cargo.toml +++ b/lua-api-crates/filesystem/Cargo.toml @@ -7,7 +7,7 @@ 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" } diff --git a/wezterm-ssh/Cargo.toml b/wezterm-ssh/Cargo.toml index 82c01cd38..50f7c4ec7 100644 --- a/wezterm-ssh/Cargo.toml +++ b/wezterm-ssh/Cargo.toml @@ -23,7 +23,7 @@ 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" From 6ad0da98d8371d34dfa6c8018ae4a022ecdc6470 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Mon, 13 May 2024 11:43:10 -0700 Subject: [PATCH 111/140] deps: remove smol-potat, update futures-lite smol-potat hasn't had updates in 4 years and was bifurcating some big deps. It wasn't necessary; it was trivially easy to replace with smol::block_on with no meaningful increase in boilerplate, and the result is much more understandable in purpose and effect. --- Cargo.lock | 183 +-- wezterm-ssh/Cargo.toml | 1 - wezterm-ssh/tests/e2e/agent_forward.rs | 52 +- wezterm-ssh/tests/e2e/sftp.rs | 1531 ++++++++++++------------ wezterm-ssh/tests/e2e/sftp/file.rs | 278 ++--- window/Cargo.toml | 2 +- 6 files changed, 984 insertions(+), 1063 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1327dc7a2..5c5002980 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -225,8 +225,8 @@ checksum = "b10202063978b3351199d68f8b22c4e47e4b1b822f8d43fd862d5ea8c006b29a" dependencies = [ "async-task", "concurrent-queue", - "fastrand 2.1.0", - "futures-lite 2.3.0", + "fastrand", + "futures-lite", "slab", ] @@ -236,29 +236,9 @@ version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" dependencies = [ - "async-lock 3.3.0", + "async-lock", "blocking", - "futures-lite 2.3.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]] @@ -267,28 +247,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.7.0", + "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" @@ -306,9 +277,9 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b948000fad4873c1c9339d60f2623323a0cfd3816e5181033c6a5cb68b2accf7" dependencies = [ - "async-io 2.3.2", + "async-io", "blocking", - "futures-lite 2.3.0", + "futures-lite", ] [[package]] @@ -318,14 +289,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a53fc6301894e04a92cb2584fedde80cb25ba8e02d9dc39d4a87d036e22f397d" dependencies = [ "async-channel", - "async-io 2.3.2", - "async-lock 3.3.0", + "async-io", + "async-lock", "async-signal", "async-task", "blocking", "cfg-if", "event-listener 5.3.0", - "futures-lite 2.3.0", + "futures-lite", "rustix 0.38.34", "tracing", "windows-sys 0.52.0", @@ -348,8 +319,8 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afe66191c335039c7bb78f99dc7520b0cbb166b3a1cb33a03f53d8a1c6f2afda" dependencies = [ - "async-io 2.3.2", - "async-lock 3.3.0", + "async-io", + "async-lock", "atomic-waker", "cfg-if", "futures-core", @@ -381,7 +352,7 @@ dependencies = [ name = "async_ossl" version = "0.1.0" dependencies = [ - "async-io 2.3.2", + "async-io", "openssl", ] @@ -554,10 +525,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "495f7104e962b7356f0aeb34247aca1fe7d2e783b346582db7f2904cb5717e88" dependencies = [ "async-channel", - "async-lock 3.3.0", + "async-lock", "async-task", "futures-io", - "futures-lite 2.3.0", + "futures-lite", "piper", ] @@ -1583,12 +1554,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 = "4.0.3" @@ -1669,15 +1634,6 @@ dependencies = [ "regex", ] -[[package]] -name = "fastrand" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] - [[package]] name = "fastrand" version = "2.1.0" @@ -1932,28 +1888,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.1.0", + "fastrand", "futures-core", "futures-io", "parking", @@ -2491,7 +2432,7 @@ dependencies = [ "http-body", "hyper", "pin-project-lite", - "socket2 0.5.7", + "socket2", "tokio", "tower", "tower-service", @@ -4006,7 +3947,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "464db0c665917b13ebb5d453ccdec4add5658ee1adc7affc7677615356a8afaf" dependencies = [ "atomic-waker", - "fastrand 2.1.0", + "fastrand", "futures-io", ] @@ -4084,22 +4025,6 @@ dependencies = [ "miniz_oxide 0.7.2", ] -[[package]] -name = "polling" -version = "2.8.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.7.0" @@ -4259,7 +4184,7 @@ version = "0.2.0" dependencies = [ "anyhow", "async-executor", - "async-io 2.3.2", + "async-io", "async-task", "flume", "lazy_static", @@ -5123,43 +5048,12 @@ dependencies = [ "async-channel", "async-executor", "async-fs", - "async-io 2.3.2", - "async-lock 3.3.0", + "async-io", + "async-lock", "async-net", "async-process", "blocking", - "futures-lite 2.3.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", -] - -[[package]] -name = "socket2" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" -dependencies = [ - "libc", - "winapi", + "futures-lite", ] [[package]] @@ -5427,7 +5321,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" dependencies = [ "cfg-if", - "fastrand 2.1.0", + "fastrand", "rustix 0.38.34", "windows-sys 0.52.0", ] @@ -5730,7 +5624,7 @@ dependencies = [ "mio", "num_cpus", "pin-project-lite", - "socket2 0.5.7", + "socket2", "tokio-macros", "windows-sys 0.48.0", ] @@ -6104,12 +5998,6 @@ dependencies = [ "utf8parse", ] -[[package]] -name = "waker-fn" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" - [[package]] name = "walkdir" version = "2.5.0" @@ -6398,7 +6286,7 @@ name = "wezterm-client" version = "0.1.0" dependencies = [ "anyhow", - "async-io 2.3.2", + "async-io", "async-trait", "async_ossl", "codec", @@ -6533,7 +6421,7 @@ dependencies = [ "env-bootstrap", "env_logger 0.11.3", "euclid", - "fastrand 2.1.0", + "fastrand", "filedescriptor", "finl_unicode", "frecency", @@ -6651,7 +6539,7 @@ name = "wezterm-mux-server-impl" version = "0.1.0" dependencies = [ "anyhow", - "async-io 2.3.2", + "async-io", "async_ossl", "codec", "config", @@ -6707,8 +6595,7 @@ dependencies = [ "rstest", "shell-words", "smol", - "smol-potat", - "socket2 0.5.7", + "socket2", "ssh2", "termwiz", "thiserror", @@ -6749,7 +6636,7 @@ dependencies = [ name = "wezterm-toast-notification" version = "0.1.0" dependencies = [ - "async-io 2.3.2", + "async-io", "cocoa 0.20.2", "core-foundation 0.7.0", "futures-util", @@ -6938,7 +6825,7 @@ version = "0.1.0" dependencies = [ "anyhow", "async-channel", - "async-io 2.3.2", + "async-io", "async-task", "async-trait", "bitflags 1.3.2", @@ -6953,7 +6840,7 @@ dependencies = [ "downcast-rs", "euclid", "filedescriptor", - "futures-lite 1.13.0", + "futures-lite", "futures-util", "gl_generator", "glium", @@ -7449,8 +7336,8 @@ dependencies = [ "async-broadcast", "async-executor", "async-fs", - "async-io 2.3.2", - "async-lock 3.3.0", + "async-io", + "async-lock", "async-process", "async-recursion", "async-task", diff --git a/wezterm-ssh/Cargo.toml b/wezterm-ssh/Cargo.toml index 50f7c4ec7..cfc42f076 100644 --- a/wezterm-ssh/Cargo.toml +++ b/wezterm-ssh/Cargo.toml @@ -49,6 +49,5 @@ predicates = "3.0" env_logger = "0.11" 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/tests/e2e/agent_forward.rs b/wezterm-ssh/tests/e2e/agent_forward.rs index 2af6cfd02..832a8b9dd 100644 --- a/wezterm-ssh/tests/e2e/agent_forward.rs +++ b/wezterm-ssh/tests/e2e/agent_forward.rs @@ -14,40 +14,42 @@ async fn session_with_agent_forward( } #[rstest] -#[smol_potat::test] #[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] #[cfg_attr(not(feature = "libssh-rs"), ignore)] -async fn ssh_add_should_be_able_to_list_identities_with_agent_forward( +fn ssh_add_should_be_able_to_list_identities_with_agent_forward( #[future] session_with_agent_forward: SessionWithSshd, ) { - let session: SessionWithSshd = session_with_agent_forward.await; + 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"); + 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] -#[smol_potat::test] #[cfg_attr(not(any(target_os = "macos", target_os = "linux")), ignore)] #[cfg_attr(not(feature = "libssh-rs"), ignore)] -async fn no_agent_forward_should_happen_when_disabled(#[future] session: SessionWithSshd) { - let session: SessionWithSshd = session.await; +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" - ); + 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/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/window/Cargo.toml b/window/Cargo.toml index 4cbf86c14..dcfe914f6 100644 --- a/window/Cargo.toml +++ b/window/Cargo.toml @@ -71,7 +71,7 @@ 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"] } From 90822d64a343489862dae598e37768f12a933438 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Mon, 13 May 2024 11:45:47 -0700 Subject: [PATCH 112/140] deps: remove duplicate memmap2 --- Cargo.lock | 11 +---------- wezterm-font/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5c5002980..317fe6940 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3092,15 +3092,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.8.0" @@ -6383,7 +6374,7 @@ dependencies = [ "lazy_static", "lfucache", "log", - "memmap2 0.2.3", + "memmap2 0.9.4", "metrics", "objc", "ordered-float", diff --git a/wezterm-font/Cargo.toml b/wezterm-font/Cargo.toml index 99ea229b6..834868322 100644 --- a/wezterm-font/Cargo.toml +++ b/wezterm-font/Cargo.toml @@ -27,7 +27,7 @@ image = "0.25" lazy_static = "1.4" lfucache = { path = "../lfucache" } log = "0.4" -memmap2 = "0.2" +memmap2 = "0.9" metrics = "0.22" ordered-float = "4.1" rangeset = { path = "../rangeset" } From 84bb2fdc4638586859e43972cfb71efbd33ba9e5 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Mon, 13 May 2024 11:53:27 -0700 Subject: [PATCH 113/140] deps: dedup some nix versions --- Cargo.lock | 67 +++++++-------------------------------- config/Cargo.toml | 2 +- mux/Cargo.toml | 2 +- pty/Cargo.toml | 2 +- pty/src/unix.rs | 3 +- termwiz/Cargo.toml | 2 +- termwiz/src/escape/apc.rs | 5 ++- 7 files changed, 19 insertions(+), 64 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 317fe6940..b17465195 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -944,7 +944,7 @@ dependencies = [ "log", "luahelper", "mlua", - "nix 0.26.4", + "nix", "notify", "once_cell", "ordered-float", @@ -2049,7 +2049,7 @@ dependencies = [ "fnv", "gl_generator", "lazy_static", - "memoffset 0.9.1", + "memoffset", "smallvec", "takeable-option", ] @@ -2600,7 +2600,7 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b694dc9f70c3bda874626d2aed13b780f137aab435f4e9814121955cf706122e" dependencies = [ - "memoffset 0.9.1", + "memoffset", ] [[package]] @@ -3048,7 +3048,7 @@ version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5aa12182b93606fff55b70a5cfe6130eaf7407c2ea4f2c2bcc8b113b67c9928f" dependencies = [ - "nix 0.28.0", + "nix", "winapi", ] @@ -3116,24 +3116,6 @@ 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" @@ -3270,7 +3252,7 @@ dependencies = [ "metrics", "mlua", "names", - "nix 0.25.1", + "nix", "ntapi", "parking_lot 0.12.2", "percent-encoding", @@ -3376,33 +3358,6 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" -[[package]] -name = "nix" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f346ff70e7dbfd675fe90590b92d59ef2de15a8779ae305ebcbfd3f0caf59be4" -dependencies = [ - "autocfg", - "bitflags 1.3.2", - "cfg-if", - "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", -] - [[package]] name = "nix" version = "0.28.0" @@ -3413,7 +3368,7 @@ dependencies = [ "cfg-if", "cfg_aliases", "libc", - "memoffset 0.9.1", + "memoffset", ] [[package]] @@ -4049,7 +4004,7 @@ dependencies = [ "lazy_static", "libc", "log", - "nix 0.25.1", + "nix", "serde", "serde_derive", "serial", @@ -5144,7 +5099,7 @@ dependencies = [ "lazycell", "libc", "mach2", - "nix 0.28.0", + "nix", "num-traits", "uom", "winapi", @@ -5405,7 +5360,7 @@ dependencies = [ "libc", "log", "memmem", - "nix 0.26.4", + "nix", "num-derive 0.3.3", "num-traits", "ordered-float", @@ -5792,7 +5747,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", ] @@ -7340,7 +7295,7 @@ dependencies = [ "futures-sink", "futures-util", "hex", - "nix 0.28.0", + "nix", "ordered-stream", "rand", "serde", diff --git a/config/Cargo.toml b/config/Cargo.toml index 5ac9f79a3..4328da90d 100644 --- a/config/Cargo.toml +++ b/config/Cargo.toml @@ -46,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/mux/Cargo.toml b/mux/Cargo.toml index 8083df507..f34958257 100644 --- a/mux/Cargo.toml +++ b/mux/Cargo.toml @@ -28,7 +28,7 @@ luahelper = { path = "../luahelper" } 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"]} diff --git a/pty/Cargo.toml b/pty/Cargo.toml index 8da92c3d8..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} 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/termwiz/Cargo.toml b/termwiz/Cargo.toml index a9344df99..bf9955bab 100644 --- a/termwiz/Cargo.toml +++ b/termwiz/Cargo.toml @@ -67,7 +67,7 @@ version = "0.3" [target."cfg(unix)".dependencies] signal-hook = "0.3" termios = "0.3" -nix = "0.26" +nix = {version="0.28", features=["mman"]} [target."cfg(windows)".dependencies.winapi] features = [ 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()))?; } From 0f0311777688aa5c9903b86668119aa4529e8701 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Mon, 13 May 2024 11:55:58 -0700 Subject: [PATCH 114/140] deps: update miniz-oxide --- Cargo.lock | 20 +++++--------------- term/Cargo.toml | 2 +- 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b17465195..555abe207 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -413,7 +413,7 @@ dependencies = [ "cc", "cfg-if", "libc", - "miniz_oxide 0.7.2", + "miniz_oxide", "object", "rustc-demangle", ] @@ -1606,7 +1606,7 @@ dependencies = [ "flume", "half", "lebe", - "miniz_oxide 0.7.2", + "miniz_oxide", "rayon-core", "smallvec", "zune-inflate", @@ -1724,7 +1724,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" dependencies = [ "crc32fast", - "miniz_oxide 0.7.2", + "miniz_oxide", ] [[package]] @@ -3162,16 +3162,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" -[[package]] -name = "miniz_oxide" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" -dependencies = [ - "adler", - "autocfg", -] - [[package]] name = "miniz_oxide" version = "0.7.2" @@ -3968,7 +3958,7 @@ dependencies = [ "crc32fast", "fdeflate", "flate2", - "miniz_oxide 0.7.2", + "miniz_oxide", ] [[package]] @@ -6566,7 +6556,7 @@ dependencies = [ "lazy_static", "log", "lru", - "miniz_oxide 0.4.4", + "miniz_oxide", "num-traits", "ordered-float", "serde", diff --git a/term/Cargo.toml b/term/Cargo.toml index 7f75afa0d..c06c6a7c7 100644 --- a/term/Cargo.toml +++ b/term/Cargo.toml @@ -19,7 +19,7 @@ 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.25" From 7af82902312d8e31215eb02111c701f9776bedee Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Mon, 13 May 2024 11:58:52 -0700 Subject: [PATCH 115/140] deps: update/dedup num, num-derive --- Cargo.lock | 54 +++++++++------------------------------------ rangeset/Cargo.toml | 2 +- termwiz/Cargo.toml | 4 +--- 3 files changed, 12 insertions(+), 48 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 555abe207..044e24c1c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -384,7 +384,7 @@ dependencies = [ "arrayvec", "log", "nom", - "num-rational 0.4.2", + "num-rational", "v_frame", ] @@ -3424,26 +3424,15 @@ 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 0.3.3", + "num-bigint", "num-complex", "num-integer", "num-iter", - "num-rational 0.3.2", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6f7833f2cbf2360a6cfd58cd41a53aa7a90bd4c202f5b1c7dd2ed73c57b2c3" -dependencies = [ - "autocfg", - "num-integer", + "num-rational", "num-traits", ] @@ -3459,9 +3448,9 @@ dependencies = [ [[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", ] @@ -3472,17 +3461,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" -[[package]] -name = "num-derive" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "num-derive" version = "0.4.2" @@ -3514,25 +3492,13 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-rational" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" -dependencies = [ - "autocfg", - "num-bigint 0.3.3", - "num-integer", - "num-traits", -] - [[package]] name = "num-rational" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" dependencies = [ - "num-bigint 0.4.5", + "num-bigint", "num-integer", "num-traits", ] @@ -4250,7 +4216,7 @@ dependencies = [ "maybe-rayon", "new_debug_unreachable", "noop_proc_macro", - "num-derive 0.4.2", + "num-derive", "num-traits", "once_cell", "paste", @@ -5351,7 +5317,7 @@ dependencies = [ "log", "memmem", "nix", - "num-derive 0.3.3", + "num-derive", "num-traits", "ordered-float", "pest", diff --git a/rangeset/Cargo.toml b/rangeset/Cargo.toml index b82cface1..1cdd94849 100644 --- a/rangeset/Cargo.toml +++ b/rangeset/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" publish = false [dependencies] -num = "0.3" +num = "0.4" [dev-dependencies] criterion = "0.5" diff --git a/termwiz/Cargo.toml b/termwiz/Cargo.toml index bf9955bab..1d465540e 100644 --- a/termwiz/Cargo.toml +++ b/termwiz/Cargo.toml @@ -27,6 +27,7 @@ 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" @@ -60,9 +61,6 @@ varbincode = "0.1" k9 = "0.12" env_logger = "0.11" -[dependencies.num-derive] -features = ["full-syntax"] -version = "0.3" [target."cfg(unix)".dependencies] signal-hook = "0.3" From 26cd8bebca15322027d127060e504c92f0816c5d Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Mon, 13 May 2024 12:19:56 -0700 Subject: [PATCH 116/140] termwiz deps: update semver --- termwiz/Cargo.toml | 2 +- termwiz/src/caps/mod.rs | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/termwiz/Cargo.toml b/termwiz/Cargo.toml index 1d465540e..b600707c0 100644 --- a/termwiz/Cargo.toml +++ b/termwiz/Cargo.toml @@ -33,7 +33,7 @@ ordered-float = "4.1" pest = "2.1" pest_derive = "2.1" phf = "0.11" -semver = "0.11" +semver = "1.0" serde = {version="1.0", features = ["rc", "derive"], optional=true} siphasher = "0.3" sha2 = "0.10" diff --git a/termwiz/src/caps/mod.rs b/termwiz/src/caps/mod.rs index 964a5551f..cd7bc5d3b 100644 --- a/termwiz/src/caps/mod.rs +++ b/termwiz/src/caps/mod.rs @@ -300,7 +300,9 @@ impl Capabilities { .term_program_version .as_ref() .unwrap_or(&"0.0.0".to_owned()), - ) >= Version::parse("2.9.20150512") + ) + .unwrap_or(Version::new(0, 0, 0)) + >= Version::new(2, 9, 20150512) } Some("WezTerm") => true, _ => false, From 723f062d0d6b9621391f6bd6ff9a5b91ef24c41c Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Mon, 13 May 2024 12:20:09 -0700 Subject: [PATCH 117/140] deps: update strsim --- Cargo.lock | 24 +++--------------------- wezterm-dynamic/Cargo.toml | 2 +- 2 files changed, 4 insertions(+), 22 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 044e24c1c..01586492f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4504,7 +4504,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.23", + "semver", ] [[package]] @@ -4609,30 +4609,12 @@ dependencies = [ "libc", ] -[[package]] -name = "semver" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" -dependencies = [ - "semver-parser", -] - [[package]] name = "semver" version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" -[[package]] -name = "semver-parser" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" -dependencies = [ - "pest", -] - [[package]] name = "serde" version = "1.0.201" @@ -5323,7 +5305,7 @@ dependencies = [ "pest", "pest_derive", "phf", - "semver 0.11.0", + "semver", "serde", "sha2", "signal-hook", @@ -6247,7 +6229,7 @@ dependencies = [ "log", "maplit", "ordered-float", - "strsim 0.10.0", + "strsim 0.11.1", "thiserror", "wezterm-dynamic-derive", ] 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] From de10834b6db7e9b01cde50fe74e1dcb87f0d74a4 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Mon, 13 May 2024 12:22:47 -0700 Subject: [PATCH 118/140] add X11 Qtile to tiling_desktop_environments closes: https://github.com/wez/wezterm/issues/5415 --- config/src/config.rs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/config/src/config.rs b/config/src/config.rs index 49f7248b9..5b099edc7 100644 --- a/config/src/config.rs +++ b/config/src/config.rs @@ -1735,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 { From b07ebd4f09bb737d8ef9c14339b06677520b939f Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Mon, 13 May 2024 12:28:07 -0700 Subject: [PATCH 119/140] termwiz: nix requires fs + mman for shm_open --- termwiz/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/termwiz/Cargo.toml b/termwiz/Cargo.toml index b600707c0..d461307dc 100644 --- a/termwiz/Cargo.toml +++ b/termwiz/Cargo.toml @@ -65,7 +65,7 @@ env_logger = "0.11" [target."cfg(unix)".dependencies] signal-hook = "0.3" termios = "0.3" -nix = {version="0.28", features=["mman"]} +nix = {version="0.28", features=["mman", "fs"]} [target."cfg(windows)".dependencies.winapi] features = [ From 2a068cacb72b99b3d5fdf5f1114955bf0cec70f6 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Mon, 13 May 2024 12:29:19 -0700 Subject: [PATCH 120/140] deps: update terminfo --- Cargo.lock | 25 ++----------------------- lua-api-crates/termwiz-funcs/Cargo.toml | 2 +- mux/Cargo.toml | 2 +- term/Cargo.toml | 2 +- termwiz/Cargo.toml | 2 +- wezterm-gui/Cargo.toml | 2 +- 6 files changed, 7 insertions(+), 28 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 01586492f..9490f2603 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1309,15 +1309,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" @@ -1328,17 +1319,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" @@ -5241,11 +5221,10 @@ dependencies = [ [[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", diff --git a/lua-api-crates/termwiz-funcs/Cargo.toml b/lua-api-crates/termwiz-funcs/Cargo.toml index b7f264132..7618ec13a 100644 --- a/lua-api-crates/termwiz-funcs/Cargo.toml +++ b/lua-api-crates/termwiz-funcs/Cargo.toml @@ -10,7 +10,7 @@ publish = false 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/mux/Cargo.toml b/mux/Cargo.toml index f34958257..e63e56f3e 100644 --- a/mux/Cargo.toml +++ b/mux/Cargo.toml @@ -39,7 +39,7 @@ serde = {version="1.0", features = ["rc", "derive"]} serial = "0.4" shell-words = "1.1" smol = "2.0" -terminfo = "0.8" +terminfo = "0.9" termwiz = { path = "../termwiz" } termwiz-funcs = { path = "../lua-api-crates/termwiz-funcs" } textwrap = "0.16" diff --git a/term/Cargo.toml b/term/Cargo.toml index c06c6a7c7..7460c0345 100644 --- a/term/Cargo.toml +++ b/term/Cargo.toml @@ -29,7 +29,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" } diff --git a/termwiz/Cargo.toml b/termwiz/Cargo.toml index d461307dc..e9f536de0 100644 --- a/termwiz/Cargo.toml +++ b/termwiz/Cargo.toml @@ -38,7 +38,7 @@ 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" diff --git a/wezterm-gui/Cargo.toml b/wezterm-gui/Cargo.toml index e2b512a6c..edd8f0f1d 100644 --- a/wezterm-gui/Cargo.toml +++ b/wezterm-gui/Cargo.toml @@ -81,7 +81,7 @@ shlex = "1.1" 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" From 1f33b359326d952316aa3232bbb7d3bb45205095 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Mon, 13 May 2024 12:46:23 -0700 Subject: [PATCH 121/140] add Makefile This enables `make fmt` which is how I usually run fmt in other repos and works better with my ctrl-R and muscle memory. --- Makefile | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..67c29c24b --- /dev/null +++ b/Makefile @@ -0,0 +1,5 @@ +.PHONY: fmt + +fmt: + cargo +nightly fmt + From eb6fc75a170fd4a5923a4aac3c217e0dee73ecbb Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Mon, 13 May 2024 13:00:14 -0700 Subject: [PATCH 122/140] termwiz: remove semver dep The newer version is much more strict about its inputs and we're dealing with all sorts of weirdness as input from the environment, so let's just roll our own simple solution. --- Cargo.lock | 1 - termwiz/Cargo.toml | 1 - termwiz/src/caps/mod.rs | 58 ++++++++++++++++++++++++++++++++++++++--- 3 files changed, 54 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9490f2603..0cc33c101 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5284,7 +5284,6 @@ dependencies = [ "pest", "pest_derive", "phf", - "semver", "serde", "sha2", "signal-hook", diff --git a/termwiz/Cargo.toml b/termwiz/Cargo.toml index e9f536de0..f11de6176 100644 --- a/termwiz/Cargo.toml +++ b/termwiz/Cargo.toml @@ -33,7 +33,6 @@ ordered-float = "4.1" pest = "2.1" pest_derive = "2.1" phf = "0.11" -semver = "1.0" serde = {version="1.0", features = ["rc", "derive"], optional=true} siphasher = "0.3" sha2 = "0.10" diff --git a/termwiz/src/caps/mod.rs b/termwiz/src/caps/mod.rs index cd7bc5d3b..c9b94e8d9 100644 --- a/termwiz/src/caps/mod.rs +++ b/termwiz/src/caps/mod.rs @@ -55,7 +55,6 @@ //! 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}; @@ -295,14 +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()), + "2.9.20150512", ) - .unwrap_or(Version::new(0, 0, 0)) - >= Version::new(2, 9, 20150512) } Some("WezTerm") => true, _ => false, @@ -378,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. From ccc32faaba3f698c6b4f58178f23ad74030e6a67 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Mon, 13 May 2024 13:57:14 -0700 Subject: [PATCH 123/140] speculative windows build fix --- async_ossl/src/lib.rs | 7 +++++++ filedescriptor/src/windows.rs | 12 +++++++++--- wezterm-client/src/client.rs | 7 +++++++ wezterm-mux-server-impl/src/dispatch.rs | 2 +- 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/async_ossl/src/lib.rs b/async_ossl/src/lib.rs index 47f23c14c..38a3aa510 100644 --- a/async_ossl/src/lib.rs +++ b/async_ossl/src/lib.rs @@ -40,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/filedescriptor/src/windows.rs b/filedescriptor/src/windows.rs index 822c19abe..bcf31ec37 100644 --- a/filedescriptor/src/windows.rs +++ b/filedescriptor/src/windows.rs @@ -1,7 +1,7 @@ use crate::{ - AsRawFileDescriptor, AsRawSocketDescriptor, Error, FileDescriptor, FromRawFileDescriptor, - FromRawSocketDescriptor, IntoRawFileDescriptor, IntoRawSocketDescriptor, OwnedHandle, Pipe, - Result, StdioDescriptor, + AsRawFileDescriptor, AsRawSocketDescriptor, AsSocket, Error, FileDescriptor, + FromRawFileDescriptor, FromRawSocketDescriptor, IntoRawFileDescriptor, IntoRawSocketDescriptor, + OwnedHandle, Pipe, Result, StdioDescriptor, }; use std::io::{self, Error as IoError}; use std::os::windows::prelude::*; @@ -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/wezterm-client/src/client.rs b/wezterm-client/src/client.rs index 0cd461974..bd217ce5c 100644 --- a/wezterm-client/src/client.rs +++ b/wezterm-client/src/client.rs @@ -572,6 +572,13 @@ impl std::os::windows::io::AsRawSocket for SshStream { } } +#[cfg(windows)] +impl std::os::windows::io::AsSocket for SshStream { + fn as_socket(&self) -> std::os::windows::io::BorrowedSocket { + self.stdout.as_socket() + } +} + impl Read for SshStream { fn read(&mut self, buf: &mut [u8]) -> Result { self.stdout.read(buf) diff --git a/wezterm-mux-server-impl/src/dispatch.rs b/wezterm-mux-server-impl/src/dispatch.rs index 7b3109753..12d0e76d2 100644 --- a/wezterm-mux-server-impl/src/dispatch.rs +++ b/wezterm-mux-server-impl/src/dispatch.rs @@ -11,7 +11,7 @@ use smol::Async; #[cfg(unix)] 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 {} From b1af9e873bc905b9ea86d23460ced2c69e1b15d9 Mon Sep 17 00:00:00 2001 From: mirror-kt Date: Mon, 13 May 2024 13:54:13 +0900 Subject: [PATCH 124/140] nix: allowBuiltinFetchGit = true --- nix/flake.nix | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/nix/flake.nix b/nix/flake.nix index 05f36260a..c273ce8f2 100644 --- a/nix/flake.nix +++ b/nix/flake.nix @@ -105,10 +105,7 @@ cargoLock = { lockFile = ../Cargo.lock; - outputHashes = { - "xcb-imdkit-0.3.0" = "sha256-fTpJ6uNhjmCWv7dZqVgYuS2Uic36XNYTbqlaly5QBjI="; - "sqlite-cache-0.1.3" = "sha256-sBAC8MsQZgH+dcWpoxzq9iw5078vwzCijgyQnMOWIkk"; - }; + allowBuiltinFetchGit = true; }; preConfigure = '' From ee78f86293124eaf767a0f21a2e6639fea0fc22a Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Mon, 13 May 2024 14:10:09 -0700 Subject: [PATCH 125/140] deps: update macos specific packages --- Cargo.lock | 8 ++++---- env-bootstrap/Cargo.toml | 2 +- wezterm-toast-notification/Cargo.toml | 2 +- window/Cargo.toml | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0cc33c101..da51344f2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1447,7 +1447,7 @@ dependencies = [ "backtrace", "battery", "chrono", - "cocoa 0.20.2", + "cocoa 0.25.0", "color-funcs", "config", "dirs-next", @@ -6500,7 +6500,7 @@ version = "0.1.0" dependencies = [ "async-io", "cocoa 0.20.2", - "core-foundation 0.7.0", + "core-foundation 0.9.4", "futures-util", "log", "objc", @@ -6696,8 +6696,8 @@ dependencies = [ "clipboard-win", "cocoa 0.25.0", "config", - "core-foundation 0.7.0", - "core-graphics 0.19.2", + "core-foundation 0.9.4", + "core-graphics 0.23.2", "dirs-next", "downcast-rs", "euclid", diff --git a/env-bootstrap/Cargo.toml b/env-bootstrap/Cargo.toml index 1e7cf6db7..8787e62e1 100644 --- a/env-bootstrap/Cargo.toml +++ b/env-bootstrap/Cargo.toml @@ -37,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/wezterm-toast-notification/Cargo.toml b/wezterm-toast-notification/Cargo.toml index d697019f9..d9f65fd36 100644 --- a/wezterm-toast-notification/Cargo.toml +++ b/wezterm-toast-notification/Cargo.toml @@ -21,7 +21,7 @@ futures-util = "0.3" [target.'cfg(target_os="macos")'.dependencies] cocoa = "0.20" -core-foundation = "0.7" +core-foundation = "0.9" objc = "0.2" [target.'cfg(windows)'.dependencies] diff --git a/window/Cargo.toml b/window/Cargo.toml index dcfe914f6..77419bc2e 100644 --- a/window/Cargo.toml +++ b/window/Cargo.toml @@ -89,8 +89,8 @@ 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" From a1db8a2f466d115ec2d9491d1fa8b130e487c162 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Mon, 13 May 2024 14:12:48 -0700 Subject: [PATCH 126/140] deps: missed a cocoa --- Cargo.lock | 89 +++++++-------------------- wezterm-toast-notification/Cargo.toml | 2 +- 2 files changed, 24 insertions(+), 67 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index da51344f2..b8b40cadb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -784,21 +784,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" @@ -808,8 +793,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", @@ -823,7 +808,7 @@ checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" dependencies = [ "bitflags 1.3.2", "block", - "core-foundation 0.9.4", + "core-foundation", "core-graphics-types", "libc", "objc", @@ -966,50 +951,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" @@ -1017,7 +974,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", @@ -1030,7 +987,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", ] @@ -1040,8 +997,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", ] @@ -1447,7 +1404,7 @@ dependencies = [ "backtrace", "battery", "chrono", - "cocoa 0.25.0", + "cocoa", "color-funcs", "config", "dirs-next", @@ -2426,7 +2383,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", @@ -4573,8 +4530,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" dependencies = [ "bitflags 2.5.0", - "core-foundation 0.9.4", - "core-foundation-sys 0.8.6", + "core-foundation", + "core-foundation-sys", "libc", "security-framework-sys", ] @@ -4585,7 +4542,7 @@ version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" dependencies = [ - "core-foundation-sys 0.8.6", + "core-foundation-sys", "libc", ] @@ -5013,7 +4970,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "725bc1c7374f435ef65746eb1a5789cb7d02b8e997f9a3edf979bfb42da68311" dependencies = [ "cfg-if", - "core-foundation 0.9.4", + "core-foundation", "lazycell", "libc", "mach2", @@ -5121,7 +5078,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", ] @@ -5131,7 +5088,7 @@ 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", ] @@ -6227,9 +6184,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", @@ -6499,8 +6456,8 @@ name = "wezterm-toast-notification" version = "0.1.0" dependencies = [ "async-io", - "cocoa 0.20.2", - "core-foundation 0.9.4", + "cocoa", + "core-foundation", "futures-util", "log", "objc", @@ -6694,10 +6651,10 @@ dependencies = [ "bytes", "cgl", "clipboard-win", - "cocoa 0.25.0", + "cocoa", "config", - "core-foundation 0.9.4", - "core-graphics 0.23.2", + "core-foundation", + "core-graphics", "dirs-next", "downcast-rs", "euclid", diff --git a/wezterm-toast-notification/Cargo.toml b/wezterm-toast-notification/Cargo.toml index d9f65fd36..d6c5ffcea 100644 --- a/wezterm-toast-notification/Cargo.toml +++ b/wezterm-toast-notification/Cargo.toml @@ -20,7 +20,7 @@ async-io = "2.3" futures-util = "0.3" [target.'cfg(target_os="macos")'.dependencies] -cocoa = "0.20" +cocoa = "0.25" core-foundation = "0.9" objc = "0.2" From dd80aca72a1da91674ca9dd9916faebd09a319d3 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Mon, 13 May 2024 14:14:47 -0700 Subject: [PATCH 127/140] filedescriptor: fix windows build --- filedescriptor/src/windows.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/filedescriptor/src/windows.rs b/filedescriptor/src/windows.rs index bcf31ec37..4502d09c7 100644 --- a/filedescriptor/src/windows.rs +++ b/filedescriptor/src/windows.rs @@ -1,7 +1,7 @@ use crate::{ - AsRawFileDescriptor, AsRawSocketDescriptor, AsSocket, Error, FileDescriptor, - FromRawFileDescriptor, FromRawSocketDescriptor, IntoRawFileDescriptor, IntoRawSocketDescriptor, - OwnedHandle, Pipe, Result, StdioDescriptor, + AsRawFileDescriptor, AsRawSocketDescriptor, Error, FileDescriptor, FromRawFileDescriptor, + FromRawSocketDescriptor, IntoRawFileDescriptor, IntoRawSocketDescriptor, OwnedHandle, Pipe, + Result, StdioDescriptor, }; use std::io::{self, Error as IoError}; use std::os::windows::prelude::*; From 6b493ecd187dbbcefe96bb559d9eb243e1109313 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Mon, 13 May 2024 15:09:48 -0700 Subject: [PATCH 128/140] windows: another run at fixing up the build --- wezterm-client/Cargo.toml | 2 +- wezterm-client/src/client.rs | 62 +++++++++++++++++++++++++----- wezterm-gui/Cargo.toml | 2 +- wezterm-mux-server-impl/Cargo.toml | 2 +- 4 files changed, 56 insertions(+), 12 deletions(-) diff --git a/wezterm-client/Cargo.toml b/wezterm-client/Cargo.toml index 48f189ddc..aa4d0fb57 100644 --- a/wezterm-client/Cargo.toml +++ b/wezterm-client/Cargo.toml @@ -39,7 +39,7 @@ wezterm-ssh = { path = "../wezterm-ssh" } wezterm-term = { path = "../term", features=["use_serde"] } [target."cfg(windows)".dependencies] -uds_windows = "1.0" +uds_windows = "1.1" winapi = { version = "0.3", features = [ "winuser", ]} diff --git a/wezterm-client/src/client.rs b/wezterm-client/src/client.rs index bd217ce5c..1cc1fed1e 100644 --- a/wezterm-client/src/client.rs +++ b/wezterm-client/src/client.rs @@ -25,7 +25,11 @@ 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; @@ -531,6 +535,46 @@ where } } +/// 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)] +struct IoSafeUnixStream(UnixStream); + +#[cfg(unix)] +impl AsFd for IoSafeUnixStream { + fn as_fd(&self) -> BorrowedFd { + self.0.as_fd() + } +} + +#[cfg(windows)] +impl AsSocket for IoSafeUnixStream { + fn as_socket(&self) -> BorrowedSocket { + self.0.as_socket() + } +} + +impl Read for IoSafeUnixStream { + fn read(&mut self, buf: &mut [u8]) -> Result { + self.0.read(buf) + } +} + +impl Write for IoSafeUnixStream { + 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 IoSafeUnixStream {} + #[derive(Debug)] struct Reconnectable { config: ClientDomainConfig, @@ -552,29 +596,29 @@ impl std::fmt::Debug for SshStream { } #[cfg(unix)] -impl std::os::fd::AsFd for SshStream { - fn as_fd(&self) -> std::os::fd::BorrowedFd { +impl AsFd for SshStream { + fn as_fd(&self) -> BorrowedFd { self.stdout.as_fd() } } #[cfg(unix)] -impl std::os::unix::io::AsRawFd for SshStream { - fn as_raw_fd(&self) -> std::os::unix::io::RawFd { +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 std::os::windows::io::AsSocket for SshStream { - fn as_socket(&self) -> std::os::windows::io::BorrowedSocket { +impl AsSocket for SshStream { + fn as_socket(&self) -> BorrowedSocket { self.stdout.as_socket() } } @@ -798,7 +842,7 @@ impl Reconnectable { ui.output_str("Connected!\n"); stream.set_read_timeout(Some(unix_dom.read_timeout))?; stream.set_write_timeout(Some(unix_dom.write_timeout))?; - let stream: Box = Box::new(Async::new(stream)?); + let stream: Box = Box::new(Async::new(IoSafeUnixStream(stream))?); self.stream.replace(stream); Ok(()) } diff --git a/wezterm-gui/Cargo.toml b/wezterm-gui/Cargo.toml index edd8f0f1d..43b19f529 100644 --- a/wezterm-gui/Cargo.toml +++ b/wezterm-gui/Cargo.toml @@ -111,7 +111,7 @@ window-funcs = { path = "../lua-api-crates/window-funcs" } [target."cfg(windows)".dependencies] shared_library = "0.1" -uds_windows = "1.0" +uds_windows = "1.1" winapi = { version = "0.3", features = [ "winuser", "consoleapi", diff --git a/wezterm-mux-server-impl/Cargo.toml b/wezterm-mux-server-impl/Cargo.toml index 8fbdd43bf..5194281e5 100644 --- a/wezterm-mux-server-impl/Cargo.toml +++ b/wezterm-mux-server-impl/Cargo.toml @@ -29,5 +29,5 @@ wezterm-term = { path = "../term", features=["use_serde"] } termwiz = { path = "../termwiz", features=["use_serde"] } [target."cfg(windows)".dependencies] -uds_windows = "1.0" +uds_windows = "1.1" winapi = { version = "0.3", features = [ "winuser" ]} From a597803c1374d634932e5c85acff2cb2c56223f1 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Mon, 13 May 2024 15:54:14 -0700 Subject: [PATCH 129/140] windows: fixup for newer libloading --- window/src/os/windows/wgl.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 })?; From 0fcd4a847c466cb39c88cd23ac91e328f6a05d64 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Mon, 13 May 2024 17:56:57 -0700 Subject: [PATCH 130/140] move uds stuff into new wezterm-uds crate This centralizes the conditional imports and makes a home for the IoSafe trait annotation for smol/async-io compat. --- Cargo.lock | 15 ++- Cargo.toml | 3 +- wezterm-client/Cargo.toml | 2 +- wezterm-client/src/client.rs | 44 +------- wezterm-client/src/discovery.rs | 2 +- wezterm-client/src/lib.rs | 5 - wezterm-gui/Cargo.toml | 1 - wezterm-mux-server-impl/Cargo.toml | 2 +- wezterm-mux-server-impl/src/dispatch.rs | 2 +- wezterm-mux-server-impl/src/lib.rs | 5 - wezterm-mux-server-impl/src/local.rs | 2 +- wezterm-ssh/Cargo.toml | 2 +- wezterm-ssh/src/sessioninner.rs | 3 +- wezterm-uds/Cargo.toml | 12 ++ wezterm-uds/src/lib.rs | 141 ++++++++++++++++++++++++ 15 files changed, 175 insertions(+), 66 deletions(-) create mode 100644 wezterm-uds/Cargo.toml create mode 100644 wezterm-uds/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index b8b40cadb..afd0cf20d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6128,12 +6128,12 @@ dependencies = [ "termwiz", "textwrap", "thiserror", - "uds_windows", "umask", "url", "wezterm-dynamic", "wezterm-ssh", "wezterm-term", + "wezterm-uds", "winapi", ] @@ -6281,7 +6281,6 @@ dependencies = [ "textwrap", "thiserror", "tiny-skia", - "uds_windows", "umask", "unicode-normalization", "unicode-segmentation", @@ -6373,10 +6372,10 @@ dependencies = [ "rcgen", "smol", "termwiz", - "uds_windows", "url", "wezterm-client", "wezterm-term", + "wezterm-uds", "winapi", ] @@ -6418,7 +6417,7 @@ dependencies = [ "ssh2", "termwiz", "thiserror", - "uds_windows", + "wezterm-uds", "whoami", ] @@ -6469,6 +6468,14 @@ dependencies = [ "zvariant", ] +[[package]] +name = "wezterm-uds" +version = "0.1.0" +dependencies = [ + "async-io", + "uds_windows", +] + [[package]] name = "wezterm-version" version = "0.1.0" 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/wezterm-client/Cargo.toml b/wezterm-client/Cargo.toml index aa4d0fb57..b2861b394 100644 --- a/wezterm-client/Cargo.toml +++ b/wezterm-client/Cargo.toml @@ -37,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.1" winapi = { version = "0.3", features = [ "winuser", ]} diff --git a/wezterm-client/src/client.rs b/wezterm-client/src/client.rs index 1cc1fed1e..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; @@ -34,6 +33,7 @@ use std::path::{Path, PathBuf}; use std::thread; use std::time::Duration; use thiserror::Error; +use wezterm_uds::UnixStream; #[derive(Error, Debug)] #[error("Timeout")] @@ -535,46 +535,6 @@ where } } -/// 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)] -struct IoSafeUnixStream(UnixStream); - -#[cfg(unix)] -impl AsFd for IoSafeUnixStream { - fn as_fd(&self) -> BorrowedFd { - self.0.as_fd() - } -} - -#[cfg(windows)] -impl AsSocket for IoSafeUnixStream { - fn as_socket(&self) -> BorrowedSocket { - self.0.as_socket() - } -} - -impl Read for IoSafeUnixStream { - fn read(&mut self, buf: &mut [u8]) -> Result { - self.0.read(buf) - } -} - -impl Write for IoSafeUnixStream { - 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 IoSafeUnixStream {} - #[derive(Debug)] struct Reconnectable { config: ClientDomainConfig, @@ -842,7 +802,7 @@ impl Reconnectable { ui.output_str("Connected!\n"); stream.set_read_timeout(Some(unix_dom.read_timeout))?; stream.set_write_timeout(Some(unix_dom.write_timeout))?; - let stream: Box = Box::new(Async::new(IoSafeUnixStream(stream))?); + let stream: Box = Box::new(Async::new(stream)?); self.stream.replace(stream); Ok(()) } 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-gui/Cargo.toml b/wezterm-gui/Cargo.toml index 43b19f529..789ca0ec6 100644 --- a/wezterm-gui/Cargo.toml +++ b/wezterm-gui/Cargo.toml @@ -111,7 +111,6 @@ window-funcs = { path = "../lua-api-crates/window-funcs" } [target."cfg(windows)".dependencies] shared_library = "0.1" -uds_windows = "1.1" winapi = { version = "0.3", features = [ "winuser", "consoleapi", diff --git a/wezterm-mux-server-impl/Cargo.toml b/wezterm-mux-server-impl/Cargo.toml index 5194281e5..228931e42 100644 --- a/wezterm-mux-server-impl/Cargo.toml +++ b/wezterm-mux-server-impl/Cargo.toml @@ -26,8 +26,8 @@ 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.1" 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 12d0e76d2..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,6 +6,7 @@ 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 + std::os::fd::AsFd {} 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-ssh/Cargo.toml b/wezterm-ssh/Cargo.toml index cfc42f076..1fa5c0066 100644 --- a/wezterm-ssh/Cargo.toml +++ b/wezterm-ssh/Cargo.toml @@ -35,7 +35,7 @@ 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" -uds_windows = "1.1.0" +wezterm-uds = { path = "../wezterm-uds" } # Not used directly, but is used to centralize the openssl vendor feature selection async_ossl = { path = "../async_ossl" } diff --git a/wezterm-ssh/src/sessioninner.rs b/wezterm-ssh/src/sessioninner.rs index 285115909..bbc145a15 100644 --- a/wezterm-ssh/src/sessioninner.rs +++ b/wezterm-ssh/src/sessioninner.rs @@ -827,15 +827,14 @@ impl SessionInner { .identity_agent() .ok_or_else(|| anyhow!("no identity agent in config"))?; let mut fd = { + use wezterm_uds::UnixStream; #[cfg(unix)] { - use std::os::unix::net::UnixStream; FileDescriptor::new(UnixStream::connect(&identity_agent)?) } #[cfg(windows)] unsafe { use std::os::windows::io::{FromRawSocket, IntoRawSocket}; - use uds_windows::UnixStream; FileDescriptor::from_raw_socket( UnixStream::connect(&identity_agent)?.into_raw_socket(), ) 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..cf91c8b9e --- /dev/null +++ b/wezterm-uds/src/lib.rs @@ -0,0 +1,141 @@ +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 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 + } +} From 44b61d7e822dca92b59e32e32949306e33445664 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Mon, 13 May 2024 18:40:50 -0700 Subject: [PATCH 131/140] wezterm-uds: impl AsRawSocket --- wezterm-uds/src/lib.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/wezterm-uds/src/lib.rs b/wezterm-uds/src/lib.rs index cf91c8b9e..01f8bdf3d 100644 --- a/wezterm-uds/src/lib.rs +++ b/wezterm-uds/src/lib.rs @@ -62,6 +62,12 @@ impl IntoRawSocket for UnixStream { } } #[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() From f1a0842608932a9f17b20ae4123d3a296dda525a Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Mon, 13 May 2024 19:07:55 -0700 Subject: [PATCH 132/140] windows: fix warning --- window/src/os/windows/window.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/window/src/os/windows/window.rs b/window/src/os/windows/window.rs index bbeffb845..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 } From 332b9b8b687a8d21e968b5a294e2b675dd833974 Mon Sep 17 00:00:00 2001 From: Reilly Wood Date: Tue, 14 May 2024 20:39:56 -0700 Subject: [PATCH 133/140] Windows: fix warnings in pty crate --- pty/src/cmdbuilder.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) 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(".")); From 396c8d9a886d06c4f839a24d3942f8612b6b84d0 Mon Sep 17 00:00:00 2001 From: michaelBelsanti Date: Fri, 17 May 2024 15:24:25 -0400 Subject: [PATCH 134/140] use correct flake dir in update-flake workflow --- .github/workflows/update-flake.yml | 1 + 1 file changed, 1 insertion(+) 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/' From 5ab34f04201ec746aeeecce2d0796cc84241c760 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Tue, 14 May 2024 07:30:11 -0700 Subject: [PATCH 135/140] flesh out Makefile a bit --- Makefile | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 67c29c24b..af01a973f 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,18 @@ -.PHONY: fmt +.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 From 88877c689c182e4234a5f76de1bf9ca83d56b434 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Tue, 14 May 2024 07:55:31 -0700 Subject: [PATCH 136/140] ignore .tag file --- .gitignore | 1 + 1 file changed, 1 insertion(+) 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 From 6fe1d4d2f80ab4ffa2872c85631bfe6570f5487a Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Sun, 19 May 2024 16:40:07 -0700 Subject: [PATCH 137/140] cargo update --- Cargo.lock | 205 ++++++++++++++++++++++++++--------------------------- 1 file changed, 99 insertions(+), 106 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index afd0cf20d..2122da749 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -129,9 +129,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.83" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25bdb32cbbdce2b519a9cd7df3a678443100e265d5e25ca763b7572a5104f5f3" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" [[package]] name = "arbitrary" @@ -147,7 +147,7 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.65", ] [[package]] @@ -206,12 +206,11 @@ dependencies = [ [[package]] name = "async-channel" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f2776ead772134d55b62dd45e59a79e21612d85d0af729b8b7d3967d601a62a" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" dependencies = [ "concurrent-queue", - "event-listener 5.3.0", "event-listener-strategy 0.5.2", "futures-core", "pin-project-lite", @@ -310,7 +309,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.65", ] [[package]] @@ -345,7 +344,7 @@ checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.65", ] [[package]] @@ -572,7 +571,7 @@ checksum = "4da9a32f3fed317401fa3c862968128267c3106685286e15d5aaa3d7389c2f60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.65", ] [[package]] @@ -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,9 +633,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.0.97" +version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099a5357d84c4c61eb35fc8eafa9a79a902c2f76911e5747ced4e032edd8d9b4" +checksum = "41c270e7540d725e65ac7f1b212ac8ce349719624d7bcff99f8e2e488e8cf03f" dependencies = [ "jobserver", "libc", @@ -734,7 +733,7 @@ dependencies = [ "anstream", "anstyle", "clap_lex", - "strsim 0.11.1", + "strsim", "terminal_size 0.3.0", ] @@ -766,7 +765,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.65", ] [[package]] @@ -940,7 +939,7 @@ dependencies = [ "shlex", "smol", "termwiz", - "toml 0.8.12", + "toml 0.8.13", "umask", "wezterm-bidi", "wezterm-config-derive", @@ -1081,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", ] @@ -1118,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" @@ -1167,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", @@ -1177,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.63", + "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.63", + "syn 2.0.65", ] [[package]] @@ -1324,9 +1323,9 @@ dependencies = [ [[package]] name = "either" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" +checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" [[package]] name = "embed-resource" @@ -1394,7 +1393,7 @@ checksum = "5c785274071b1b420972453b306eeca06acf4633829db4223b58a2a8c5953bc4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.65", ] [[package]] @@ -1726,7 +1725,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.65", ] [[package]] @@ -1846,7 +1845,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.65", ] [[package]] @@ -2122,15 +2121,15 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "816ec7294445779408f36fe57bc5b7fc1cf59664059096c65f905c1c61f58069" +checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" dependencies = [ + "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "futures-util", "http", "indexmap 2.2.6", "slab", @@ -2513,9 +2512,9 @@ 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", ] @@ -2528,7 +2527,7 @@ checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.65", ] [[package]] @@ -2644,7 +2643,7 @@ dependencies = [ "libc", "proc-macro2", "regex", - "syn 2.0.63", + "syn 2.0.65", "terminal_size 0.2.6", ] @@ -2729,9 +2728,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.154" +version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libflate" @@ -2830,9 +2829,9 @@ dependencies = [ [[package]] name = "libssh-rs" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fe5b617b2d56b06cc1166f074045b5c0d626160aa30ce8cd834191b9554a9c0" +checksum = "4d46682cfd8dc53c52471cfed5eedcc9248c318f3c8df174ec1b8c4f41565f98" dependencies = [ "bitflags 1.3.2", "libc", @@ -2843,9 +2842,9 @@ dependencies = [ [[package]] name = "libssh-rs-sys" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c1ac11240c1eb84950beff8eb6dd3dee21fab8d01947828269057fe63f14a9" +checksum = "205ceca5947f473c76f34175de70b15d9e8fadbbdb1bba45d4973037bbdb5fc7" dependencies = [ "cc", "libz-sys", @@ -2902,9 +2901,9 @@ 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" @@ -3101,9 +3100,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +checksum = "87dfd01fe195c66b572b37921ad8803d010623c0aca821bea2302239d155cdae" dependencies = [ "adler", "simd-adler32", @@ -3129,9 +3128,9 @@ 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", "futures-util", @@ -3143,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", @@ -3406,7 +3405,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.65", ] [[package]] @@ -3522,7 +3521,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.65", ] [[package]] @@ -3681,7 +3680,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.65", ] [[package]] @@ -3735,7 +3734,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.65", ] [[package]] @@ -3764,7 +3763,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.65", ] [[package]] @@ -3967,9 +3966,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.82" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b" +checksum = "0b33eb56c327dec362a9e55b3ad14f9d2f0904fb5a5b03b513ab5465399e9f43" dependencies = [ "unicode-ident", ] @@ -4014,7 +4013,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8021cf59c8ec9c432cfc2526ac6b8aa508ecaf29cd415f271b8406c1b851c3fd" dependencies = [ "quote", - "syn 2.0.63", + "syn 2.0.65", ] [[package]] @@ -4405,7 +4404,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.63", + "syn 2.0.65", "unicode-ident", ] @@ -4467,7 +4466,7 @@ dependencies = [ "bitflags 2.5.0", "errno", "libc", - "linux-raw-sys 0.4.13", + "linux-raw-sys 0.4.14", "windows-sys 0.52.0", ] @@ -4554,9 +4553,9 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.201" +version = "1.0.202" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "780f1cebed1629e4753a1a38a3c72d30b97ec044f0aef68cb26650a3c5cf363c" +checksum = "226b61a0d411b2ba5ff6d7f73a476ac4f8bb900373459cd00fab8512828ba395" dependencies = [ "serde_derive", ] @@ -4570,19 +4569,19 @@ dependencies = [ "luahelper", "serde_json", "serde_yaml", - "toml 0.8.12", + "toml 0.8.13", "wezterm-dynamic", ] [[package]] name = "serde_derive" -version = "1.0.201" +version = "1.0.202" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e405930b9796f1c00bee880d03fc7e0bb4b9a11afc776885ffe84320da2865" +checksum = "6048858004bcff69094cd972ed40a32500f153bd3be9f716b2eed2e8217c4838" dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.65", ] [[package]] @@ -4604,14 +4603,14 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "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", ] @@ -4653,7 +4652,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.65", ] [[package]] @@ -5000,12 +4999,6 @@ dependencies = [ "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" @@ -5014,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" @@ -5031,9 +5024,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.63" +version = "2.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf5be731623ca1a1fb7d8be6f261a3be6d3e2337b8a1f97be944d020c8fcb704" +checksum = "d2863d96a84c6439701d7a38f9de935ec562c8832cc55d1dde0f513b52fad106" dependencies = [ "proc-macro2", "quote", @@ -5061,7 +5054,7 @@ dependencies = [ "tar", "tempfile", "tokio", - "toml 0.8.12", + "toml 0.8.13", "wezterm-dynamic", ] @@ -5101,7 +5094,7 @@ dependencies = [ "cfg-expr", "heck", "pkg-config", - "toml 0.8.12", + "toml 0.8.13", "version-compare", ] @@ -5289,22 +5282,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.60" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579e9083ca58dd9dcf91a9923bb9054071b9ebbd800b342194c9feb0ee89fc18" +checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.60" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2470041c06ec3ac1ab38d0356a6119054dedaea53e12fbefc0de730a1c08524" +checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.65", ] [[package]] @@ -5456,7 +5449,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.65", ] [[package]] @@ -5493,21 +5486,21 @@ 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.12", + "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", ] @@ -5525,9 +5518,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.12" +version = "0.22.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3328d4f68a705b2a4498da1d580585d39a6510f98318a2cec3018a7ec61ddef" +checksum = "c127785850e8c20836d49732ae6abfa47616e60bf9d9f57c43c250361a9db96c" dependencies = [ "indexmap 2.2.6", "serde", @@ -5584,7 +5577,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.65", ] [[package]] @@ -5869,7 +5862,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.65", "wasm-bindgen-shared", ] @@ -5903,7 +5896,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.65", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -6164,7 +6157,7 @@ dependencies = [ "log", "maplit", "ordered-float", - "strsim 0.11.1", + "strsim", "thiserror", "wezterm-dynamic-derive", ] @@ -7075,7 +7068,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" dependencies = [ "libc", - "linux-raw-sys 0.4.13", + "linux-raw-sys 0.4.14", "rustix 0.38.34", ] @@ -7232,7 +7225,7 @@ checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.63", + "syn 2.0.65", ] [[package]] From 993eb9f3a961dd3ee1594521477162d3cc3c0034 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bogdan-Cristian=20T=C4=83t=C4=83roiu?= Date: Mon, 20 May 2024 11:24:26 +0100 Subject: [PATCH 138/140] Fix Windows CI. It's currently failing when running tests with errors of the form: > error: creating test list failed > > Caused by: > for `wezterm-config-derive`, command > `'D:\a\wezterm\wezterm\target\debug\deps\wezterm_config_derive-f1c7f0f2de220b6e.exe' > --list --format terse` exited with code 0xc0000135: The specified > module could not be found. (os error 126) This seems to have been caused by nextest-rs/nextest#1493, with this comment as a fix: https://github.com/nextest-rs/nextest/issues/1493#issuecomment-2106331574 --- .github/workflows/gen_windows.yml | 1 + .github/workflows/gen_windows_continuous.yml | 1 + .github/workflows/gen_windows_tag.yml | 1 + ci/generate-workflows.py | 2 ++ 4 files changed, 5 insertions(+) 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/ci/generate-workflows.py b/ci/generate-workflows.py index c241b16f0..8f6f37fd7 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): From da2d0ad267f32fb7ac341872a4c74004a68bbfcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bogdan-Cristian=20T=C4=83t=C4=83roiu?= Date: Mon, 20 May 2024 13:39:48 +0100 Subject: [PATCH 139/140] ci: Update Fedora versions. Fedora 40 was released, Fedora 37 is EOL. --- .../{gen_fedora37.yml => gen_fedora40.yml} | 10 +++++----- ..._continuous.yml => gen_fedora40_continuous.yml} | 14 +++++++------- .../{gen_fedora37_tag.yml => gen_fedora40_tag.yml} | 10 +++++----- ci/generate-workflows.py | 2 +- 4 files changed, 18 insertions(+), 18 deletions(-) rename .github/workflows/{gen_fedora37.yml => gen_fedora40.yml} (95%) rename .github/workflows/{gen_fedora37_continuous.yml => gen_fedora40_continuous.yml} (93%) rename .github/workflows/{gen_fedora37_tag.yml => gen_fedora40_tag.yml} (96%) 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/ci/generate-workflows.py b/ci/generate-workflows.py index 8f6f37fd7..ffb1a65fb 100755 --- a/ci/generate-workflows.py +++ b/ci/generate-workflows.py @@ -1005,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"), ] From b8f94c474ce48ac195b51c1aeacf41ae049b774e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bogdan-Cristian=20T=C4=83t=C4=83roiu?= Date: Mon, 20 May 2024 16:56:50 +0100 Subject: [PATCH 140/140] Update docs to reflect CI nightly builds being available for Fedora 40. Mention that nightly rpms are also available in Copr while I'm at it. --- docs/install/linux.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/install/linux.md b/docs/install/linux.md index c23c9c010..24a27aa1a 100644 --- a/docs/install/linux.md +++ b/docs/install/linux.md @@ -103,7 +103,7 @@ hide: $ curl -fsSL https://apt.fury.io/wez/gpg.key | sudo gpg --yes --dearmor -o /usr/share/keyrings/wezterm-fury.gpg $ echo 'deb [signed-by=/usr/share/keyrings/wezterm-fury.gpg] https://apt.fury.io/wez/ * *' | sudo tee /etc/apt/sources.list.d/wezterm.list ``` - + Update your dependencies: ```console @@ -167,7 +167,7 @@ hide: available in Copr for `x86_64` and `aarch64`: * Centos Stream 8 and 9 - * Fedora 38, 39, rawhide + * Fedora 38, 39, 40, rawhide * OpenSUSE Leap 15.5 * OpenSUSE Tumbleweed * RHEL 8, 9 @@ -201,9 +201,10 @@ hide: |------------|------------------|---------------------| |CentOS8 |[{{ centos8_rpm_stable_asset }}]({{ centos8_rpm_stable }}) |[{{ centos8_rpm_nightly_asset }}]({{ centos8_rpm_nightly }})| |CentOS9 |[{{ centos9_rpm_stable_asset }}]({{ centos9_rpm_stable }})|[{{ centos9_rpm_nightly_asset }}]({{ centos9_rpm_nightly }})| - |Fedora37 |[{{ fedora37_rpm_stable_asset }}]({{ fedora37_rpm_stable }})|[{{ fedora37_rpm_nightly_asset }}]({{ fedora37_rpm_nightly }})| + |Fedora37 |[{{ fedora37_rpm_stable_asset }}]({{ fedora37_rpm_stable }})|No longer supported| |Fedora38 |[{{ fedora38_rpm_stable_asset }}]({{ fedora38_rpm_stable }})|[{{ fedora38_rpm_nightly_asset }}]({{ fedora38_rpm_nightly }})| |Fedora39 |[{{ fedora39_rpm_stable_asset }}]({{ fedora39_rpm_stable }})|[{{ fedora39_rpm_nightly_asset }}]({{ fedora39_rpm_nightly }})| + |Fedora40 |Nightly only|[{{ fedora40_rpm_nightly_asset }}]({{ fedora40_rpm_nightly }})| To download and install from the CLI you can use something like this, which shows how to install the Fedora 39 package: