From 900bc2e56ee92d05e68ab06a12ece853a3f9d620 Mon Sep 17 00:00:00 2001 From: mtgmonkey Date: Sun, 6 Jul 2025 22:22:17 -0400 Subject: [PATCH] improve gui, add tick --- Cargo.lock | 304 ++++++++++++++++++++++++++++++++++++++++++---------- Cargo.toml | 2 +- package.nix | 2 +- src/lib.rs | 53 +++++---- src/main.rs | 18 ++-- 5 files changed, 291 insertions(+), 88 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bc9bc8d..f1aab20 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -132,12 +132,23 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" dependencies = [ - "event-listener", + "event-listener 5.4.0", "event-listener-strategy", "futures-core", "pin-project-lite", ] +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener 2.5.3", + "futures-core", +] + [[package]] name = "async-channel" version = "2.3.1" @@ -158,21 +169,53 @@ checksum = "bb812ffb58524bdd10860d7d974e2f01cc0950c2438a74ee5ec2e2280c6c4ffa" dependencies = [ "async-task", "concurrent-queue", - "fastrand", - "futures-lite", + "fastrand 2.3.0", + "futures-lite 2.6.0", "pin-project-lite", "slab", ] +[[package]] +name = "async-fs" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06" +dependencies = [ + "async-lock 2.8.0", + "autocfg", + "blocking", + "futures-lite 1.13.0", +] + [[package]] name = "async-fs" version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" dependencies = [ - "async-lock", + "async-lock 3.4.0", "blocking", - "futures-lite", + "futures-lite 2.6.0", +] + +[[package]] +name = "async-io" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" +dependencies = [ + "async-lock 2.8.0", + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-lite 1.13.0", + "log", + "parking", + "polling 2.8.0", + "rustix 0.37.28", + "slab", + "socket2", + "waker-fn", ] [[package]] @@ -181,45 +224,82 @@ version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1237c0ae75a0f3765f58910ff9cdd0a12eeb39ab2f4c7de23262f337f0aacbb3" dependencies = [ - "async-lock", + "async-lock 3.4.0", "cfg-if", "concurrent-queue", "futures-io", - "futures-lite", + "futures-lite 2.6.0", "parking", - "polling", + "polling 3.8.0", "rustix 1.0.7", "slab", "tracing", "windows-sys 0.59.0", ] +[[package]] +name = "async-lock" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" +dependencies = [ + "event-listener 2.5.3", +] + [[package]] name = "async-lock" version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" dependencies = [ - "event-listener", + "event-listener 5.4.0", "event-listener-strategy", "pin-project-lite", ] +[[package]] +name = "async-net" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0434b1ed18ce1cf5769b8ac540e33f01fa9471058b5e89da9e06f3c882a8c12f" +dependencies = [ + "async-io 1.13.0", + "blocking", + "futures-lite 1.13.0", +] + +[[package]] +name = "async-process" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6438ba0a08d81529c69b36700fa2f95837bfe3e776ab39cde9c14d9149da88" +dependencies = [ + "async-io 1.13.0", + "async-lock 2.8.0", + "async-signal", + "blocking", + "cfg-if", + "event-listener 3.1.0", + "futures-lite 1.13.0", + "rustix 0.38.44", + "windows-sys 0.48.0", +] + [[package]] name = "async-process" version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cde3f4e40e6021d7acffc90095cbd6dc54cb593903d1de5832f435eb274b85dc" dependencies = [ - "async-channel", - "async-io", - "async-lock", + "async-channel 2.3.1", + "async-io 2.4.1", + "async-lock 3.4.0", "async-signal", "async-task", "blocking", "cfg-if", - "event-listener", - "futures-lite", + "event-listener 5.4.0", + "futures-lite 2.6.0", "rustix 1.0.7", "tracing", ] @@ -241,8 +321,8 @@ version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7605a4e50d4b06df3898d5a70bf5fde51ed9059b0434b73105193bc27acce0d" dependencies = [ - "async-io", - "async-lock", + "async-io 2.4.1", + "async-lock 3.4.0", "atomic-waker", "cfg-if", "futures-core", @@ -339,10 +419,10 @@ version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" dependencies = [ - "async-channel", + "async-channel 2.3.1", "async-task", "futures-io", - "futures-lite", + "futures-lite 2.6.0", "piper", ] @@ -392,7 +472,7 @@ checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" dependencies = [ "bitflags 2.9.1", "log", - "polling", + "polling 3.8.0", "rustix 0.38.44", "slab", "thiserror", @@ -927,6 +1007,23 @@ dependencies = [ "num-traits", ] +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "event-listener" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d93877bcde0eb80ca09131a08d23f0a5c18a620b01db137dba666d18cd9b30c2" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + [[package]] name = "event-listener" version = "5.4.0" @@ -944,7 +1041,7 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" dependencies = [ - "event-listener", + "event-listener 5.4.0", "pin-project-lite", ] @@ -954,6 +1051,15 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd2e7510819d6fbf51a5545c8f922716ecfb14df168a3242f7d33e0239efe6a1" +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + [[package]] name = "fastrand" version = "2.3.0" @@ -969,18 +1075,6 @@ dependencies = [ "simd-adler32", ] -[[package]] -name = "filetime" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" -dependencies = [ - "cfg-if", - "libc", - "libredox", - "windows-sys 0.59.0", -] - [[package]] name = "flate2" version = "1.1.2" @@ -1099,13 +1193,28 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +[[package]] +name = "futures-lite" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" +dependencies = [ + "fastrand 1.9.0", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] + [[package]] name = "futures-lite" version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" dependencies = [ - "fastrand", + "fastrand 2.3.0", "futures-core", "futures-io", "parking", @@ -1346,6 +1455,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + [[package]] name = "hermit-abi" version = "0.5.2" @@ -1408,6 +1523,7 @@ dependencies = [ "iced_core", "log", "rustc-hash 2.1.1", + "smol", "wasm-bindgen-futures", "wasm-timer", ] @@ -1561,6 +1677,17 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "windows-sys 0.48.0", +] + [[package]] name = "jni" version = "0.21.1" @@ -1673,6 +1800,12 @@ dependencies = [ "redox_syscall 0.5.13", ] +[[package]] +name = "linux-raw-sys" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + [[package]] name = "linux-raw-sys" version = "0.4.15" @@ -1870,7 +2003,7 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" dependencies = [ - "hermit-abi", + "hermit-abi 0.5.2", "libc", ] @@ -2333,7 +2466,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" dependencies = [ "atomic-waker", - "fastrand", + "fastrand 2.3.0", "futures-io", ] @@ -2356,6 +2489,22 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "polling" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" +dependencies = [ + "autocfg", + "bitflags 1.3.2", + "cfg-if", + "concurrent-queue", + "libc", + "log", + "pin-project-lite", + "windows-sys 0.48.0", +] + [[package]] name = "polling" version = "3.8.0" @@ -2364,7 +2513,7 @@ checksum = "b53a684391ad002dd6a596ceb6c74fd004fdce75f4be2e3f615068abbea5fd50" dependencies = [ "cfg-if", "concurrent-queue", - "hermit-abi", + "hermit-abi 0.5.2", "pin-project-lite", "rustix 1.0.7", "tracing", @@ -2578,9 +2727,6 @@ version = "0.1.0" dependencies = [ "iced", "nix 0.30.1", - "tar", - "tempfile", - "winit", ] [[package]] @@ -2595,6 +2741,20 @@ version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +[[package]] +name = "rustix" +version = "0.37.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "519165d378b97752ca44bbe15047d5d3409e875f39327546b42ac81d7e18c1b6" +dependencies = [ + "bitflags 1.3.2", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys 0.3.8", + "windows-sys 0.48.0", +] + [[package]] name = "rustix" version = "0.38.44" @@ -2820,6 +2980,23 @@ dependencies = [ "wayland-backend", ] +[[package]] +name = "smol" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13f2b548cd8447f8de0fdf1c592929f70f4fc7039a05e47404b0d096ec6987a1" +dependencies = [ + "async-channel 1.9.0", + "async-executor", + "async-fs 1.6.0", + "async-io 1.13.0", + "async-lock 2.8.0", + "async-net", + "async-process 1.8.1", + "blocking", + "futures-lite 1.13.0", +] + [[package]] name = "smol_str" version = "0.2.2" @@ -2829,6 +3006,16 @@ dependencies = [ "serde", ] +[[package]] +name = "socket2" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "softbuffer" version = "0.4.6" @@ -2840,7 +3027,7 @@ dependencies = [ "cfg_aliases 0.2.1", "core-graphics 0.24.0", "drm", - "fastrand", + "fastrand 2.3.0", "foreign-types", "js-sys", "log", @@ -2930,23 +3117,13 @@ dependencies = [ "libc", ] -[[package]] -name = "tar" -version = "0.4.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d863878d212c87a19c1a610eb53bb01fe12951c0501cf5a0d65f724914a667a" -dependencies = [ - "filetime", - "libc", -] - [[package]] name = "tempfile" version = "3.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" dependencies = [ - "fastrand", + "fastrand 2.3.0", "getrandom 0.3.3", "once_cell", "rustix 1.0.7", @@ -3185,6 +3362,12 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "waker-fn" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" + [[package]] name = "walkdir" version = "2.5.0" @@ -3611,6 +3794,15 @@ dependencies = [ "windows-targets 0.42.2", ] +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + [[package]] name = "windows-sys" version = "0.52.0" @@ -4046,16 +4238,16 @@ checksum = "bb97012beadd29e654708a0fdb4c84bc046f537aecfde2c3ee0a9e4b4d48c725" dependencies = [ "async-broadcast", "async-executor", - "async-fs", - "async-io", - "async-lock", - "async-process", + "async-fs 2.1.2", + "async-io 2.4.1", + "async-lock 3.4.0", + "async-process 2.3.1", "async-recursion", "async-task", "async-trait", "blocking", "enumflags2", - "event-listener", + "event-listener 5.4.0", "futures-core", "futures-sink", "futures-util", diff --git a/Cargo.toml b/Cargo.toml index 29eb9c4..9222201 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,4 +5,4 @@ edition = "2024" [dependencies] nix = { version = "0.30.1", features = ["term", "process", "fs"], default-features = false } -iced = "0.13.1" +iced = { version = "0.13.1", features = ["smol"] } diff --git a/package.nix b/package.nix index 62d7aa3..47babf6 100644 --- a/package.nix +++ b/package.nix @@ -14,7 +14,7 @@ ... }: naersk.buildPackage rec { - name = "rust_pty"; + name = "rust_term"; src = ./.; buildInputs = [ busybox-sandbox-shell diff --git a/src/lib.rs b/src/lib.rs index 1f180db..904b260 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,5 +1,6 @@ use iced::Element; -use iced::widget::{column, scrollable, text, text_input}; +use iced::Font; +use iced::widget::{column, row, scrollable, text, text_input}; use nix::pty::{ForkptyResult, forkpty}; use nix::unistd::write; @@ -49,6 +50,7 @@ fn set_nonblock(fd: &OwnedFd) { pub enum Msg { HasInput, InputChanged(String), + Tick, } pub struct Model { @@ -83,36 +85,51 @@ impl Model { write_buffer.push(b'\n'); write(self.fd.as_fd(), &mut write_buffer); self.input = String::new(); - let mut nored = 0; - while nored <= 2 { - let red = read_from_fd(&self.fd); - match &red { - Some(red) => { - nored += 1; - self.update_screen_buffer(red); - } - None => (), - }; - } } Msg::InputChanged(input) => self.input = input, + Msg::Tick => match read_from_fd(&self.fd) { + Some(red) => self.update_screen_buffer(&red), + None => (), + }, } } pub fn view(&self) -> Element<'_, Msg> { - scrollable(column![ - text(String::from( + let (left, right) = match String::from_utf8(self.screen_buffer.to_vec()) + .unwrap() + .trim_end_matches('\0') + .rsplit_once('\n') + { + Some(tup) => (tup.0.to_string(), tup.1.to_string()), + None => ( + String::new(), String::from_utf8(self.screen_buffer.to_vec()) .unwrap() .trim_end_matches('\0') - )), - text_input("", &self.input) - .on_input(Msg::InputChanged) - .on_submit(Msg::HasInput) + .to_string(), + ), + }; + scrollable(column![ + text(left).font(Font::MONOSPACE), + row![ + text(right).font(Font::MONOSPACE), + text_input("", &self.input) + .on_input(Msg::InputChanged) + .on_submit(Msg::HasInput) + .font(Font::MONOSPACE) + ] ]) .into() } + pub fn theme(&self) -> iced::Theme { + iced::Theme::GruvboxDark + } + + pub fn subscription(&self) -> iced::Subscription { + iced::time::every(iced::time::Duration::new(0, 100)).map(|_| Msg::Tick) + } + fn update_screen_buffer(&mut self, vec: &Vec) { let offset = self.screen_buffer.iter().position(|&c| c == b'\0').unwrap(); for (i, chr) in vec.iter().enumerate() { diff --git a/src/main.rs b/src/main.rs index b3c3fdd..783808e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,18 +1,12 @@ -use iced::Element; -use iced::widget::{button, text}; - -use nix::unistd::write; - -use std::fs::File; -use std::io::Read; -use std::io::Write; -use std::os::unix::io::{AsFd, OwnedFd}; - use rust_term::*; fn main() -> iced::Result { - iced::run("test", Model::update, Model::view) - /* let default_shell = "/home/mtgmonkey/.nix-profile/bin/dash".to_string(); + iced::application("test", Model::update, Model::view) + .theme(Model::theme) + .subscription(Model::subscription) + .run() + /* + let default_shell = "/home/mtgmonkey/.nix-profile/bin/dash".to_string(); let fd = spawn_pty_with_shell(default_shell); let mut write_buffer = "tty\n".as_bytes().to_vec(); write(fd.as_fd(), &mut write_buffer);