Add set_decorations method to Window (#365)
This has been stubbed on all platforms other than X11. The X11 implementation has also been revised to toggle correctly, as it was previously only able to remove decorations.
This commit is contained in:
parent
b36a8e010f
commit
463f316cb8
9 changed files with 79 additions and 37 deletions
|
|
@ -44,7 +44,7 @@ impl EventsLoop {
|
|||
MonitorId
|
||||
}
|
||||
|
||||
|
||||
|
||||
pub fn poll_events<F>(&mut self, mut callback: F)
|
||||
where F: FnMut(::Event)
|
||||
{
|
||||
|
|
@ -101,7 +101,7 @@ impl EventsLoop {
|
|||
None
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
if let Some(event) = e {
|
||||
callback(event);
|
||||
}
|
||||
|
|
@ -288,6 +288,11 @@ impl Window {
|
|||
// Android has single screen maximized apps so nothing to do
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn set_decorations(&self, _decorations: bool) {
|
||||
// N/A
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn get_current_monitor(&self) -> RootMonitorId {
|
||||
RootMonitorId{inner: MonitorId}
|
||||
|
|
|
|||
|
|
@ -517,6 +517,11 @@ impl Window {
|
|||
// iOS has single screen maximized apps so nothing to do
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn set_decorations(&self, _decorations: bool) {
|
||||
// N/A
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn get_current_monitor(&self) -> ::MonitorId {
|
||||
::MonitorId{inner: MonitorId}
|
||||
|
|
@ -693,7 +698,7 @@ fn key_translate_virt(input: [ffi::EM_UTF8; ffi::EM_HTML5_SHORT_STRING_LEN_BYTES
|
|||
"PreviousCandidate" => None,
|
||||
"Process" => None,
|
||||
"SingleCandidate" => None,
|
||||
|
||||
|
||||
"HangulMode" => None,
|
||||
"HanjaMode" => None,
|
||||
"JunjaMode" => None,
|
||||
|
|
|
|||
|
|
@ -354,6 +354,11 @@ impl Window {
|
|||
// iOS has single screen maximized apps so nothing to do
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn set_decorations(&self, _decorations: bool) {
|
||||
// N/A
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn get_current_monitor(&self) -> RootMonitorId {
|
||||
RootMonitorId{inner: MonitorId}
|
||||
|
|
|
|||
|
|
@ -248,7 +248,9 @@ impl Window {
|
|||
pub fn set_maximized(&self, maximized: bool) {
|
||||
match self {
|
||||
&Window::X(ref w) => w.set_maximized(maximized),
|
||||
&Window::Wayland(ref _w) => {},
|
||||
&Window::Wayland(ref _w) => {
|
||||
unimplemented!();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -256,7 +258,19 @@ impl Window {
|
|||
pub fn set_fullscreen(&self, monitor: Option<RootMonitorId>) {
|
||||
match self {
|
||||
&Window::X(ref w) => w.set_fullscreen(monitor),
|
||||
&Window::Wayland(ref _w) => {},
|
||||
&Window::Wayland(ref _w) => {
|
||||
unimplemented!();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn set_decorations(&self, decorations: bool) {
|
||||
match self {
|
||||
&Window::X(ref w) => w.set_decorations(decorations),
|
||||
&Window::Wayland(ref _w) => {
|
||||
unimplemented!();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -432,40 +432,36 @@ impl Window2 {
|
|||
pub fn set_decorations(&self, decorations: bool) {
|
||||
#[repr(C)]
|
||||
struct MotifWindowHints {
|
||||
flags: u32,
|
||||
functions: u32,
|
||||
decorations: u32,
|
||||
input_mode: i32,
|
||||
status: u32,
|
||||
flags: c_ulong,
|
||||
functions: c_ulong,
|
||||
decorations: c_ulong,
|
||||
input_mode: c_long,
|
||||
status: c_ulong,
|
||||
}
|
||||
|
||||
let wm_hints = unsafe {
|
||||
(self.x.display.xlib.XInternAtom)(self.x.display.display, b"_MOTIF_WM_HINTS\0".as_ptr() as *const _, 0)
|
||||
let wm_hints = unsafe { util::get_atom(&self.x.display, b"_MOTIF_WM_HINTS\0") }
|
||||
.expect("Failed to call XInternAtom (_MOTIF_WM_HINTS)");
|
||||
|
||||
let hints = MotifWindowHints {
|
||||
flags: 2, // MWM_HINTS_DECORATIONS
|
||||
functions: 0,
|
||||
decorations: decorations as _,
|
||||
input_mode: 0,
|
||||
status: 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);
|
||||
}
|
||||
unsafe {
|
||||
(self.x.display.xlib.XChangeProperty)(
|
||||
self.x.display.display,
|
||||
self.x.window,
|
||||
wm_hints,
|
||||
wm_hints,
|
||||
32, // struct members are longs
|
||||
ffi::PropModeReplace,
|
||||
&hints as *const _ as *const u8,
|
||||
5 // struct has 5 members
|
||||
);
|
||||
(self.x.display.xlib.XFlush)(self.x.display.display);
|
||||
}
|
||||
|
||||
self.x.display.check_errors().expect("Failed to set decorations");
|
||||
|
|
|
|||
|
|
@ -643,6 +643,11 @@ impl Window2 {
|
|||
unimplemented!()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn set_decorations(&self, _decorations: bool) {
|
||||
unimplemented!()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn get_current_monitor(&self) -> RootMonitorId {
|
||||
unimplemented!()
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ impl Window {
|
|||
{
|
||||
let mut w_attr = Some(w_attr.clone());
|
||||
let mut pl_attr = Some(pl_attr.clone());
|
||||
|
||||
|
||||
let (tx, rx) = channel();
|
||||
|
||||
events_loop.execute_in_thread(move |inserter| {
|
||||
|
|
@ -288,6 +288,11 @@ impl Window {
|
|||
unimplemented!()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn set_decorations(&self, _decorations: bool) {
|
||||
unimplemented!()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn get_current_monitor(&self) -> RootMonitorId {
|
||||
unimplemented!()
|
||||
|
|
@ -298,7 +303,7 @@ impl Drop for Window {
|
|||
#[inline]
|
||||
fn drop(&mut self) {
|
||||
unsafe {
|
||||
// We are sending WM_CLOSE, and our callback will process this by calling DefWindowProcW,
|
||||
// We are sending WM_CLOSE, and our callback will process this by calling DefWindowProcW,
|
||||
// which in turn will send a WM_DESTROY.
|
||||
user32::PostMessageW(self.window.0, winapi::WM_CLOSE, 0, 0);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue