feat(core/eckhart): no virtual locking btn at home
What changed, and why it matters
This commit removes a 'virtual lock button' from the Trezor hardware wallet's home screen on the Eckhart layout. Previously, holding a finger anywhere on the home screen (except the bottom action bar) for a set duration could lock the device. Now that gesture is gone. The change is described as a feature tweak, not a security fix, and no security relevance is disclosed in the commit or supplied references.
Treat as a normal UI/UX change unless additional context shows the virtual locking button caused accidental locks, accessibility issues, or a security problem. Review whether the lock action is still reachable through another, intentional control (e.g., the action bar). No immediate security response is indicated by the diff alone.
Security signals we found
Removal of an invisible/transparent UI control that responded to long-press gestures across most of the screen
Constructor parameter retained but prefixed with underscore, suggesting API compatibility rather than functional use
No changelog entry and no security framing in commit message
Evidence from the diff
The patch deletes the virtual_locking_button field and its associated event_hold handler from the Eckhart homescreen component. It also removes the lockable flag from the struct (keeping it only as an unused constructor parameter _lockable) and stops placing the invisible long-press button over the main screen area. The event() method now always returns None instead of possibly emitting HomescreenMsg::Dismissed when a long press is detected. This eliminates a global long-press-to-lock interaction on the homescreen.
Changed components
core/embed/rust/src/ui/layout_eckhart/firmware/homescreen.rsEckhart layout homescreen UI componentInspect captured patch +2 / −22
diff --git a/core/embed/rust/src/ui/layout_eckhart/firmware/homescreen.rs b/core/embed/rust/src/ui/layout_eckhart/firmware/homescreen.rs
index 49b0d838..9a33cb27 100644
--- a/core/embed/rust/src/ui/layout_eckhart/firmware/homescreen.rs
+++ b/core/embed/rust/src/ui/layout_eckhart/firmware/homescreen.rs
@@ -41,14 +41,10 @@ pub struct Homescreen {
image: Option<BinaryData<'static>>,
/// LED color
led_color: Option<Color>,
- /// Whether the PIN is set and device can be locked
- lockable: bool,
/// Whether the homescreen is locked
locked: bool,
/// Whether the homescreen is a boot screen
bootscreen: bool,
- /// Hold to lock button placed everywhere except the `action_bar`
- virtual_locking_button: Button,
/// Fuel gauge (battery status indicator) rendered in the `action_bar` area
fuel_gauge: FuelGauge,
/// Swipe component for vertical swiping
@@ -66,7 +62,7 @@ impl Homescreen {
pub fn new(
label: TString<'static>,
- lockable: bool,
+ _lockable: bool,
locked: bool,
bootscreen: bool,
coinjoin_authorized: bool,
@@ -105,10 +101,8 @@ impl Homescreen {
action_bar: ActionBar::new_single(btn),
image,
led_color,
- lockable,
locked,
bootscreen,
- virtual_locking_button: Button::empty().with_long_press(LOCK_HOLD_DURATION),
fuel_gauge: FuelGauge::on_charging_change_or_attach()
.with_alignment(Alignment::Center)
.with_font(fonts::FONT_SATOSHI_MEDIUM_26),
@@ -159,13 +153,6 @@ impl Homescreen {
b.set_content(bar_content)
}
}
-
- fn event_hold(&mut self, ctx: &mut EventCtx, event: Event) -> bool {
- if let Some(ButtonMsg::LongPressed) = self.virtual_locking_button.event(ctx, event) {
- return true;
- }
- false
- }
}
impl Drop for Homescreen {
@@ -199,9 +186,6 @@ impl Component for Homescreen {
self.fuel_gauge.place(bar_area);
// Swipe component is placed in the action bar touch area
self.swipe.place(self.action_bar.touch_area());
- // Locking button is placed everywhere except the action bar
- let locking_area = bounds.inset(Insets::bottom(self.action_bar.touch_area().height()));
- self.virtual_locking_button.place(locking_area);
bounds
}
@@ -222,11 +206,7 @@ impl Component for Homescreen {
};
}
- if self.lockable {
- Self::event_hold(self, ctx, event).then_some(HomescreenMsg::Dismissed)
- } else {
- None
- }
+ None
}
fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
Why this scored 25/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.