5 个稳定版本
使用旧的 Rust 2015
2.0.1 | 2017年2月21日 |
---|---|
2.0.0 | 2017年2月20日 |
1.0.2 | 2017年2月18日 |
0.1.0 |
|
#18 in #compositor
135KB
3K SLoC
wlc 为 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
用于代码生成。
如果您有不在 /usr/lib
路径中的 libclang
,则在构建二进制文件时必须提供它。
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
的使用。这个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