☰
OpenLess的Linux之路:为什么抛弃Tauri与WebKitGTK,用egui打造原生UI
2026/9/26 4:01:04 网站建设 项目流程

OpenLess的Linux之路:为什么抛弃Tauri与WebKitGTK,用egui打造原生UI

【免费下载链接】openlessHold a key, speak, release — AI-polished text appears at your cursor in any app. Open-source voice input for macOS & Windows. (按住快捷键说话,松开即得润色后的文字)项目地址: https://gitcode.com/gh_mirrors/op/openless

OpenLess 是一款开源 AI 语音输入工具:按住快捷键说话,松开即得润色后的文字,光标在哪就能插入到哪。在 2.0 版本中,团队为 Linux 放弃了 Tauri(WebKitGTK)方案,改用 Rust 的 egui 重构了整套原生 UI。本文讲清楚:为什么不做“一份代码三端跑”,以及 egui 原生方案是如何落地的。🎙️

一、先认识 OpenLess:按住说话,松开落字

OpenLess 的核心体验非常直接:

  • 全局热键触发:按住快捷键开始录音,松开结束;
  • AI 润色:语音经 ASR 转写后,由 LLM 按你选择的“风格包”清理口语、调整语气;
  • 光标处插入:处理完成自动把文字写入当前任意应用的输入框,支持选区润色、追问(QA)、本地模型离线识别等进阶能力。

在 2.0 架构中,各平台分工明确(见架构文档):

平台界面层原生宿主层
Windows / macOS / AndroidReact + Taurisrc-tauri/
Linuxegui(Rust 原生 UI)linux-egui/(crateopenless-linux-egui)
全平台—共享业务核心crates/openless-core

关键点:业务逻辑只有一份,全部位于openless-core;界面层无论 React 还是 egui,都只是“壳 + 原生能力适配器”。

二、为什么 Linux 不直接用 Tauri?

Tauri 是“前端写 React,Rust 写后端”的桌面框架,Windows 和 macOS 上体验很好。但它在 Linux 上的路径是WebView 渲染,也就是必须依赖系统安装的 WebKitGTK(webkit2gtk):

  1. 依赖重且不可控:发行版之间 WebKitGTK 版本差异大,打包者要为不同 distro 处理一堆系统依赖,版本升级还可能随时改变渲染行为;
  2. 双进程 + IPC 的额外开销:UI 跑在 WebView 里,与 Rust 后端之间要走序列化的 command/event 通道。对语音输入这种对“按下—松开—落字”延迟敏感的应用,多一跳就多一分延迟;
  3. 原生集成绕不开:OpenLess 需要全局热键边沿事件、前台焦点/工作区感知、fcitx5 输入法插件、系统钥匙环……这些能力无论哪种 UI 框架都得写原生代码,WebView 方案省不掉,却还要再背一层渲染栈。

所以团队做了一个干净的切分:Linux 端 UI 与后端同进程,直接走类型化的 Rust 接口,不经 IPC(数据流说明):

egui UI → LinuxHost(snapshot / subscribe / drain_events)→ 共享 Core

egui 正是为这种场景而生的 Rust 即时模式 GUI 框架:编译进二进制、零 Web 依赖、与后端同进程调用,一个 ELF 可执行文件 + deb/rpm/AppImage 就能交付。

三、egui 原生 UI 是怎么搭起来的

1. 一份共享核心,两端各自注入

Core 通过注入接口(openless-core/src/ports.rs)声明它需要什么平台能力:AudioRecorder(录音)、TextInserter(文本插入)、CredentialStore(凭据)、LinuxHostActions(系统动作)等。Linux 端在 backend.rs 用LinuxBackendBuilder::from_shared_providers(...)组装运行时,注入 CPAL 录音、Secret Service 凭据、fcitx5 输入等原生实现。

纪律是:业务规则缺失修 Core,平台能力缺失修 Host,UI 层不复制业务规则。

2. 用合同锁定行为

跨端一致性靠 contract/backend-2.0.json 这份机器可读合同:启动快照结构、语义事件清单、顺序与重放规则都由它定义。UI 必须先消费启动快照再渲染,事件经 LinuxHost 的drain_events批量取走交给界面状态机——这套约定见Linux 后端契约。

3. 页面一一对应,不另起炉灶

egui 侧不是“另做一个 Linux 版”,而是把 Windows/macOS 的 React 页面逐项复刻:概览、历史、词汇、风格、市场、翻译、QA 面板、设置弹窗、录音胶囊浮窗,甚至 Less Computer 的独立原生 viewport,都在 2.0 交付记录 中有明确的“React 来源 → egui 实现”对照表。深浅主题、八种界面语言也保持一致。

四、原生 UI 真正的难点:系统集成

UI 框架只是冰山一角,Linux 上真正费功夫的是原生集成(模块清单):

  • 全局热键:X11 走 x11rb/XInput2/RandR,GNOME 用 Shell 扩展,KDE 用 KWin 脚本 + KGlobalAccel 服务,冲突检测与重启恢复都有专门处理(hotkeys.rs);
  • 文本插入与选区:通过 fcitx5 插件 捕获目标、选区与周边上下文,写前校验焦点,密码字段拒读文本;
  • 凭据安全:密钥存入 Secret Service 系统钥匙环(credentials.rs),不进状态文件与诊断日志;
  • 分发:打包脚本 产出 deb / rpm / AppImage 与桌面组件包,AppImage 自动更新需通过 SHA-256 与 minisign 签名校验,失败自动回滚旧版本。

五、质量保障:957 项 Core 测试 + 宿主契约

放弃 WebView 不等于放松验收。交付记录中(08 章):

检查结果
cargo test -p openless-core957 项通过
cargo test -p openless-linux-egui --lib --test host_contract125 项库测试 + 4 项宿主契约通过
fcitx5 插件 CTest目标失效、焦点恢复、密码字段拒绝契约通过
打包校验SHA-256、ELF 依赖、桌面元数据全部通过

并配有 GNOME 42/46 × Plasma 5.27/6、X11/Wayland 共 8 格的人工验收矩阵——因为自动测试无法替代真实桌面行为证据。

六、在 Linux 上体验 OpenLess

构建入口在openless-all/app/目录(WSL Ubuntu 22.04 验证通过),核心步骤(完整命令见安装和构建):

git clone https://gitcode.com/gh_mirrors/op/openless cd openless/all/app npm ci && npm run build cargo build --locked --release -p openless-linux-egui OPENLESS_LINUX_VERSION=2.0.0-Beta.1 bash scripts/package-linux-egui.sh sudo apt install ./OpenLess-Linux-egui-2.0.0-Beta.1-x86_64.deb

安装后在“设置 → 关于与更新”中启用 GNOME/KDE 桌面组件,即可获得全局热键、托盘与浮窗能力。

结语

OpenLess 的 Linux 之路给跨平台桌面项目一个务实的启示:“跨平台”不等于“同一套渲染技术”。把业务核心抽成一份 Rust 库,平台差异留给各端原生宿主,Linux 用 egui 拿到零 Web 依赖、低延迟、易打包的原生体验,Windows/macOS 继续用 Tauri 的生态红利——各司其职,才是 2.0 架构真正想表达的设计。🚀

【免费下载链接】openlessHold a key, speak, release — AI-polished text appears at your cursor in any app. Open-source voice input for macOS & Windows. (按住快捷键说话,松开即得润色后的文字)项目地址: https://gitcode.com/gh_mirrors/op/openless

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询