rusty_keys/device/builder.rs
1use std::path::Path;
2use std::{mem, slice};
3use std::ffi::CString;
4use libc::c_int;
5use nix::{self, fcntl, unistd};
6use nix::sys::stat;
7use ffi::*;
8use {Result as Res, Error, Device};
9use std::collections::hash_map::Values;
10
11#[cfg(feature = "udev")]
12use udev;
13
14/// Device builder.
15pub struct Builder {
16 fd: c_int,
17 def: uinput_user_dev,
18 abs: Option<c_int>,
19}
20
21impl Builder {
22 /// Create a builder from the specified path.
23 pub fn open<P: AsRef<Path>>(path: P) -> Res<Self> {
24 Ok(Builder {
25 fd: try!(fcntl::open(path.as_ref(), fcntl::O_WRONLY | fcntl::O_NONBLOCK, stat::Mode::empty())),
26 def: unsafe { mem::zeroed() },
27 abs: None,
28 })
29 }
30
31 #[cfg(feature = "udev")]
32 /// Create a builder from the default path taken from udev.
33 pub fn default() -> Res<Self> {
34 let context = try!(udev::Context::new());
35 let mut enumerator = try!(udev::Enumerator::new(&context));
36
37 try!(enumerator.match_subsystem("misc"));
38 try!(enumerator.match_sysname("uinput"));
39
40 let device = try!(try!(enumerator.scan_devices())
41 .next().ok_or(Error::NotFound));
42
43 Builder::open(try!(device.devnode().ok_or(Error::NotFound)))
44 }
45
46 #[cfg(not(feature = "udev"))]
47 /// Create a builder from `/dev/uinput`.
48 pub fn default() -> Res<Self> {
49 Builder::open("/dev/uinput")
50 }
51
52 /// Set the name.
53 pub fn name<T: AsRef<str>>(mut self, value: T) -> Res<Self> {
54 let string = try!(CString::new(value.as_ref()));
55 let bytes = string.as_bytes_with_nul();
56
57 if bytes.len() > UINPUT_MAX_NAME_SIZE as usize {
58 try!(Err(nix::Error::from_errno(nix::Errno::EINVAL)));
59 }
60
61 (&mut self.def.name)[..bytes.len()]
62 .clone_from_slice(unsafe { mem::transmute(bytes) });
63
64 Ok(self)
65 }
66
67 /// Set the bus type.
68 pub fn bus(mut self, value: u16) -> Self {
69 self.def.id.bustype = value;
70 self
71 }
72
73 /// Set the vendor ID.
74 pub fn vendor(mut self, value: u16) -> Self {
75 self.def.id.vendor = value;
76 self
77 }
78
79 /// Set the product ID.
80 pub fn product(mut self, value: u16) -> Self {
81 self.def.id.product = value;
82 self
83 }
84
85 /// Set the version.
86 pub fn version(mut self, value: u16) -> Self {
87 self.def.id.version = value;
88 self
89 }
90
91 pub fn event(mut self, key_codes: Values<&str, *const c_int>) -> Res<Self> {
92 self.abs = None;
93 //let test_ev_key : c_int = EV_KEY as c_int;
94 unsafe {
95 //try!(Errno::result(ui_set_evbit(self.fd, EV_KEY)));
96 //try!(Errno::result(ui_set_keybit(self.fd, KEY_H)));
97 ui_set_evbit(self.fd, EV_KEY as *const c_int)?;
98 //ui_set_keybit(self.fd, KEY_H as *const c_int)?;
99 for key_code in key_codes {
100 ui_set_keybit(self.fd, *key_code)?;
101 }
102 //try!(ui_set_keybit(self.fd, &KEY_H));
103 }
104 Ok(self)
105 }
106/*
107 /// Enable the given event.
108 pub fn event<T: Into<Event>>(mut self, value: T) -> Res<Self> {
109 self.abs = None;
110
111 match value.into() {
112 Event::All => {
113 try!(self.event(Event::Keyboard(event::Keyboard::All)))
114 .event(Event::Controller(event::Controller::All))
115 }
116
117 Event::Keyboard(value) => {
118 match value {
119 event::Keyboard::All => {
120 let mut builder = self;
121
122 for item in event::keyboard::Key::iter_variants() {
123 builder = try!(builder.event(item));
124 }
125
126 for item in event::keyboard::KeyPad::iter_variants() {
127 builder = try!(builder.event(item));
128 }
129
130 for item in event::keyboard::Misc::iter_variants() {
131 builder = try!(builder.event(item));
132 }
133
134 for item in event::keyboard::InputAssist::iter_variants() {
135 builder = try!(builder.event(item));
136 }
137
138 for item in event::keyboard::Function::iter_variants() {
139 builder = try!(builder.event(item));
140 }
141
142 for item in event::keyboard::Braille::iter_variants() {
143 builder = try!(builder.event(item));
144 }
145
146 for item in event::keyboard::Numeric::iter_variants() {
147 builder = try!(builder.event(item));
148 }
149
150 for item in event::keyboard::TouchPad::iter_variants() {
151 builder = try!(builder.event(item));
152 }
153
154 for item in event::keyboard::Camera::iter_variants() {
155 builder = try!(builder.event(item));
156 }
157
158 for item in event::keyboard::Attendant::iter_variants() {
159 builder = try!(builder.event(item));
160 }
161
162 Ok(builder)
163 }
164
165 value => {
166 unsafe {
167 try!(Errno::result(ui_set_evbit(self.fd, value.kind())));
168 try!(Errno::result(ui_set_keybit(self.fd, value.code())));
169 }
170
171 Ok(self)
172 }
173 }
174 }
175
176 Event::Controller(value) => {
177 match value {
178 event::Controller::All => {
179 let mut builder = self;
180
181 for item in event::controller::Misc::iter_variants() {
182 builder = try!(builder.event(item));
183 }
184
185 for item in event::controller::Mouse::iter_variants() {
186 builder = try!(builder.event(item));
187 }
188
189 for item in event::controller::JoyStick::iter_variants() {
190 builder = try!(builder.event(item));
191 }
192
193 for item in event::controller::GamePad::iter_variants() {
194 builder = try!(builder.event(item));
195 }
196
197 for item in event::controller::Digi::iter_variants() {
198 builder = try!(builder.event(item));
199 }
200
201 for item in event::controller::Wheel::iter_variants() {
202 builder = try!(builder.event(item));
203 }
204
205 for item in event::controller::DPad::iter_variants() {
206 builder = try!(builder.event(item));
207 }
208
209 for item in event::controller::TriggerHappy::iter_variants() {
210 builder = try!(builder.event(item));
211 }
212
213 Ok(builder)
214 }
215
216 value => {
217 unsafe {
218 try!(Errno::result(ui_set_evbit(self.fd, value.kind())));
219 try!(Errno::result(ui_set_keybit(self.fd, value.code())));
220 }
221
222 Ok(self)
223 }
224 }
225 }
226
227 Event::Relative(value) => {
228 unsafe {
229 try!(Errno::result(ui_set_evbit(self.fd, value.kind())));
230 try!(Errno::result(ui_set_relbit(self.fd, value.code())));
231 }
232
233 Ok(self)
234 }
235
236 Event::Absolute(value) => {
237 unsafe {
238 try!(Errno::result(ui_set_evbit(self.fd, value.kind())));
239 try!(Errno::result(ui_set_absbit(self.fd, value.code())));
240 }
241
242 self.abs = Some(value.code());
243
244 Ok(self)
245 }
246 }
247 }
248*/
249 /// Set the maximum value for the previously enabled absolute event.
250 pub fn max(mut self, value: i32) -> Self {
251 self.def.absmax[self.abs.unwrap() as usize] = value;
252 self
253 }
254
255 /// Set the minimum value for the previously enabled absolute event.
256 pub fn min(mut self, value: i32) -> Self {
257 self.def.absmin[self.abs.unwrap() as usize] = value;
258 self
259 }
260
261 /// Set the fuzz value for the previously enabled absolute event.
262 pub fn fuzz(mut self, value: i32) -> Self {
263 self.def.absfuzz[self.abs.unwrap() as usize] = value;
264 self
265 }
266
267 /// Set the flat value for the previously enabled absolute event.
268 pub fn flat(mut self, value: i32) -> Self {
269 self.def.absflat[self.abs.unwrap() as usize] = value;
270 self
271 }
272
273 /// Create the defined device.
274 pub fn create(self) -> Res<Device> {
275 unsafe {
276 let ptr = &self.def as *const _ as *const u8;
277 let size = mem::size_of_val(&self.def);
278
279 try!(unistd::write(self.fd, slice::from_raw_parts(ptr, size)));
280 //todo: try!(Errno::result(ui_dev_create(self.fd)));
281 // try1: Errno::result(ui_dev_create(self.fd)).unwrap();
282 try!(ui_dev_create(self.fd));
283 }
284
285 Ok(Device::new(self.fd))
286 }
287}