espanso/src/keyboard/windows.rs

58 lines
1.5 KiB
Rust
Raw Normal View History

use std::thread;
use std::sync::mpsc;
2019-08-30 19:24:03 +00:00
use widestring::{WideString, WideStr};
#[repr(C)]
2019-08-30 19:24:03 +00:00
pub struct WindowsKeyboardInterceptor {
pub sender: mpsc::Sender<char>
}
2019-08-30 19:24:03 +00:00
impl super::KeyboardInterceptor for WindowsKeyboardInterceptor {
fn initialize(&self) {
unsafe {
register_keypress_callback(self,keypress_callback);
}
}
fn start(&self) {
thread::spawn(|| {
unsafe {
initialize_window();
eventloop();
}
});
}
}
2019-08-30 19:24:03 +00:00
pub struct WindowsKeyboardSender {
}
impl super::KeyboardSender for WindowsKeyboardSender {
fn send_string(&self, s: &str) {
let s = WideString::from(s.to_owned());
unsafe {
send_string(s.as_ptr());
}
}
}
// Native bridge code
2019-08-30 19:24:03 +00:00
extern fn keypress_callback(_self: *mut WindowsKeyboardInterceptor, raw_buffer: *const i32, len: i32) {
unsafe {
// Convert the received buffer to a character
let buffer = std::slice::from_raw_parts(raw_buffer, len as usize);
let r = std::char::from_u32(buffer[0] as u32).unwrap();
// Send the char through the channel
(*_self).sender.send(r).unwrap();
}
}
#[link(name="winbridge", kind="static")]
extern {
2019-08-30 19:24:03 +00:00
fn register_keypress_callback(s: *const WindowsKeyboardInterceptor, cb: extern fn(_self: *mut WindowsKeyboardInterceptor, *const i32, i32));
fn initialize_window();
fn eventloop();
2019-08-30 19:24:03 +00:00
fn send_string(string: *const u16);
}