#wayland-compositor #compositor #wayland #bindings

wlc

Cloudef's wlc (Wayland Compositor C-Library) 的安全绑定

5 个稳定版本

使用旧的 Rust 2015

2.0.1 2017年2月21日
2.0.0 2017年2月20日
1.0.2 2017年2月18日
0.1.0 2017年2月1日

#18 in #compositor


用于 fireplace_lib

MIT 许可证

135KB
3K SLoC

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

完全安全且符合习惯的 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 用于代码生成。

如果您有不在 /usr/lib 路径中的 libclang,则在构建二进制文件时必须提供它。

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_destroyedoutput_destroyed回调后可能被库释放。我认为rust-wlc没有正确地建模这种关系。请参阅DESIGN.md以了解该库如何建模ViewOutput
  • rust-wlc允许您使用extern函数并直接与C代码交互。这种实现几乎需要全局单例和lazy_static的使用。这个crate为您提供了一个用于您自定义合成器的Trait,并隐藏了这些实现细节。
  • 这个crate提供了对wlc的userdata API的安全替代方案。在某些方面仍然是不可安全的,并且应该由任何合成器实现进行抽象,但它更容易处理。
  • 公开运行循环函数。
  • 这个crate实现了wlc的大多数渲染和wayland API。
  • 由于它可能有一些更多用户和一个简单的mocking库(如果正确的话),所以rust-wlc很可能经过了更好的测试。所以请报告您可能发现的任何问题。

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

依赖关系

~0.9–1.6MB
~32K SLoC