Skip to content

Commit 0be83fe

Browse files
committed
iced: Optimize updates
1 parent 7c222ae commit 0be83fe

File tree

3 files changed

+21
-20
lines changed

3 files changed

+21
-20
lines changed

src/shell/element/stack.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,6 @@ impl CosmicStack {
381381
if update {
382382
self.0
383383
.resize(Size::from((self.active().geometry().size.w, TAB_HEIGHT)));
384-
self.0.force_update();
385384
}
386385

387386
result
@@ -436,7 +435,6 @@ impl CosmicStack {
436435
if !matches!(result, MoveResult::Default) {
437436
self.0
438437
.resize(Size::from((self.active().geometry().size.w, TAB_HEIGHT)));
439-
self.0.force_update();
440438
}
441439

442440
result
@@ -1208,7 +1206,6 @@ impl SpaceElement for CosmicStack {
12081206
})
12091207
}
12101208
fn refresh(&self) {
1211-
SpaceElement::refresh(&self.0);
12121209
self.0.with_program(|p| {
12131210
let mut windows = p.windows.lock().unwrap();
12141211

@@ -1245,6 +1242,7 @@ impl SpaceElement for CosmicStack {
12451242
SpaceElement::refresh(w)
12461243
});
12471244
});
1245+
SpaceElement::refresh(&self.0);
12481246
}
12491247
}
12501248

src/shell/element/window.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -635,9 +635,12 @@ impl SpaceElement for CosmicWindow {
635635
}
636636
#[profiling::function]
637637
fn refresh(&self) {
638-
SpaceElement::refresh(&self.0);
639638
if self.0.with_program(|p| {
640639
SpaceElement::refresh(&p.window);
640+
if !p.has_ssd(true) {
641+
return false;
642+
}
643+
641644
let title = p.window.title();
642645
let mut last_title = p.last_title.lock().unwrap();
643646
if *last_title != title {
@@ -648,6 +651,8 @@ impl SpaceElement for CosmicWindow {
648651
}
649652
}) {
650653
self.0.force_update();
654+
} else {
655+
SpaceElement::refresh(&self.0);
651656
}
652657
}
653658
}

src/utils/iced.rs

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,6 @@ impl<P: Program + Send + 'static> IcedElement<P> {
376376
for (_buffer, ref mut old_primitives) in internal.buffers.values_mut() {
377377
*old_primitives = None;
378378
}
379-
internal.update(true);
380379
}
381380

382381
pub fn current_size(&self) -> Size<i32, Logical> {
@@ -405,13 +404,12 @@ impl<P: Program + Send + 'static + Clone> IcedElement<P> {
405404

406405
impl<P: Program + Send + 'static> IcedElementInternal<P> {
407406
#[profiling::function]
408-
fn update(&mut self, mut force: bool) {
407+
fn update(&mut self, force: bool) {
409408
while let Ok(Some(message)) = self.rx.try_recv() {
410409
self.state.queue_message(message);
411-
force = true;
412410
}
413411

414-
if !force {
412+
if self.state.is_queue_empty() && !force {
415413
return;
416414
}
417415

@@ -469,7 +467,7 @@ impl<P: Program + Send + 'static> PointerTarget<crate::state::State> for IcedEle
469467
// TODO: Update iced widgets to handle touch using event position, not cursor_pos
470468
internal.cursor_pos = Some(event_location);
471469
*internal.last_seat.lock().unwrap() = Some((seat.clone(), event.serial));
472-
internal.update(true);
470+
internal.update(false);
473471
}
474472

475473
fn motion(
@@ -486,7 +484,7 @@ impl<P: Program + Send + 'static> PointerTarget<crate::state::State> for IcedEle
486484
.queue_event(Event::Mouse(MouseEvent::CursorMoved { position }));
487485
internal.cursor_pos = Some(event_location);
488486
*internal.last_seat.lock().unwrap() = Some((seat.clone(), event.serial));
489-
internal.update(true);
487+
internal.update(false);
490488
}
491489

492490
fn relative_motion(
@@ -515,7 +513,7 @@ impl<P: Program + Send + 'static> PointerTarget<crate::state::State> for IcedEle
515513
ButtonState::Released => MouseEvent::ButtonReleased(button),
516514
}));
517515
*internal.last_seat.lock().unwrap() = Some((seat.clone(), event.serial));
518-
internal.update(true);
516+
internal.update(false);
519517
}
520518

