/* * Copyright 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ //! The rust component of libinput. mod input; mod input_verifier; pub use input::{DeviceId, MotionAction, MotionFlags, Source}; pub use input_verifier::InputVerifier; #[cxx::bridge(namespace = "android::input")] #[allow(unsafe_op_in_unsafe_fn)] mod ffi { #[namespace = "android"] unsafe extern "C++" { include!("ffi/FromRustToCpp.h"); fn shouldLog(tag: &str) -> bool; } #[namespace = "android::input::verifier"] extern "Rust" { /// Used to validate the incoming motion stream. /// This class is not thread-safe. /// State is stored in the "InputVerifier" object /// that can be created via the 'create' method. /// Usage: /// /// ```ignore /// Box verifier = create("inputChannel name"); /// result = process_movement(verifier, ...); /// if (result) { /// crash(result.error_message()); /// } /// ``` type InputVerifier; fn create(name: String) -> Box; fn process_movement( verifier: &mut InputVerifier, device_id: i32, source: u32, action: u32, pointer_properties: &[RustPointerProperties], flags: u32, ) -> String; fn reset_device(verifier: &mut InputVerifier, device_id: i32); } #[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)] pub struct RustPointerProperties { pub id: i32, } } use crate::ffi::RustPointerProperties; fn create(name: String) -> Box { Box::new(InputVerifier::new(&name, ffi::shouldLog("InputVerifierLogEvents"))) } fn process_movement( verifier: &mut InputVerifier, device_id: i32, source: u32, action: u32, pointer_properties: &[RustPointerProperties], flags: u32, ) -> String { let result = verifier.process_movement( DeviceId(device_id), Source::from_bits(source).unwrap(), action, pointer_properties, MotionFlags::from_bits(flags).unwrap(), ); match result { Ok(()) => "".to_string(), Err(e) => e, } } fn reset_device(verifier: &mut InputVerifier, device_id: i32) { verifier.reset_device(DeviceId(device_id)); }