1 个稳定版本
使用旧版 Rust 2015
2.0.1 | 2017年12月26日 |
---|
#1227 in GUI
135KB
3K SLoC
wlc 的 Rust 绑定

完全安全且符合 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)选择退出此行为。请确保不要将 View
、Output
(包括它们的 Weak-Variants)、Positioner
或 Wlc
传递给另一个线程。
添加到您的 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。
特性 render
和 wayland
启用 wlc 提供的可选扩展。
在这种情况下,当使用 unsafe-stable
时,WlcSurface
、WlcSubSurface
和 GLES2Renderer
也不应跨线程发送。
关于 rust-wlc 的说明
rust-wlc 存在一些不足之处,而此 crate 尝试避免这些问题。它是没有使用 rust-wlc 的原始源代码部分构建的,可能有自己的问题,但它试图以不同的方式处理以下问题
(以下语句中 wlc
指的是原始的 C 库,而 rust-wlc
指的是替代的 wlc 绑定)
- wlc 不会将视图和输出结构体的所有权转移到实现合成器。相反,在
view_destroyed
/output_destroyed
回调之后,任何视图或输出都可能会被库释放。在我看来,rust-wlc 并没有正确地模拟这种关系。请参见 DESIGN.md 了解该库如何模拟View
和Output
。 - 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