#wayland-compositor #compositor #wayland #bindings

wlc-with_elogind

Cloudef 的 wlc (Wayland Compositor C 库) 的安全绑定

1 个稳定版本

使用旧版 Rust 2015

2.0.1 2017年12月26日

#1227 in GUI

MIT 许可证

135KB
3K SLoC

wlc 的 Rust 绑定 构建状态 Crates.io Crates.io

完全安全且符合 Rust 风格的 Wayland Compositor 库绑定。

文档

示例

// for a more functional example see /examples/example.rs
use wlc::*;

struct Compositor;
impl Callback for Compositor
{
    fn view_created(&mut self, view: &View) -> bool
    {
        view.set_visibility(view.output().visibility());
        view.bring_to_front();
        view.focus();
        true
    }

    fn view_focus(&mut self, view: &View, focus: bool)
    {
        view.set_state(ViewState::Activated, focus);
    }
}

fn main()
{
    wlc::init(Compositor).unwrap()
}

用法

此 crate 当前需要 nightly Rust 来显式地将某些 ffi 相关的 struct 标记为非 Send

您可以通过功能标志(unsafe-stable)选择退出此行为。请确保不要将 ViewOutput(包括它们的 Weak-Variants)、PositionerWlc 传递给另一个线程。

添加到您的 Cargo.toml 中

wlc = "0.1"

对于稳定版本

wlc = { version = "1.0", features = "unsafe-stable" }

对于静态编译(组合是可能的)

wlc = { version = "1.0", features = "static" }

有关静态构建时的构建依赖项,请参阅 wlc

此外,在构建期间需要 libclang>=3.8 用于代码生成。

如果您的 libclang 在除 /usr/lib 之外的其他路径,则构建二进制文件时必须提供它。

LIBCLANG_PATH=/usr/lib64 cargo build --release

有关更多选项,请参阅 https://github.com/KyleMayes/clang-sys#environment-variables

特性 renderwayland 启用 wlc 提供的可选扩展。

在这种情况下,当使用 unsafe-stable 时,WlcSurfaceWlcSubSurfaceGLES2Renderer 也不应跨线程发送。

关于 rust-wlc 的说明

rust-wlc 存在一些不足之处,而此 crate 尝试避免这些问题。它是没有使用 rust-wlc 的原始源代码部分构建的,可能有自己的问题,但它试图以不同的方式处理以下问题

(以下语句中 wlc 指的是原始的 C 库,而 rust-wlc 指的是替代的 wlc 绑定)

  • wlc 不会将视图和输出结构体的所有权转移到实现合成器。相反,在 view_destroyed/output_destroyed 回调之后,任何视图或输出都可能会被库释放。在我看来,rust-wlc 并没有正确地模拟这种关系。请参见 DESIGN.md 了解该库如何模拟 ViewOutput
  • rust-wlc 允许您使用 extern 函数并直接与 C 代码交互。这种实现几乎需要全局单例以及 lazy_static 的使用。此包为您提供了一个用于自定义合成器的 Trait,并隐藏了这些实现细节。
  • 此包提供了对 wlc 的 userdata API 的更安全的替代方案。它在某些方面仍然是不安全的,并且应该由任何合成器实现进行抽象,但它更容易处理。
  • 公开运行循环函数。
  • 此包实现了 wlc 的大多数渲染和 wayland API。
  • rust-wlc 很可能经过了更好的测试,因为它可能有更多的用户和简单的模拟库(如果我是正确的话)。所以请报告您可能遇到的所有问题。

请注意,我并不试图以任何方式与 rust-wlc 竞争。我也尊重他们所做的工作,他们的窗口管理器 way-cooler 确实是一个有趣的项目。我只是不喜欢他们的设计决策,因此决定构建自己的 wlc 绑定以及自己的 窗口管理器

依赖项

~2–4.5MB
~96K SLoC