如何使用glutin进行窗口覆盖重定向?

时间:2017-08-06 01:06:41

标签: rust x11

我正在创建一个使用glutin的程序,我想提供一个命令行标志来使窗口覆盖 - 重定向,因此它可以用作某些窗口管理器的桌面墙纸。 t支持桌面窗口类型。

我已经做了很多研究,并设法使用提供的xlib显示和来自glutin的窗口拼凑了我认为可行的代码块。这是我现有的代码:

unsafe {
    use glutin::os::unix::WindowExt;
    let x_connection = std::sync::Arc::<glutin::os::unix::x11::XConnection>::into_raw(display.gl_window().get_xlib_xconnection().unwrap());
    ((*x_connection).xlib.XChangeWindowAttributes)(
        display.gl_window().get_xlib_display().unwrap() as *mut glutin::os::unix::x11::ffi::Display,
        display.gl_window().get_xlib_window().unwrap() as glutin::os::unix::x11::ffi::XID,
        glutin::os::unix::x11::ffi::CWOverrideRedirect,
        &mut glutin::os::unix::x11::ffi::XSetWindowAttributes {
            background_pixmap: 0,
            background_pixel: 0,
            border_pixmap: 0,
            border_pixel: 0,
            bit_gravity: 0,
            win_gravity: 0,
            backing_store: 0,
            backing_planes: 0,
            backing_pixel: 0,
            save_under: 0,
            event_mask: 0,
            do_not_propagate_mask: 0,
            override_redirect: 1,
            colormap: 0,
            cursor: 0,
        }
    );
}

它没有给我任何错误,并且编译并运行其余的代码,但它并没有像我想的那样使窗口覆盖 - 重定向。

1 个答案:

答案 0 :(得分:1)

我明白了。覆盖重定向仅在窗口映射时发生,因此如果我取消映射并再次映射它,那么它就可以工作了!

现在是代码:

unsafe {
    use glutin::os::unix::WindowExt;
    use glutin::os::unix::x11::XConnection;
    use glutin::os::unix::x11::ffi::{Display, XID, CWOverrideRedirect, XSetWindowAttributes};
    let x_connection = std::sync::Arc::<XConnection>::into_raw(display.gl_window().get_xlib_xconnection().unwrap());
    let x_display = display.gl_window().get_xlib_display().unwrap() as *mut Display;
    let x_window = display.gl_window().get_xlib_window().unwrap() as XID;
    ((*x_connection).xlib.XChangeWindowAttributes)(
        x_display,
        x_window,
        CWOverrideRedirect,
        &mut XSetWindowAttributes {
            background_pixmap: 0,
            background_pixel: 0,
            border_pixmap: 0,
            border_pixel: 0,
            bit_gravity: 0,
            win_gravity: 0,
            backing_store: 0,
            backing_planes: 0,
            backing_pixel: 0,
            save_under: 0,
            event_mask: 0,
            do_not_propagate_mask: 0,
            override_redirect: 1,
            colormap: 0,
            cursor: 0,
        }
    );
    ((*x_connection).xlib.XUnmapWindow)(x_display, x_window);
    ((*x_connection).xlib.XMapWindow)(x_display, x_window);
}