diff options
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() {  | 
