diff --git a/Cargo.toml b/Cargo.toml index f00b167..4ea0416 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,11 +1,12 @@ [package] name = "evdev" -version = "0.11.0-alpha.1" +version = "0.11.0-alpha.2" authors = ["Corey Richardson "] description = "evdev interface for Linux" license = "Apache-2.0 OR MIT" repository = "https://github.com/cmr/evdev" documentation = "https://docs.rs/evdev" +edition = "2018" [dependencies] bitflags = "1.2" diff --git a/src/lib.rs b/src/lib.rs index 1a90a7a..486a2b5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -34,38 +34,31 @@ #![cfg(any(unix, target_os = "android"))] #![allow(non_camel_case_types)] -#[macro_use] -extern crate bitflags; -#[macro_use] -extern crate nix; -extern crate libc; -extern crate fixedbitset; -extern crate num_traits; - pub mod raw; +mod scancodes; -use std::os::unix::{io::RawFd, ffi::*}; -use std::path::Path; -use std::ffi::{CString, CStr}; -use std::mem::{size_of, transmute}; +use bitflags::bitflags; use fixedbitset::FixedBitSet; - use nix::Error; +use std::ffi::{CStr, CString}; +use std::mem::{size_of, transmute}; +use std::os::unix::{ffi::*, io::RawFd}; +use std::path::Path; -pub use Key::*; -pub use FFEffect::*; -pub use Synchronization::*; +pub use crate::scancodes::*; +pub use crate::FFEffect::*; +pub use crate::Synchronization::*; -use raw::*; +use crate::raw::*; #[link(name = "rt")] -extern { +extern "C" { fn clock_gettime(clkid: libc::c_int, res: *mut libc::timespec); } macro_rules! do_ioctl { ($name:ident($($arg:expr),+)) => {{ - unsafe { ::raw::$name($($arg,)+) }? + unsafe { crate::raw::$name($($arg,)+) }? }} } @@ -73,15 +66,15 @@ macro_rules! do_ioctl_buf { ($buf:ident, $name:ident, $fd:expr) => { unsafe { let blen = $buf.len(); - match ::raw::$name($fd, &mut $buf[..]) { + match crate::raw::$name($fd, &mut $buf[..]) { Ok(len) if len >= 0 => { $buf[blen - 1] = 0; Some(CStr::from_ptr(&mut $buf[0] as *mut u8 as *mut _).to_owned()) - }, - _ => None + } + _ => None, } } - } + }; } bitflags! { @@ -144,8 +137,6 @@ bitflags! { } } -include!("scancodes.rs"); // it's a huge glob of text that I'm tired of skipping over. - bitflags! { pub struct RelativeAxis: u32 { const REL_X = 1 << 0x00; @@ -331,7 +322,10 @@ pub enum FFEffect { FF_CUSTOM = 0x5d, FF_GAIN = 0x60, FF_AUTOCENTER = 0x61, - FF_MAX = 0x7f, +} + +impl FFEffect { + pub const MAX: usize = 0x7f; } bitflags! { @@ -365,7 +359,18 @@ macro_rules! impl_number { } } -impl_number!(Types, Props, RelativeAxis, AbsoluteAxis, Switch, Led, Misc, FFStatus, Repeat, Sound); +impl_number!( + Types, + Props, + RelativeAxis, + AbsoluteAxis, + Switch, + Led, + Misc, + FFStatus, + Repeat, + Sound +); #[repr(C)] #[derive(Copy, Clone, Debug)] @@ -422,7 +427,9 @@ pub struct Device { impl std::fmt::Debug for Device { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { let mut ds = f.debug_struct("Device"); - ds.field("name", &self.name).field("fd", &self.fd).field("ty", &self.ty); + ds.field("name", &self.name) + .field("fd", &self.fd) + .field("ty", &self.ty); if let Some(ref phys) = self.phys { ds.field("phys", phys); } @@ -430,15 +437,13 @@ impl std::fmt::Debug for Device { ds.field("uniq", uniq); } ds.field("id", &self.id) - .field("id", &self.id) - .field("props", &self.props) - .field("driver_version", &self.driver_version); - if self.ty.contains(Types::SYNCHRONIZATION) { - - } + .field("id", &self.id) + .field("props", &self.props) + .field("driver_version", &self.driver_version); + if self.ty.contains(Types::SYNCHRONIZATION) {} if self.ty.contains(Types::KEY) { ds.field("key_bits", &self.key_bits) - .field("key_vals", &self.state.key_vals); + .field("key_vals", &self.state.key_vals); } if self.ty.contains(Types::RELATIVE) { ds.field("rel", &self.rel); @@ -450,20 +455,21 @@ impl std::fmt::Debug for Device { // ignore multitouch, we'll handle that later. if (self.abs.bits() & abs) == 1 { // eugh. - ds.field(&format!("abs_{:x}", idx), &self.state.abs_vals[idx as usize]); + ds.field( + &format!("abs_{:x}", idx), + &self.state.abs_vals[idx as usize], + ); } } } - if self.ty.contains(Types::MISC) { - - } + if self.ty.contains(Types::MISC) {} if self.ty.contains(Types::SWITCH) { ds.field("switch", &self.switch) - .field("switch_vals", &self.state.switch_vals); + .field("switch_vals", &self.state.switch_vals); } if self.ty.contains(Types::LED) { ds.field("led", &self.led) - .field("led_vals", &self.state.led_vals); + .field("led_vals", &self.state.led_vals); } if self.ty.contains(Types::SOUND) { ds.field("snd", &self.snd); @@ -474,8 +480,7 @@ impl std::fmt::Debug for Device { if self.ty.contains(Types::FORCEFEEDBACK) { ds.field("ff", &self.ff); } - if self.ty.contains(Types::POWER) { - } + if self.ty.contains(Types::POWER) {} if self.ty.contains(Types::FORCEFEEDBACKSTATUS) { ds.field("ff_stat", &self.ff_stat); } @@ -510,94 +515,111 @@ fn bus_name(x: u16) -> &'static str { impl std::fmt::Display for Device { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - try!(writeln!(f, "{:?}", self.name)); - try!(writeln!(f, " Driver version: {}.{}.{}", self.driver_version.0, self.driver_version.1, self.driver_version.2)); + writeln!(f, "{:?}", self.name)?; + writeln!( + f, + " Driver version: {}.{}.{}", + self.driver_version.0, self.driver_version.1, self.driver_version.2 + )?; if let Some(ref phys) = self.phys { - try!(writeln!(f, " Physical address: {:?}", phys)); + writeln!(f, " Physical address: {:?}", phys)?; } if let Some(ref uniq) = self.uniq { - try!(writeln!(f, " Unique name: {:?}", uniq)); + writeln!(f, " Unique name: {:?}", uniq)?; } - try!(writeln!(f, " Bus: {}", bus_name(self.id.bustype))); - try!(writeln!(f, " Vendor: 0x{:x}", self.id.vendor)); - try!(writeln!(f, " Product: 0x{:x}", self.id.product)); - try!(writeln!(f, " Version: 0x{:x}", self.id.version)); - try!(writeln!(f, " Properties: {:?}", self.props)); + writeln!(f, " Bus: {}", bus_name(self.id.bustype))?; + writeln!(f, " Vendor: 0x{:x}", self.id.vendor)?; + writeln!(f, " Product: 0x{:x}", self.id.product)?; + writeln!(f, " Version: 0x{:x}", self.id.version)?; + writeln!(f, " Properties: {:?}", self.props)?; - if self.ty.contains(Types::SYNCHRONIZATION) { - - } + if self.ty.contains(Types::SYNCHRONIZATION) {} if self.ty.contains(Types::KEY) { - try!(writeln!(f, " Keys supported:")); + writeln!(f, " Keys supported:")?; for key_idx in 0..self.key_bits.len() { if self.key_bits.contains(key_idx) { - // Cross our fingers... (what did this mean?) - try!(writeln!(f, " {:?} ({}index {})", - unsafe { std::mem::transmute::<_, Key>(key_idx as libc::c_int) }, - if self.state.key_vals.contains(key_idx) { "pressed, " } else { "" }, - key_idx)); + writeln!( + f, + " {:?} ({}index {})", + unsafe { std::mem::transmute::<_, Key>(key_idx as libc::c_int) }, + if self.state.key_vals.contains(key_idx) { + "pressed, " + } else { + "" + }, + key_idx + )?; } } } if self.ty.contains(Types::RELATIVE) { - try!(writeln!(f, " Relative Axes: {:?}", self.rel)); + writeln!(f, " Relative Axes: {:?}", self.rel)?; } if self.ty.contains(Types::ABSOLUTE) { - try!(writeln!(f, " Absolute Axes:")); + writeln!(f, " Absolute Axes:")?; for idx in 0..0x3f { - let abs = 1<< idx; + let abs = 1 << idx; if self.abs.bits() & abs != 0 { // FIXME: abs val Debug is gross - try!(writeln!(f, " {:?} ({:?}, index {})", - AbsoluteAxis::from_bits(abs).unwrap(), - self.state.abs_vals[idx as usize], - idx)); + writeln!( + f, + " {:?} ({:?}, index {})", + AbsoluteAxis::from_bits(abs).unwrap(), + self.state.abs_vals[idx as usize], + idx + )?; } } } if self.ty.contains(Types::MISC) { - try!(writeln!(f, " Miscellaneous capabilities: {:?}", self.misc)); + writeln!(f, " Miscellaneous capabilities: {:?}", self.misc)?; } if self.ty.contains(Types::SWITCH) { - try!(writeln!(f, " Switches:")); + writeln!(f, " Switches:")?; for idx in 0..0xf { let sw = 1 << idx; if sw < Switch::SW_MAX.bits() && self.switch.bits() & sw == 1 { - try!(writeln!(f, " {:?} ({:?}, index {})", - Switch::from_bits(sw).unwrap(), - self.state.switch_vals[idx as usize], - idx)); + writeln!( + f, + " {:?} ({:?}, index {})", + Switch::from_bits(sw).unwrap(), + self.state.switch_vals[idx as usize], + idx + )?; } } } if self.ty.contains(Types::LED) { - try!(writeln!(f, " LEDs:")); + writeln!(f, " LEDs:")?; for idx in 0..0xf { let led = 1 << idx; if led < Led::LED_MAX.bits() && self.led.bits() & led == 1 { - try!(writeln!(f, " {:?} ({:?}, index {})", - Led::from_bits(led).unwrap(), - self.state.led_vals[idx as usize], - idx)); + writeln!( + f, + " {:?} ({:?}, index {})", + Led::from_bits(led).unwrap(), + self.state.led_vals[idx as usize], + idx + )?; } } } if self.ty.contains(Types::SOUND) { - try!(writeln!(f, " Sound: {:?}", self.snd)); + writeln!(f, " Sound: {:?}", self.snd)?; } if self.ty.contains(Types::REPEAT) { - try!(writeln!(f, " Repeats: {:?}", self.rep)); + writeln!(f, " Repeats: {:?}", self.rep)?; } if self.ty.contains(Types::FORCEFEEDBACK) { - try!(writeln!(f, " Force Feedback supported")); + writeln!(f, " Force Feedback supported")?; } if self.ty.contains(Types::POWER) { - try!(writeln!(f, " Power supported")); + writeln!(f, " Power supported")?; } if self.ty.contains(Types::FORCEFEEDBACKSTATUS) { - try!(writeln!(f, " Force Feedback status supported")); + writeln!(f, " Force Feedback status supported")?; } Ok(()) } @@ -606,7 +628,9 @@ impl std::fmt::Display for Device { impl Drop for Device { fn drop(&mut self) { // Linux close(2) can fail, but there is nothing to do if it does. - unsafe { libc::close(self.fd); } + unsafe { + libc::close(self.fd); + } } } @@ -679,14 +703,20 @@ impl Device { &self.state } - pub fn open(path: &AsRef) -> Result { + pub fn open(path: &dyn AsRef) -> Result { let cstr = match CString::new(path.as_ref().as_os_str().as_bytes()) { Ok(s) => s, Err(_) => return Err(Error::InvalidPath), }; // FIXME: only need for writing is for setting LED values. re-evaluate always using RDWR // later. - let fd = unsafe { libc::open(cstr.as_ptr(), libc::O_NONBLOCK | libc::O_RDWR | libc::O_CLOEXEC, 0) }; + let fd = unsafe { + libc::open( + cstr.as_ptr(), + libc::O_NONBLOCK | libc::O_RDWR | libc::O_CLOEXEC, + 0, + ) + }; if fd == -1 { return Err(Error::from_errno(::nix::errno::Errno::last())); } @@ -700,26 +730,29 @@ impl Device { id: unsafe { std::mem::zeroed() }, props: Props::empty(), driver_version: (0, 0, 0), - key_bits: FixedBitSet::with_capacity(KEY_MAX as usize), + key_bits: FixedBitSet::with_capacity(Key::MAX), rel: RelativeAxis::empty(), abs: AbsoluteAxis::empty(), switch: Switch::empty(), led: Led::empty(), misc: Misc::empty(), - ff: FixedBitSet::with_capacity(FF_MAX as usize + 1), + ff: FixedBitSet::with_capacity(FFEffect::MAX + 1), ff_stat: FFStatus::empty(), rep: Repeat::empty(), snd: Sound::empty(), pending_events: Vec::with_capacity(64), last_seen: 0, state: DeviceState { - timestamp: libc::timeval { tv_sec: 0, tv_usec: 0 }, - key_vals: FixedBitSet::with_capacity(KEY_MAX as usize), + timestamp: libc::timeval { + tv_sec: 0, + tv_usec: 0, + }, + key_vals: FixedBitSet::with_capacity(Key::MAX), abs_vals: vec![], switch_vals: FixedBitSet::with_capacity(0x10), led_vals: FixedBitSet::with_capacity(0x10), }, - clock: libc::CLOCK_REALTIME + clock: libc::CLOCK_REALTIME, }; let mut bits: u32 = 0; @@ -736,52 +769,94 @@ impl Device { do_ioctl!(eviocgid(fd, &mut dev.id)); let mut driver_version: i32 = 0; do_ioctl!(eviocgversion(fd, &mut driver_version)); - dev.driver_version = - (((driver_version >> 16) & 0xff) as u8, - ((driver_version >> 8) & 0xff) as u8, - (driver_version & 0xff) as u8); + dev.driver_version = ( + ((driver_version >> 16) & 0xff) as u8, + ((driver_version >> 8) & 0xff) as u8, + (driver_version & 0xff) as u8, + ); - do_ioctl!(eviocgprop(fd, std::slice::from_raw_parts_mut(&mut bits as *mut u32 as *mut u8, 0x1f))); // FIXME: handle old kernel + do_ioctl!(eviocgprop( + fd, + std::slice::from_raw_parts_mut(&mut bits as *mut u32 as *mut u8, 0x1f) + )); // FIXME: handle old kernel dev.props = Props::from_bits(bits).expect("evdev: unexpected prop bits! report a bug"); if dev.ty.contains(Types::KEY) { - do_ioctl!(eviocgbit(fd, Types::KEY.number(), dev.key_bits.len() as libc::c_int, dev.key_bits.as_mut_slice().as_mut_ptr() as *mut u8)); + do_ioctl!(eviocgbit( + fd, + Types::KEY.number(), + dev.key_bits.len() as libc::c_int, + dev.key_bits.as_mut_slice().as_mut_ptr() as *mut u8 + )); } if dev.ty.contains(Types::RELATIVE) { - do_ioctl!(eviocgbit(fd, Types::RELATIVE.number(), 0xf, &mut bits as *mut u32 as *mut u8)); - dev.rel = RelativeAxis::from_bits(bits).expect("evdev: unexpected rel bits! report a bug"); + do_ioctl!(eviocgbit( + fd, + Types::RELATIVE.number(), + 0xf, + &mut bits as *mut u32 as *mut u8 + )); + dev.rel = + RelativeAxis::from_bits(bits).expect("evdev: unexpected rel bits! report a bug"); } if dev.ty.contains(Types::ABSOLUTE) { - do_ioctl!(eviocgbit(fd, Types::ABSOLUTE.number(), 0x3f, &mut bits64 as *mut u64 as *mut u8)); - dev.abs = AbsoluteAxis::from_bits(bits64).expect("evdev: unexpected abs bits! report a bug"); + do_ioctl!(eviocgbit( + fd, + Types::ABSOLUTE.number(), + 0x3f, + &mut bits64 as *mut u64 as *mut u8 + )); + dev.abs = + AbsoluteAxis::from_bits(bits64).expect("evdev: unexpected abs bits! report a bug"); dev.state.abs_vals = vec![input_absinfo::default(); 0x3f]; } if dev.ty.contains(Types::SWITCH) { - do_ioctl!(eviocgbit(fd, Types::SWITCH.number(), 0xf, &mut bits as *mut u32 as *mut u8)); - dev.switch = Switch::from_bits(bits).expect("evdev: unexpected switch bits! report a bug"); + do_ioctl!(eviocgbit( + fd, + Types::SWITCH.number(), + 0xf, + &mut bits as *mut u32 as *mut u8 + )); + dev.switch = + Switch::from_bits(bits).expect("evdev: unexpected switch bits! report a bug"); } if dev.ty.contains(Types::LED) { - do_ioctl!(eviocgbit(fd, Types::LED.number(), 0xf, &mut bits as *mut u32 as *mut u8)); + do_ioctl!(eviocgbit( + fd, + Types::LED.number(), + 0xf, + &mut bits as *mut u32 as *mut u8 + )); dev.led = Led::from_bits(bits).expect("evdev: unexpected led bits! report a bug"); } if dev.ty.contains(Types::MISC) { - do_ioctl!(eviocgbit(fd, Types::MISC.number(), 0x7, &mut bits as *mut u32 as *mut u8)); + do_ioctl!(eviocgbit( + fd, + Types::MISC.number(), + 0x7, + &mut bits as *mut u32 as *mut u8 + )); dev.misc = Misc::from_bits(bits).expect("evdev: unexpected misc bits! report a bug"); } //do_ioctl!(eviocgbit(fd, ffs(FORCEFEEDBACK.bits()), 0x7f, &mut bits as *mut u32 as *mut u8)); if dev.ty.contains(Types::SOUND) { - do_ioctl!(eviocgbit(fd, Types::SOUND.number(), 0x7, &mut bits as *mut u32 as *mut u8)); + do_ioctl!(eviocgbit( + fd, + Types::SOUND.number(), + 0x7, + &mut bits as *mut u32 as *mut u8 + )); dev.snd = Sound::from_bits(bits).expect("evdev: unexpected sound bits! report a bug"); } - try!(dev.sync_state()); + dev.sync_state()?; Ok(dev) } @@ -791,7 +866,10 @@ impl Device { /// If there is an error at any point, the state will not be synchronized completely. pub fn sync_state(&mut self) -> Result<(), Error> { if self.ty.contains(Types::KEY) { - do_ioctl!(eviocgkey(self.fd, transmute::<&mut [u32], &mut [u8]>(self.state.key_vals.as_mut_slice()))); + do_ioctl!(eviocgkey( + self.fd, + transmute::<&mut [u32], &mut [u8]>(self.state.key_vals.as_mut_slice()) + )); } if self.ty.contains(Types::ABSOLUTE) { for idx in 0..0x3f { @@ -801,15 +879,25 @@ impl Device { // handling later removed. not sure what the intention of "handling that later" was // the abs data seems to be fine (tested ABS_MT_POSITION_X/Y) if self.abs.bits() & abs != 0 { - do_ioctl!(eviocgabs(self.fd, idx as u32, &mut self.state.abs_vals[idx as usize])); + do_ioctl!(eviocgabs( + self.fd, + idx as u32, + &mut self.state.abs_vals[idx as usize] + )); } } } if self.ty.contains(Types::SWITCH) { - do_ioctl!(eviocgsw(self.fd, transmute::<&mut [u32], &mut [u8]>(self.state.switch_vals.as_mut_slice()))); + do_ioctl!(eviocgsw( + self.fd, + transmute::<&mut [u32], &mut [u8]>(self.state.switch_vals.as_mut_slice()) + )); } if self.ty.contains(Types::LED) { - do_ioctl!(eviocgled(self.fd, transmute::<&mut [u32], &mut [u8]>(self.state.led_vals.as_mut_slice()))); + do_ioctl!(eviocgled( + self.fd, + transmute::<&mut [u32], &mut [u8]>(self.state.led_vals.as_mut_slice()) + )); } Ok(()) @@ -823,7 +911,7 @@ impl Device { for (idx, event) in self.pending_events[self.last_seen..].iter().enumerate() { if event._type == SYN_DROPPED as u16 { drop_from = Some(idx); - break + break; } } // FIXME: see if we can *not* drop EV_REL events. EV_REL doesn't have any state, so @@ -839,16 +927,18 @@ impl Device { } self.pending_events.truncate(prev_report); } else { - return Ok(()) + return Ok(()); } // Alright, pending_events is in a sane state. Now, let's sync the local state. We will // create a phony packet that contains deltas from the previous device state to the current // device state. let old_state = self.state.clone(); - try!(self.sync_state()); + self.sync_state()?; let mut time = unsafe { std::mem::zeroed() }; - unsafe { clock_gettime(self.clock, &mut time); } + unsafe { + clock_gettime(self.clock, &mut time); + } let time = libc::timeval { tv_sec: time.tv_sec, tv_usec: time.tv_nsec / 1000, @@ -892,7 +982,11 @@ impl Device { time: time, _type: Types::SWITCH.number(), code: idx as u16, - value: if self.state.switch_vals[idx as usize] { 1 } else { 0 }, + value: if self.state.switch_vals[idx as usize] { + 1 + } else { + 0 + }, }); } } @@ -907,7 +1001,11 @@ impl Device { time: time, _type: Types::LED.number(), code: idx as u16, - value: if self.state.led_vals[idx as usize] { 1 } else { 0 }, + value: if self.state.led_vals[idx as usize] { + 1 + } else { + 0 + }, }); } } @@ -929,10 +1027,11 @@ impl Device { buf.reserve(20); let pre_len = buf.len(); let sz = unsafe { - libc::read(self.fd, - buf.as_mut_ptr() - .offset(pre_len as isize) as *mut libc::c_void, - (size_of::() * (buf.capacity() - pre_len)) as libc::size_t) + libc::read( + self.fd, + buf.as_mut_ptr().offset(pre_len as isize) as *mut libc::c_void, + (size_of::() * (buf.capacity() - pre_len)) as libc::size_t, + ) }; if sz == -1 { let errno = ::nix::errno::Errno::last(); @@ -952,7 +1051,7 @@ impl Device { /// Exposes the raw evdev events without doing synchronization on SYN_DROPPED. pub fn events_no_sync(&mut self) -> Result { - try!(self.fill_events()); + self.fill_events()?; Ok(RawEvents::new(self)) } @@ -960,8 +1059,8 @@ impl Device { /// /// Will insert "fake" events pub fn events(&mut self) -> Result { - try!(self.fill_events()); - try!(self.compensate_dropped()); + self.fill_events()?; + self.compensate_dropped()?; Ok(RawEvents(self)) } diff --git a/src/raw.rs b/src/raw.rs index 8faf74b..d053411 100644 --- a/src/raw.rs +++ b/src/raw.rs @@ -1,3 +1,8 @@ +use nix::{ + convert_ioctl_res, ioctl_read, ioctl_read_buf, ioctl_write_int, ioctl_write_ptr, + request_code_read, +}; + ioctl_read!(eviocgeffects, b'E', 0x84, ::libc::c_int); ioctl_read!(eviocgid, b'E', 0x02, /*struct*/ input_id); ioctl_read!(eviocgkeycode, b'E', 0x04, [::libc::c_uint; 2]); @@ -19,12 +24,17 @@ pub struct input_event { pub value: i32, } impl ::std::default::Default for input_event { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } + fn default() -> Self { + unsafe { ::std::mem::zeroed() } + } } impl ::std::fmt::Debug for input_event { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "input_event {{ time: {{ tv_sec: {}, tv_usec: {} }}, _type: {}, code: {}, value: {}", - self.time.tv_sec, self.time.tv_usec, self._type, self.code, self.value) + write!( + f, + "input_event {{ time: {{ tv_sec: {}, tv_usec: {} }}, _type: {}, code: {}, value: {}", + self.time.tv_sec, self.time.tv_usec, self._type, self.code, self.value + ) } } @@ -66,8 +76,7 @@ impl Union_Unnamed16 { let raw: *mut u8 = ::std::mem::transmute(&self._bindgen_data_); ::std::mem::transmute(raw.offset(0)) } - pub unsafe fn condition(&mut self) - -> *mut [ff_condition_effect; 2usize] { + pub unsafe fn condition(&mut self) -> *mut [ff_condition_effect; 2usize] { let raw: *mut u8 = ::std::mem::transmute(&self._bindgen_data_); ::std::mem::transmute(raw.offset(0)) } @@ -77,7 +86,9 @@ impl Union_Unnamed16 { } } impl ::std::default::Default for Union_Unnamed16 { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } + fn default() -> Self { + unsafe { ::std::mem::zeroed() } + } } #[repr(C)] @@ -91,7 +102,9 @@ pub struct input_absinfo { pub resolution: i32, } impl ::std::default::Default for input_absinfo { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } + fn default() -> Self { + unsafe { ::std::mem::zeroed() } + } } #[repr(C)] #[derive(Copy, Clone, Debug)] @@ -103,7 +116,9 @@ pub struct input_keymap_entry { pub scancode: [u8; 32usize], } impl ::std::default::Default for input_keymap_entry { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } + fn default() -> Self { + unsafe { ::std::mem::zeroed() } + } } #[repr(C)] #[derive(Copy, Clone, Debug)] @@ -112,7 +127,9 @@ pub struct ff_replay { pub delay: u16, } impl ::std::default::Default for ff_replay { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } + fn default() -> Self { + unsafe { ::std::mem::zeroed() } + } } #[repr(C)] #[derive(Copy, Clone, Debug)] @@ -121,7 +138,9 @@ pub struct ff_trigger { pub interval: u16, } impl ::std::default::Default for ff_trigger { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } + fn default() -> Self { + unsafe { ::std::mem::zeroed() } + } } #[repr(C)] #[derive(Copy, Clone, Debug)] @@ -132,7 +151,9 @@ pub struct ff_envelope { pub fade_level: u16, } impl ::std::default::Default for ff_envelope { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } + fn default() -> Self { + unsafe { ::std::mem::zeroed() } + } } #[repr(C)] #[derive(Copy, Clone, Debug)] @@ -141,7 +162,9 @@ pub struct ff_constant_effect { pub envelope: ff_envelope, } impl ::std::default::Default for ff_constant_effect { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } + fn default() -> Self { + unsafe { ::std::mem::zeroed() } + } } #[repr(C)] #[derive(Copy, Clone, Debug)] @@ -151,7 +174,9 @@ pub struct ff_ramp_effect { pub envelope: ff_envelope, } impl ::std::default::Default for ff_ramp_effect { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } + fn default() -> Self { + unsafe { ::std::mem::zeroed() } + } } #[repr(C)] #[derive(Copy, Clone, Debug)] @@ -164,7 +189,9 @@ pub struct ff_condition_effect { pub center: i16, } impl ::std::default::Default for ff_condition_effect { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } + fn default() -> Self { + unsafe { ::std::mem::zeroed() } + } } #[repr(C)] #[derive(Copy, Clone, Debug)] @@ -179,7 +206,9 @@ pub struct ff_periodic_effect { pub custom_data: *mut i16, } impl ::std::default::Default for ff_periodic_effect { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } + fn default() -> Self { + unsafe { ::std::mem::zeroed() } + } } #[repr(C)] #[derive(Copy, Clone, Debug)] @@ -188,7 +217,9 @@ pub struct ff_rumble_effect { pub weak_magnitude: u16, } impl ::std::default::Default for ff_rumble_effect { - fn default() -> Self { unsafe { ::std::mem::zeroed() } } + fn default() -> Self { + unsafe { ::std::mem::zeroed() } + } } ioctl_read_buf!(eviocgname, b'E', 0x06, u8); @@ -206,10 +237,27 @@ ioctl_write_int!(eviocgrab, b'E', 0x90); ioctl_write_int!(eviocrevoke, b'E', 0x91); ioctl_write_int!(eviocsclockid, b'E', 0xa0); -pub unsafe fn eviocgbit(fd: ::libc::c_int, ev: u32, len: ::libc::c_int, buf: *mut u8) -> ::nix::Result { - convert_ioctl_res!(::nix::libc::ioctl(fd, request_code_read!(b'E', 0x20 + ev, len), buf)) +pub unsafe fn eviocgbit( + fd: ::libc::c_int, + ev: u32, + len: ::libc::c_int, + buf: *mut u8, +) -> ::nix::Result { + convert_ioctl_res!(::nix::libc::ioctl( + fd, + request_code_read!(b'E', 0x20 + ev, len), + buf + )) } -pub unsafe fn eviocgabs(fd: ::libc::c_int, abs: u32, buf: *mut input_absinfo) -> ::nix::Result { - convert_ioctl_res!(::nix::libc::ioctl(fd, request_code_read!(b'E', 0x40 + abs, ::std::mem::size_of::()), buf)) +pub unsafe fn eviocgabs( + fd: ::libc::c_int, + abs: u32, + buf: *mut input_absinfo, +) -> ::nix::Result { + convert_ioctl_res!(::nix::libc::ioctl( + fd, + request_code_read!(b'E', 0x40 + abs, ::std::mem::size_of::()), + buf + )) } diff --git a/src/scancodes.rs b/src/scancodes.rs index f6e0f05..40820f9 100644 --- a/src/scancodes.rs +++ b/src/scancodes.rs @@ -4,524 +4,527 @@ #[repr(C)] #[derive(Copy, Clone, Debug)] pub enum Key { - KEY_RESERVED = 0, - KEY_ESC = 1, - KEY_1 = 2, - KEY_2 = 3, - KEY_3 = 4, - KEY_4 = 5, - KEY_5 = 6, - KEY_6 = 7, - KEY_7 = 8, - KEY_8 = 9, - KEY_9 = 10, - KEY_0 = 11, - KEY_MINUS = 12, - KEY_EQUAL = 13, - KEY_BACKSPACE = 14, - KEY_TAB = 15, - KEY_Q = 16, - KEY_W = 17, - KEY_E = 18, - KEY_R = 19, - KEY_T = 20, - KEY_Y = 21, - KEY_U = 22, - KEY_I = 23, - KEY_O = 24, - KEY_P = 25, - KEY_LEFTBRACE = 26, - KEY_RIGHTBRACE = 27, - KEY_ENTER = 28, - KEY_LEFTCTRL = 29, - KEY_A = 30, - KEY_S = 31, - KEY_D = 32, - KEY_F = 33, - KEY_G = 34, - KEY_H = 35, - KEY_J = 36, - KEY_K = 37, - KEY_L = 38, - KEY_SEMICOLON = 39, - KEY_APOSTROPHE = 40, - KEY_GRAVE = 41, - KEY_LEFTSHIFT = 42, - KEY_BACKSLASH = 43, - KEY_Z = 44, - KEY_X = 45, - KEY_C = 46, - KEY_V = 47, - KEY_B = 48, - KEY_N = 49, - KEY_M = 50, - KEY_COMMA = 51, - KEY_DOT = 52, - KEY_SLASH = 53, - KEY_RIGHTSHIFT = 54, - KEY_KPASTERISK = 55, - KEY_LEFTALT = 56, - KEY_SPACE = 57, - KEY_CAPSLOCK = 58, - KEY_F1 = 59, - KEY_F2 = 60, - KEY_F3 = 61, - KEY_F4 = 62, - KEY_F5 = 63, - KEY_F6 = 64, - KEY_F7 = 65, - KEY_F8 = 66, - KEY_F9 = 67, - KEY_F10 = 68, - KEY_NUMLOCK = 69, - KEY_SCROLLLOCK = 70, - KEY_KP7 = 71, - KEY_KP8 = 72, - KEY_KP9 = 73, - KEY_KPMINUS = 74, - KEY_KP4 = 75, - KEY_KP5 = 76, - KEY_KP6 = 77, - KEY_KPPLUS = 78, - KEY_KP1 = 79, - KEY_KP2 = 80, - KEY_KP3 = 81, - KEY_KP0 = 82, - KEY_KPDOT = 83, - KEY_ZENKAKUHANKAKU =85, - KEY_102ND = 86, - KEY_F11 = 87, - KEY_F12 = 88, - KEY_RO = 89, - KEY_KATAKANA = 90, - KEY_HIRAGANA = 91, - KEY_HENKAN = 92, - KEY_KATAKANAHIRAGANA =93, - KEY_MUHENKAN = 94, - KEY_KPJPCOMMA = 95, - KEY_KPENTER = 96, - KEY_RIGHTCTRL = 97, - KEY_KPSLASH = 98, - KEY_SYSRQ = 99, - KEY_RIGHTALT = 100, - KEY_LINEFEED = 101, - KEY_HOME = 102, - KEY_UP = 103, - KEY_PAGEUP = 104, - KEY_LEFT = 105, - KEY_RIGHT = 106, - KEY_END = 107, - KEY_DOWN = 108, - KEY_PAGEDOWN = 109, - KEY_INSERT = 110, - KEY_DELETE = 111, - KEY_MACRO = 112, - KEY_MUTE = 113, - KEY_VOLUMEDOWN = 114, - KEY_VOLUMEUP = 115, - KEY_POWER = 116 /* SC System Power Down */, - KEY_KPEQUAL = 117, - KEY_KPPLUSMINUS = 118, - KEY_PAUSE = 119, - KEY_SCALE = 120 /* AL Compiz Scale (Expose) */, - KEY_KPCOMMA = 121, - KEY_HANGEUL = 122, - KEY_HANJA = 123, - KEY_YEN = 124, - KEY_LEFTMETA = 125, - KEY_RIGHTMETA = 126, - KEY_COMPOSE = 127, - KEY_STOP = 128 /* AC Stop */, - KEY_AGAIN = 129, - KEY_PROPS = 130 /* AC Properties */, - KEY_UNDO = 131 /* AC Undo */, - KEY_FRONT = 132, - KEY_COPY = 133 /* AC Copy */, - KEY_OPEN = 134 /* AC Open */, - KEY_PASTE = 135 /* AC Paste */, - KEY_FIND = 136 /* AC Search */, - KEY_CUT = 137 /* AC Cut */, - KEY_HELP = 138 /* AL Integrated Help Center */, - KEY_MENU = 139 /* Menu (show menu) */, - KEY_CALC = 140 /* AL Calculator */, - KEY_SETUP = 141, - KEY_SLEEP = 142 /* SC System Sleep */, - KEY_WAKEUP = 143 /* System Wake Up */, - KEY_FILE = 144 /* AL Local Machine Browser */, - KEY_SENDFILE = 145, - KEY_DELETEFILE = 146, - KEY_XFER = 147, - KEY_PROG1 = 148, - KEY_PROG2 = 149, - KEY_WWW = 150 /* AL Internet Browser */, - KEY_MSDOS = 151, - KEY_COFFEE = 152 /* AL Terminal Lock/Screensaver */, - KEY_DIRECTION = 153, - KEY_CYCLEWINDOWS =154, - KEY_MAIL = 155, - KEY_BOOKMARKS = 156 /* AC Bookmarks */, - KEY_COMPUTER = 157, - KEY_BACK = 158 /* AC Back */, - KEY_FORWARD = 159 /* AC Forward */, - KEY_CLOSECD = 160, - KEY_EJECTCD = 161, - KEY_EJECTCLOSECD =162, - KEY_NEXTSONG = 163, - KEY_PLAYPAUSE = 164, - KEY_PREVIOUSSONG =165, - KEY_STOPCD = 166, - KEY_RECORD = 167, - KEY_REWIND = 168, - KEY_PHONE = 169 /* Media Select Telephone */, - KEY_ISO = 170, - KEY_CONFIG = 171 /* AL Consumer Control Configuration */, - KEY_HOMEPAGE = 172 /* AC Home */, - KEY_REFRESH = 173 /* AC Refresh */, - KEY_EXIT = 174 /* AC Exit */, - KEY_MOVE = 175, - KEY_EDIT = 176, - KEY_SCROLLUP = 177, - KEY_SCROLLDOWN = 178, - KEY_KPLEFTPAREN = 179, - KEY_KPRIGHTPAREN =180, - KEY_NEW = 181 /* AC New */, - KEY_REDO = 182 /* AC Redo/Repeat */, - KEY_F13 = 183, - KEY_F14 = 184, - KEY_F15 = 185, - KEY_F16 = 186, - KEY_F17 = 187, - KEY_F18 = 188, - KEY_F19 = 189, - KEY_F20 = 190, - KEY_F21 = 191, - KEY_F22 = 192, - KEY_F23 = 193, - KEY_F24 = 194, - KEY_PLAYCD = 200, - KEY_PAUSECD = 201, - KEY_PROG3 = 202, - KEY_PROG4 = 203, - KEY_DASHBOARD = 204 /* AL Dashboard */, - KEY_SUSPEND = 205, - KEY_CLOSE = 206 /* AC Close */, - KEY_PLAY = 207, - KEY_FASTFORWARD = 208, - KEY_BASSBOOST = 209, - KEY_PRINT = 210 /* AC Print */, - KEY_HP = 211, - KEY_CAMERA = 212, - KEY_SOUND = 213, - KEY_QUESTION = 214, - KEY_EMAIL = 215, - KEY_CHAT = 216, - KEY_SEARCH = 217, - KEY_CONNECT = 218, - KEY_FINANCE = 219, - KEY_SPORT = 220, - KEY_SHOP = 221, - KEY_ALTERASE = 222, - KEY_CANCEL = 223, - KEY_BRIGHTNESSDOWN =224, - KEY_BRIGHTNESSUP =225, - KEY_MEDIA = 226, + KEY_RESERVED = 0, + KEY_ESC = 1, + KEY_1 = 2, + KEY_2 = 3, + KEY_3 = 4, + KEY_4 = 5, + KEY_5 = 6, + KEY_6 = 7, + KEY_7 = 8, + KEY_8 = 9, + KEY_9 = 10, + KEY_0 = 11, + KEY_MINUS = 12, + KEY_EQUAL = 13, + KEY_BACKSPACE = 14, + KEY_TAB = 15, + KEY_Q = 16, + KEY_W = 17, + KEY_E = 18, + KEY_R = 19, + KEY_T = 20, + KEY_Y = 21, + KEY_U = 22, + KEY_I = 23, + KEY_O = 24, + KEY_P = 25, + KEY_LEFTBRACE = 26, + KEY_RIGHTBRACE = 27, + KEY_ENTER = 28, + KEY_LEFTCTRL = 29, + KEY_A = 30, + KEY_S = 31, + KEY_D = 32, + KEY_F = 33, + KEY_G = 34, + KEY_H = 35, + KEY_J = 36, + KEY_K = 37, + KEY_L = 38, + KEY_SEMICOLON = 39, + KEY_APOSTROPHE = 40, + KEY_GRAVE = 41, + KEY_LEFTSHIFT = 42, + KEY_BACKSLASH = 43, + KEY_Z = 44, + KEY_X = 45, + KEY_C = 46, + KEY_V = 47, + KEY_B = 48, + KEY_N = 49, + KEY_M = 50, + KEY_COMMA = 51, + KEY_DOT = 52, + KEY_SLASH = 53, + KEY_RIGHTSHIFT = 54, + KEY_KPASTERISK = 55, + KEY_LEFTALT = 56, + KEY_SPACE = 57, + KEY_CAPSLOCK = 58, + KEY_F1 = 59, + KEY_F2 = 60, + KEY_F3 = 61, + KEY_F4 = 62, + KEY_F5 = 63, + KEY_F6 = 64, + KEY_F7 = 65, + KEY_F8 = 66, + KEY_F9 = 67, + KEY_F10 = 68, + KEY_NUMLOCK = 69, + KEY_SCROLLLOCK = 70, + KEY_KP7 = 71, + KEY_KP8 = 72, + KEY_KP9 = 73, + KEY_KPMINUS = 74, + KEY_KP4 = 75, + KEY_KP5 = 76, + KEY_KP6 = 77, + KEY_KPPLUS = 78, + KEY_KP1 = 79, + KEY_KP2 = 80, + KEY_KP3 = 81, + KEY_KP0 = 82, + KEY_KPDOT = 83, + KEY_ZENKAKUHANKAKU = 85, + KEY_102ND = 86, + KEY_F11 = 87, + KEY_F12 = 88, + KEY_RO = 89, + KEY_KATAKANA = 90, + KEY_HIRAGANA = 91, + KEY_HENKAN = 92, + KEY_KATAKANAHIRAGANA = 93, + KEY_MUHENKAN = 94, + KEY_KPJPCOMMA = 95, + KEY_KPENTER = 96, + KEY_RIGHTCTRL = 97, + KEY_KPSLASH = 98, + KEY_SYSRQ = 99, + KEY_RIGHTALT = 100, + KEY_LINEFEED = 101, + KEY_HOME = 102, + KEY_UP = 103, + KEY_PAGEUP = 104, + KEY_LEFT = 105, + KEY_RIGHT = 106, + KEY_END = 107, + KEY_DOWN = 108, + KEY_PAGEDOWN = 109, + KEY_INSERT = 110, + KEY_DELETE = 111, + KEY_MACRO = 112, + KEY_MUTE = 113, + KEY_VOLUMEDOWN = 114, + KEY_VOLUMEUP = 115, + KEY_POWER = 116, /* SC System Power Down */ + KEY_KPEQUAL = 117, + KEY_KPPLUSMINUS = 118, + KEY_PAUSE = 119, + KEY_SCALE = 120, /* AL Compiz Scale (Expose) */ + KEY_KPCOMMA = 121, + KEY_HANGEUL = 122, + KEY_HANJA = 123, + KEY_YEN = 124, + KEY_LEFTMETA = 125, + KEY_RIGHTMETA = 126, + KEY_COMPOSE = 127, + KEY_STOP = 128, /* AC Stop */ + KEY_AGAIN = 129, + KEY_PROPS = 130, /* AC Properties */ + KEY_UNDO = 131, /* AC Undo */ + KEY_FRONT = 132, + KEY_COPY = 133, /* AC Copy */ + KEY_OPEN = 134, /* AC Open */ + KEY_PASTE = 135, /* AC Paste */ + KEY_FIND = 136, /* AC Search */ + KEY_CUT = 137, /* AC Cut */ + KEY_HELP = 138, /* AL Integrated Help Center */ + KEY_MENU = 139, /* Menu (show menu) */ + KEY_CALC = 140, /* AL Calculator */ + KEY_SETUP = 141, + KEY_SLEEP = 142, /* SC System Sleep */ + KEY_WAKEUP = 143, /* System Wake Up */ + KEY_FILE = 144, /* AL Local Machine Browser */ + KEY_SENDFILE = 145, + KEY_DELETEFILE = 146, + KEY_XFER = 147, + KEY_PROG1 = 148, + KEY_PROG2 = 149, + KEY_WWW = 150, /* AL Internet Browser */ + KEY_MSDOS = 151, + KEY_COFFEE = 152, /* AL Terminal Lock/Screensaver */ + KEY_DIRECTION = 153, + KEY_CYCLEWINDOWS = 154, + KEY_MAIL = 155, + KEY_BOOKMARKS = 156, /* AC Bookmarks */ + KEY_COMPUTER = 157, + KEY_BACK = 158, /* AC Back */ + KEY_FORWARD = 159, /* AC Forward */ + KEY_CLOSECD = 160, + KEY_EJECTCD = 161, + KEY_EJECTCLOSECD = 162, + KEY_NEXTSONG = 163, + KEY_PLAYPAUSE = 164, + KEY_PREVIOUSSONG = 165, + KEY_STOPCD = 166, + KEY_RECORD = 167, + KEY_REWIND = 168, + KEY_PHONE = 169, /* Media Select Telephone */ + KEY_ISO = 170, + KEY_CONFIG = 171, /* AL Consumer Control Configuration */ + KEY_HOMEPAGE = 172, /* AC Home */ + KEY_REFRESH = 173, /* AC Refresh */ + KEY_EXIT = 174, /* AC Exit */ + KEY_MOVE = 175, + KEY_EDIT = 176, + KEY_SCROLLUP = 177, + KEY_SCROLLDOWN = 178, + KEY_KPLEFTPAREN = 179, + KEY_KPRIGHTPAREN = 180, + KEY_NEW = 181, /* AC New */ + KEY_REDO = 182, /* AC Redo/Repeat */ + KEY_F13 = 183, + KEY_F14 = 184, + KEY_F15 = 185, + KEY_F16 = 186, + KEY_F17 = 187, + KEY_F18 = 188, + KEY_F19 = 189, + KEY_F20 = 190, + KEY_F21 = 191, + KEY_F22 = 192, + KEY_F23 = 193, + KEY_F24 = 194, + KEY_PLAYCD = 200, + KEY_PAUSECD = 201, + KEY_PROG3 = 202, + KEY_PROG4 = 203, + KEY_DASHBOARD = 204, /* AL Dashboard */ + KEY_SUSPEND = 205, + KEY_CLOSE = 206, /* AC Close */ + KEY_PLAY = 207, + KEY_FASTFORWARD = 208, + KEY_BASSBOOST = 209, + KEY_PRINT = 210, /* AC Print */ + KEY_HP = 211, + KEY_CAMERA = 212, + KEY_SOUND = 213, + KEY_QUESTION = 214, + KEY_EMAIL = 215, + KEY_CHAT = 216, + KEY_SEARCH = 217, + KEY_CONNECT = 218, + KEY_FINANCE = 219, + KEY_SPORT = 220, + KEY_SHOP = 221, + KEY_ALTERASE = 222, + KEY_CANCEL = 223, + KEY_BRIGHTNESSDOWN = 224, + KEY_BRIGHTNESSUP = 225, + KEY_MEDIA = 226, KEY_SWITCHVIDEOMODE = 227, KEY_KBDILLUMTOGGLE = 228, KEY_KBDILLUMDOWN = 229, - KEY_KBDILLUMUP = 230, - KEY_SEND = 231, - KEY_REPLY = 232, - KEY_FORWARDMAIL = 233, - KEY_SAVE = 234, - KEY_DOCUMENTS = 235, - KEY_BATTERY = 236, - KEY_BLUETOOTH = 237, - KEY_WLAN = 238, - KEY_UWB = 239, - KEY_UNKNOWN = 240, - KEY_VIDEO_NEXT = 241, - KEY_VIDEO_PREV = 242, - KEY_BRIGHTNESS_CYCLE =243, - KEY_BRIGHTNESS_AUTO =244, - KEY_DISPLAY_OFF = 245, - KEY_WWAN = 246, - KEY_RFKILL = 247, - KEY_MICMUTE = 248, - BTN_0 = 0x100, - BTN_1 = 0x101, - BTN_2 = 0x102, - BTN_3 = 0x103, - BTN_4 = 0x104, - BTN_5 = 0x105, - BTN_6 = 0x106, - BTN_7 = 0x107, - BTN_8 = 0x108, - BTN_9 = 0x109, - BTN_LEFT = 0x110, - BTN_RIGHT = 0x111, - BTN_MIDDLE = 0x112, - BTN_SIDE = 0x113, - BTN_EXTRA = 0x114, - BTN_FORWARD = 0x115, - BTN_BACK = 0x116, - BTN_TASK = 0x117, - BTN_TRIGGER = 0x120, - BTN_THUMB = 0x121, - BTN_THUMB2 = 0x122, - BTN_TOP = 0x123, - BTN_TOP2 = 0x124, - BTN_PINKIE = 0x125, - BTN_BASE = 0x126, - BTN_BASE2 = 0x127, - BTN_BASE3 = 0x128, - BTN_BASE4 = 0x129, - BTN_BASE5 = 0x12a, - BTN_BASE6 = 0x12b, - BTN_DEAD = 0x12f, - BTN_SOUTH = 0x130, - BTN_EAST = 0x131, - BTN_C = 0x132, - BTN_NORTH = 0x133, - BTN_WEST = 0x134, - BTN_Z = 0x135, - BTN_TL = 0x136, - BTN_TR = 0x137, - BTN_TL2 = 0x138, - BTN_TR2 = 0x139, - BTN_SELECT = 0x13a, - BTN_START = 0x13b, - BTN_MODE = 0x13c, - BTN_THUMBL = 0x13d, - BTN_THUMBR = 0x13e, - BTN_TOOL_PEN = 0x140, - BTN_TOOL_RUBBER = 0x141, - BTN_TOOL_BRUSH = 0x142, - BTN_TOOL_PENCIL = 0x143, - BTN_TOOL_AIRBRUSH =0x144, - BTN_TOOL_FINGER = 0x145, - BTN_TOOL_MOUSE = 0x146, - BTN_TOOL_LENS = 0x147, - BTN_TOOL_QUINTTAP =0x148 /* Five fingers on trackpad */, - BTN_TOUCH = 0x14a, - BTN_STYLUS = 0x14b, - BTN_STYLUS2 = 0x14c, - BTN_TOOL_DOUBLETAP =0x14d, - BTN_TOOL_TRIPLETAP =0x14e, - BTN_TOOL_QUADTAP =0x14f /* Four fingers on trackpad */, - BTN_GEAR_DOWN = 0x150, - BTN_GEAR_UP = 0x151, - KEY_OK = 0x160, - KEY_SELECT = 0x161, - KEY_GOTO = 0x162, - KEY_CLEAR = 0x163, - KEY_POWER2 = 0x164, - KEY_OPTION = 0x165, - KEY_INFO = 0x166 /* AL OEM Features/Tips/Tutorial */, - KEY_TIME = 0x167, - KEY_VENDOR = 0x168, - KEY_ARCHIVE = 0x169, - KEY_PROGRAM = 0x16a /* Media Select Program Guide */, - KEY_CHANNEL = 0x16b, - KEY_FAVORITES = 0x16c, - KEY_EPG = 0x16d, - KEY_PVR = 0x16e /* Media Select Home */, - KEY_MHP = 0x16f, - KEY_LANGUAGE = 0x170, - KEY_TITLE = 0x171, - KEY_SUBTITLE = 0x172, - KEY_ANGLE = 0x173, - KEY_ZOOM = 0x174, - KEY_MODE = 0x175, - KEY_KEYBOARD = 0x176, - KEY_SCREEN = 0x177, - KEY_PC = 0x178 /* Media Select Computer */, - KEY_TV = 0x179 /* Media Select TV */, - KEY_TV2 = 0x17a /* Media Select Cable */, - KEY_VCR = 0x17b /* Media Select VCR */, - KEY_VCR2 = 0x17c /* VCR Plus */, - KEY_SAT = 0x17d /* Media Select Satellite */, - KEY_SAT2 = 0x17e, - KEY_CD = 0x17f /* Media Select CD */, - KEY_TAPE = 0x180 /* Media Select Tape */, - KEY_RADIO = 0x181, - KEY_TUNER = 0x182 /* Media Select Tuner */, - KEY_PLAYER = 0x183, - KEY_TEXT = 0x184, - KEY_DVD = 0x185 /* Media Select DVD */, - KEY_AUX = 0x186, - KEY_MP3 = 0x187, - KEY_AUDIO = 0x188 /* AL Audio Browser */, - KEY_VIDEO = 0x189 /* AL Movie Browser */, - KEY_DIRECTORY = 0x18a, - KEY_LIST = 0x18b, - KEY_MEMO = 0x18c /* Media Select Messages */, - KEY_CALENDAR = 0x18d, - KEY_RED = 0x18e, - KEY_GREEN = 0x18f, - KEY_YELLOW = 0x190, - KEY_BLUE = 0x191, - KEY_CHANNELUP = 0x192 /* Channel Increment */, - KEY_CHANNELDOWN = 0x193 /* Channel Decrement */, - KEY_FIRST = 0x194, - KEY_LAST = 0x195 /* Recall Last */, - KEY_AB = 0x196, - KEY_NEXT = 0x197, - KEY_RESTART = 0x198, - KEY_SLOW = 0x199, - KEY_SHUFFLE = 0x19a, - KEY_BREAK = 0x19b, - KEY_PREVIOUS = 0x19c, - KEY_DIGITS = 0x19d, - KEY_TEEN = 0x19e, - KEY_TWEN = 0x19f, - KEY_VIDEOPHONE = 0x1a0 /* Media Select Video Phone */, - KEY_GAMES = 0x1a1 /* Media Select Games */, - KEY_ZOOMIN = 0x1a2 /* AC Zoom In */, - KEY_ZOOMOUT = 0x1a3 /* AC Zoom Out */, - KEY_ZOOMRESET = 0x1a4 /* AC Zoom */, - KEY_WORDPROCESSOR =0x1a5 /* AL Word Processor */, - KEY_EDITOR = 0x1a6 /* AL Text Editor */, - KEY_SPREADSHEET = 0x1a7 /* AL Spreadsheet */, - KEY_GRAPHICSEDITOR =0x1a8 /* AL Graphics Editor */, - KEY_PRESENTATION =0x1a9 /* AL Presentation App */, - KEY_DATABASE = 0x1aa /* AL Database App */, - KEY_NEWS = 0x1ab /* AL Newsreader */, - KEY_VOICEMAIL = 0x1ac /* AL Voicemail */, - KEY_ADDRESSBOOK = 0x1ad /* AL Contacts/Address Book */, - KEY_MESSENGER = 0x1ae /* AL Instant Messaging */, - KEY_DISPLAYTOGGLE =0x1af /* Turn display (LCD) on and off */, - KEY_SPELLCHECK = 0x1b0 /* AL Spell Check */, - KEY_LOGOFF = 0x1b1 /* AL Logoff */, - KEY_DOLLAR = 0x1b2, - KEY_EURO = 0x1b3, - KEY_FRAMEBACK = 0x1b4 /* Consumer - transport controls */, - KEY_FRAMEFORWARD =0x1b5, - KEY_CONTEXT_MENU =0x1b6 /* GenDesc - system context menu */, - KEY_MEDIA_REPEAT =0x1b7 /* Consumer - transport control */, - KEY_10CHANNELSUP =0x1b8 /* 10 channels up (10+) */, - KEY_10CHANNELSDOWN =0x1b9 /* 10 channels down (10-) */, - KEY_IMAGES = 0x1ba /* AL Image Browser */, - KEY_DEL_EOL = 0x1c0, - KEY_DEL_EOS = 0x1c1, - KEY_INS_LINE = 0x1c2, - KEY_DEL_LINE = 0x1c3, - KEY_FN = 0x1d0, - KEY_FN_ESC = 0x1d1, - KEY_FN_F1 = 0x1d2, - KEY_FN_F2 = 0x1d3, - KEY_FN_F3 = 0x1d4, - KEY_FN_F4 = 0x1d5, - KEY_FN_F5 = 0x1d6, - KEY_FN_F6 = 0x1d7, - KEY_FN_F7 = 0x1d8, - KEY_FN_F8 = 0x1d9, - KEY_FN_F9 = 0x1da, - KEY_FN_F10 = 0x1db, - KEY_FN_F11 = 0x1dc, - KEY_FN_F12 = 0x1dd, - KEY_FN_1 = 0x1de, - KEY_FN_2 = 0x1df, - KEY_FN_D = 0x1e0, - KEY_FN_E = 0x1e1, - KEY_FN_F = 0x1e2, - KEY_FN_S = 0x1e3, - KEY_FN_B = 0x1e4, - KEY_BRL_DOT1 = 0x1f1, - KEY_BRL_DOT2 = 0x1f2, - KEY_BRL_DOT3 = 0x1f3, - KEY_BRL_DOT4 = 0x1f4, - KEY_BRL_DOT5 = 0x1f5, - KEY_BRL_DOT6 = 0x1f6, - KEY_BRL_DOT7 = 0x1f7, - KEY_BRL_DOT8 = 0x1f8, - KEY_BRL_DOT9 = 0x1f9, - KEY_BRL_DOT10 = 0x1fa, - KEY_NUMERIC_0 = 0x200 /* used by phones, remote controls, */, - KEY_NUMERIC_1 = 0x201 /* and other keypads */, - KEY_NUMERIC_2 = 0x202, - KEY_NUMERIC_3 = 0x203, - KEY_NUMERIC_4 = 0x204, - KEY_NUMERIC_5 = 0x205, - KEY_NUMERIC_6 = 0x206, - KEY_NUMERIC_7 = 0x207, - KEY_NUMERIC_8 = 0x208, - KEY_NUMERIC_9 = 0x209, - KEY_NUMERIC_STAR =0x20a, - KEY_NUMERIC_POUND =0x20b, - KEY_CAMERA_FOCUS =0x210, - KEY_WPS_BUTTON = 0x211 /* WiFi Protected Setup key */, - KEY_TOUCHPAD_TOGGLE =0x212 /* Request switch touchpad on or off */, - KEY_TOUCHPAD_ON = 0x213, - KEY_TOUCHPAD_OFF =0x214, - KEY_CAMERA_ZOOMIN =0x215, - KEY_CAMERA_ZOOMOUT =0x216, - KEY_CAMERA_UP = 0x217, - KEY_CAMERA_DOWN = 0x218, - KEY_CAMERA_LEFT = 0x219, - KEY_CAMERA_RIGHT =0x21a, - KEY_ATTENDANT_ON =0x21b, - KEY_ATTENDANT_OFF =0x21c, - KEY_ATTENDANT_TOGGLE =0x21d /* Attendant call on or off */, - KEY_LIGHTS_TOGGLE =0x21e /* Reading light on or off */, - BTN_DPAD_UP = 0x220, - BTN_DPAD_DOWN = 0x221, - BTN_DPAD_LEFT = 0x222, - BTN_DPAD_RIGHT = 0x223, - KEY_ALS_TOGGLE = 0x230 /* Ambient light sensor */, - KEY_BUTTONCONFIG = 0x240 /* AL Button Configuration */, - KEY_TASKMANAGER = 0x241 /* AL Task/Project Manager */, - KEY_JOURNAL = 0x242 /* AL Log/Journal/Timecard */, - KEY_CONTROLPANEL = 0x243 /* AL Control Panel */, - KEY_APPSELECT = 0x244 /* AL Select Task/Application */, - KEY_SCREENSAVER = 0x245 /* AL Screen Saver */, - KEY_VOICECOMMAND = 0x246 /* Listening Voice Command */, - KEY_BRIGHTNESS_MIN = 0x250 /* Set Brightness to Minimum */, - KEY_BRIGHTNESS_MAX = 0x251 /* Set Brightness to Maximum */, - KEY_KBDINPUTASSIST_PREV = 0x260, - KEY_KBDINPUTASSIST_NEXT = 0x261, - KEY_KBDINPUTASSIST_PREVGROUP = 0x262, - KEY_KBDINPUTASSIST_NEXTGROUP = 0x263, - KEY_KBDINPUTASSIST_ACCEPT = 0x264, - KEY_KBDINPUTASSIST_CANCEL = 0x265, - BTN_TRIGGER_HAPPY1 = 0x2c0, - BTN_TRIGGER_HAPPY2 = 0x2c1, - BTN_TRIGGER_HAPPY3 = 0x2c2, - BTN_TRIGGER_HAPPY4 = 0x2c3, - BTN_TRIGGER_HAPPY5 = 0x2c4, - BTN_TRIGGER_HAPPY6 = 0x2c5, - BTN_TRIGGER_HAPPY7 = 0x2c6, - BTN_TRIGGER_HAPPY8 = 0x2c7, - BTN_TRIGGER_HAPPY9 = 0x2c8, - BTN_TRIGGER_HAPPY10 = 0x2c9, - BTN_TRIGGER_HAPPY11 = 0x2ca, - BTN_TRIGGER_HAPPY12 = 0x2cb, - BTN_TRIGGER_HAPPY13 = 0x2cc, - BTN_TRIGGER_HAPPY14 = 0x2cd, - BTN_TRIGGER_HAPPY15 = 0x2ce, - BTN_TRIGGER_HAPPY16 = 0x2cf, - BTN_TRIGGER_HAPPY17 = 0x2d0, - BTN_TRIGGER_HAPPY18 = 0x2d1, - BTN_TRIGGER_HAPPY19 = 0x2d2, - BTN_TRIGGER_HAPPY20 = 0x2d3, - BTN_TRIGGER_HAPPY21 = 0x2d4, - BTN_TRIGGER_HAPPY22 = 0x2d5, - BTN_TRIGGER_HAPPY23 = 0x2d6, - BTN_TRIGGER_HAPPY24 = 0x2d7, - BTN_TRIGGER_HAPPY25 = 0x2d8, - BTN_TRIGGER_HAPPY26 = 0x2d9, - BTN_TRIGGER_HAPPY27 = 0x2da, - BTN_TRIGGER_HAPPY28 = 0x2db, - BTN_TRIGGER_HAPPY29 = 0x2dc, - BTN_TRIGGER_HAPPY30 = 0x2dd, - BTN_TRIGGER_HAPPY31 = 0x2de, - BTN_TRIGGER_HAPPY32 = 0x2df, - BTN_TRIGGER_HAPPY33 = 0x2e0, - BTN_TRIGGER_HAPPY34 = 0x2e1, - BTN_TRIGGER_HAPPY35 = 0x2e2, - BTN_TRIGGER_HAPPY36 = 0x2e3, - BTN_TRIGGER_HAPPY37 = 0x2e4, - BTN_TRIGGER_HAPPY38 = 0x2e5, - BTN_TRIGGER_HAPPY39 = 0x2e6, - BTN_TRIGGER_HAPPY40 = 0x2e7, - KEY_MAX = 0x2ff, + KEY_KBDILLUMUP = 230, + KEY_SEND = 231, + KEY_REPLY = 232, + KEY_FORWARDMAIL = 233, + KEY_SAVE = 234, + KEY_DOCUMENTS = 235, + KEY_BATTERY = 236, + KEY_BLUETOOTH = 237, + KEY_WLAN = 238, + KEY_UWB = 239, + KEY_UNKNOWN = 240, + KEY_VIDEO_NEXT = 241, + KEY_VIDEO_PREV = 242, + KEY_BRIGHTNESS_CYCLE = 243, + KEY_BRIGHTNESS_AUTO = 244, + KEY_DISPLAY_OFF = 245, + KEY_WWAN = 246, + KEY_RFKILL = 247, + KEY_MICMUTE = 248, + BTN_0 = 0x100, + BTN_1 = 0x101, + BTN_2 = 0x102, + BTN_3 = 0x103, + BTN_4 = 0x104, + BTN_5 = 0x105, + BTN_6 = 0x106, + BTN_7 = 0x107, + BTN_8 = 0x108, + BTN_9 = 0x109, + BTN_LEFT = 0x110, + BTN_RIGHT = 0x111, + BTN_MIDDLE = 0x112, + BTN_SIDE = 0x113, + BTN_EXTRA = 0x114, + BTN_FORWARD = 0x115, + BTN_BACK = 0x116, + BTN_TASK = 0x117, + BTN_TRIGGER = 0x120, + BTN_THUMB = 0x121, + BTN_THUMB2 = 0x122, + BTN_TOP = 0x123, + BTN_TOP2 = 0x124, + BTN_PINKIE = 0x125, + BTN_BASE = 0x126, + BTN_BASE2 = 0x127, + BTN_BASE3 = 0x128, + BTN_BASE4 = 0x129, + BTN_BASE5 = 0x12a, + BTN_BASE6 = 0x12b, + BTN_DEAD = 0x12f, + BTN_SOUTH = 0x130, + BTN_EAST = 0x131, + BTN_C = 0x132, + BTN_NORTH = 0x133, + BTN_WEST = 0x134, + BTN_Z = 0x135, + BTN_TL = 0x136, + BTN_TR = 0x137, + BTN_TL2 = 0x138, + BTN_TR2 = 0x139, + BTN_SELECT = 0x13a, + BTN_START = 0x13b, + BTN_MODE = 0x13c, + BTN_THUMBL = 0x13d, + BTN_THUMBR = 0x13e, + BTN_TOOL_PEN = 0x140, + BTN_TOOL_RUBBER = 0x141, + BTN_TOOL_BRUSH = 0x142, + BTN_TOOL_PENCIL = 0x143, + BTN_TOOL_AIRBRUSH = 0x144, + BTN_TOOL_FINGER = 0x145, + BTN_TOOL_MOUSE = 0x146, + BTN_TOOL_LENS = 0x147, + BTN_TOOL_QUINTTAP = 0x148, /* Five fingers on trackpad */ + BTN_TOUCH = 0x14a, + BTN_STYLUS = 0x14b, + BTN_STYLUS2 = 0x14c, + BTN_TOOL_DOUBLETAP = 0x14d, + BTN_TOOL_TRIPLETAP = 0x14e, + BTN_TOOL_QUADTAP = 0x14f, /* Four fingers on trackpad */ + BTN_GEAR_DOWN = 0x150, + BTN_GEAR_UP = 0x151, + KEY_OK = 0x160, + KEY_SELECT = 0x161, + KEY_GOTO = 0x162, + KEY_CLEAR = 0x163, + KEY_POWER2 = 0x164, + KEY_OPTION = 0x165, + KEY_INFO = 0x166, /* AL OEM Features/Tips/Tutorial */ + KEY_TIME = 0x167, + KEY_VENDOR = 0x168, + KEY_ARCHIVE = 0x169, + KEY_PROGRAM = 0x16a, /* Media Select Program Guide */ + KEY_CHANNEL = 0x16b, + KEY_FAVORITES = 0x16c, + KEY_EPG = 0x16d, + KEY_PVR = 0x16e, /* Media Select Home */ + KEY_MHP = 0x16f, + KEY_LANGUAGE = 0x170, + KEY_TITLE = 0x171, + KEY_SUBTITLE = 0x172, + KEY_ANGLE = 0x173, + KEY_ZOOM = 0x174, + KEY_MODE = 0x175, + KEY_KEYBOARD = 0x176, + KEY_SCREEN = 0x177, + KEY_PC = 0x178, /* Media Select Computer */ + KEY_TV = 0x179, /* Media Select TV */ + KEY_TV2 = 0x17a, /* Media Select Cable */ + KEY_VCR = 0x17b, /* Media Select VCR */ + KEY_VCR2 = 0x17c, /* VCR Plus */ + KEY_SAT = 0x17d, /* Media Select Satellite */ + KEY_SAT2 = 0x17e, + KEY_CD = 0x17f, /* Media Select CD */ + KEY_TAPE = 0x180, /* Media Select Tape */ + KEY_RADIO = 0x181, + KEY_TUNER = 0x182, /* Media Select Tuner */ + KEY_PLAYER = 0x183, + KEY_TEXT = 0x184, + KEY_DVD = 0x185, /* Media Select DVD */ + KEY_AUX = 0x186, + KEY_MP3 = 0x187, + KEY_AUDIO = 0x188, /* AL Audio Browser */ + KEY_VIDEO = 0x189, /* AL Movie Browser */ + KEY_DIRECTORY = 0x18a, + KEY_LIST = 0x18b, + KEY_MEMO = 0x18c, /* Media Select Messages */ + KEY_CALENDAR = 0x18d, + KEY_RED = 0x18e, + KEY_GREEN = 0x18f, + KEY_YELLOW = 0x190, + KEY_BLUE = 0x191, + KEY_CHANNELUP = 0x192, /* Channel Increment */ + KEY_CHANNELDOWN = 0x193, /* Channel Decrement */ + KEY_FIRST = 0x194, + KEY_LAST = 0x195, /* Recall Last */ + KEY_AB = 0x196, + KEY_NEXT = 0x197, + KEY_RESTART = 0x198, + KEY_SLOW = 0x199, + KEY_SHUFFLE = 0x19a, + KEY_BREAK = 0x19b, + KEY_PREVIOUS = 0x19c, + KEY_DIGITS = 0x19d, + KEY_TEEN = 0x19e, + KEY_TWEN = 0x19f, + KEY_VIDEOPHONE = 0x1a0, /* Media Select Video Phone */ + KEY_GAMES = 0x1a1, /* Media Select Games */ + KEY_ZOOMIN = 0x1a2, /* AC Zoom In */ + KEY_ZOOMOUT = 0x1a3, /* AC Zoom Out */ + KEY_ZOOMRESET = 0x1a4, /* AC Zoom */ + KEY_WORDPROCESSOR = 0x1a5, /* AL Word Processor */ + KEY_EDITOR = 0x1a6, /* AL Text Editor */ + KEY_SPREADSHEET = 0x1a7, /* AL Spreadsheet */ + KEY_GRAPHICSEDITOR = 0x1a8, /* AL Graphics Editor */ + KEY_PRESENTATION = 0x1a9, /* AL Presentation App */ + KEY_DATABASE = 0x1aa, /* AL Database App */ + KEY_NEWS = 0x1ab, /* AL Newsreader */ + KEY_VOICEMAIL = 0x1ac, /* AL Voicemail */ + KEY_ADDRESSBOOK = 0x1ad, /* AL Contacts/Address Book */ + KEY_MESSENGER = 0x1ae, /* AL Instant Messaging */ + KEY_DISPLAYTOGGLE = 0x1af, /* Turn display (LCD) on and off */ + KEY_SPELLCHECK = 0x1b0, /* AL Spell Check */ + KEY_LOGOFF = 0x1b1, /* AL Logoff */ + KEY_DOLLAR = 0x1b2, + KEY_EURO = 0x1b3, + KEY_FRAMEBACK = 0x1b4, /* Consumer - transport controls */ + KEY_FRAMEFORWARD = 0x1b5, + KEY_CONTEXT_MENU = 0x1b6, /* GenDesc - system context menu */ + KEY_MEDIA_REPEAT = 0x1b7, /* Consumer - transport control */ + KEY_10CHANNELSUP = 0x1b8, /* 10 channels up (10+) */ + KEY_10CHANNELSDOWN = 0x1b9, /* 10 channels down (10-) */ + KEY_IMAGES = 0x1ba, /* AL Image Browser */ + KEY_DEL_EOL = 0x1c0, + KEY_DEL_EOS = 0x1c1, + KEY_INS_LINE = 0x1c2, + KEY_DEL_LINE = 0x1c3, + KEY_FN = 0x1d0, + KEY_FN_ESC = 0x1d1, + KEY_FN_F1 = 0x1d2, + KEY_FN_F2 = 0x1d3, + KEY_FN_F3 = 0x1d4, + KEY_FN_F4 = 0x1d5, + KEY_FN_F5 = 0x1d6, + KEY_FN_F6 = 0x1d7, + KEY_FN_F7 = 0x1d8, + KEY_FN_F8 = 0x1d9, + KEY_FN_F9 = 0x1da, + KEY_FN_F10 = 0x1db, + KEY_FN_F11 = 0x1dc, + KEY_FN_F12 = 0x1dd, + KEY_FN_1 = 0x1de, + KEY_FN_2 = 0x1df, + KEY_FN_D = 0x1e0, + KEY_FN_E = 0x1e1, + KEY_FN_F = 0x1e2, + KEY_FN_S = 0x1e3, + KEY_FN_B = 0x1e4, + KEY_BRL_DOT1 = 0x1f1, + KEY_BRL_DOT2 = 0x1f2, + KEY_BRL_DOT3 = 0x1f3, + KEY_BRL_DOT4 = 0x1f4, + KEY_BRL_DOT5 = 0x1f5, + KEY_BRL_DOT6 = 0x1f6, + KEY_BRL_DOT7 = 0x1f7, + KEY_BRL_DOT8 = 0x1f8, + KEY_BRL_DOT9 = 0x1f9, + KEY_BRL_DOT10 = 0x1fa, + KEY_NUMERIC_0 = 0x200, /* used by phones, remote controls, */ + KEY_NUMERIC_1 = 0x201, /* and other keypads */ + KEY_NUMERIC_2 = 0x202, + KEY_NUMERIC_3 = 0x203, + KEY_NUMERIC_4 = 0x204, + KEY_NUMERIC_5 = 0x205, + KEY_NUMERIC_6 = 0x206, + KEY_NUMERIC_7 = 0x207, + KEY_NUMERIC_8 = 0x208, + KEY_NUMERIC_9 = 0x209, + KEY_NUMERIC_STAR = 0x20a, + KEY_NUMERIC_POUND = 0x20b, + KEY_CAMERA_FOCUS = 0x210, + KEY_WPS_BUTTON = 0x211, /* WiFi Protected Setup key */ + KEY_TOUCHPAD_TOGGLE = 0x212, /* Request switch touchpad on or off */ + KEY_TOUCHPAD_ON = 0x213, + KEY_TOUCHPAD_OFF = 0x214, + KEY_CAMERA_ZOOMIN = 0x215, + KEY_CAMERA_ZOOMOUT = 0x216, + KEY_CAMERA_UP = 0x217, + KEY_CAMERA_DOWN = 0x218, + KEY_CAMERA_LEFT = 0x219, + KEY_CAMERA_RIGHT = 0x21a, + KEY_ATTENDANT_ON = 0x21b, + KEY_ATTENDANT_OFF = 0x21c, + KEY_ATTENDANT_TOGGLE = 0x21d, /* Attendant call on or off */ + KEY_LIGHTS_TOGGLE = 0x21e, /* Reading light on or off */ + BTN_DPAD_UP = 0x220, + BTN_DPAD_DOWN = 0x221, + BTN_DPAD_LEFT = 0x222, + BTN_DPAD_RIGHT = 0x223, + KEY_ALS_TOGGLE = 0x230, /* Ambient light sensor */ + KEY_BUTTONCONFIG = 0x240, /* AL Button Configuration */ + KEY_TASKMANAGER = 0x241, /* AL Task/Project Manager */ + KEY_JOURNAL = 0x242, /* AL Log/Journal/Timecard */ + KEY_CONTROLPANEL = 0x243, /* AL Control Panel */ + KEY_APPSELECT = 0x244, /* AL Select Task/Application */ + KEY_SCREENSAVER = 0x245, /* AL Screen Saver */ + KEY_VOICECOMMAND = 0x246, /* Listening Voice Command */ + KEY_BRIGHTNESS_MIN = 0x250, /* Set Brightness to Minimum */ + KEY_BRIGHTNESS_MAX = 0x251, /* Set Brightness to Maximum */ + KEY_KBDINPUTASSIST_PREV = 0x260, + KEY_KBDINPUTASSIST_NEXT = 0x261, + KEY_KBDINPUTASSIST_PREVGROUP = 0x262, + KEY_KBDINPUTASSIST_NEXTGROUP = 0x263, + KEY_KBDINPUTASSIST_ACCEPT = 0x264, + KEY_KBDINPUTASSIST_CANCEL = 0x265, + BTN_TRIGGER_HAPPY1 = 0x2c0, + BTN_TRIGGER_HAPPY2 = 0x2c1, + BTN_TRIGGER_HAPPY3 = 0x2c2, + BTN_TRIGGER_HAPPY4 = 0x2c3, + BTN_TRIGGER_HAPPY5 = 0x2c4, + BTN_TRIGGER_HAPPY6 = 0x2c5, + BTN_TRIGGER_HAPPY7 = 0x2c6, + BTN_TRIGGER_HAPPY8 = 0x2c7, + BTN_TRIGGER_HAPPY9 = 0x2c8, + BTN_TRIGGER_HAPPY10 = 0x2c9, + BTN_TRIGGER_HAPPY11 = 0x2ca, + BTN_TRIGGER_HAPPY12 = 0x2cb, + BTN_TRIGGER_HAPPY13 = 0x2cc, + BTN_TRIGGER_HAPPY14 = 0x2cd, + BTN_TRIGGER_HAPPY15 = 0x2ce, + BTN_TRIGGER_HAPPY16 = 0x2cf, + BTN_TRIGGER_HAPPY17 = 0x2d0, + BTN_TRIGGER_HAPPY18 = 0x2d1, + BTN_TRIGGER_HAPPY19 = 0x2d2, + BTN_TRIGGER_HAPPY20 = 0x2d3, + BTN_TRIGGER_HAPPY21 = 0x2d4, + BTN_TRIGGER_HAPPY22 = 0x2d5, + BTN_TRIGGER_HAPPY23 = 0x2d6, + BTN_TRIGGER_HAPPY24 = 0x2d7, + BTN_TRIGGER_HAPPY25 = 0x2d8, + BTN_TRIGGER_HAPPY26 = 0x2d9, + BTN_TRIGGER_HAPPY27 = 0x2da, + BTN_TRIGGER_HAPPY28 = 0x2db, + BTN_TRIGGER_HAPPY29 = 0x2dc, + BTN_TRIGGER_HAPPY30 = 0x2dd, + BTN_TRIGGER_HAPPY31 = 0x2de, + BTN_TRIGGER_HAPPY32 = 0x2df, + BTN_TRIGGER_HAPPY33 = 0x2e0, + BTN_TRIGGER_HAPPY34 = 0x2e1, + BTN_TRIGGER_HAPPY35 = 0x2e2, + BTN_TRIGGER_HAPPY36 = 0x2e3, + BTN_TRIGGER_HAPPY37 = 0x2e4, + BTN_TRIGGER_HAPPY38 = 0x2e5, + BTN_TRIGGER_HAPPY39 = 0x2e6, + BTN_TRIGGER_HAPPY40 = 0x2e7, +} + +impl Key { + pub const MAX: usize = 0x2ff; }