diff options
author | Pierre Krieger <pierre.krieger1708@gmail.com> | 2015-05-15 15:19:33 +0200 |
---|---|---|
committer | Pierre Krieger <pierre.krieger1708@gmail.com> | 2015-05-24 09:10:44 +0200 |
commit | 81314f91d82dff07f6da3409dd1280a68d4dcd60 (patch) | |
tree | 6619e34132f1b1ca5d8174e28a3ae1508340c1fb /src | |
parent | 1377f276b7b64a1e75aa43da7efdea9a81155397 (diff) | |
download | glutin-81314f91d82dff07f6da3409dd1280a68d4dcd60.tar.gz glutin-81314f91d82dff07f6da3409dd1280a68d4dcd60.zip |
Add API for transparency and decorations and add support for win32
Diffstat (limited to 'src')
-rw-r--r-- | src/api/win32/callback.rs | 1 | ||||
-rw-r--r-- | src/api/win32/init.rs | 23 | ||||
-rw-r--r-- | src/lib.rs | 6 | ||||
-rw-r--r-- | src/window.rs | 14 |
4 files changed, 42 insertions, 2 deletions
diff --git a/src/api/win32/callback.rs b/src/api/win32/callback.rs index 1ea95a5..86d5f1c 100644 --- a/src/api/win32/callback.rs +++ b/src/api/win32/callback.rs @@ -44,6 +44,7 @@ fn send_event(input_window: winapi::HWND, event: Event) { /// This is the callback that is called by `DispatchMessage` in the events loop. /// /// Returning 0 tells the Win32 API that the message has been processed. +// FIXME: detect WM_DWMCOMPOSITIONCHANGED and call DwmEnableBlurBehindWindow if necessary pub unsafe extern "system" fn callback(window: winapi::HWND, msg: winapi::UINT, wparam: winapi::WPARAM, lparam: winapi::LPARAM) -> winapi::LRESULT diff --git a/src/api/win32/init.rs b/src/api/win32/init.rs index fb4e181..1252354 100644 --- a/src/api/win32/init.rs +++ b/src/api/win32/init.rs @@ -102,7 +102,7 @@ unsafe fn init(title: Vec<u16>, builder: BuilderAttribs<'static>, } // computing the style and extended style of the window - let (ex_style, style) = if builder.monitor.is_some() { + let (ex_style, style) = if builder.monitor.is_some() || builder.decorations == false { (winapi::WS_EX_APPWINDOW, winapi::WS_POPUP | winapi::WS_CLIPSIBLINGS | winapi::WS_CLIPCHILDREN) } else { (winapi::WS_EX_APPWINDOW | winapi::WS_EX_WINDOWEDGE, @@ -214,6 +214,27 @@ unsafe fn init(title: Vec<u16>, builder: BuilderAttribs<'static>, } }; + // making the window transparent + if builder.transparent { + let bb = winapi::DWM_BLURBEHIND { + dwFlags: 0x1, // FIXME: DWM_BB_ENABLE; + fEnable: 1, + hRgnBlur: ptr::null_mut(), + fTransitionOnMaximized: 0, + }; + + let dll = kernel32::LoadLibraryA(b"dwmapi.dll\0".as_ptr() as *const _); + if !dll.is_null() { + let pr = kernel32::GetProcAddress(dll, b"DwmEnableBlurBehindWindow\0".as_ptr() as *const _); + if !pr.is_null() { + let pr: unsafe extern "system" fn(winapi::HWND, *const winapi::DWM_BLURBEHIND) + -> winapi::HRESULT = mem::transmute(pr); + pr(real_window.0, &bb); + } + kernel32::FreeLibrary(dll); + } + } + // calling SetForegroundWindow if fullscreen if builder.monitor.is_some() { user32::SetForegroundWindow(real_window.0); @@ -295,6 +295,8 @@ pub struct BuilderAttribs<'a> { alpha_bits: Option<u8>, stereoscopy: bool, srgb: Option<bool>, + transparent: bool, + decorations: bool, } impl BuilderAttribs<'static> { @@ -318,6 +320,8 @@ impl BuilderAttribs<'static> { alpha_bits: None, stereoscopy: false, srgb: None, + transparent: false, + decorations: true, } } } @@ -346,6 +350,8 @@ impl<'a> BuilderAttribs<'a> { alpha_bits: self.alpha_bits, stereoscopy: self.stereoscopy, srgb: self.srgb, + transparent: self.transparent, + decorations: self.decorations, }; (new_attribs, sharing) diff --git a/src/window.rs b/src/window.rs index c21b82d..578c237 100644 --- a/src/window.rs +++ b/src/window.rs @@ -137,10 +137,22 @@ impl<'a> WindowBuilder<'a> { self } + /// Sets whether the background of the window should be transparent. + pub fn with_transparency(mut self, transparent: bool) -> WindowBuilder<'a> { + self.attribs.transparent = transparent; + self + } + + /// Sets whether the window should have a border, a title bar, etc. + pub fn with_decorations(mut self, decorations: bool) -> WindowBuilder<'a> { + self.attribs.decorations = decorations; + self + } + /// Builds the window. /// /// Error should be very rare and only occur in case of permission denied, incompatible system, - /// out of memory, etc. + /// out of memory, etc. pub fn build(mut self) -> Result<Window, CreationError> { // resizing the window to the dimensions of the monitor when fullscreen if self.attribs.dimensions.is_none() && self.attribs.monitor.is_some() { |