From a35cade8dea3c6dff822c7fb04a439777433721a Mon Sep 17 00:00:00 2001 From: denis Date: Thu, 25 Mar 2021 18:05:16 +0200 Subject: [PATCH 01/21] wip: reading colors from xrdb --- Cargo.lock | 178 +++++++++++++++++++++++---------------- Cargo.toml | 2 + src/client/boundaries.rs | 10 +-- src/client/tab.rs | 7 +- src/common/mod.rs | 64 +++++++++++++- src/common/screen.rs | 7 +- 6 files changed, 188 insertions(+), 80 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f2533abb..7bc19623 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11,9 +11,9 @@ dependencies = [ [[package]] name = "adler" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bedc89c5c7b5550ffb9372eb5c5ffc7f9f705cc3f4a128bd4669b9745f555093" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ansi_term" @@ -30,6 +30,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" dependencies = [ + "serde", "winapi", ] @@ -130,7 +131,7 @@ dependencies = [ "event-listener", "futures-lite", "once_cell", - "signal-hook 0.3.6", + "signal-hook 0.3.7", "winapi", ] @@ -223,9 +224,9 @@ checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" [[package]] name = "bitvec" -version = "0.19.4" +version = "0.19.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7ba35e9565969edb811639dbebfe34edc0368e472c5018474c8eb2543397f81" +checksum = "8942c8d352ae1838c9dda0b0ca2ab657696ef2232a20147cf1b30ae1a9cb4321" dependencies = [ "funty", "radium", @@ -309,6 +310,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "colors-transform" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9226dbc05df4fb986f48d730b001532580883c4c06c5d1c213f4b34c1c157178" + [[package]] name = "concurrent-queue" version = "1.2.2" @@ -320,9 +327,9 @@ dependencies = [ [[package]] name = "console" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cc80946b3480f421c2f17ed1cb841753a371c7c5104f51d507e13f532c856aa" +checksum = "3993e6445baa160675931ec041a5e03ca84b9c6e32a056150d3aa2bdda0a1f45" dependencies = [ "encode_unicode", "lazy_static", @@ -452,9 +459,9 @@ dependencies = [ [[package]] name = "ctor" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8f45d9ad417bcef4817d614a501ab55cdd96a6fdb24f49aab89a54acfd66b19" +checksum = "5e98e2ad1a782e33928b96fc3948e7c355e5af34ba4de7670fe8bac2a3b2006d" dependencies = [ "quote", "syn", @@ -536,9 +543,9 @@ checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" [[package]] name = "enumset" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c70e3089d60da62772627697a83dd166615072eebe1a52ac05f16bdbd0165dc3" +checksum = "fbd795df6708a599abf1ee10eacc72efd052b7a5f70fdf0715e4d5151a6db9c3" dependencies = [ "enumset_derive", ] @@ -807,9 +814,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "indexmap" -version = "1.6.1" +version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb1fa934250de4de8aef298d81c729a7d33d8c239daa3a7575e6b92bfc7313b" +checksum = "824845a0bf897a9042383849b02c1bc219c2383772efcd5c6f9766fa4b81aef3" dependencies = [ "autocfg", "hashbrown", @@ -818,9 +825,9 @@ dependencies = [ [[package]] name = "insta" -version = "1.6.3" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd354a2c8c8083d58414597a4ecada1984f9b82ea7e87eeabddc869eaf120992" +checksum = "e1b6cf41e31a7e7b78055b548826da45c7dc74e6a13a3fa6b897a17a01322f26" dependencies = [ "console", "lazy_static", @@ -842,16 +849,16 @@ dependencies = [ [[package]] name = "interprocess" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98969eda6bf33b8532e8a7b8f157afc43556188741fa0df8c92b8780f8654e52" +checksum = "1c58ec7fbda1df9a93f587b780659db3c99f61f4be27f9c82c9b37684ffd0366" dependencies = [ "blocking", "cfg-if 1.0.0", "futures", "intmap", - "lazy_static", "libc", + "once_cell", "spinning", "thiserror", "winapi", @@ -893,9 +900,9 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "js-sys" -version = "0.3.47" +version = "0.3.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cfb73131c35423a367daf8cbd24100af0d077668c8c2943f0e7dd775fef0f65" +checksum = "dc15e39392125075f60c95ba416f5381ff6c3a948ff02ab12464715adf56c821" dependencies = [ "wasm-bindgen", ] @@ -936,9 +943,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.86" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7282d924be3275cec7f6756ff4121987bc6481325397dde6ba3e7802b1a8b1c" +checksum = "8916b1f6ca17130ec6568feccee27c156ad12037880833a3b842a823236502e7" [[package]] name = "libloading" @@ -1026,9 +1033,9 @@ checksum = "0debeb9fcf88823ea64d64e4a815ab1643f33127d995978e099942ce38f25238" [[package]] name = "nb-connect" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670361df1bc2399ee1ff50406a0d422587dd3bb0da596e1978fe8e05dabddf4f" +checksum = "a19900e7eee95eb2b3c2e26d12a874cc80aaf750e31be6fcbe743ead369fa45d" dependencies = [ "libc", "socket2", @@ -1093,9 +1100,9 @@ checksum = "a9a7ab5d64814df0fe4a4b5ead45ed6c5f181ee3ff04ba344313a6c80446c5d4" [[package]] name = "once_cell" -version = "1.7.0" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10acf907b94fc1b1a152d08ef97e7759650268cf986bf127f387e602b02c7e5a" +checksum = "af8b08b04175473088b46763e51ee54da5f9a164bc162f615b91bc179dbf15a3" [[package]] name = "parking" @@ -1105,9 +1112,9 @@ checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" [[package]] name = "pin-project-lite" -version = "0.2.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439697af366c49a6d0a010c56a0d97685bc140ce0d377b13a2ea2aa42d64a827" +checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905" [[package]] name = "pin-utils" @@ -1116,12 +1123,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] -name = "polling" -version = "2.0.2" +name = "pkg-config" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2a7bc6b2a29e632e45451c941832803a18cce6781db04de8a04696cdca8bde4" +checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c" + +[[package]] +name = "polling" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fc12d774e799ee9ebae13f4076ca003b40d18a11ac0f3641e6f899618580b7b" dependencies = [ - "cfg-if 0.1.10", + "cfg-if 1.0.0", "libc", "log", "wepoll-sys", @@ -1370,9 +1383,9 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "serde" -version = "1.0.123" +version = "1.0.125" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d5161132722baa40d802cc70b15262b98258453e85e5d1d365c757c73869ae" +checksum = "558dc50e1a5a5fa7112ca2ce4effcb321b0300c0d4ccf0776a9f60cd89031171" dependencies = [ "serde_derive", ] @@ -1388,9 +1401,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.123" +version = "1.0.125" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9391c295d64fc0abb2c556bad848f33cb8296276b1ad2677d1ae1ace4f258f31" +checksum = "b093b7a2bb58203b5da3056c05b4ec1fed827dcfdb37347a8841695263b3d06d" dependencies = [ "proc-macro2", "quote", @@ -1399,9 +1412,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.63" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43535db9747a4ba938c0ce0a98cc631a46ebf943c9e1d604e091df6007620bf6" +checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79" dependencies = [ "itoa", "ryu", @@ -1432,9 +1445,9 @@ dependencies = [ [[package]] name = "signal-hook" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7f3f92a1da3d6b1d32245d0cbcbbab0cfc45996d8df619c42bccfa6d2bbb5f" +checksum = "6aa894ef3fade0ee7243422f4fbbd6c2b48e6de767e621d37ef65f2310f53cea" dependencies = [ "libc", "signal-hook-registry", @@ -1469,11 +1482,10 @@ checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" [[package]] name = "socket2" -version = "0.3.19" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e" +checksum = "9e3dfc207c526015c632472a77be09cf1b6e46866581aecae5cc38fb4235dea2" dependencies = [ - "cfg-if 1.0.0", "libc", "winapi", ] @@ -1582,9 +1594,9 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.60" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c700597eca8a5a762beb35753ef6b94df201c81cca676604f547495a0d7f0081" +checksum = "3fd9d1e9976102a03c542daa2eff1b43f9d72306342f3f8b3ed5fb8908195d6f" dependencies = [ "proc-macro2", "quote", @@ -1721,9 +1733,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.13" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8a9bd1db7706f2373a190b0d067146caa39350c486f3d455b0e33b431f94c07" +checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2" dependencies = [ "proc-macro2", "quote", @@ -1819,9 +1831,9 @@ dependencies = [ [[package]] name = "vec-arena" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eafc1b9b2dfc6f5529177b62cf806484db55b32dc7c9658a118e11bbeb33061d" +checksum = "34b2f665b594b07095e3ac3f718e13c2197143416fae4c5706cffb7b1af8d7f1" [[package]] name = "vec_map" @@ -1831,9 +1843,9 @@ checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" [[package]] name = "version_check" -version = "0.9.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" +checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" [[package]] name = "vte" @@ -1873,9 +1885,9 @@ checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" [[package]] name = "walkdir" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "777182bc735b6424e1a57516d35ed72cb8019d85c8c9bf536dccb3445c1a2f7d" +checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" dependencies = [ "same-file", "winapi", @@ -1890,9 +1902,9 @@ checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" [[package]] name = "wasm-bindgen" -version = "0.2.70" +version = "0.2.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55c0f7123de74f0dab9b7d00fd614e7b19349cd1e2f5252bbe9b1754b59433be" +checksum = "8fe8f61dba8e5d645a4d8132dc7a0a66861ed5e1045d2c0ed940fab33bac0fbe" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -1900,9 +1912,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.70" +version = "0.2.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bc45447f0d4573f3d65720f636bbcc3dd6ce920ed704670118650bcd47764c7" +checksum = "046ceba58ff062da072c7cb4ba5b22a37f00a302483f7e2a6cdc18fedbdc1fd3" dependencies = [ "bumpalo", "lazy_static", @@ -1915,9 +1927,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.20" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3de431a2910c86679c34283a33f66f4e4abd7e0aec27b6669060148872aadf94" +checksum = "73157efb9af26fb564bb59a009afd1c7c334a44db171d280690d0c3faaec3468" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -1927,9 +1939,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.70" +version = "0.2.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b8853882eef39593ad4174dd26fc9865a64e84026d223f63bb2c42affcbba2c" +checksum = "0ef9aa01d36cda046f797c57959ff5f3c615c9cc63997a8d545831ec7976819b" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1937,9 +1949,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.70" +version = "0.2.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4133b5e7f2a531fa413b3a1695e925038a05a71cf67e87dafa295cb645a01385" +checksum = "96eb45c1b2ee33545a813a92dbb53856418bf7eb54ab34f7f7ff1448a5b3735d" dependencies = [ "proc-macro2", "quote", @@ -1950,9 +1962,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.70" +version = "0.2.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd4945e4943ae02d15c13962b38a5b1e81eadd4b71214eee75af64a4d6a4fd64" +checksum = "b7148f4696fb4960a346eaa60bbfb42a1ac4ebba21f750f75fc1375b098d5ffa" [[package]] name = "wasmer" @@ -2156,27 +2168,27 @@ checksum = "87cc2fe6350834b4e528ba0901e7aa405d78b89dc1fa3145359eb4de0e323fcf" [[package]] name = "wast" -version = "34.0.0" +version = "35.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3de71ea922e46a60d0bde4b27ebf24ab7c4991006fd5de23ce9c58e129b3ab3c" +checksum = "db5ae96da18bb5926341516fd409b5a8ce4e4714da7f0a1063d3b20ac9f9a1e1" dependencies = [ "leb128", ] [[package]] name = "wat" -version = "1.0.35" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "474403335b9a90b21120ab8131dd888f0a8d041c2d365ab960feddfe5a73c4b6" +checksum = "0b0fa059022c5dabe129f02b429d67086400deb8277f89c975555dacc1dadbcc" dependencies = [ "wast", ] [[package]] name = "web-sys" -version = "0.3.47" +version = "0.3.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c40dc691fc48003eba817c38da7113c15698142da971298003cac3ef175680b3" +checksum = "59fe19d70f5dacc03f6e46777213facae5ac3801575d56ca6cbd4c93dcd12310" dependencies = [ "js-sys", "wasm-bindgen", @@ -2238,6 +2250,27 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" +[[package]] +name = "x11" +version = "2.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ecd092546cb16f25783a5451538e73afc8d32e242648d54f4ae5459ba1e773" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "xrdb" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2dd91a21c92e87678e22f95956a03bfd314ce3232f39dbedd49dddb50f0c6d" +dependencies = [ + "libc", + "scopeguard", + "x11", +] + [[package]] name = "yaml-rust" version = "0.4.5" @@ -2255,6 +2288,7 @@ dependencies = [ "async-std", "backtrace", "bincode", + "colors-transform", "directories-next", "futures", "insta", @@ -2280,12 +2314,14 @@ dependencies = [ "walkdir", "wasmer", "wasmer-wasi", + "xrdb", ] [[package]] name = "zellij-tile" version = "0.5.0" dependencies = [ + "ansi_term 0.12.1", "serde", "serde_json", ] diff --git a/Cargo.toml b/Cargo.toml index a811c5a1..67cb4ff4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -39,6 +39,8 @@ lazy_static = "1.4.0" wasmer = "1.0.0" wasmer-wasi = "1.0.0" interprocess = "1.0.1" +xrdb = "0.1.1" +colors-transform = "0.2.5" [dependencies.async-std] version = "1.3.0" diff --git a/src/client/boundaries.rs b/src/client/boundaries.rs index 19a1058d..6ad83bd8 100644 --- a/src/client/boundaries.rs +++ b/src/client/boundaries.rs @@ -1,4 +1,4 @@ -use crate::{common::input::handler::InputMode, tab::Pane}; +use crate::{common::{Palette, input::handler::InputMode}, tab::Pane}; use ansi_term::Colour; use std::collections::HashMap; @@ -763,11 +763,11 @@ impl Boundaries { boundary_characters: HashMap::new(), } } - pub fn add_rect(&mut self, rect: &dyn Pane, input_mode: InputMode, color: Option) { - let color = match color.is_some() { + pub fn add_rect(&mut self, rect: &dyn Pane, input_mode: InputMode, palette: Option) { + let color = match palette.is_some() { true => match input_mode { - InputMode::Normal | InputMode::Locked => Some(colors::GREEN), - _ => Some(colors::WHITE), + InputMode::Normal | InputMode::Locked => Some(palette.unwrap().green), + _ => Some(palette.unwrap().white), }, false => None, }; diff --git a/src/client/tab.rs b/src/client/tab.rs index 081194ed..9d6ae896 100644 --- a/src/client/tab.rs +++ b/src/client/tab.rs @@ -1,7 +1,7 @@ //! `Tab`s holds multiple panes. It tracks their coordinates (x/y) and size, //! as well as how they should be resized -use crate::common::{input::handler::InputMode, AppInstruction, SenderWithContext}; +use crate::common::{AppInstruction, Palette, SenderWithContext, input::handler::InputMode}; use crate::layout::Layout; use crate::panes::{PaneId, PositionAndSize, TerminalPane}; use crate::pty_bus::{PtyInstruction, VteEvent}; @@ -69,6 +69,7 @@ pub struct Tab { pub send_app_instructions: SenderWithContext, expansion_boundary: Option, pub input_mode: InputMode, + pub colors: Palette } #[derive(Clone, Debug, Default, Serialize, Deserialize)] @@ -194,6 +195,7 @@ impl Tab { max_panes: Option, pane_id: Option, input_mode: InputMode, + colors: Palette ) -> Self { let panes = if let Some(PaneId::Terminal(pid)) = pane_id { let new_terminal = TerminalPane::new(pid, *full_screen_ws); @@ -224,6 +226,7 @@ impl Tab { send_plugin_instructions, expansion_boundary: None, input_mode, + colors } } @@ -653,7 +656,7 @@ impl Tab { if !self.panes_to_hide.contains(&terminal.pid()) { match self.active_terminal.unwrap() == terminal.pid() { true => { - boundaries.add_rect(terminal.as_ref(), self.input_mode, Some(colors::GREEN)) + boundaries.add_rect(terminal.as_ref(), self.input_mode, Some(self.colors)) } false => boundaries.add_rect(terminal.as_ref(), self.input_mode, None), } diff --git a/src/common/mod.rs b/src/common/mod.rs index 7e52dde7..b061c785 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -15,6 +15,9 @@ use std::sync::mpsc; use std::thread; use std::{cell::RefCell, sync::mpsc::TrySendError}; use std::{collections::HashMap, fs}; +use xrdb::Colors; +use colors_transform::{Rgb, Color}; +use ansi_term::Colour::RGB; use crate::panes::PaneId; use directories_next::ProjectDirs; @@ -148,6 +151,64 @@ pub enum AppInstruction { Error(String), } +pub mod colors { + use ansi_term::Colour::{self, Fixed}; + pub const WHITE: Colour = Fixed(255); + pub const GREEN: Colour = Fixed(154); + pub const GRAY: Colour = Fixed(238); +} + +#[derive(Clone, Copy)] +pub struct Palette { + pub black: ansi_term::Color, + pub red: ansi_term::Color, + pub green: ansi_term::Color, + pub yellow: ansi_term::Color, + pub blue: ansi_term::Color, + pub magenta: ansi_term::Color, + pub cyan: ansi_term::Color, + pub white: ansi_term::Color, +} + +impl Palette { + pub fn new() -> Self { + let palette = match Colors::new("xresources") { + Some(colors) => { + let colors: Vec = colors.colors.iter().map(|c| { + let c = c.clone(); + let imm_str = &c.unwrap(); + let hex_str: &str = &imm_str; + let rgb = Rgb::from_hex_str(hex_str).unwrap().as_tuple(); + RGB(rgb.0 as u8, rgb.1 as u8, rgb.2 as u8) + }).collect(); + Self { + black: colors[0], + red: colors[1], + green: colors[2], + yellow: colors[3], + blue: colors[4], + magenta: colors[5], + cyan: colors[6], + white: colors[7] + } + }, + None => { + Self { + black: colors::GRAY, + red: colors::GRAY, + green: colors::GREEN, + yellow: colors::GRAY, + blue: colors::GRAY, + magenta: colors::GRAY, + cyan: colors::GRAY, + white: colors::WHITE + } + } + }; + palette + } +} + /// Start Zellij with the specified [`OsApi`] and command-line arguments. // FIXME this should definitely be modularized and split into different functions. pub fn start(mut os_input: Box, opts: CliArgs) { @@ -280,7 +341,7 @@ pub fn start(mut os_input: Box, opts: CliArgs) { let send_plugin_instructions = send_plugin_instructions.clone(); let send_app_instructions = send_app_instructions.clone(); let max_panes = opts.max_panes; - + let colors = Palette::new(); move || { let mut screen = Screen::new( receive_screen_instructions, @@ -291,6 +352,7 @@ pub fn start(mut os_input: Box, opts: CliArgs) { os_input, max_panes, InputMode::Normal, + colors ); loop { let (event, mut err_ctx) = screen diff --git a/src/common/screen.rs b/src/common/screen.rs index bb77ab85..92109435 100644 --- a/src/common/screen.rs +++ b/src/common/screen.rs @@ -5,7 +5,7 @@ use std::os::unix::io::RawFd; use std::str; use std::sync::mpsc::Receiver; -use super::{input::handler::InputMode, AppInstruction, SenderWithContext}; +use super::{AppInstruction, Palette, SenderWithContext, input::handler::InputMode}; use crate::os_input_output::OsApi; use crate::panes::PositionAndSize; use crate::pty_bus::{PtyInstruction, VteEvent}; @@ -74,6 +74,7 @@ pub struct Screen { os_api: Box, tabname_buf: String, input_mode: InputMode, + colors: Palette } impl Screen { @@ -87,6 +88,7 @@ impl Screen { os_api: Box, max_panes: Option, input_mode: InputMode, + colors: Palette ) -> Self { Screen { receiver: receive_screen_instructions, @@ -100,6 +102,7 @@ impl Screen { os_api, tabname_buf: String::new(), input_mode, + colors } } @@ -120,6 +123,7 @@ impl Screen { self.max_panes, Some(PaneId::Terminal(pane_id)), self.input_mode, + self.colors ); self.active_tab_index = Some(tab_index); self.tabs.insert(tab_index, tab); @@ -265,6 +269,7 @@ impl Screen { self.max_panes, None, self.input_mode, + self.colors ); tab.apply_layout(layout, new_pids); self.active_tab_index = Some(tab_index); From 2c402b0b1d6a21220dca65835335bacfe3fe43e6 Mon Sep 17 00:00:00 2001 From: denis Date: Fri, 26 Mar 2021 16:42:38 +0200 Subject: [PATCH 02/21] wip: scary how messy it is, but it's a start --- Cargo.lock | 2 - default-tiles/status-bar/src/first_line.rs | 157 ++++++++++++-------- default-tiles/status-bar/src/main.rs | 8 +- default-tiles/status-bar/src/second_line.rs | 137 ++++++++++++----- default-tiles/tab-bar/src/main.rs | 5 +- default-tiles/tab-bar/src/tab.rs | 41 +++-- src/client/boundaries.rs | 17 +-- src/client/tab.rs | 4 +- src/common/input/handler.rs | 84 ++++++++++- src/common/mod.rs | 61 +------- zellij-tile/src/shim.rs | 18 +++ 11 files changed, 346 insertions(+), 188 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7bc19623..ea601aaf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -30,7 +30,6 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" dependencies = [ - "serde", "winapi", ] @@ -2321,7 +2320,6 @@ dependencies = [ name = "zellij-tile" version = "0.5.0" dependencies = [ - "ansi_term 0.12.1", "serde", "serde_json", ] diff --git a/default-tiles/status-bar/src/first_line.rs b/default-tiles/status-bar/src/first_line.rs index bd9c5425..fd6ae50a 100644 --- a/default-tiles/status-bar/src/first_line.rs +++ b/default-tiles/status-bar/src/first_line.rs @@ -1,4 +1,4 @@ -use ansi_term::{ANSIStrings, Style}; +use ansi_term::{ANSIStrings, Color::RGB, Style}; use zellij_tile::*; use crate::colors::{BLACK, BRIGHT_GRAY, GRAY, GREEN, RED, WHITE}; @@ -63,32 +63,38 @@ impl CtrlKeyShortcut { } } -fn unselected_mode_shortcut(letter: char, text: &str) -> LinePart { - let prefix_separator = Style::new().fg(GRAY).on(BRIGHT_GRAY).paint(ARROW_SEPARATOR); +fn unselected_mode_shortcut(letter: char, text: &str, palette: Palette) -> LinePart { + let prefix_separator = Style::new() + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .paint(ARROW_SEPARATOR); let char_left_separator = Style::new() .bold() - .fg(BLACK) - .on(BRIGHT_GRAY) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) .bold() .paint(format!(" <")); let char_shortcut = Style::new() .bold() - .fg(RED) - .on(BRIGHT_GRAY) + .fg(RGB(palette.red.0, palette.red.1, palette.red.2)) + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) .bold() .paint(format!("{}", letter)); let char_right_separator = Style::new() .bold() - .fg(BLACK) - .on(BRIGHT_GRAY) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) .bold() .paint(format!(">")); let styled_text = Style::new() - .fg(BLACK) - .on(BRIGHT_GRAY) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) .bold() .paint(format!("{} ", text)); - let suffix_separator = Style::new().fg(BRIGHT_GRAY).on(GRAY).paint(ARROW_SEPARATOR); + let suffix_separator = Style::new() + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .paint(ARROW_SEPARATOR); LinePart { part: format!( "{}", @@ -105,32 +111,38 @@ fn unselected_mode_shortcut(letter: char, text: &str) -> LinePart { } } -fn selected_mode_shortcut(letter: char, text: &str) -> LinePart { - let prefix_separator = Style::new().fg(GRAY).on(GREEN).paint(ARROW_SEPARATOR); +fn selected_mode_shortcut(letter: char, text: &str, palette: Palette) -> LinePart { + let prefix_separator = Style::new() + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .on(RGB(palette.green.0, palette.green.1, palette.green.2)) + .paint(ARROW_SEPARATOR); let char_left_separator = Style::new() .bold() - .fg(BLACK) - .on(GREEN) + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .on(RGB(palette.green.0, palette.green.1, palette.green.2)) .bold() .paint(format!(" <")); let char_shortcut = Style::new() .bold() - .fg(RED) - .on(GREEN) + .fg(RGB(palette.red.0, palette.red.1, palette.red.2)) + .on(RGB(palette.green.0, palette.green.1, palette.green.2)) .bold() .paint(format!("{}", letter)); let char_right_separator = Style::new() .bold() - .fg(BLACK) - .on(GREEN) + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .on(RGB(palette.green.0, palette.green.1, palette.green.2)) .bold() .paint(format!(">")); let styled_text = Style::new() - .fg(BLACK) - .on(GREEN) + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .on(RGB(palette.green.0, palette.green.1, palette.green.2)) .bold() .paint(format!("{} ", text)); - let suffix_separator = Style::new().fg(GREEN).on(GRAY).paint(ARROW_SEPARATOR); + let suffix_separator = Style::new() + .fg(RGB(palette.green.0, palette.green.1, palette.green.2)) + .on(RGB(palette.green.0, palette.green.1, palette.green.2)) + .paint(ARROW_SEPARATOR); LinePart { part: format!( "{}", @@ -147,31 +159,43 @@ fn selected_mode_shortcut(letter: char, text: &str) -> LinePart { } } -fn disabled_mode_shortcut(text: &str) -> LinePart { - let prefix_separator = Style::new().fg(GRAY).on(BRIGHT_GRAY).paint(ARROW_SEPARATOR); +fn disabled_mode_shortcut(text: &str, palette: Palette) -> LinePart { + let prefix_separator = Style::new() + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .paint(ARROW_SEPARATOR); let styled_text = Style::new() - .fg(GRAY) - .on(BRIGHT_GRAY) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) .dimmed() .paint(format!("{} ", text)); - let suffix_separator = Style::new().fg(BRIGHT_GRAY).on(GRAY).paint(ARROW_SEPARATOR); + let suffix_separator = Style::new() + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .paint(ARROW_SEPARATOR); LinePart { part: format!("{}{}{}", prefix_separator, styled_text, suffix_separator), len: text.chars().count() + 2 + 1, // 2 for the arrows, 1 for the padding in the end } } -fn selected_mode_shortcut_single_letter(letter: char) -> LinePart { +fn selected_mode_shortcut_single_letter(letter: char, palette: Palette) -> LinePart { let char_shortcut_text = format!(" {} ", letter); let len = char_shortcut_text.chars().count() + 4; // 2 for the arrows, 2 for the padding - let prefix_separator = Style::new().fg(GRAY).on(GREEN).paint(ARROW_SEPARATOR); + let prefix_separator = Style::new() + .fg(RGB(palette.black.0, palette.black.1, palette.black.2)) + .on(RGB(palette.green.0, palette.green.1, palette.green.2)) + .paint(ARROW_SEPARATOR); let char_shortcut = Style::new() .bold() - .fg(RED) - .on(GREEN) + .fg(RGB(palette.red.0, palette.red.1, palette.red.2)) + .on(RGB(palette.green.0, palette.green.1, palette.green.2)) .bold() .paint(char_shortcut_text); - let suffix_separator = Style::new().fg(GREEN).on(GRAY).paint(ARROW_SEPARATOR); + let suffix_separator = Style::new() + .fg(RGB(palette.green.0, palette.green.1, palette.green.2)) + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .paint(ARROW_SEPARATOR); LinePart { part: format!( "{}", @@ -181,17 +205,23 @@ fn selected_mode_shortcut_single_letter(letter: char) -> LinePart { } } -fn unselected_mode_shortcut_single_letter(letter: char) -> LinePart { +fn unselected_mode_shortcut_single_letter(letter: char, palette: Palette) -> LinePart { let char_shortcut_text = format!(" {} ", letter); let len = char_shortcut_text.chars().count() + 4; // 2 for the arrows, 2 for the padding - let prefix_separator = Style::new().fg(GRAY).on(BRIGHT_GRAY).paint(ARROW_SEPARATOR); + let prefix_separator = Style::new() + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .paint(ARROW_SEPARATOR); let char_shortcut = Style::new() .bold() - .fg(RED) - .on(BRIGHT_GRAY) + .fg(RGB(palette.red.0, palette.red.1, palette.red.2)) + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) .bold() .paint(char_shortcut_text); - let suffix_separator = Style::new().fg(BRIGHT_GRAY).on(GRAY).paint(ARROW_SEPARATOR); + let suffix_separator = Style::new() + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .paint(ARROW_SEPARATOR); LinePart { part: format!( "{}", @@ -201,23 +231,23 @@ fn unselected_mode_shortcut_single_letter(letter: char) -> LinePart { } } -fn full_ctrl_key(key: &CtrlKeyShortcut) -> LinePart { +fn full_ctrl_key(key: &CtrlKeyShortcut, palette: Palette) -> LinePart { let full_text = key.full_text(); let letter_shortcut = key.letter_shortcut(); match key.mode { CtrlKeyMode::Unselected => { - unselected_mode_shortcut(letter_shortcut, &format!(" {}", full_text)) + unselected_mode_shortcut(letter_shortcut, &format!(" {}", full_text), palette) } CtrlKeyMode::Selected => { - selected_mode_shortcut(letter_shortcut, &format!(" {}", full_text)) + selected_mode_shortcut(letter_shortcut, &format!(" {}", full_text), palette) } CtrlKeyMode::Disabled => { - disabled_mode_shortcut(&format!(" <{}> {}", letter_shortcut, full_text)) + disabled_mode_shortcut(&format!(" <{}> {}", letter_shortcut, full_text), palette) } } } -fn shortened_ctrl_key(key: &CtrlKeyShortcut) -> LinePart { +fn shortened_ctrl_key(key: &CtrlKeyShortcut, palette: Palette) -> LinePart { let shortened_text = key.shortened_text(); let letter_shortcut = key.letter_shortcut(); let shortened_text = match key.action { @@ -226,30 +256,31 @@ fn shortened_ctrl_key(key: &CtrlKeyShortcut) -> LinePart { }; match key.mode { CtrlKeyMode::Unselected => { - unselected_mode_shortcut(letter_shortcut, &format!("{}", shortened_text)) + unselected_mode_shortcut(letter_shortcut, &format!("{}", shortened_text), palette) } CtrlKeyMode::Selected => { - selected_mode_shortcut(letter_shortcut, &format!("{}", shortened_text)) - } - CtrlKeyMode::Disabled => { - disabled_mode_shortcut(&format!(" <{}>{}", letter_shortcut, shortened_text)) + selected_mode_shortcut(letter_shortcut, &format!("{}", shortened_text), palette) } + CtrlKeyMode::Disabled => disabled_mode_shortcut( + &format!(" <{}>{}", letter_shortcut, shortened_text), + palette, + ), } } -fn single_letter_ctrl_key(key: &CtrlKeyShortcut) -> LinePart { +fn single_letter_ctrl_key(key: &CtrlKeyShortcut, palette: Palette) -> LinePart { let letter_shortcut = key.letter_shortcut(); match key.mode { - CtrlKeyMode::Unselected => unselected_mode_shortcut_single_letter(letter_shortcut), - CtrlKeyMode::Selected => selected_mode_shortcut_single_letter(letter_shortcut), - CtrlKeyMode::Disabled => disabled_mode_shortcut(&format!(" {}", letter_shortcut)), + CtrlKeyMode::Unselected => unselected_mode_shortcut_single_letter(letter_shortcut, palette), + CtrlKeyMode::Selected => selected_mode_shortcut_single_letter(letter_shortcut, palette), + CtrlKeyMode::Disabled => disabled_mode_shortcut(&format!(" {}", letter_shortcut), palette), } } -fn key_indicators(max_len: usize, keys: &[CtrlKeyShortcut]) -> LinePart { +fn key_indicators(max_len: usize, keys: &[CtrlKeyShortcut], palette: Palette) -> LinePart { let mut line_part = LinePart::default(); for ctrl_key in keys { - let key = full_ctrl_key(ctrl_key); + let key = full_ctrl_key(ctrl_key, palette); line_part.part = format!("{}{}", line_part.part, key.part); line_part.len += key.len; } @@ -258,7 +289,7 @@ fn key_indicators(max_len: usize, keys: &[CtrlKeyShortcut]) -> LinePart { } line_part = LinePart::default(); for ctrl_key in keys { - let key = shortened_ctrl_key(ctrl_key); + let key = shortened_ctrl_key(ctrl_key, palette); line_part.part = format!("{}{}", line_part.part, key.part); line_part.len += key.len; } @@ -267,7 +298,7 @@ fn key_indicators(max_len: usize, keys: &[CtrlKeyShortcut]) -> LinePart { } line_part = LinePart::default(); for ctrl_key in keys { - let key = single_letter_ctrl_key(ctrl_key); + let key = single_letter_ctrl_key(ctrl_key, palette); line_part.part = format!("{}{}", line_part.part, key.part); line_part.len += key.len; } @@ -278,9 +309,13 @@ fn key_indicators(max_len: usize, keys: &[CtrlKeyShortcut]) -> LinePart { line_part } -pub fn superkey() -> LinePart { +pub fn superkey(palette: Palette) -> LinePart { let prefix_text = " Ctrl + "; - let prefix = Style::new().fg(WHITE).on(GRAY).bold().paint(prefix_text); + let prefix = Style::new() + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .bold() + .paint(prefix_text); LinePart { part: format!("{}", prefix), len: prefix_text.chars().count(), @@ -299,6 +334,7 @@ pub fn ctrl_keys(help: &Help, max_len: usize) -> LinePart { CtrlKeyShortcut::new(CtrlKeyMode::Disabled, CtrlKeyAction::Scroll), CtrlKeyShortcut::new(CtrlKeyMode::Disabled, CtrlKeyAction::Quit), ], + help.palette, ), InputMode::Resize => key_indicators( max_len, @@ -310,6 +346,7 @@ pub fn ctrl_keys(help: &Help, max_len: usize) -> LinePart { CtrlKeyShortcut::new(CtrlKeyMode::Unselected, CtrlKeyAction::Scroll), CtrlKeyShortcut::new(CtrlKeyMode::Unselected, CtrlKeyAction::Quit), ], + help.palette, ), InputMode::Pane => key_indicators( max_len, @@ -321,6 +358,7 @@ pub fn ctrl_keys(help: &Help, max_len: usize) -> LinePart { CtrlKeyShortcut::new(CtrlKeyMode::Unselected, CtrlKeyAction::Scroll), CtrlKeyShortcut::new(CtrlKeyMode::Unselected, CtrlKeyAction::Quit), ], + help.palette, ), InputMode::Tab | InputMode::RenameTab => key_indicators( max_len, @@ -332,6 +370,7 @@ pub fn ctrl_keys(help: &Help, max_len: usize) -> LinePart { CtrlKeyShortcut::new(CtrlKeyMode::Unselected, CtrlKeyAction::Scroll), CtrlKeyShortcut::new(CtrlKeyMode::Unselected, CtrlKeyAction::Quit), ], + help.palette, ), InputMode::Scroll => key_indicators( max_len, @@ -343,6 +382,7 @@ pub fn ctrl_keys(help: &Help, max_len: usize) -> LinePart { CtrlKeyShortcut::new(CtrlKeyMode::Selected, CtrlKeyAction::Scroll), CtrlKeyShortcut::new(CtrlKeyMode::Unselected, CtrlKeyAction::Quit), ], + help.palette, ), InputMode::Normal | _ => key_indicators( max_len, @@ -354,6 +394,7 @@ pub fn ctrl_keys(help: &Help, max_len: usize) -> LinePart { CtrlKeyShortcut::new(CtrlKeyMode::Unselected, CtrlKeyAction::Scroll), CtrlKeyShortcut::new(CtrlKeyMode::Unselected, CtrlKeyAction::Quit), ], + help.palette, ), } } diff --git a/default-tiles/status-bar/src/main.rs b/default-tiles/status-bar/src/main.rs index 6d41fb7b..f1b9f47a 100644 --- a/default-tiles/status-bar/src/main.rs +++ b/default-tiles/status-bar/src/main.rs @@ -48,15 +48,15 @@ impl ZellijTile for State { fn draw(&mut self, _rows: usize, cols: usize) { let help = get_help(); - let superkey = superkey(); + let superkey = superkey(help.palette); let ctrl_keys = ctrl_keys(&help, cols - superkey.len); let first_line = format!("{}{}", superkey, ctrl_keys); - let second_line = keybinds(&help, cols); + let second_line = keybinds(&help, cols, help.palette); // [48;5;238m is gray background, [0K is so that it fills the rest of the line // [48;5;16m is black background, [0K is so that it fills the rest of the line - println!("{}\u{1b}[48;5;238m\u{1b}[0K", first_line); - println!("{}\u{1b}[48;5;16m\u{1b}[0K", second_line); + println!("{}\u{1b}[{};{};{}m\u{1b}[0K", first_line, help.palette.bg.0, help.palette.bg.1, help.palette.bg.2); + println!("{}\u{1b}[{};{};{}m\u{1b}[0K", second_line, help.palette.bg.0, help.palette.bg.1, help.palette.bg.2); } } diff --git a/default-tiles/status-bar/src/second_line.rs b/default-tiles/status-bar/src/second_line.rs index 45c33a8e..21d5a994 100644 --- a/default-tiles/status-bar/src/second_line.rs +++ b/default-tiles/status-bar/src/second_line.rs @@ -1,19 +1,41 @@ // use colored::*; -use ansi_term::{ANSIStrings, Style}; +use ansi_term::{ANSIStrings, Color::RGB, Style}; use zellij_tile::*; use crate::colors::{BLACK, GREEN, ORANGE, WHITE}; use crate::{LinePart, MORE_MSG}; -fn full_length_shortcut(is_first_shortcut: bool, letter: &str, description: &str) -> LinePart { +fn full_length_shortcut( + is_first_shortcut: bool, + letter: &str, + description: &str, + palette: Palette, +) -> LinePart { let separator = if is_first_shortcut { " " } else { " / " }; - let separator = Style::new().on(BLACK).fg(WHITE).paint(separator); + let separator = Style::new() + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .paint(separator); let shortcut_len = letter.chars().count() + 3; // 2 for <>'s around shortcut, 1 for the space - let shortcut_left_separator = Style::new().on(BLACK).fg(WHITE).paint("<"); - let shortcut = Style::new().on(BLACK).fg(GREEN).bold().paint(letter); - let shortcut_right_separator = Style::new().on(BLACK).fg(WHITE).paint("> "); + let shortcut_left_separator = Style::new() + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .paint("<"); + let shortcut = Style::new() + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .fg(ORANGE) + .bold() + .paint(letter); + let shortcut_right_separator = Style::new() + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .paint("> "); let description_len = description.chars().count(); - let description = Style::new().on(BLACK).fg(WHITE).bold().paint(description); + let description = Style::new() + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .bold() + .paint(description); let len = shortcut_len + description_len + separator.chars().count(); LinePart { part: format!( @@ -30,18 +52,36 @@ fn full_length_shortcut(is_first_shortcut: bool, letter: &str, description: &str } } -fn first_word_shortcut(is_first_shortcut: bool, letter: &str, description: &str) -> LinePart { +fn first_word_shortcut( + is_first_shortcut: bool, + letter: &str, + description: &str, + palette: Palette, +) -> LinePart { let separator = if is_first_shortcut { " " } else { " / " }; - let separator = Style::new().on(BLACK).fg(WHITE).paint(separator); + let separator = Style::new() + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .paint(separator); let shortcut_len = letter.chars().count() + 3; // 2 for <>'s around shortcut, 1 for the space - let shortcut_left_separator = Style::new().on(BLACK).fg(WHITE).paint("<"); - let shortcut = Style::new().on(BLACK).fg(GREEN).bold().paint(letter); - let shortcut_right_separator = Style::new().on(BLACK).fg(WHITE).paint("> "); + let shortcut_left_separator = Style::new() + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .paint("<"); + let shortcut = Style::new() + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .fg(RGB(palette.green.0, palette.green.1, palette.green.2)) + .bold() + .paint(letter); + let shortcut_right_separator = Style::new() + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .paint("> "); let description_first_word = description.split(' ').next().unwrap_or(""); let description_first_word_length = description_first_word.chars().count(); let description_first_word = Style::new() - .on(BLACK) - .fg(WHITE) + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .bold() .paint(description_first_word); let len = shortcut_len + description_first_word_length + separator.chars().count(); @@ -60,27 +100,48 @@ fn first_word_shortcut(is_first_shortcut: bool, letter: &str, description: &str) } } -fn locked_interface_indication() -> LinePart { +fn locked_interface_indication(palette: Palette) -> LinePart { let locked_text = " -- INTERFACE LOCKED -- "; let locked_text_len = locked_text.chars().count(); - let locked_styled_text = Style::new().on(BLACK).fg(WHITE).bold().paint(locked_text); + let locked_styled_text = Style::new() + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .bold() + .paint(locked_text); LinePart { part: format!("{}", locked_styled_text), len: locked_text_len, } } -fn select_pane_shortcut(is_first_shortcut: bool) -> LinePart { +fn select_pane_shortcut(is_first_shortcut: bool, palette: Palette) -> LinePart { let shortcut = "ENTER"; let description = "Select pane"; let separator = if is_first_shortcut { " " } else { " / " }; - let separator = Style::new().on(BLACK).fg(WHITE).paint(separator); + let separator = Style::new() + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .paint(separator); let shortcut_len = shortcut.chars().count() + 3; // 2 for <>'s around shortcut, 1 for the space - let shortcut_left_separator = Style::new().on(BLACK).fg(WHITE).paint("<"); - let shortcut = Style::new().on(BLACK).fg(ORANGE).bold().paint(shortcut); - let shortcut_right_separator = Style::new().on(BLACK).fg(WHITE).paint("> "); + let shortcut_left_separator = Style::new() + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .paint("<"); + let shortcut = Style::new() + .on(RGB(palette.black.0, palette.black.1, palette.black.2)) + .fg(ORANGE) + .bold() + .paint(shortcut); + let shortcut_right_separator = Style::new() + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .paint("> "); let description_len = description.chars().count(); - let description = Style::new().on(BLACK).fg(WHITE).bold().paint(description); + let description = Style::new() + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .bold() + .paint(description); let len = shortcut_len + description_len + separator.chars().count(); LinePart { part: format!( @@ -97,18 +158,18 @@ fn select_pane_shortcut(is_first_shortcut: bool) -> LinePart { } } -fn full_shortcut_list(help: &Help) -> LinePart { +fn full_shortcut_list(help: &Help, palette: Palette) -> LinePart { match help.mode { InputMode::Normal => LinePart::default(), - InputMode::Locked => locked_interface_indication(), + InputMode::Locked => locked_interface_indication(palette), _ => { let mut line_part = LinePart::default(); for (i, (letter, description)) in help.keybinds.iter().enumerate() { - let shortcut = full_length_shortcut(i == 0, &letter, &description); + let shortcut = full_length_shortcut(i == 0, &letter, &description, palette); line_part.len += shortcut.len; line_part.part = format!("{}{}", line_part.part, shortcut,); } - let select_pane_shortcut = select_pane_shortcut(help.keybinds.len() == 0); + let select_pane_shortcut = select_pane_shortcut(help.keybinds.len() == 0, palette); line_part.len += select_pane_shortcut.len; line_part.part = format!("{}{}", line_part.part, select_pane_shortcut,); line_part @@ -116,18 +177,18 @@ fn full_shortcut_list(help: &Help) -> LinePart { } } -fn shortened_shortcut_list(help: &Help) -> LinePart { +fn shortened_shortcut_list(help: &Help, palette: Palette) -> LinePart { match help.mode { InputMode::Normal => LinePart::default(), - InputMode::Locked => locked_interface_indication(), + InputMode::Locked => locked_interface_indication(palette), _ => { let mut line_part = LinePart::default(); for (i, (letter, description)) in help.keybinds.iter().enumerate() { - let shortcut = first_word_shortcut(i == 0, &letter, &description); + let shortcut = first_word_shortcut(i == 0, &letter, &description, palette); line_part.len += shortcut.len; line_part.part = format!("{}{}", line_part.part, shortcut,); } - let select_pane_shortcut = select_pane_shortcut(help.keybinds.len() == 0); + let select_pane_shortcut = select_pane_shortcut(help.keybinds.len() == 0, palette); line_part.len += select_pane_shortcut.len; line_part.part = format!("{}{}", line_part.part, select_pane_shortcut,); line_part @@ -135,11 +196,11 @@ fn shortened_shortcut_list(help: &Help) -> LinePart { } } -fn best_effort_shortcut_list(help: &Help, max_len: usize) -> LinePart { +fn best_effort_shortcut_list(help: &Help, max_len: usize, palette: Palette) -> LinePart { match help.mode { InputMode::Normal => LinePart::default(), InputMode::Locked => { - let line_part = locked_interface_indication(); + let line_part = locked_interface_indication(palette); if line_part.len <= max_len { line_part } else { @@ -149,7 +210,7 @@ fn best_effort_shortcut_list(help: &Help, max_len: usize) -> LinePart { _ => { let mut line_part = LinePart::default(); for (i, (letter, description)) in help.keybinds.iter().enumerate() { - let shortcut = first_word_shortcut(i == 0, &letter, &description); + let shortcut = first_word_shortcut(i == 0, &letter, &description, palette); if line_part.len + shortcut.len + MORE_MSG.chars().count() > max_len { // TODO: better line_part.part = format!("{}{}", line_part.part, MORE_MSG); @@ -159,7 +220,7 @@ fn best_effort_shortcut_list(help: &Help, max_len: usize) -> LinePart { line_part.len += shortcut.len; line_part.part = format!("{}{}", line_part.part, shortcut,); } - let select_pane_shortcut = select_pane_shortcut(help.keybinds.len() == 0); + let select_pane_shortcut = select_pane_shortcut(help.keybinds.len() == 0, palette); if line_part.len + select_pane_shortcut.len <= max_len { line_part.len += select_pane_shortcut.len; line_part.part = format!("{}{}", line_part.part, select_pane_shortcut,); @@ -169,14 +230,14 @@ fn best_effort_shortcut_list(help: &Help, max_len: usize) -> LinePart { } } -pub fn keybinds(help: &Help, max_width: usize) -> LinePart { - let full_shortcut_list = full_shortcut_list(help); +pub fn keybinds(help: &Help, max_width: usize, palette: Palette) -> LinePart { + let full_shortcut_list = full_shortcut_list(help, palette); if full_shortcut_list.len <= max_width { return full_shortcut_list; } - let shortened_shortcut_list = shortened_shortcut_list(help); + let shortened_shortcut_list = shortened_shortcut_list(help, palette); if shortened_shortcut_list.len <= max_width { return shortened_shortcut_list; } - return best_effort_shortcut_list(help, max_width); + return best_effort_shortcut_list(help, max_width, palette); } diff --git a/default-tiles/tab-bar/src/main.rs b/default-tiles/tab-bar/src/main.rs index 8c025336..2de936b2 100644 --- a/default-tiles/tab-bar/src/main.rs +++ b/default-tiles/tab-bar/src/main.rs @@ -60,6 +60,7 @@ impl ZellijTile for State { } fn draw(&mut self, _rows: usize, cols: usize) { + let help = get_help(); if self.tabs.is_empty() { return; } @@ -77,7 +78,7 @@ impl ZellijTile for State { } else if t.active { active_tab_index = t.position; } - let tab = tab_style(tabname, t.active, t.position); + let tab = tab_style(tabname, t.active, t.position, help.palette); all_tabs.push(tab); } let tab_line = tab_line(all_tabs, active_tab_index, cols); @@ -85,7 +86,7 @@ impl ZellijTile for State { for bar_part in tab_line { s = format!("{}{}", s, bar_part.part); } - println!("{}\u{1b}[48;5;238m\u{1b}[0K", s); + println!("{}\u{1b}[{};{};{}m\u{1b}[0K", s, help.palette.bg.0, help.palette.bg.1, help.palette.bg.2); } fn update_tabs(&mut self) { diff --git a/default-tiles/tab-bar/src/tab.rs b/default-tiles/tab-bar/src/tab.rs index a4c7c376..96654a16 100644 --- a/default-tiles/tab-bar/src/tab.rs +++ b/default-tiles/tab-bar/src/tab.rs @@ -1,16 +1,23 @@ use crate::colors::{BLACK, BRIGHT_GRAY, GRAY, GREEN}; use crate::{LinePart, ARROW_SEPARATOR}; -use ansi_term::{ANSIStrings, Style}; +use ansi_term::{ANSIStrings, Color::RGB, Style}; +use zellij_tile::Palette; -pub fn active_tab(text: String) -> LinePart { - let left_separator = Style::new().fg(GRAY).on(GREEN).paint(ARROW_SEPARATOR); +pub fn active_tab(text: String, palette: Palette) -> LinePart { + let left_separator = Style::new() + .fg(RGB(palette.black.0, palette.black.1, palette.black.2)) + .on(RGB(palette.green.0, palette.green.1, palette.green.2)) + .paint(ARROW_SEPARATOR); let tab_text_len = text.chars().count() + 4; // 2 for left and right separators, 2 for the text padding let tab_styled_text = Style::new() - .fg(BLACK) - .on(GREEN) + .fg(RGB(palette.black.0, palette.black.1, palette.black.2)) + .on(RGB(palette.green.0, palette.green.1, palette.green.2)) .bold() .paint(format!(" {} ", text)); - let right_separator = Style::new().fg(GREEN).on(GRAY).paint(ARROW_SEPARATOR); + let right_separator = Style::new() + .fg(RGB(palette.green.0, palette.green.1, palette.green.2)) + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .paint(ARROW_SEPARATOR); let tab_styled_text = format!( "{}", ANSIStrings(&[left_separator, tab_styled_text, right_separator,]) @@ -21,15 +28,21 @@ pub fn active_tab(text: String) -> LinePart { } } -pub fn non_active_tab(text: String) -> LinePart { - let left_separator = Style::new().fg(GRAY).on(BRIGHT_GRAY).paint(ARROW_SEPARATOR); +pub fn non_active_tab(text: String, palette: Palette) -> LinePart { + let left_separator = Style::new() + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .paint(ARROW_SEPARATOR); let tab_text_len = text.chars().count() + 4; // 2 for left and right separators, 2 for the padding let tab_styled_text = Style::new() - .fg(BLACK) - .on(BRIGHT_GRAY) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) .bold() .paint(format!(" {} ", text)); - let right_separator = Style::new().fg(BRIGHT_GRAY).on(GRAY).paint(ARROW_SEPARATOR); + let right_separator = Style::new() + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .paint(ARROW_SEPARATOR); let tab_styled_text = format!( "{}", ANSIStrings(&[left_separator, tab_styled_text, right_separator,]) @@ -40,15 +53,15 @@ pub fn non_active_tab(text: String) -> LinePart { } } -pub fn tab_style(text: String, is_active_tab: bool, position: usize) -> LinePart { +pub fn tab_style(text: String, is_active_tab: bool, position: usize, palette: Palette) -> LinePart { let tab_text = if text.is_empty() { format!("Tab #{}", position + 1) } else { text }; if is_active_tab { - active_tab(tab_text) + active_tab(tab_text, palette) } else { - non_active_tab(tab_text) + non_active_tab(tab_text, palette) } } diff --git a/src/client/boundaries.rs b/src/client/boundaries.rs index 6ad83bd8..e7c2cb03 100644 --- a/src/client/boundaries.rs +++ b/src/client/boundaries.rs @@ -1,5 +1,5 @@ -use crate::{common::{Palette, input::handler::InputMode}, tab::Pane}; -use ansi_term::Colour; +use crate::{common::{input::handler::Palette, colors, input::handler::InputMode}, tab::Pane}; +use ansi_term::Colour::RGB; use std::collections::HashMap; use std::fmt::{Display, Error, Formatter}; @@ -18,20 +18,13 @@ pub mod boundary_type { pub const CROSS: &str = "┼"; } -pub mod colors { - use ansi_term::Colour::{self, Fixed}; - pub const WHITE: Colour = Fixed(255); - pub const GREEN: Colour = Fixed(154); - pub const GRAY: Colour = Fixed(238); -} - pub type BoundaryType = &'static str; // easy way to refer to boundary_type above #[derive(Clone, Copy, Debug)] pub struct BoundarySymbol { boundary_type: BoundaryType, invisible: bool, - color: Option, + color: Option<(u8, u8, u8)>, } impl BoundarySymbol { @@ -46,7 +39,7 @@ impl BoundarySymbol { self.invisible = true; self } - pub fn color(&mut self, color: Option) -> Self { + pub fn color(&mut self, color: Option<(u8, u8, u8)>) -> Self { self.color = color; *self } @@ -57,7 +50,7 @@ impl Display for BoundarySymbol { match self.invisible { true => write!(f, " "), false => match self.color { - Some(color) => write!(f, "{}", color.paint(self.boundary_type)), + Some(color) => write!(f, "{}", RGB(color.0, color.1, color.2).paint(self.boundary_type)), None => write!(f, "{}", self.boundary_type), }, } diff --git a/src/client/tab.rs b/src/client/tab.rs index 9d6ae896..56970851 100644 --- a/src/client/tab.rs +++ b/src/client/tab.rs @@ -1,13 +1,13 @@ //! `Tab`s holds multiple panes. It tracks their coordinates (x/y) and size, //! as well as how they should be resized -use crate::common::{AppInstruction, Palette, SenderWithContext, input::handler::InputMode}; +use crate::common::{AppInstruction, SenderWithContext, input::handler::{Palette, InputMode}}; use crate::layout::Layout; use crate::panes::{PaneId, PositionAndSize, TerminalPane}; use crate::pty_bus::{PtyInstruction, VteEvent}; use crate::wasm_vm::{PluginInputType, PluginInstruction}; use crate::{ - boundaries::{colors, Boundaries}, + boundaries::Boundaries, panes::PluginPane, }; use crate::{os_input_output::OsApi, utils::shared::pad_to_size}; diff --git a/src/common/input/handler.rs b/src/common/input/handler.rs index 2d5e965f..4f77c0ae 100644 --- a/src/common/input/handler.rs +++ b/src/common/input/handler.rs @@ -9,6 +9,9 @@ use crate::pty_bus::PtyInstruction; use crate::screen::ScreenInstruction; use crate::wasm_vm::{EventType, PluginInputType, PluginInstruction}; use crate::CommandIsExecuting; +use xrdb::Colors; +use colors_transform::{Rgb, Color}; +use crate::common::utils::logging::debug_log_to_file; use serde::{Deserialize, Serialize}; use strum_macros::EnumIter; @@ -299,6 +302,7 @@ pub enum InputMode { pub struct Help { pub mode: InputMode, pub keybinds: Vec<(String, String)>, // => + pub palette: Palette } impl Default for InputMode { @@ -307,11 +311,89 @@ impl Default for InputMode { } } +pub mod colors { + pub const WHITE: (u8, u8, u8) = (238, 238, 238); + pub const GREEN: (u8, u8, u8) = (175, 255, 0); + pub const GRAY: (u8, u8, u8) = (68, 68, 68); + pub const BRIGHT_GRAY: (u8, u8, u8) = (138, 138, 138); + pub const RED: (u8, u8, u8) = (135, 0, 0); + pub const BLACK: (u8, u8, u8) = (0, 0, 0); +} + +#[derive(Clone, Copy, Default, Debug, Serialize, Deserialize)] +pub struct Palette { + pub fg: (u8, u8, u8), + pub bg: (u8, u8, u8), + pub black: (u8, u8, u8), + pub red: (u8, u8, u8), + pub green: (u8, u8, u8), + pub yellow: (u8, u8, u8), + pub blue: (u8, u8, u8), + pub magenta: (u8, u8, u8), + pub cyan: (u8, u8, u8), + pub white: (u8, u8, u8), +} + +impl Palette { + pub fn new() -> Self { + let palette = match Colors::new("xresources") { + Some(colors) => { + let fg = colors.fg.unwrap(); + let fg_imm = &fg; + let fg_hex: &str = &fg_imm; + let fg = Rgb::from_hex_str(fg_hex).unwrap().as_tuple(); + let fg = (fg.0 as u8, fg.1 as u8, fg.2 as u8); + let bg = colors.bg.unwrap(); + let bg_imm = &bg; + let bg_hex: &str = &bg_imm; + let bg = Rgb::from_hex_str(bg_hex).unwrap().as_tuple(); + let bg = (bg.0 as u8, bg.1 as u8, bg.2 as u8); + let colors: Vec<(u8, u8, u8)> = colors.colors.iter().map(|c| { + let c = c.clone(); + let imm_str = &c.unwrap(); + let hex_str: &str = &imm_str; + let rgb = Rgb::from_hex_str(hex_str).unwrap().as_tuple(); + (rgb.0 as u8, rgb.1 as u8, rgb.2 as u8) + }).collect(); + Self { + fg, + bg, + black: colors[0], + red: colors[1], + green: colors[2], + yellow: colors[3], + blue: colors[4], + magenta: colors[5], + cyan: colors[6], + white: colors[7] + } + }, + None => { + Self { + fg: colors::BRIGHT_GRAY, + bg: colors::BLACK, + black: colors::BLACK, + red: colors::RED, + green: colors::GREEN, + yellow: colors::GRAY, + blue: colors::GRAY, + magenta: colors::GRAY, + cyan: colors::GRAY, + white: colors::WHITE + } + } + }; + palette + } +} + + /// Creates a [`Help`] struct indicating the current [`InputMode`] and its keybinds /// (as pairs of [`String`]s). // TODO this should probably be automatically generated in some way pub fn get_help(mode: InputMode) -> Help { let mut keybinds: Vec<(String, String)> = vec![]; + let mut palette = Palette::new(); match mode { InputMode::Normal | InputMode::Locked => {} InputMode::Resize => { @@ -339,7 +421,7 @@ pub fn get_help(mode: InputMode) -> Help { keybinds.push(("Enter".to_string(), "when done".to_string())); } } - Help { mode, keybinds } + Help { mode, keybinds, palette } } /// Entry point to the module. Instantiates an [`InputHandler`] and starts diff --git a/src/common/mod.rs b/src/common/mod.rs index b061c785..2bbc18bd 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -30,13 +30,14 @@ use wasmer_wasi::{Pipe, WasiState}; use crate::cli::CliArgs; use crate::layout::Layout; +use crate::common::input::handler::Palette; use command_is_executing::CommandIsExecuting; use errors::{AppContext, ContextType, ErrorContext, PluginContext, PtyContext, ScreenContext}; use input::handler::input_loop; use os_input_output::OsApi; use pty_bus::{PtyBus, PtyInstruction}; use screen::{Screen, ScreenInstruction}; -use utils::consts::{ZELLIJ_IPC_PIPE, ZELLIJ_ROOT_PLUGIN_DIR}; +use utils::{consts::{ZELLIJ_IPC_PIPE, ZELLIJ_ROOT_PLUGIN_DIR}, logging::debug_log_to_file}; use wasm_vm::{ wasi_stdout, wasi_write_string, zellij_imports, EventType, PluginInputType, PluginInstruction, }; @@ -152,62 +153,11 @@ pub enum AppInstruction { } pub mod colors { - use ansi_term::Colour::{self, Fixed}; - pub const WHITE: Colour = Fixed(255); - pub const GREEN: Colour = Fixed(154); - pub const GRAY: Colour = Fixed(238); + pub const WHITE: (u8, u8, u8) = (238, 238, 238); + pub const GREEN: (u8, u8, u8) = (175, 255, 0); + pub const GRAY: (u8, u8, u8) = (68, 68, 68); } -#[derive(Clone, Copy)] -pub struct Palette { - pub black: ansi_term::Color, - pub red: ansi_term::Color, - pub green: ansi_term::Color, - pub yellow: ansi_term::Color, - pub blue: ansi_term::Color, - pub magenta: ansi_term::Color, - pub cyan: ansi_term::Color, - pub white: ansi_term::Color, -} - -impl Palette { - pub fn new() -> Self { - let palette = match Colors::new("xresources") { - Some(colors) => { - let colors: Vec = colors.colors.iter().map(|c| { - let c = c.clone(); - let imm_str = &c.unwrap(); - let hex_str: &str = &imm_str; - let rgb = Rgb::from_hex_str(hex_str).unwrap().as_tuple(); - RGB(rgb.0 as u8, rgb.1 as u8, rgb.2 as u8) - }).collect(); - Self { - black: colors[0], - red: colors[1], - green: colors[2], - yellow: colors[3], - blue: colors[4], - magenta: colors[5], - cyan: colors[6], - white: colors[7] - } - }, - None => { - Self { - black: colors::GRAY, - red: colors::GRAY, - green: colors::GREEN, - yellow: colors::GRAY, - blue: colors::GRAY, - magenta: colors::GRAY, - cyan: colors::GRAY, - white: colors::WHITE - } - } - }; - palette - } -} /// Start Zellij with the specified [`OsApi`] and command-line arguments. // FIXME this should definitely be modularized and split into different functions. @@ -342,6 +292,7 @@ pub fn start(mut os_input: Box, opts: CliArgs) { let send_app_instructions = send_app_instructions.clone(); let max_panes = opts.max_panes; let colors = Palette::new(); + // debug_log_to_file(format!("{:?}", colors)); move || { let mut screen = Screen::new( receive_screen_instructions, diff --git a/zellij-tile/src/shim.rs b/zellij-tile/src/shim.rs index b7beb7af..bad9ffa8 100644 --- a/zellij-tile/src/shim.rs +++ b/zellij-tile/src/shim.rs @@ -28,6 +28,7 @@ pub enum Key { pub struct Help { pub mode: InputMode, pub keybinds: Vec<(String, String)>, + pub palette: Palette } // TODO: use same struct from main crate? @@ -51,6 +52,20 @@ pub struct TabData { pub active: bool, } +#[derive(Default, Debug, Copy, Clone, Deserialize, Serialize)] +pub struct Palette { + pub fg: (u8, u8, u8), + pub bg: (u8, u8, u8), + pub black: (u8, u8, u8), + pub red: (u8, u8, u8), + pub green: (u8, u8, u8), + pub yellow: (u8, u8, u8), + pub blue: (u8, u8, u8), + pub magenta: (u8, u8, u8), + pub cyan: (u8, u8, u8), + pub white: (u8, u8, u8), +} + impl Default for InputMode { fn default() -> InputMode { InputMode::Normal @@ -60,6 +75,9 @@ impl Default for InputMode { pub fn get_key() -> Key { deserialize_from_stdin().unwrap() } +pub fn get_palette() -> Palette { + deserialize_from_stdin().unwrap() +} pub fn open_file(path: &Path) { println!("{}", path.to_string_lossy()); From 6e276ae386f0f7e9dd3a4e1095d26e17f6c6401e Mon Sep 17 00:00:00 2001 From: denis Date: Sat, 27 Mar 2021 15:30:53 +0200 Subject: [PATCH 03/21] wip: move Palette out of zellij-tile --- Cargo.lock | 3 +- Cargo.toml | 1 + src/client/boundaries.rs | 3 +- src/client/tab.rs | 6 ++- src/common/input/handler.rs | 4 +- src/common/mod.rs | 82 ++++++++++++++++++++++++++++++- src/common/screen.rs | 3 +- zellij-tile/Cargo.toml | 4 +- zellij-tile/src/data.rs | 98 ++++++------------------------------- 9 files changed, 108 insertions(+), 96 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 78ef1848..78536f80 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2305,6 +2305,7 @@ dependencies = [ "walkdir", "wasmer", "wasmer-wasi", + "xrdb", "zellij-tile", ] @@ -2312,10 +2313,8 @@ dependencies = [ name = "zellij-tile" version = "0.5.0" dependencies = [ - "colors-transform", "serde", "serde_json", "strum", "strum_macros", - "xrdb", ] diff --git a/Cargo.toml b/Cargo.toml index 9d5696ec..94ebc472 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,6 +37,7 @@ lazy_static = "1.4.0" wasmer = "1.0.0" wasmer-wasi = "1.0.0" interprocess = "1.0.1" +xrdb = "0.1.1" colors-transform = "0.2.5" zellij-tile = { path = "zellij-tile/", version = "0.5.0" } diff --git a/src/client/boundaries.rs b/src/client/boundaries.rs index eb1a5a21..70671b6b 100644 --- a/src/client/boundaries.rs +++ b/src/client/boundaries.rs @@ -1,7 +1,8 @@ +use crate::common::{colors, Palette}; use crate::tab::Pane; use ansi_term::Colour::RGB; use std::collections::HashMap; -use zellij_tile::data::{colors, InputMode, Palette}; +use zellij_tile::data::InputMode; use std::fmt::{Display, Error, Formatter}; pub mod boundary_type { diff --git a/src/client/tab.rs b/src/client/tab.rs index d5a190f4..9203d75b 100644 --- a/src/client/tab.rs +++ b/src/client/tab.rs @@ -1,7 +1,9 @@ //! `Tab`s holds multiple panes. It tracks their coordinates (x/y) and size, //! as well as how they should be resized -use crate::common::{input::handler::parse_keys, AppInstruction, SenderWithContext}; +use crate::common::{ + colors, input::handler::parse_keys, AppInstruction, Palette, SenderWithContext, +}; use crate::layout::Layout; use crate::panes::{PaneId, PositionAndSize, TerminalPane}; use crate::pty_bus::{PtyInstruction, VteEvent}; @@ -14,7 +16,7 @@ use std::{ collections::{BTreeMap, HashSet}, }; use std::{io::Write, sync::mpsc::channel}; -use zellij_tile::data::{colors, Event, InputMode, Palette}; +use zellij_tile::data::{Event, InputMode}; const CURSOR_HEIGHT_WIDTH_RATIO: usize = 4; // this is not accurate and kind of a magic number, TODO: look into this const MIN_TERMINAL_HEIGHT: usize = 2; diff --git a/src/common/input/handler.rs b/src/common/input/handler.rs index b135ea16..385c1453 100644 --- a/src/common/input/handler.rs +++ b/src/common/input/handler.rs @@ -2,7 +2,7 @@ use super::actions::Action; use super::keybinds::get_default_keybinds; -use crate::common::{AppInstruction, SenderWithContext, OPENCALLS}; +use crate::common::{AppInstruction, Palette, SenderWithContext, OPENCALLS}; use crate::errors::ContextType; use crate::os_input_output::OsApi; use crate::pty_bus::PtyInstruction; @@ -11,7 +11,7 @@ use crate::wasm_vm::PluginInstruction; use crate::CommandIsExecuting; use termion::input::{TermRead, TermReadEventsAndRaw}; -use zellij_tile::data::{Event, InputMode, Key, ModeInfo, Palette}; +use zellij_tile::data::{Event, InputMode, Key, ModeInfo}; use super::keybinds::key_to_actions; diff --git a/src/common/mod.rs b/src/common/mod.rs index 6732619e..dbfdf1f3 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -24,6 +24,7 @@ use std::{ use crate::cli::CliArgs; use crate::layout::Layout; use crate::panes::PaneId; +use colors_transform::{Color, Rgb}; use command_is_executing::CommandIsExecuting; use directories_next::ProjectDirs; use errors::{AppContext, ContextType, ErrorContext, PluginContext, PtyContext, ScreenContext}; @@ -37,7 +38,8 @@ use wasm_vm::PluginEnv; use wasm_vm::{wasi_stdout, wasi_write_string, zellij_imports, PluginInstruction}; use wasmer::{ChainableNamedResolver, Instance, Module, Store, Value}; use wasmer_wasi::{Pipe, WasiState}; -use zellij_tile::data::{EventType, InputMode, Palette}; +use xrdb::Colors; +use zellij_tile::data::{EventType, InputMode}; #[derive(Serialize, Deserialize, Debug)] pub enum ApiCommand { @@ -115,6 +117,84 @@ pub enum AppInstruction { Error(String), } +pub mod colors { + pub const WHITE: (u8, u8, u8) = (238, 238, 238); + pub const GREEN: (u8, u8, u8) = (175, 255, 0); + pub const GRAY: (u8, u8, u8) = (68, 68, 68); + pub const BRIGHT_GRAY: (u8, u8, u8) = (138, 138, 138); + pub const RED: (u8, u8, u8) = (135, 0, 0); + pub const BLACK: (u8, u8, u8) = (0, 0, 0); +} + +#[derive(Clone, Copy, Debug, Serialize, Deserialize)] +pub struct Palette { + pub fg: (u8, u8, u8), + pub bg: (u8, u8, u8), + pub black: (u8, u8, u8), + pub red: (u8, u8, u8), + pub green: (u8, u8, u8), + pub yellow: (u8, u8, u8), + pub blue: (u8, u8, u8), + pub magenta: (u8, u8, u8), + pub cyan: (u8, u8, u8), + pub white: (u8, u8, u8), +} + +impl Palette { + pub fn new() -> Self { + let palette = match Colors::new("xresources") { + Some(colors) => { + let fg = colors.fg.unwrap(); + let fg_imm = &fg; + let fg_hex: &str = &fg_imm; + let fg = Rgb::from_hex_str(fg_hex).unwrap().as_tuple(); + let fg = (fg.0 as u8, fg.1 as u8, fg.2 as u8); + let bg = colors.bg.unwrap(); + let bg_imm = &bg; + let bg_hex: &str = &bg_imm; + let bg = Rgb::from_hex_str(bg_hex).unwrap().as_tuple(); + let bg = (bg.0 as u8, bg.1 as u8, bg.2 as u8); + let colors: Vec<(u8, u8, u8)> = colors + .colors + .iter() + .map(|c| { + let c = c.clone(); + let imm_str = &c.unwrap(); + let hex_str: &str = &imm_str; + let rgb = Rgb::from_hex_str(hex_str).unwrap().as_tuple(); + (rgb.0 as u8, rgb.1 as u8, rgb.2 as u8) + }) + .collect(); + Self { + fg, + bg, + black: colors[0], + red: colors[1], + green: colors[2], + yellow: colors[3], + blue: colors[4], + magenta: colors[5], + cyan: colors[6], + white: colors[7], + } + } + None => Self { + fg: colors::BRIGHT_GRAY, + bg: colors::BLACK, + black: colors::BLACK, + red: colors::RED, + green: colors::GREEN, + yellow: colors::GRAY, + blue: colors::GRAY, + magenta: colors::GRAY, + cyan: colors::GRAY, + white: colors::WHITE, + }, + }; + palette + } +} + /// Start Zellij with the specified [`OsApi`] and command-line arguments. // FIXME this should definitely be modularized and split into different functions. pub fn start(mut os_input: Box, opts: CliArgs) { diff --git a/src/common/screen.rs b/src/common/screen.rs index e11b734d..999b6391 100644 --- a/src/common/screen.rs +++ b/src/common/screen.rs @@ -6,6 +6,7 @@ use std::str; use std::sync::mpsc::Receiver; use super::{AppInstruction, SenderWithContext}; +use crate::common::Palette; use crate::os_input_output::OsApi; use crate::panes::PositionAndSize; use crate::pty_bus::{PtyInstruction, VteEvent}; @@ -13,7 +14,7 @@ use crate::tab::Tab; use crate::{errors::ErrorContext, wasm_vm::PluginInstruction}; use crate::{layout::Layout, panes::PaneId}; -use zellij_tile::data::{Event, InputMode, Palette, TabInfo}; +use zellij_tile::data::{Event, InputMode, TabInfo}; /// Instructions that can be sent to the [`Screen`]. #[derive(Debug, Clone)] diff --git a/zellij-tile/Cargo.toml b/zellij-tile/Cargo.toml index aa0fe088..eb9a2d59 100644 --- a/zellij-tile/Cargo.toml +++ b/zellij-tile/Cargo.toml @@ -10,6 +10,4 @@ license = "MIT" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" strum = "0.20.0" -strum_macros = "0.20.0" -xrdb = "0.1.1" -colors-transform = "0.2.5" \ No newline at end of file +strum_macros = "0.20.0" \ No newline at end of file diff --git a/zellij-tile/src/data.rs b/zellij-tile/src/data.rs index 315bc091..16f02531 100644 --- a/zellij-tile/src/data.rs +++ b/zellij-tile/src/data.rs @@ -1,89 +1,5 @@ -use colors_transform::{Color, Rgb}; use serde::{Deserialize, Serialize}; use strum_macros::{EnumDiscriminants, EnumIter, EnumString, ToString}; -use xrdb::Colors; -pub mod colors { - pub const WHITE: (u8, u8, u8) = (238, 238, 238); - pub const GREEN: (u8, u8, u8) = (175, 255, 0); - pub const GRAY: (u8, u8, u8) = (68, 68, 68); - pub const BRIGHT_GRAY: (u8, u8, u8) = (138, 138, 138); - pub const RED: (u8, u8, u8) = (135, 0, 0); - pub const BLACK: (u8, u8, u8) = (0, 0, 0); -} - -#[derive(Clone, Copy, Debug, Serialize, Deserialize)] -pub struct Palette { - pub fg: (u8, u8, u8), - pub bg: (u8, u8, u8), - pub black: (u8, u8, u8), - pub red: (u8, u8, u8), - pub green: (u8, u8, u8), - pub yellow: (u8, u8, u8), - pub blue: (u8, u8, u8), - pub magenta: (u8, u8, u8), - pub cyan: (u8, u8, u8), - pub white: (u8, u8, u8), -} - -impl Palette { - pub fn new() -> Self { - let palette = match Colors::new("xresources") { - Some(colors) => { - let fg = colors.fg.unwrap(); - let fg_imm = &fg; - let fg_hex: &str = &fg_imm; - let fg = Rgb::from_hex_str(fg_hex).unwrap().as_tuple(); - let fg = (fg.0 as u8, fg.1 as u8, fg.2 as u8); - let bg = colors.bg.unwrap(); - let bg_imm = &bg; - let bg_hex: &str = &bg_imm; - let bg = Rgb::from_hex_str(bg_hex).unwrap().as_tuple(); - let bg = (bg.0 as u8, bg.1 as u8, bg.2 as u8); - let colors: Vec<(u8, u8, u8)> = colors - .colors - .iter() - .map(|c| { - let c = c.clone(); - let imm_str = &c.unwrap(); - let hex_str: &str = &imm_str; - let rgb = Rgb::from_hex_str(hex_str).unwrap().as_tuple(); - (rgb.0 as u8, rgb.1 as u8, rgb.2 as u8) - }) - .collect(); - Self { - fg, - bg, - black: colors[0], - red: colors[1], - green: colors[2], - yellow: colors[3], - blue: colors[4], - magenta: colors[5], - cyan: colors[6], - white: colors[7], - } - } - None => Self { - fg: colors::BRIGHT_GRAY, - bg: colors::BLACK, - black: colors::BLACK, - red: colors::RED, - green: colors::GREEN, - yellow: colors::GRAY, - blue: colors::GRAY, - magenta: colors::GRAY, - cyan: colors::GRAY, - white: colors::WHITE, - }, - }; - palette - } -} -impl Default for Palette { - fn default() -> Palette { - Palette::new() - } -} #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] pub enum Key { @@ -142,6 +58,20 @@ impl Default for InputMode { } } +#[derive(Clone, Copy, Default, Debug, Serialize, Deserialize)] +pub struct Palette { + pub fg: (u8, u8, u8), + pub bg: (u8, u8, u8), + pub black: (u8, u8, u8), + pub red: (u8, u8, u8), + pub green: (u8, u8, u8), + pub yellow: (u8, u8, u8), + pub blue: (u8, u8, u8), + pub magenta: (u8, u8, u8), + pub cyan: (u8, u8, u8), + pub white: (u8, u8, u8), +} + /// Represents the contents of the help message that is printed in the status bar, /// which indicates the current [`InputMode`] and what the keybinds for that mode /// are. Related to the default `status-bar` plugin. From 42890d4e64f8176e20dd5f2fc8e87087bb9978f9 Mon Sep 17 00:00:00 2001 From: denis Date: Sun, 28 Mar 2021 10:51:15 +0300 Subject: [PATCH 04/21] wip: replace the impl with a fn load_palette instead --- src/client/boundaries.rs | 4 +- src/client/tab.rs | 6 +- src/common/input/handler.rs | 4 +- src/common/mod.rs | 120 ++++++++++++++++-------------------- src/common/screen.rs | 3 +- 5 files changed, 59 insertions(+), 78 deletions(-) diff --git a/src/client/boundaries.rs b/src/client/boundaries.rs index 70671b6b..cd489be0 100644 --- a/src/client/boundaries.rs +++ b/src/client/boundaries.rs @@ -1,8 +1,8 @@ -use crate::common::{colors, Palette}; +use crate::common::colors; use crate::tab::Pane; use ansi_term::Colour::RGB; use std::collections::HashMap; -use zellij_tile::data::InputMode; +use zellij_tile::data::{InputMode, Palette}; use std::fmt::{Display, Error, Formatter}; pub mod boundary_type { diff --git a/src/client/tab.rs b/src/client/tab.rs index 9203d75b..33a25446 100644 --- a/src/client/tab.rs +++ b/src/client/tab.rs @@ -1,9 +1,7 @@ //! `Tab`s holds multiple panes. It tracks their coordinates (x/y) and size, //! as well as how they should be resized -use crate::common::{ - colors, input::handler::parse_keys, AppInstruction, Palette, SenderWithContext, -}; +use crate::common::{colors, input::handler::parse_keys, AppInstruction, SenderWithContext}; use crate::layout::Layout; use crate::panes::{PaneId, PositionAndSize, TerminalPane}; use crate::pty_bus::{PtyInstruction, VteEvent}; @@ -16,7 +14,7 @@ use std::{ collections::{BTreeMap, HashSet}, }; use std::{io::Write, sync::mpsc::channel}; -use zellij_tile::data::{Event, InputMode}; +use zellij_tile::data::{Event, InputMode, Palette}; const CURSOR_HEIGHT_WIDTH_RATIO: usize = 4; // this is not accurate and kind of a magic number, TODO: look into this const MIN_TERMINAL_HEIGHT: usize = 2; diff --git a/src/common/input/handler.rs b/src/common/input/handler.rs index 385c1453..163e5ddf 100644 --- a/src/common/input/handler.rs +++ b/src/common/input/handler.rs @@ -2,7 +2,7 @@ use super::actions::Action; use super::keybinds::get_default_keybinds; -use crate::common::{AppInstruction, Palette, SenderWithContext, OPENCALLS}; +use crate::common::{load_palette, AppInstruction, SenderWithContext, OPENCALLS}; use crate::errors::ContextType; use crate::os_input_output::OsApi; use crate::pty_bus::PtyInstruction; @@ -256,7 +256,7 @@ impl InputHandler { // TODO this should probably be automatically generated in some way pub fn get_mode_info(mode: InputMode) -> ModeInfo { let mut keybinds: Vec<(String, String)> = vec![]; - let mut palette = Palette::new(); + let mut palette = load_palette(); match mode { InputMode::Normal | InputMode::Locked => {} InputMode::Resize => { diff --git a/src/common/mod.rs b/src/common/mod.rs index dbfdf1f3..1d9345b8 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -39,7 +39,7 @@ use wasm_vm::{wasi_stdout, wasi_write_string, zellij_imports, PluginInstruction} use wasmer::{ChainableNamedResolver, Instance, Module, Store, Value}; use wasmer_wasi::{Pipe, WasiState}; use xrdb::Colors; -use zellij_tile::data::{EventType, InputMode}; +use zellij_tile::data::{EventType, InputMode, Palette}; #[derive(Serialize, Deserialize, Debug)] pub enum ApiCommand { @@ -126,73 +126,57 @@ pub mod colors { pub const BLACK: (u8, u8, u8) = (0, 0, 0); } -#[derive(Clone, Copy, Debug, Serialize, Deserialize)] -pub struct Palette { - pub fg: (u8, u8, u8), - pub bg: (u8, u8, u8), - pub black: (u8, u8, u8), - pub red: (u8, u8, u8), - pub green: (u8, u8, u8), - pub yellow: (u8, u8, u8), - pub blue: (u8, u8, u8), - pub magenta: (u8, u8, u8), - pub cyan: (u8, u8, u8), - pub white: (u8, u8, u8), -} - -impl Palette { - pub fn new() -> Self { - let palette = match Colors::new("xresources") { - Some(colors) => { - let fg = colors.fg.unwrap(); - let fg_imm = &fg; - let fg_hex: &str = &fg_imm; - let fg = Rgb::from_hex_str(fg_hex).unwrap().as_tuple(); - let fg = (fg.0 as u8, fg.1 as u8, fg.2 as u8); - let bg = colors.bg.unwrap(); - let bg_imm = &bg; - let bg_hex: &str = &bg_imm; - let bg = Rgb::from_hex_str(bg_hex).unwrap().as_tuple(); - let bg = (bg.0 as u8, bg.1 as u8, bg.2 as u8); - let colors: Vec<(u8, u8, u8)> = colors - .colors - .iter() - .map(|c| { - let c = c.clone(); - let imm_str = &c.unwrap(); - let hex_str: &str = &imm_str; - let rgb = Rgb::from_hex_str(hex_str).unwrap().as_tuple(); - (rgb.0 as u8, rgb.1 as u8, rgb.2 as u8) - }) - .collect(); - Self { - fg, - bg, - black: colors[0], - red: colors[1], - green: colors[2], - yellow: colors[3], - blue: colors[4], - magenta: colors[5], - cyan: colors[6], - white: colors[7], - } +pub fn load_palette() -> Palette { + let palette = match Colors::new("xresources") { + Some(colors) => { + let fg = colors.fg.unwrap(); + let fg_imm = &fg; + let fg_hex: &str = &fg_imm; + let fg = Rgb::from_hex_str(fg_hex).unwrap().as_tuple(); + let fg = (fg.0 as u8, fg.1 as u8, fg.2 as u8); + let bg = colors.bg.unwrap(); + let bg_imm = &bg; + let bg_hex: &str = &bg_imm; + let bg = Rgb::from_hex_str(bg_hex).unwrap().as_tuple(); + let bg = (bg.0 as u8, bg.1 as u8, bg.2 as u8); + let colors: Vec<(u8, u8, u8)> = colors + .colors + .iter() + .map(|c| { + let c = c.clone(); + let imm_str = &c.unwrap(); + let hex_str: &str = &imm_str; + let rgb = Rgb::from_hex_str(hex_str).unwrap().as_tuple(); + (rgb.0 as u8, rgb.1 as u8, rgb.2 as u8) + }) + .collect(); + Palette { + fg, + bg, + black: colors[0], + red: colors[1], + green: colors[2], + yellow: colors[3], + blue: colors[4], + magenta: colors[5], + cyan: colors[6], + white: colors[7], } - None => Self { - fg: colors::BRIGHT_GRAY, - bg: colors::BLACK, - black: colors::BLACK, - red: colors::RED, - green: colors::GREEN, - yellow: colors::GRAY, - blue: colors::GRAY, - magenta: colors::GRAY, - cyan: colors::GRAY, - white: colors::WHITE, - }, - }; - palette - } + } + None => Palette { + fg: colors::BRIGHT_GRAY, + bg: colors::BLACK, + black: colors::BLACK, + red: colors::RED, + green: colors::GREEN, + yellow: colors::GRAY, + blue: colors::GRAY, + magenta: colors::GRAY, + cyan: colors::GRAY, + white: colors::WHITE, + }, + }; + palette } /// Start Zellij with the specified [`OsApi`] and command-line arguments. @@ -326,7 +310,7 @@ pub fn start(mut os_input: Box, opts: CliArgs) { let send_plugin_instructions = send_plugin_instructions.clone(); let send_app_instructions = send_app_instructions.clone(); let max_panes = opts.max_panes; - let colors = Palette::new(); + let colors = load_palette(); // debug_log_to_file(format!("{:?}", colors)); move || { let mut screen = Screen::new( diff --git a/src/common/screen.rs b/src/common/screen.rs index 999b6391..e11b734d 100644 --- a/src/common/screen.rs +++ b/src/common/screen.rs @@ -6,7 +6,6 @@ use std::str; use std::sync::mpsc::Receiver; use super::{AppInstruction, SenderWithContext}; -use crate::common::Palette; use crate::os_input_output::OsApi; use crate::panes::PositionAndSize; use crate::pty_bus::{PtyInstruction, VteEvent}; @@ -14,7 +13,7 @@ use crate::tab::Tab; use crate::{errors::ErrorContext, wasm_vm::PluginInstruction}; use crate::{layout::Layout, panes::PaneId}; -use zellij_tile::data::{Event, InputMode, TabInfo}; +use zellij_tile::data::{Event, InputMode, Palette, TabInfo}; /// Instructions that can be sent to the [`Screen`]. #[derive(Debug, Clone)] From 2b59edbe9d97fce23bd3ca2716d9eb540aa77695 Mon Sep 17 00:00:00 2001 From: denis Date: Wed, 31 Mar 2021 09:44:41 +0300 Subject: [PATCH 05/21] wip: need to set the default for Palette in the plugins --- src/common/input/handler.rs | 2 +- zellij-tile/src/data.rs | 28 +++++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/common/input/handler.rs b/src/common/input/handler.rs index 163e5ddf..a843c7cc 100644 --- a/src/common/input/handler.rs +++ b/src/common/input/handler.rs @@ -256,7 +256,7 @@ impl InputHandler { // TODO this should probably be automatically generated in some way pub fn get_mode_info(mode: InputMode) -> ModeInfo { let mut keybinds: Vec<(String, String)> = vec![]; - let mut palette = load_palette(); + let palette = load_palette(); match mode { InputMode::Normal | InputMode::Locked => {} InputMode::Resize => { diff --git a/zellij-tile/src/data.rs b/zellij-tile/src/data.rs index 16f02531..c41a40ee 100644 --- a/zellij-tile/src/data.rs +++ b/zellij-tile/src/data.rs @@ -58,7 +58,16 @@ impl Default for InputMode { } } -#[derive(Clone, Copy, Default, Debug, Serialize, Deserialize)] +pub mod colors { + pub const WHITE: (u8, u8, u8) = (238, 238, 238); + pub const GREEN: (u8, u8, u8) = (175, 255, 0); + pub const GRAY: (u8, u8, u8) = (68, 68, 68); + pub const BRIGHT_GRAY: (u8, u8, u8) = (138, 138, 138); + pub const RED: (u8, u8, u8) = (135, 0, 0); + pub const BLACK: (u8, u8, u8) = (0, 0, 0); +} + +#[derive(Clone, Copy, Debug, Serialize, Deserialize)] pub struct Palette { pub fg: (u8, u8, u8), pub bg: (u8, u8, u8), @@ -72,6 +81,23 @@ pub struct Palette { pub white: (u8, u8, u8), } +impl Default for Palette { + fn default() -> Palette { + Palette { + fg: colors::BRIGHT_GRAY, + bg: colors::BLACK, + black: colors::BLACK, + red: colors::RED, + green: colors::GREEN, + yellow: colors::GRAY, + blue: colors::GRAY, + magenta: colors::GRAY, + cyan: colors::GRAY, + white: colors::WHITE, + } + } +} + /// Represents the contents of the help message that is printed in the status bar, /// which indicates the current [`InputMode`] and what the keybinds for that mode /// are. Related to the default `status-bar` plugin. From a6ad8e6f157ef8800eb692e520fa52a1bd314e4e Mon Sep 17 00:00:00 2001 From: denis Date: Fri, 2 Apr 2021 11:24:13 +0300 Subject: [PATCH 06/21] wip: sending the ModeInfo on initial plugin load --- default-tiles/status-bar/src/main.rs | 12 ++++++------ src/common/mod.rs | 5 ++++- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/default-tiles/status-bar/src/main.rs b/default-tiles/status-bar/src/main.rs index 337c4a82..f3cd4dc4 100644 --- a/default-tiles/status-bar/src/main.rs +++ b/default-tiles/status-bar/src/main.rs @@ -67,16 +67,16 @@ impl ZellijTile for State { println!( "{}\u{1b}[{};{};{}m\u{1b}[0K", first_line, - self.mode_info.palette.bg.0, - self.mode_info.palette.bg.1, - self.mode_info.palette.bg.2 + self.mode_info.palette.black.0, + self.mode_info.palette.black.1, + self.mode_info.palette.black.2 ); println!( "{}\u{1b}[{};{};{}m\u{1b}[0K", second_line, - self.mode_info.palette.bg.0, - self.mode_info.palette.bg.1, - self.mode_info.palette.bg.2 + self.mode_info.palette.fg.0, + self.mode_info.palette.fg.1, + self.mode_info.palette.fg.2 ); } } diff --git a/src/common/mod.rs b/src/common/mod.rs index 38f3b533..bbb2242c 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -321,7 +321,10 @@ pub fn start(mut os_input: Box, opts: CliArgs) { &full_screen_ws, os_input, max_panes, - ModeInfo::default(), + ModeInfo { + palette: colors, + ..ModeInfo::default() + }, InputMode::Normal, colors, ); From b9f3e35a4af67b0d43f1cf772b893404a7ebde18 Mon Sep 17 00:00:00 2001 From: denis Date: Fri, 9 Apr 2021 14:56:04 +0300 Subject: [PATCH 07/21] wip: looks cleaner --- default-tiles/status-bar/src/first_line.rs | 84 +++++++++------------- default-tiles/status-bar/src/main.rs | 6 +- default-tiles/tab-bar/src/main.rs | 8 +-- 3 files changed, 41 insertions(+), 57 deletions(-) diff --git a/default-tiles/status-bar/src/first_line.rs b/default-tiles/status-bar/src/first_line.rs index 06914051..11c17dac 100644 --- a/default-tiles/status-bar/src/first_line.rs +++ b/default-tiles/status-bar/src/first_line.rs @@ -63,51 +63,37 @@ impl CtrlKeyShortcut { } } -fn get_bg(palette: Palette) -> (u8, u8, u8) { - match palette.theme { - Theme::Dark => palette.white, - Theme::Light => palette.fg, - } -} - -fn get_fg(palette: Palette) -> (u8, u8, u8) { - match palette.theme { - Theme::Dark => palette.black, - Theme::Light => palette.bg, - } -} - fn unselected_mode_shortcut(letter: char, text: &str, palette: Palette) -> LinePart { let prefix_separator = Style::new() - .fg(RGB(get_fg(palette).0, get_fg(palette).1, get_fg(palette).2)) - .on(RGB(get_bg(palette).0, get_bg(palette).1, get_bg(palette).2)) + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .paint(ARROW_SEPARATOR); let char_left_separator = Style::new() .bold() - .fg(RGB(get_fg(palette).0, get_fg(palette).1, get_fg(palette).2)) - .on(RGB(get_bg(palette).0, get_bg(palette).1, get_bg(palette).2)) + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .bold() .paint(" <"); let char_shortcut = Style::new() .bold() .fg(RGB(palette.red.0, palette.red.1, palette.red.2)) - .on(RGB(get_bg(palette).0, get_bg(palette).1, get_bg(palette).2)) + .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .bold() .paint(letter.to_string()); let char_right_separator = Style::new() .bold() - .fg(RGB(get_fg(palette).0, get_fg(palette).1, get_fg(palette).2)) - .on(RGB(get_bg(palette).0, get_bg(palette).1, get_bg(palette).2)) + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .bold() .paint(">"); let styled_text = Style::new() - .fg(RGB(get_fg(palette).0, get_fg(palette).1, get_fg(palette).2)) - .on(RGB(get_bg(palette).0, get_bg(palette).1, get_bg(palette).2)) + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .bold() .paint(format!("{} ", text)); let suffix_separator = Style::new() - .fg(RGB(get_fg(palette).0, get_fg(palette).1, get_fg(palette).2)) - .on(RGB(get_bg(palette).0, get_bg(palette).1, get_bg(palette).2)) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) .paint(ARROW_SEPARATOR); LinePart { part: ANSIStrings(&[ @@ -125,12 +111,11 @@ fn unselected_mode_shortcut(letter: char, text: &str, palette: Palette) -> LineP fn selected_mode_shortcut(letter: char, text: &str, palette: Palette) -> LinePart { let prefix_separator = Style::new() - .fg(RGB(get_fg(palette).0, get_fg(palette).1, get_fg(palette).2)) - .on(RGB(get_bg(palette).0, get_bg(palette).1, get_bg(palette).2)) + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .on(RGB(palette.green.0, palette.green.1, palette.green.2)) .paint(ARROW_SEPARATOR); let char_left_separator = Style::new() - .bold() - .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .on(RGB(palette.green.0, palette.green.1, palette.green.2)) .bold() .paint(format!(" <")); @@ -141,19 +126,18 @@ fn selected_mode_shortcut(letter: char, text: &str, palette: Palette) -> LinePar .bold() .paint(format!("{}", letter)); let char_right_separator = Style::new() - .bold() - .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .on(RGB(palette.green.0, palette.green.1, palette.green.2)) .bold() .paint(format!(">")); let styled_text = Style::new() - .fg(RGB(get_fg(palette).0, get_fg(palette).1, get_fg(palette).2)) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .on(RGB(palette.green.0, palette.green.1, palette.green.2)) .bold() .paint(format!("{} ", text)); let suffix_separator = Style::new() - .fg(RGB(get_fg(palette).0, get_fg(palette).1, get_fg(palette).2)) - .on(RGB(palette.green.0, palette.green.1, palette.green.2)) + .fg(RGB(palette.green.0, palette.green.1, palette.green.2)) + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) .paint(ARROW_SEPARATOR); LinePart { part: ANSIStrings(&[ @@ -171,17 +155,17 @@ fn selected_mode_shortcut(letter: char, text: &str, palette: Palette) -> LinePar fn disabled_mode_shortcut(text: &str, palette: Palette) -> LinePart { let prefix_separator = Style::new() - .fg(RGB(get_fg(palette).0, get_fg(palette).1, get_fg(palette).2)) - .on(RGB(get_bg(palette).0, get_bg(palette).1, get_bg(palette).2)) + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .paint(ARROW_SEPARATOR); let styled_text = Style::new() - .fg(RGB(get_fg(palette).0, get_fg(palette).1, get_fg(palette).2)) - .on(RGB(get_bg(palette).0, get_bg(palette).1, get_bg(palette).2)) + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .dimmed() .paint(format!("{} ", text)); let suffix_separator = Style::new() - .fg(RGB(get_fg(palette).0, get_fg(palette).1, get_fg(palette).2)) - .on(RGB(get_bg(palette).0, get_bg(palette).1, get_bg(palette).2)) + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .paint(ARROW_SEPARATOR); LinePart { part: format!("{}{}{}", prefix_separator, styled_text, suffix_separator), @@ -193,7 +177,7 @@ fn selected_mode_shortcut_single_letter(letter: char, palette: Palette) -> LineP let char_shortcut_text = format!(" {} ", letter); let len = char_shortcut_text.chars().count() + 4; // 2 for the arrows, 2 for the padding let prefix_separator = Style::new() - .fg(RGB(get_fg(palette).0, get_fg(palette).1, get_fg(palette).2)) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .on(RGB(palette.green.0, palette.green.1, palette.green.2)) .paint(ARROW_SEPARATOR); let char_shortcut = Style::new() @@ -203,8 +187,8 @@ fn selected_mode_shortcut_single_letter(letter: char, palette: Palette) -> LineP .bold() .paint(char_shortcut_text); let suffix_separator = Style::new() - .fg(RGB(get_fg(palette).0, get_fg(palette).1, get_fg(palette).2)) - .on(RGB(get_bg(palette).0, get_bg(palette).1, get_bg(palette).2)) + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .paint(ARROW_SEPARATOR); LinePart { part: ANSIStrings(&[prefix_separator, char_shortcut, suffix_separator]).to_string(), @@ -216,18 +200,18 @@ fn unselected_mode_shortcut_single_letter(letter: char, palette: Palette) -> Lin let char_shortcut_text = format!(" {} ", letter); let len = char_shortcut_text.chars().count() + 4; // 2 for the arrows, 2 for the padding let prefix_separator = Style::new() - .fg(RGB(get_fg(palette).0, get_fg(palette).1, get_fg(palette).2)) - .on(RGB(get_bg(palette).0, get_bg(palette).1, get_bg(palette).2)) + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .paint(ARROW_SEPARATOR); let char_shortcut = Style::new() .bold() .fg(RGB(palette.red.0, palette.red.1, palette.red.2)) - .on(RGB(get_bg(palette).0, get_bg(palette).1, get_bg(palette).2)) + .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .bold() .paint(char_shortcut_text); let suffix_separator = Style::new() - .fg(RGB(get_fg(palette).0, get_fg(palette).1, get_fg(palette).2)) - .on(RGB(get_bg(palette).0, get_bg(palette).1, get_bg(palette).2)) + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .paint(ARROW_SEPARATOR); LinePart { part: ANSIStrings(&[prefix_separator, char_shortcut, suffix_separator]).to_string(), @@ -318,8 +302,8 @@ fn key_indicators(max_len: usize, keys: &[CtrlKeyShortcut], palette: Palette) -> pub fn superkey(palette: Palette) -> LinePart { let prefix_text = " Ctrl + "; let prefix = Style::new() - .fg(RGB(get_fg(palette).0, get_fg(palette).1, get_fg(palette).2)) - .on(RGB(get_bg(palette).0, get_bg(palette).1, get_bg(palette).2)) + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .bold() .paint(prefix_text); LinePart { diff --git a/default-tiles/status-bar/src/main.rs b/default-tiles/status-bar/src/main.rs index b73de84d..95065467 100644 --- a/default-tiles/status-bar/src/main.rs +++ b/default-tiles/status-bar/src/main.rs @@ -67,9 +67,9 @@ impl ZellijTile for State { println!( "{}\u{1b}[48;2;{};{};{}m\u{1b}[0K", first_line, - self.mode_info.palette.fg.0, - self.mode_info.palette.fg.1, - self.mode_info.palette.fg.2 + self.mode_info.palette.bg.0, + self.mode_info.palette.bg.1, + self.mode_info.palette.bg.2 ); println!("\u{1b}[m{}\u{1b}[0K", second_line); } diff --git a/default-tiles/tab-bar/src/main.rs b/default-tiles/tab-bar/src/main.rs index a43c3e59..5a7da98e 100644 --- a/default-tiles/tab-bar/src/main.rs +++ b/default-tiles/tab-bar/src/main.rs @@ -74,11 +74,11 @@ impl ZellijTile for State { s = format!("{}{}", s, bar_part.part); } println!( - "{}\u{1b}[{};{};{}m\u{1b}[0K", + "{}\u{1b}[48;2;{};{};{}m\u{1b}[0K", s, - self.mode_info.palette.bg.0, - self.mode_info.palette.bg.1, - self.mode_info.palette.bg.2 + self.mode_info.palette.fg.0, + self.mode_info.palette.fg.1, + self.mode_info.palette.fg.2 ); } } From b2139f4f3472b0cae18a106479e8a1ef92f7115e Mon Sep 17 00:00:00 2001 From: denis Date: Tue, 13 Apr 2021 14:19:23 +0300 Subject: [PATCH 08/21] wip: fixing the first arrow --- default-tiles/status-bar/src/first_line.rs | 17 +++++++++++------ default-tiles/status-bar/src/second_line.rs | 1 - 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/default-tiles/status-bar/src/first_line.rs b/default-tiles/status-bar/src/first_line.rs index 11c17dac..4053210d 100644 --- a/default-tiles/status-bar/src/first_line.rs +++ b/default-tiles/status-bar/src/first_line.rs @@ -164,8 +164,8 @@ fn disabled_mode_shortcut(text: &str, palette: Palette) -> LinePart { .dimmed() .paint(format!("{} ", text)); let suffix_separator = Style::new() - .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) .paint(ARROW_SEPARATOR); LinePart { part: format!("{}{}{}", prefix_separator, styled_text, suffix_separator), @@ -187,7 +187,7 @@ fn selected_mode_shortcut_single_letter(letter: char, palette: Palette) -> LineP .bold() .paint(char_shortcut_text); let suffix_separator = Style::new() - .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .fg(RGB(palette.green.0, palette.green.1, palette.green.2)) .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .paint(ARROW_SEPARATOR); LinePart { @@ -210,8 +210,8 @@ fn unselected_mode_shortcut_single_letter(letter: char, palette: Palette) -> Lin .bold() .paint(char_shortcut_text); let suffix_separator = Style::new() - .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) .paint(ARROW_SEPARATOR); LinePart { part: ANSIStrings(&[prefix_separator, char_shortcut, suffix_separator]).to_string(), @@ -306,8 +306,13 @@ pub fn superkey(palette: Palette) -> LinePart { .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .bold() .paint(prefix_text); + + let suffix_separator = Style::new() + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .paint(ARROW_SEPARATOR); LinePart { - part: prefix.to_string(), + part: ANSIStrings(&[prefix, suffix_separator]).to_string(), len: prefix_text.chars().count(), } } diff --git a/default-tiles/status-bar/src/second_line.rs b/default-tiles/status-bar/src/second_line.rs index bc050b5a..1b2a74cd 100644 --- a/default-tiles/status-bar/src/second_line.rs +++ b/default-tiles/status-bar/src/second_line.rs @@ -220,7 +220,6 @@ fn locked_interface_indication(palette: Palette) -> LinePart { let locked_text = " -- INTERFACE LOCKED -- "; let locked_text_len = locked_text.chars().count(); let locked_styled_text = Style::new() - .on(RGB(palette.black.0, palette.black.1, palette.black.2)) .fg(RGB(palette.white.0, palette.white.1, palette.white.2)) .bold() .paint(locked_text); From ae3537957b7b1a580e7e4920bfc4d5cbb27ca97c Mon Sep 17 00:00:00 2001 From: denis Date: Thu, 22 Apr 2021 12:10:41 +0300 Subject: [PATCH 09/21] wip: new build?" --- Cargo.toml | 2 +- default-plugins/status-bar/src/first_line.rs | 2 +- src/common/mod.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 8dc39d39..53eb0cd1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,7 +37,7 @@ wasmer = "1.0.0" wasmer-wasi = "1.0.0" interprocess = "1.0.1" xrdb = "0.1.1" -colors-transform = "0.2.5 +colors-transform = "0.2.5" zellij-tile = { path = "zellij-tile/", version = "1.0.0" } [dependencies.async-std] diff --git a/default-plugins/status-bar/src/first_line.rs b/default-plugins/status-bar/src/first_line.rs index 4053210d..2f298256 100644 --- a/default-plugins/status-bar/src/first_line.rs +++ b/default-plugins/status-bar/src/first_line.rs @@ -307,7 +307,7 @@ pub fn superkey(palette: Palette) -> LinePart { .bold() .paint(prefix_text); - let suffix_separator = Style::new() + let suffix_separator = Style::new() .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) .paint(ARROW_SEPARATOR); diff --git a/src/common/mod.rs b/src/common/mod.rs index 3bb5ca88..af189915 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -26,8 +26,8 @@ use crate::cli::CliArgs; use crate::common::input::config::Config; use crate::layout::Layout; use crate::panes::PaneId; -use colors_transform::{Color, Rgb}; use async_std::task_local; +use colors_transform::{Color, Rgb}; use command_is_executing::CommandIsExecuting; use directories_next::ProjectDirs; use errors::{ From fef466c74b5652f282e837fc5aeb1c68ec15a025 Mon Sep 17 00:00:00 2001 From: denis Date: Sat, 24 Apr 2021 10:21:25 +0300 Subject: [PATCH 10/21] wip: the only way to make the default look like on main is to make more customizable colored elements --- default-plugins/status-bar/src/first_line.rs | 174 ++++-------- default-plugins/status-bar/src/main.rs | 284 ++++++++++++++++++- src/common/utils/shared.rs | 7 +- zellij-tile/src/data.rs | 8 + 4 files changed, 345 insertions(+), 128 deletions(-) diff --git a/default-plugins/status-bar/src/first_line.rs b/default-plugins/status-bar/src/first_line.rs index 2f298256..02f67c78 100644 --- a/default-plugins/status-bar/src/first_line.rs +++ b/default-plugins/status-bar/src/first_line.rs @@ -1,8 +1,11 @@ use ansi_term::{ANSIStrings, Color::RGB, Style}; use zellij_tile::prelude::*; -use crate::colors::{BLACK, BRIGHT_GRAY, GRAY, GREEN, RED, WHITE}; -use crate::{LinePart, ARROW_SEPARATOR}; +use crate::{ + color_elements, + colors::{BLACK, BRIGHT_GRAY, GRAY, GREEN, RED, WHITE}, +}; +use crate::{ColoredElements, LinePart, ARROW_SEPARATOR}; struct CtrlKeyShortcut { mode: CtrlKeyMode, @@ -63,38 +66,13 @@ impl CtrlKeyShortcut { } } -fn unselected_mode_shortcut(letter: char, text: &str, palette: Palette) -> LinePart { - let prefix_separator = Style::new() - .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .paint(ARROW_SEPARATOR); - let char_left_separator = Style::new() - .bold() - .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .bold() - .paint(" <"); - let char_shortcut = Style::new() - .bold() - .fg(RGB(palette.red.0, palette.red.1, palette.red.2)) - .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .bold() - .paint(letter.to_string()); - let char_right_separator = Style::new() - .bold() - .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .bold() - .paint(">"); - let styled_text = Style::new() - .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .bold() - .paint(format!("{} ", text)); - let suffix_separator = Style::new() - .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .paint(ARROW_SEPARATOR); +fn unselected_mode_shortcut(letter: char, text: &str, palette: ColoredElements) -> LinePart { + let prefix_separator = palette.unselected_prefix_separator.paint(ARROW_SEPARATOR); + let char_left_separator = palette.unselected_char_left_separator.paint(" <"); + let char_shortcut = palette.unselected_char_shortcut.paint(letter.to_string()); + let char_right_separator = palette.unselected_char_right_separator.paint(">"); + let styled_text = palette.unselected_styled_text.paint(format!("{} ", text)); + let suffix_separator = palette.unselected_suffix_separator.paint(ARROW_SEPARATOR); LinePart { part: ANSIStrings(&[ prefix_separator, @@ -109,36 +87,13 @@ fn unselected_mode_shortcut(letter: char, text: &str, palette: Palette) -> LineP } } -fn selected_mode_shortcut(letter: char, text: &str, palette: Palette) -> LinePart { - let prefix_separator = Style::new() - .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .on(RGB(palette.green.0, palette.green.1, palette.green.2)) - .paint(ARROW_SEPARATOR); - let char_left_separator = Style::new() - .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .on(RGB(palette.green.0, palette.green.1, palette.green.2)) - .bold() - .paint(format!(" <")); - let char_shortcut = Style::new() - .bold() - .fg(RGB(palette.red.0, palette.red.1, palette.red.2)) - .on(RGB(palette.green.0, palette.green.1, palette.green.2)) - .bold() - .paint(format!("{}", letter)); - let char_right_separator = Style::new() - .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .on(RGB(palette.green.0, palette.green.1, palette.green.2)) - .bold() - .paint(format!(">")); - let styled_text = Style::new() - .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .on(RGB(palette.green.0, palette.green.1, palette.green.2)) - .bold() - .paint(format!("{} ", text)); - let suffix_separator = Style::new() - .fg(RGB(palette.green.0, palette.green.1, palette.green.2)) - .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .paint(ARROW_SEPARATOR); +fn selected_mode_shortcut(letter: char, text: &str, palette: ColoredElements) -> LinePart { + let prefix_separator = palette.selected_prefix_separator.paint(ARROW_SEPARATOR); + let char_left_separator = palette.selected_char_left_separator.paint(format!(" <")); + let char_shortcut = palette.selected_char_shortcut.paint(format!("{}", letter)); + let char_right_separator = palette.selected_char_right_separator.paint(format!(">")); + let styled_text = palette.selected_styled_text.paint(format!("{} ", text)); + let suffix_separator = palette.selected_suffix_separator.paint(ARROW_SEPARATOR); LinePart { part: ANSIStrings(&[ prefix_separator, @@ -153,42 +108,27 @@ fn selected_mode_shortcut(letter: char, text: &str, palette: Palette) -> LinePar } } -fn disabled_mode_shortcut(text: &str, palette: Palette) -> LinePart { - let prefix_separator = Style::new() - .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .paint(ARROW_SEPARATOR); - let styled_text = Style::new() - .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .dimmed() - .paint(format!("{} ", text)); - let suffix_separator = Style::new() - .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .paint(ARROW_SEPARATOR); +fn disabled_mode_shortcut(text: &str, palette: ColoredElements) -> LinePart { + let prefix_separator = palette.disabled_prefix_separator.paint(ARROW_SEPARATOR); + let styled_text = palette.disabled_styled_text.paint(format!("{} ", text)); + let suffix_separator = palette.disabled_suffix_separator.paint(ARROW_SEPARATOR); LinePart { part: format!("{}{}{}", prefix_separator, styled_text, suffix_separator), len: text.chars().count() + 2 + 1, // 2 for the arrows, 1 for the padding in the end } } -fn selected_mode_shortcut_single_letter(letter: char, palette: Palette) -> LinePart { +fn selected_mode_shortcut_single_letter(letter: char, palette: ColoredElements) -> LinePart { let char_shortcut_text = format!(" {} ", letter); let len = char_shortcut_text.chars().count() + 4; // 2 for the arrows, 2 for the padding - let prefix_separator = Style::new() - .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .on(RGB(palette.green.0, palette.green.1, palette.green.2)) + let prefix_separator = palette + .selected_single_letter_prefix_separator .paint(ARROW_SEPARATOR); - let char_shortcut = Style::new() - .bold() - .fg(RGB(palette.red.0, palette.red.1, palette.red.2)) - .on(RGB(palette.green.0, palette.green.1, palette.green.2)) - .bold() + let char_shortcut = palette + .selected_single_letter_char_shortcut .paint(char_shortcut_text); - let suffix_separator = Style::new() - .fg(RGB(palette.green.0, palette.green.1, palette.green.2)) - .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + let suffix_separator = palette + .selected_single_letter_suffix_separator .paint(ARROW_SEPARATOR); LinePart { part: ANSIStrings(&[prefix_separator, char_shortcut, suffix_separator]).to_string(), @@ -196,22 +136,17 @@ fn selected_mode_shortcut_single_letter(letter: char, palette: Palette) -> LineP } } -fn unselected_mode_shortcut_single_letter(letter: char, palette: Palette) -> LinePart { +fn unselected_mode_shortcut_single_letter(letter: char, palette: ColoredElements) -> LinePart { let char_shortcut_text = format!(" {} ", letter); let len = char_shortcut_text.chars().count() + 4; // 2 for the arrows, 2 for the padding - let prefix_separator = Style::new() - .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + let prefix_separator = palette + .unselected_single_letter_prefix_separator .paint(ARROW_SEPARATOR); - let char_shortcut = Style::new() - .bold() - .fg(RGB(palette.red.0, palette.red.1, palette.red.2)) - .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .bold() + let char_shortcut = palette + .unselected_single_letter_char_shortcut .paint(char_shortcut_text); - let suffix_separator = Style::new() - .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + let suffix_separator = palette + .unselected_single_letter_suffix_separator .paint(ARROW_SEPARATOR); LinePart { part: ANSIStrings(&[prefix_separator, char_shortcut, suffix_separator]).to_string(), @@ -219,7 +154,7 @@ fn unselected_mode_shortcut_single_letter(letter: char, palette: Palette) -> Lin } } -fn full_ctrl_key(key: &CtrlKeyShortcut, palette: Palette) -> LinePart { +fn full_ctrl_key(key: &CtrlKeyShortcut, palette: ColoredElements) -> LinePart { let full_text = key.full_text(); let letter_shortcut = key.letter_shortcut(); match key.mode { @@ -235,7 +170,7 @@ fn full_ctrl_key(key: &CtrlKeyShortcut, palette: Palette) -> LinePart { } } -fn shortened_ctrl_key(key: &CtrlKeyShortcut, palette: Palette) -> LinePart { +fn shortened_ctrl_key(key: &CtrlKeyShortcut, palette: ColoredElements) -> LinePart { let shortened_text = key.shortened_text(); let letter_shortcut = key.letter_shortcut(); let shortened_text = match key.action { @@ -258,7 +193,7 @@ fn shortened_ctrl_key(key: &CtrlKeyShortcut, palette: Palette) -> LinePart { } } -fn single_letter_ctrl_key(key: &CtrlKeyShortcut, palette: Palette) -> LinePart { +fn single_letter_ctrl_key(key: &CtrlKeyShortcut, palette: ColoredElements) -> LinePart { let letter_shortcut = key.letter_shortcut(); match key.mode { CtrlKeyMode::Unselected => unselected_mode_shortcut_single_letter(letter_shortcut, palette), @@ -267,7 +202,7 @@ fn single_letter_ctrl_key(key: &CtrlKeyShortcut, palette: Palette) -> LinePart { } } -fn key_indicators(max_len: usize, keys: &[CtrlKeyShortcut], palette: Palette) -> LinePart { +fn key_indicators(max_len: usize, keys: &[CtrlKeyShortcut], palette: ColoredElements) -> LinePart { let mut line_part = LinePart::default(); for ctrl_key in keys { let key = full_ctrl_key(ctrl_key, palette); @@ -299,18 +234,10 @@ fn key_indicators(max_len: usize, keys: &[CtrlKeyShortcut], palette: Palette) -> line_part } -pub fn superkey(palette: Palette) -> LinePart { +pub fn superkey(palette: ColoredElements) -> LinePart { let prefix_text = " Ctrl + "; - let prefix = Style::new() - .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .bold() - .paint(prefix_text); - - let suffix_separator = Style::new() - .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .paint(ARROW_SEPARATOR); + let prefix = palette.superkey_prefix.paint(prefix_text); + let suffix_separator = palette.superkey_suffix_separator.paint(ARROW_SEPARATOR); LinePart { part: ANSIStrings(&[prefix, suffix_separator]).to_string(), len: prefix_text.chars().count(), @@ -318,6 +245,7 @@ pub fn superkey(palette: Palette) -> LinePart { } pub fn ctrl_keys(help: &ModeInfo, max_len: usize) -> LinePart { + let colored_elements = color_elements(help.palette); match &help.mode { InputMode::Locked => key_indicators( max_len, @@ -329,7 +257,7 @@ pub fn ctrl_keys(help: &ModeInfo, max_len: usize) -> LinePart { CtrlKeyShortcut::new(CtrlKeyMode::Disabled, CtrlKeyAction::Scroll), CtrlKeyShortcut::new(CtrlKeyMode::Disabled, CtrlKeyAction::Quit), ], - help.palette, + colored_elements, ), InputMode::Resize => key_indicators( max_len, @@ -341,7 +269,7 @@ pub fn ctrl_keys(help: &ModeInfo, max_len: usize) -> LinePart { CtrlKeyShortcut::new(CtrlKeyMode::Unselected, CtrlKeyAction::Scroll), CtrlKeyShortcut::new(CtrlKeyMode::Unselected, CtrlKeyAction::Quit), ], - help.palette, + colored_elements, ), InputMode::Pane => key_indicators( max_len, @@ -353,7 +281,7 @@ pub fn ctrl_keys(help: &ModeInfo, max_len: usize) -> LinePart { CtrlKeyShortcut::new(CtrlKeyMode::Unselected, CtrlKeyAction::Scroll), CtrlKeyShortcut::new(CtrlKeyMode::Unselected, CtrlKeyAction::Quit), ], - help.palette, + colored_elements, ), InputMode::Tab | InputMode::RenameTab => key_indicators( max_len, @@ -365,7 +293,7 @@ pub fn ctrl_keys(help: &ModeInfo, max_len: usize) -> LinePart { CtrlKeyShortcut::new(CtrlKeyMode::Unselected, CtrlKeyAction::Scroll), CtrlKeyShortcut::new(CtrlKeyMode::Unselected, CtrlKeyAction::Quit), ], - help.palette, + colored_elements, ), InputMode::Scroll => key_indicators( max_len, @@ -377,7 +305,7 @@ pub fn ctrl_keys(help: &ModeInfo, max_len: usize) -> LinePart { CtrlKeyShortcut::new(CtrlKeyMode::Selected, CtrlKeyAction::Scroll), CtrlKeyShortcut::new(CtrlKeyMode::Unselected, CtrlKeyAction::Quit), ], - help.palette, + colored_elements, ), InputMode::Normal => key_indicators( max_len, @@ -389,7 +317,7 @@ pub fn ctrl_keys(help: &ModeInfo, max_len: usize) -> LinePart { CtrlKeyShortcut::new(CtrlKeyMode::Unselected, CtrlKeyAction::Scroll), CtrlKeyShortcut::new(CtrlKeyMode::Unselected, CtrlKeyAction::Quit), ], - help.palette, + colored_elements, ), } } diff --git a/default-plugins/status-bar/src/main.rs b/default-plugins/status-bar/src/main.rs index 10322c52..aaf1e53b 100644 --- a/default-plugins/status-bar/src/main.rs +++ b/default-plugins/status-bar/src/main.rs @@ -1,12 +1,17 @@ mod first_line; mod second_line; -use std::fmt::{Display, Error, Formatter}; -use zellij_tile::{data::Theme, prelude::*}; +use ansi_term::{Color::RGB, Style}; + +use std::{ + fmt::{Display, Error, Formatter}, +}; +use zellij_tile::{prelude::*}; use first_line::{ctrl_keys, superkey}; use second_line::keybinds; + pub mod colors { use ansi_term::Colour::{self, Fixed}; pub const WHITE: Colour = Fixed(255); @@ -41,6 +46,278 @@ impl Display for LinePart { } } +#[derive(Clone, Copy)] +pub struct ColoredElements { + // slected mode + pub selected_prefix_separator: Style, + pub selected_char_left_separator: Style, + pub selected_char_shortcut: Style, + pub selected_char_right_separator: Style, + pub selected_styled_text: Style, + pub selected_suffix_separator: Style, + // unselected mode + pub unselected_prefix_separator: Style, + pub unselected_char_left_separator: Style, + pub unselected_char_shortcut: Style, + pub unselected_char_right_separator: Style, + pub unselected_styled_text: Style, + pub unselected_suffix_separator: Style, + // disabled mode + pub disabled_prefix_separator: Style, + pub disabled_styled_text: Style, + pub disabled_suffix_separator: Style, + // selected single letter + pub selected_single_letter_prefix_separator: Style, + pub selected_single_letter_char_shortcut: Style, + pub selected_single_letter_suffix_separator: Style, + // unselected single letter + pub unselected_single_letter_prefix_separator: Style, + pub unselected_single_letter_char_shortcut: Style, + pub unselected_single_letter_suffix_separator: Style, + // superkey + pub superkey_prefix: Style, + pub superkey_suffix_separator: Style, +} + +impl ColoredElements { + pub fn new( + selected_prefix_separator: Style, + selected_char_left_separator: Style, + selected_char_shortcut: Style, + selected_char_right_separator: Style, + selected_styled_text: Style, + selected_suffix_separator: Style, + unselected_prefix_separator: Style, + unselected_char_left_separator: Style, + unselected_char_shortcut: Style, + unselected_char_right_separator: Style, + unselected_styled_text: Style, + unselected_suffix_separator: Style, + disabled_prefix_separator: Style, + disabled_styled_text: Style, + disabled_suffix_separator: Style, + selected_single_letter_prefix_separator: Style, + selected_single_letter_char_shortcut: Style, + selected_single_letter_suffix_separator: Style, + unselected_single_letter_prefix_separator: Style, + unselected_single_letter_char_shortcut: Style, + unselected_single_letter_suffix_separator: Style, + superkey_prefix: Style, + superkey_suffix_separator: Style, + ) -> Self { + Self { + selected_prefix_separator, + selected_char_left_separator, + selected_char_shortcut, + selected_char_right_separator, + selected_styled_text, + selected_suffix_separator, + unselected_prefix_separator, + unselected_char_left_separator, + unselected_char_shortcut, + unselected_char_right_separator, + unselected_styled_text, + unselected_suffix_separator, + disabled_prefix_separator, + disabled_styled_text, + disabled_suffix_separator, + selected_single_letter_prefix_separator, + selected_single_letter_char_shortcut, + selected_single_letter_suffix_separator, + unselected_single_letter_prefix_separator, + unselected_single_letter_char_shortcut, + unselected_single_letter_suffix_separator, + superkey_prefix, + superkey_suffix_separator, + } + } +} + +fn color_elements(palette: Palette) -> ColoredElements { + match palette.source { + PaletteSource::Default => ColoredElements::new( + Style::new() + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .on(RGB(palette.green.0, palette.green.1, palette.green.2)), + Style::new() + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(RGB(palette.green.0, palette.green.1, palette.green.2)) + .bold(), + Style::new() + .bold() + .fg(RGB(palette.red.0, palette.red.1, palette.red.2)) + .on(RGB(palette.green.0, palette.green.1, palette.green.2)) + .bold(), + Style::new() + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(RGB(palette.green.0, palette.green.1, palette.green.2)) + .bold(), + Style::new() + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(RGB(palette.green.0, palette.green.1, palette.green.2)) + .bold(), + Style::new() + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(RGB(palette.green.0, palette.green.1, palette.green.2)) + .bold(), + Style::new() + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)), + Style::new() + .bold() + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .bold(), + Style::new() + .bold() + .fg(RGB(palette.red.0, palette.red.1, palette.red.2)) + .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .bold(), + Style::new() + .bold() + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .bold(), + Style::new() + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .bold(), + Style::new() + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)), + Style::new() + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)), + Style::new() + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .dimmed(), + Style::new() + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)), + Style::new() + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(RGB(palette.green.0, palette.green.1, palette.green.2)), + Style::new() + .bold() + .fg(RGB(palette.red.0, palette.red.1, palette.red.2)) + .on(RGB(palette.green.0, palette.green.1, palette.green.2)) + .bold(), + Style::new() + .fg(RGB(palette.green.0, palette.green.1, palette.green.2)) + .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)), + Style::new() + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)), + Style::new() + .bold() + .fg(RGB(palette.red.0, palette.red.1, palette.red.2)) + .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .bold(), + Style::new() + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)), + Style::new() + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .bold(), + Style::new() + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)), + ), + PaletteSource::Xresources => ColoredElements::new( + Style::new() + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .on(RGB(palette.green.0, palette.green.1, palette.green.2)), + Style::new() + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(RGB(palette.green.0, palette.green.1, palette.green.2)) + .bold(), + Style::new() + .bold() + .fg(RGB(palette.red.0, palette.red.1, palette.red.2)) + .on(RGB(palette.green.0, palette.green.1, palette.green.2)) + .bold(), + Style::new() + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(RGB(palette.green.0, palette.green.1, palette.green.2)) + .bold(), + Style::new() + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(RGB(palette.green.0, palette.green.1, palette.green.2)) + .bold(), + Style::new() + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(RGB(palette.green.0, palette.green.1, palette.green.2)) + .bold(), + Style::new() + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)), + Style::new() + .bold() + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .bold(), + Style::new() + .bold() + .fg(RGB(palette.red.0, palette.red.1, palette.red.2)) + .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .bold(), + Style::new() + .bold() + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .bold(), + Style::new() + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .bold(), + Style::new() + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)), + Style::new() + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)), + Style::new() + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .dimmed(), + Style::new() + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)), + Style::new() + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(RGB(palette.green.0, palette.green.1, palette.green.2)), + Style::new() + .bold() + .fg(RGB(palette.red.0, palette.red.1, palette.red.2)) + .on(RGB(palette.green.0, palette.green.1, palette.green.2)) + .bold(), + Style::new() + .fg(RGB(palette.green.0, palette.green.1, palette.green.2)) + .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)), + Style::new() + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)), + Style::new() + .bold() + .fg(RGB(palette.red.0, palette.red.1, palette.red.2)) + .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .bold(), + Style::new() + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)), + Style::new() + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .bold(), + Style::new() + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)), + ), + } +} + impl ZellijPlugin for State { fn load(&mut self) { set_selectable(false); @@ -56,7 +333,8 @@ impl ZellijPlugin for State { } fn render(&mut self, _rows: usize, cols: usize) { - let superkey = superkey(self.mode_info.palette); + let colored_elements = color_elements(self.mode_info.palette); + let superkey = superkey(colored_elements); let ctrl_keys = ctrl_keys(&self.mode_info, cols - superkey.len); let first_line = format!("{}{}", superkey, ctrl_keys); diff --git a/src/common/utils/shared.rs b/src/common/utils/shared.rs index de15d784..4036a240 100644 --- a/src/common/utils/shared.rs +++ b/src/common/utils/shared.rs @@ -6,7 +6,7 @@ use strip_ansi_escapes::strip; use colors_transform::{Color, Rgb}; use xrdb::Colors; -use zellij_tile::data::{Palette, Theme}; +use zellij_tile::data::{Palette, Theme, PaletteSource}; fn ansi_len(s: &str) -> usize { from_utf8(&strip(s.as_bytes()).unwrap()) @@ -51,6 +51,7 @@ pub fn hex_to_rgb(hex: &Option) -> (u8, u8, u8) { (rgb.0 as u8, rgb.1 as u8, rgb.2 as u8) } +// Dark magic pub fn detect_theme(bg: (u8, u8, u8)) -> Theme { let (r, g, b) = bg; // HSP, P stands for perceived brightness @@ -72,6 +73,7 @@ pub fn load_palette() -> Palette { let colors: Vec<(u8, u8, u8)> = palette.colors.iter().map(|c| hex_to_rgb(c)).collect(); let theme = detect_theme(bg); Palette { + source: PaletteSource::Xresources, theme, fg, bg, @@ -86,9 +88,10 @@ pub fn load_palette() -> Palette { } } None => Palette { + source: PaletteSource::Default, theme: Theme::Dark, fg: colors::BRIGHT_GRAY, - bg: colors::BLACK, + bg: colors::GRAY, black: colors::BLACK, red: colors::RED, green: colors::GREEN, diff --git a/zellij-tile/src/data.rs b/zellij-tile/src/data.rs index be25f3c5..d74349ee 100644 --- a/zellij-tile/src/data.rs +++ b/zellij-tile/src/data.rs @@ -70,6 +70,12 @@ pub enum Theme { Light, Dark, } + +#[derive(Clone, Copy, Debug, Serialize, Deserialize)] +pub enum PaletteSource { + Default, + Xresources +} pub mod colors { pub const WHITE: (u8, u8, u8) = (238, 238, 238); pub const GREEN: (u8, u8, u8) = (175, 255, 0); @@ -81,6 +87,7 @@ pub mod colors { #[derive(Clone, Copy, Debug, Serialize, Deserialize)] pub struct Palette { + pub source: PaletteSource, pub theme: Theme, pub fg: (u8, u8, u8), pub bg: (u8, u8, u8), @@ -97,6 +104,7 @@ pub struct Palette { impl Default for Palette { fn default() -> Palette { Palette { + source: PaletteSource::Default, theme: Theme::Dark, fg: colors::BRIGHT_GRAY, bg: colors::BLACK, From c44de8935014766b205fae82d5378ec0d660d949 Mon Sep 17 00:00:00 2001 From: denis Date: Sat, 24 Apr 2021 11:25:09 +0300 Subject: [PATCH 11/21] wip: colors adjustments --- default-plugins/status-bar/src/main.rs | 22 ++--- default-plugins/status-bar/src/second_line.rs | 81 ++++++++++--------- default-plugins/tab-bar/src/line.rs | 45 ++++++++--- default-plugins/tab-bar/src/main.rs | 8 +- default-plugins/tab-bar/src/tab.rs | 4 +- 5 files changed, 91 insertions(+), 69 deletions(-) diff --git a/default-plugins/status-bar/src/main.rs b/default-plugins/status-bar/src/main.rs index aaf1e53b..dfcdae44 100644 --- a/default-plugins/status-bar/src/main.rs +++ b/default-plugins/status-bar/src/main.rs @@ -140,7 +140,7 @@ fn color_elements(palette: Palette) -> ColoredElements { .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) .on(RGB(palette.green.0, palette.green.1, palette.green.2)), Style::new() - .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .fg(RGB(palette.black.0, palette.black.1, palette.black.2)) .on(RGB(palette.green.0, palette.green.1, palette.green.2)) .bold(), Style::new() @@ -149,16 +149,16 @@ fn color_elements(palette: Palette) -> ColoredElements { .on(RGB(palette.green.0, palette.green.1, palette.green.2)) .bold(), Style::new() - .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .fg(RGB(palette.black.0, palette.black.1, palette.black.2)) .on(RGB(palette.green.0, palette.green.1, palette.green.2)) .bold(), Style::new() - .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .fg(RGB(palette.black.0, palette.black.1, palette.black.2)) .on(RGB(palette.green.0, palette.green.1, palette.green.2)) .bold(), Style::new() - .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .on(RGB(palette.green.0, palette.green.1, palette.green.2)) + .fg(RGB(palette.green.0, palette.green.1, palette.green.2)) + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) .bold(), Style::new() .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) @@ -179,7 +179,7 @@ fn color_elements(palette: Palette) -> ColoredElements { .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .bold(), Style::new() - .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .fg(RGB(palette.black.0, palette.black.1, palette.black.2)) .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .bold(), Style::new() @@ -218,11 +218,11 @@ fn color_elements(palette: Palette) -> ColoredElements { .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)), Style::new() - .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .fg(RGB(palette.white.0, palette.white.1, palette.white.2)) + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) .bold(), Style::new() - .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)), ), PaletteSource::Xresources => ColoredElements::new( @@ -247,8 +247,8 @@ fn color_elements(palette: Palette) -> ColoredElements { .on(RGB(palette.green.0, palette.green.1, palette.green.2)) .bold(), Style::new() - .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .on(RGB(palette.green.0, palette.green.1, palette.green.2)) + .fg(RGB(palette.green.0, palette.green.1, palette.green.2)) + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) .bold(), Style::new() .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) diff --git a/default-plugins/status-bar/src/second_line.rs b/default-plugins/status-bar/src/second_line.rs index 6ecba662..8cea48a2 100644 --- a/default-plugins/status-bar/src/second_line.rs +++ b/default-plugins/status-bar/src/second_line.rs @@ -1,8 +1,11 @@ // use colored::*; use ansi_term::{ANSIStrings, Color::RGB, Style}; -use zellij_tile::{data::Theme, prelude::*}; +use zellij_tile::prelude::*; -use crate::colors::{GREEN, ORANGE, WHITE}; +use crate::{ + colors::{GREEN, ORANGE, WHITE}, + ColoredElements, +}; use crate::{LinePart, MORE_MSG}; fn full_length_shortcut( @@ -13,27 +16,22 @@ fn full_length_shortcut( ) -> LinePart { let separator = if is_first_shortcut { " " } else { " / " }; let separator = Style::new() - .on(RGB(palette.black.0, palette.black.1, palette.black.2)) - .fg(RGB(palette.white.0, palette.white.1, palette.white.2)) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .paint(separator); let shortcut_len = letter.chars().count() + 3; // 2 for <>'s around shortcut, 1 for the space let shortcut_left_separator = Style::new() - .on(RGB(palette.black.0, palette.black.1, palette.black.2)) - .fg(RGB(palette.white.0, palette.white.1, palette.white.2)) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .paint("<"); let shortcut = Style::new() - .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .fg(ORANGE) + .fg(RGB(palette.green.0, palette.green.1, palette.green.2)) .bold() .paint(letter); let shortcut_right_separator = Style::new() - .on(RGB(palette.black.0, palette.black.1, palette.black.2)) - .fg(RGB(palette.white.0, palette.white.1, palette.white.2)) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .paint("> "); let description_len = description.chars().count(); let description = Style::new() - .on(RGB(palette.black.0, palette.black.1, palette.black.2)) - .fg(RGB(palette.white.0, palette.white.1, palette.white.2)) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .bold() .paint(description); let len = shortcut_len + description_len + separator.chars().count(); @@ -60,28 +58,23 @@ fn first_word_shortcut( ) -> LinePart { let separator = if is_first_shortcut { " " } else { " / " }; let separator = Style::new() - .on(RGB(palette.black.0, palette.black.1, palette.black.2)) - .fg(RGB(palette.white.0, palette.white.1, palette.white.2)) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .paint(separator); let shortcut_len = letter.chars().count() + 3; // 2 for <>'s around shortcut, 1 for the space let shortcut_left_separator = Style::new() - .on(RGB(palette.black.0, palette.black.1, palette.black.2)) - .fg(RGB(palette.white.0, palette.white.1, palette.white.2)) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .paint("<"); let shortcut = Style::new() - .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) .fg(RGB(palette.green.0, palette.green.1, palette.green.2)) .bold() .paint(letter); let shortcut_right_separator = Style::new() - .on(RGB(palette.black.0, palette.black.1, palette.black.2)) - .fg(RGB(palette.white.0, palette.white.1, palette.white.2)) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .paint("> "); let description_first_word = description.split(' ').next().unwrap_or(""); let description_first_word_length = description_first_word.chars().count(); let description_first_word = Style::new() - .on(RGB(palette.black.0, palette.black.1, palette.black.2)) - .fg(RGB(palette.white.0, palette.white.1, palette.white.2)) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .bold() .paint(description_first_word); let len = shortcut_len + description_first_word_length + separator.chars().count(); @@ -99,7 +92,7 @@ fn first_word_shortcut( len, } } -fn quicknav_full() -> LinePart { +fn quicknav_full(palette: Palette) -> LinePart { let text_first_part = " Tip: "; let alt = "Alt"; let text_second_part = " + "; @@ -126,15 +119,30 @@ fn quicknav_full() -> LinePart { part: format!( "{}{}{}{}{}{}{}{}{}{}{}", text_first_part, - Style::new().fg(ORANGE).bold().paint(alt), + Style::new() + .fg(RGB(palette.red.0, palette.red.1, palette.red.2)) + .bold() + .paint(alt), text_second_part, - Style::new().fg(GREEN).bold().paint(new_pane_shortcut), + Style::new() + .fg(RGB(palette.green.0, palette.green.1, palette.green.2)) + .bold() + .paint(new_pane_shortcut), text_third_part, - Style::new().fg(ORANGE).bold().paint(second_alt), + Style::new() + .fg(RGB(palette.red.0, palette.red.1, palette.red.2)) + .bold() + .paint(second_alt), text_fourth_part, - Style::new().fg(GREEN).bold().paint(brackets_navigation), + Style::new() + .fg(RGB(palette.green.0, palette.green.1, palette.green.2)) + .bold() + .paint(brackets_navigation), text_fifth_part, - Style::new().fg(GREEN).bold().paint(hjkl_navigation), + Style::new() + .fg(RGB(palette.green.0, palette.green.1, palette.green.2)) + .bold() + .paint(hjkl_navigation), text_sixths_part, ), len, @@ -220,7 +228,7 @@ fn locked_interface_indication(palette: Palette) -> LinePart { let locked_text = " -- INTERFACE LOCKED -- "; let locked_text_len = locked_text.chars().count(); let locked_styled_text = Style::new() - .fg(RGB(palette.white.0, palette.white.1, palette.white.2)) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .bold() .paint(locked_text); LinePart { @@ -234,27 +242,22 @@ fn select_pane_shortcut(is_first_shortcut: bool, palette: Palette) -> LinePart { let description = "Select pane"; let separator = if is_first_shortcut { " " } else { " / " }; let separator = Style::new() - .on(RGB(palette.black.0, palette.black.1, palette.black.2)) - .fg(RGB(palette.white.0, palette.white.1, palette.white.2)) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .paint(separator); let shortcut_len = shortcut.chars().count() + 3; // 2 for <>'s around shortcut, 1 for the space let shortcut_left_separator = Style::new() - .on(RGB(palette.black.0, palette.black.1, palette.black.2)) - .fg(RGB(palette.white.0, palette.white.1, palette.white.2)) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .paint("<"); let shortcut = Style::new() - .on(RGB(palette.black.0, palette.black.1, palette.black.2)) - .fg(ORANGE) + .fg(RGB(palette.red.0, palette.red.1, palette.red.2)) .bold() .paint(shortcut); let shortcut_right_separator = Style::new() - .on(RGB(palette.black.0, palette.black.1, palette.black.2)) - .fg(RGB(palette.white.0, palette.white.1, palette.white.2)) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .paint("> "); let description_len = description.chars().count(); let description = Style::new() - .on(RGB(palette.black.0, palette.black.1, palette.black.2)) - .fg(RGB(palette.white.0, palette.white.1, palette.white.2)) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .bold() .paint(description); let len = shortcut_len + description_len + separator.chars().count(); @@ -275,7 +278,7 @@ fn select_pane_shortcut(is_first_shortcut: bool, palette: Palette) -> LinePart { fn full_shortcut_list(help: &ModeInfo) -> LinePart { match help.mode { - InputMode::Normal => quicknav_full(), + InputMode::Normal => quicknav_full(help.palette), InputMode::Locked => locked_interface_indication(help.palette), _ => { let mut line_part = LinePart::default(); diff --git a/default-plugins/tab-bar/src/line.rs b/default-plugins/tab-bar/src/line.rs index 1d1c33ec..17461e9c 100644 --- a/default-plugins/tab-bar/src/line.rs +++ b/default-plugins/tab-bar/src/line.rs @@ -1,7 +1,8 @@ use crate::colors::{BLACK, GRAY, ORANGE, WHITE}; -use ansi_term::{ANSIStrings, Style}; +use ansi_term::{ANSIStrings, Color::RGB, Style}; use crate::{LinePart, ARROW_SEPARATOR}; +use zellij_tile::data::Palette; fn get_current_title_len(current_title: &[LinePart]) -> usize { current_title @@ -47,7 +48,7 @@ fn populate_tabs_in_tab_line( } } -fn left_more_message(tab_count_to_the_left: usize) -> LinePart { +fn left_more_message(tab_count_to_the_left: usize, palette: Palette) -> LinePart { if tab_count_to_the_left == 0 { return LinePart { part: String::new(), @@ -62,7 +63,11 @@ fn left_more_message(tab_count_to_the_left: usize) -> LinePart { // 238 let more_text_len = more_text.chars().count() + 2; // 2 for the arrows let left_separator = Style::new().fg(GRAY).on(ORANGE).paint(ARROW_SEPARATOR); - let more_styled_text = Style::new().fg(BLACK).on(ORANGE).bold().paint(more_text); + let more_styled_text = Style::new() + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(ORANGE) + .bold() + .paint(more_text); let right_separator = Style::new().fg(ORANGE).on(GRAY).paint(ARROW_SEPARATOR); let more_styled_text = format!( "{}", @@ -74,7 +79,7 @@ fn left_more_message(tab_count_to_the_left: usize) -> LinePart { } } -fn right_more_message(tab_count_to_the_right: usize) -> LinePart { +fn right_more_message(tab_count_to_the_right: usize, palette: Palette) -> LinePart { if tab_count_to_the_right == 0 { return LinePart { part: String::new(), @@ -88,7 +93,11 @@ fn right_more_message(tab_count_to_the_right: usize) -> LinePart { }; let more_text_len = more_text.chars().count() + 1; // 2 for the arrow let left_separator = Style::new().fg(GRAY).on(ORANGE).paint(ARROW_SEPARATOR); - let more_styled_text = Style::new().fg(BLACK).on(ORANGE).bold().paint(more_text); + let more_styled_text = Style::new() + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(ORANGE) + .bold() + .paint(more_text); let right_separator = Style::new().fg(ORANGE).on(GRAY).paint(ARROW_SEPARATOR); let more_styled_text = format!( "{}", @@ -105,13 +114,15 @@ fn add_previous_tabs_msg( tabs_to_render: &mut Vec, title_bar: &mut Vec, cols: usize, + palette: Palette, ) { - while get_current_title_len(&tabs_to_render) + left_more_message(tabs_before_active.len()).len + while get_current_title_len(&tabs_to_render) + + left_more_message(tabs_before_active.len(), palette).len >= cols { tabs_before_active.push(tabs_to_render.remove(0)); } - let left_more_message = left_more_message(tabs_before_active.len()); + let left_more_message = left_more_message(tabs_before_active.len(), palette); title_bar.push(left_more_message); } @@ -119,20 +130,26 @@ fn add_next_tabs_msg( tabs_after_active: &mut Vec, title_bar: &mut Vec, cols: usize, + palette: Palette, ) { - while get_current_title_len(&title_bar) + right_more_message(tabs_after_active.len()).len + while get_current_title_len(&title_bar) + + right_more_message(tabs_after_active.len(), palette).len >= cols { tabs_after_active.insert(0, title_bar.pop().unwrap()); } - let right_more_message = right_more_message(tabs_after_active.len()); + let right_more_message = right_more_message(tabs_after_active.len(), palette); title_bar.push(right_more_message); } -fn tab_line_prefix() -> LinePart { +fn tab_line_prefix(palette: Palette) -> LinePart { let prefix_text = " Zellij ".to_string(); let prefix_text_len = prefix_text.chars().count(); - let prefix_styled_text = Style::new().fg(WHITE).on(GRAY).bold().paint(prefix_text); + let prefix_styled_text = Style::new() + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + .bold() + .paint(prefix_text); LinePart { part: format!("{}", prefix_styled_text), len: prefix_text_len, @@ -143,6 +160,7 @@ pub fn tab_line( mut all_tabs: Vec, active_tab_index: usize, cols: usize, + palette: Palette, ) -> Vec { let mut tabs_to_render: Vec = vec![]; let mut tabs_after_active = all_tabs.split_off(active_tab_index); @@ -154,7 +172,7 @@ pub fn tab_line( }; tabs_to_render.push(active_tab); - let prefix = tab_line_prefix(); + let prefix = tab_line_prefix(palette); populate_tabs_in_tab_line( &mut tabs_before_active, &mut tabs_after_active, @@ -169,11 +187,12 @@ pub fn tab_line( &mut tabs_to_render, &mut tab_line, cols - prefix.len, + palette, ); } tab_line.append(&mut tabs_to_render); if !tabs_after_active.is_empty() { - add_next_tabs_msg(&mut tabs_after_active, &mut tab_line, cols - prefix.len); + add_next_tabs_msg(&mut tabs_after_active, &mut tab_line, cols - prefix.len, palette); } tab_line.insert(0, prefix); tab_line diff --git a/default-plugins/tab-bar/src/main.rs b/default-plugins/tab-bar/src/main.rs index e4a84d98..7083ac59 100644 --- a/default-plugins/tab-bar/src/main.rs +++ b/default-plugins/tab-bar/src/main.rs @@ -68,7 +68,7 @@ impl ZellijPlugin for State { let tab = tab_style(tabname, t.active, t.position, self.mode_info.palette); all_tabs.push(tab); } - let tab_line = tab_line(all_tabs, active_tab_index, cols); + let tab_line = tab_line(all_tabs, active_tab_index, cols, self.mode_info.palette); let mut s = String::new(); for bar_part in tab_line { s = format!("{}{}", s, bar_part.part); @@ -76,9 +76,9 @@ impl ZellijPlugin for State { println!( "{}\u{1b}[48;2;{};{};{}m\u{1b}[0K", s, - self.mode_info.palette.fg.0, - self.mode_info.palette.fg.1, - self.mode_info.palette.fg.2 + self.mode_info.palette.bg.0, + self.mode_info.palette.bg.1, + self.mode_info.palette.bg.2 ); } } diff --git a/default-plugins/tab-bar/src/tab.rs b/default-plugins/tab-bar/src/tab.rs index 375d8c46..f87ea48e 100644 --- a/default-plugins/tab-bar/src/tab.rs +++ b/default-plugins/tab-bar/src/tab.rs @@ -5,12 +5,12 @@ use zellij_tile::data::Palette; pub fn active_tab(text: String, palette: Palette) -> LinePart { let left_separator = Style::new() - .fg(RGB(palette.black.0, palette.black.1, palette.black.2)) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .on(RGB(palette.green.0, palette.green.1, palette.green.2)) .paint(ARROW_SEPARATOR); let tab_text_len = text.chars().count() + 4; // 2 for left and right separators, 2 for the text padding let tab_styled_text = Style::new() - .fg(RGB(palette.black.0, palette.black.1, palette.black.2)) + .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .on(RGB(palette.green.0, palette.green.1, palette.green.2)) .bold() .paint(format!(" {} ", text)); From de72d3d2fb785117e599d17525b5043345ffa03c Mon Sep 17 00:00:00 2001 From: denis Date: Sat, 24 Apr 2021 11:42:40 +0300 Subject: [PATCH 12/21] wip: tab bar coloring --- default-plugins/status-bar/src/main.rs | 7 ++----- default-plugins/tab-bar/src/line.rs | 7 ++++++- default-plugins/tab-bar/src/main.rs | 2 +- default-plugins/tab-bar/src/tab.rs | 7 +++---- src/client/tab.rs | 2 +- src/common/mod.rs | 6 +----- src/common/utils/shared.rs | 2 +- zellij-tile/src/data.rs | 2 +- 8 files changed, 16 insertions(+), 19 deletions(-) diff --git a/default-plugins/status-bar/src/main.rs b/default-plugins/status-bar/src/main.rs index dfcdae44..2410a9b1 100644 --- a/default-plugins/status-bar/src/main.rs +++ b/default-plugins/status-bar/src/main.rs @@ -3,15 +3,12 @@ mod second_line; use ansi_term::{Color::RGB, Style}; -use std::{ - fmt::{Display, Error, Formatter}, -}; -use zellij_tile::{prelude::*}; +use std::fmt::{Display, Error, Formatter}; +use zellij_tile::prelude::*; use first_line::{ctrl_keys, superkey}; use second_line::keybinds; - pub mod colors { use ansi_term::Colour::{self, Fixed}; pub const WHITE: Colour = Fixed(255); diff --git a/default-plugins/tab-bar/src/line.rs b/default-plugins/tab-bar/src/line.rs index 17461e9c..f6ed3c03 100644 --- a/default-plugins/tab-bar/src/line.rs +++ b/default-plugins/tab-bar/src/line.rs @@ -192,7 +192,12 @@ pub fn tab_line( } tab_line.append(&mut tabs_to_render); if !tabs_after_active.is_empty() { - add_next_tabs_msg(&mut tabs_after_active, &mut tab_line, cols - prefix.len, palette); + add_next_tabs_msg( + &mut tabs_after_active, + &mut tab_line, + cols - prefix.len, + palette, + ); } tab_line.insert(0, prefix); tab_line diff --git a/default-plugins/tab-bar/src/main.rs b/default-plugins/tab-bar/src/main.rs index 7083ac59..f522f8f2 100644 --- a/default-plugins/tab-bar/src/main.rs +++ b/default-plugins/tab-bar/src/main.rs @@ -43,7 +43,7 @@ impl ZellijPlugin for State { fn update(&mut self, event: Event) { match event { - Event::ModeUpdate(mode_info) => self.mode_info.mode = mode_info.mode, + Event::ModeUpdate(mode_info) => self.mode_info = mode_info, Event::TabUpdate(tabs) => self.tabs = tabs, _ => unimplemented!(), // FIXME: This should be unreachable, but this could be cleaner } diff --git a/default-plugins/tab-bar/src/tab.rs b/default-plugins/tab-bar/src/tab.rs index f87ea48e..c9d8d1f0 100644 --- a/default-plugins/tab-bar/src/tab.rs +++ b/default-plugins/tab-bar/src/tab.rs @@ -1,11 +1,10 @@ -use crate::colors::{BLACK, BRIGHT_GRAY, GRAY, GREEN}; use crate::{LinePart, ARROW_SEPARATOR}; use ansi_term::{ANSIStrings, Color::RGB, Style}; use zellij_tile::data::Palette; pub fn active_tab(text: String, palette: Palette) -> LinePart { let left_separator = Style::new() - .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) .on(RGB(palette.green.0, palette.green.1, palette.green.2)) .paint(ARROW_SEPARATOR); let tab_text_len = text.chars().count() + 4; // 2 for left and right separators, 2 for the text padding @@ -30,7 +29,7 @@ pub fn active_tab(text: String, palette: Palette) -> LinePart { pub fn non_active_tab(text: String, palette: Palette) -> LinePart { let left_separator = Style::new() - .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) .paint(ARROW_SEPARATOR); let tab_text_len = text.chars().count() + 4; // 2 for left and right separators, 2 for the padding @@ -40,7 +39,7 @@ pub fn non_active_tab(text: String, palette: Palette) -> LinePart { .bold() .paint(format!(" {} ", text)); let right_separator = Style::new() - .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) + .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) .paint(ARROW_SEPARATOR); let tab_styled_text = format!( diff --git a/src/client/tab.rs b/src/client/tab.rs index 3346428e..34bc585d 100644 --- a/src/client/tab.rs +++ b/src/client/tab.rs @@ -18,7 +18,7 @@ use std::{ collections::{BTreeMap, HashSet}, }; use std::{io::Write, sync::mpsc::channel}; -use zellij_tile::data::{colors, Event, InputMode, ModeInfo, Palette}; +use zellij_tile::data::{Event, InputMode, ModeInfo, Palette}; const CURSOR_HEIGHT_WIDTH_RATIO: usize = 4; // this is not accurate and kind of a magic number, TODO: look into this diff --git a/src/common/mod.rs b/src/common/mod.rs index af189915..0f896d1e 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -27,7 +27,6 @@ use crate::common::input::config::Config; use crate::layout::Layout; use crate::panes::PaneId; use async_std::task_local; -use colors_transform::{Color, Rgb}; use command_is_executing::CommandIsExecuting; use directories_next::ProjectDirs; use errors::{ @@ -45,10 +44,7 @@ use wasm_vm::PluginEnv; use wasm_vm::{wasi_stdout, wasi_write_string, zellij_imports, PluginInstruction}; use wasmer::{ChainableNamedResolver, Instance, Module, Store, Value}; use wasmer_wasi::{Pipe, WasiState}; -use xrdb::Colors; -use zellij_tile::data::{EventType, InputMode, ModeInfo, Palette, Theme}; - -use self::utils::logging::debug_log_to_file; +use zellij_tile::data::{EventType, InputMode, ModeInfo}; #[derive(Serialize, Deserialize, Debug)] pub enum ApiCommand { diff --git a/src/common/utils/shared.rs b/src/common/utils/shared.rs index 4036a240..e559ebc1 100644 --- a/src/common/utils/shared.rs +++ b/src/common/utils/shared.rs @@ -6,7 +6,7 @@ use strip_ansi_escapes::strip; use colors_transform::{Color, Rgb}; use xrdb::Colors; -use zellij_tile::data::{Palette, Theme, PaletteSource}; +use zellij_tile::data::{Palette, PaletteSource, Theme}; fn ansi_len(s: &str) -> usize { from_utf8(&strip(s.as_bytes()).unwrap()) diff --git a/zellij-tile/src/data.rs b/zellij-tile/src/data.rs index d74349ee..8efb0899 100644 --- a/zellij-tile/src/data.rs +++ b/zellij-tile/src/data.rs @@ -74,7 +74,7 @@ pub enum Theme { #[derive(Clone, Copy, Debug, Serialize, Deserialize)] pub enum PaletteSource { Default, - Xresources + Xresources, } pub mod colors { pub const WHITE: (u8, u8, u8) = (238, 238, 238); From 2e94ef51aa7ef3577a47015f27c89470c1e4b73b Mon Sep 17 00:00:00 2001 From: denis Date: Sat, 24 Apr 2021 18:28:28 +0300 Subject: [PATCH 13/21] wip: trying to make it less messy so people don't hate me --- default-plugins/status-bar/src/main.rs | 250 +++++------------- default-plugins/status-bar/src/second_line.rs | 51 ++-- src/common/utils/shared.rs | 3 + zellij-tile/src/data.rs | 3 + 4 files changed, 100 insertions(+), 207 deletions(-) diff --git a/default-plugins/status-bar/src/main.rs b/default-plugins/status-bar/src/main.rs index 2410a9b1..ddc0a821 100644 --- a/default-plugins/status-bar/src/main.rs +++ b/default-plugins/status-bar/src/main.rs @@ -9,17 +9,6 @@ use zellij_tile::prelude::*; use first_line::{ctrl_keys, superkey}; use second_line::keybinds; -pub mod colors { - use ansi_term::Colour::{self, Fixed}; - pub const WHITE: Colour = Fixed(255); - pub const BLACK: Colour = Fixed(16); - pub const GREEN: Colour = Fixed(154); - pub const ORANGE: Colour = Fixed(166); - pub const GRAY: Colour = Fixed(238); - pub const BRIGHT_GRAY: Colour = Fixed(245); - pub const RED: Colour = Fixed(88); -} - // for more of these, copy paste from: https://en.wikipedia.org/wiki/Box-drawing_character static ARROW_SEPARATOR: &str = ""; static MORE_MSG: &str = " ... "; @@ -130,187 +119,74 @@ impl ColoredElements { } } +macro_rules! rgb { + ($a:expr) => { + RGB($a.0, $a.1, $a.2) + }; +} +macro_rules! style { + ($a:expr, $b:expr) => { + Style::new() + .fg(RGB($a.0, $a.1, $a.2)) + .on(RGB($b.0, $b.1, $b.2)) + }; +} + +// I really hate this, but I can't come up with a good solution for this, +// we need different colors from palette for the default theme +// plus here we can add new sources in the future, like Theme +// that can be defined in the config perhaps fn color_elements(palette: Palette) -> ColoredElements { match palette.source { PaletteSource::Default => ColoredElements::new( - Style::new() - .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .on(RGB(palette.green.0, palette.green.1, palette.green.2)), - Style::new() - .fg(RGB(palette.black.0, palette.black.1, palette.black.2)) - .on(RGB(palette.green.0, palette.green.1, palette.green.2)) - .bold(), - Style::new() - .bold() - .fg(RGB(palette.red.0, palette.red.1, palette.red.2)) - .on(RGB(palette.green.0, palette.green.1, palette.green.2)) - .bold(), - Style::new() - .fg(RGB(palette.black.0, palette.black.1, palette.black.2)) - .on(RGB(palette.green.0, palette.green.1, palette.green.2)) - .bold(), - Style::new() - .fg(RGB(palette.black.0, palette.black.1, palette.black.2)) - .on(RGB(palette.green.0, palette.green.1, palette.green.2)) - .bold(), - Style::new() - .fg(RGB(palette.green.0, palette.green.1, palette.green.2)) - .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .bold(), - Style::new() - .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)), - Style::new() - .bold() - .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .bold(), - Style::new() - .bold() - .fg(RGB(palette.red.0, palette.red.1, palette.red.2)) - .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .bold(), - Style::new() - .bold() - .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .bold(), - Style::new() - .fg(RGB(palette.black.0, palette.black.1, palette.black.2)) - .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .bold(), - Style::new() - .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)), - Style::new() - .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)), - Style::new() - .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .dimmed(), - Style::new() - .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)), - Style::new() - .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .on(RGB(palette.green.0, palette.green.1, palette.green.2)), - Style::new() - .bold() - .fg(RGB(palette.red.0, palette.red.1, palette.red.2)) - .on(RGB(palette.green.0, palette.green.1, palette.green.2)) - .bold(), - Style::new() - .fg(RGB(palette.green.0, palette.green.1, palette.green.2)) - .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)), - Style::new() - .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)), - Style::new() - .bold() - .fg(RGB(palette.red.0, palette.red.1, palette.red.2)) - .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .bold(), - Style::new() - .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)), - Style::new() - .fg(RGB(palette.white.0, palette.white.1, palette.white.2)) - .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .bold(), - Style::new() - .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)), + style!(palette.bg, palette.green), + style!(palette.black, palette.green).bold(), + style!(palette.red, palette.green).bold(), + style!(palette.black, palette.green).bold(), + style!(palette.black, palette.green).bold(), + style!(palette.green, palette.bg).bold(), + style!(palette.bg, palette.fg), + style!(palette.bg, palette.fg).bold(), + style!(palette.red, palette.fg).bold(), + style!(palette.bg, palette.fg).bold(), + style!(palette.black, palette.fg).bold(), + style!(palette.fg, palette.bg), + style!(palette.fg, palette.bg), + style!(palette.bg, palette.fg).dimmed(), + style!(palette.fg, palette.bg), + style!(palette.fg, palette.green), + style!(palette.red, palette.green).bold(), + style!(palette.green, palette.fg), + style!(palette.fg, palette.bg), + style!(palette.red, palette.fg).bold(), + style!(palette.fg, palette.bg), + style!(palette.white, palette.bg).bold(), + Style::new().fg(rgb!(palette.bg)).on(rgb!(palette.bg)), ), PaletteSource::Xresources => ColoredElements::new( - Style::new() - .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .on(RGB(palette.green.0, palette.green.1, palette.green.2)), - Style::new() - .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .on(RGB(palette.green.0, palette.green.1, palette.green.2)) - .bold(), - Style::new() - .bold() - .fg(RGB(palette.red.0, palette.red.1, palette.red.2)) - .on(RGB(palette.green.0, palette.green.1, palette.green.2)) - .bold(), - Style::new() - .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .on(RGB(palette.green.0, palette.green.1, palette.green.2)) - .bold(), - Style::new() - .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .on(RGB(palette.green.0, palette.green.1, palette.green.2)) - .bold(), - Style::new() - .fg(RGB(palette.green.0, palette.green.1, palette.green.2)) - .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .bold(), - Style::new() - .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)), - Style::new() - .bold() - .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .bold(), - Style::new() - .bold() - .fg(RGB(palette.red.0, palette.red.1, palette.red.2)) - .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .bold(), - Style::new() - .bold() - .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .bold(), - Style::new() - .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .bold(), - Style::new() - .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)), - Style::new() - .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)), - Style::new() - .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .dimmed(), - Style::new() - .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)), - Style::new() - .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .on(RGB(palette.green.0, palette.green.1, palette.green.2)), - Style::new() - .bold() - .fg(RGB(palette.red.0, palette.red.1, palette.red.2)) - .on(RGB(palette.green.0, palette.green.1, palette.green.2)) - .bold(), - Style::new() - .fg(RGB(palette.green.0, palette.green.1, palette.green.2)) - .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)), - Style::new() - .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)), - Style::new() - .bold() - .fg(RGB(palette.red.0, palette.red.1, palette.red.2)) - .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .bold(), - Style::new() - .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)), - Style::new() - .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .on(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .bold(), - Style::new() - .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)), + style!(palette.bg, palette.green), + style!(palette.fg, palette.green).bold(), + style!(palette.red, palette.green).bold(), + style!(palette.fg, palette.green).bold(), + style!(palette.bg, palette.green).bold(), + style!(palette.green, palette.bg).bold(), + style!(palette.bg, palette.fg), + style!(palette.bg, palette.fg).bold(), + style!(palette.red, palette.fg).bold(), + style!(palette.bg, palette.fg).bold(), + style!(palette.bg, palette.fg).bold(), + style!(palette.fg, palette.bg), + style!(palette.fg, palette.bg), + style!(palette.bg, palette.fg).dimmed(), + style!(palette.fg, palette.bg), + style!(palette.fg, palette.green), + style!(palette.red, palette.green).bold(), + style!(palette.green, palette.fg), + style!(palette.fg, palette.bg), + style!(palette.red, palette.fg).bold(), + style!(palette.fg, palette.bg), + style!(palette.bg, palette.fg).bold(), + style!(palette.fg, palette.bg), ), } } diff --git a/default-plugins/status-bar/src/second_line.rs b/default-plugins/status-bar/src/second_line.rs index 8cea48a2..73c4d765 100644 --- a/default-plugins/status-bar/src/second_line.rs +++ b/default-plugins/status-bar/src/second_line.rs @@ -2,10 +2,6 @@ use ansi_term::{ANSIStrings, Color::RGB, Style}; use zellij_tile::prelude::*; -use crate::{ - colors::{GREEN, ORANGE, WHITE}, - ColoredElements, -}; use crate::{LinePart, MORE_MSG}; fn full_length_shortcut( @@ -120,7 +116,7 @@ fn quicknav_full(palette: Palette) -> LinePart { "{}{}{}{}{}{}{}{}{}{}{}", text_first_part, Style::new() - .fg(RGB(palette.red.0, palette.red.1, palette.red.2)) + .fg(RGB(palette.orange.0, palette.orange.1, palette.orange.2)) .bold() .paint(alt), text_second_part, @@ -130,7 +126,7 @@ fn quicknav_full(palette: Palette) -> LinePart { .paint(new_pane_shortcut), text_third_part, Style::new() - .fg(RGB(palette.red.0, palette.red.1, palette.red.2)) + .fg(RGB(palette.orange.0, palette.orange.1, palette.orange.2)) .bold() .paint(second_alt), text_fourth_part, @@ -149,7 +145,7 @@ fn quicknav_full(palette: Palette) -> LinePart { } } -fn quicknav_medium() -> LinePart { +fn quicknav_medium(palette: Palette) -> LinePart { let text_first_part = " Tip: "; let alt = "Alt"; let text_second_part = " + "; @@ -176,22 +172,37 @@ fn quicknav_medium() -> LinePart { part: format!( "{}{}{}{}{}{}{}{}{}{}{}", text_first_part, - Style::new().fg(ORANGE).bold().paint(alt), + Style::new() + .fg(RGB(palette.orange.0, palette.orange.1, palette.orange.2)) + .bold() + .paint(alt), text_second_part, - Style::new().fg(GREEN).bold().paint(new_pane_shortcut), + Style::new() + .fg(RGB(palette.green.0, palette.green.1, palette.green.2)) + .bold() + .paint(new_pane_shortcut), text_third_part, - Style::new().fg(ORANGE).bold().paint(second_alt), + Style::new() + .fg(RGB(palette.orange.0, palette.orange.1, palette.orange.2)) + .bold() + .paint(second_alt), text_fourth_part, - Style::new().fg(GREEN).bold().paint(brackets_navigation), + Style::new() + .fg(RGB(palette.green.0, palette.green.1, palette.green.2)) + .bold() + .paint(brackets_navigation), text_fifth_part, - Style::new().fg(GREEN).bold().paint(hjkl_navigation), + Style::new() + .fg(RGB(palette.green.0, palette.green.1, palette.green.2)) + .bold() + .paint(hjkl_navigation), text_sixths_part, ), len, } } -fn quicknav_short() -> LinePart { +fn quicknav_short(palette: Palette) -> LinePart { let text_first_part = " QuickNav: "; let alt = "Alt"; let text_second_part = " + "; @@ -212,13 +223,13 @@ fn quicknav_short() -> LinePart { part: format!( "{}{}{}{}{}{}{}{}", text_first_part, - Style::new().fg(ORANGE).bold().paint(alt), + Style::new().fg(RGB(palette.orange.0, palette.orange.1, palette.orange.2)).bold().paint(alt), text_second_part, - Style::new().fg(GREEN).bold().paint(new_pane_shortcut), + Style::new().fg(RGB(palette.green.0, palette.green.1, palette.green.2)).bold().paint(new_pane_shortcut), text_third_part, - Style::new().fg(GREEN).bold().paint(brackets_navigation), + Style::new().fg(RGB(palette.green.0, palette.green.1, palette.green.2)).bold().paint(brackets_navigation), text_fifth_part, - Style::new().fg(GREEN).bold().paint(hjkl_navigation), + Style::new().fg(RGB(palette.green.0, palette.green.1, palette.green.2)).bold().paint(hjkl_navigation), ), len, } @@ -249,7 +260,7 @@ fn select_pane_shortcut(is_first_shortcut: bool, palette: Palette) -> LinePart { .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) .paint("<"); let shortcut = Style::new() - .fg(RGB(palette.red.0, palette.red.1, palette.red.2)) + .fg(RGB(palette.orange.0, palette.orange.1, palette.orange.2)) .bold() .paint(shortcut); let shortcut_right_separator = Style::new() @@ -297,7 +308,7 @@ fn full_shortcut_list(help: &ModeInfo) -> LinePart { fn shortened_shortcut_list(help: &ModeInfo) -> LinePart { match help.mode { - InputMode::Normal => quicknav_medium(), + InputMode::Normal => quicknav_medium(help.palette), InputMode::Locked => locked_interface_indication(help.palette), _ => { let mut line_part = LinePart::default(); @@ -317,7 +328,7 @@ fn shortened_shortcut_list(help: &ModeInfo) -> LinePart { fn best_effort_shortcut_list(help: &ModeInfo, max_len: usize) -> LinePart { match help.mode { InputMode::Normal => { - let line_part = quicknav_short(); + let line_part = quicknav_short(help.palette); if line_part.len <= max_len { line_part } else { diff --git a/src/common/utils/shared.rs b/src/common/utils/shared.rs index e559ebc1..2decc905 100644 --- a/src/common/utils/shared.rs +++ b/src/common/utils/shared.rs @@ -40,6 +40,7 @@ pub mod colors { pub const GRAY: (u8, u8, u8) = (68, 68, 68); pub const BRIGHT_GRAY: (u8, u8, u8) = (138, 138, 138); pub const RED: (u8, u8, u8) = (135, 0, 0); + pub const ORANGE: (u8, u8, u8) = (215,95,0); pub const BLACK: (u8, u8, u8) = (0, 0, 0); } @@ -85,6 +86,7 @@ pub fn load_palette() -> Palette { magenta: colors[5], cyan: colors[6], white: colors[7], + orange: colors[9] } } None => Palette { @@ -100,6 +102,7 @@ pub fn load_palette() -> Palette { magenta: colors::GRAY, cyan: colors::GRAY, white: colors::WHITE, + orange: colors::ORANGE }, }; palette diff --git a/zellij-tile/src/data.rs b/zellij-tile/src/data.rs index 8efb0899..02a6217a 100644 --- a/zellij-tile/src/data.rs +++ b/zellij-tile/src/data.rs @@ -82,6 +82,7 @@ pub mod colors { pub const GRAY: (u8, u8, u8) = (68, 68, 68); pub const BRIGHT_GRAY: (u8, u8, u8) = (138, 138, 138); pub const RED: (u8, u8, u8) = (135, 0, 0); + pub const ORANGE: (u8, u8, u8) = (215,95,0); pub const BLACK: (u8, u8, u8) = (0, 0, 0); } @@ -99,6 +100,7 @@ pub struct Palette { pub magenta: (u8, u8, u8), pub cyan: (u8, u8, u8), pub white: (u8, u8, u8), + pub orange: (u8, u8, u8) } impl Default for Palette { @@ -116,6 +118,7 @@ impl Default for Palette { magenta: colors::GRAY, cyan: colors::GRAY, white: colors::WHITE, + orange: colors::ORANGE } } } From 12388c9e86e07b4f691ae6956f0983931a3ae471 Mon Sep 17 00:00:00 2001 From: denis Date: Sat, 24 Apr 2021 18:40:17 +0300 Subject: [PATCH 14/21] wip: I really don't want people to hate me --- default-plugins/tab-bar/src/line.rs | 37 +++++++++++++---------------- default-plugins/tab-bar/src/main.rs | 11 --------- default-plugins/tab-bar/src/tab.rs | 36 +++++++++++----------------- 3 files changed, 30 insertions(+), 54 deletions(-) diff --git a/default-plugins/tab-bar/src/line.rs b/default-plugins/tab-bar/src/line.rs index f6ed3c03..5976f12f 100644 --- a/default-plugins/tab-bar/src/line.rs +++ b/default-plugins/tab-bar/src/line.rs @@ -1,8 +1,15 @@ -use crate::colors::{BLACK, GRAY, ORANGE, WHITE}; use ansi_term::{ANSIStrings, Color::RGB, Style}; use crate::{LinePart, ARROW_SEPARATOR}; -use zellij_tile::data::Palette; +use zellij_tile::data::{colors::*, Palette}; + +macro_rules! style { + ($a:expr, $b:expr) => { + Style::new() + .fg(RGB($a.0, $a.1, $a.2)) + .on(RGB($b.0, $b.1, $b.2)) + }; +} fn get_current_title_len(current_title: &[LinePart]) -> usize { current_title @@ -62,13 +69,9 @@ fn left_more_message(tab_count_to_the_left: usize, palette: Palette) -> LinePart }; // 238 let more_text_len = more_text.chars().count() + 2; // 2 for the arrows - let left_separator = Style::new().fg(GRAY).on(ORANGE).paint(ARROW_SEPARATOR); - let more_styled_text = Style::new() - .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .on(ORANGE) - .bold() - .paint(more_text); - let right_separator = Style::new().fg(ORANGE).on(GRAY).paint(ARROW_SEPARATOR); + let left_separator = style!(palette.fg, palette.orange).paint(ARROW_SEPARATOR); + let more_styled_text = style!(palette.fg, palette.orange).bold().paint(more_text); + let right_separator = style!(palette.orange, palette.bg).paint(ARROW_SEPARATOR); let more_styled_text = format!( "{}", ANSIStrings(&[left_separator, more_styled_text, right_separator,]) @@ -92,13 +95,9 @@ fn right_more_message(tab_count_to_the_right: usize, palette: Palette) -> LinePa " +many → ".to_string() }; let more_text_len = more_text.chars().count() + 1; // 2 for the arrow - let left_separator = Style::new().fg(GRAY).on(ORANGE).paint(ARROW_SEPARATOR); - let more_styled_text = Style::new() - .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .on(ORANGE) - .bold() - .paint(more_text); - let right_separator = Style::new().fg(ORANGE).on(GRAY).paint(ARROW_SEPARATOR); + let left_separator = style!(palette.fg, palette.orange).paint(ARROW_SEPARATOR); + let more_styled_text = style!(palette.fg, palette.orange).bold().paint(more_text); + let right_separator = style!(palette.orange, palette.bg).paint(ARROW_SEPARATOR); let more_styled_text = format!( "{}", ANSIStrings(&[left_separator, more_styled_text, right_separator,]) @@ -145,11 +144,7 @@ fn add_next_tabs_msg( fn tab_line_prefix(palette: Palette) -> LinePart { let prefix_text = " Zellij ".to_string(); let prefix_text_len = prefix_text.chars().count(); - let prefix_styled_text = Style::new() - .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .bold() - .paint(prefix_text); + let prefix_styled_text = style!(palette.fg, palette.bg).bold().paint(prefix_text); LinePart { part: format!("{}", prefix_styled_text), len: prefix_text_len, diff --git a/default-plugins/tab-bar/src/main.rs b/default-plugins/tab-bar/src/main.rs index f522f8f2..194e11b1 100644 --- a/default-plugins/tab-bar/src/main.rs +++ b/default-plugins/tab-bar/src/main.rs @@ -20,17 +20,6 @@ struct State { static ARROW_SEPARATOR: &str = ""; -pub mod colors { - use ansi_term::Colour::{self, Fixed}; - pub const WHITE: Colour = Fixed(255); - pub const BLACK: Colour = Fixed(16); - pub const GREEN: Colour = Fixed(154); - pub const ORANGE: Colour = Fixed(166); - pub const GRAY: Colour = Fixed(238); - pub const BRIGHT_GRAY: Colour = Fixed(245); - pub const RED: Colour = Fixed(88); -} - register_plugin!(State); impl ZellijPlugin for State { diff --git a/default-plugins/tab-bar/src/tab.rs b/default-plugins/tab-bar/src/tab.rs index c9d8d1f0..e97ecab7 100644 --- a/default-plugins/tab-bar/src/tab.rs +++ b/default-plugins/tab-bar/src/tab.rs @@ -2,21 +2,21 @@ use crate::{LinePart, ARROW_SEPARATOR}; use ansi_term::{ANSIStrings, Color::RGB, Style}; use zellij_tile::data::Palette; +macro_rules! style { + ($a:expr, $b:expr) => { + Style::new() + .fg(RGB($a.0, $a.1, $a.2)) + .on(RGB($b.0, $b.1, $b.2)) + }; +} + pub fn active_tab(text: String, palette: Palette) -> LinePart { - let left_separator = Style::new() - .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .on(RGB(palette.green.0, palette.green.1, palette.green.2)) - .paint(ARROW_SEPARATOR); + let left_separator = style!(palette.bg, palette.green).paint(ARROW_SEPARATOR); let tab_text_len = text.chars().count() + 4; // 2 for left and right separators, 2 for the text padding - let tab_styled_text = Style::new() - .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .on(RGB(palette.green.0, palette.green.1, palette.green.2)) + let tab_styled_text = style!(palette.bg, palette.green) .bold() .paint(format!(" {} ", text)); - let right_separator = Style::new() - .fg(RGB(palette.green.0, palette.green.1, palette.green.2)) - .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .paint(ARROW_SEPARATOR); + let right_separator = style!(palette.green, palette.bg).paint(ARROW_SEPARATOR); let tab_styled_text = format!( "{}", ANSIStrings(&[left_separator, tab_styled_text, right_separator,]) @@ -28,20 +28,12 @@ pub fn active_tab(text: String, palette: Palette) -> LinePart { } pub fn non_active_tab(text: String, palette: Palette) -> LinePart { - let left_separator = Style::new() - .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .paint(ARROW_SEPARATOR); + let left_separator = style!(palette.bg, palette.bg).paint(ARROW_SEPARATOR); let tab_text_len = text.chars().count() + 4; // 2 for left and right separators, 2 for the padding - let tab_styled_text = Style::new() - .fg(RGB(palette.fg.0, palette.fg.1, palette.fg.2)) - .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) + let tab_styled_text = style!(palette.fg, palette.bg) .bold() .paint(format!(" {} ", text)); - let right_separator = Style::new() - .fg(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .on(RGB(palette.bg.0, palette.bg.1, palette.bg.2)) - .paint(ARROW_SEPARATOR); + let right_separator = style!(palette.bg, palette.bg).paint(ARROW_SEPARATOR); let tab_styled_text = format!( "{}", ANSIStrings(&[left_separator, tab_styled_text, right_separator,]) From a8adfdfd60c73109c5febf470f639862b331ed94 Mon Sep 17 00:00:00 2001 From: denis Date: Sat, 24 Apr 2021 18:52:50 +0300 Subject: [PATCH 15/21] wip: more cleaning up --- default-plugins/status-bar/src/main.rs | 6 +++--- src/client/boundaries.rs | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/default-plugins/status-bar/src/main.rs b/default-plugins/status-bar/src/main.rs index ddc0a821..efa19398 100644 --- a/default-plugins/status-bar/src/main.rs +++ b/default-plugins/status-bar/src/main.rs @@ -151,7 +151,7 @@ fn color_elements(palette: Palette) -> ColoredElements { style!(palette.bg, palette.fg).bold(), style!(palette.black, palette.fg).bold(), style!(palette.fg, palette.bg), - style!(palette.fg, palette.bg), + style!(palette.bg, palette.fg), style!(palette.bg, palette.fg).dimmed(), style!(palette.fg, palette.bg), style!(palette.fg, palette.green), @@ -161,7 +161,7 @@ fn color_elements(palette: Palette) -> ColoredElements { style!(palette.red, palette.fg).bold(), style!(palette.fg, palette.bg), style!(palette.white, palette.bg).bold(), - Style::new().fg(rgb!(palette.bg)).on(rgb!(palette.bg)), + style!(palette.bg, palette.bg), ), PaletteSource::Xresources => ColoredElements::new( style!(palette.bg, palette.green), @@ -176,7 +176,7 @@ fn color_elements(palette: Palette) -> ColoredElements { style!(palette.bg, palette.fg).bold(), style!(palette.bg, palette.fg).bold(), style!(palette.fg, palette.bg), - style!(palette.fg, palette.bg), + style!(palette.bg, palette.fg), style!(palette.bg, palette.fg).dimmed(), style!(palette.fg, palette.bg), style!(palette.fg, palette.green), diff --git a/src/client/boundaries.rs b/src/client/boundaries.rs index 7a6a2b2b..4708ed6a 100644 --- a/src/client/boundaries.rs +++ b/src/client/boundaries.rs @@ -772,7 +772,7 @@ impl Boundaries { let color = match palette.is_some() { true => match input_mode { InputMode::Normal | InputMode::Locked => Some(palette.unwrap().green), - _ => Some(palette.unwrap().white), + _ => Some(palette.unwrap().orange), }, false => None, }; From f85822972ad6ed19f94bc1b30a7120bcd4b091e0 Mon Sep 17 00:00:00 2001 From: denis Date: Sat, 1 May 2021 14:44:43 +0300 Subject: [PATCH 16/21] chore: cleanup, fix: the tests finally pass --- Cargo.lock | 1 + default-plugins/status-bar/src/main.rs | 13 ----- default-plugins/status-bar/src/second_line.rs | 20 ++++++-- default-plugins/tab-bar/src/line.rs | 12 +---- default-plugins/tab-bar/src/main.rs | 2 +- default-plugins/tab-bar/src/tab.rs | 12 +---- src/common/input/handler.rs | 15 +++--- src/common/mod.rs | 4 +- src/common/os_input_output.rs | 46 ++++++++++++++++++ src/common/utils/shared.rs | 47 +------------------ src/tests/fakes.rs | 37 +++++++++++++++ zellij-tile/Cargo.toml | 1 + zellij-tile/src/data.rs | 12 ++--- zellij-tile/src/lib.rs | 16 +++++++ 14 files changed, 140 insertions(+), 98 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4058fad7..0b18bd6b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2254,6 +2254,7 @@ dependencies = [ name = "zellij-tile" version = "1.1.0" dependencies = [ + "ansi_term 0.12.1", "serde", "serde_json", "strum", diff --git a/default-plugins/status-bar/src/main.rs b/default-plugins/status-bar/src/main.rs index efa19398..4914efdb 100644 --- a/default-plugins/status-bar/src/main.rs +++ b/default-plugins/status-bar/src/main.rs @@ -119,19 +119,6 @@ impl ColoredElements { } } -macro_rules! rgb { - ($a:expr) => { - RGB($a.0, $a.1, $a.2) - }; -} -macro_rules! style { - ($a:expr, $b:expr) => { - Style::new() - .fg(RGB($a.0, $a.1, $a.2)) - .on(RGB($b.0, $b.1, $b.2)) - }; -} - // I really hate this, but I can't come up with a good solution for this, // we need different colors from palette for the default theme // plus here we can add new sources in the future, like Theme diff --git a/default-plugins/status-bar/src/second_line.rs b/default-plugins/status-bar/src/second_line.rs index 73c4d765..6982c410 100644 --- a/default-plugins/status-bar/src/second_line.rs +++ b/default-plugins/status-bar/src/second_line.rs @@ -223,13 +223,25 @@ fn quicknav_short(palette: Palette) -> LinePart { part: format!( "{}{}{}{}{}{}{}{}", text_first_part, - Style::new().fg(RGB(palette.orange.0, palette.orange.1, palette.orange.2)).bold().paint(alt), + Style::new() + .fg(RGB(palette.orange.0, palette.orange.1, palette.orange.2)) + .bold() + .paint(alt), text_second_part, - Style::new().fg(RGB(palette.green.0, palette.green.1, palette.green.2)).bold().paint(new_pane_shortcut), + Style::new() + .fg(RGB(palette.green.0, palette.green.1, palette.green.2)) + .bold() + .paint(new_pane_shortcut), text_third_part, - Style::new().fg(RGB(palette.green.0, palette.green.1, palette.green.2)).bold().paint(brackets_navigation), + Style::new() + .fg(RGB(palette.green.0, palette.green.1, palette.green.2)) + .bold() + .paint(brackets_navigation), text_fifth_part, - Style::new().fg(RGB(palette.green.0, palette.green.1, palette.green.2)).bold().paint(hjkl_navigation), + Style::new() + .fg(RGB(palette.green.0, palette.green.1, palette.green.2)) + .bold() + .paint(hjkl_navigation), ), len, } diff --git a/default-plugins/tab-bar/src/line.rs b/default-plugins/tab-bar/src/line.rs index 5976f12f..ae287d2e 100644 --- a/default-plugins/tab-bar/src/line.rs +++ b/default-plugins/tab-bar/src/line.rs @@ -1,15 +1,7 @@ -use ansi_term::{ANSIStrings, Color::RGB, Style}; +use ansi_term::ANSIStrings; use crate::{LinePart, ARROW_SEPARATOR}; -use zellij_tile::data::{colors::*, Palette}; - -macro_rules! style { - ($a:expr, $b:expr) => { - Style::new() - .fg(RGB($a.0, $a.1, $a.2)) - .on(RGB($b.0, $b.1, $b.2)) - }; -} +use zellij_tile::prelude::*; fn get_current_title_len(current_title: &[LinePart]) -> usize { current_title diff --git a/default-plugins/tab-bar/src/main.rs b/default-plugins/tab-bar/src/main.rs index 7c6a2220..1c6d584e 100644 --- a/default-plugins/tab-bar/src/main.rs +++ b/default-plugins/tab-bar/src/main.rs @@ -59,7 +59,7 @@ impl ZellijPlugin for State { t.active, t.position, t.is_sync_panes_active, - self.mode_info.palette + self.mode_info.palette, ); all_tabs.push(tab); } diff --git a/default-plugins/tab-bar/src/tab.rs b/default-plugins/tab-bar/src/tab.rs index 3e340810..27b4ad94 100644 --- a/default-plugins/tab-bar/src/tab.rs +++ b/default-plugins/tab-bar/src/tab.rs @@ -1,14 +1,6 @@ use crate::{LinePart, ARROW_SEPARATOR}; use ansi_term::{ANSIStrings, Color::RGB, Style}; -use zellij_tile::data::Palette; - -macro_rules! style { - ($a:expr, $b:expr) => { - Style::new() - .fg(RGB($a.0, $a.1, $a.2)) - .on(RGB($b.0, $b.1, $b.2)) - }; -} +use zellij_tile::prelude::*; pub fn active_tab(text: String, palette: Palette) -> LinePart { let left_separator = style!(palette.bg, palette.green).paint(ARROW_SEPARATOR); @@ -49,7 +41,7 @@ pub fn tab_style( is_active_tab: bool, position: usize, is_sync_panes_active: bool, - palette: Palette + palette: Palette, ) -> LinePart { let mut tab_text = if text.is_empty() { format!("Tab #{}", position + 1) diff --git a/src/common/input/handler.rs b/src/common/input/handler.rs index eda71eea..b5f6008a 100644 --- a/src/common/input/handler.rs +++ b/src/common/input/handler.rs @@ -2,7 +2,7 @@ use super::actions::Action; use super::keybinds::Keybinds; -use crate::common::input::config::Config; +use crate::common::{input::config::Config}; use crate::common::{AppInstruction, SenderWithContext, OPENCALLS}; use crate::errors::ContextType; use crate::os_input_output::OsApi; @@ -11,9 +11,8 @@ use crate::screen::ScreenInstruction; use crate::wasm_vm::PluginInstruction; use crate::CommandIsExecuting; -use crate::common::utils::shared::load_palette; use termion::input::{TermRead, TermReadEventsAndRaw}; -use zellij_tile::data::{Event, InputMode, Key, ModeInfo}; +use zellij_tile::data::{Event, InputMode, Key, ModeInfo, Palette}; /// Handles the dispatching of [`Action`]s according to the current /// [`InputMode`], and keep tracks of the current [`InputMode`]. @@ -132,11 +131,14 @@ impl InputHandler { self.send_plugin_instructions .send(PluginInstruction::Update( None, - Event::ModeUpdate(get_mode_info(mode)), + Event::ModeUpdate(get_mode_info(mode, self.os_input.load_palette())), )) .unwrap(); self.send_screen_instructions - .send(ScreenInstruction::ChangeMode(get_mode_info(mode))) + .send(ScreenInstruction::ChangeMode(get_mode_info( + mode, + self.os_input.load_palette(), + ))) .unwrap(); self.send_screen_instructions .send(ScreenInstruction::Render) @@ -285,9 +287,8 @@ impl InputHandler { /// Creates a [`Help`] struct indicating the current [`InputMode`] and its keybinds /// (as pairs of [`String`]s). // TODO this should probably be automatically generated in some way -pub fn get_mode_info(mode: InputMode) -> ModeInfo { +pub fn get_mode_info(mode: InputMode, palette: Palette) -> ModeInfo { let mut keybinds: Vec<(String, String)> = vec![]; - let palette = load_palette(); match mode { InputMode::Normal | InputMode::Locked => {} InputMode::Resize => { diff --git a/src/common/mod.rs b/src/common/mod.rs index 71824e26..c9b8e0e2 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -39,7 +39,7 @@ use os_input_output::OsApi; use pty_bus::{PtyBus, PtyInstruction}; use screen::{Screen, ScreenInstruction}; use serde::{Deserialize, Serialize}; -use utils::{consts::ZELLIJ_IPC_PIPE, shared::load_palette}; +use utils::consts::ZELLIJ_IPC_PIPE; use wasm_vm::{wasi_read_string, wasi_write_object, zellij_exports, PluginEnv, PluginInstruction}; use wasmer::{ChainableNamedResolver, Instance, Module, Store, Value}; use wasmer_wasi::{Pipe, WasiState}; @@ -267,7 +267,7 @@ pub fn start(mut os_input: Box, opts: CliArgs) { let send_plugin_instructions = send_plugin_instructions.clone(); let send_app_instructions = send_app_instructions.clone(); let max_panes = opts.max_panes; - let colors = load_palette(); + let colors = os_input.load_palette(); // debug_log_to_file(format!("{:?}", colors)); move || { let mut screen = Screen::new( diff --git a/src/common/os_input_output.rs b/src/common/os_input_output.rs index 35d77fdd..41a4bfe4 100644 --- a/src/common/os_input_output.rs +++ b/src/common/os_input_output.rs @@ -1,4 +1,5 @@ use crate::panes::PositionAndSize; +use crate::utils::shared::{colors, detect_theme, hex_to_rgb}; use nix::fcntl::{fcntl, FcntlArg, OFlag}; use nix::pty::{forkpty, Winsize}; use nix::sys::signal::{kill, Signal}; @@ -12,6 +13,8 @@ use std::os::unix::io::RawFd; use std::path::PathBuf; use std::process::{Child, Command}; use std::sync::{Arc, Mutex}; +use xrdb::Colors; +use zellij_tile::data::{Palette, PaletteSource, Theme}; use signal_hook::{consts::signal::*, iterator::Signals}; @@ -191,6 +194,7 @@ pub trait OsApi: Send + Sync { /// Returns a [`Box`] pointer to this [`OsApi`] struct. fn box_clone(&self) -> Box; fn receive_sigwinch(&self, cb: Box); + fn load_palette(&self) -> Palette; } impl OsApi for OsInputOutput { @@ -261,6 +265,48 @@ impl OsApi for OsInputOutput { } } } + fn load_palette(&self) -> Palette { + let palette = match Colors::new("xresources") { + Some(palette) => { + let fg = hex_to_rgb(&palette.fg); + let bg = hex_to_rgb(&palette.bg); + let colors: Vec<(u8, u8, u8)> = + palette.colors.iter().map(|c| hex_to_rgb(c)).collect(); + let theme = detect_theme(bg); + Palette { + source: PaletteSource::Xresources, + theme, + fg, + bg, + black: colors[0], + red: colors[1], + green: colors[2], + yellow: colors[3], + blue: colors[4], + magenta: colors[5], + cyan: colors[6], + white: colors[7], + orange: colors[9], + } + } + None => Palette { + source: PaletteSource::Default, + theme: Theme::Dark, + fg: colors::BRIGHT_GRAY, + bg: colors::GRAY, + black: colors::BLACK, + red: colors::RED, + green: colors::GREEN, + yellow: colors::GRAY, + blue: colors::GRAY, + magenta: colors::GRAY, + cyan: colors::GRAY, + white: colors::WHITE, + orange: colors::ORANGE, + }, + }; + palette + } } impl Clone for Box { diff --git a/src/common/utils/shared.rs b/src/common/utils/shared.rs index 2decc905..c72b2e85 100644 --- a/src/common/utils/shared.rs +++ b/src/common/utils/shared.rs @@ -5,8 +5,7 @@ use std::{iter, str::from_utf8}; use strip_ansi_escapes::strip; use colors_transform::{Color, Rgb}; -use xrdb::Colors; -use zellij_tile::data::{Palette, PaletteSource, Theme}; +use zellij_tile::data::{Theme}; fn ansi_len(s: &str) -> usize { from_utf8(&strip(s.as_bytes()).unwrap()) @@ -40,7 +39,7 @@ pub mod colors { pub const GRAY: (u8, u8, u8) = (68, 68, 68); pub const BRIGHT_GRAY: (u8, u8, u8) = (138, 138, 138); pub const RED: (u8, u8, u8) = (135, 0, 0); - pub const ORANGE: (u8, u8, u8) = (215,95,0); + pub const ORANGE: (u8, u8, u8) = (215, 95, 0); pub const BLACK: (u8, u8, u8) = (0, 0, 0); } @@ -65,45 +64,3 @@ pub fn detect_theme(bg: (u8, u8, u8)) -> Theme { false => Theme::Dark, } } - -pub fn load_palette() -> Palette { - let palette = match Colors::new("xresources") { - Some(palette) => { - let fg = hex_to_rgb(&palette.fg); - let bg = hex_to_rgb(&palette.bg); - let colors: Vec<(u8, u8, u8)> = palette.colors.iter().map(|c| hex_to_rgb(c)).collect(); - let theme = detect_theme(bg); - Palette { - source: PaletteSource::Xresources, - theme, - fg, - bg, - black: colors[0], - red: colors[1], - green: colors[2], - yellow: colors[3], - blue: colors[4], - magenta: colors[5], - cyan: colors[6], - white: colors[7], - orange: colors[9] - } - } - None => Palette { - source: PaletteSource::Default, - theme: Theme::Dark, - fg: colors::BRIGHT_GRAY, - bg: colors::GRAY, - black: colors::BLACK, - red: colors::RED, - green: colors::GREEN, - yellow: colors::GRAY, - blue: colors::GRAY, - magenta: colors::GRAY, - cyan: colors::GRAY, - white: colors::WHITE, - orange: colors::ORANGE - }, - }; - palette -} diff --git a/src/tests/fakes.rs b/src/tests/fakes.rs index c9504a98..e00de017 100644 --- a/src/tests/fakes.rs +++ b/src/tests/fakes.rs @@ -8,6 +8,8 @@ use std::time::{Duration, Instant}; use crate::os_input_output::OsApi; use crate::tests::possible_tty_inputs::{get_possible_tty_inputs, Bytes}; +use crate::utils::shared::colors; +use zellij_tile::data::{Palette, PaletteSource, Theme}; use crate::tests::utils::commands::{QUIT, SLEEP}; @@ -73,6 +75,7 @@ pub struct FakeInputOutput { last_snapshot_time: Arc>, should_trigger_sigwinch: Arc<(Mutex, Condvar)>, sigwinch_event: Option, + palette: Arc>, } impl FakeInputOutput { @@ -81,6 +84,21 @@ impl FakeInputOutput { let last_snapshot_time = Arc::new(Mutex::new(Instant::now())); let stdout_writer = FakeStdoutWriter::new(last_snapshot_time.clone()); win_sizes.insert(0, winsize); // 0 is the current terminal + let palette: Palette = Palette { + source: PaletteSource::Default, + theme: Theme::Dark, + fg: colors::BRIGHT_GRAY, + bg: colors::GRAY, + black: colors::BLACK, + red: colors::RED, + green: colors::GREEN, + yellow: colors::GRAY, + blue: colors::GRAY, + magenta: colors::GRAY, + cyan: colors::GRAY, + white: colors::WHITE, + orange: colors::ORANGE, + }; FakeInputOutput { read_buffers: Arc::new(Mutex::new(HashMap::new())), stdin_writes: Arc::new(Mutex::new(HashMap::new())), @@ -93,6 +111,7 @@ impl FakeInputOutput { possible_tty_inputs: get_possible_tty_inputs(), should_trigger_sigwinch: Arc::new((Mutex::new(false), Condvar::new())), sigwinch_event: None, + palette: Arc::new(Mutex::new(palette)), } } pub fn with_tty_inputs(mut self, tty_inputs: HashMap) -> Self { @@ -235,4 +254,22 @@ impl OsApi for FakeInputOutput { cb(); } } + fn load_palette(&self) -> Palette { + let palette: Palette = Palette { + source: PaletteSource::Default, + theme: Theme::Dark, + fg: colors::BRIGHT_GRAY, + bg: colors::GRAY, + black: colors::BLACK, + red: colors::RED, + green: colors::GREEN, + yellow: colors::GRAY, + blue: colors::GRAY, + magenta: colors::GRAY, + cyan: colors::GRAY, + white: colors::WHITE, + orange: colors::ORANGE, + }; + palette + } } diff --git a/zellij-tile/Cargo.toml b/zellij-tile/Cargo.toml index f59cf7b3..7a393310 100644 --- a/zellij-tile/Cargo.toml +++ b/zellij-tile/Cargo.toml @@ -7,6 +7,7 @@ description = "A small client-side library for writing Zellij plugins" license = "MIT" [dependencies] +ansi_term = "0.12.1" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" strum = "0.20.0" diff --git a/zellij-tile/src/data.rs b/zellij-tile/src/data.rs index 3b53ed13..845385ca 100644 --- a/zellij-tile/src/data.rs +++ b/zellij-tile/src/data.rs @@ -67,13 +67,13 @@ impl Default for InputMode { } } -#[derive(Clone, Copy, Debug, Serialize, Deserialize)] +#[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq, Hash)] pub enum Theme { Light, Dark, } -#[derive(Clone, Copy, Debug, Serialize, Deserialize)] +#[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq, Hash)] pub enum PaletteSource { Default, Xresources, @@ -84,11 +84,11 @@ pub mod colors { pub const GRAY: (u8, u8, u8) = (68, 68, 68); pub const BRIGHT_GRAY: (u8, u8, u8) = (138, 138, 138); pub const RED: (u8, u8, u8) = (135, 0, 0); - pub const ORANGE: (u8, u8, u8) = (215,95,0); + pub const ORANGE: (u8, u8, u8) = (215, 95, 0); pub const BLACK: (u8, u8, u8) = (0, 0, 0); } -#[derive(Clone, Copy, Debug, Serialize, Deserialize)] +#[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq, Hash)] pub struct Palette { pub source: PaletteSource, pub theme: Theme, @@ -102,7 +102,7 @@ pub struct Palette { pub magenta: (u8, u8, u8), pub cyan: (u8, u8, u8), pub white: (u8, u8, u8), - pub orange: (u8, u8, u8) + pub orange: (u8, u8, u8), } impl Default for Palette { @@ -120,7 +120,7 @@ impl Default for Palette { magenta: colors::GRAY, cyan: colors::GRAY, white: colors::WHITE, - orange: colors::ORANGE + orange: colors::ORANGE, } } } diff --git a/zellij-tile/src/lib.rs b/zellij-tile/src/lib.rs index af7d8ca1..3ab49061 100644 --- a/zellij-tile/src/lib.rs +++ b/zellij-tile/src/lib.rs @@ -39,3 +39,19 @@ macro_rules! register_plugin { } }; } + +#[macro_export] +macro_rules! rgb { + ($a:expr) => { + ansi_term::Color::RGB($a.0, $a.1, $a.2) + }; +} + +#[macro_export] +macro_rules! style { + ($a:expr, $b:expr) => { + ansi_term::Style::new() + .fg(ansi_term::Color::RGB($a.0, $a.1, $a.2)) + .on(ansi_term::Color::RGB($b.0, $b.1, $b.2)) + }; +} From 0adc914352948d342cd2bce8669434298b5fa748 Mon Sep 17 00:00:00 2001 From: denis Date: Sat, 1 May 2021 14:48:13 +0300 Subject: [PATCH 17/21] fix: hello formatter my old friend... --- src/common/input/handler.rs | 2 +- src/common/utils/shared.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/input/handler.rs b/src/common/input/handler.rs index b5f6008a..7304225c 100644 --- a/src/common/input/handler.rs +++ b/src/common/input/handler.rs @@ -2,7 +2,7 @@ use super::actions::Action; use super::keybinds::Keybinds; -use crate::common::{input::config::Config}; +use crate::common::input::config::Config; use crate::common::{AppInstruction, SenderWithContext, OPENCALLS}; use crate::errors::ContextType; use crate::os_input_output::OsApi; diff --git a/src/common/utils/shared.rs b/src/common/utils/shared.rs index c72b2e85..3f336f7b 100644 --- a/src/common/utils/shared.rs +++ b/src/common/utils/shared.rs @@ -5,7 +5,7 @@ use std::{iter, str::from_utf8}; use strip_ansi_escapes::strip; use colors_transform::{Color, Rgb}; -use zellij_tile::data::{Theme}; +use zellij_tile::data::Theme; fn ansi_len(s: &str) -> usize { from_utf8(&strip(s.as_bytes()).unwrap()) From 61bb74ebbd16503a385d0345508abb6b0adaf2fb Mon Sep 17 00:00:00 2001 From: denis Date: Sat, 1 May 2021 15:10:21 +0300 Subject: [PATCH 18/21] chore: clippy please allow it --- default-plugins/status-bar/src/first_line.rs | 11 ++++------- default-plugins/status-bar/src/main.rs | 3 ++- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/default-plugins/status-bar/src/first_line.rs b/default-plugins/status-bar/src/first_line.rs index 02f67c78..77cb4dfc 100644 --- a/default-plugins/status-bar/src/first_line.rs +++ b/default-plugins/status-bar/src/first_line.rs @@ -1,10 +1,7 @@ -use ansi_term::{ANSIStrings, Color::RGB, Style}; +use ansi_term::ANSIStrings; use zellij_tile::prelude::*; -use crate::{ - color_elements, - colors::{BLACK, BRIGHT_GRAY, GRAY, GREEN, RED, WHITE}, -}; +use crate::color_elements; use crate::{ColoredElements, LinePart, ARROW_SEPARATOR}; struct CtrlKeyShortcut { @@ -89,9 +86,9 @@ fn unselected_mode_shortcut(letter: char, text: &str, palette: ColoredElements) fn selected_mode_shortcut(letter: char, text: &str, palette: ColoredElements) -> LinePart { let prefix_separator = palette.selected_prefix_separator.paint(ARROW_SEPARATOR); - let char_left_separator = palette.selected_char_left_separator.paint(format!(" <")); + let char_left_separator = palette.selected_char_left_separator.paint(" <".to_string()); let char_shortcut = palette.selected_char_shortcut.paint(format!("{}", letter)); - let char_right_separator = palette.selected_char_right_separator.paint(format!(">")); + let char_right_separator = palette.selected_char_right_separator.paint(">".to_string()); let styled_text = palette.selected_styled_text.paint(format!("{} ", text)); let suffix_separator = palette.selected_suffix_separator.paint(ARROW_SEPARATOR); LinePart { diff --git a/default-plugins/status-bar/src/main.rs b/default-plugins/status-bar/src/main.rs index 4914efdb..7a8ccebc 100644 --- a/default-plugins/status-bar/src/main.rs +++ b/default-plugins/status-bar/src/main.rs @@ -1,7 +1,7 @@ mod first_line; mod second_line; -use ansi_term::{Color::RGB, Style}; +use ansi_term::Style; use std::fmt::{Display, Error, Formatter}; use zellij_tile::prelude::*; @@ -66,6 +66,7 @@ pub struct ColoredElements { } impl ColoredElements { + #[allow(clippy::too_many_arguments)] pub fn new( selected_prefix_separator: Style, selected_char_left_separator: Style, From d48cc815368c6424977f3c6908e81e213fa260e1 Mon Sep 17 00:00:00 2001 From: denis Date: Sun, 2 May 2021 12:25:49 +0300 Subject: [PATCH 19/21] fix: don't have new on ColoredElements anymore, removed default for palette in zellij-tile --- default-plugins/status-bar/src/main.rs | 157 ++++++++----------------- default-plugins/tab-bar/src/tab.rs | 2 +- src/common/mod.rs | 1 - zellij-tile/src/data.rs | 40 ++----- 4 files changed, 62 insertions(+), 138 deletions(-) diff --git a/default-plugins/status-bar/src/main.rs b/default-plugins/status-bar/src/main.rs index 7a8ccebc..8b13e763 100644 --- a/default-plugins/status-bar/src/main.rs +++ b/default-plugins/status-bar/src/main.rs @@ -34,7 +34,7 @@ impl Display for LinePart { #[derive(Clone, Copy)] pub struct ColoredElements { - // slected mode + // selected mode pub selected_prefix_separator: Style, pub selected_char_left_separator: Style, pub selected_char_shortcut: Style, @@ -65,117 +65,62 @@ pub struct ColoredElements { pub superkey_suffix_separator: Style, } -impl ColoredElements { - #[allow(clippy::too_many_arguments)] - pub fn new( - selected_prefix_separator: Style, - selected_char_left_separator: Style, - selected_char_shortcut: Style, - selected_char_right_separator: Style, - selected_styled_text: Style, - selected_suffix_separator: Style, - unselected_prefix_separator: Style, - unselected_char_left_separator: Style, - unselected_char_shortcut: Style, - unselected_char_right_separator: Style, - unselected_styled_text: Style, - unselected_suffix_separator: Style, - disabled_prefix_separator: Style, - disabled_styled_text: Style, - disabled_suffix_separator: Style, - selected_single_letter_prefix_separator: Style, - selected_single_letter_char_shortcut: Style, - selected_single_letter_suffix_separator: Style, - unselected_single_letter_prefix_separator: Style, - unselected_single_letter_char_shortcut: Style, - unselected_single_letter_suffix_separator: Style, - superkey_prefix: Style, - superkey_suffix_separator: Style, - ) -> Self { - Self { - selected_prefix_separator, - selected_char_left_separator, - selected_char_shortcut, - selected_char_right_separator, - selected_styled_text, - selected_suffix_separator, - unselected_prefix_separator, - unselected_char_left_separator, - unselected_char_shortcut, - unselected_char_right_separator, - unselected_styled_text, - unselected_suffix_separator, - disabled_prefix_separator, - disabled_styled_text, - disabled_suffix_separator, - selected_single_letter_prefix_separator, - selected_single_letter_char_shortcut, - selected_single_letter_suffix_separator, - unselected_single_letter_prefix_separator, - unselected_single_letter_char_shortcut, - unselected_single_letter_suffix_separator, - superkey_prefix, - superkey_suffix_separator, - } - } -} - // I really hate this, but I can't come up with a good solution for this, // we need different colors from palette for the default theme // plus here we can add new sources in the future, like Theme // that can be defined in the config perhaps fn color_elements(palette: Palette) -> ColoredElements { match palette.source { - PaletteSource::Default => ColoredElements::new( - style!(palette.bg, palette.green), - style!(palette.black, palette.green).bold(), - style!(palette.red, palette.green).bold(), - style!(palette.black, palette.green).bold(), - style!(palette.black, palette.green).bold(), - style!(palette.green, palette.bg).bold(), - style!(palette.bg, palette.fg), - style!(palette.bg, palette.fg).bold(), - style!(palette.red, palette.fg).bold(), - style!(palette.bg, palette.fg).bold(), - style!(palette.black, palette.fg).bold(), - style!(palette.fg, palette.bg), - style!(palette.bg, palette.fg), - style!(palette.bg, palette.fg).dimmed(), - style!(palette.fg, palette.bg), - style!(palette.fg, palette.green), - style!(palette.red, palette.green).bold(), - style!(palette.green, palette.fg), - style!(palette.fg, palette.bg), - style!(palette.red, palette.fg).bold(), - style!(palette.fg, palette.bg), - style!(palette.white, palette.bg).bold(), - style!(palette.bg, palette.bg), - ), - PaletteSource::Xresources => ColoredElements::new( - style!(palette.bg, palette.green), - style!(palette.fg, palette.green).bold(), - style!(palette.red, palette.green).bold(), - style!(palette.fg, palette.green).bold(), - style!(palette.bg, palette.green).bold(), - style!(palette.green, palette.bg).bold(), - style!(palette.bg, palette.fg), - style!(palette.bg, palette.fg).bold(), - style!(palette.red, palette.fg).bold(), - style!(palette.bg, palette.fg).bold(), - style!(palette.bg, palette.fg).bold(), - style!(palette.fg, palette.bg), - style!(palette.bg, palette.fg), - style!(palette.bg, palette.fg).dimmed(), - style!(palette.fg, palette.bg), - style!(palette.fg, palette.green), - style!(palette.red, palette.green).bold(), - style!(palette.green, palette.fg), - style!(palette.fg, palette.bg), - style!(palette.red, palette.fg).bold(), - style!(palette.fg, palette.bg), - style!(palette.bg, palette.fg).bold(), - style!(palette.fg, palette.bg), - ), + PaletteSource::Default => ColoredElements { + selected_prefix_separator: style!(palette.bg, palette.green), + selected_char_left_separator: style!(palette.black, palette.green).bold(), + selected_char_shortcut: style!(palette.red, palette.green).bold(), + selected_char_right_separator: style!(palette.black, palette.green).bold(), + selected_styled_text: style!(palette.black, palette.green).bold(), + selected_suffix_separator: style!(palette.green, palette.bg).bold(), + unselected_prefix_separator: style!(palette.bg, palette.fg), + unselected_char_left_separator: style!(palette.bg, palette.fg).bold(), + unselected_char_shortcut: style!(palette.red, palette.fg).bold(), + unselected_char_right_separator: style!(palette.bg, palette.fg).bold(), + unselected_styled_text: style!(palette.black, palette.fg).bold(), + unselected_suffix_separator: style!(palette.fg, palette.bg), + disabled_prefix_separator: style!(palette.bg, palette.fg), + disabled_styled_text: style!(palette.bg, palette.fg).dimmed(), + disabled_suffix_separator: style!(palette.fg, palette.bg), + selected_single_letter_prefix_separator: style!(palette.fg, palette.green), + selected_single_letter_char_shortcut: style!(palette.red, palette.green).bold(), + selected_single_letter_suffix_separator: style!(palette.green, palette.fg), + unselected_single_letter_prefix_separator: style!(palette.fg, palette.bg), + unselected_single_letter_char_shortcut: style!(palette.red, palette.fg).bold(), + unselected_single_letter_suffix_separator: style!(palette.fg, palette.bg), + superkey_prefix: style!(palette.white, palette.bg).bold(), + superkey_suffix_separator: style!(palette.bg, palette.bg), + }, + PaletteSource::Xresources => ColoredElements { + selected_prefix_separator: style!(palette.bg, palette.green), + selected_char_left_separator: style!(palette.fg, palette.green).bold(), + selected_char_shortcut: style!(palette.red, palette.green).bold(), + selected_char_right_separator: style!(palette.fg, palette.green).bold(), + selected_styled_text: style!(palette.bg, palette.green).bold(), + selected_suffix_separator: style!(palette.green, palette.bg).bold(), + unselected_prefix_separator: style!(palette.bg, palette.fg), + unselected_char_left_separator: style!(palette.bg, palette.fg).bold(), + unselected_char_shortcut: style!(palette.red, palette.fg).bold(), + unselected_char_right_separator: style!(palette.bg, palette.fg).bold(), + unselected_styled_text: style!(palette.bg, palette.fg).bold(), + unselected_suffix_separator: style!(palette.fg, palette.bg), + disabled_prefix_separator: style!(palette.bg, palette.fg), + disabled_styled_text: style!(palette.bg, palette.fg).dimmed(), + disabled_suffix_separator: style!(palette.fg, palette.bg), + selected_single_letter_prefix_separator: style!(palette.fg, palette.green), + selected_single_letter_char_shortcut: style!(palette.red, palette.green).bold(), + selected_single_letter_suffix_separator: style!(palette.green, palette.fg), + unselected_single_letter_prefix_separator: style!(palette.fg, palette.bg), + unselected_single_letter_char_shortcut: style!(palette.red, palette.fg).bold(), + unselected_single_letter_suffix_separator: style!(palette.fg, palette.bg), + superkey_prefix: style!(palette.bg, palette.fg).bold(), + superkey_suffix_separator: style!(palette.fg, palette.bg), + }, } } diff --git a/default-plugins/tab-bar/src/tab.rs b/default-plugins/tab-bar/src/tab.rs index 27b4ad94..cbe74446 100644 --- a/default-plugins/tab-bar/src/tab.rs +++ b/default-plugins/tab-bar/src/tab.rs @@ -1,5 +1,5 @@ use crate::{LinePart, ARROW_SEPARATOR}; -use ansi_term::{ANSIStrings, Color::RGB, Style}; +use ansi_term::ANSIStrings; use zellij_tile::prelude::*; pub fn active_tab(text: String, palette: Palette) -> LinePart { diff --git a/src/common/mod.rs b/src/common/mod.rs index b17fce34..28446d2e 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -259,7 +259,6 @@ pub fn start(mut os_input: Box, opts: CliArgs, config: Config) { let send_app_instructions = send_app_instructions.clone(); let max_panes = opts.max_panes; let colors = os_input.load_palette(); - // debug_log_to_file(format!("{:?}", colors)); move || { let mut screen = Screen::new( receive_screen_instructions, diff --git a/zellij-tile/src/data.rs b/zellij-tile/src/data.rs index 845385ca..86100e7a 100644 --- a/zellij-tile/src/data.rs +++ b/zellij-tile/src/data.rs @@ -72,23 +72,23 @@ pub enum Theme { Light, Dark, } +impl Default for Theme { + fn default() -> Theme { + Theme::Dark + } +} #[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq, Hash)] pub enum PaletteSource { Default, Xresources, } -pub mod colors { - pub const WHITE: (u8, u8, u8) = (238, 238, 238); - pub const GREEN: (u8, u8, u8) = (175, 255, 0); - pub const GRAY: (u8, u8, u8) = (68, 68, 68); - pub const BRIGHT_GRAY: (u8, u8, u8) = (138, 138, 138); - pub const RED: (u8, u8, u8) = (135, 0, 0); - pub const ORANGE: (u8, u8, u8) = (215, 95, 0); - pub const BLACK: (u8, u8, u8) = (0, 0, 0); +impl Default for PaletteSource { + fn default() -> PaletteSource { + PaletteSource::Default + } } - -#[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq, Hash)] +#[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq, Hash, Default)] pub struct Palette { pub source: PaletteSource, pub theme: Theme, @@ -105,26 +105,6 @@ pub struct Palette { pub orange: (u8, u8, u8), } -impl Default for Palette { - fn default() -> Palette { - Palette { - source: PaletteSource::Default, - theme: Theme::Dark, - fg: colors::BRIGHT_GRAY, - bg: colors::BLACK, - black: colors::BLACK, - red: colors::RED, - green: colors::GREEN, - yellow: colors::GRAY, - blue: colors::GRAY, - magenta: colors::GRAY, - cyan: colors::GRAY, - white: colors::WHITE, - orange: colors::ORANGE, - } - } -} - /// Represents the contents of the help message that is printed in the status bar, /// which indicates the current [`InputMode`] and what the keybinds for that mode /// are. Related to the default `status-bar` plugin. From 56cf44627596edab8959c18df655caf3acd705f1 Mon Sep 17 00:00:00 2001 From: denis Date: Sun, 2 May 2021 12:57:48 +0300 Subject: [PATCH 20/21] chore: added zellij-tile-extra, moved macros from zellij-tile --- Cargo.lock | 10 ++++++++++ Cargo.toml | 2 ++ Makefile.toml | 8 +++++++- default-plugins/status-bar/Cargo.toml | 1 + default-plugins/status-bar/src/main.rs | 1 + default-plugins/tab-bar/Cargo.toml | 1 + default-plugins/tab-bar/src/line.rs | 1 + default-plugins/tab-bar/src/tab.rs | 1 + zellij-tile-extra/Cargo.toml | 12 ++++++++++++ zellij-tile-extra/LICENSE.md | 1 + zellij-tile-extra/src/lib.rs | 15 +++++++++++++++ zellij-tile/src/lib.rs | 16 ---------------- 12 files changed, 52 insertions(+), 17 deletions(-) create mode 100644 zellij-tile-extra/Cargo.toml create mode 120000 zellij-tile-extra/LICENSE.md create mode 100644 zellij-tile-extra/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index d5a0de39..56986ed2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1483,6 +1483,7 @@ dependencies = [ "ansi_term 0.12.1", "colored", "zellij-tile", + "zellij-tile-extra", ] [[package]] @@ -1575,6 +1576,7 @@ dependencies = [ "ansi_term 0.12.1", "colored", "zellij-tile", + "zellij-tile-extra", ] [[package]] @@ -2249,6 +2251,7 @@ dependencies = [ "wasmer-wasi", "xrdb", "zellij-tile", + "zellij-tile-extra", ] [[package]] @@ -2261,3 +2264,10 @@ dependencies = [ "strum", "strum_macros", ] + +[[package]] +name = "zellij-tile-extra" +version = "1.0.0" +dependencies = [ + "ansi_term 0.12.1", +] diff --git a/Cargo.toml b/Cargo.toml index bfdfa884..a1f260cc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -39,6 +39,7 @@ interprocess = "1.0.1" xrdb = "0.1.1" colors-transform = "0.2.5" zellij-tile = { path = "zellij-tile/", version = "1.1.0" } +zellij-tile-extra = { path = "zellij-tile-extra/", version="1.0.0" } [dependencies.async-std] version = "1.3.0" @@ -54,6 +55,7 @@ structopt = "0.3" [workspace] members = [ "zellij-tile", + "zellij-tile-extra", "default-plugins/status-bar", "default-plugins/strider", "default-plugins/tab-bar", diff --git a/Makefile.toml b/Makefile.toml index 628899f9..1d11f0d1 100644 --- a/Makefile.toml +++ b/Makefile.toml @@ -108,7 +108,7 @@ args = ["install", "cross"] [tasks.publish] clear = true workspace = false -dependencies = ["build-plugins-release", "wasm-opt-plugins", "build-release", "publish-zellij-tile"] +dependencies = ["build-plugins-release", "wasm-opt-plugins", "build-release", "publish-zellij-tile", "publish-zellij-tile-extra"] run_task = "publish-zellij" [tasks.publish-zellij-tile] @@ -117,6 +117,12 @@ cwd = "zellij-tile" command = "cargo" args = ["publish"] +[tasks.publish-zellij-tile-extra] +ignore_errors = true +cwd = "zellij-tile-extra" +command = "cargo" +args = ["publish"] + [tasks.publish-zellij] command = "cargo" args = ["publish"] \ No newline at end of file diff --git a/default-plugins/status-bar/Cargo.toml b/default-plugins/status-bar/Cargo.toml index c94d8feb..8c6cc85d 100644 --- a/default-plugins/status-bar/Cargo.toml +++ b/default-plugins/status-bar/Cargo.toml @@ -9,3 +9,4 @@ license = "MIT" colored = "2" ansi_term = "0.12" zellij-tile = { path = "../../zellij-tile" } +zellij-tile-extra = { path = "../../zellij-tile-extra" } \ No newline at end of file diff --git a/default-plugins/status-bar/src/main.rs b/default-plugins/status-bar/src/main.rs index 8b13e763..93898cea 100644 --- a/default-plugins/status-bar/src/main.rs +++ b/default-plugins/status-bar/src/main.rs @@ -5,6 +5,7 @@ use ansi_term::Style; use std::fmt::{Display, Error, Formatter}; use zellij_tile::prelude::*; +use zellij_tile_extra::*; use first_line::{ctrl_keys, superkey}; use second_line::keybinds; diff --git a/default-plugins/tab-bar/Cargo.toml b/default-plugins/tab-bar/Cargo.toml index 59b95b4b..d27144dd 100644 --- a/default-plugins/tab-bar/Cargo.toml +++ b/default-plugins/tab-bar/Cargo.toml @@ -9,3 +9,4 @@ license = "MIT" colored = "2" ansi_term = "0.12" zellij-tile = { path = "../../zellij-tile" } +zellij-tile-extra = { path = "../../zellij-tile-extra" } \ No newline at end of file diff --git a/default-plugins/tab-bar/src/line.rs b/default-plugins/tab-bar/src/line.rs index ae287d2e..98ad5166 100644 --- a/default-plugins/tab-bar/src/line.rs +++ b/default-plugins/tab-bar/src/line.rs @@ -2,6 +2,7 @@ use ansi_term::ANSIStrings; use crate::{LinePart, ARROW_SEPARATOR}; use zellij_tile::prelude::*; +use zellij_tile_extra::*; fn get_current_title_len(current_title: &[LinePart]) -> usize { current_title diff --git a/default-plugins/tab-bar/src/tab.rs b/default-plugins/tab-bar/src/tab.rs index cbe74446..ab110634 100644 --- a/default-plugins/tab-bar/src/tab.rs +++ b/default-plugins/tab-bar/src/tab.rs @@ -1,6 +1,7 @@ use crate::{LinePart, ARROW_SEPARATOR}; use ansi_term::ANSIStrings; use zellij_tile::prelude::*; +use zellij_tile_extra::*; pub fn active_tab(text: String, palette: Palette) -> LinePart { let left_separator = style!(palette.bg, palette.green).paint(ARROW_SEPARATOR); diff --git a/zellij-tile-extra/Cargo.toml b/zellij-tile-extra/Cargo.toml new file mode 100644 index 00000000..69a0298b --- /dev/null +++ b/zellij-tile-extra/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "zellij-tile-extra" +version = "1.0.0" +authors = ["denis "] +edition = "2018" +description = "A utility library for Zellij plugins" +license = "MIT" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +ansi_term = "0.12.1" \ No newline at end of file diff --git a/zellij-tile-extra/LICENSE.md b/zellij-tile-extra/LICENSE.md new file mode 120000 index 00000000..7eabdb1c --- /dev/null +++ b/zellij-tile-extra/LICENSE.md @@ -0,0 +1 @@ +../LICENSE.md \ No newline at end of file diff --git a/zellij-tile-extra/src/lib.rs b/zellij-tile-extra/src/lib.rs new file mode 100644 index 00000000..bec19158 --- /dev/null +++ b/zellij-tile-extra/src/lib.rs @@ -0,0 +1,15 @@ +#[macro_export] +macro_rules! rgb { + ($a:expr) => { + ansi_term::Color::RGB($a.0, $a.1, $a.2) + }; +} + +#[macro_export] +macro_rules! style { + ($a:expr, $b:expr) => { + ansi_term::Style::new() + .fg(ansi_term::Color::RGB($a.0, $a.1, $a.2)) + .on(ansi_term::Color::RGB($b.0, $b.1, $b.2)) + }; +} diff --git a/zellij-tile/src/lib.rs b/zellij-tile/src/lib.rs index 3ab49061..af7d8ca1 100644 --- a/zellij-tile/src/lib.rs +++ b/zellij-tile/src/lib.rs @@ -39,19 +39,3 @@ macro_rules! register_plugin { } }; } - -#[macro_export] -macro_rules! rgb { - ($a:expr) => { - ansi_term::Color::RGB($a.0, $a.1, $a.2) - }; -} - -#[macro_export] -macro_rules! style { - ($a:expr, $b:expr) => { - ansi_term::Style::new() - .fg(ansi_term::Color::RGB($a.0, $a.1, $a.2)) - .on(ansi_term::Color::RGB($b.0, $b.1, $b.2)) - }; -} From ce1f81bcec11bb20ecb85164c6fcc710674081be Mon Sep 17 00:00:00 2001 From: denis Date: Sun, 2 May 2021 13:04:12 +0300 Subject: [PATCH 21/21] chore: remove unused dependency from zellij-tile --- Cargo.lock | 1 - zellij-tile/Cargo.toml | 1 - 2 files changed, 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 56986ed2..cf2d94fc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2258,7 +2258,6 @@ dependencies = [ name = "zellij-tile" version = "1.1.0" dependencies = [ - "ansi_term 0.12.1", "serde", "serde_json", "strum", diff --git a/zellij-tile/Cargo.toml b/zellij-tile/Cargo.toml index 7a393310..f59cf7b3 100644 --- a/zellij-tile/Cargo.toml +++ b/zellij-tile/Cargo.toml @@ -7,7 +7,6 @@ description = "A small client-side library for writing Zellij plugins" license = "MIT" [dependencies] -ansi_term = "0.12.1" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" strum = "0.20.0"