I’ve written this function to set the proptery of my window and it presently does set the value correctly. The issue is that in my testing (on openbox only) which is EWMH compliant it does not follow my dockapp configuration. I assume it is because the property is being set after openbox checks for it. I have no clue how to deal with this though.
fn set_window_props(window: >k::Window, prop_name: &str, prop_values: &Vec<&str>) {
let display = WidgetExt::display(window);
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,
);
}
}
This is how I’m attempting to get it working by using the realize signal but this has been to no avail.
let dock_window = gtk::ApplicationWindow::builder()
.application(app)
.title("edock")
.decorated(false)
.resizable(false)
.css_classes(["edock"])
.build();
dock_window.connect_realize(move |dock_window| {
set_window_props(
dock_window.upcast_ref(),
"_NET_WM_WINDOW_TYPE",
&vec!["_NET_WM_WINDOW_TYPE_DOCK"],
);
set_utf8_props(dock_window.upcast_ref(), "_OB_APP_TYPE", "dock");
dock_window.present();
});
let button_box = gtk::Box::new(gtk::Orientation::Horizontal, 0);
button_box.set_css_classes(&["button"]);
for app in apps {
let button = gtk::Button::new();
button.set_css_classes(&["app"]);
if let Some(icon) = app.icon {
let image = gtk::Image::from_file(&icon);
button.set_child(Some(&image));
}
if let Some(command) = app.command {
button.connect_clicked(move |button| {
app_clicked(command.clone());
button.set_css_classes(&["app_open"]);
});
}
button.set_size_request(button_height, button_height);
button_box.append(&button);
}
dock_window.set_child(Some(&button_box));
WidgetExt::realize(&dock_window);
}