如何使用 glutin 进行窗口覆盖重定向? [英] How can I make a window override-redirect with glutin?

查看:30
本文介绍了如何使用 glutin 进行窗口覆盖重定向?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm creating a program that uses glutin, and I want to provide a command-line flag to make the window override-redirect so it can be used as a desktop wallpaper for certain window managers that don't support the desktop window type.

我进行了大量研究,并使用 glutin 提供的 xlib 显示和窗口,设法拼凑出我认为可行的代码块.这是我现有的代码:

I've done a lot of research and managed to cobble together a block of code that I thought would work, using the provided xlib display and window from glutin. Here is my existing code:

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,
        }
    );
}

它没有给我任何错误,并且与其余代码一起编译和运行良好,但它不会像我想要的那样使窗口覆盖重定向.

It doesn't give me any errors, and compiles and runs fine with the rest of the code, but it doesn't make the window override-redirect like I want to.

推荐答案

我想通了.覆盖重定向仅在映射窗口时发生,所以如果我取消映射并再次映射它,它就会起作用!

I figured it out. The override-redirect only takes place when the window is mapped, so if I unmap it and map it again then it works!

这是现在的代码:

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);
}

这篇关于如何使用 glutin 进行窗口覆盖重定向?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