Skip to main content

uinput_tokio/event/
keyboard.rs

1use libc::c_int;
2use ffi::*;
3use crate::Event;
4use super::{Kind, Code, Press, Release};
5
6#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
7pub enum Keyboard {
8	All,
9	Key(Key),
10	KeyPad(KeyPad),
11	Misc(Misc),
12	InputAssist(InputAssist),
13	Function(Function),
14	Braille(Braille),
15	Numeric(Numeric),
16	TouchPad(TouchPad),
17	Camera(Camera),
18	Attendant(Attendant),
19}
20
21impl Into<Event> for Keyboard {
22	fn into(self) -> Event {
23		Event::Keyboard(self)
24	}
25}
26
27impl Press for Keyboard { }
28impl Release for Keyboard { }
29
30impl Kind for Keyboard {
31	fn kind(&self) -> c_int {
32		EV_KEY
33	}
34}
35
36impl Code for Keyboard {
37	fn code(&self) -> c_int {
38		match self {
39			&Keyboard::All => unreachable!(),
40
41			&Keyboard::Key(ref v)         => v.code(),
42			&Keyboard::KeyPad(ref v)      => v.code(),
43			&Keyboard::Misc(ref v)        => v.code(),
44			&Keyboard::InputAssist(ref v) => v.code(),
45			&Keyboard::Function(ref v)    => v.code(),
46			&Keyboard::Braille(ref v)     => v.code(),
47			&Keyboard::Numeric(ref v)     => v.code(),
48			&Keyboard::TouchPad(ref v)    => v.code(),
49			&Keyboard::Camera(ref v)      => v.code(),
50			&Keyboard::Attendant(ref v)   => v.code(),
51		}
52	}
53}
54
55custom_derive! {
56	#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, IterVariants(KeyVariants))]
57	pub enum Key {
58		Reserved,
59		Esc,
60		_1,
61		_2,
62		_3,
63		_4,
64		_5,
65		_6,
66		_7,
67		_8,
68		_9,
69		_0,
70		Minus,
71		Equal,
72		BackSpace,
73		Tab,
74		Q,
75		W,
76		E,
77		R,
78		T,
79		Y,
80		U,
81		I,
82		O,
83		P,
84		LeftBrace,
85		RightBrace,
86		Enter,
87		LeftControl,
88		A,
89		S,
90		D,
91		F,
92		G,
93		H,
94		J,
95		K,
96		L,
97		SemiColon,
98		Apostrophe,
99		Grave,
100		LeftShift,
101		BackSlash,
102		Z,
103		X,
104		C,
105		V,
106		B,
107		N,
108		M,
109		Comma,
110		Dot,
111		Slash,
112		RightShift,
113		LeftAlt,
114		Space,
115		CapsLock,
116		F1,
117		F2,
118		F3,
119		F4,
120		F5,
121		F6,
122		F7,
123		F8,
124		F9,
125		F10,
126		NumLock,
127		ScrollLock,
128		F11,
129		F12,
130		RightControl,
131		SysRq,
132		RightAlt,
133		LineFeed,
134		Home,
135		Up,
136		PageUp,
137		Left,
138		Right,
139		End,
140		Down,
141		PageDown,
142		Insert,
143		Delete,
144		LeftMeta,
145		RightMeta,
146		ScrollUp,
147		ScrollDown,
148		F13,
149		F14,
150		F15,
151		F16,
152		F17,
153		F18,
154		F19,
155		F20,
156		F21,
157		F22,
158		F23,
159		F24,
160	}
161}
162
163impl Into<Event> for Key {
164	fn into(self) -> Event {
165		Event::Keyboard(Keyboard::Key(self))
166	}
167}
168
169impl Press for Key { }
170impl Release for Key { }
171
172impl Kind for Key {
173	fn kind(&self) -> c_int {
174		EV_KEY
175	}
176}
177
178impl Code for Key {
179	fn code(&self) -> c_int {
180		match self {
181			&Key::Reserved         => KEY_RESERVED,
182			&Key::Esc              => KEY_ESC,
183			&Key::_1               => KEY_1,
184			&Key::_2               => KEY_2,
185			&Key::_3               => KEY_3,
186			&Key::_4               => KEY_4,
187			&Key::_5               => KEY_5,
188			&Key::_6               => KEY_6,
189			&Key::_7               => KEY_7,
190			&Key::_8               => KEY_8,
191			&Key::_9               => KEY_9,
192			&Key::_0               => KEY_10,
193			&Key::Minus            => KEY_MINUS,
194			&Key::Equal            => KEY_EQUAL,
195			&Key::BackSpace        => KEY_BACKSPACE,
196			&Key::Tab              => KEY_TAB,
197			&Key::Q                => KEY_Q,
198			&Key::W                => KEY_W,
199			&Key::E                => KEY_E,
200			&Key::R                => KEY_R,
201			&Key::T                => KEY_T,
202			&Key::Y                => KEY_Y,
203			&Key::U                => KEY_U,
204			&Key::I                => KEY_I,
205			&Key::O                => KEY_O,
206			&Key::P                => KEY_P,
207			&Key::LeftBrace        => KEY_LEFTBRACE,
208			&Key::RightBrace       => KEY_RIGHTBRACE,
209			&Key::Enter            => KEY_ENTER,
210			&Key::LeftControl      => KEY_LEFTCTRL,
211			&Key::A                => KEY_A,
212			&Key::S                => KEY_S,
213			&Key::D                => KEY_D,
214			&Key::F                => KEY_F,
215			&Key::G                => KEY_G,
216			&Key::H                => KEY_H,
217			&Key::J                => KEY_J,
218			&Key::K                => KEY_K,
219			&Key::L                => KEY_L,
220			&Key::SemiColon        => KEY_SEMICOLON,
221			&Key::Apostrophe       => KEY_APOSTROPHE,
222			&Key::Grave            => KEY_GRAVE,
223			&Key::LeftShift        => KEY_LEFTSHIFT,
224			&Key::BackSlash        => KEY_BACKSLASH,
225			&Key::Z                => KEY_Z,
226			&Key::X                => KEY_X,
227			&Key::C                => KEY_C,
228			&Key::V                => KEY_V,
229			&Key::B                => KEY_B,
230			&Key::N                => KEY_N,
231			&Key::M                => KEY_M,
232			&Key::Comma            => KEY_COMMA,
233			&Key::Dot              => KEY_DOT,
234			&Key::Slash            => KEY_SLASH,
235			&Key::RightShift       => KEY_RIGHTSHIFT,
236			&Key::LeftAlt          => KEY_LEFTALT,
237			&Key::Space            => KEY_SPACE,
238			&Key::CapsLock         => KEY_CAPSLOCK,
239			&Key::F1               => KEY_F1,
240			&Key::F2               => KEY_F2,
241			&Key::F3               => KEY_F3,
242			&Key::F4               => KEY_F4,
243			&Key::F5               => KEY_F5,
244			&Key::F6               => KEY_F6,
245			&Key::F7               => KEY_F7,
246			&Key::F8               => KEY_F8,
247			&Key::F9               => KEY_F9,
248			&Key::F10              => KEY_F10,
249			&Key::NumLock          => KEY_NUMLOCK,
250			&Key::ScrollLock       => KEY_SCROLLLOCK,
251			&Key::F11              => KEY_F11,
252			&Key::F12              => KEY_F12,
253			&Key::RightControl     => KEY_RIGHTCTRL,
254			&Key::SysRq            => KEY_SYSRQ,
255			&Key::RightAlt         => KEY_RIGHTALT,
256			&Key::LineFeed         => KEY_LINEFEED,
257			&Key::Home             => KEY_HOME,
258			&Key::Up               => KEY_UP,
259			&Key::PageUp           => KEY_PAGEUP,
260			&Key::Left             => KEY_LEFT,
261			&Key::Right            => KEY_RIGHT,
262			&Key::End              => KEY_END,
263			&Key::Down             => KEY_DOWN,
264			&Key::PageDown         => KEY_PAGEDOWN,
265			&Key::Insert           => KEY_INSERT,
266			&Key::Delete           => KEY_DELETE,
267			&Key::LeftMeta         => KEY_LEFTMETA,
268			&Key::RightMeta        => KEY_RIGHTMETA,
269			&Key::ScrollUp         => KEY_SCROLLUP,
270			&Key::ScrollDown       => KEY_SCROLLDOWN,
271			&Key::F13              => KEY_F13,
272			&Key::F14              => KEY_F14,
273			&Key::F15              => KEY_F15,
274			&Key::F16              => KEY_F16,
275			&Key::F17              => KEY_F17,
276			&Key::F18              => KEY_F18,
277			&Key::F19              => KEY_F19,
278			&Key::F20              => KEY_F20,
279			&Key::F21              => KEY_F21,
280			&Key::F22              => KEY_F22,
281			&Key::F23              => KEY_F23,
282			&Key::F24              => KEY_F24,
283		}
284	}
285}
286
287custom_derive! {
288	#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, IterVariants(KeyPadVariants))]
289	pub enum KeyPad {
290		Asterisk,
291		_7,
292		_8,
293		_9,
294		Minus,
295		_4,
296		_5,
297		_6,
298		Plus,
299		_1,
300		_2,
301		_3,
302		_0,
303		Dot,
304		AltComma,
305		Enter,
306		Slash,
307		Equal,
308		PlusMinus,
309		Comma,
310		LeftParen,
311		RightParen,
312	}
313}
314
315impl Into<Event> for KeyPad {
316	fn into(self) -> Event {
317		Event::Keyboard(Keyboard::KeyPad(self))
318	}
319}
320
321impl Press for KeyPad { }
322impl Release for KeyPad { }
323
324impl Kind for KeyPad {
325	fn kind(&self) -> c_int {
326		EV_KEY
327	}
328}
329
330impl Code for KeyPad {
331	fn code(&self) -> c_int {
332		match self {
333			&KeyPad::Asterisk   => KEY_KPASTERISK,
334			&KeyPad::_7         => KEY_KP7,
335			&KeyPad::_8         => KEY_KP8,
336			&KeyPad::_9         => KEY_KP9,
337			&KeyPad::Minus      => KEY_KPMINUS,
338			&KeyPad::_4         => KEY_KP4,
339			&KeyPad::_5         => KEY_KP5,
340			&KeyPad::_6         => KEY_KP6,
341			&KeyPad::Plus       => KEY_KPPLUS,
342			&KeyPad::_1         => KEY_KP1,
343			&KeyPad::_2         => KEY_KP2,
344			&KeyPad::_3         => KEY_KP3,
345			&KeyPad::_0         => KEY_KP0,
346			&KeyPad::Dot        => KEY_KPDOT,
347			&KeyPad::AltComma   => KEY_KPJPCOMMA,
348			&KeyPad::Enter      => KEY_KPENTER,
349			&KeyPad::Slash      => KEY_KPSLASH,
350			&KeyPad::Equal      => KEY_KPEQUAL,
351			&KeyPad::PlusMinus  => KEY_KPPLUSMINUS,
352			&KeyPad::Comma      => KEY_KPCOMMA,
353			&KeyPad::LeftParen  => KEY_KPLEFTPAREN,
354			&KeyPad::RightParen => KEY_KPRIGHTPAREN,
355		}
356	}
357}
358
359custom_derive! {
360	#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, IterVariants(MiscVariants))]
361	pub enum Misc {
362		ZenkakuHankaku,
363		ND102,
364		RO,
365		Katakana,
366		Hiragana,
367		Henkan,
368		KatakanaHiragana,
369		Muhenkan,
370		Macro,
371		Mute,
372		VolumeDown,
373		VolumeUp,
374		Power,
375		Pause,
376		Scale,
377		Hangeul,
378		Hanguel,
379		Hanja,
380		Yen,
381		Compose,
382		Stop,
383		Again,
384		Props,
385		Undo,
386		Front,
387		Copy,
388		Open,
389		Paste,
390		Find,
391		Cut,
392		Help,
393		Menu,
394		Calc,
395		Setup,
396		Sleep,
397		WakeUp,
398		File,
399		SendFile,
400		DeleteFile,
401		XFer,
402		Prog1,
403		Prog2,
404		WWW,
405		MSDOS,
406		Coffee,
407		ScreenLock,
408		RotateDisplay,
409		Direction,
410		CycleWindows,
411		Mail,
412		Bookmarks,
413		Computer,
414		Back,
415		Forward,
416		CloseCD,
417		EjectCD,
418		EjectCloseCD,
419		NextSong,
420		PlayPause,
421		PreviousSong,
422		StopCD,
423		Record,
424		Rewind,
425		Phone,
426		Iso,
427		Config,
428		HomePage,
429		Refresh,
430		Exit,
431		Move,
432		Edit,
433		New,
434		Redo,
435		PlayCD,
436		PauseCD,
437		Prog3,
438		Prog4,
439		DashBoard,
440		Suspend,
441		Close,
442		Play,
443		FastForward,
444		BassBoost,
445		Print,
446		HP,
447		Camera,
448		Sound,
449		Question,
450		Email,
451		Chat,
452		Search,
453		Connect,
454		Finance,
455		Sport,
456		Shop,
457		AltErase,
458		Cancel,
459		BrightnessDown,
460		BrightnessUp,
461		Media,
462		SwitchVideoMode,
463		IllumToggle,
464		IllumDown,
465		IllumUp,
466		Send,
467		Reply,
468		ForwardEmail,
469		Save,
470		Documents,
471		Battery,
472		Bluetooth,
473		WLAN,
474		UWB,
475		Unknown,
476		VideoNext,
477		VideoPrev,
478		BrightnessCycle,
479		BrightnessAuto,
480		BrightnessZero,
481		DisplayOff,
482		WWAN,
483		WIMAX,
484		RFKILL,
485		MicMute,
486		Ok,
487		Select,
488		Goto,
489		Clear,
490		Power2,
491		Option,
492		Info,
493		Time,
494		Vendor,
495		Archive,
496		Program,
497		Channel,
498		Favorites,
499		EPG,
500		PVR,
501		MHP,
502		Language,
503		Title,
504		Subtitle,
505		Angle,
506		Zoom,
507		Mode,
508		Keyboard,
509		Screen,
510		PC,
511		TV,
512		TV2,
513		VCR,
514		VCR2,
515		SAT,
516		SAT2,
517		CD,
518		Tape,
519		Radio,
520		Tuner,
521		Player,
522		Text,
523		DVD,
524		AUX,
525		MP3,
526		Audio,
527		Video,
528		Directory,
529		List,
530		Memo,
531		Calendar,
532		Red,
533		Green,
534		Yellow,
535		Blue,
536		ChannelUp,
537		ChannelDown,
538		First,
539		Last,
540		AB,
541		Next,
542		Restart,
543		Slow,
544		Shuffle,
545		Break,
546		Previous,
547		Digits,
548		TEEN,
549		TWEN,
550		VideoPhone,
551		Games,
552		ZoomIn,
553		ZoomOut,
554		ZoomReset,
555		WordProcessor,
556		Editor,
557		SpreadSheet,
558		GraphicsEditor,
559		Presentation,
560		Database,
561		News,
562		VoiceMail,
563		AddressBook,
564		Messenger,
565		DisplayToggle,
566		BrightnessToggle,
567		SpellCheck,
568		LogOff,
569		Dollar,
570		Euro,
571		FrameBack,
572		FrameForward,
573		ContextMenu,
574		MediaRepeat,
575		Up10Channels,
576		Down10Channels,
577		Images,
578		DeleteEOL,
579		DeleteEOS,
580		InsertLine,
581		DeleteLine,
582		WPS,
583		LightsToggle,
584		ALSToggle,
585		ButtonConfig,
586		TaskManager,
587		Journal,
588		ControlPanel,
589		AppSelect,
590		ScreenSaver,
591		VoiceCommand,
592		BrighnessMin,
593		BrightnessMax,
594	}
595}
596
597impl Into<Event> for Misc {
598	fn into(self) -> Event {
599		Event::Keyboard(Keyboard::Misc(self))
600	}
601}
602
603impl Press for Misc { }
604impl Release for Misc { }
605
606impl Kind for Misc {
607	fn kind(&self) -> c_int {
608		EV_KEY
609	}
610}
611
612impl Code for Misc {
613	fn code(&self) -> c_int {
614		match self {
615			&Misc::ZenkakuHankaku   => KEY_ZENKAKUHANKAKU,
616			&Misc::ND102            => KEY_102ND,
617			&Misc::RO               => KEY_RO,
618			&Misc::Katakana         => KEY_KATAKANA,
619			&Misc::Hiragana         => KEY_HIRAGANA,
620			&Misc::Henkan           => KEY_HENKAN,
621			&Misc::KatakanaHiragana => KEY_KATAKANAHIRAGANA,
622			&Misc::Muhenkan         => KEY_MUHENKAN,
623			&Misc::Macro            => KEY_MACRO,
624			&Misc::Mute             => KEY_MUTE,
625			&Misc::VolumeDown       => KEY_VOLUMEDOWN,
626			&Misc::VolumeUp         => KEY_VOLUMEUP,
627			&Misc::Power            => KEY_POWER,
628			&Misc::Pause            => KEY_PAUSE,
629			&Misc::Scale            => KEY_SCALE,
630			&Misc::Hangeul          => KEY_HANGEUL,
631			&Misc::Hanguel          => KEY_HANGUEL,
632			&Misc::Hanja            => KEY_HANJA,
633			&Misc::Yen              => KEY_YEN,
634			&Misc::Compose          => KEY_COMPOSE,
635			&Misc::Stop             => KEY_STOP,
636			&Misc::Again            => KEY_AGAIN,
637			&Misc::Props            => KEY_PROPS,
638			&Misc::Undo             => KEY_UNDO,
639			&Misc::Front            => KEY_FRONT,
640			&Misc::Copy             => KEY_COPY,
641			&Misc::Open             => KEY_OPEN,
642			&Misc::Paste            => KEY_PASTE,
643			&Misc::Find             => KEY_FIND,
644			&Misc::Cut              => KEY_CUT,
645			&Misc::Help             => KEY_HELP,
646			&Misc::Menu             => KEY_MENU,
647			&Misc::Calc             => KEY_CALC,
648			&Misc::Setup            => KEY_SETUP,
649			&Misc::Sleep            => KEY_SLEEP,
650			&Misc::WakeUp           => KEY_WAKEUP,
651			&Misc::File             => KEY_FILE,
652			&Misc::SendFile         => KEY_SENDFILE,
653			&Misc::DeleteFile       => KEY_DELETEFILE,
654			&Misc::XFer             => KEY_XFER,
655			&Misc::Prog1            => KEY_PROG1,
656			&Misc::Prog2            => KEY_PROG2,
657			&Misc::WWW              => KEY_WWW,
658			&Misc::MSDOS            => KEY_MSDOS,
659			&Misc::Coffee           => KEY_COFFEE,
660			&Misc::ScreenLock       => KEY_SCREENLOCK,
661			&Misc::RotateDisplay    => KEY_ROTATE_DISPLAY,
662			&Misc::Direction        => KEY_DIRECTION,
663			&Misc::CycleWindows     => KEY_CYCLEWINDOWS,
664			&Misc::Mail             => KEY_MAIL,
665			&Misc::Bookmarks        => KEY_BOOKMARKS,
666			&Misc::Computer         => KEY_COMPUTER,
667			&Misc::Back             => KEY_BACK,
668			&Misc::Forward          => KEY_FORWARD,
669			&Misc::CloseCD          => KEY_CLOSECD,
670			&Misc::EjectCD          => KEY_EJECTCD,
671			&Misc::EjectCloseCD     => KEY_EJECTCLOSECD,
672			&Misc::NextSong         => KEY_NEXTSONG,
673			&Misc::PlayPause        => KEY_PLAYPAUSE,
674			&Misc::PreviousSong     => KEY_PREVIOUSSONG,
675			&Misc::StopCD           => KEY_STOPCD,
676			&Misc::Record           => KEY_RECORD,
677			&Misc::Rewind           => KEY_REWIND,
678			&Misc::Phone            => KEY_PHONE,
679			&Misc::Iso              => KEY_ISO,
680			&Misc::Config           => KEY_CONFIG,
681			&Misc::HomePage         => KEY_HOMEPAGE,
682			&Misc::Refresh          => KEY_REFRESH,
683			&Misc::Exit             => KEY_EXIT,
684			&Misc::Move             => KEY_MOVE,
685			&Misc::Edit             => KEY_EDIT,
686			&Misc::New              => KEY_NEW,
687			&Misc::Redo             => KEY_REDO,
688			&Misc::PlayCD           => KEY_PLAYCD,
689			&Misc::PauseCD          => KEY_PAUSECD,
690			&Misc::Prog3            => KEY_PROG3,
691			&Misc::Prog4            => KEY_PROG4,
692			&Misc::DashBoard        => KEY_DASHBOARD,
693			&Misc::Suspend          => KEY_SUSPEND,
694			&Misc::Close            => KEY_CLOSE,
695			&Misc::Play             => KEY_PLAY,
696			&Misc::FastForward      => KEY_FASTFORWARD,
697			&Misc::BassBoost        => KEY_BASSBOOST,
698			&Misc::Print            => KEY_PRINT,
699			&Misc::HP               => KEY_HP,
700			&Misc::Camera           => KEY_CAMERA,
701			&Misc::Sound            => KEY_SOUND,
702			&Misc::Question         => KEY_QUESTION,
703			&Misc::Email            => KEY_EMAIL,
704			&Misc::Chat             => KEY_CHAT,
705			&Misc::Search           => KEY_SEARCH,
706			&Misc::Connect          => KEY_CONNECT,
707			&Misc::Finance          => KEY_FINANCE,
708			&Misc::Sport            => KEY_SPORT,
709			&Misc::Shop             => KEY_SHOP,
710			&Misc::AltErase         => KEY_ALTERASE,
711			&Misc::Cancel           => KEY_CANCEL,
712			&Misc::BrightnessDown   => KEY_BRIGHTNESSDOWN,
713			&Misc::BrightnessUp     => KEY_BRIGHTNESSUP,
714			&Misc::Media            => KEY_MEDIA,
715			&Misc::SwitchVideoMode  => KEY_SWITCHVIDEOMODE,
716			&Misc::IllumToggle      => KEY_KBDILLUMTOGGLE,
717			&Misc::IllumDown        => KEY_KBDILLUMDOWN,
718			&Misc::IllumUp          => KEY_KBDILLUMUP,
719			&Misc::Send             => KEY_SEND,
720			&Misc::Reply            => KEY_REPLY,
721			&Misc::ForwardEmail     => KEY_FORWARDMAIL,
722			&Misc::Save             => KEY_SAVE,
723			&Misc::Documents        => KEY_DOCUMENTS,
724			&Misc::Battery          => KEY_BATTERY,
725			&Misc::Bluetooth        => KEY_BLUETOOTH,
726			&Misc::WLAN             => KEY_WLAN,
727			&Misc::UWB              => KEY_UWB,
728			&Misc::Unknown          => KEY_UNKNOWN,
729			&Misc::VideoNext        => KEY_VIDEO_NEXT,
730			&Misc::VideoPrev        => KEY_VIDEO_PREV,
731			&Misc::BrightnessCycle  => KEY_BRIGHTNESS_CYCLE,
732			&Misc::BrightnessAuto   => KEY_BRIGHTNESS_AUTO,
733			&Misc::BrightnessZero   => KEY_BRIGHTNESS_ZERO,
734			&Misc::DisplayOff       => KEY_DISPLAY_OFF,
735			&Misc::WWAN             => KEY_WWAN,
736			&Misc::WIMAX            => KEY_WIMAX,
737			&Misc::RFKILL           => KEY_RFKILL,
738			&Misc::MicMute          => KEY_MICMUTE,
739			&Misc::Ok               => KEY_OK,
740			&Misc::Select           => KEY_SELECT,
741			&Misc::Goto             => KEY_GOTO,
742			&Misc::Clear            => KEY_CLEAR,
743			&Misc::Power2           => KEY_POWER2,
744			&Misc::Option           => KEY_OPTION,
745			&Misc::Info             => KEY_INFO,
746			&Misc::Time             => KEY_TIME,
747			&Misc::Vendor           => KEY_VENDOR,
748			&Misc::Archive          => KEY_ARCHIVE,
749			&Misc::Program          => KEY_PROGRAM,
750			&Misc::Channel          => KEY_CHANNEL,
751			&Misc::Favorites        => KEY_FAVORITES,
752			&Misc::EPG              => KEY_EPG,
753			&Misc::PVR              => KEY_PVR,
754			&Misc::MHP              => KEY_MHP,
755			&Misc::Language         => KEY_LANGUAGE,
756			&Misc::Title            => KEY_TITLE,
757			&Misc::Subtitle         => KEY_SUBTITLE,
758			&Misc::Angle            => KEY_ANGLE,
759			&Misc::Zoom             => KEY_ZOOM,
760			&Misc::Mode             => KEY_MODE,
761			&Misc::Keyboard         => KEY_KEYBOARD,
762			&Misc::Screen           => KEY_SCREEN,
763			&Misc::PC               => KEY_PC,
764			&Misc::TV               => KEY_TV,
765			&Misc::TV2              => KEY_TV2,
766			&Misc::VCR              => KEY_VCR,
767			&Misc::VCR2             => KEY_VCR2,
768			&Misc::SAT              => KEY_SAT,
769			&Misc::SAT2             => KEY_SAT2,
770			&Misc::CD               => KEY_CD,
771			&Misc::Tape             => KEY_TAPE,
772			&Misc::Radio            => KEY_RADIO,
773			&Misc::Tuner            => KEY_TUNER,
774			&Misc::Player           => KEY_PLAYER,
775			&Misc::Text             => KEY_TEXT,
776			&Misc::DVD              => KEY_DVD,
777			&Misc::AUX              => KEY_AUX,
778			&Misc::MP3              => KEY_MP3,
779			&Misc::Audio            => KEY_AUDIO,
780			&Misc::Video            => KEY_VIDEO,
781			&Misc::Directory        => KEY_DIRECTORY,
782			&Misc::List             => KEY_LIST,
783			&Misc::Memo             => KEY_MEMO,
784			&Misc::Calendar         => KEY_CALENDAR,
785			&Misc::Red              => KEY_RED,
786			&Misc::Green            => KEY_GREEN,
787			&Misc::Yellow           => KEY_YELLOW,
788			&Misc::Blue             => KEY_BLUE,
789			&Misc::ChannelUp        => KEY_CHANNELUP,
790			&Misc::ChannelDown      => KEY_CHANNELDOWN,
791			&Misc::First            => KEY_FIRST,
792			&Misc::Last             => KEY_LAST,
793			&Misc::AB               => KEY_AB,
794			&Misc::Next             => KEY_NEXT,
795			&Misc::Restart          => KEY_RESTART,
796			&Misc::Slow             => KEY_SLOW,
797			&Misc::Shuffle          => KEY_SHUFFLE,
798			&Misc::Break            => KEY_BREAK,
799			&Misc::Previous         => KEY_PREVIOUS,
800			&Misc::Digits           => KEY_DIGITS,
801			&Misc::TEEN             => KEY_TEEN,
802			&Misc::TWEN             => KEY_TWEN,
803			&Misc::VideoPhone       => KEY_VIDEOPHONE,
804			&Misc::Games            => KEY_GAMES,
805			&Misc::ZoomIn           => KEY_ZOOMIN,
806			&Misc::ZoomOut          => KEY_ZOOMOUT,
807			&Misc::ZoomReset        => KEY_ZOOMRESET,
808			&Misc::WordProcessor    => KEY_WORDPROCESSOR,
809			&Misc::Editor           => KEY_EDITOR,
810			&Misc::SpreadSheet      => KEY_SPREADSHEET,
811			&Misc::GraphicsEditor   => KEY_GRAPHICSEDITOR,
812			&Misc::Presentation     => KEY_PRESENTATION,
813			&Misc::Database         => KEY_DATABASE,
814			&Misc::News             => KEY_NEWS,
815			&Misc::VoiceMail        => KEY_VOICEMAIL,
816			&Misc::AddressBook      => KEY_ADDRESSBOOK,
817			&Misc::Messenger        => KEY_MESSENGER,
818			&Misc::DisplayToggle    => KEY_DISPLAYTOGGLE,
819			&Misc::BrightnessToggle => KEY_BRIGHTNESS_TOGGLE,
820			&Misc::SpellCheck       => KEY_SPELLCHECK,
821			&Misc::LogOff           => KEY_LOGOFF,
822			&Misc::Dollar           => KEY_DOLLAR,
823			&Misc::Euro             => KEY_EURO,
824			&Misc::FrameBack        => KEY_FRAMEBACK,
825			&Misc::FrameForward     => KEY_FRAMEFORWARD,
826			&Misc::ContextMenu      => KEY_CONTEXT_MENU,
827			&Misc::MediaRepeat      => KEY_MEDIA_REPEAT,
828			&Misc::Up10Channels     => KEY_10CHANNELSUP,
829			&Misc::Down10Channels   => KEY_10CHANNELSDOWN,
830			&Misc::Images           => KEY_IMAGES,
831			&Misc::DeleteEOL        => KEY_DEL_EOL,
832			&Misc::DeleteEOS        => KEY_DEL_EOS,
833			&Misc::InsertLine       => KEY_INS_LINE,
834			&Misc::DeleteLine       => KEY_DEL_LINE,
835			&Misc::WPS              => KEY_WPS_BUTTON,
836			&Misc::LightsToggle     => KEY_LIGHTS_TOGGLE,
837			&Misc::ALSToggle        => KEY_ALS_TOGGLE,
838			&Misc::ButtonConfig     => KEY_BUTTONCONFIG,
839			&Misc::TaskManager      => KEY_TASKMANAGER,
840			&Misc::Journal          => KEY_JOURNAL,
841			&Misc::ControlPanel     => KEY_CONTROLPANEL,
842			&Misc::AppSelect        => KEY_APPSELECT,
843			&Misc::ScreenSaver      => KEY_SCREENSAVER,
844			&Misc::VoiceCommand     => KEY_VOICECOMMAND,
845			&Misc::BrighnessMin     => KEY_BRIGHTNESS_MIN,
846			&Misc::BrightnessMax    => KEY_BRIGHTNESS_MAX,
847		}
848	}
849}
850
851custom_derive! {
852	#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, IterVariants(FunctionVariants))]
853	pub enum Function {
854		Press,
855		Esc,
856		F1,
857		F2,
858		F3,
859		F4,
860		F5,
861		F6,
862		F7,
863		F8,
864		F9,
865		F10,
866		F11,
867		F12,
868		_1,
869		_2,
870		D,
871		E,
872		F,
873		S,
874		B,
875	}
876}
877
878impl Into<Event> for Function {
879	fn into(self) -> Event {
880		Event::Keyboard(Keyboard::Function(self))
881	}
882}
883
884impl Press for Function { }
885impl Release for Function { }
886
887impl Kind for Function {
888	fn kind(&self) -> c_int {
889		EV_KEY
890	}
891}
892
893impl Code for Function {
894	fn code(&self) -> c_int {
895		match self {
896			&Function::Press => KEY_FN,
897			&Function::Esc   => KEY_FN_ESC,
898			&Function::F1    => KEY_FN_F1,
899			&Function::F2    => KEY_FN_F2,
900			&Function::F3    => KEY_FN_F3,
901			&Function::F4    => KEY_FN_F4,
902			&Function::F5    => KEY_FN_F5,
903			&Function::F6    => KEY_FN_F6,
904			&Function::F7    => KEY_FN_F7,
905			&Function::F8    => KEY_FN_F8,
906			&Function::F9    => KEY_FN_F9,
907			&Function::F10   => KEY_FN_F10,
908			&Function::F11   => KEY_FN_F11,
909			&Function::F12   => KEY_FN_F12,
910			&Function::_1    => KEY_FN_1,
911			&Function::_2    => KEY_FN_2,
912			&Function::D     => KEY_FN_D,
913			&Function::E     => KEY_FN_E,
914			&Function::F     => KEY_FN_F,
915			&Function::S     => KEY_FN_S,
916			&Function::B     => KEY_FN_B,
917		}
918	}
919}
920
921custom_derive! {
922	#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, IterVariants(BrailleVariants))]
923	pub enum Braille {
924		Dot1,
925		Dot2,
926		Dot3,
927		Dot4,
928		Dot5,
929		Dot6,
930		Dot7,
931		Dot8,
932		Dot9,
933		Dot10,
934	}
935}
936
937impl Into<Event> for Braille {
938	fn into(self) -> Event {
939		Event::Keyboard(Keyboard::Braille(self))
940	}
941}
942
943impl Press for Braille { }
944impl Release for Braille { }
945
946impl Kind for Braille {
947	fn kind(&self) -> c_int {
948		EV_KEY
949	}
950}
951
952impl Code for Braille {
953	fn code(&self) -> c_int {
954		match self {
955			&Braille::Dot1  => KEY_BRL_DOT1,
956			&Braille::Dot2  => KEY_BRL_DOT2,
957			&Braille::Dot3  => KEY_BRL_DOT3,
958			&Braille::Dot4  => KEY_BRL_DOT4,
959			&Braille::Dot5  => KEY_BRL_DOT5,
960			&Braille::Dot6  => KEY_BRL_DOT6,
961			&Braille::Dot7  => KEY_BRL_DOT7,
962			&Braille::Dot8  => KEY_BRL_DOT8,
963			&Braille::Dot9  => KEY_BRL_DOT9,
964			&Braille::Dot10 => KEY_BRL_DOT10,
965		}
966	}
967}
968
969custom_derive! {
970	#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, IterVariants(NumericVariants))]
971	pub enum Numeric {
972		_0,
973		_1,
974		_2,
975		_3,
976		_4,
977		_5,
978		_6,
979		_7,
980		_8,
981		_9,
982		Star,
983		Pound,
984		A,
985		B,
986		C,
987		D,
988	}
989}
990
991impl Into<Event> for Numeric {
992	fn into(self) -> Event {
993		Event::Keyboard(Keyboard::Numeric(self))
994	}
995}
996
997impl Press for Numeric { }
998impl Release for Numeric { }
999
1000impl Kind for Numeric {
1001	fn kind(&self) -> c_int {
1002		EV_KEY
1003	}
1004}
1005
1006impl Code for Numeric {
1007	fn code(&self) -> c_int {
1008		match self {
1009			&Numeric::_0    => KEY_NUMERIC_0,
1010			&Numeric::_1    => KEY_NUMERIC_1,
1011			&Numeric::_2    => KEY_NUMERIC_2,
1012			&Numeric::_3    => KEY_NUMERIC_3,
1013			&Numeric::_4    => KEY_NUMERIC_4,
1014			&Numeric::_5    => KEY_NUMERIC_5,
1015			&Numeric::_6    => KEY_NUMERIC_6,
1016			&Numeric::_7    => KEY_NUMERIC_7,
1017			&Numeric::_8    => KEY_NUMERIC_8,
1018			&Numeric::_9    => KEY_NUMERIC_9,
1019			&Numeric::Star  => KEY_NUMERIC_STAR,
1020			&Numeric::Pound => KEY_NUMERIC_POUND,
1021			&Numeric::A     => KEY_NUMERIC_A,
1022			&Numeric::B     => KEY_NUMERIC_B,
1023			&Numeric::C     => KEY_NUMERIC_C,
1024			&Numeric::D     => KEY_NUMERIC_D,
1025		}
1026	}
1027}
1028
1029custom_derive! {
1030	#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, IterVariants(TouchPadVariants))]
1031	pub enum TouchPad {
1032		Toggle,
1033		On,
1034		Off,
1035	}
1036}
1037
1038impl Into<Event> for TouchPad {
1039	fn into(self) -> Event {
1040		Event::Keyboard(Keyboard::TouchPad(self))
1041	}
1042}
1043
1044impl Press for TouchPad { }
1045impl Release for TouchPad { }
1046
1047impl Kind for TouchPad {
1048	fn kind(&self) -> c_int {
1049		EV_KEY
1050	}
1051}
1052
1053impl Code for TouchPad {
1054	fn code(&self) -> c_int {
1055		match self {
1056			&TouchPad::Toggle => KEY_TOUCHPAD_TOGGLE,
1057			&TouchPad::On     => KEY_TOUCHPAD_ON,
1058			&TouchPad::Off    => KEY_TOUCHPAD_OFF,
1059		}
1060	}
1061}
1062
1063custom_derive! {
1064	#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, IterVariants(CameraVariants))]
1065	pub enum Camera {
1066		ZoomIn,
1067		ZoomOut,
1068		Up,
1069		Down,
1070		Left,
1071		Right,
1072		Focus,
1073	}
1074}
1075
1076impl Into<Event> for Camera {
1077	fn into(self) -> Event {
1078		Event::Keyboard(Keyboard::Camera(self))
1079	}
1080}
1081
1082impl Press for Camera { }
1083impl Release for Camera { }
1084
1085impl Kind for Camera {
1086	fn kind(&self) -> c_int {
1087		EV_KEY
1088	}
1089}
1090
1091impl Code for Camera {
1092	fn code(&self) -> c_int {
1093		match self {
1094			&Camera::ZoomIn  => KEY_CAMERA_ZOOMIN,
1095			&Camera::ZoomOut => KEY_CAMERA_ZOOMOUT,
1096			&Camera::Up      => KEY_CAMERA_UP,
1097			&Camera::Down    => KEY_CAMERA_DOWN,
1098			&Camera::Left    => KEY_CAMERA_LEFT,
1099			&Camera::Right   => KEY_CAMERA_RIGHT,
1100			&Camera::Focus   => KEY_CAMERA_FOCUS,
1101		}
1102	}
1103}
1104
1105custom_derive! {
1106	#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, IterVariants(AttendantVariants))]
1107	pub enum Attendant {
1108		On,
1109		Off,
1110		Toggle,
1111	}
1112}
1113
1114impl Into<Event> for Attendant {
1115	fn into(self) -> Event {
1116		Event::Keyboard(Keyboard::Attendant(self))
1117	}
1118}
1119
1120impl Press for Attendant { }
1121impl Release for Attendant { }
1122
1123impl Kind for Attendant {
1124	fn kind(&self) -> c_int {
1125		EV_KEY
1126	}
1127}
1128
1129impl Code for Attendant {
1130	fn code(&self) -> c_int {
1131		match self {
1132			&Attendant::On     => KEY_ATTENDANT_ON,
1133			&Attendant::Off    => KEY_ATTENDANT_OFF,
1134			&Attendant::Toggle => KEY_ATTENDANT_TOGGLE,
1135		}
1136	}
1137}
1138
1139custom_derive! {
1140	#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, IterVariants(InputAssistVariants))]
1141	pub enum InputAssist {
1142		Prev,
1143		Next,
1144		PrevGroup,
1145		NextGroup,
1146		Accept,
1147		Cancel,
1148	}
1149}
1150
1151impl Into<Event> for InputAssist {
1152	fn into(self) -> Event {
1153		Event::Keyboard(Keyboard::InputAssist(self))
1154	}
1155}
1156
1157impl Press for InputAssist { }
1158impl Release for InputAssist { }
1159
1160impl Kind for InputAssist {
1161	fn kind(&self) -> c_int {
1162		EV_KEY
1163	}
1164}
1165
1166impl Code for InputAssist {
1167	fn code(&self) -> c_int {
1168		match self {
1169			&InputAssist::Prev      => KEY_KBDINPUTASSIST_PREV,
1170			&InputAssist::Next      => KEY_KBDINPUTASSIST_NEXT,
1171			&InputAssist::PrevGroup => KEY_KBDINPUTASSIST_PREVGROUP,
1172			&InputAssist::NextGroup => KEY_KBDINPUTASSIST_NEXTGROUP,
1173			&InputAssist::Accept    => KEY_KBDINPUTASSIST_ACCEPT,
1174			&InputAssist::Cancel    => KEY_KBDINPUTASSIST_CANCEL,
1175		}
1176	}
1177}