Press x in UI px from the top-left of your content area (the bootstrap's while yours is not laid out), the frame the wrap frame's bounds and input.app_mouse_position read.
How the app ended. The event reaches only the ended app's parent and its ancestors; any other app holding its handle hears the end through App:on_end.
message?
string
Why the app never started, as one sentence for users in the current locale; nil for an app that started. Show it as it is: a locale catalog translates it like any other built-in text.
For a crashed app spawned from inline code: what ended it. Nil for any other end, and for an app spawned from a package, whose error is in the workstation's log alone.
Your app's effective control density, as theme.density reads it: its own, else the nearest ancestor's, else the root's. The callback fires once right after subscribing, with the current value, then again whenever it changes, by your app's write or by an ancestor's it inherits, at most once a frame.
It called app.terminate, or it was a service app with nothing left to run.
"terminated"
A managing app ended it with wm.terminate_app, its parent ended, or the element it lived in (app.spawn's host) was removed.
"crashed"
An error escaped its own code, or its entry script failed to compile. The error is in the workstation's log and, for an app spawned from inline code, in the end's fault.
"not_started"
It never ran its entry script: its package couldn't be found, fetched or run here, it is a service app spawned with host, or its manifest requires a permission that was refused. Only this reason comes with a message.
The element holding your app's focus, as ui.focused reads it; absent while none does. The callback fires once right after subscribing, with the current value, then again whenever it changes, at most once a frame.
Whether the workstation window is in full screen, as screen.is_fullscreen reads it. The callback fires once right after subscribing, with the current state, then again whenever this or available changes, at most once a frame.
The device input.last_source reads for your app: the initial "keyboard" while your app is neither the input owner nor its ancestor. The callback fires once right after subscribing, with the current value, then again whenever it changes, at most once a frame.
Your app's effective theme, as theme.current() reads it: its own pinned theme, or the one it inherits. The callback fires once right after subscribing, with the current theme, then again whenever it changes, by a pin or unpin on your app or on an ancestor it inherits from, at most once a frame. A theme file read again is the same theme, even when the file changed: pinning it repaints your widgets but does not fire the callback.