From a0a324301b23d8003e4d116f9cc1bd07353f587f Mon Sep 17 00:00:00 2001 From: Buj Date: Sun, 3 Sep 2023 21:34:13 +0700 Subject: [PATCH] Raw window handle (not implemented for now) --- Cargo.toml | 7 +++++++ src/lok.rs | 31 ++++++++++++++++++++++++++++++- src/native/linux/mod.rs | 10 ++++++++++ src/native/macos/mod.rs | 10 ++++++++++ src/window.rs | 14 ++++++++++++++ 5 files changed, 71 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index cd58fb4..c0299fc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,3 +7,10 @@ license = "MIT/Apache-2.0" authors = ["The Loki Authors"] keywords = ["windowing"] categories = ["gui"] + +[features] +default = ["raw-window-handle"] +raw-window-handle = ["dep:raw-window-handle"] + +[dependencies] +raw-window-handle = { version = "0.5.2", optional = true } diff --git a/src/lok.rs b/src/lok.rs index 85b0892..8072520 100644 --- a/src/lok.rs +++ b/src/lok.rs @@ -42,6 +42,19 @@ pub trait LokinitBackend { fn fetch_monitors(&mut self) -> Vec { unimplemented!() } + + #[cfg(feature = "raw-window-handle")] + fn raw_display_handle(&self) -> raw_window_handle::RawDisplayHandle; + + #[cfg(feature = "raw-window-handle")] + fn raw_window_handle_for(&self, window_handle: WindowHandle) -> raw_window_handle::RawWindowHandle; +} + +#[cfg(feature = "raw-window-handle")] +unsafe impl raw_window_handle::HasRawDisplayHandle for dyn LokinitBackend { + fn raw_display_handle(&self) -> raw_window_handle::RawDisplayHandle { + self.raw_display_handle() + } } thread_local! { @@ -73,7 +86,13 @@ pub fn init_backend() { pub fn with(callback: impl FnOnce(&mut dyn LokinitBackend) -> R) -> R { INSTANCE.with(|instance| { let mut instance = instance.borrow_mut(); - let instance = instance.as_deref_mut().expect("Lokinit is not initialized"); + let instance = instance + .as_deref_mut() + .expect(if INITIALIZED.load(Ordering::Relaxed) { + "Accessing Lokinit from a non-main thread" + } else { + "Lokinit is not initialized" + }); (callback)(instance) }) } @@ -93,3 +112,13 @@ pub fn poll_event() -> Option { pub fn fetch_monitors() -> Vec { with(|instance| instance.fetch_monitors()) } + +#[cfg(feature = "raw-window-handle")] +pub fn raw_display_handle() -> raw_window_handle::RawDisplayHandle { + with(|instance| instance.raw_display_handle()) +} + +#[cfg(feature = "raw-window-handle")] +pub fn raw_window_handle(window_handle: WindowHandle) -> raw_window_handle::RawWindowHandle { + with(|instance| instance.raw_window_handle_for(window_handle)) +} diff --git a/src/native/linux/mod.rs b/src/native/linux/mod.rs index f7552e0..c789050 100644 --- a/src/native/linux/mod.rs +++ b/src/native/linux/mod.rs @@ -115,4 +115,14 @@ impl LokinitBackend for LinuxBackend { Self::Wayland(_wl) => todo!(), } } + + #[cfg(feature = "raw-window-handle")] + fn raw_display_handle(&self) -> raw_window_handle::RawDisplayHandle { + todo!() + } + + #[cfg(feature = "raw-window-handle")] + fn raw_window_handle_for(&self, window_handle: WindowHandle) -> raw_window_handle::RawWindowHandle { + todo!() + } } diff --git a/src/native/macos/mod.rs b/src/native/macos/mod.rs index ac5fbe5..2d13b85 100644 --- a/src/native/macos/mod.rs +++ b/src/native/macos/mod.rs @@ -45,4 +45,14 @@ impl LokinitBackend for MacosBackend { fn poll_event(&mut self) -> Option { unsafe { ffi_swift::update() }.try_into().ok() } + + #[cfg(feature = "raw-window-handle")] + fn raw_display_handle(&self) -> raw_window_handle::RawDisplayHandle { + todo!() + } + + #[cfg(feature = "raw-window-handle")] + fn raw_window_handle_for(&self, window_handle: WindowHandle) -> raw_window_handle::RawWindowHandle { + todo!() + } } diff --git a/src/window.rs b/src/window.rs index f86fd85..82cffac 100644 --- a/src/window.rs +++ b/src/window.rs @@ -104,3 +104,17 @@ impl WindowBuilder { #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] pub struct WindowHandle(pub(crate) usize); + +#[cfg(feature = "raw-window-handle")] +unsafe impl raw_window_handle::HasRawWindowHandle for WindowHandle { + fn raw_window_handle(&self) -> raw_window_handle::RawWindowHandle { + crate::lok::raw_window_handle(*self) + } +} + +#[cfg(feature = "raw-window-handle")] +unsafe impl raw_window_handle::HasRawDisplayHandle for WindowHandle { + fn raw_display_handle(&self) -> raw_window_handle::RawDisplayHandle { + crate::lok::raw_display_handle() + } +}