rust 直接调用X11

最后发布时间:2026-02-14 10:38:16 浏览量:

完全可以,Rust 是可以 直接调用 X11 的 C API 的,但方式和注意点稍微不同。下面我详细说明:


1. 调用方式

Rust 与 C 库交互主要通过 FFI(Foreign Function Interface),可以使用 extern "C" 声明 C 函数。

方式一:直接绑定 X11 C 函数

# Cargo.toml
[dependencies]
libc = "0.2"  # 提供 C 类型
extern crate libc;

use libc::{c_char, c_int};
use std::ptr;

#[link(name = "X11")]  // 链接 libX11.so
extern "C" {
    fn XOpenDisplay(display_name: *const c_char) -> *mut libc::c_void;
    fn XCloseDisplay(display: *mut libc::c_void) -> c_int;
}

fn main() {
    unsafe {
        let display = XOpenDisplay(ptr::null());
        if display.is_null() {
            println!("Cannot open X display");
            return;
        }
        println!("X display opened successfully");

        XCloseDisplay(display);
        println!("X display closed");
    }
}
  • #[link(name = "X11")] 会告诉 Rust 链接系统的 libX11.so
  • 所有 C 函数调用都必须 unsafe
  • libc 提供了 C 标准类型(如 c_int, c_char

方式二:使用现成的 Rust crate

Rust 社区提供了 X11 的 Rust 绑定,可以直接用,不必手写 FFI:

  • x11-rs: 纯 Rust 的 X11 绑定

    [dependencies]
    x11 = "2.18.0"
    
  • 示例:

    extern crate x11;
    
    use x11::xlib::*;
    use std::ptr;
    
    fn main() {
        unsafe {
            let display = XOpenDisplay(ptr::null());
            if display.is_null() {
                println!("Cannot open X display");
                return;
            }
            let screen = XDefaultScreen(display);
            let root = XRootWindow(display, screen);
            println!("Screen: {}, Root Window: {}", screen, root);
    
            XCloseDisplay(display);
        }
    }
    
  • 优势

    • 已经封装了 X11 C API
    • 可读性更好,减少 FFI 错误

2. 注意事项

  1. 所有 X11 C API 调用都必须 unsafe

    • Rust 编译器无法保证内存安全
  2. 要安装 X11 开发库

    sudo apt install libx11-dev
    
  3. 绘制和事件处理

    • 如果直接调用 X11,你需要自己管理:

      • 窗口创建 (XCreateSimpleWindow)
      • 绘图 (XDrawLine, XFillRectangle)
      • 事件循环 (XNextEvent)
    • 类似于纯 C Xlib 编程

  4. 跨平台

    • 直接调用 X11 只能在 Linux(或者 Unix)上工作
    • 如果想跨平台,建议用 winitegui 封装

3. 总结

  • Rust 可以直接调用 X11:

    • FFI + X11 C API
    • x11-rs crate(更方便)
  • 优点:

    • 完全控制 X11 窗口和事件
    • 无需依赖 GUI 库(纯原生 X11)
  • 缺点:

    • 编程复杂,需要管理事件循环和绘图
    • 只能在 X11 环境下运行
    • 安全性和 Rust 的安全模型无关,需要手动管理

如果你愿意,我可以帮你写一个 完整的 Rust + X11 最小窗口示例,带事件循环、绘制矩形和关闭窗口,几乎就是 Rust 版 Xlib 入门程序。

你希望我写吗?