iced: Throttle resize updates
This commit is contained in:
parent
8038034a62
commit
9de5104cbc
1 changed files with 33 additions and 13 deletions
|
|
@ -3,6 +3,7 @@ use std::{
|
||||||
fmt,
|
fmt,
|
||||||
hash::{Hash, Hasher},
|
hash::{Hash, Hasher},
|
||||||
sync::{mpsc::Receiver, Arc, Mutex},
|
sync::{mpsc::Receiver, Arc, Mutex},
|
||||||
|
time::{Duration, Instant},
|
||||||
};
|
};
|
||||||
|
|
||||||
use cosmic::{
|
use cosmic::{
|
||||||
|
|
@ -136,6 +137,7 @@ struct IcedElementInternal<P: Program + Send + 'static> {
|
||||||
// draw buffer
|
// draw buffer
|
||||||
outputs: HashSet<Output>,
|
outputs: HashSet<Output>,
|
||||||
buffers: HashMap<OrderedFloat<f64>, (MemoryRenderBuffer, Option<(Vec<Primitive>, Color)>)>,
|
buffers: HashMap<OrderedFloat<f64>, (MemoryRenderBuffer, Option<(Vec<Primitive>, Color)>)>,
|
||||||
|
pending_resize: Option<(Instant, Size<i32, Logical>)>,
|
||||||
|
|
||||||
// state
|
// state
|
||||||
size: Size<i32, Logical>,
|
size: Size<i32, Logical>,
|
||||||
|
|
@ -182,6 +184,7 @@ impl<P: Program + Send + Clone + 'static> Clone for IcedElementInternal<P> {
|
||||||
IcedElementInternal {
|
IcedElementInternal {
|
||||||
outputs: self.outputs.clone(),
|
outputs: self.outputs.clone(),
|
||||||
buffers: self.buffers.clone(),
|
buffers: self.buffers.clone(),
|
||||||
|
pending_resize: self.pending_resize.clone(),
|
||||||
size: self.size.clone(),
|
size: self.size.clone(),
|
||||||
cursor_pos: self.cursor_pos.clone(),
|
cursor_pos: self.cursor_pos.clone(),
|
||||||
theme: self.theme.clone(),
|
theme: self.theme.clone(),
|
||||||
|
|
@ -201,6 +204,7 @@ impl<P: Program + Send + 'static> fmt::Debug for IcedElementInternal<P> {
|
||||||
f.debug_struct("IcedElementInternal")
|
f.debug_struct("IcedElementInternal")
|
||||||
.field("buffers", &"...")
|
.field("buffers", &"...")
|
||||||
.field("size", &self.size)
|
.field("size", &self.size)
|
||||||
|
.field("pending_resize", &self.pending_resize)
|
||||||
.field("cursor_pos", &self.cursor_pos)
|
.field("cursor_pos", &self.cursor_pos)
|
||||||
.field("theme", &self.theme)
|
.field("theme", &self.theme)
|
||||||
.field("renderer", &"...")
|
.field("renderer", &"...")
|
||||||
|
|
@ -250,6 +254,7 @@ impl<P: Program + Send + 'static> IcedElement<P> {
|
||||||
let mut internal = IcedElementInternal {
|
let mut internal = IcedElementInternal {
|
||||||
outputs: HashSet::new(),
|
outputs: HashSet::new(),
|
||||||
buffers: HashMap::new(),
|
buffers: HashMap::new(),
|
||||||
|
pending_resize: None,
|
||||||
size,
|
size,
|
||||||
cursor_pos: None,
|
cursor_pos: None,
|
||||||
theme: Theme::dark(), // TODO
|
theme: Theme::dark(), // TODO
|
||||||
|
|
@ -282,18 +287,9 @@ impl<P: Program + Send + 'static> IcedElement<P> {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal_ref.size = size;
|
if internal_ref.pending_resize.is_none() {
|
||||||
for (scale, (buffer, old_primitives)) in internal_ref.buffers.iter_mut() {
|
internal_ref.pending_resize = Some((Instant::now(), size));
|
||||||
let buffer_size = internal_ref
|
|
||||||
.size
|
|
||||||
.to_f64()
|
|
||||||
.to_buffer(**scale, Transform::Normal)
|
|
||||||
.to_i32_round();
|
|
||||||
*buffer =
|
|
||||||
MemoryRenderBuffer::new(Fourcc::Argb8888, buffer_size, 1, Transform::Normal, None);
|
|
||||||
*old_primitives = None;
|
|
||||||
}
|
}
|
||||||
internal_ref.update(true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn force_update(&self) {
|
pub fn force_update(&self) {
|
||||||
|
|
@ -706,10 +702,34 @@ where
|
||||||
alpha: f32,
|
alpha: f32,
|
||||||
) -> Vec<C> {
|
) -> Vec<C> {
|
||||||
let mut internal = self.0.lock().unwrap();
|
let mut internal = self.0.lock().unwrap();
|
||||||
let _ = internal.update(false);
|
let internal_ref = &mut *internal;
|
||||||
|
let force = if matches!(
|
||||||
|
internal_ref.pending_resize,
|
||||||
|
Some((instant, _)) if Instant::now().duration_since(instant) > Duration::from_millis(25)
|
||||||
|
) {
|
||||||
|
internal_ref.size = internal_ref.pending_resize.take().unwrap().1;
|
||||||
|
for (scale, (buffer, old_primitives)) in internal_ref.buffers.iter_mut() {
|
||||||
|
let buffer_size = internal_ref
|
||||||
|
.size
|
||||||
|
.to_f64()
|
||||||
|
.to_buffer(**scale, Transform::Normal)
|
||||||
|
.to_i32_round();
|
||||||
|
*buffer = MemoryRenderBuffer::new(
|
||||||
|
Fourcc::Argb8888,
|
||||||
|
buffer_size,
|
||||||
|
1,
|
||||||
|
Transform::Normal,
|
||||||
|
None,
|
||||||
|
);
|
||||||
|
*old_primitives = None;
|
||||||
|
}
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
};
|
||||||
|
let _ = internal_ref.update(force);
|
||||||
|
|
||||||
// makes partial borrows easier
|
// makes partial borrows easier
|
||||||
let internal_ref = &mut *internal;
|
|
||||||
if let Some((buffer, ref mut old_primitives)) =
|
if let Some((buffer, ref mut old_primitives)) =
|
||||||
internal_ref.buffers.get_mut(&OrderedFloat(scale.x))
|
internal_ref.buffers.get_mut(&OrderedFloat(scale.x))
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue