Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
google
GitHub Repository: google/crosvm
Path: blob/main/gpu_display/src/event_device.rs
5394 views
1
// Copyright 2019 The ChromiumOS Authors
2
// Use of this source code is governed by a BSD-style license that can be
3
// found in the LICENSE file.
4
5
use std::collections::VecDeque;
6
use std::fmt;
7
use std::io;
8
use std::io::Read;
9
use std::io::Write;
10
use std::iter::ExactSizeIterator;
11
12
use base::AsRawDescriptor;
13
use base::RawDescriptor;
14
use base::ReadNotifier;
15
use base::StreamChannel;
16
use linux_input_sys::virtio_input_event;
17
use linux_input_sys::InputEventDecoder;
18
use serde::Deserialize;
19
use serde::Serialize;
20
use zerocopy::FromZeros;
21
use zerocopy::IntoBytes;
22
23
const EVENT_SIZE: usize = virtio_input_event::SIZE;
24
const EVENT_BUFFER_LEN_MAX: usize = 64 * EVENT_SIZE;
25
26
#[derive(Copy, Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
27
pub enum EventDeviceKind {
28
/// Produces relative mouse motions, wheel, and button clicks while the real mouse is captured.
29
Mouse,
30
/// Produces absolute motion and touch events from the display window's events.
31
Touchscreen,
32
/// Produces key events while the display window has focus.
33
Keyboard,
34
}
35
36
/// Encapsulates a virtual event device, such as a mouse or keyboard
37
#[derive(Deserialize, Serialize)]
38
pub struct EventDevice {
39
kind: EventDeviceKind,
40
event_buffer: VecDeque<u8>,
41
event_socket: StreamChannel,
42
}
43
44
impl EventDevice {
45
pub fn new(kind: EventDeviceKind, mut event_socket: StreamChannel) -> EventDevice {
46
let _ = event_socket.set_nonblocking(true);
47
EventDevice {
48
kind,
49
event_buffer: Default::default(),
50
event_socket,
51
}
52
}
53
54
#[inline]
55
pub fn mouse(event_socket: StreamChannel) -> EventDevice {
56
Self::new(EventDeviceKind::Mouse, event_socket)
57
}
58
59
#[inline]
60
pub fn touchscreen(event_socket: StreamChannel) -> EventDevice {
61
Self::new(EventDeviceKind::Touchscreen, event_socket)
62
}
63
64
#[inline]
65
pub fn keyboard(event_socket: StreamChannel) -> EventDevice {
66
Self::new(EventDeviceKind::Keyboard, event_socket)
67
}
68
69
#[inline]
70
pub fn kind(&self) -> EventDeviceKind {
71
self.kind
72
}
73
74
/// Flushes the buffered events that did not fit into the underlying transport, if any.
75
///
76
/// Returns `Ok(true)` if, after this function returns, there all the buffer of events is
77
/// empty.
78
pub fn flush_buffered_events(&mut self) -> io::Result<bool> {
79
while !self.event_buffer.is_empty() {
80
let written = self.event_socket.write(self.event_buffer.as_slices().0)?;
81
if written == 0 {
82
return Ok(false);
83
}
84
self.event_buffer.drain(..written);
85
}
86
Ok(true)
87
}
88
89
pub fn is_buffered_events_empty(&self) -> bool {
90
self.event_buffer.is_empty()
91
}
92
93
/// Determines if there is space in the event buffer for the given number
94
/// of events. The buffer is capped at `EVENT_BUFFER_LEN_MAX`.
95
#[inline]
96
fn can_buffer_events(&self, num_events: usize) -> bool {
97
let event_bytes = match EVENT_SIZE.checked_mul(num_events) {
98
Some(bytes) => bytes,
99
None => return false,
100
};
101
let free_bytes = EVENT_BUFFER_LEN_MAX.saturating_sub(self.event_buffer.len());
102
103
free_bytes >= event_bytes
104
}
105
106
pub fn send_report<E: IntoIterator<Item = virtio_input_event>>(
107
&mut self,
108
events: E,
109
) -> io::Result<bool>
110
where
111
E::IntoIter: ExactSizeIterator,
112
{
113
let it = events.into_iter();
114
115
if !self.can_buffer_events(it.len() + 1) {
116
return Ok(false);
117
}
118
119
for event in it {
120
let bytes = event.as_bytes();
121
self.event_buffer.extend(bytes.iter());
122
}
123
124
self.event_buffer
125
.extend(virtio_input_event::syn().as_bytes().iter());
126
127
self.flush_buffered_events()
128
}
129
130
/// Sends the given `event`, returning `Ok(true)` if, after this function returns, there are no
131
/// buffered events remaining.
132
pub fn send_event_encoded(&mut self, event: virtio_input_event) -> io::Result<bool> {
133
if !self.flush_buffered_events()? {
134
return Ok(false);
135
}
136
137
let bytes = event.as_bytes();
138
let written = self.event_socket.write(bytes)?;
139
140
if written == bytes.len() {
141
return Ok(true);
142
}
143
144
if self.can_buffer_events(1) {
145
self.event_buffer.extend(bytes[written..].iter());
146
}
147
148
Ok(false)
149
}
150
151
pub fn recv_event_encoded(&self) -> io::Result<virtio_input_event> {
152
let mut event = virtio_input_event::new_zeroed();
153
(&self.event_socket).read_exact(event.as_mut_bytes())?;
154
Ok(event)
155
}
156
}
157
158
impl AsRawDescriptor for EventDevice {
159
fn as_raw_descriptor(&self) -> RawDescriptor {
160
self.event_socket.as_raw_descriptor()
161
}
162
}
163
164
impl ReadNotifier for EventDevice {
165
fn get_read_notifier(&self) -> &dyn AsRawDescriptor {
166
self.event_socket.get_read_notifier()
167
}
168
}
169
170
impl fmt::Debug for EventDevice {
171
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
172
write!(f, "Event device ({:?})", self.kind)
173
}
174
}
175
176