#pure #port #immediate #mode #create #rxi

no-std microui

纯 Rust 编写的 MicroUI (即时模式 GUI) 库

7 个版本

0.2.5 2023 年 12 月 22 日
0.2.4 2023 年 1 月 15 日
0.2.2 2022 年 12 月 11 日
0.1.0 2022 年 12 月 2 日

#133GUI

每月 45 次下载

BSD-3-Clause

140KB
2.5K SLoC

Rxi 的 Microui 端口到 Rust

Crate

这是一个将 Rxi 的 MicroUI 转换为 Rust 语言的端口。我们试图使用法尽可能接近原始版本,同时也使其尽可能符合 Rust 的习惯。这个库绝不应该是完整的。

我们使用了 C2Rust 来创建初始代码,并且迭代了 > 60 次以达到现在的状态。有一些错误仍然存在(可能在翻译中丢失!),请谨慎使用!

采用的方法

这是一个相对较小的项目。坦白说,它并没有从 c2rust 开始。

第一步

相反,我们分叉了 microui,并对 C 代码进行了一些修改,以便生成的代码更易于理解。分叉可以在 这里 找到。C 代码的修改主要是将指针跳跃转换为索引跳跃。

C2Rust

除此之外,我们还做了以下事情

  1. 使用稳定版 Rust
    1. 默认情况下,c2rust 生成的代码是使用 nightly 构建的。我们的目标是使用稳定版 Rust 构建,这是我们第一个里程碑。
    2. C2Rust 生成一个假的 main,所以我们移除了样板代码
  2. 开始将 C 枚举(转换为 Rust 时为常量)转换为 Rust 枚举
  3. 使用容器(如果目标是使用 std,则使用 Rust 标准库集合/容器)。对于我们来说,为了忠实于 microui 的原始设计,我们的目标是提供一个零分配的 microui。为此,我们创建了我们自己的非分配容器。
  4. 从 C 字符串转换为 Rust 字符串
  5. 最后,将所有 C 类型转换为与 Rust 兼容的类型。

演示

克隆并构建演示(SDL2 & glow)/ 在 Linux 上测试

$ cd demo-sdl2
$ cargo run

random

如果您想构建最小的可执行文件

$ cd demo-sdl2
$ cargo +nightly run --release -Z build-std=std,panic_abort -Z build-std-features=panic_immediate_abort --target x86_64-unknown-linux-gnu

这将为您提供一个 127K 的可执行文件(带有 std)

注意事项

我们选择使用我们自己的实现来解析/序列化十进制数(不是通用浮点数)。十进制表示形式存储为浮点数。这不是一个通用浮点数解析器/序列化器,算法相当简单。请记住这一点!

依赖项