1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
/*
* 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<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,
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<InputVerifier> {
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));
}
|