#xlib #xcb #api #tiny #wrapper #error #hook

tiny-xlib

Rust 的一个小巧的 Xlib 包装器

5 个版本

0.2.3 2024 年 5 月 28 日
0.2.2 2023 年 7 月 2 日
0.2.1 2023 年 6 月 15 日
0.2.0 2023 年 6 月 15 日
0.1.0 2023 年 5 月 26 日

#51GUI

Download history 7798/week @ 2024-04-19 9062/week @ 2024-04-26 9990/week @ 2024-05-03 7925/week @ 2024-05-10 9149/week @ 2024-05-17 11017/week @ 2024-05-24 11749/week @ 2024-05-31 23867/week @ 2024-06-07 25250/week @ 2024-06-14 26185/week @ 2024-06-21 22727/week @ 2024-06-28 18564/week @ 2024-07-05 21245/week @ 2024-07-12 22006/week @ 2024-07-19 19373/week @ 2024-07-26 17267/week @ 2024-08-02

83,454 每月下载量
14 个Crates中(通过softbuffer)使用

MIT OR Apache-2.0 OR Zlib

35KB
454

tiny-xlib

一组绑定到 Xlib 库的绑定。

目前处理 Xlib 的主要库是 x11-dl 库。然而,存在三个主要问题。

  1. 你不应该在 2023 年使用 Xlib。 Xlib 是过时的代码,即使这样也不足以说明它锁定的 API 决策有多糟糕。它有一个全局的错误钩子,线程安全性一团糟,而且存在许多不稳定性,几乎像瑞士奶酪一样。你不应该使用 Xlib。如果你 必须 使用 Xlib,你应该只使用更稳定的 XCB 库,或者更理想的是像 x11rb 这样的东西。然后,你使用 Display 指针进行任何过时的 API,然后使用 XCBx11rb 做其他所有事情。是的,我刚刚把 GLX 称为一个过时的 API。现在是 2020 年代。除了旧机器之外,Vulkanwgpu 到处都是。更不用说,它们支持 XCB

  2. 即使你成功使用 x11-dl 而没有遇到遗留API的问题,它也是一个庞大的crate。 Xlib 提供了很多函数,其中大部分在21世纪都是不必要的。即使你不使用这些函数而只坚持使用 XCB,你仍然要为其付费。使用 x11-dl 的二进制文件需要为其二进制和内存空间分配大量的空间。即使是在发布构建中,我也记录了 x11-dl 占用了高达七个百分比的二进制空间。

  3. 全局错误处理。 Xlib 有一个单独的全局错误钩子。这让人联想到Unix信号处理API,因为它使得创建高度模块化的程序变得困难,因为这些程序会在错误处理程序之间相互竞争。然而,与信号处理API不同,没有方法可以告诉你是否在替换现有的错误钩子。

tiny-xlib 旨在解决所有这些问题。它提供了一个围绕 Xlib 的安全API,有利于将其传递给 XCB API和遗留的 Xlib API。该库只导入绝对必要的函数。此外,它还提供了一个用于以安全、模块化方式处理错误的通用API。

功能

  • 围绕 Xlib 的安全API。请参阅 Display 结构。
  • 最小依赖集。
  • 实现了 AsRawXcbConnection,允许它与 XCB API一起使用。
  • 模块化错误处理。

非功能特性

  • 除了打开 Display 和处理错误之外的所有API。如果这个库不支持某些功能,那可能是故意的。你应该使用 XCBx11rb。这包括
  • 窗口管理。
  • 除了 Xlib-xcb 之外的所有扩展。
  • IME处理。
  • 硬件渲染。

示例

use as_raw_xcb_connection::AsRawXcbConnection;
use tiny_xlib::Display;

use x11rb::connection::Connection;
use x11rb::xcb_ffi::XCBConnection;

// Open a display.
let display = Display::new(None)?;

// Get the XCB connection.
let xcb_conn = display.as_raw_xcb_connection();

// Use that pointer to create a new XCB connection.
let xcb_conn = unsafe {
    XCBConnection::from_raw_xcb_connection(xcb_conn.cast(), false)?
};

// Register a handler for X11 errors.
tiny_xlib::register_error_handler(Box::new(|_, error| {
    println!("X11 error: {:?}", error);
    false
}));

// Do whatever you want with the XCB connection.
loop {
    println!("Event: {:?}", xcb_conn.wait_for_event()?);
}

许可证

许可为以下之一

任选其一。

贡献

除非你明确声明,否则任何有意提交以包含在你所定义的工作中的贡献,根据Apache-2.0许可证,应如上所述双重许可,不附加任何额外条款或条件。

依赖

~0.3–5MB