///|
pub fn runtime_and_host() -> (
@runtime.AppRuntime,
@backend_common.WindowSceneResolver,
@backend_common.WindowRequestQueue,
) {
let queue = @backend_common.WindowRequestQueue::new()
let windows = window_actions(queue)
let resolver = @backend_common.WindowSceneResolver::new(resolve=request => {
match
@multi_window_app.scene_from_window(
@multi_window_app.WindowScene::new(
scene_id=request.scene.scene_id,
payload=request.scene.payload,
),
) {
Some(scene) =>
SceneResolved(
@backend_common.WindowSceneInstance::new(
request~,
runtime=runtime_for(scene, windows, request.metrics.logical_size),
),
)
None => SceneRejected("unknown sample scene")
}
})
(
runtime_for(Main, windows, @geometry.Size::new(width=640.0, height=420.0)),
resolver,
queue,
)
}
///|
fn runtime_for(
scene : @multi_window_app.Scene,
windows : @multi_window_app.WindowActions,
size : @geometry.Size,
) -> @runtime.AppRuntime {
@runtime.new_program_with_dimensions(
program=@multi_window_app.program(scene, windows),
width=size.width,
height=size.height,
)
}
///|
fn window_actions(
queue : @backend_common.WindowRequestQueue,
) -> @multi_window_app.WindowActions {
let host = @backend_common.WindowActions::new(queue~)
@multi_window_app.WindowActions::new(
dispatch=request => {
match request {
Open(open) =>
host.open(
title=open.title,
scene=@host.WindowScene::new(
scene_id=open.scene.scene_id,
payload=open.scene.payload,
),
metrics=@core.SurfaceMetrics::from_logical(
size=@geometry.Size::new(width=open.width, height=open.height),
),
)
Focus(id) => host.focus(@host.WindowId::new(id.value))
Close(id) => host.close(@host.WindowId::new(id.value))
}
},
subscribe=dispatch => {
queue.subscribe_completed(completion => {
match completion.result {
WindowOpened(id) =>
dispatch(Opened(@multi_window_app.WindowId::new(id.value)))
WindowUpdated(id) =>
dispatch(Updated(@multi_window_app.WindowId::new(id.value)))
WindowRejected(message) => dispatch(Rejected(message))
}
})
},
)
}