mirror of
https://github.com/italicsjenga/winit-sonoma-fix.git
synced 2024-12-25 06:41:31 +11:00
Support disabling window decorations in X11
This uses the incredibly old and ugly _MOTIF_WM_HINTS property: http://stackoverflow.com/questions/5134297/xlib-how-does-this-removing-window-decoration-work Using _NET_WM_WINDOW_TYPE from the Extended Window Manager Hints spec (https://specifications.freedesktop.org/wm-spec/wm-spec-latest.html) would be preferred, but it requires knowing up front what the user intends their window to be. _MOTIF_WM_HINTS should work for now.
This commit is contained in:
parent
503df767dc
commit
0b530b026d
|
@ -596,6 +596,7 @@ impl Window {
|
|||
};
|
||||
|
||||
window.set_title(&window_attrs.title);
|
||||
window.set_decorations(window_attrs.decorations);
|
||||
|
||||
if window_attrs.visible {
|
||||
unsafe {
|
||||
|
@ -653,6 +654,48 @@ impl Window {
|
|||
|
||||
}
|
||||
|
||||
pub fn set_decorations(&self, decorations: bool) {
|
||||
#[repr(C)]
|
||||
struct MotifWindowHints {
|
||||
flags: u32,
|
||||
functions: u32,
|
||||
decorations: u32,
|
||||
input_mode: i32,
|
||||
status: u32,
|
||||
}
|
||||
|
||||
let wm_hints = unsafe {
|
||||
(self.x.display.xlib.XInternAtom)(self.x.display.display, b"_MOTIF_WM_HINTS\0".as_ptr() as *const _, 0)
|
||||
};
|
||||
self.x.display.check_errors().expect("Failed to call XInternAtom");
|
||||
|
||||
if !decorations {
|
||||
let hints = MotifWindowHints {
|
||||
flags: 2, // MWM_HINTS_DECORATIONS
|
||||
functions: 0,
|
||||
decorations: 0,
|
||||
input_mode: 0,
|
||||
status: 0,
|
||||
};
|
||||
|
||||
unsafe {
|
||||
(self.x.display.xlib.XChangeProperty)(
|
||||
self.x.display.display, self.x.window,
|
||||
wm_hints, wm_hints, 32 /* Size of elements in struct */,
|
||||
ffi::PropModeReplace, &hints as *const MotifWindowHints as *const u8,
|
||||
5 /* Number of elements in struct */);
|
||||
(self.x.display.xlib.XFlush)(self.x.display.display);
|
||||
}
|
||||
} else {
|
||||
unsafe {
|
||||
(self.x.display.xlib.XDeleteProperty)(self.x.display.display, self.x.window, wm_hints);
|
||||
(self.x.display.xlib.XFlush)(self.x.display.display);
|
||||
}
|
||||
}
|
||||
|
||||
self.x.display.check_errors().expect("Failed to set decorations");
|
||||
}
|
||||
|
||||
pub fn show(&self) {
|
||||
unsafe {
|
||||
(self.x.display.xlib.XMapRaised)(self.x.display.display, self.x.window);
|
||||
|
|
Loading…
Reference in a new issue