多窗口命令
本例让同一应用中的两个窗口调用命令,展示窗口声明、渲染器授权和调用方身份如何配合。增加一个窗口并不意味着该页面自动获得现有操作的访问权限。
45_bridge_multi_window · 关键文件:main.mbt
行为
identify 命令返回传入标签与 CommandContext.window_id()。不同窗口的请求保留各自来源身份。
实现说明
以下为入口中的节选,完整上下文见本页源码链接。
async fn main {
@proton.html(
"Bridge Multi A",
page_html("A"),
width=520,
height=420,
debug=true,
)
..add_window(
"secondary",
@proton.WindowConfig(
"Bridge Multi B",
@proton.AppEntry::Html(page_html("B")),
width=520,
height=420,
),
open_on_start=false,
)
..capability(@proton_extension.capability(multi_window_extension()), targets=[
@proton.RendererTarget::entry(),
@proton.RendererTarget::entry(window="secondary"),
])
..app_lifecycle(
on_start=async fn(context) { ignore(context.windows().open("secondary")) },
on_shutdown=fn(_state) { },
)
..identifier("dev.proton.45-bridge-multi-window")
.run_or_abort()
}
同一扩展实现服务两个独立授权的 renderer 目标。secondary 声明使用 open_on_start=false,由应用启动钩子显式打开。处理器返回 context.window_id(),说明调用方身份来自宿主上下文,而非页面传来的 label。
可以复用业务处理器,但必须显式列出目标。每窗口 UI 状态留在前端,共享状态由宿主管理。延迟调用可以重叠,不能按当前焦点窗口判断响应归属。
运行
完成源码检出与运行时安装后,在仓库根目录执行:
moon -C examples run 45_bridge_multi_window --target native
限制与使用边界
可选 delay_ms 便于观察并发请求。逻辑窗口名标识应用窗口,不是可以无限复用的原生句柄。