我正在尝试用 rust 编写一个 GTK4 应用程序,它应该符合扩展窗口管理器提示规范的部分内容,但为此我需要能够获取和设置 X11 提示。特别是,我想设置_NET_WM_WINDOW_TYPE
.
如果我要按如下方式创建一个窗口,我将如何获取/设置 X11 窗口提示?
let app = Application::new(Some("id"), Default::default());
let window = ApplicationWindow::new(app);
我正在尝试用 rust 编写一个 GTK4 应用程序,它应该符合扩展窗口管理器提示规范的部分内容,但为此我需要能够获取和设置 X11 提示。特别是,我想设置_NET_WM_WINDOW_TYPE
.
如果我要按如下方式创建一个窗口,我将如何获取/设置 X11 窗口提示?
let app = Application::new(Some("id"), Default::default());
let window = ApplicationWindow::new(app);
经过几天的反复试验,我得出了以下解决方案:
use gdk_x11::x11::xlib::{PropModeReplace, XChangeProperty, XInternAtom, XA_ATOM};
fn set_window_props(window: >k::Window, prop_name: &str, prop_values: &Vec<&str>) {
let display = window.display();
let surface = window.surface().unwrap();
let prop_name_cstr = CString::new(prop_name).unwrap();
let prop_values_cstr: Vec<CString> = prop_values
.iter()
.map(|val| CString::new(*val).unwrap())
.collect();
unsafe {
let xid: xlib::Window = surface.unsafe_cast::<X11Surface>().xid();
let xdisplay: *mut xlib::Display = display.unsafe_cast::<X11Display>().xdisplay();
let prop_name_atom = XInternAtom(xdisplay, prop_name_cstr.as_ptr(), xlib::False);
let mut prop_values_atom: Vec<u64> = prop_values_cstr
.into_iter()
.map(|cstr| XInternAtom(xdisplay, cstr.as_ptr(), xlib::False))
.collect();
let num_values = prop_values_atom.len();
let prop_values_c = prop_values_atom.as_mut_ptr();
XChangeProperty(
xdisplay,
xid,
prop_name_atom,
XA_ATOM,
32,
PropModeReplace,
prop_values_c as *const u8,
num_values as i32,
);
}
}
这将设置用原子值替换X11 Window 属性的类型XA_ATOM
值。prop_name
prop_values
对于设置 utf8 类型的属性,使用起来更加简单明了gdk4_x11::X11Surface::set_utf8_property
。