From 98b7a8d201942f904f1aa9af40669445cab13157 Mon Sep 17 00:00:00 2001 From: electria Date: Sat, 15 Aug 2026 18:16:16 -0700 Subject: [PATCH 01/28] feat: multiple graphs --- src/app/cpu_graph.rs | 19 ++++++++++++- src/app/mod.rs | 60 ++++++++++++++++++++++++++++++----------- src/main.rs | 1 + src/sysinfo_snapshot.rs | 18 +++++++++++++ 4 files changed, 82 insertions(+), 16 deletions(-) create mode 100644 src/sysinfo_snapshot.rs diff --git a/src/app/cpu_graph.rs b/src/app/cpu_graph.rs index 42a4a22..9fe439c 100644 --- a/src/app/cpu_graph.rs +++ b/src/app/cpu_graph.rs @@ -8,11 +8,23 @@ const CYAN: Color = Color::from_rgb8(0, 255, 255); #[derive(Default)] pub struct CpuGraph { - pub cache: canvas::Cache, timeline: VecDeque, + + pub cache: canvas::Cache, } impl CpuGraph { + pub fn new(usage: f32) -> Self { + Self { + timeline: { + let mut vec = VecDeque::new(); + vec.push_front(usage); + vec + }, + ..Default::default() + } + } + pub fn update(&mut self, usage: f32) { self.timeline.push_back(usage); if self.timeline.len() > 1000 { @@ -32,6 +44,11 @@ impl canvas::Program for CpuGraph { _cursor: mouse::Cursor, ) -> Vec> { let geometry = self.cache.draw(renderer, bounds.size(), |frame| { + frame.stroke_rectangle( + Point::new(0., 0.), + bounds.size(), + canvas::Stroke::default().with_color(Color::from_rgb8(255, 0, 0)), + ); frame.stroke( &canvas::Path::new(|builder| { for (index, value) in self.timeline.iter().enumerate() { diff --git a/src/app/mod.rs b/src/app/mod.rs index 1e0262a..d989b14 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -4,24 +4,24 @@ use iced::{ }; use smol::Timer; -use crate::app::cpu_graph::CpuGraph; +use crate::{app::cpu_graph::CpuGraph, sysinfo_snapshot::SysinfoSnapshot}; mod cpu_graph; enum Message { - Cpu(f32), + Info(SysinfoSnapshot), } +#[derive(Default)] struct State { - cpu_graph: CpuGraph, + total_cpu_graph: CpuGraph, + cpu_graphs: Vec<(String, CpuGraph)>, } impl State { fn new() -> (Self, Task) { ( - Self { - cpu_graph: Default::default(), - }, + Self::default(), Task::run( channel(1, async |mut sender| { let mut sys = sysinfo::System::new(); @@ -34,28 +34,58 @@ impl State { loop { sys.refresh_specifics(refreshes); Timer::after(sysinfo::MINIMUM_CPU_UPDATE_INTERVAL).await; - sender.send(sys.global_cpu_usage()).await.unwrap(); + sender.send(SysinfoSnapshot::from(&sys)).await.unwrap(); } }), - Message::Cpu, + Message::Info, ), ) } fn update(&mut self, message: Message) -> Task { match message { - Message::Cpu(value) => { - self.cpu_graph.update(value); - self.cpu_graph.cache.clear(); + Message::Info(snapshot) => { + self.total_cpu_graph.update(snapshot.cpu_total); + self.total_cpu_graph.cache.clear(); + + if self.cpu_graphs.len() != snapshot.cpus.len() { + self.cpu_graphs = snapshot + .cpus + .into_iter() + .map(|(name, usage)| (name, CpuGraph::new(usage))) + .collect(); + } else { + for ((_, graph), (_, usage)) in + self.cpu_graphs.iter_mut().zip(snapshot.cpus.into_iter()) + { + graph.update(usage); + graph.cache.clear(); + } + } } } Task::none() } fn view(&self) -> Element<'_, Message, Theme, Renderer> { - widget::Canvas::new(&self.cpu_graph) - .width(Length::Fill) - .height(Length::Fill) - .into() + widget::row([ + widget::Canvas::new(&self.total_cpu_graph) + .width(Length::Fill) + .height(Length::Fill) + .into(), + widget::grid(self.cpu_graphs.iter().map(|(name, graph)| { + widget::row([ + // widget::text(name).into(), + widget::Canvas::new(graph) + .width(Length::Fill) + .height(Length::Fill) + .into(), + ]) + .into() + })) + // .columns(8) + .into(), + ]) + .into() } } diff --git a/src/main.rs b/src/main.rs index 2e13470..fa3e73b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,5 @@ mod app; +mod sysinfo_snapshot; fn main() -> Result<(), impl std::error::Error> { app::run() diff --git a/src/sysinfo_snapshot.rs b/src/sysinfo_snapshot.rs new file mode 100644 index 0000000..2e6955c --- /dev/null +++ b/src/sysinfo_snapshot.rs @@ -0,0 +1,18 @@ +#[derive(Clone, Debug)] +pub struct SysinfoSnapshot { + pub cpu_total: f32, + pub cpus: Vec<(String, f32)>, +} + +impl From<&sysinfo::System> for SysinfoSnapshot { + fn from(value: &sysinfo::System) -> Self { + Self { + cpu_total: value.global_cpu_usage(), + cpus: value + .cpus() + .iter() + .map(|cpu| (cpu.name().into(), cpu.cpu_usage())) + .collect(), + } + } +} From 7264d127d939abab0af2c0622b046b0313654e78 Mon Sep 17 00:00:00 2001 From: electria Date: Sat, 15 Aug 2026 18:36:29 -0700 Subject: [PATCH 02/28] feat: improve style --- src/app/mod.rs | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/app/mod.rs b/src/app/mod.rs index d989b14..7f073f5 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -72,17 +72,13 @@ impl State { .width(Length::Fill) .height(Length::Fill) .into(), - widget::grid(self.cpu_graphs.iter().map(|(name, graph)| { - widget::row([ - // widget::text(name).into(), - widget::Canvas::new(graph) - .width(Length::Fill) - .height(Length::Fill) - .into(), - ]) - .into() - })) - // .columns(8) + widget::grid( + self.cpu_graphs + .iter() + .map(|(_name, graph)| widget::Canvas::new(graph).into()), + ) + .columns(2) + .height(Length::Fill) .into(), ]) .into() From 93de64f4b967b6b040987e3da2f484b99405ec26 Mon Sep 17 00:00:00 2001 From: electria Date: Sat, 15 Aug 2026 18:42:53 -0700 Subject: [PATCH 03/28] refactor: remove unused name attribute --- src/app/mod.rs | 9 ++++----- src/sysinfo_snapshot.rs | 8 ++------ 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/app/mod.rs b/src/app/mod.rs index 7f073f5..acc8959 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -15,7 +15,7 @@ enum Message { #[derive(Default)] struct State { total_cpu_graph: CpuGraph, - cpu_graphs: Vec<(String, CpuGraph)>, + cpu_graphs: Vec, } impl State { @@ -51,11 +51,10 @@ impl State { self.cpu_graphs = snapshot .cpus .into_iter() - .map(|(name, usage)| (name, CpuGraph::new(usage))) + .map(|usage| CpuGraph::new(usage)) .collect(); } else { - for ((_, graph), (_, usage)) in - self.cpu_graphs.iter_mut().zip(snapshot.cpus.into_iter()) + for (graph, usage) in self.cpu_graphs.iter_mut().zip(snapshot.cpus.into_iter()) { graph.update(usage); graph.cache.clear(); @@ -75,7 +74,7 @@ impl State { widget::grid( self.cpu_graphs .iter() - .map(|(_name, graph)| widget::Canvas::new(graph).into()), + .map(|graph| widget::Canvas::new(graph).into()), ) .columns(2) .height(Length::Fill) diff --git a/src/sysinfo_snapshot.rs b/src/sysinfo_snapshot.rs index 2e6955c..cb55f06 100644 --- a/src/sysinfo_snapshot.rs +++ b/src/sysinfo_snapshot.rs @@ -1,18 +1,14 @@ #[derive(Clone, Debug)] pub struct SysinfoSnapshot { pub cpu_total: f32, - pub cpus: Vec<(String, f32)>, + pub cpus: Vec, } impl From<&sysinfo::System> for SysinfoSnapshot { fn from(value: &sysinfo::System) -> Self { Self { cpu_total: value.global_cpu_usage(), - cpus: value - .cpus() - .iter() - .map(|cpu| (cpu.name().into(), cpu.cpu_usage())) - .collect(), + cpus: value.cpus().iter().map(|cpu| cpu.cpu_usage()).collect(), } } } From 96a972f9f0e2364e576010c314e135f388ca4d76 Mon Sep 17 00:00:00 2001 From: electria Date: Sat, 15 Aug 2026 18:48:45 -0700 Subject: [PATCH 04/28] refactor: generalize CpuGraph -> Graph --- src/app/{cpu_graph.rs => graph.rs} | 14 +++++++------- src/app/mod.rs | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) rename src/app/{cpu_graph.rs => graph.rs} (85%) diff --git a/src/app/cpu_graph.rs b/src/app/graph.rs similarity index 85% rename from src/app/cpu_graph.rs rename to src/app/graph.rs index 9fe439c..c16fe56 100644 --- a/src/app/cpu_graph.rs +++ b/src/app/graph.rs @@ -7,33 +7,33 @@ use crate::app; const CYAN: Color = Color::from_rgb8(0, 255, 255); #[derive(Default)] -pub struct CpuGraph { +pub struct Graph { timeline: VecDeque, pub cache: canvas::Cache, } -impl CpuGraph { - pub fn new(usage: f32) -> Self { +impl Graph { + pub fn new(value: f32) -> Self { Self { timeline: { let mut vec = VecDeque::new(); - vec.push_front(usage); + vec.push_front(value); vec }, ..Default::default() } } - pub fn update(&mut self, usage: f32) { - self.timeline.push_back(usage); + pub fn update(&mut self, value: f32) { + self.timeline.push_back(value); if self.timeline.len() > 1000 { self.timeline.pop_front(); } } } -impl canvas::Program for CpuGraph { +impl canvas::Program for Graph { type State = (); fn draw( &self, diff --git a/src/app/mod.rs b/src/app/mod.rs index acc8959..bcc6e52 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -4,9 +4,9 @@ use iced::{ }; use smol::Timer; -use crate::{app::cpu_graph::CpuGraph, sysinfo_snapshot::SysinfoSnapshot}; +use crate::{app::graph::Graph, sysinfo_snapshot::SysinfoSnapshot}; -mod cpu_graph; +mod graph; enum Message { Info(SysinfoSnapshot), @@ -14,8 +14,8 @@ enum Message { #[derive(Default)] struct State { - total_cpu_graph: CpuGraph, - cpu_graphs: Vec, + total_cpu_graph: Graph, + cpu_graphs: Vec, } impl State { @@ -51,12 +51,12 @@ impl State { self.cpu_graphs = snapshot .cpus .into_iter() - .map(|usage| CpuGraph::new(usage)) + .map(|value| Graph::new(value)) .collect(); } else { - for (graph, usage) in self.cpu_graphs.iter_mut().zip(snapshot.cpus.into_iter()) + for (graph, value) in self.cpu_graphs.iter_mut().zip(snapshot.cpus.into_iter()) { - graph.update(usage); + graph.update(value); graph.cache.clear(); } } From fa0284f1650ddd757994ea13ae0c7b77961d7ff2 Mon Sep 17 00:00:00 2001 From: electria Date: Sat, 15 Aug 2026 19:08:05 -0700 Subject: [PATCH 05/28] feat: half the history this should probably be dynamic (based on screen space).... somehow.... --- src/app/graph.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/graph.rs b/src/app/graph.rs index c16fe56..9ae9c10 100644 --- a/src/app/graph.rs +++ b/src/app/graph.rs @@ -27,7 +27,7 @@ impl Graph { pub fn update(&mut self, value: f32) { self.timeline.push_back(value); - if self.timeline.len() > 1000 { + if self.timeline.len() > 500 { self.timeline.pop_front(); } } From 9d0a6fdd07ed55b890d9d8575200f60735479cb5 Mon Sep 17 00:00:00 2001 From: electria Date: Sat, 15 Aug 2026 19:11:34 -0700 Subject: [PATCH 06/28] fix: graphs clipping into the bottom of the box this isn't the greatest solution, but it works as expected --- src/app/graph.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/graph.rs b/src/app/graph.rs index 9ae9c10..cdbd212 100644 --- a/src/app/graph.rs +++ b/src/app/graph.rs @@ -53,7 +53,7 @@ impl canvas::Program for Graph { &canvas::Path::new(|builder| { for (index, value) in self.timeline.iter().enumerate() { let x = index as f32 / self.timeline.len() as f32 * bounds.width; - let y = bounds.height - value / 100. * bounds.height; + let y = bounds.height - value / 100. * bounds.height - 1.; builder.line_to(Point::new(x, y)) } }), From 374cbd546d4dad6e29b537291f3f75644d342fd0 Mon Sep 17 00:00:00 2001 From: electria Date: Sat, 15 Aug 2026 19:22:31 -0700 Subject: [PATCH 07/28] refactor: qualify path slightly more consistently --- src/app/mod.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app/mod.rs b/src/app/mod.rs index bcc6e52..c4a0eb6 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -1,6 +1,6 @@ use iced::{ - Color, Element, Length, Renderer, Task, Theme, application, futures::SinkExt, stream::channel, - theme, widget, + Color, Element, Length, Renderer, Task, Theme, application, futures::SinkExt, stream, theme, + widget, }; use smol::Timer; @@ -23,7 +23,7 @@ impl State { ( Self::default(), Task::run( - channel(1, async |mut sender| { + stream::channel(1, async |mut sender| { let mut sys = sysinfo::System::new(); let refreshes = sysinfo::RefreshKind::nothing() .with_cpu(sysinfo::CpuRefreshKind::nothing().with_cpu_usage()); From d068d110e267be0b782139501c7fca22f8eb8da9 Mon Sep 17 00:00:00 2001 From: electria Date: Sun, 16 Aug 2026 08:41:53 -0700 Subject: [PATCH 08/28] feat: memory and swap graphs the values are in the SysinfoSnapshot verbatim, in case they might be displayed in another way (textually) --- src/app/mod.rs | 45 ++++++++++++++++++++++++++++++++--------- src/sysinfo_snapshot.rs | 10 +++++++++ 2 files changed, 45 insertions(+), 10 deletions(-) diff --git a/src/app/mod.rs b/src/app/mod.rs index c4a0eb6..c0d5ab8 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -16,6 +16,8 @@ enum Message { struct State { total_cpu_graph: Graph, cpu_graphs: Vec, + memory_graph: Graph, + swap_graph: Graph, } impl State { @@ -26,6 +28,7 @@ impl State { stream::channel(1, async |mut sender| { let mut sys = sysinfo::System::new(); let refreshes = sysinfo::RefreshKind::nothing() + .with_memory(sysinfo::MemoryRefreshKind::everything()) .with_cpu(sysinfo::CpuRefreshKind::nothing().with_cpu_usage()); sys.refresh_specifics(refreshes); @@ -47,6 +50,14 @@ impl State { self.total_cpu_graph.update(snapshot.cpu_total); self.total_cpu_graph.cache.clear(); + self.memory_graph + .update(snapshot.memory as f32 / snapshot.memory_total as f32 * 100.); + self.memory_graph.cache.clear(); + + self.swap_graph + .update(snapshot.swap as f32 / snapshot.swap_total as f32 * 100.); + self.swap_graph.cache.clear(); + if self.cpu_graphs.len() != snapshot.cpus.len() { self.cpu_graphs = snapshot .cpus @@ -66,18 +77,32 @@ impl State { Task::none() } fn view(&self) -> Element<'_, Message, Theme, Renderer> { - widget::row([ - widget::Canvas::new(&self.total_cpu_graph) - .width(Length::Fill) + widget::column([ + widget::row([ + widget::Canvas::new(&self.total_cpu_graph) + .width(Length::Fill) + .height(Length::Fill) + .into(), + widget::grid( + self.cpu_graphs + .iter() + .map(|graph| widget::Canvas::new(graph).into()), + ) + .columns(2) .height(Length::Fill) .into(), - widget::grid( - self.cpu_graphs - .iter() - .map(|graph| widget::Canvas::new(graph).into()), - ) - .columns(2) - .height(Length::Fill) + ]) + .into(), + widget::row([ + widget::canvas(&self.memory_graph) + .width(Length::Fill) + .height(Length::Fill) + .into(), + widget::canvas(&self.swap_graph) + .width(Length::Fill) + .height(Length::Fill) + .into(), + ]) .into(), ]) .into() diff --git a/src/sysinfo_snapshot.rs b/src/sysinfo_snapshot.rs index cb55f06..340a215 100644 --- a/src/sysinfo_snapshot.rs +++ b/src/sysinfo_snapshot.rs @@ -2,6 +2,11 @@ pub struct SysinfoSnapshot { pub cpu_total: f32, pub cpus: Vec, + + pub memory: u64, + pub memory_total: u64, + pub swap: u64, + pub swap_total: u64, } impl From<&sysinfo::System> for SysinfoSnapshot { @@ -9,6 +14,11 @@ impl From<&sysinfo::System> for SysinfoSnapshot { Self { cpu_total: value.global_cpu_usage(), cpus: value.cpus().iter().map(|cpu| cpu.cpu_usage()).collect(), + + memory: value.used_memory(), + memory_total: value.total_memory(), + swap: value.used_swap(), + swap_total: value.total_swap(), } } } From 8589c0c66637e2bda866a6a67e85fd784c65e246 Mon Sep 17 00:00:00 2001 From: electria Date: Sun, 16 Aug 2026 10:16:52 -0700 Subject: [PATCH 09/28] refactor: consistency in widget creation --- src/app/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/mod.rs b/src/app/mod.rs index c0d5ab8..600c93f 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -79,7 +79,7 @@ impl State { fn view(&self) -> Element<'_, Message, Theme, Renderer> { widget::column([ widget::row([ - widget::Canvas::new(&self.total_cpu_graph) + widget::canvas(&self.total_cpu_graph) .width(Length::Fill) .height(Length::Fill) .into(), From 865fecd694ba06dfb7074211cbdb2c57a91f2657 Mon Sep 17 00:00:00 2001 From: electria Date: Sun, 16 Aug 2026 10:18:24 -0700 Subject: [PATCH 10/28] refactor: clear cache in Graph::update --- src/app/graph.rs | 2 ++ src/app/mod.rs | 4 ---- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/app/graph.rs b/src/app/graph.rs index cdbd212..5b93a80 100644 --- a/src/app/graph.rs +++ b/src/app/graph.rs @@ -30,6 +30,8 @@ impl Graph { if self.timeline.len() > 500 { self.timeline.pop_front(); } + + self.cache.clear(); } } diff --git a/src/app/mod.rs b/src/app/mod.rs index 600c93f..68197fa 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -48,15 +48,12 @@ impl State { match message { Message::Info(snapshot) => { self.total_cpu_graph.update(snapshot.cpu_total); - self.total_cpu_graph.cache.clear(); self.memory_graph .update(snapshot.memory as f32 / snapshot.memory_total as f32 * 100.); - self.memory_graph.cache.clear(); self.swap_graph .update(snapshot.swap as f32 / snapshot.swap_total as f32 * 100.); - self.swap_graph.cache.clear(); if self.cpu_graphs.len() != snapshot.cpus.len() { self.cpu_graphs = snapshot @@ -68,7 +65,6 @@ impl State { for (graph, value) in self.cpu_graphs.iter_mut().zip(snapshot.cpus.into_iter()) { graph.update(value); - graph.cache.clear(); } } } From 79aff5185675a331ba48e32c566c7968d67d8ed4 Mon Sep 17 00:00:00 2001 From: electria Date: Sun, 16 Aug 2026 10:28:38 -0700 Subject: [PATCH 11/28] fix: send before sleeping should make the initial graph come in ~200ms faster, for free --- src/app/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/mod.rs b/src/app/mod.rs index 68197fa..260003e 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -36,8 +36,8 @@ impl State { loop { sys.refresh_specifics(refreshes); - Timer::after(sysinfo::MINIMUM_CPU_UPDATE_INTERVAL).await; sender.send(SysinfoSnapshot::from(&sys)).await.unwrap(); + Timer::after(sysinfo::MINIMUM_CPU_UPDATE_INTERVAL).await; } }), Message::Info, From 534b6cde9916c5827f74ea3b53929017cb6e967f Mon Sep 17 00:00:00 2001 From: electria Date: Sun, 16 Aug 2026 10:49:41 -0700 Subject: [PATCH 12/28] feat: add uptime to title it will be displayed somewhere else later, hopefully with better formatting too. --- src/app/mod.rs | 11 +++++++++++ src/sysinfo_snapshot.rs | 11 +++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/app/mod.rs b/src/app/mod.rs index 260003e..37d6376 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -1,3 +1,5 @@ +use std::time::Duration; + use iced::{ Color, Element, Length, Renderer, Task, Theme, application, futures::SinkExt, stream, theme, widget, @@ -14,6 +16,8 @@ enum Message { #[derive(Default)] struct State { + uptime: Duration, + total_cpu_graph: Graph, cpu_graphs: Vec, memory_graph: Graph, @@ -47,6 +51,8 @@ impl State { fn update(&mut self, message: Message) -> Task { match message { Message::Info(snapshot) => { + self.uptime = snapshot.uptime(); + self.total_cpu_graph.update(snapshot.cpu_total); self.memory_graph @@ -103,10 +109,15 @@ impl State { ]) .into() } + + fn title(&self) -> String { + format!("itop {:?}", self.uptime) + } } pub fn run() -> Result<(), impl std::error::Error> { application(State::new, State::update, State::view) + .title(State::title) .theme(theme::Theme::custom( "high-contrast-dark", theme::Palette { diff --git a/src/sysinfo_snapshot.rs b/src/sysinfo_snapshot.rs index 340a215..c4bee85 100644 --- a/src/sysinfo_snapshot.rs +++ b/src/sysinfo_snapshot.rs @@ -1,5 +1,9 @@ +use std::time::Duration; + #[derive(Clone, Debug)] pub struct SysinfoSnapshot { + uptime: u64, + pub cpu_total: f32, pub cpus: Vec, @@ -8,10 +12,17 @@ pub struct SysinfoSnapshot { pub swap: u64, pub swap_total: u64, } +impl SysinfoSnapshot { + pub fn uptime(&self) -> Duration { + Duration::from_secs(self.uptime) + } +} impl From<&sysinfo::System> for SysinfoSnapshot { fn from(value: &sysinfo::System) -> Self { Self { + uptime: sysinfo::System::uptime(), + cpu_total: value.global_cpu_usage(), cpus: value.cpus().iter().map(|cpu| cpu.cpu_usage()).collect(), From 171194e99f0168f6bbf6b2fe058763e2a3bd6584 Mon Sep 17 00:00:00 2001 From: electria Date: Sun, 16 Aug 2026 11:02:32 -0700 Subject: [PATCH 13/28] refactor: split info_stream into module in preparation to create a client-server model --- src/app/info_stream.rs | 28 ++++++++++++++++++++++++++++ src/app/mod.rs | 26 +++----------------------- 2 files changed, 31 insertions(+), 23 deletions(-) create mode 100644 src/app/info_stream.rs diff --git a/src/app/info_stream.rs b/src/app/info_stream.rs new file mode 100644 index 0000000..e7d7632 --- /dev/null +++ b/src/app/info_stream.rs @@ -0,0 +1,28 @@ +use iced::{ + futures::{self, SinkExt}, + stream, +}; +use smol::Timer; + +use crate::sysinfo_snapshot::SysinfoSnapshot; + +pub fn create() -> impl futures::Stream { + stream::channel( + 1, + async |mut sender: futures::channel::mpsc::Sender| { + let mut sys = sysinfo::System::new(); + let refreshes = sysinfo::RefreshKind::nothing() + .with_memory(sysinfo::MemoryRefreshKind::everything()) + .with_cpu(sysinfo::CpuRefreshKind::nothing().with_cpu_usage()); + + sys.refresh_specifics(refreshes); + Timer::after(sysinfo::MINIMUM_CPU_UPDATE_INTERVAL).await; + + loop { + sys.refresh_specifics(refreshes); + sender.send(SysinfoSnapshot::from(&sys)).await.unwrap(); + Timer::after(sysinfo::MINIMUM_CPU_UPDATE_INTERVAL).await; + } + }, + ) +} diff --git a/src/app/mod.rs b/src/app/mod.rs index 37d6376..427e90e 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -1,14 +1,11 @@ use std::time::Duration; -use iced::{ - Color, Element, Length, Renderer, Task, Theme, application, futures::SinkExt, stream, theme, - widget, -}; -use smol::Timer; +use iced::{Color, Element, Length, Renderer, Task, Theme, application, theme, widget}; use crate::{app::graph::Graph, sysinfo_snapshot::SysinfoSnapshot}; mod graph; +mod info_stream; enum Message { Info(SysinfoSnapshot), @@ -28,24 +25,7 @@ impl State { fn new() -> (Self, Task) { ( Self::default(), - Task::run( - stream::channel(1, async |mut sender| { - let mut sys = sysinfo::System::new(); - let refreshes = sysinfo::RefreshKind::nothing() - .with_memory(sysinfo::MemoryRefreshKind::everything()) - .with_cpu(sysinfo::CpuRefreshKind::nothing().with_cpu_usage()); - - sys.refresh_specifics(refreshes); - Timer::after(sysinfo::MINIMUM_CPU_UPDATE_INTERVAL).await; - - loop { - sys.refresh_specifics(refreshes); - sender.send(SysinfoSnapshot::from(&sys)).await.unwrap(); - Timer::after(sysinfo::MINIMUM_CPU_UPDATE_INTERVAL).await; - } - }), - Message::Info, - ), + Task::run(info_stream::create(), Message::Info), ) } fn update(&mut self, message: Message) -> Task { From a6893663248ce5f67c9a40ccb7f42865c6e20c46 Mon Sep 17 00:00:00 2001 From: electria Date: Sun, 16 Aug 2026 12:15:46 -0700 Subject: [PATCH 14/28] feat: client-server mode --- Cargo.lock | 25 ++++++++++++++ Cargo.toml | 2 ++ src/app/info_stream.rs | 73 ++++++++++++++++++++++++++++++----------- src/app/mod.rs | 9 ++--- src/main.rs | 13 ++++++-- src/server/mod.rs | 23 +++++++++++++ src/sysinfo_snapshot.rs | 2 +- 7 files changed, 119 insertions(+), 28 deletions(-) create mode 100644 src/server/mod.rs diff --git a/Cargo.lock b/Cargo.lock index b9c2f0d..d771ddf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -292,6 +292,9 @@ name = "bitflags" version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" +dependencies = [ + "serde_core", +] [[package]] name = "block" @@ -1380,6 +1383,8 @@ name = "itop" version = "0.1.0" dependencies = [ "iced", + "ron", + "serde", "smol", "sysinfo", ] @@ -2482,6 +2487,20 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" +[[package]] +name = "ron" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81116b9531d61eabc41aeb228e4b6b2435bcca3233b98cf3b3077d4e6e9debb3" +dependencies = [ + "bitflags 2.13.1", + "once_cell", + "serde", + "serde_derive", + "typeid", + "unicode-ident", +] + [[package]] name = "roxmltree" version = "0.20.0" @@ -3091,6 +3110,12 @@ dependencies = [ "core_maths", ] +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + [[package]] name = "uds_windows" version = "1.2.1" diff --git a/Cargo.toml b/Cargo.toml index 5a74d3e..3fbbfc9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,8 @@ version = "0.1.0" edition = "2024" [dependencies] +ron = "0.12.2" +serde = "1.0.229" smol = "2.0.2" sysinfo = "0.39.6" diff --git a/src/app/info_stream.rs b/src/app/info_stream.rs index e7d7632..ed21a87 100644 --- a/src/app/info_stream.rs +++ b/src/app/info_stream.rs @@ -1,28 +1,63 @@ +use std::env; + use iced::{ + Task, futures::{self, SinkExt}, stream, }; -use smol::Timer; +use ron::de; +use smol::{Timer, unblock}; -use crate::sysinfo_snapshot::SysinfoSnapshot; +use crate::{app, sysinfo_snapshot::SysinfoSnapshot}; -pub fn create() -> impl futures::Stream { - stream::channel( - 1, - async |mut sender: futures::channel::mpsc::Sender| { - let mut sys = sysinfo::System::new(); - let refreshes = sysinfo::RefreshKind::nothing() - .with_memory(sysinfo::MemoryRefreshKind::everything()) - .with_cpu(sysinfo::CpuRefreshKind::nothing().with_cpu_usage()); +pub fn create() -> Task { + if env::args() + .nth(1) + .is_some_and(|command| command == "client") + { + Task::run( + stream::channel( + 1, + async |mut sender: futures::channel::mpsc::Sender| { + let mut buf = String::new(); + loop { + buf = unblock(move || { + std::io::stdin().read_line(&mut buf).unwrap(); + buf + }) + .await; - sys.refresh_specifics(refreshes); - Timer::after(sysinfo::MINIMUM_CPU_UPDATE_INTERVAL).await; + match de::from_str(&buf) { + Ok(info) => sender.send(info).await.unwrap(), + Err(e) => eprintln!("{e}"), + } + buf.clear(); + } + }, + ), + app::Message::Info, + ) + } else { + Task::run( + stream::channel( + 1, + async |mut sender: futures::channel::mpsc::Sender| { + let mut sys = sysinfo::System::new(); + let refreshes = sysinfo::RefreshKind::nothing() + .with_memory(sysinfo::MemoryRefreshKind::everything()) + .with_cpu(sysinfo::CpuRefreshKind::nothing().with_cpu_usage()); - loop { - sys.refresh_specifics(refreshes); - sender.send(SysinfoSnapshot::from(&sys)).await.unwrap(); - Timer::after(sysinfo::MINIMUM_CPU_UPDATE_INTERVAL).await; - } - }, - ) + sys.refresh_specifics(refreshes); + Timer::after(sysinfo::MINIMUM_CPU_UPDATE_INTERVAL).await; + + loop { + sys.refresh_specifics(refreshes); + sender.send(SysinfoSnapshot::from(&sys)).await.unwrap(); + Timer::after(sysinfo::MINIMUM_CPU_UPDATE_INTERVAL).await; + } + }, + ), + app::Message::Info, + ) + } } diff --git a/src/app/mod.rs b/src/app/mod.rs index 427e90e..0f038bd 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -1,6 +1,6 @@ use std::time::Duration; -use iced::{Color, Element, Length, Renderer, Task, Theme, application, theme, widget}; +use iced::{Color, Element, Error, Length, Renderer, Task, Theme, application, theme, widget}; use crate::{app::graph::Graph, sysinfo_snapshot::SysinfoSnapshot}; @@ -23,10 +23,7 @@ struct State { impl State { fn new() -> (Self, Task) { - ( - Self::default(), - Task::run(info_stream::create(), Message::Info), - ) + (Self::default(), info_stream::create()) } fn update(&mut self, message: Message) -> Task { match message { @@ -95,7 +92,7 @@ impl State { } } -pub fn run() -> Result<(), impl std::error::Error> { +pub fn run() -> Result<(), Error> { application(State::new, State::update, State::view) .title(State::title) .theme(theme::Theme::custom( diff --git a/src/main.rs b/src/main.rs index fa3e73b..c6dcb49 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,15 @@ +use std::env; + mod app; +mod server; mod sysinfo_snapshot; -fn main() -> Result<(), impl std::error::Error> { - app::run() +fn main() { + match env::args().nth(1).as_deref() { + Some("server") => server::run().unwrap(), + + None | Some("client") => app::run().unwrap(), + + Some(s) => panic!("invalid argument: {s}"), + } } diff --git a/src/server/mod.rs b/src/server/mod.rs new file mode 100644 index 0000000..445f393 --- /dev/null +++ b/src/server/mod.rs @@ -0,0 +1,23 @@ +use std::{io::Write, thread}; + +use ron::{Error, ser}; + +use crate::sysinfo_snapshot::SysinfoSnapshot; + +pub fn run() -> Result<(), Error> { + let mut sys = sysinfo::System::new(); + let refreshes = sysinfo::RefreshKind::nothing() + .with_memory(sysinfo::MemoryRefreshKind::everything()) + .with_cpu(sysinfo::CpuRefreshKind::nothing().with_cpu_usage()); + + sys.refresh_specifics(refreshes); + thread::sleep(sysinfo::MINIMUM_CPU_UPDATE_INTERVAL); + + let mut stdout = std::io::stdout(); + + loop { + sys.refresh_specifics(refreshes); + stdout.write_all((ser::to_string(&SysinfoSnapshot::from(&sys))? + "\n").as_bytes())?; + thread::sleep(sysinfo::MINIMUM_CPU_UPDATE_INTERVAL); + } +} diff --git a/src/sysinfo_snapshot.rs b/src/sysinfo_snapshot.rs index c4bee85..6189cdb 100644 --- a/src/sysinfo_snapshot.rs +++ b/src/sysinfo_snapshot.rs @@ -1,6 +1,6 @@ use std::time::Duration; -#[derive(Clone, Debug)] +#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] pub struct SysinfoSnapshot { uptime: u64, From e310ca570b0aeab24f8836aa6cf6c444b1016c5e Mon Sep 17 00:00:00 2001 From: electria Date: Sun, 16 Aug 2026 13:56:18 -0700 Subject: [PATCH 15/28] feat: keybinds for toggling displays --- src/app/mod.rs | 103 +++++++++++++++++++++++++++++++++++------------ src/app/utils.rs | 14 +++++++ src/main.rs | 1 + src/utils.rs | 9 +++++ 4 files changed, 101 insertions(+), 26 deletions(-) create mode 100644 src/app/utils.rs create mode 100644 src/utils.rs diff --git a/src/app/mod.rs b/src/app/mod.rs index 0f038bd..ce3a1d0 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -1,13 +1,28 @@ use std::time::Duration; -use iced::{Color, Element, Error, Length, Renderer, Task, Theme, application, theme, widget}; +use iced::{ + Color, Error, Event, Length, Renderer, Subscription, Task, Theme, application, event, + keyboard::{self, Key}, + theme, widget, +}; -use crate::{app::graph::Graph, sysinfo_snapshot::SysinfoSnapshot}; +use crate::{ + app::{graph::Graph, utils::maybe_widget}, + sysinfo_snapshot::SysinfoSnapshot, + utils::Toggle, +}; mod graph; mod info_stream; +mod utils; + +type Element<'a> = iced::Element<'a, Message, Theme, Renderer>; enum Message { + ToggleMain, + ToggleCpu, + ToggleMemory, + Info(SysinfoSnapshot), } @@ -15,18 +30,33 @@ enum Message { struct State { uptime: Duration, + is_main_section_shown: bool, total_cpu_graph: Graph, + + is_cpu_section_shown: bool, cpu_graphs: Vec, + + is_memory_section_shown: bool, memory_graph: Graph, swap_graph: Graph, } impl State { fn new() -> (Self, Task) { - (Self::default(), info_stream::create()) + ( + Self { + is_main_section_shown: true, + ..Default::default() + }, + info_stream::create(), + ) } fn update(&mut self, message: Message) -> Task { match message { + Message::ToggleMain => self.is_main_section_shown.toggle(), + Message::ToggleCpu => self.is_cpu_section_shown.toggle(), + Message::ToggleMemory => self.is_memory_section_shown.toggle(), + Message::Info(snapshot) => { self.uptime = snapshot.uptime(); @@ -55,38 +85,58 @@ impl State { Task::none() } - fn view(&self) -> Element<'_, Message, Theme, Renderer> { + fn view(&self) -> Element<'_> { widget::column([ widget::row([ - widget::canvas(&self.total_cpu_graph) - .width(Length::Fill) + maybe_widget(self.is_main_section_shown, || { + widget::canvas(&self.total_cpu_graph) + .width(Length::Fill) + .height(Length::Fill) + .into() + }), + maybe_widget(self.is_cpu_section_shown, || { + widget::grid( + self.cpu_graphs + .iter() + .map(|graph| widget::Canvas::new(graph).into()), + ) + .columns(2) .height(Length::Fill) - .into(), - widget::grid( - self.cpu_graphs - .iter() - .map(|graph| widget::Canvas::new(graph).into()), - ) - .columns(2) - .height(Length::Fill) - .into(), - ]) - .into(), - widget::row([ - widget::canvas(&self.memory_graph) - .width(Length::Fill) - .height(Length::Fill) - .into(), - widget::canvas(&self.swap_graph) - .width(Length::Fill) - .height(Length::Fill) - .into(), + .into() + }), ]) .into(), + maybe_widget(self.is_memory_section_shown, || { + widget::row([ + widget::canvas(&self.memory_graph) + .width(Length::Fill) + .height(Length::Fill) + .into(), + widget::canvas(&self.swap_graph) + .width(Length::Fill) + .height(Length::Fill) + .into(), + ]) + .into() + }), ]) .into() } + fn subscription(&self) -> Subscription { + event::listen().filter_map(|event| match event { + Event::Keyboard(keyboard::Event::KeyPressed { key, modifiers, .. }) => { + match key.as_ref() { + Key::Character("m" | "1") if modifiers.shift() => Some(Message::ToggleMain), + Key::Character("c" | "2") => Some(Message::ToggleCpu), + Key::Character("m" | "3") => Some(Message::ToggleMemory), + _ => None, + } + } + _ => None, + }) + } + fn title(&self) -> String { format!("itop {:?}", self.uptime) } @@ -94,6 +144,7 @@ impl State { pub fn run() -> Result<(), Error> { application(State::new, State::update, State::view) + .subscription(State::subscription) .title(State::title) .theme(theme::Theme::custom( "high-contrast-dark", diff --git a/src/app/utils.rs b/src/app/utils.rs new file mode 100644 index 0000000..ceef158 --- /dev/null +++ b/src/app/utils.rs @@ -0,0 +1,14 @@ +use iced::widget; + +use crate::app; + +pub fn maybe_widget<'a>( + condition: bool, + widget: impl FnOnce() -> app::Element<'a>, +) -> app::Element<'a> { + if condition { + widget() + } else { + widget::space().into() + } +} diff --git a/src/main.rs b/src/main.rs index c6dcb49..d8e6e6e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,6 +3,7 @@ use std::env; mod app; mod server; mod sysinfo_snapshot; +mod utils; fn main() { match env::args().nth(1).as_deref() { diff --git a/src/utils.rs b/src/utils.rs new file mode 100644 index 0000000..3556bf9 --- /dev/null +++ b/src/utils.rs @@ -0,0 +1,9 @@ +pub trait Toggle { + fn toggle(&mut self); +} + +impl Toggle for bool { + fn toggle(&mut self) { + *self = !*self + } +} From 1546c67fa394533d876236e8af7e0cadc5a08b73 Mon Sep 17 00:00:00 2001 From: electria Date: Sun, 16 Aug 2026 14:13:41 -0700 Subject: [PATCH 16/28] feat: add server-only build it's drastically faster to build, mostly due to only including 1/10th of the dependencies --- Cargo.toml | 15 +++++++++++++-- flake.nix | 6 ++++++ src/main.rs | 7 +++++-- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 3fbbfc9..00abd23 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,12 +5,23 @@ license = "AGPL-3.0-or-later" version = "0.1.0" edition = "2024" +[features] +default = [ "app" ] +app = [ "dep:iced", "dep:smol" ] + [dependencies] ron = "0.12.2" -serde = "1.0.229" -smol = "2.0.2" sysinfo = "0.39.6" [dependencies.iced] version = "0.14.0" features = [ "canvas", "smol" ] +optional = true + +[dependencies.smol] +version = "2.0.2" +optional = true + +[dependencies.serde] +version = "1.0.229" +features = [ "derive" ] diff --git a/flake.nix b/flake.nix index 827d996..d37cbd5 100644 --- a/flake.nix +++ b/flake.nix @@ -89,6 +89,12 @@ { packages.default = crate; + packages.server-only = craneLib.buildPackage { + name = name + "-server-only"; + src = ./.; + cargoExtraArgs = "--no-default-features"; + }; + checks = { crate-clippy = craneLib.cargoClippy ( commonArgs diff --git a/src/main.rs b/src/main.rs index d8e6e6e..327e179 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,6 @@ use std::env; +#[cfg(feature = "app")] mod app; mod server; mod sysinfo_snapshot; @@ -7,10 +8,12 @@ mod utils; fn main() { match env::args().nth(1).as_deref() { - Some("server") => server::run().unwrap(), - + #[cfg(feature = "app")] None | Some("client") => app::run().unwrap(), + #[cfg_attr(feature = "app", allow(unreachable_patterns))] + None | Some("server") => server::run().unwrap(), + Some(s) => panic!("invalid argument: {s}"), } } From c39d48fd07302723f0e44b16bc35d58f02177075 Mon Sep 17 00:00:00 2001 From: electria Date: Sun, 16 Aug 2026 14:39:50 -0700 Subject: [PATCH 17/28] fix: don't require shift for number toggles --- src/app/mod.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app/mod.rs b/src/app/mod.rs index ce3a1d0..34d2e37 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -125,9 +125,9 @@ impl State { fn subscription(&self) -> Subscription { event::listen().filter_map(|event| match event { - Event::Keyboard(keyboard::Event::KeyPressed { key, modifiers, .. }) => { - match key.as_ref() { - Key::Character("m" | "1") if modifiers.shift() => Some(Message::ToggleMain), + Event::Keyboard(keyboard::Event::KeyPressed { modified_key, .. }) => { + match modified_key.as_ref() { + Key::Character("M" | "1") => Some(Message::ToggleMain), Key::Character("c" | "2") => Some(Message::ToggleCpu), Key::Character("m" | "3") => Some(Message::ToggleMemory), _ => None, From d1fb0ca78a2af63e246b84fd1beec8570327576c Mon Sep 17 00:00:00 2001 From: electria Date: Sun, 16 Aug 2026 18:39:25 -0700 Subject: [PATCH 18/28] refactor: replace for with for_each --- src/app/mod.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/app/mod.rs b/src/app/mod.rs index 34d2e37..57aec5d 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -75,10 +75,10 @@ impl State { .map(|value| Graph::new(value)) .collect(); } else { - for (graph, value) in self.cpu_graphs.iter_mut().zip(snapshot.cpus.into_iter()) - { - graph.update(value); - } + self.cpu_graphs + .iter_mut() + .zip(snapshot.cpus.into_iter()) + .for_each(|(graph, value)| graph.update(value)); } } } From d3f94b4acccbdb1c3db67610f032473dcd4c2b30 Mon Sep 17 00:00:00 2001 From: electria Date: Sun, 16 Aug 2026 20:34:21 -0700 Subject: [PATCH 19/28] fix: improve anti-clipping for graphs --- src/app/graph.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/app/graph.rs b/src/app/graph.rs index 5b93a80..f370cfa 100644 --- a/src/app/graph.rs +++ b/src/app/graph.rs @@ -55,7 +55,8 @@ impl canvas::Program for Graph { &canvas::Path::new(|builder| { for (index, value) in self.timeline.iter().enumerate() { let x = index as f32 / self.timeline.len() as f32 * bounds.width; - let y = bounds.height - value / 100. * bounds.height - 1.; + let y = (bounds.height - value / 100. * bounds.height) + .clamp(1., bounds.height - 1.); builder.line_to(Point::new(x, y)) } }), From cb2461b64f748c07f8e1cfd7538c8694914c8ed4 Mon Sep 17 00:00:00 2001 From: electria Date: Sun, 16 Aug 2026 21:02:56 -0700 Subject: [PATCH 20/28] feat: hide borders when only main graph is shown --- src/app/graph.rs | 24 ++++++++++++++++++------ src/app/mod.rs | 20 +++++++++++++++++--- 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/src/app/graph.rs b/src/app/graph.rs index f370cfa..5dea431 100644 --- a/src/app/graph.rs +++ b/src/app/graph.rs @@ -6,12 +6,22 @@ use crate::app; const CYAN: Color = Color::from_rgb8(0, 255, 255); -#[derive(Default)] pub struct Graph { timeline: VecDeque, + pub show_borders: bool, pub cache: canvas::Cache, } +impl Default for Graph { + fn default() -> Self { + Self { + show_borders: true, + + timeline: Default::default(), + cache: Default::default(), + } + } +} impl Graph { pub fn new(value: f32) -> Self { @@ -46,11 +56,13 @@ impl canvas::Program for Graph { _cursor: mouse::Cursor, ) -> Vec> { let geometry = self.cache.draw(renderer, bounds.size(), |frame| { - frame.stroke_rectangle( - Point::new(0., 0.), - bounds.size(), - canvas::Stroke::default().with_color(Color::from_rgb8(255, 0, 0)), - ); + if self.show_borders { + frame.stroke_rectangle( + Point::new(0., 0.), + bounds.size(), + canvas::Stroke::default().with_color(Color::from_rgb8(255, 0, 0)), + ); + } frame.stroke( &canvas::Path::new(|builder| { for (index, value) in self.timeline.iter().enumerate() { diff --git a/src/app/mod.rs b/src/app/mod.rs index 57aec5d..c46d289 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -53,9 +53,18 @@ impl State { } fn update(&mut self, message: Message) -> Task { match message { - Message::ToggleMain => self.is_main_section_shown.toggle(), - Message::ToggleCpu => self.is_cpu_section_shown.toggle(), - Message::ToggleMemory => self.is_memory_section_shown.toggle(), + Message::ToggleMain => { + self.is_main_section_shown.toggle(); + self.check_borders(); + } + Message::ToggleCpu => { + self.is_cpu_section_shown.toggle(); + self.check_borders(); + } + Message::ToggleMemory => { + self.is_memory_section_shown.toggle(); + self.check_borders(); + } Message::Info(snapshot) => { self.uptime = snapshot.uptime(); @@ -140,6 +149,11 @@ impl State { fn title(&self) -> String { format!("itop {:?}", self.uptime) } + + fn check_borders(&mut self) { + self.total_cpu_graph.show_borders = + self.is_cpu_section_shown || self.is_memory_section_shown; + } } pub fn run() -> Result<(), Error> { From 5acc09b471988f0b90613ac89e282c67a9a15086 Mon Sep 17 00:00:00 2001 From: electria Date: Sun, 16 Aug 2026 21:10:44 -0700 Subject: [PATCH 21/28] build: improve server-only derivation --- flake.nix | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/flake.nix b/flake.nix index d37cbd5..a7a47ea 100644 --- a/flake.nix +++ b/flake.nix @@ -89,10 +89,11 @@ { packages.default = crate; - packages.server-only = craneLib.buildPackage { - name = name + "-server-only"; + packages."${name}-server-only" = craneLib.buildPackage { + name = "${name}-server-only"; src = ./.; - cargoExtraArgs = "--no-default-features"; + doCheck = false; + cargoExtraArgs = "--locked --no-default-features"; }; checks = { From 86f7fc12b4cfe0832851f6a0e6594fa44610ad73 Mon Sep 17 00:00:00 2001 From: electria Date: Sun, 16 Aug 2026 21:15:59 -0700 Subject: [PATCH 22/28] build: remove nonexistent icon --- flake.nix | 1 - 1 file changed, 1 deletion(-) diff --git a/flake.nix b/flake.nix index a7a47ea..1a338f0 100644 --- a/flake.nix +++ b/flake.nix @@ -58,7 +58,6 @@ desktopItem = pkgs.makeDesktopItem { inherit name; desktopName = name; - icon = name; exec = name; }; in From a894a02e66117731b5ed691517564374821e3acf Mon Sep 17 00:00:00 2001 From: electria Date: Mon, 17 Aug 2026 15:07:18 -0700 Subject: [PATCH 23/28] fix: borders showing on launch --- src/app/mod.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/app/mod.rs b/src/app/mod.rs index c46d289..8725669 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -43,13 +43,13 @@ struct State { impl State { fn new() -> (Self, Task) { - ( - Self { - is_main_section_shown: true, - ..Default::default() - }, - info_stream::create(), - ) + let mut state = Self { + is_main_section_shown: true, + ..Default::default() + }; + state.total_cpu_graph.show_borders = false; + + (state, info_stream::create()) } fn update(&mut self, message: Message) -> Task { match message { From afa6104c28d25caf3808424d4cae6b3031ab2d2e Mon Sep 17 00:00:00 2001 From: electria Date: Mon, 17 Aug 2026 15:11:18 -0700 Subject: [PATCH 24/28] build: fix dead_code warnings without "app" feature --- src/sysinfo_snapshot.rs | 1 + src/utils.rs | 1 + 2 files changed, 2 insertions(+) diff --git a/src/sysinfo_snapshot.rs b/src/sysinfo_snapshot.rs index 6189cdb..917b2f6 100644 --- a/src/sysinfo_snapshot.rs +++ b/src/sysinfo_snapshot.rs @@ -13,6 +13,7 @@ pub struct SysinfoSnapshot { pub swap_total: u64, } impl SysinfoSnapshot { + #[cfg_attr(not(feature = "app"), allow(dead_code))] pub fn uptime(&self) -> Duration { Duration::from_secs(self.uptime) } diff --git a/src/utils.rs b/src/utils.rs index 3556bf9..622bff1 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,3 +1,4 @@ +#[cfg_attr(not(feature = "app"), allow(dead_code))] pub trait Toggle { fn toggle(&mut self); } From b20158820b243af5c929efd913e460956c1aed1a Mon Sep 17 00:00:00 2001 From: electria Date: Tue, 18 Aug 2026 14:05:36 -0700 Subject: [PATCH 25/28] feat: process list this is unnacceptably unperformant; I think I've reached the point at which sysinfo doesn't do what I want, which is keep track of a table of processes efficiently enough. --- src/app/info_stream.rs | 9 +++--- src/app/mod.rs | 61 +++++++++++++++++++++++++++++++---------- src/server/mod.rs | 6 ++-- src/sysinfo_snapshot.rs | 51 ++++++++++++++++++++++++++++++++++ 4 files changed, 105 insertions(+), 22 deletions(-) diff --git a/src/app/info_stream.rs b/src/app/info_stream.rs index ed21a87..787e459 100644 --- a/src/app/info_stream.rs +++ b/src/app/info_stream.rs @@ -8,7 +8,10 @@ use iced::{ use ron::de; use smol::{Timer, unblock}; -use crate::{app, sysinfo_snapshot::SysinfoSnapshot}; +use crate::{ + app, + sysinfo_snapshot::{self, SysinfoSnapshot}, +}; pub fn create() -> Task { if env::args() @@ -43,9 +46,7 @@ pub fn create() -> Task { 1, async |mut sender: futures::channel::mpsc::Sender| { let mut sys = sysinfo::System::new(); - let refreshes = sysinfo::RefreshKind::nothing() - .with_memory(sysinfo::MemoryRefreshKind::everything()) - .with_cpu(sysinfo::CpuRefreshKind::nothing().with_cpu_usage()); + let refreshes = sysinfo_snapshot::refreshes(); sys.refresh_specifics(refreshes); Timer::after(sysinfo::MINIMUM_CPU_UPDATE_INTERVAL).await; diff --git a/src/app/mod.rs b/src/app/mod.rs index 8725669..c636868 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -8,7 +8,7 @@ use iced::{ use crate::{ app::{graph::Graph, utils::maybe_widget}, - sysinfo_snapshot::SysinfoSnapshot, + sysinfo_snapshot::{ProcessSnapshot, SysinfoSnapshot}, utils::Toggle, }; @@ -22,6 +22,7 @@ enum Message { ToggleMain, ToggleCpu, ToggleMemory, + ToggleProcesses, Info(SysinfoSnapshot), } @@ -39,6 +40,9 @@ struct State { is_memory_section_shown: bool, memory_graph: Graph, swap_graph: Graph, + + is_processes_section_shown: bool, + processes: Vec, } impl State { @@ -65,6 +69,10 @@ impl State { self.is_memory_section_shown.toggle(); self.check_borders(); } + Message::ToggleProcesses => { + self.is_processes_section_shown.toggle(); + self.check_borders(); + } Message::Info(snapshot) => { self.uptime = snapshot.uptime(); @@ -89,6 +97,10 @@ impl State { .zip(snapshot.cpus.into_iter()) .for_each(|(graph, value)| graph.update(value)); } + + self.processes = snapshot.processes; + self.processes + .sort_by(|a, b| b.cpu_usage.total_cmp(&a.cpu_usage)); } } @@ -115,19 +127,39 @@ impl State { }), ]) .into(), - maybe_widget(self.is_memory_section_shown, || { - widget::row([ - widget::canvas(&self.memory_graph) - .width(Length::Fill) - .height(Length::Fill) - .into(), - widget::canvas(&self.swap_graph) - .width(Length::Fill) - .height(Length::Fill) - .into(), - ]) - .into() - }), + widget::row([ + maybe_widget(self.is_memory_section_shown, || { + widget::row([ + widget::canvas(&self.memory_graph) + .width(Length::Fill) + .height(Length::Fill) + .into(), + widget::canvas(&self.swap_graph) + .width(Length::Fill) + .height(Length::Fill) + .into(), + ]) + .into() + }), + maybe_widget(self.is_processes_section_shown, || { + widget::scrollable( + widget::grid(self.processes.iter().flat_map(|process| { + [ + widget::text(&process.name).into(), + widget::text(process.cpu_usage).into(), + widget::text(format!("{:?}", process.cpu_time())).into(), + widget::text(process.pid).into(), + ] + })) + .height(Length::Shrink) + .columns(4), + ) + .width(Length::Fill) + .height(Length::Fill) + .into() + }), + ]) + .into(), ]) .into() } @@ -139,6 +171,7 @@ impl State { Key::Character("M" | "1") => Some(Message::ToggleMain), Key::Character("c" | "2") => Some(Message::ToggleCpu), Key::Character("m" | "3") => Some(Message::ToggleMemory), + Key::Character("p" | "4") => Some(Message::ToggleProcesses), _ => None, } } diff --git a/src/server/mod.rs b/src/server/mod.rs index 445f393..5777c84 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -2,13 +2,11 @@ use std::{io::Write, thread}; use ron::{Error, ser}; -use crate::sysinfo_snapshot::SysinfoSnapshot; +use crate::sysinfo_snapshot::{self, SysinfoSnapshot}; pub fn run() -> Result<(), Error> { let mut sys = sysinfo::System::new(); - let refreshes = sysinfo::RefreshKind::nothing() - .with_memory(sysinfo::MemoryRefreshKind::everything()) - .with_cpu(sysinfo::CpuRefreshKind::nothing().with_cpu_usage()); + let refreshes = sysinfo_snapshot::refreshes(); sys.refresh_specifics(refreshes); thread::sleep(sysinfo::MINIMUM_CPU_UPDATE_INTERVAL); diff --git a/src/sysinfo_snapshot.rs b/src/sysinfo_snapshot.rs index 917b2f6..ef0f36e 100644 --- a/src/sysinfo_snapshot.rs +++ b/src/sysinfo_snapshot.rs @@ -1,7 +1,20 @@ use std::time::Duration; +pub fn refreshes() -> sysinfo::RefreshKind { + sysinfo::RefreshKind::nothing() + .with_memory(sysinfo::MemoryRefreshKind::everything()) + .with_cpu(sysinfo::CpuRefreshKind::nothing().with_cpu_usage()) + .with_processes( + sysinfo::ProcessRefreshKind::nothing() + .with_cpu() + .with_cmd(sysinfo::UpdateKind::OnlyIfNotSet) + .with_exe(sysinfo::UpdateKind::OnlyIfNotSet), + ) +} + #[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] pub struct SysinfoSnapshot { + /// in seconds uptime: u64, pub cpu_total: f32, @@ -11,6 +24,8 @@ pub struct SysinfoSnapshot { pub memory_total: u64, pub swap: u64, pub swap_total: u64, + + pub processes: Vec, } impl SysinfoSnapshot { #[cfg_attr(not(feature = "app"), allow(dead_code))] @@ -31,6 +46,42 @@ impl From<&sysinfo::System> for SysinfoSnapshot { memory_total: value.total_memory(), swap: value.used_swap(), swap_total: value.total_swap(), + + processes: value + .processes() + .iter() + .map(|(_pid, process)| ProcessSnapshot::from(process)) + .collect(), + } + } +} + +#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] +pub struct ProcessSnapshot { + pub pid: usize, + + /// in CPU-milliseconds + accumulated_cpu_time: u64, + + /// note: it's by core, and can be up to eg 1600 on a 16-core device + pub cpu_usage: f32, + + pub name: String, +} +impl ProcessSnapshot { + pub fn cpu_time(&self) -> Duration { + Duration::from_millis(self.accumulated_cpu_time) + } +} + +impl From<&sysinfo::Process> for ProcessSnapshot { + fn from(value: &sysinfo::Process) -> Self { + Self { + pid: value.pid().into(), + accumulated_cpu_time: value.accumulated_cpu_time(), + cpu_usage: value.cpu_usage(), + + name: value.name().to_string_lossy().into_owned(), } } } From 3fa2163366babea674c327949407c5a59ab9c52d Mon Sep 17 00:00:00 2001 From: electria Date: Tue, 18 Aug 2026 14:15:18 -0700 Subject: [PATCH 26/28] refactor: converge naming from main branch --- src/app/{cpu_graph.rs => graph.rs} | 10 +++++----- src/app/mod.rs | 12 ++++++------ 2 files changed, 11 insertions(+), 11 deletions(-) rename src/app/{cpu_graph.rs => graph.rs} (86%) diff --git a/src/app/cpu_graph.rs b/src/app/graph.rs similarity index 86% rename from src/app/cpu_graph.rs rename to src/app/graph.rs index 42a4a22..8a3796a 100644 --- a/src/app/cpu_graph.rs +++ b/src/app/graph.rs @@ -7,21 +7,21 @@ use crate::app; const CYAN: Color = Color::from_rgb8(0, 255, 255); #[derive(Default)] -pub struct CpuGraph { +pub struct Graph { pub cache: canvas::Cache, timeline: VecDeque, } -impl CpuGraph { - pub fn update(&mut self, usage: f32) { - self.timeline.push_back(usage); +impl Graph { + pub fn update(&mut self, value: f32) { + self.timeline.push_back(value); if self.timeline.len() > 1000 { self.timeline.pop_front(); } } } -impl canvas::Program for CpuGraph { +impl canvas::Program for Graph { type State = (); fn draw( &self, diff --git a/src/app/mod.rs b/src/app/mod.rs index 1e0262a..f48d29a 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -1,19 +1,19 @@ use iced::{ - Color, Element, Length, Renderer, Task, Theme, application, futures::SinkExt, stream::channel, - theme, widget, + Color, Element, Length, Renderer, Task, Theme, application, futures::SinkExt, stream, theme, + widget, }; use smol::Timer; -use crate::app::cpu_graph::CpuGraph; +use crate::app::graph::Graph; -mod cpu_graph; +mod graph; enum Message { Cpu(f32), } struct State { - cpu_graph: CpuGraph, + cpu_graph: Graph, } impl State { @@ -23,7 +23,7 @@ impl State { cpu_graph: Default::default(), }, Task::run( - channel(1, async |mut sender| { + stream::channel(1, async |mut sender| { let mut sys = sysinfo::System::new(); let refreshes = sysinfo::RefreshKind::nothing() .with_cpu(sysinfo::CpuRefreshKind::nothing().with_cpu_usage()); From ba96aa4d6bf1cf6988a1d30be23fd321199f7871 Mon Sep 17 00:00:00 2001 From: electria Date: Fri, 25 Sep 2026 11:19:11 -0700 Subject: [PATCH 27/28] feat: reduce parrelization, maximize LTO this reduces the binary size from 22MB to 15MB (via `nix build`, as reported by `eza`) --- Cargo.toml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index 5a74d3e..58f4091 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,3 +12,7 @@ sysinfo = "0.39.6" [dependencies.iced] version = "0.14.0" features = [ "canvas", "smol" ] + +[profile.release] +lto = true +codegen-units = 1 From c1d46a4be0b445d76e8114191bf0a874d3851a13 Mon Sep 17 00:00:00 2001 From: electria Date: Wed, 7 Oct 2026 20:35:52 -0700 Subject: [PATCH 28/28] build: update deps --- Cargo.lock | 574 +++++++++++++++++++++++++++-------------------------- flake.lock | 23 +-- flake.nix | 2 +- 3 files changed, 303 insertions(+), 296 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b9c2f0d..6289cf5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -38,7 +38,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f2a1bb052857d5dd49572219344a7332b31b76405648eabac5bc68978251bcd" dependencies = [ "android-properties", - "bitflags 2.13.1", + "bitflags 2.13.2", "cc", "jni", "libc", @@ -47,7 +47,7 @@ dependencies = [ "ndk-context", "ndk-sys", "num_enum", - "thiserror 2.0.19", + "thiserror 2.0.21", ] [[package]] @@ -67,9 +67,9 @@ checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" [[package]] name = "android_system_properties" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +checksum = "ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc" dependencies = [ "libc", ] @@ -163,7 +163,7 @@ dependencies = [ "futures-lite", "parking", "polling", - "rustix 1.1.4", + "rustix 1.1.5", "slab", "windows-sys 0.61.2", ] @@ -205,18 +205,18 @@ dependencies = [ "cfg-if", "event-listener", "futures-lite", - "rustix 1.1.4", + "rustix 1.1.5", ] [[package]] name = "async-recursion" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +checksum = "4f8abc12baad266b1c8cec146854c195b5864b4221d4b2ca7296a7ae82d9e451" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.6", ] [[package]] @@ -231,7 +231,7 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix 1.1.4", + "rustix 1.1.5", "signal-hook-registry", "slab", "windows-sys 0.61.2", @@ -245,13 +245,13 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.91" +version = "0.1.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae36dc4177970ef04fde5178d3e2429882def40e57a451f919c098f72baa6cec" +checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" dependencies = [ "proc-macro2", "quote", - "syn 3.0.3", + "syn 3.0.6", ] [[package]] @@ -289,9 +289,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.13.1" +version = "2.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" +checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" [[package]] name = "block" @@ -305,7 +305,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" dependencies = [ - "objc2 0.5.2", + "objc2 0.5.3", ] [[package]] @@ -314,14 +314,14 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" dependencies = [ - "objc2 0.6.4", + "objc2 0.6.5", ] [[package]] name = "blocking" -version = "1.6.2" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" +checksum = "a70e4329df6cb94385eed412ec92375c3cdd8a6e502493d1229b6414e4036dfa" dependencies = [ "async-channel", "async-task", @@ -347,13 +347,13 @@ dependencies = [ [[package]] name = "bytemuck_derive" -version = "1.11.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f65693059b6b9c588b9f62fed1cedbf0a8b805631457ea162d68f0de186f3de5" +checksum = "6a1f896587b6f2c069c73d2f0913e2d590c3990285cd2f0b6aa02b786b4c679c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.6", ] [[package]] @@ -368,7 +368,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "log", "polling", "rustix 0.38.44", @@ -378,14 +378,13 @@ dependencies = [ [[package]] name = "calloop" -version = "0.14.4" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dbf9978365bac10f54d1d4b04f7ce4427e51f71d61f2fe15e3fed5166474df7" +checksum = "43b32313e937c8721c9d17ee9bf60699a6402b4b7c2cb6ac1bee0ffcaa4b4e5e" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "polling", - "rustix 1.1.4", - "slab", + "rustix 1.1.5", "tracing", ] @@ -407,17 +406,17 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "138efcf0940a02ebf0cc8d1eff41a1682a46b431630f4c52450d6265876021fa" dependencies = [ - "calloop 0.14.4", - "rustix 1.1.4", + "calloop 0.14.5", + "rustix 1.1.5", "wayland-backend", "wayland-client", ] [[package]] name = "cc" -version = "1.4.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5add81bb678e6cb321aff7fa0dc7689ad82b112dbc032cea19f91d6b8e3582b9" +checksum = "f74872d07caf508b30a21f6836e7d7016a2eaf7d9ff4f48deaa58cd8a0407630" dependencies = [ "find-msvc-tools", "jobserver", @@ -427,9 +426,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" [[package]] name = "cfg_aliases" @@ -452,7 +451,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b7f4aaa047ba3c3630b080bb9860894732ff23e2aee290a418909aa6d5df38f" dependencies = [ - "objc2 0.5.2", + "objc2 0.5.3", "objc2-app-kit 0.2.2", "objc2-foundation 0.2.2", ] @@ -472,7 +471,7 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd63e33452ffdafd39924c4f05a5dd1e94db646c779c6bd59148a3d95fff5ad4" dependencies = [ - "thiserror 2.0.19", + "thiserror 2.0.21", "x11rb", ] @@ -489,9 +488,9 @@ dependencies = [ [[package]] name = "combine" -version = "4.6.7" +version = "4.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +checksum = "cfc320937d09e6de266b31b9afb480f197d7a861be86be7cb2ea7e5d1bfffc5e" dependencies = [ "bytes", "memchr", @@ -562,7 +561,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "core-foundation 0.10.1", "libc", ] @@ -582,7 +581,7 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "173852283a9a57a3cbe365d86e74dc428a09c50421477d5ad6fe9d9509e37737" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "fontdb", "harfrust", "linebender_resource_handle", @@ -602,9 +601,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.22" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" +checksum = "a31eee39dddec8330830986fcd7625edb5a24ec90ea038215273bbc3adb08ac6" [[package]] name = "crunchy" @@ -652,8 +651,8 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" dependencies = [ - "bitflags 2.13.1", - "objc2 0.6.4", + "bitflags 2.13.2", + "objc2 0.6.5", ] [[package]] @@ -737,9 +736,9 @@ dependencies = [ [[package]] name = "error-code" -version = "3.3.2" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" +checksum = "0b5343afd4a8365a643ac588dab4cf234a190c7f6c88c9f6dd6ffe00837661b7" [[package]] name = "etagere" @@ -788,9 +787,9 @@ checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" [[package]] name = "find-msvc-tools" -version = "0.1.9" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" +checksum = "aedcfb3409746eddb02b9e19ebda1c3394f759a152e48ee875a0844d1b955484" [[package]] name = "float_next_after" @@ -821,9 +820,9 @@ dependencies = [ [[package]] name = "font-types" -version = "0.12.2" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a7299a780854a6d391be2ae1c8521c9368471b559dbfd6a8dbd9f407eaff100" +checksum = "6c92d9081c7ab3bd83ef1eecdfad090f3d966e3ce74106779664114cfe1a6274" dependencies = [ "bytemuck", ] @@ -869,7 +868,7 @@ checksum = "ea5190182e6915eb873ddbc16e23b711b6eb1f9c00a0d0a3a91b5f6228475225" dependencies = [ "proc-macro2", "quote", - "syn 3.0.3", + "syn 3.0.6", ] [[package]] @@ -880,9 +879,9 @@ checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" [[package]] name = "futures" -version = "0.3.33" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a88cf1f829d945f548cf8fec32c61b1f202b6d93b45848602fc02af4b12ad218" +checksum = "9a31d2a3fbaaeb2af2368bbdd904aa8e812d3c04a1ee10d3171f52d556e5d0a3" dependencies = [ "futures-channel", "futures-core", @@ -895,9 +894,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.33" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "262590f4fe6afeb0bc83be1daa64e52657fe185690a958af7f3ad0e92085c5ae" +checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4" dependencies = [ "futures-core", "futures-sink", @@ -905,15 +904,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.33" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" [[package]] name = "futures-executor" -version = "0.3.33" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6754879cc9f2c66f88c6e5c35344bb0bdb0708b0352b1201815667c7eabc7458" +checksum = "031b47cf1a3c6cc8bc2fc76cd437f521619387907d469316e7c0bc278f1f5432" dependencies = [ "futures-core", "futures-task", @@ -922,9 +921,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.33" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4577ecaa3c4f96589d473f679a71b596316f6641bc350038b962a5daf0085d7a" +checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" [[package]] name = "futures-lite" @@ -941,32 +940,32 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.33" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d6d3cde68c518367be28956066ddfef33813991b77a55005a69dae04bf3b10b" +checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.6", ] [[package]] name = "futures-sink" -version = "0.3.33" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e34418ac499d6305c2fb5ad0ed2f6ac998c5f8ca209b4510f7f94242c647e307" +checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d" [[package]] name = "futures-task" -version = "0.3.33" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" [[package]] name = "futures-util" -version = "0.3.33" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" dependencies = [ "futures-channel", "futures-core", @@ -985,7 +984,7 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" dependencies = [ - "rustix 1.1.4", + "rustix 1.1.5", "windows-link", ] @@ -1056,7 +1055,7 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45cf04b2726f02df5508c6de726acdc90cdf97ac771a9a0ffd8ba10a6e696bf9" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "gpu-alloc-types", ] @@ -1066,7 +1065,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2bbed164dd10ed526c2e4fe3e721ca4a71c61730e5aafac6844b417b3227058" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", ] [[package]] @@ -1087,7 +1086,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "gpu-descriptor-types", "hashbrown 0.15.5", ] @@ -1098,7 +1097,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", ] [[package]] @@ -1129,7 +1128,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92c020db12c71d8a12a3fe7607873cade3a01a6287e29d540c8723276221b9d8" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "bytemuck", "core_maths", "read-fonts 0.35.0", @@ -1162,9 +1161,9 @@ checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" [[package]] name = "hermit-abi" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" +checksum = "e17592d60ebacc7d5e169f4663c5f84f9161cc90328abcfe8456f41e4dfcb284" [[package]] name = "hex" @@ -1191,7 +1190,7 @@ dependencies = [ "iced_runtime", "iced_widget", "iced_winit", - "thiserror 2.0.19", + "thiserror 2.0.21", ] [[package]] @@ -1200,7 +1199,7 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91ab1937d699403e7e69252ae743a902bcee9f4ab2052cc4c9a46fcf34729d85" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "bytes", "glam", "lilt", @@ -1208,7 +1207,7 @@ dependencies = [ "num-traits", "rustc-hash 2.1.3", "smol_str", - "thiserror 2.0.19", + "thiserror 2.0.21", "web-time", ] @@ -1244,7 +1243,7 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234ca1c2cec4155055f68fa5fad1b5242c496ac8238d80a259bca382fb44a102" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "bytemuck", "cosmic-text", "half", @@ -1254,7 +1253,7 @@ dependencies = [ "lyon_path", "raw-window-handle", "rustc-hash 2.1.3", - "thiserror 2.0.19", + "thiserror 2.0.21", "unicode-segmentation", ] @@ -1278,7 +1277,7 @@ dependencies = [ "iced_tiny_skia", "iced_wgpu", "log", - "thiserror 2.0.19", + "thiserror 2.0.21", ] [[package]] @@ -1291,14 +1290,14 @@ dependencies = [ "iced_core", "iced_futures", "raw-window-handle", - "thiserror 2.0.19", + "thiserror 2.0.21", ] [[package]] name = "iced_tiny_skia" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe0acf8b75a3bc914aff5f2329fdffc1b36eeaea29dda0e4bd232f1c62e9cc3d" +checksum = "c267596d742714b1853cc10c3983a367762816fc4836bd3b79f76ce76787d6f8" dependencies = [ "bytemuck", "cosmic-text", @@ -1317,7 +1316,7 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff144a999b0ca0f8a10257934500060240825c42e950ec0ebee9c8ae30561c13" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "bytemuck", "cryoglyph", "futures", @@ -1328,7 +1327,7 @@ dependencies = [ "log", "lyon", "rustc-hash 2.1.3", - "thiserror 2.0.19", + "thiserror 2.0.21", "wgpu", ] @@ -1342,22 +1341,22 @@ dependencies = [ "log", "num-traits", "rustc-hash 2.1.3", - "thiserror 2.0.19", + "thiserror 2.0.21", "unicode-segmentation", ] [[package]] name = "iced_winit" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b7dbedc47562d1de3b9707d939f678b88c382004b7ab5a18f7a7dd723162d75" +checksum = "7589888c8e951899cc688247a69933bb7a0511f0b4b2e122ac3fcd5dacb37f72" dependencies = [ "iced_debug", "iced_program", "log", "mundy", "rustc-hash 2.1.3", - "thiserror 2.0.19", + "thiserror 2.0.21", "tracing", "wasm-bindgen-futures", "web-sys", @@ -1367,9 +1366,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.14.0" +version = "2.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" dependencies = [ "equivalent", "hashbrown 0.17.1", @@ -1396,7 +1395,7 @@ dependencies = [ "jni-sys 0.4.1", "log", "simd_cesu8", - "thiserror 2.0.19", + "thiserror 2.0.21", "walkdir", "windows-link", ] @@ -1454,9 +1453,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.103" +version = "0.3.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" +checksum = "7883d941dae510fb2d978fc3fe018c71c9e2892fd38854de3e8b92c2e5ad9cc5" dependencies = [ "cfg-if", "futures-util", @@ -1492,9 +1491,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.189" +version = "0.2.190" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" +checksum = "ce5d3ddc6d3fa000eb1536d85e147bfe31aacaba692ed6a876f95cb7c855be78" [[package]] name = "libloading" @@ -1514,14 +1513,14 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.19" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2026a5056764a10b2bf5d56488cba40da507f5493a6a429340e2004d9ed085fa" +checksum = "61ff90caf6077a803a240f62fdbe88645a890bbca49ef8174c3cb0404362171d" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "libc", "plain", - "redox_syscall 0.9.1", + "redox_syscall 0.9.4", ] [[package]] @@ -1568,9 +1567,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.33" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" +checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" [[package]] name = "lru" @@ -1590,9 +1589,9 @@ dependencies = [ [[package]] name = "lyon_algorithms" -version = "1.0.20" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8575c0d003ae459399623c4def180c63b77f343b1a7fee64f249b349e7699a31" +checksum = "cdfa8785f95e57914ddb35e3b59994aeba6f5e79e9cfd03da1c269f010f36009" dependencies = [ "lyon_path", "num-traits", @@ -1621,9 +1620,9 @@ dependencies = [ [[package]] name = "lyon_tessellation" -version = "1.0.20" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e43b7e44161571868f5c931d12583592c223c5583eef86b08aa02b7048a3552" +checksum = "43b8dcf906637ecef61b3c0740c7a4e7f27caeb31257cfac0cc579ce15be6005" dependencies = [ "float_next_after", "lyon_path", @@ -1669,7 +1668,7 @@ version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00c15a6f673ff72ddcc22394663290f870fb224c1bfce55734a75c414150e605" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "block", "core-graphics-types 0.2.0", "foreign-types", @@ -1692,7 +1691,7 @@ dependencies = [ "futures-lite", "jni", "ndk-context", - "objc2 0.6.4", + "objc2 0.6.5", "objc2-app-kit 0.3.2", "objc2-foundation 0.3.2", "pin-project-lite", @@ -1711,7 +1710,7 @@ checksum = "066cf25f0e8b11ee0df221219010f213ad429855f57c494f995590c861a9a7d8" dependencies = [ "arrayvec", "bit-set", - "bitflags 2.13.1", + "bitflags 2.13.2", "cfg-if", "cfg_aliases", "codespan-reporting", @@ -1725,7 +1724,7 @@ dependencies = [ "once_cell", "rustc-hash 1.1.0", "spirv", - "thiserror 2.0.19", + "thiserror 2.0.21", "unicode-ident", ] @@ -1735,7 +1734,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "jni-sys 0.3.1", "log", "ndk-sys", @@ -1817,9 +1816,9 @@ checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" [[package]] name = "objc2" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +checksum = "19d5490aaf8f1d7cf7688dfa9b0ce07900e168852c45cd2c03f534dfd27cfd0b" dependencies = [ "objc-sys", "objc2-encode", @@ -1827,9 +1826,9 @@ dependencies = [ [[package]] name = "objc2" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" +checksum = "08849bbd4767dfae9457696856ae1c84fe4e0281bbe4a7abff2d0e06fb7981f8" dependencies = [ "objc2-encode", ] @@ -1840,10 +1839,10 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "block2 0.5.1", "libc", - "objc2 0.5.2", + "objc2 0.5.3", "objc2-core-data 0.2.2", "objc2-core-image 0.2.2", "objc2-foundation 0.2.2", @@ -1856,10 +1855,10 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "block2 0.6.2", "libc", - "objc2 0.6.4", + "objc2 0.6.5", "objc2-cloud-kit 0.3.2", "objc2-core-data 0.3.2", "objc2-core-foundation", @@ -1877,9 +1876,9 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "block2 0.5.1", - "objc2 0.5.2", + "objc2 0.5.3", "objc2-core-location", "objc2-foundation 0.2.2", ] @@ -1890,8 +1889,8 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" dependencies = [ - "bitflags 2.13.1", - "objc2 0.6.4", + "bitflags 2.13.2", + "objc2 0.6.5", "objc2-foundation 0.3.2", ] @@ -1902,7 +1901,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" dependencies = [ "block2 0.5.1", - "objc2 0.5.2", + "objc2 0.5.3", "objc2-foundation 0.2.2", ] @@ -1912,9 +1911,9 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "block2 0.5.1", - "objc2 0.5.2", + "objc2 0.5.3", "objc2-foundation 0.2.2", ] @@ -1924,8 +1923,8 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" dependencies = [ - "bitflags 2.13.1", - "objc2 0.6.4", + "bitflags 2.13.2", + "objc2 0.6.5", "objc2-foundation 0.3.2", ] @@ -1935,9 +1934,9 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "dispatch2", - "objc2 0.6.4", + "objc2 0.6.5", ] [[package]] @@ -1946,9 +1945,9 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "dispatch2", - "objc2 0.6.4", + "objc2 0.6.5", "objc2-core-foundation", "objc2-io-surface", ] @@ -1960,7 +1959,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" dependencies = [ "block2 0.5.1", - "objc2 0.5.2", + "objc2 0.5.3", "objc2-foundation 0.2.2", "objc2-metal", ] @@ -1971,7 +1970,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" dependencies = [ - "objc2 0.6.4", + "objc2 0.6.5", "objc2-foundation 0.3.2", ] @@ -1982,7 +1981,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" dependencies = [ "block2 0.5.1", - "objc2 0.5.2", + "objc2 0.5.3", "objc2-contacts", "objc2-foundation 0.2.2", ] @@ -1993,8 +1992,8 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" dependencies = [ - "bitflags 2.13.1", - "objc2 0.6.4", + "bitflags 2.13.2", + "objc2 0.6.5", "objc2-core-foundation", "objc2-core-graphics", ] @@ -2005,8 +2004,8 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" dependencies = [ - "bitflags 2.13.1", - "objc2 0.6.4", + "bitflags 2.13.2", + "objc2 0.6.5", "objc2-core-foundation", "objc2-core-graphics", "objc2-io-surface", @@ -2024,11 +2023,11 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "block2 0.5.1", "dispatch", "libc", - "objc2 0.5.2", + "objc2 0.5.3", ] [[package]] @@ -2037,10 +2036,10 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "block2 0.6.2", "libc", - "objc2 0.6.4", + "objc2 0.6.5", "objc2-core-foundation", ] @@ -2060,8 +2059,8 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" dependencies = [ - "bitflags 2.13.1", - "objc2 0.6.4", + "bitflags 2.13.2", + "objc2 0.6.5", "objc2-core-foundation", ] @@ -2072,7 +2071,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" dependencies = [ "block2 0.5.1", - "objc2 0.5.2", + "objc2 0.5.3", "objc2-app-kit 0.2.2", "objc2-foundation 0.2.2", ] @@ -2083,9 +2082,9 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "block2 0.5.1", - "objc2 0.5.2", + "objc2 0.5.3", "objc2-foundation 0.2.2", ] @@ -2095,7 +2094,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb82bed227edf5201dfedf072bba4015a33d3d4a98519837295a90f0a23f676d" dependencies = [ - "objc2 0.6.4", + "objc2 0.6.5", "objc2-core-foundation", "objc2-foundation 0.3.2", ] @@ -2106,9 +2105,9 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "block2 0.5.1", - "objc2 0.5.2", + "objc2 0.5.3", "objc2-foundation 0.2.2", "objc2-metal", ] @@ -2119,8 +2118,8 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" dependencies = [ - "bitflags 2.13.1", - "objc2 0.6.4", + "bitflags 2.13.2", + "objc2 0.6.5", "objc2-core-foundation", "objc2-foundation 0.3.2", ] @@ -2131,7 +2130,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" dependencies = [ - "objc2 0.5.2", + "objc2 0.5.3", "objc2-foundation 0.2.2", ] @@ -2141,9 +2140,9 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "block2 0.5.1", - "objc2 0.5.2", + "objc2 0.5.3", "objc2-cloud-kit 0.2.2", "objc2-core-data 0.2.2", "objc2-core-image 0.2.2", @@ -2163,7 +2162,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" dependencies = [ "block2 0.5.1", - "objc2 0.5.2", + "objc2 0.5.3", "objc2-foundation 0.2.2", ] @@ -2173,9 +2172,9 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "block2 0.5.1", - "objc2 0.5.2", + "objc2 0.5.3", "objc2-core-location", "objc2-foundation 0.2.2", ] @@ -2198,9 +2197,9 @@ dependencies = [ [[package]] name = "ordered-float" -version = "5.3.0" +version = "5.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7d950ca161dc355eaf28f82b11345ed76c6e1f6eb1f4f4479e0323b9e2fbd0e" +checksum = "8c7c9e0d9b23589f26070720bac724174bfec1083e82f7854cdd0267518343c0" dependencies = [ "num-traits", ] @@ -2293,9 +2292,9 @@ checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "pin-utils" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +checksum = "13bee6c73da26345c729282832b60b0363cf3dd9f4bfd81d8551b7a1c889a113" [[package]] name = "piper" @@ -2310,9 +2309,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.33" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" +checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" [[package]] name = "plain" @@ -2330,21 +2329,21 @@ dependencies = [ "concurrent-queue", "hermit-abi", "pin-project-lite", - "rustix 1.1.4", + "rustix 1.1.5", "windows-sys 0.61.2", ] [[package]] name = "portable-atomic" -version = "1.14.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d20d5497ef88037a52ff98267d066e7f11fcc5e99bbfbd58a42336193aacec3" +checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" [[package]] name = "portable-atomic-util" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" +checksum = "10ab3eb7f3becc3a1cbc4f2c6f20267996cfc1a6467a873763411b136a122715" dependencies = [ "portable-atomic", ] @@ -2417,9 +2416,9 @@ checksum = "ca45419789ae5a7899559e9512e58ca889e41f04f1f2445e9f4b290ceccd1d08" [[package]] name = "rangemap" -version = "1.7.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "973443cf09a9c8656b574a866ab68dfa19f0867d0340648c7d2f6a71b8a8ea68" +checksum = "a611d15b50743feb4c76b7d03edcb0e64f399c26961e4efe6975bc398be6aa3d" [[package]] name = "raw-window-handle" @@ -2445,7 +2444,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "046a7d674daf459825b32f5062056d6882db0d2f5a479fbd76ccfc870ac18709" dependencies = [ "bytemuck", - "font-types 0.12.2", + "font-types 0.12.6", "once_cell", ] @@ -2464,16 +2463,16 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", ] [[package]] name = "redox_syscall" -version = "0.9.1" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07507be7b4a5f9f26eeb41eeaebb1f5a7ff29dfb29739facc21d35bf8b11c21e" +checksum = "737970939a87c6fa31e7acad13307bccbb017a073b695b6089a2c484f929e20e" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", ] [[package]] @@ -2515,7 +2514,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "errno", "libc", "linux-raw-sys 0.4.15", @@ -2524,11 +2523,11 @@ dependencies = [ [[package]] name = "rustix" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +checksum = "891efababe418670775f199f0d233d84843c227a0949a883ce15b37c78d6629d" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "errno", "libc", "linux-raw-sys 0.12.1", @@ -2614,7 +2613,7 @@ checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn 3.0.3", + "syn 3.0.6", ] [[package]] @@ -2625,7 +2624,7 @@ checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906" dependencies = [ "proc-macro2", "quote", - "syn 3.0.3", + "syn 3.0.6", ] [[package]] @@ -2697,9 +2696,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.15.2" +version = "1.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" +checksum = "f9395f0f0eee849a9b707b2f06bb92a6a422090e2123bb2ef8e87a0e61892a8e" [[package]] name = "smithay-client-toolkit" @@ -2707,7 +2706,7 @@ version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "calloop 0.13.0", "calloop-wayland-source 0.3.0", "cursor-icon", @@ -2732,15 +2731,15 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0512da38f5e2b31201a93524adb8d3136276fa4fe4aafab4e1f727a82b534cc0" dependencies = [ - "bitflags 2.13.1", - "calloop 0.14.4", + "bitflags 2.13.2", + "calloop 0.14.5", "calloop-wayland-source 0.4.1", "cursor-icon", "libc", "log", "memmap2", - "rustix 1.1.4", - "thiserror 2.0.19", + "rustix 1.1.5", + "thiserror 2.0.21", "wayland-backend", "wayland-client", "wayland-csd-frame", @@ -2802,14 +2801,14 @@ dependencies = [ "js-sys", "memmap2", "ndk", - "objc2 0.6.4", + "objc2 0.6.5", "objc2-core-foundation", "objc2-core-graphics", "objc2-foundation 0.3.2", "objc2-quartz-core 0.3.2", "raw-window-handle", "redox_syscall 0.5.18", - "rustix 1.1.4", + "rustix 1.1.5", "tiny-xlib", "tracing", "wasm-bindgen", @@ -2827,7 +2826,7 @@ version = "0.3.0+sdk-1.3.268.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", ] [[package]] @@ -2872,9 +2871,9 @@ dependencies = [ [[package]] name = "syn" -version = "3.0.3" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" +checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" dependencies = [ "proc-macro2", "quote", @@ -2914,7 +2913,7 @@ dependencies = [ "fastrand", "getrandom 0.4.3", "once_cell", - "rustix 1.1.4", + "rustix 1.1.5", "windows-sys 0.61.2", ] @@ -2938,11 +2937,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.19" +version = "2.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" dependencies = [ - "thiserror-impl 2.0.19", + "thiserror-impl 2.0.21", ] [[package]] @@ -2958,13 +2957,13 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.19" +version = "2.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" dependencies = [ "proc-macro2", "quote", - "syn 3.0.3", + "syn 3.0.6", ] [[package]] @@ -3007,33 +3006,33 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.12.0" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" +checksum = "fd3ca314f692efd6c868f8408f53fe444634a845f96c028b97d35f6a1f79f0ee" + +[[package]] +name = "tokio" +version = "1.53.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e95f91fcc7a621e8b030f6aa23c71fe9838ae2fb4d8118b75602a328f5144044" dependencies = [ - "tinyvec_macros", + "pin-project-lite", ] -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - [[package]] name = "toml_datetime" -version = "1.1.1+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +checksum = "2b86d767906c6c42421dcba507eb9d203e779497710a47782a224bb871653053" dependencies = [ "serde_core", ] [[package]] name = "toml_edit" -version = "0.25.13+spec-1.1.0" +version = "0.25.16+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" +checksum = "88f38f3af8bf71841c67a990f4e2b52143b2d0a1a994c72513ff4c14977fc722" dependencies = [ "indexmap", "toml_datetime", @@ -3043,9 +3042,9 @@ dependencies = [ [[package]] name = "toml_parser" -version = "1.1.3+spec-1.1.0" +version = "1.1.4+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" +checksum = "bed810ee007d8e7f9cf20b4774e7198142fa27186e0f805871da7f3c39eaf333" dependencies = [ "winnow", ] @@ -3110,9 +3109,9 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.24" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" +checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" [[package]] name = "unicode-linebreak" @@ -3140,9 +3139,9 @@ checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" [[package]] name = "uuid" -version = "1.24.0" +version = "1.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239" +checksum = "97277d36b9c3ace13e58fa6e753f8b0bbbf302a18dd193240d70f9e29681059a" dependencies = [ "js-sys", "serde_core", @@ -3176,9 +3175,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.126" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" +checksum = "9bb54f33acc68fd454578d9820b0bde1a1a3d17aa17bb7b6595806d02886d409" dependencies = [ "cfg-if", "once_cell", @@ -3189,19 +3188,20 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.76" +version = "0.4.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62df1340f32221cb9c54d6a27b030e3dba64361d4a95bed55f9aacb44da291d" +checksum = "3cbab34de2d982e9b48e18d216d04c4a6f641066ff19ffb699980f591ee3610e" dependencies = [ "js-sys", + "tokio", "wasm-bindgen", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.126" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" +checksum = "2e29d0c35b16e224a7eeb5cd2d25e3e1968fbd65604117b44d3b789d00ee8535" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3209,22 +3209,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.126" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" +checksum = "6f501a8bc3719dba86ef8ae4728879c08001bea749eb1333ac5b91e040e2a6b7" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.6", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.126" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" +checksum = "23f0c9c52aa7cd7d77769a4cfe2a9adb1b331f489a41d912ce14513d5ab995c6" dependencies = [ "unicode-ident", ] @@ -3245,13 +3245,13 @@ dependencies = [ [[package]] name = "wayland-backend" -version = "0.3.16" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016ccf01d1c58b6f8999612813e17c9b2390f7d70671428869913310f83f54b8" +checksum = "38a91b4eaddff87b1cd1074985e3713da4af2c49742d1b356b2c01670a67a078" dependencies = [ "cc", "downcast-rs", - "rustix 1.1.4", + "rustix 1.1.5", "scoped-tls", "smallvec", "wayland-sys", @@ -3263,8 +3263,8 @@ version = "0.31.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3c36a0f861ad76d0901f2800b46321410d9f73f2ea88aac0650d86c32688073" dependencies = [ - "bitflags 2.13.1", - "rustix 1.1.4", + "bitflags 2.13.2", + "rustix 1.1.5", "wayland-backend", "wayland-scanner", ] @@ -3275,7 +3275,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "cursor-icon", "wayland-backend", ] @@ -3286,7 +3286,7 @@ version = "0.31.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a52d18780be9b1314328a3de5f930b73d2200112e3849ca6cb11822793fb34d" dependencies = [ - "rustix 1.1.4", + "rustix 1.1.5", "wayland-client", "xcursor", ] @@ -3297,7 +3297,7 @@ version = "0.32.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23d0c813de3daa2ed6520af85a3bd49b0e722a3078506899aa9686fea58dc4b6" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "wayland-backend", "wayland-client", "wayland-scanner", @@ -3309,7 +3309,7 @@ version = "20250721.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40a1f863128dcaaec790d7b4b396cc9b9a7a079e878e18c47e6c2d2c5a8dcbb1" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "wayland-backend", "wayland-client", "wayland-protocols", @@ -3322,7 +3322,7 @@ version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e9567599ef23e09b8dad6e429e5738d4509dfc46b3b21f32841a304d16b29c8" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "wayland-backend", "wayland-client", "wayland-protocols", @@ -3335,7 +3335,7 @@ version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b6d8cf1eb2c1c31ed1f5643c88a6e53538129d4af80030c8cabd1f9fa884d91" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "wayland-backend", "wayland-client", "wayland-protocols", @@ -3348,7 +3348,7 @@ version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb04e52f7836d7c7976c78ca0250d61e33873c34156a2a1fc9474828ec268234" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "wayland-backend", "wayland-client", "wayland-protocols", @@ -3380,9 +3380,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.103" +version = "0.3.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141" +checksum = "88261b9deccee56594c11a3460c462c41f58d148598fe70ad77070126a68aba4" dependencies = [ "js-sys", "wasm-bindgen", @@ -3405,7 +3405,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfe68bac7cde125de7a731c3400723cadaaf1703795ad3f4805f187459cd7a77" dependencies = [ "arrayvec", - "bitflags 2.13.1", + "bitflags 2.13.2", "cfg-if", "cfg_aliases", "document-features", @@ -3436,7 +3436,7 @@ dependencies = [ "arrayvec", "bit-set", "bit-vec", - "bitflags 2.13.1", + "bitflags 2.13.2", "bytemuck", "cfg_aliases", "document-features", @@ -3451,7 +3451,7 @@ dependencies = [ "raw-window-handle", "rustc-hash 1.1.0", "smallvec", - "thiserror 2.0.19", + "thiserror 2.0.21", "wgpu-core-deps-apple", "wgpu-core-deps-emscripten", "wgpu-core-deps-windows-linux-android", @@ -3496,7 +3496,7 @@ dependencies = [ "arrayvec", "ash", "bit-set", - "bitflags 2.13.1", + "bitflags 2.13.2", "block", "bytemuck", "cfg-if", @@ -3527,7 +3527,7 @@ dependencies = [ "raw-window-handle", "renderdoc-sys", "smallvec", - "thiserror 2.0.19", + "thiserror 2.0.21", "wasm-bindgen", "web-sys", "wgpu-types", @@ -3541,11 +3541,11 @@ version = "27.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afdcf84c395990db737f2dd91628706cb31e86d72e53482320d368e52b5da5eb" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "bytemuck", "js-sys", "log", - "thiserror 2.0.19", + "thiserror 2.0.21", "web-sys", ] @@ -3591,7 +3591,7 @@ dependencies = [ "clipboard_wayland", "clipboard_x11", "raw-window-handle", - "thiserror 2.0.19", + "thiserror 2.0.21", ] [[package]] @@ -3868,7 +3868,7 @@ dependencies = [ "ahash", "android-activity", "atomic-waker", - "bitflags 2.13.1", + "bitflags 2.13.2", "block2 0.5.1", "bytemuck", "calloop 0.13.0", @@ -3882,7 +3882,7 @@ dependencies = [ "libc", "memmap2", "ndk", - "objc2 0.5.2", + "objc2 0.5.3", "objc2-app-kit 0.2.2", "objc2-foundation 0.2.2", "objc2-ui-kit", @@ -3948,7 +3948,7 @@ dependencies = [ "libc", "libloading", "once_cell", - "rustix 1.1.4", + "rustix 1.1.5", "x11rb-protocol", ] @@ -3970,7 +3970,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" dependencies = [ - "bitflags 2.13.1", + "bitflags 2.13.2", "dlib", "log", "once_cell", @@ -3985,9 +3985,9 @@ checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" [[package]] name = "xml-rs" -version = "0.8.28" +version = "0.8.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" +checksum = "e450f9b2ed1dff33c94c12589a87338689467b9c4f5d8a5710bd09a847d2c8a7" [[package]] name = "yazi" @@ -3997,9 +3997,9 @@ checksum = "e01738255b5a16e78bbb83e7fbba0a1e7dd506905cfc53f4622d89015a03fbb5" [[package]] name = "zbus" -version = "5.18.0" +version = "5.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe18fb60dc696039e738717b76eaea21e7a4489bbb1885020b43c94236d7e98a" +checksum = "5db4be7c075cb421e4b7ee645541604239bd243ba7c357511f4ff3a74b555907" dependencies = [ "async-broadcast", "async-executor", @@ -4017,7 +4017,7 @@ dependencies = [ "hex", "libc", "ordered-stream", - "rustix 1.1.4", + "rustix 1.1.5", "serde", "serde_repr", "tracing", @@ -4032,14 +4032,14 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "5.18.0" +version = "5.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe96480bed92df2b442a1a30df364e12d08eed03aeb061f2b8dc6afb2be91119" +checksum = "2990635d09ade6df1868f72f8cac69a876a90981e8bd3c40b1be413f8dc88f40" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.6", "zbus_names", "zvariant", "zvariant_utils", @@ -4056,6 +4056,15 @@ dependencies = [ "zvariant", ] +[[package]] +name = "zcheapstr" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1afec51604565183aeb5c54c20aeab286120d4e4460f7f76e3e8bb8c0d99473" +dependencies = [ + "serde", +] + [[package]] name = "zeno" version = "0.3.3" @@ -4064,18 +4073,18 @@ checksum = "6df3dc4292935e51816d896edcd52aa30bc297907c26167fec31e2b0c6a32524" [[package]] name = "zerocopy" -version = "0.8.55" +version = "0.8.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5a105cd7b140f6eeec8acff2ea38135d3cab283ada58540f629fe51e46696eb" +checksum = "879fb705ce98c32e41ebdb970fbe1204f8492423b314c6ab0354c3e7b5542866" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.55" +version = "0.8.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fe976fb70c78cd64cccfe3a6fc142244e8a77b70959b30faf9d0ac37ee228eb" +checksum = "708882a28301d604fa039cc7727607a98d04c4b86dc76ec9cc683f805d709759" dependencies = [ "proc-macro2", "quote", @@ -4084,40 +4093,41 @@ dependencies = [ [[package]] name = "zvariant" -version = "5.13.1" +version = "5.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee2a0bcd2a907786a456fff45aaaaf54c9ba5f50b71ae9ec1a4edd200c94911" +checksum = "c1d34c27cc6cdd1f458427519dd6b8612f7b7e3f7b9a0b2355d041dda9869147" dependencies = [ "endi", "enumflags2", "serde", "winnow", + "zcheapstr", "zvariant_derive", "zvariant_utils", ] [[package]] name = "zvariant_derive" -version = "5.13.1" +version = "5.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38a708216a18780796770bfe3f4739c7c83a3e8f789b755534bbbc06e4e23e12" +checksum = "864155e69b4352db0c7f374917bf45d1e0c8d17659c8b3dbf9795f3673f8c497" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.6", "zvariant_utils", ] [[package]] name = "zvariant_utils" -version = "3.5.0" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90cb9383f9b45290407a1258b202d3f8f01db719eb60b4e4055c6375af4fc7c7" +checksum = "bad0294361a320b694a328460dc73add56c306150f5cb6bfafc44446120008a3" dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.119", + "syn 3.0.6", "winnow", ] diff --git a/flake.lock b/flake.lock index ff69fb5..70c7363 100644 --- a/flake.lock +++ b/flake.lock @@ -2,11 +2,11 @@ "nodes": { "crane": { "locked": { - "lastModified": 1785782307, - "narHash": "sha256-MPaRdVkf6zZP5fCPxYCi8Dr4pZzgmXzg8T9nVEbp3Mw=", + "lastModified": 1790899423, + "narHash": "sha256-THGtz65UGJU+sonZidRboyCMk+9DclpMF7pwL4uDV4M=", "owner": "ipetkov", "repo": "crane", - "rev": "2c71e194474d13de031d729b729c968ddbe3507f", + "rev": "47b6b27ed9a3a9181415e4367d0c30ab2a0e0250", "type": "github" }, "original": { @@ -35,18 +35,15 @@ }, "nixpkgs": { "locked": { - "lastModified": 1785747939, - "narHash": "sha256-D740uKsMbgsfK2oaDenJLLPIZfq7W0/g4KN/Fls8eKs=", - "owner": "nixos", - "repo": "nixpkgs", - "rev": "104240a772428cc2e20d8fd86c9ddbb886bbaff2", - "type": "github" + "lastModified": 1791260994, + "narHash": "sha256-MFBjw66d4h06MvpW6lIl7RwarLteD0sk859CncGwb1Q=", + "rev": "151fa4e8ddfdd8dd25d945ad94ed54a13de9f6e4", + "type": "tarball", + "url": "https://releases.nixos.org/nixos/unstable/nixos-26.11pre1086391.151fa4e8ddfd/nixexprs.tar.zst?lastModified=1791260994&rev=151fa4e8ddfdd8dd25d945ad94ed54a13de9f6e4" }, "original": { - "owner": "nixos", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" + "type": "tarball", + "url": "https://channels.nixos.org/nixos-unstable/nixexprs.tar.zst" } }, "root": { diff --git a/flake.nix b/flake.nix index 827d996..1c9efff 100644 --- a/flake.nix +++ b/flake.nix @@ -1,6 +1,6 @@ { inputs = { - nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable"; + nixpkgs.url = "https://channels.nixos.org/nixos-unstable/nixexprs.tar.zst"; crane.url = "github:ipetkov/crane";