521519
fn axis(
@@ -540,7 +538,7 @@ impl<P: Program + Send + 'static> PointerTarget<crate::state::State> for IcedEle
540538
}
541539
},
542540
}));
543-
internal.update(true);
541+
internal.update(false);
544542
}
545543

546544
fn frame(&self, _seat: &Seat<crate::state::State>, _data: &mut crate::state::State) {}
@@ -556,7 +554,7 @@ impl<P: Program + Send + 'static> PointerTarget<crate::state::State> for IcedEle
556554
internal
557555
.state
558556
.queue_event(Event::Mouse(MouseEvent::CursorLeft));
559-
internal.update(true);
557+
internal.update(false);
560558
}
561559

562560
fn gesture_swipe_begin(
@@ -635,7 +633,7 @@ impl<P: Program + Send + 'static> TouchTarget<crate::state::State> for IcedEleme
635633
internal.touch_map.insert(id, position);
636634
internal.cursor_pos = Some(event_location);
637635
*internal.last_seat.lock().unwrap() = Some((seat.clone(), seq));
638-
let _ = internal.update(true);
636+
let _ = internal.update(false);
639637
}
640638

641639
fn up(
@@ -652,7 +650,7 @@ impl<P: Program + Send + 'static> TouchTarget<crate::state::State> for IcedEleme
652650
internal
653651
.state
654652
.queue_event(Event::Touch(TouchEvent::FingerLifted { id, position }));
655-
let _ = internal.update(true);
653+
let _ = internal.update(false);
656654
}
657655
}
658656

@@ -673,7 +671,7 @@ impl<P: Program + Send + 'static> TouchTarget<crate::state::State> for IcedEleme
673671
.queue_event(Event::Touch(TouchEvent::FingerMoved { id, position }));
674672
internal.touch_map.insert(id, position);
675673
internal.cursor_pos = Some(event_location);
676-
let _ = internal.update(true);
674+
let _ = internal.update(false);
677675
}
678676

679677
fn frame(
@@ -696,7 +694,7 @@ impl<P: Program + Send + 'static> TouchTarget<crate::state::State> for IcedEleme
696694
.state
697695
.queue_event(Event::Touch(TouchEvent::FingerLost { id, position }));
698696
}
699-
let _ = internal.update(true);
697+
let _ = internal.update(false);
700698
}
701699

702700
fn shape(
@@ -774,7 +772,7 @@ impl<P: Program + Send + 'static> KeyboardTarget<crate::state::State> for IcedEl
774772
internal
775773
.state
776774
.queue_event(Event::Keyboard(KeyboardEvent::ModifiersChanged(mods)));
777-
let _ = internal.update(true);
775+
let _ = internal.update(false);
778776
}
779777
}
780778

@@ -807,7 +805,7 @@ impl<P: Program + Send + 'static> SpaceElement for IcedElement<P> {
807805
} else {
808806
WindowEvent::Unfocused
809807
}));
810-
let _ = internal.update(true); // TODO
808+
let _ = internal.update(false);
811809
}
812810

813811
fn output_enter(&self, output: &Output, _overlap: Rectangle<i32, Logical>) {
@@ -881,7 +879,7 @@ impl<P: Program + Send + 'static> SpaceElement for IcedElement<P> {
881879
),
882880
);
883881
}
884-
internal.update(true);
882+
internal.update(false);
885883
}
886884
}
887885

0 commit comments

Comments
 (0)