iris: eliminate retained-frame heap churn

This commit is contained in:
iris committed 2026-09-12 22:44:03 -04:00
1 parent acf206ef19
commit 32f6ad8c79
20 files changed
+518 -195

No files matched your search

+16 -16
View File
@@ -328,18 +328,17 @@ impl SensorUi for UiRenderState {
// Platform cancellation reaches every tracker and produces no other sense.
if cursor.cancelled {
let captured = pointer.captured.take();
let mut told: Vec<WidgetId> = captured.into_iter().collect();
for id in pointer.pressed.drain(..) {
if Some(id) != captured {
told.push(id);
}
}
requests.release();
pointer.press_origin = None;
pointer.drag_axis = None;
for id in told {
if let Some(id) = captured {
deliver_cancel(self, rsc, state, id, &cursor, window_size, &requests);
}
for id in pointer.pressed.drain(..) {
if Some(id) != captured {
deliver_cancel(self, rsc, state, id, &cursor, window_size, &requests);
}
}
rsc.events_mut().get_type::<CursorSense>().global = pointer;
return;
}
@@ -442,15 +441,16 @@ impl SensorUi for UiRenderState {
pointer.captured = requests.holder();
match pointer.captured {
Some(winner) => {
let losers: Vec<WidgetId> = pointer
.pressed
.iter()
.copied()
.filter(|&id| id != winner)
.collect();
pointer.pressed.retain(|&id| id == winner);
for loser in losers {
deliver_cancel(self, rsc, state, loser, &cursor, window_size, &requests);
let mut winner_was_pressed = false;
for id in pointer.pressed.drain(..) {
if id == winner {
winner_was_pressed = true;
} else {
deliver_cancel(self, rsc, state, id, &cursor, window_size, &requests);
}
}
if winner_was_pressed {
pointer.pressed.push(winner);
}
}
None if !button_down => pointer.pressed.clear(),