Wayland 窗口激活机制

Wayland 下,客户端无法像 X11 那样直接操作窗口焦点。所有窗口激活请求都必须经过 xdg-activation-v1 协议:申请者(通常是发起激活的一方)先从 compositor 获得 token,再将 token 交给目标应用,目标应用凭 token 向 compositor 请求焦点。 整个流程分为三个阶段: sequenceDiagram participant App as 申请者 participant Comp as Compositor participant Target as 目标进程 rect rgb(60, 60, 90) Note over App,Comp: ① Token 申请 App->>Comp: get_activation_token() App->>Comp: set_serial() App->>Comp: set_surface() App->>Comp: set_app_id() App->>Comp: commit() Comp-->>App: done(token) end rect rgb(90, 60, 60) Note over App,Target: ② Token 传递 App->>Target: 环境变量 / D-Bus / socket end rect rgb(60, 90, 60) Note over Target,Comp: ③ Token 使用 Target->>Comp: activate(token, surface) Note over Comp: 验证并授权焦点 end Token 申请:谁想激活别人,谁负责向 compositor 申请 token(协议层面) Token 传递:通过环境变量、D-Bus、单例 socket 等方式将 token 从申请者交给目标进程(跨进程传递) Token 使用:目标进程将 token 提交给 compositor,获得焦点(协议层面) 本文重点分析第 2 部分(传递),基于 Qt6(qtbase)、GLib 和 KDE kio 源码。 ...

2026年8月28日 · 4000 words · rewine