diff --git a/Cargo.lock b/Cargo.lock index a5188b71739a..7f2cf27f6d62 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5224,6 +5224,7 @@ dependencies = [ "backtrace", "cbindgen", "env_logger", + "keyboard-types", "lazy_static", "libc", "log", diff --git a/ports/libsimpleservo/capi/Cargo.toml b/ports/libsimpleservo/capi/Cargo.toml index 334a77f9198b..a1906bb95578 100644 --- a/ports/libsimpleservo/capi/Cargo.toml +++ b/ports/libsimpleservo/capi/Cargo.toml @@ -19,6 +19,7 @@ lazy_static = "1" log = "0.4" simpleservo = { path = "../api" } surfman = "0.3" +keyboard-types = "0.5" [target.'cfg(target_os = "windows")'.dependencies] libc = "0.2" diff --git a/ports/libsimpleservo/capi/src/lib.rs b/ports/libsimpleservo/capi/src/lib.rs index 1730f1c1cf24..ca0f0419f348 100644 --- a/ports/libsimpleservo/capi/src/lib.rs +++ b/ports/libsimpleservo/capi/src/lib.rs @@ -16,6 +16,7 @@ mod vslogger; use backtrace::Backtrace; #[cfg(not(target_os = "windows"))] use env_logger; +use keyboard_types::Key; use log::LevelFilter; use simpleservo::{self, gl_glue, ServoGlue, SERVO}; use simpleservo::{ @@ -717,6 +718,34 @@ pub extern "C" fn click(x: f32, y: f32) { }); } +#[no_mangle] +pub extern "C" fn key_down(name: *const c_char) { + catch_any_panic(|| { + debug!("key_down"); + let name = unsafe { CStr::from_ptr(name) }; + let key = Key::from_str(&name.to_str().expect("Can't read string")); + if let Ok(key) = key { + call(|s| s.key_down(key)); + } else { + warn!("Received unknown keys"); + } + }) +} + +#[no_mangle] +pub extern "C" fn key_up(name: *const c_char) { + catch_any_panic(|| { + debug!("key_up"); + let name = unsafe { CStr::from_ptr(name) }; + let key = Key::from_str(&name.to_str().expect("Can't read string")); + if let Ok(key) = key { + call(|s| s.key_up(key)); + } else { + warn!("Received unknown keys"); + } + }) +} + #[no_mangle] pub extern "C" fn media_session_action(action: CMediaSessionActionType) { catch_any_panic(|| {