mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-02-17 01:52:02 +00:00
refactor(core/rust/ui): emit event when component tree is initialized
[no changelog]
This commit is contained in:
parent
7b5c618576
commit
3dcdffe203
@ -23,7 +23,7 @@ static void _librust_qstrs(void) {
|
|||||||
MP_QSTR_request_bip39;
|
MP_QSTR_request_bip39;
|
||||||
MP_QSTR_request_slip39;
|
MP_QSTR_request_slip39;
|
||||||
|
|
||||||
MP_QSTR_set_timer_fn;
|
MP_QSTR_attach_timer_fn;
|
||||||
MP_QSTR_touch_event;
|
MP_QSTR_touch_event;
|
||||||
MP_QSTR_button_event;
|
MP_QSTR_button_event;
|
||||||
MP_QSTR_timer;
|
MP_QSTR_timer;
|
||||||
|
@ -226,6 +226,9 @@ pub enum Event {
|
|||||||
/// Previously requested timer was triggered. This invalidates the timer
|
/// Previously requested timer was triggered. This invalidates the timer
|
||||||
/// token (another timer has to be requested).
|
/// token (another timer has to be requested).
|
||||||
Timer(TimerToken),
|
Timer(TimerToken),
|
||||||
|
/// Component has been attached to component tree. This event is sent once
|
||||||
|
/// before any other events.
|
||||||
|
Attach,
|
||||||
/// Internally-handled event to inform all `Child` wrappers in a sub-tree to
|
/// Internally-handled event to inform all `Child` wrappers in a sub-tree to
|
||||||
/// get scheduled for painting.
|
/// get scheduled for painting.
|
||||||
RequestPaint,
|
RequestPaint,
|
||||||
|
@ -268,7 +268,7 @@ impl LayoutObj {
|
|||||||
static TYPE: Type = obj_type! {
|
static TYPE: Type = obj_type! {
|
||||||
name: Qstr::MP_QSTR_Layout,
|
name: Qstr::MP_QSTR_Layout,
|
||||||
locals: &obj_dict!(obj_map! {
|
locals: &obj_dict!(obj_map! {
|
||||||
Qstr::MP_QSTR_set_timer_fn => obj_fn_2!(ui_layout_set_timer_fn).as_obj(),
|
Qstr::MP_QSTR_attach_timer_fn => obj_fn_2!(ui_layout_attach_timer_fn).as_obj(),
|
||||||
Qstr::MP_QSTR_touch_event => obj_fn_var!(4, 4, ui_layout_touch_event).as_obj(),
|
Qstr::MP_QSTR_touch_event => obj_fn_var!(4, 4, ui_layout_touch_event).as_obj(),
|
||||||
Qstr::MP_QSTR_button_event => obj_fn_var!(3, 3, ui_layout_button_event).as_obj(),
|
Qstr::MP_QSTR_button_event => obj_fn_var!(3, 3, ui_layout_button_event).as_obj(),
|
||||||
Qstr::MP_QSTR_timer => obj_fn_2!(ui_layout_timer).as_obj(),
|
Qstr::MP_QSTR_timer => obj_fn_2!(ui_layout_timer).as_obj(),
|
||||||
@ -339,11 +339,13 @@ impl From<Never> for Obj {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" fn ui_layout_set_timer_fn(this: Obj, timer_fn: Obj) -> Obj {
|
extern "C" fn ui_layout_attach_timer_fn(this: Obj, timer_fn: Obj) -> Obj {
|
||||||
let block = || {
|
let block = || {
|
||||||
let this: Gc<LayoutObj> = this.try_into()?;
|
let this: Gc<LayoutObj> = this.try_into()?;
|
||||||
this.obj_set_timer_fn(timer_fn);
|
this.obj_set_timer_fn(timer_fn);
|
||||||
Ok(Obj::const_true())
|
let msg = this.obj_event(Event::Attach)?;
|
||||||
|
assert!(msg == Obj::const_none());
|
||||||
|
Ok(Obj::const_none())
|
||||||
};
|
};
|
||||||
unsafe { util::try_or_raise(block) }
|
unsafe { util::try_or_raise(block) }
|
||||||
}
|
}
|
||||||
|
@ -18,17 +18,17 @@ class _RustLayout(ui.Layout):
|
|||||||
def __init__(self, layout: Any):
|
def __init__(self, layout: Any):
|
||||||
self.layout = layout
|
self.layout = layout
|
||||||
self.timer = loop.Timer()
|
self.timer = loop.Timer()
|
||||||
self.layout.set_timer_fn(self.set_timer)
|
|
||||||
|
|
||||||
def set_timer(self, token: int, deadline: int) -> None:
|
def set_timer(self, token: int, deadline: int) -> None:
|
||||||
self.timer.schedule(deadline, token)
|
self.timer.schedule(deadline, token)
|
||||||
|
|
||||||
def create_tasks(self) -> tuple[loop.Task, ...]:
|
def create_tasks(self) -> tuple[loop.Task, ...]:
|
||||||
return self.handle_input_and_rendering(), self.handle_timers()
|
return self.handle_timers(), self.handle_input_and_rendering()
|
||||||
|
|
||||||
def handle_input_and_rendering(self) -> loop.Task: # type: ignore [awaitable-is-generator]
|
def handle_input_and_rendering(self) -> loop.Task: # type: ignore [awaitable-is-generator]
|
||||||
button = loop.wait(io.BUTTON)
|
button = loop.wait(io.BUTTON)
|
||||||
ui.display.clear()
|
ui.display.clear()
|
||||||
|
self.layout.attach_timer_fn(self.set_timer)
|
||||||
self.layout.paint()
|
self.layout.paint()
|
||||||
while True:
|
while True:
|
||||||
# Using `yield` instead of `await` to avoid allocations.
|
# Using `yield` instead of `await` to avoid allocations.
|
||||||
|
@ -19,7 +19,6 @@ class _RustLayout(ui.Layout):
|
|||||||
def __init__(self, layout: Any):
|
def __init__(self, layout: Any):
|
||||||
self.layout = layout
|
self.layout = layout
|
||||||
self.timer = loop.Timer()
|
self.timer = loop.Timer()
|
||||||
self.layout.set_timer_fn(self.set_timer)
|
|
||||||
|
|
||||||
def set_timer(self, token: int, deadline: int) -> None:
|
def set_timer(self, token: int, deadline: int) -> None:
|
||||||
self.timer.schedule(deadline, token)
|
self.timer.schedule(deadline, token)
|
||||||
@ -30,8 +29,8 @@ class _RustLayout(ui.Layout):
|
|||||||
from apps.debug import confirm_signal, input_signal
|
from apps.debug import confirm_signal, input_signal
|
||||||
|
|
||||||
return (
|
return (
|
||||||
self.handle_input_and_rendering(),
|
|
||||||
self.handle_timers(),
|
self.handle_timers(),
|
||||||
|
self.handle_input_and_rendering(),
|
||||||
confirm_signal(),
|
confirm_signal(),
|
||||||
input_signal(),
|
input_signal(),
|
||||||
)
|
)
|
||||||
@ -50,9 +49,13 @@ class _RustLayout(ui.Layout):
|
|||||||
else:
|
else:
|
||||||
|
|
||||||
def create_tasks(self) -> tuple[loop.AwaitableTask, ...]:
|
def create_tasks(self) -> tuple[loop.AwaitableTask, ...]:
|
||||||
return self.handle_input_and_rendering(), self.handle_timers()
|
return self.handle_timers(), self.handle_input_and_rendering()
|
||||||
|
|
||||||
def _before_render(self) -> None:
|
def _before_render(self) -> None:
|
||||||
|
# Clear the screen of any leftovers.
|
||||||
|
ui.backlight_fade(ui.style.BACKLIGHT_DIM)
|
||||||
|
ui.display.clear()
|
||||||
|
|
||||||
if __debug__ and self.should_notify_layout_change:
|
if __debug__ and self.should_notify_layout_change:
|
||||||
from apps.debug import notify_layout_change
|
from apps.debug import notify_layout_change
|
||||||
|
|
||||||
@ -62,10 +65,13 @@ class _RustLayout(ui.Layout):
|
|||||||
self.should_notify_layout_change = False
|
self.should_notify_layout_change = False
|
||||||
notify_layout_change(self)
|
notify_layout_change(self)
|
||||||
|
|
||||||
|
# Turn the brightness on again.
|
||||||
|
ui.backlight_fade(self.BACKLIGHT_LEVEL)
|
||||||
|
|
||||||
def handle_input_and_rendering(self) -> loop.Task: # type: ignore [awaitable-is-generator]
|
def handle_input_and_rendering(self) -> loop.Task: # type: ignore [awaitable-is-generator]
|
||||||
touch = loop.wait(io.TOUCH)
|
touch = loop.wait(io.TOUCH)
|
||||||
self._before_render()
|
self._before_render()
|
||||||
ui.display.clear()
|
self.layout.attach_timer_fn(self.set_timer)
|
||||||
self.layout.paint()
|
self.layout.paint()
|
||||||
# self.layout.bounds()
|
# self.layout.bounds()
|
||||||
while True:
|
while True:
|
||||||
|
Loading…
Reference in New Issue
Block a user