Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

多窗口命令

本例让同一应用中的两个窗口调用命令,展示窗口声明、渲染器授权和调用方身份如何配合。增加一个窗口并不意味着该页面自动获得现有操作的访问权限。

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 便于观察并发请求。逻辑窗口名标识应用窗口,不是可以无限复用的原生句柄。