diff --git a/src/cef_impl/client/keyboard.rs b/src/cef_impl/client/keyboard.rs index 8f4a3d1..4ae8edf 100644 --- a/src/cef_impl/client/keyboard.rs +++ b/src/cef_impl/client/keyboard.rs @@ -4,6 +4,17 @@ use cef::*; +/// Key handler: return 1 to consume the event, 0 to let it pass through. +type KeyHandler = dyn Fn(&KeyEvent) -> ::std::os::raw::c_int + Send + Sync; + +static KEY_HANDLER: std::sync::OnceLock> = std::sync::OnceLock::new(); + +pub fn set_key_handler( + handler: impl Fn(&KeyEvent) -> ::std::os::raw::c_int + Send + Sync + 'static, +) { + let _ = KEY_HANDLER.set(Box::new(handler)); +} + #[cfg(target_os = "linux")] type CefOsEvent<'a> = Option<&'a mut cef::sys::XEvent>; #[cfg(target_os = "macos")] @@ -24,19 +35,18 @@ wrap_keyboard_handler! { _os_event: CefOsEvent<'_>, _is_keyboard_shortcut: Option<&mut ::std::os::raw::c_int>, ) -> ::std::os::raw::c_int { + let Some(event) = event else { + return 0; + }; + + use cef::sys::cef_key_event_type_t; + let keydown_type: cef::KeyEventType = cef_key_event_type_t::KEYEVENT_RAWKEYDOWN.into(); + if event.type_ != keydown_type { + return 0; + } + // If devtools is disabled, block devtools keyboard shortcuts. if !self.devtools_enabled { - let Some(event) = event else { - return 0; - }; - - // Check if this is a keydown event. - use cef::sys::cef_key_event_type_t; - let keydown_type: cef::KeyEventType = cef_key_event_type_t::KEYEVENT_RAWKEYDOWN.into(); - if event.type_ != keydown_type { - return 0; - } - // Get modifier keys. use cef::sys::cef_event_flags_t; #[cfg(windows)] @@ -82,6 +92,13 @@ wrap_keyboard_handler! { } } + // does the handler want to consume a keypress? + if let Some(handler) = KEY_HANDLER.get() + && handler(event) == 1 + { + return 1; + } + 0 } } diff --git a/src/cef_impl/client/mod.rs b/src/cef_impl/client/mod.rs index ecbb967..ee69ff9 100644 --- a/src/cef_impl/client/mod.rs +++ b/src/cef_impl/client/mod.rs @@ -17,7 +17,7 @@ mod context_menu; mod display; mod download; mod drag; -mod keyboard; +pub(crate) mod keyboard; mod life_span; mod load; mod permission; diff --git a/src/lib.rs b/src/lib.rs index 4cd51f2..7266a26 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -18,6 +18,7 @@ mod window; mod window_builder; mod window_handle; +pub use cef_impl::client::keyboard::set_key_handler; pub use config::{CefConfig, configure}; pub use policy::{ DEFAULT_PROMPT_TIMEOUT, DeferredResponder, DenyReason, NormalizedOrigin, PermissionAudit,