Как установить подсказки окна X11 с помощью gtk4-rs?

Я пытаюсь написать приложение GTK4 в ржавчине, которое должно соответствовать частям спецификации Extended Window Manager Hints , но для этого мне нужно иметь возможность получать и устанавливать подсказки X11. В частности, я хочу установить_NET_WM_WINDOW_TYPE.

Если бы мне пришлось создать окно следующим образом, как бы мне получить / установить подсказки окна X11?

      let app = Application::new(Some("id"), Default::default());
let window = ApplicationWindow::new(app);

1 ответ

Решение

После нескольких дней проб и ошибок я пришел к следующему решению:

      use gdk_x11::x11::xlib::{PropModeReplace, XChangeProperty, XInternAtom, XA_ATOM};

fn set_window_props(window: &gtk::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,
        );
    }
}

Это установит замену значений типа XA_ATOM свойства X11 Window prop_name с атомными значениями prop_values.

Для установки свойств типа utf8 гораздо проще и чище использовать gdk4_x11::X11Surface::set_utf8_property.

Другие вопросы по тегам