mirror of
https://github.com/italicsjenga/winit-sonoma-fix.git
synced 2024-12-25 23:01:30 +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_title(&window_attrs.title);
|
||||||
|
window.set_decorations(window_attrs.decorations);
|
||||||
|
|
||||||
if window_attrs.visible {
|
if window_attrs.visible {
|
||||||
unsafe {
|
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) {
|
pub fn show(&self) {
|
||||||
unsafe {
|
unsafe {
|
||||||
(self.x.display.xlib.XMapRaised)(self.x.display.display, self.x.window);
|
(self.x.display.xlib.XMapRaised)(self.x.display.display, self.x.window);
|
||||||
|
|
Loading…
Reference in a new issue