|  | /* | 
|  | * 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}; | 
|  | 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<InputVerifier> verifier = create("inputChannel name"); | 
|  | /// result = process_movement(verifier, ...); | 
|  | /// if (result) { | 
|  | ///    crash(result.error_message()); | 
|  | /// } | 
|  | /// ``` | 
|  | type InputVerifier; | 
|  | fn create(name: String) -> Box<InputVerifier>; | 
|  | fn process_movement( | 
|  | verifier: &mut InputVerifier, | 
|  | device_id: i32, | 
|  | 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<InputVerifier> { | 
|  | Box::new(InputVerifier::new(&name, ffi::shouldLog("InputVerifierLogEvents"))) | 
|  | } | 
|  |  | 
|  | fn process_movement( | 
|  | verifier: &mut InputVerifier, | 
|  | device_id: i32, | 
|  | action: u32, | 
|  | pointer_properties: &[RustPointerProperties], | 
|  | flags: u32, | 
|  | ) -> String { | 
|  | let result = verifier.process_movement( | 
|  | DeviceId(device_id), | 
|  | 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)); | 
|  | } |