diff --git a/src/api/x11/window.rs b/src/api/x11/window.rs index 8cae2beff8..99f2760900 100644 --- a/src/api/x11/window.rs +++ b/src/api/x11/window.rs @@ -406,13 +406,21 @@ impl Window { }, }; - // getting the root window - let root = unsafe { (display.xlib.XDefaultRootWindow)(display.display) }; - display.check_errors().expect("Failed to get root window"); + // getting the parent window; root if None + let parent = match window_attrs.platform_specific.xlib_parent { + Some(ref w) => w.window as ffi::Window, + None => { + let root = unsafe { + (display.xlib.XDefaultRootWindow)(display.display) + }; + display.check_errors().expect("Failed to get root window"); + root + } + }; // creating the color map let cmap = unsafe { - let cmap = (display.xlib.XCreateColormap)(display.display, root, + let cmap = (display.xlib.XCreateColormap)(display.display, parent, visual_infos.visual as *mut _, ffi::AllocNone); display.check_errors().expect("Failed to call XCreateColormap"); @@ -443,7 +451,7 @@ impl Window { // finally creating the window let window = unsafe { - let win = (display.xlib.XCreateWindow)(display.display, root, 0, 0, dimensions.0 as libc::c_uint, + let win = (display.xlib.XCreateWindow)(display.display, parent, 0, 0, dimensions.0 as libc::c_uint, dimensions.1 as libc::c_uint, 0, visual_infos.depth, ffi::InputOutput as libc::c_uint, visual_infos.visual as *mut _, window_attributes, &mut set_win_attr); @@ -564,7 +572,7 @@ impl Window { unsafe { (display.xlib.XSendEvent)( display.display, - root, + parent, 0, ffi::SubstructureRedirectMask | ffi::SubstructureNotifyMask, &mut x_event as *mut _ diff --git a/src/os/unix.rs b/src/os/unix.rs index 61c89bc3ec..60fe45ea0b 100644 --- a/src/os/unix.rs +++ b/src/os/unix.rs @@ -42,8 +42,13 @@ impl WindowExt for Window { /// Additional methods on `WindowBuilder` that are specific to Unix. pub trait WindowBuilderExt { - + /// Sets the Xlib parent window. + fn with_xlib_parent(self, parent: Option) -> WindowBuilder<'a>; } impl<'a> WindowBuilderExt for WindowBuilder<'a> { + fn with_xlib_parent(mut self, parent: Option) -> WindowBuilder<'a> { + self.platform_specific.xlib_parent = parent; + self + } } diff --git a/src/platform/linux/mod.rs b/src/platform/linux/mod.rs index 18658352e9..37ba4fe222 100644 --- a/src/platform/linux/mod.rs +++ b/src/platform/linux/mod.rs @@ -16,7 +16,9 @@ pub use self::api_dispatch::PlatformSpecificWindowBuilderAttributes; mod api_dispatch; #[derive(Default)] -pub struct PlatformSpecificHeadlessBuilderAttributes; +pub struct PlatformSpecificHeadlessBuilderAttributes { + pub xlib_parent: Option, +} pub struct HeadlessContext(OsMesaContext);