Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions content/docs/ecosystem/desktop/choosing.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,13 @@ description: 根据项目阶段、控件需求、稳定性与定制程度选择

## 直接选择言窗

以下情况优先使用`yanxu-gui`:
以下情况优先使用稳定的[`yanxu-gui` 1.0](/ecosystem/desktop/gui/)

- 现有应用已经上线,当前控件和主题足够;
- 希望依赖成熟的 egui 生态与立即模式开发方式;
- 需要言界`0.1.0`尚未提供的复杂控件;
- 不希望在首版阶段承担新 API 迭代成本。
- 需要由 CI 汇总并校验的 Windows、macOS、Linux 六目标原生制品。

## 选择言界

Expand All @@ -26,10 +27,12 @@ description: 根据项目阶段、控件需求、稳定性与定制程度选择

| 问题 | 若回答“是” |
| --- | --- |
| 已有言窗应用是否稳定上线? | 保持言窗 |
| 已有言窗应用是否稳定上线? | 保持言窗 1.x |
| 是否依赖言界首版没有的控件? | 保持言窗或先验证自定义控件 |
| 是否必须控制事件传播和焦点顺序? | 选择言界 |
| 是否要用言据集中描述主题? | 选择言界 |
| 是否要直接调用操作系统句柄? | 两条上层路线都不适合;应贡献言台通用能力 |

建议先复制[完整示例](/ecosystem/desktop/complete-example/)做概念验证,再决定新模块的路线。迁移不要求一次完成;可以保持旧应用使用言窗,让新的独立应用或窗口产品使用言界。
选择言窗时先运行[言窗 1.0 示例](/ecosystem/desktop/gui/);评估言界时复制
[完整言界示例](/ecosystem/desktop/complete-example/)。迁移不要求一次完成,可以让不同
应用分别使用两条路线。
19 changes: 15 additions & 4 deletions content/docs/ecosystem/desktop/compatibility.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,19 @@ title: 版本兼容政策
description: 言界、言台、言序、言包、言据和言窗之间的兼容基线与已知限制。
---

## 0.1.0 基线
## 言窗 1.0 稳定线

| 组件 | 兼容范围 | 已验证版本 |
| --- | --- | --- |
| 言序 | `>=1.1.12` | 1.1.12 |
| 言包 | 格式 2 清单与锁、GUI Bundle | 0.5.x |
| 言窗 | `^1.0`、ABI v2 | 1.0.0 |
| 平台 | Linux GNU、macOS、Windows | x86-64 / ARM64 |

言窗 Git 标签保存源码和清单模板;完整六目标包以 1.0.0 Release 归档发布。Linux GNU
制品需要 glibc 2.39,macOS 公开制品仅做临时签名。精确限制见[言窗 1.0](/ecosystem/desktop/gui/)。

## 言界与言台 0.1 基线

| 组件 | 兼容范围 | 已验证版本 |
| --- | --- | --- |
Expand All @@ -12,11 +24,10 @@ description: 言界、言台、言序、言包、言据和言窗之间的兼容
| 言台 | `^0.1`,ABI v2 | 0.1.0 |
| 言界 | `^0.1` | 0.1.0 |
| 言据 | `^1.1` | 1.1.2 |
| 言窗 | 独立并行路线 | 未修改 |
| 言窗 | 独立并行路线 | 1.0.0 |

言界要求言序`1.1.8`提供 Windows VM 所有者线程的 8 MiB 栈修复;言台本身仍兼容
`>=1.1.7`。新路线不要求言包`0.5.1`或新的言据版本,也不会替换、废弃或强制迁移
`yanxu-gui`。
`>=1.1.7`。新路线不会替换、废弃或强制迁移`yanxu-gui`。

## 版本政策

Expand Down
121 changes: 121 additions & 0 deletions content/docs/ecosystem/desktop/gui.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
---
title: 言窗 1.0
description: 使用 yanxu-gui 1.0 构建具备窗口、布局、控件、事件、画布和原生 Bundle 的跨平台应用。
---

言窗(`yanxu-gui`)1.0.0 是稳定桌面 GUI 包。中文对象 API 通过原生 ABI v2 封装
eframe/egui 与 winit,支持 Windows、macOS、Linux Wayland/X11 的 x86-64 和 ARM64;
应用无需编写 Rust,也不会接触原生指针或框架类型。

## 创建项目

需要言序 1.1.12 和支持 GUI 模板的言包:

```sh
yanbao new 我的窗口 --gui
yanbao run --manifest-path 我的窗口
```

言窗的 Git 标签保存源码和清单模板;六目标生成清单及原生库位于
[1.0.0 Release](https://github.com/yanxulang/yanxu-gui/releases/tag/v1.0.0) 的
`yanxu-gui-six-targets.tar.gz`。进行离线或审计构建时,应展开该官方归档并通过
`--gui-path`提供完整包,不要把只有模板的 Git 标签误当成可执行六目标包:

```sh
yanbao new 我的窗口 --gui --gui-path /已验证/yanxu-gui
```

运行时按锁文件的系统、架构、ABI、大小和 SHA-256 精确选择后端,不下载或猜测缺失动态库。

## 最小应用

```yanxu
引「包:言窗」为 界面;

定 应用 为 界面.应用(「任务清单」);
定 窗口 为 应用.窗口({「标题」:「任务清单」,「宽」:720,「高」:480});
定 布局 为 窗口.纵向布局({「间距」:12,「内边距」:16});
定 提示 为 布局.文字(「尚未保存」);
定 输入 为 布局.输入框({「占位」:「输入任务」});
定 保存 为 布局.按钮(「保存」);

法 保存任务(事件):空 则
提示.内容(「已保存:」 加 输入.取内容());
归 空;

法 关闭应用(事件):空 则
应用.退出();
归 空;

保存.点击(保存任务);
窗口.关闭时(关闭应用);
窗口.显示();
应用.运行();
```

`应用.运行`阻塞当前线程直至退出。关闭布局会释放整个子树;关闭窗口会释放窗口、布局、
控件和回调;事件循环返回时清空模型。句柄绑定创建它的线程和事件循环,跨线程使用会
返回稳定错误。

## 布局、控件与事件

- 纵向、横向、网格、层叠、双向滚动布局,可递归嵌套。
- 文字、按钮、单/多行输入、复选、单选、下拉、滑块、进度、图片、列表、标签页、菜单和画布。
- 点击、变化、焦点、键盘、鼠标、滚轮、窗口、DPI、拖放、自定义事件和有界定时器。
- 中文与扩展 Unicode 字体回退,文字输入交给平台 IME。
- 高频鼠标、尺寸和重绘事件可能合并;回调只在创建 VM 的所有者线程运行。

## 权限

```toml
[权限]
图形界面 = true
剪贴板 = false
文件对话框 = false
```

图形权限不隐式授予剪贴板或文件对话框。对话框只返回路径,不读取文件;应用仍需为后续
文件操作声明路径权限。言窗后端可凭图形权限装载,其他 ABI 扩展仍需单独授权。

## 错误与资源预算

```yanxu
试 则
窗口.标题(「新标题」);
救 所误 则
定 详情 为 界面.错误详情(所误);
若 (详情【「代码」】 等于 「GUI_RESOURCE_CLOSED」)则
言「窗口已经关闭」;
```

程序判断`GUI_*`代码,不匹配消息,也不直接依赖底层`NATIVE_V2`来源。图片宽高各不超过
4,096,解码分配上限 96 MiB;单画布最多 16,384 条命令、估算 64 MiB。资源图、事件队列、
值树和回调均有硬上限。

## Bundle 与正式制品

```sh
yanbao build --manifest-path 我的窗口 --release --bundle
```

Bundle 包含 standalone 运行时、YXB、当前目标原生库、资源、许可证和逐文件摘要。macOS
输出`.app`,Windows 输出 GUI 应用目录,Linux 输出 AppDir。项目签名、公证或商店上传
在最后一次未签名摘要验证之后进行。

官方 1.0.0 Release 归档为 28,404,376 字节,SHA-256:
`2fddeb3db155f6811ea5a0aab2d7dbd567a62ab44da38db2a6b08cf43e32f3e4`。六个制品均验证
ABI v2 导出、架构、大小和摘要;macOS 制品是临时签名,不是 Developer ID 签名。

## 已知限制

- 不支持 musl、WebAssembly、iOS、Android、32 位目标或运行时下载缺失制品。
- Linux GNU 正式制品需要 glibc 2.39。
- 非零布局`伸缩`在 1.0 明确失败;图片只支持受限 PNG/JPEG。
- 渲染像素、字体、剪贴板和对话框外观不保证跨平台完全一致。
- 原生扩展与主进程同址,不提供进程级隔离。

完整 API、架构与安全文档见[yanxulang/yanxu-gui](https://github.com/yanxulang/yanxu-gui)。
49 changes: 27 additions & 22 deletions content/docs/ecosystem/desktop/index.mdx
Original file line number Diff line number Diff line change
@@ -1,36 +1,41 @@
---
title: 图形界面概览
description: 言序原生桌面 GUI 的两条兼容路线、分层边界与首版平台范围
description: 在稳定言窗 1.0 与言界、言台保留模式路线之间选择原生桌面 GUI
---

言序提供两条并行、都受支持的原生桌面路线。现有的**言窗**适合希望快速使用成熟立即模式控件的应用;新的**言界 + 言台**路线把高级控件放在言序代码中,以保留模式控件树换取更强的组合、主题和演进能力。两条路线都创建真正的桌面窗口,不依赖浏览器、Electron、WebView 或 DOM。
言序提供两条并行的原生桌面路线。**言窗 1.0**直接以 ABI v2 封装 eframe/egui 与
winit,适合需要稳定、完整控件和六目标发布的应用;**言界 + 言台**把高级控件保留在
言序代码中,提供保留模式控件树和更强的主题/组合能力。两条路线都创建真实窗口,不
依赖浏览器、Electron、WebView 或 DOM。

![言序原生 GUI 两条路线架构图](/desktop-architecture.svg)

## 新路线的边界

`yanxu-platform`(言台)只负责窗口、事件循环、输入、IME、字体、图片、绘制表面、系统服务和资源生命周期。它不会公开按钮、输入框、列表或标签页。`yanxu-ui`(言界)的控件树、布局、状态、事件路由、文本编辑和绘制命令均由言序实现,上层代码不会接触 HWND、NSWindow、Wayland 或 X11 句柄。
<Cards>
<Card title="言窗 1.0" description="稳定立即模式 GUI、完整控件、资源生命周期与六目标制品" href="/ecosystem/desktop/gui/" />
<Card title="选择路线" description="按稳定性、控件需求、事件模型和迁移成本选择" href="/ecosystem/desktop/choosing/" />
<Card title="言界快速开始" description="体验言序实现的保留模式控件树" href="/ecosystem/desktop/quick-start/" />
<Card title="言台架构" description="理解另一条路线的原生 ABI、事件、绘制和资源边界" href="/ecosystem/desktop/platform-architecture/" />
</Cards>

高频事件通过批次跨越 ABI;鼠标移动、尺寸和重绘会合并,滚轮会累积。整帧绘制使用版本化二进制命令缓冲一次提交。言据用于人类可读的主题和配置,JSON 作为兼容输入;两者都不进入逐帧热路径。
## 平台范围

## 首版范围
| 路线 | 版本 | 最低言序 | Windows | macOS | Linux GNU |
| --- | ---: | ---: | --- | --- | --- |
| 言窗 `yanxu-gui` | 1.0.0 | 1.1.12 | x86-64 / ARM64 | x86-64 / ARM64 | x86-64 / ARM64 |
| 言界 + 言台 | 0.1.x | 1.1.8 | x86-64 / ARM64 | x86-64 / ARM64 | x86-64 / ARM64 |

言台`0.1.0`兼容言序`>=1.1.7`;言界`0.1.0`要求言序`>=1.1.8`,以获得 Windows
图形回调路径的运行时栈修复。新路线支持以下六个原生目标:
言窗 1.0 的 Linux GNU 制品最高需要 glibc 2.39;不支持 musl、WebAssembly、移动平台
或 32 位目标。言界/言台有独立版本和兼容文档,升级一条路线不会隐式升级另一条。

| 系统 | x86-64 | ARM64 | 窗口后端 |
| --- | --- | --- | --- |
| Windows | 支持 | 支持 | winit / Win32 |
| macOS | 支持 | 支持 | winit / AppKit |
| Linux | 支持 | 支持 | winit / Wayland,X11 回退 |
## 两条路线的边界

首版提供应用、多窗口、行列/堆叠/网格/滚动布局、文字、按钮、单行与多行输入、列表、标签页、分割面板、菜单、弹出层、画布、图片、主题、事件路由、焦点、快捷键、中文 IME、剪贴板和文件对话框。
言窗公开应用、窗口、布局、控件、事件、图片、画布、剪贴板和文件对话框对象,控件由
egui 后端实现。言界中的按钮、输入、列表、布局、状态与事件路由由言序代码实现;言台
只负责窗口、输入、IME、字体、绘制表面和系统服务。

<Cards>
<Card title="选择路线" description="按成熟度、定制需求和迁移成本选择言窗或言界" href="/ecosystem/desktop/choosing/" />
<Card title="五分钟开始" description="安装言界并运行一个可输入中文的窗口" href="/ecosystem/desktop/quick-start/" />
<Card title="项目配置" description="固定版本并声明最小权限" href="/ecosystem/desktop/configuration/" />
<Card title="言台架构" description="了解原生 ABI、事件批次、绘制和资源边界" href="/ecosystem/desktop/platform-architecture/" />
</Cards>
两条路线不能在同一个原生窗口混用控件树,也不公开操作系统句柄。可在不同应用中并存,
迁移应按独立产品或窗口渐进完成。

源码与发布位于[言台仓库](https://github.com/yanxulang/yanxu-platform)和[言界仓库](https://github.com/yanxulang/yanxu-ui)。既有[言窗仓库](https://github.com/yanxulang/yanxu-gui)继续维护兼容性。
稳定言窗源码与 Release 位于[yanxu-gui](https://github.com/yanxulang/yanxu-gui)。另一条
路线位于[yanxu-platform](https://github.com/yanxulang/yanxu-platform)和
[yanxu-ui](https://github.com/yanxulang/yanxu-ui)。
1 change: 1 addition & 0 deletions content/docs/ecosystem/desktop/meta.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
"index",
"routes",
"choosing",
"gui",
"quick-start",
"first-window",
"configuration",
Expand Down
6 changes: 4 additions & 2 deletions content/docs/ecosystem/desktop/migration.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@ title: 从言窗迁移
description: 保持现有言窗应用可用,并按独立页面或新项目渐进采用言界。
---

迁移不是升级前置条件。`yanxu-gui`继续维护,新增言台和言界没有修改它的源码、清单或 API。稳定上线的言窗应用可以原样保留。
迁移不是升级前置条件。`yanxu-gui`已有独立的 1.0 稳定线,新增言台和言界不会替换它。
现有言窗应用应先按[言窗 1.0](/ecosystem/desktop/gui/)升级并锁定公开 Release 制品,再决定
是否评估另一条编程模型。

## 概念映射

Expand All @@ -17,7 +19,7 @@ description: 保持现有言窗应用可用,并按独立页面或新项目渐

## 推荐步骤

1. 保留原言窗分支和发布版本,不修改已上线窗口
1. 保留原言窗发布版本和回归测试,先完成 1.0 标签、清单和原生制品升级
2. 用[完整示例](/ecosystem/desktop/complete-example/)建立独立言界试验项目。
3. 先迁移数据模型和业务命令,再用行/列/网格重建布局。
4. 把立即模式条件分支改为控件属性、状态绑定和事件回调。
Expand Down
10 changes: 5 additions & 5 deletions content/docs/ecosystem/desktop/routes.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ description: 比较现有立即模式言窗与新的言序保留模式言界路
| --- | --- | --- |
| 控件实现 | egui/eframe 后端提供 | 言序代码提供 |
| 模型 | 立即模式 | 保留模式控件树 |
| 成熟度 | 现有稳定路线 | 新的`0.1.0`路线 |
| 成熟度 | 稳定`1.0.0`路线 | 独立的`0.1.x`路线 |
| 自定义控件 | 围绕 egui API 扩展 | 组合控件、渲染树或画布命令 |
| 布局与事件 | 后端框架语义 | 言序统一的布局、捕获/目标/冒泡 |
| 原生边界 | 包直接封装 egui/eframe/winit | 言界只调用言台平台原语 |
Expand All @@ -19,8 +19,8 @@ description: 比较现有立即模式言窗与新的言序保留模式言界路

## 兼容承诺

新增言台和言界没有修改言包`0.5.0`、言据`1.1.2`或言窗。六目标验收确认 Windows
原生回调路径需要言序`1.1.8`的运行时栈修复;该补丁保持语言规范、ABI、YXB 和既有源码
兼容。两个 GUI 包可以在不同应用中并存;首版不支持在同一原生窗口内混合两棵控件树。
言窗 1.0 要求言序 1.1.12、格式 2 清单和 ABI v2;言界 0.1.x 有自己的兼容线。两个 GUI
包可以在不同应用中并存;不支持在同一原生窗口内混合两棵控件树。

若已有言窗项目运行稳定,可以继续维护。只有当新页面需要保留状态、深度主题化、可组合控件、确定的事件传播或将控件逻辑留在言序层时,才需要评估言界。
若已有言窗项目,应先升级到公开 1.0 制品并保持兼容线。只有当新页面需要保留状态、
深度主题化、可组合控件、确定的事件传播或将控件逻辑留在言序层时,才评估言界。
8 changes: 5 additions & 3 deletions content/docs/ecosystem/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,10 @@ description: 了解在语言核心之外独立版本化、独立发布的官方
<Cards>
<Card title="言据" description="中文结构化数据格式、校验、转换、流与错误模型" href="/ecosystem/yanju/" />
<Card title="Web 与网络" description="言枢、言标、安全 HTML、HTTP/1.1 与完整参考项目" href="/ecosystem/web/" />
<Card title="第三方包" description="日志、验证、日期时间、数据库、命令行与测试工具" href="/ecosystem/libraries/" />
<Card title="桌面应用" description="按需了解言窗与言界两条原生桌面路线" href="/ecosystem/desktop/" />
<Card title="21 个稳定库" description="基础、网络、数据库、ORM、测试、GUI 与发布指南" href="/ecosystem/libraries/" />
<Card title="桌面应用" description="使用言窗 1.0,或了解言界与言台的独立保留模式路线" href="/ecosystem/desktop/" />
</Cards>

选择生态包前先核对其 Release、最低核心版本、锁定来源、权限和测试范围。核心版本号不能代替生态包自己的稳定性声明。
选择生态包前先核对其 Release、最低核心版本、锁定来源、权限和测试范围。核心版本号不能
代替生态包自己的稳定性声明。准备发布自己的库时,遵循
[第三方库编写指南](/ecosystem/libraries/authoring/)。
Loading