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}