child window creation improvement

This commit is contained in:
k-brac 2016-11-28 13:50:07 +01:00
parent 5a09e8ba21
commit 2b25bf1480
4 changed files with 31 additions and 3 deletions

View file

@ -1,3 +1,5 @@
#![cfg(target_os = "windows")]
extern crate winit;
use std::thread;
use winit::os::windows::WindowBuilderExt;
@ -5,7 +7,10 @@ use winit::os::windows::WindowBuilderExt;
fn resize_callback(width: u32, height: u32) {
println!("Window resized to {}x{}", width, height);
}
/**
* Creates a main window and a child within it and handle their events separetely.
* Currently windows only
*/
fn main() {
let window = winit::WindowBuilder::new()
.with_title("A fantastic window!")
@ -19,6 +24,7 @@ fn main() {
.with_title("child window!")
.with_window_resize_callback(resize_callback)
.with_decorations(false)
.with_dimensions(100, 100)
.with_parent_window(proxy)
.build()
.unwrap();

View file

@ -4,6 +4,8 @@ use libc;
use Window;
use WindowBuilder;
use window;
use winapi;
use platform;
/// Additional methods on `Window` that are specific to Windows.
pub trait WindowExt {
@ -35,3 +37,11 @@ impl WindowBuilderExt for WindowBuilder {
self
}
}
impl WindowBuilderExt {
/// Creates a new WindowProxy from a winapi::HWND
#[inline]
pub fn create_window_proxy_from_handle(handle: winapi::HWND) -> window::WindowProxy {
window::WindowProxy::create_proxy(platform::WindowProxy{hwnd: handle})
}
}

View file

@ -133,7 +133,7 @@ unsafe fn init(title: Vec<u16>, window: &WindowAttributes, pl_attribs: PlatformS
style | winapi::WS_CLIPSIBLINGS | winapi::WS_CLIPCHILDREN,
x.unwrap_or(winapi::CW_USEDEFAULT), y.unwrap_or(winapi::CW_USEDEFAULT),
width.unwrap_or(winapi::CW_USEDEFAULT), height.unwrap_or(winapi::CW_USEDEFAULT),
pl_attribs.parent.map_or(ptr::null_mut(), |v| v.proxy.hwnd),
pl_attribs.parent.map_or(ptr::null_mut(), |v| v.get_proxy_data().hwnd),
ptr::null_mut(), kernel32::GetModuleHandleW(ptr::null()),
ptr::null_mut());

View file

@ -361,7 +361,7 @@ impl Window {
/// threads.
#[derive(Clone)]
pub struct WindowProxy {
pub proxy: platform::WindowProxy,
proxy: platform::WindowProxy,
}
impl WindowProxy {
@ -372,6 +372,18 @@ impl WindowProxy {
pub fn wakeup_event_loop(&self) {
self.proxy.wakeup_event_loop();
}
/// Returns the platform specific proxy data
#[inline]
pub fn get_proxy_data(&self) -> &platform::WindowProxy {
&self.proxy
}
/// Create a WindowProxy by directly setting its platform specific data
#[inline]
pub fn create_proxy(data: platform::WindowProxy) -> WindowProxy {
WindowProxy {proxy: data}
}
}
/// An iterator for the `poll_events` function.
pub struct PollEventsIterator<'a>(platform::PollEventsIterator<'a>);