From 2b25bf1480206a5eae672719034f9b527d0e77e2 Mon Sep 17 00:00:00 2001 From: k-brac Date: Mon, 28 Nov 2016 13:50:07 +0100 Subject: [PATCH] child window creation improvement --- examples/child_window.rs | 8 +++++++- src/os/windows.rs | 10 ++++++++++ src/platform/windows/init.rs | 2 +- src/window.rs | 14 +++++++++++++- 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/examples/child_window.rs b/examples/child_window.rs index 05469f4c..e48042d2 100644 --- a/examples/child_window.rs +++ b/examples/child_window.rs @@ -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(); diff --git a/src/os/windows.rs b/src/os/windows.rs index dd4e595e..2eae8d48 100644 --- a/src/os/windows.rs +++ b/src/os/windows.rs @@ -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}) + } +} diff --git a/src/platform/windows/init.rs b/src/platform/windows/init.rs index fcfce2f4..4698dfc5 100644 --- a/src/platform/windows/init.rs +++ b/src/platform/windows/init.rs @@ -133,7 +133,7 @@ unsafe fn init(title: Vec, 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()); diff --git a/src/window.rs b/src/window.rs index 75ef53cc..3633966c 100644 --- a/src/window.rs +++ b/src/window.rs @@ -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>);