1use crate::core::input_method;
6use crate::core::keyboard;
7use crate::core::mouse;
8use crate::core::theme;
9use crate::core::touch;
10use crate::core::window;
11use crate::core::{Event, Point, Size};
12
13pub fn window_attributes(
15 settings: window::Settings,
16 title: &str,
17 scale_factor: f32,
18 primary_monitor: Option<winit::monitor::MonitorHandle>,
19 _id: Option<String>,
20) -> winit::window::WindowAttributes {
21 let mut attributes = winit::window::WindowAttributes::default();
22
23 attributes = attributes
24 .with_title(title)
25 .with_inner_size(winit::dpi::LogicalSize {
26 width: settings.size.width * scale_factor,
27 height: settings.size.height * scale_factor,
28 })
29 .with_maximized(settings.maximized)
30 .with_fullscreen(
31 settings
32 .fullscreen
33 .then_some(winit::window::Fullscreen::Borderless(None)),
34 )
35 .with_resizable(settings.resizable)
36 .with_enabled_buttons(if settings.resizable {
37 winit::window::WindowButtons::all()
38 } else {
39 winit::window::WindowButtons::CLOSE
40 | winit::window::WindowButtons::MINIMIZE
41 })
42 .with_decorations(settings.decorations)
43 .with_transparent(settings.transparent)
44 .with_window_icon(settings.icon.and_then(icon))
45 .with_window_level(window_level(settings.level))
46 .with_visible(settings.visible);
47
48 if let Some(position) =
49 position(primary_monitor.as_ref(), settings.size, settings.position)
50 {
51 attributes = attributes.with_position(position);
52 }
53
54 if let Some(min_size) = settings.min_size {
55 attributes = attributes.with_min_inner_size(winit::dpi::LogicalSize {
56 width: min_size.width,
57 height: min_size.height,
58 });
59 }
60
61 if let Some(max_size) = settings.max_size {
62 attributes = attributes.with_max_inner_size(winit::dpi::LogicalSize {
63 width: max_size.width,
64 height: max_size.height,
65 });
66 }
67
68 #[cfg(any(
69 target_os = "dragonfly",
70 target_os = "freebsd",
71 target_os = "netbsd",
72 target_os = "openbsd"
73 ))]
74 {
75 use ::winit::platform::wayland::WindowAttributesExtWayland;
76
77 if let Some(id) = _id {
78 attributes = attributes.with_name(id.clone(), id);
79 }
80 }
81
82 #[cfg(target_os = "windows")]
83 {
84 use winit::platform::windows::WindowAttributesExtWindows;
85
86 attributes = attributes
87 .with_drag_and_drop(settings.platform_specific.drag_and_drop);
88
89 attributes = attributes
90 .with_skip_taskbar(settings.platform_specific.skip_taskbar);
91
92 attributes = attributes.with_undecorated_shadow(
93 settings.platform_specific.undecorated_shadow,
94 );
95 }
96
97 #[cfg(target_os = "macos")]
98 {
99 use winit::platform::macos::WindowAttributesExtMacOS;
100
101 attributes = attributes
102 .with_title_hidden(settings.platform_specific.title_hidden)
103 .with_titlebar_transparent(
104 settings.platform_specific.titlebar_transparent,
105 )
106 .with_fullsize_content_view(
107 settings.platform_specific.fullsize_content_view,
108 );
109 }
110
111 #[cfg(target_os = "linux")]
112 {
113 #[cfg(feature = "x11")]
114 {
115 use winit::platform::x11::WindowAttributesExtX11;
116
117 attributes = attributes
118 .with_override_redirect(
119 settings.platform_specific.override_redirect,
120 )
121 .with_name(
122 &settings.platform_specific.application_id,
123 &settings.platform_specific.application_id,
124 );
125 }
126 #[cfg(feature = "wayland")]
127 {
128 use winit::platform::wayland::WindowAttributesExtWayland;
129
130 attributes = attributes.with_name(
131 &settings.platform_specific.application_id,
132 &settings.platform_specific.application_id,
133 );
134 }
135 }
136
137 attributes
138}
139
140pub fn window_event(
142 event: winit::event::WindowEvent,
143 scale_factor: f32,
144 modifiers: winit::keyboard::ModifiersState,
145) -> Option<Event> {
146 use winit::event::Ime;
147 use winit::event::WindowEvent;
148
149 match event {
150 WindowEvent::Resized(new_size) => {
151 let logical_size = new_size.to_logical(f64::from(scale_factor));
152
153 Some(Event::Window(window::Event::Resized(Size {
154 width: logical_size.width,
155 height: logical_size.height,
156 })))
157 }
158 WindowEvent::CloseRequested => {
159 Some(Event::Window(window::Event::CloseRequested))
160 }
161 WindowEvent::CursorMoved { position, .. } => {
162 let position = position.to_logical::<f64>(f64::from(scale_factor));
163
164 Some(Event::Mouse(mouse::Event::CursorMoved {
165 position: Point::new(position.x as f32, position.y as f32),
166 }))
167 }
168 WindowEvent::CursorEntered { .. } => {
169 Some(Event::Mouse(mouse::Event::CursorEntered))
170 }
171 WindowEvent::CursorLeft { .. } => {
172 Some(Event::Mouse(mouse::Event::CursorLeft))
173 }
174 WindowEvent::MouseInput { button, state, .. } => {
175 let button = mouse_button(button);
176
177 Some(Event::Mouse(match state {
178 winit::event::ElementState::Pressed => {
179 mouse::Event::ButtonPressed(button)
180 }
181 winit::event::ElementState::Released => {
182 mouse::Event::ButtonReleased(button)
183 }
184 }))
185 }
186 WindowEvent::MouseWheel { delta, .. } => match delta {
187 winit::event::MouseScrollDelta::LineDelta(delta_x, delta_y) => {
188 Some(Event::Mouse(mouse::Event::WheelScrolled {
189 delta: mouse::ScrollDelta::Lines {
190 x: delta_x,
191 y: delta_y,
192 },
193 }))
194 }
195 winit::event::MouseScrollDelta::PixelDelta(position) => {
196 Some(Event::Mouse(mouse::Event::WheelScrolled {
197 delta: mouse::ScrollDelta::Pixels {
198 x: position.x as f32,
199 y: position.y as f32,
200 },
201 }))
202 }
203 },
204 WindowEvent::KeyboardInput { is_synthetic, .. } if is_synthetic => None,
206 WindowEvent::KeyboardInput { event, .. } => Some(Event::Keyboard({
207 let key = {
208 #[cfg(not(target_arch = "wasm32"))]
209 {
210 use winit::platform::modifier_supplement::KeyEventExtModifierSupplement;
211 event.key_without_modifiers()
212 }
213
214 #[cfg(target_arch = "wasm32")]
215 {
216 event.logical_key.clone()
218 }
219 };
220
221 let text = {
222 #[cfg(not(target_arch = "wasm32"))]
223 {
224 use crate::core::SmolStr;
225 use winit::platform::modifier_supplement::KeyEventExtModifierSupplement;
226
227 event.text_with_all_modifiers().map(SmolStr::new)
228 }
229
230 #[cfg(target_arch = "wasm32")]
231 {
232 event.text
234 }
235 }.filter(|text| !text.as_str().chars().any(is_private_use));
236
237 let winit::event::KeyEvent {
238 state,
239 location,
240 logical_key,
241 physical_key,
242 ..
243 } = event;
244
245 let key = self::key(key);
246 let modified_key = self::key(logical_key);
247 let physical_key = self::physical_key(physical_key);
248 let modifiers = self::modifiers(modifiers);
249
250 let location = match location {
251 winit::keyboard::KeyLocation::Standard => {
252 keyboard::Location::Standard
253 }
254 winit::keyboard::KeyLocation::Left => keyboard::Location::Left,
255 winit::keyboard::KeyLocation::Right => {
256 keyboard::Location::Right
257 }
258 winit::keyboard::KeyLocation::Numpad => {
259 keyboard::Location::Numpad
260 }
261 };
262
263 match state {
264 winit::event::ElementState::Pressed => {
265 keyboard::Event::KeyPressed {
266 key,
267 modified_key,
268 physical_key,
269 modifiers,
270 location,
271 text,
272 }
273 }
274 winit::event::ElementState::Released => {
275 keyboard::Event::KeyReleased {
276 key,
277 modified_key,
278 physical_key,
279 modifiers,
280 location,
281 }
282 }
283 }
284 })),
285 WindowEvent::ModifiersChanged(new_modifiers) => {
286 Some(Event::Keyboard(keyboard::Event::ModifiersChanged(
287 self::modifiers(new_modifiers.state()),
288 )))
289 }
290 WindowEvent::Ime(event) => Some(Event::InputMethod(match event {
291 Ime::Enabled => input_method::Event::Opened,
292 Ime::Preedit(content, size) => input_method::Event::Preedit(
293 content,
294 size.map(|(start, end)| start..end),
295 ),
296 Ime::Commit(content) => input_method::Event::Commit(content),
297 Ime::Disabled => input_method::Event::Closed,
298 })),
299 WindowEvent::Focused(focused) => Some(Event::Window(if focused {
300 window::Event::Focused
301 } else {
302 window::Event::Unfocused
303 })),
304 WindowEvent::HoveredFile(path) => {
305 Some(Event::Window(window::Event::FileHovered(path.clone())))
306 }
307 WindowEvent::DroppedFile(path) => {
308 Some(Event::Window(window::Event::FileDropped(path.clone())))
309 }
310 WindowEvent::HoveredFileCancelled => {
311 Some(Event::Window(window::Event::FilesHoveredLeft))
312 }
313 WindowEvent::Touch(touch) => {
314 Some(Event::Touch(touch_event(touch, scale_factor)))
315 }
316 WindowEvent::Moved(position) => {
317 let winit::dpi::LogicalPosition { x, y } =
318 position.to_logical(f64::from(scale_factor));
319
320 Some(Event::Window(window::Event::Moved(Point::new(x, y))))
321 }
322 _ => None,
323 }
324}
325
326pub fn window_level(level: window::Level) -> winit::window::WindowLevel {
330 match level {
331 window::Level::Normal => winit::window::WindowLevel::Normal,
332 window::Level::AlwaysOnBottom => {
333 winit::window::WindowLevel::AlwaysOnBottom
334 }
335 window::Level::AlwaysOnTop => winit::window::WindowLevel::AlwaysOnTop,
336 }
337}
338
339pub fn position(
343 monitor: Option<&winit::monitor::MonitorHandle>,
344 size: Size,
345 position: window::Position,
346) -> Option<winit::dpi::Position> {
347 match position {
348 window::Position::Default => None,
349 window::Position::Specific(position) => {
350 Some(winit::dpi::Position::Logical(winit::dpi::LogicalPosition {
351 x: f64::from(position.x),
352 y: f64::from(position.y),
353 }))
354 }
355 window::Position::SpecificWith(to_position) => {
356 if let Some(monitor) = monitor {
357 let start = monitor.position();
358
359 let resolution: winit::dpi::LogicalSize<f32> =
360 monitor.size().to_logical(monitor.scale_factor());
361
362 let position = to_position(
363 size,
364 Size::new(resolution.width, resolution.height),
365 );
366
367 let centered: winit::dpi::PhysicalPosition<i32> =
368 winit::dpi::LogicalPosition {
369 x: position.x,
370 y: position.y,
371 }
372 .to_physical(monitor.scale_factor());
373
374 Some(winit::dpi::Position::Physical(
375 winit::dpi::PhysicalPosition {
376 x: start.x + centered.x,
377 y: start.y + centered.y,
378 },
379 ))
380 } else {
381 None
382 }
383 }
384 window::Position::Centered => {
385 if let Some(monitor) = monitor {
386 let start = monitor.position();
387
388 let resolution: winit::dpi::LogicalSize<f64> =
389 monitor.size().to_logical(monitor.scale_factor());
390
391 let centered: winit::dpi::PhysicalPosition<i32> =
392 winit::dpi::LogicalPosition {
393 x: (resolution.width - f64::from(size.width)) / 2.0,
394 y: (resolution.height - f64::from(size.height)) / 2.0,
395 }
396 .to_physical(monitor.scale_factor());
397
398 Some(winit::dpi::Position::Physical(
399 winit::dpi::PhysicalPosition {
400 x: start.x + centered.x,
401 y: start.y + centered.y,
402 },
403 ))
404 } else {
405 None
406 }
407 }
408 }
409}
410
411pub fn fullscreen(
415 monitor: Option<winit::monitor::MonitorHandle>,
416 mode: window::Mode,
417) -> Option<winit::window::Fullscreen> {
418 match mode {
419 window::Mode::Windowed | window::Mode::Hidden => None,
420 window::Mode::Fullscreen => {
421 Some(winit::window::Fullscreen::Borderless(monitor))
422 }
423 }
424}
425
426pub fn visible(mode: window::Mode) -> bool {
428 match mode {
429 window::Mode::Windowed | window::Mode::Fullscreen => true,
430 window::Mode::Hidden => false,
431 }
432}
433
434pub fn mode(mode: Option<winit::window::Fullscreen>) -> window::Mode {
438 match mode {
439 None => window::Mode::Windowed,
440 Some(_) => window::Mode::Fullscreen,
441 }
442}
443
444pub fn theme_mode(theme: winit::window::Theme) -> theme::Mode {
448 match theme {
449 winit::window::Theme::Light => theme::Mode::Light,
450 winit::window::Theme::Dark => theme::Mode::Dark,
451 }
452}
453
454pub fn window_theme(mode: theme::Mode) -> Option<winit::window::Theme> {
458 match mode {
459 theme::Mode::None => None,
460 theme::Mode::Light => Some(winit::window::Theme::Light),
461 theme::Mode::Dark => Some(winit::window::Theme::Dark),
462 }
463}
464
465pub fn mouse_interaction(
469 interaction: mouse::Interaction,
470) -> winit::window::CursorIcon {
471 use mouse::Interaction;
472
473 match interaction {
474 Interaction::None | Interaction::Idle => {
475 winit::window::CursorIcon::Default
476 }
477 Interaction::Pointer => winit::window::CursorIcon::Pointer,
478 Interaction::Working => winit::window::CursorIcon::Progress,
479 Interaction::Grab => winit::window::CursorIcon::Grab,
480 Interaction::Grabbing => winit::window::CursorIcon::Grabbing,
481 Interaction::Crosshair => winit::window::CursorIcon::Crosshair,
482 Interaction::Text => winit::window::CursorIcon::Text,
483 Interaction::ResizingHorizontally => {
484 winit::window::CursorIcon::EwResize
485 }
486 Interaction::ResizingVertically => winit::window::CursorIcon::NsResize,
487 Interaction::ResizingDiagonallyUp => {
488 winit::window::CursorIcon::NeswResize
489 }
490 Interaction::ResizingDiagonallyDown => {
491 winit::window::CursorIcon::NwseResize
492 }
493 Interaction::NotAllowed => winit::window::CursorIcon::NotAllowed,
494 Interaction::ZoomIn => winit::window::CursorIcon::ZoomIn,
495 Interaction::ZoomOut => winit::window::CursorIcon::ZoomOut,
496 Interaction::Cell => winit::window::CursorIcon::Cell,
497 Interaction::Move => winit::window::CursorIcon::Move,
498 Interaction::Copy => winit::window::CursorIcon::Copy,
499 Interaction::Help => winit::window::CursorIcon::Help,
500 }
501}
502
503pub fn mouse_button(mouse_button: winit::event::MouseButton) -> mouse::Button {
508 match mouse_button {
509 winit::event::MouseButton::Left => mouse::Button::Left,
510 winit::event::MouseButton::Right => mouse::Button::Right,
511 winit::event::MouseButton::Middle => mouse::Button::Middle,
512 winit::event::MouseButton::Back => mouse::Button::Back,
513 winit::event::MouseButton::Forward => mouse::Button::Forward,
514 winit::event::MouseButton::Other(other) => mouse::Button::Other(other),
515 }
516}
517
518pub fn modifiers(
524 modifiers: winit::keyboard::ModifiersState,
525) -> keyboard::Modifiers {
526 let mut result = keyboard::Modifiers::empty();
527
528 result.set(keyboard::Modifiers::SHIFT, modifiers.shift_key());
529 result.set(keyboard::Modifiers::CTRL, modifiers.control_key());
530 result.set(keyboard::Modifiers::ALT, modifiers.alt_key());
531 result.set(keyboard::Modifiers::LOGO, modifiers.super_key());
532
533 result
534}
535
536pub fn cursor_position(
538 position: winit::dpi::PhysicalPosition<f64>,
539 scale_factor: f32,
540) -> Point {
541 let logical_position = position.to_logical(f64::from(scale_factor));
542
543 Point::new(logical_position.x, logical_position.y)
544}
545
546pub fn touch_event(
551 touch: winit::event::Touch,
552 scale_factor: f32,
553) -> touch::Event {
554 let id = touch::Finger(touch.id);
555 let position = {
556 let location =
557 touch.location.to_logical::<f64>(f64::from(scale_factor));
558
559 Point::new(location.x as f32, location.y as f32)
560 };
561
562 match touch.phase {
563 winit::event::TouchPhase::Started => {
564 touch::Event::FingerPressed { id, position }
565 }
566 winit::event::TouchPhase::Moved => {
567 touch::Event::FingerMoved { id, position }
568 }
569 winit::event::TouchPhase::Ended => {
570 touch::Event::FingerLifted { id, position }
571 }
572 winit::event::TouchPhase::Cancelled => {
573 touch::Event::FingerLost { id, position }
574 }
575 }
576}
577
578pub fn key(key: winit::keyboard::Key) -> keyboard::Key {
583 use keyboard::key::Named;
584 use winit::keyboard::NamedKey;
585
586 match key {
587 winit::keyboard::Key::Character(c) => keyboard::Key::Character(c),
588 winit::keyboard::Key::Named(named_key) => {
589 keyboard::Key::Named(match named_key {
590 NamedKey::Alt => Named::Alt,
591 NamedKey::AltGraph => Named::AltGraph,
592 NamedKey::CapsLock => Named::CapsLock,
593 NamedKey::Control => Named::Control,
594 NamedKey::Fn => Named::Fn,
595 NamedKey::FnLock => Named::FnLock,
596 NamedKey::NumLock => Named::NumLock,
597 NamedKey::ScrollLock => Named::ScrollLock,
598 NamedKey::Shift => Named::Shift,
599 NamedKey::Symbol => Named::Symbol,
600 NamedKey::SymbolLock => Named::SymbolLock,
601 NamedKey::Meta => Named::Meta,
602 NamedKey::Hyper => Named::Hyper,
603 NamedKey::Super => Named::Super,
604 NamedKey::Enter => Named::Enter,
605 NamedKey::Tab => Named::Tab,
606 NamedKey::Space => Named::Space,
607 NamedKey::ArrowDown => Named::ArrowDown,
608 NamedKey::ArrowLeft => Named::ArrowLeft,
609 NamedKey::ArrowRight => Named::ArrowRight,
610 NamedKey::ArrowUp => Named::ArrowUp,
611 NamedKey::End => Named::End,
612 NamedKey::Home => Named::Home,
613 NamedKey::PageDown => Named::PageDown,
614 NamedKey::PageUp => Named::PageUp,
615 NamedKey::Backspace => Named::Backspace,
616 NamedKey::Clear => Named::Clear,
617 NamedKey::Copy => Named::Copy,
618 NamedKey::CrSel => Named::CrSel,
619 NamedKey::Cut => Named::Cut,
620 NamedKey::Delete => Named::Delete,
621 NamedKey::EraseEof => Named::EraseEof,
622 NamedKey::ExSel => Named::ExSel,
623 NamedKey::Insert => Named::Insert,
624 NamedKey::Paste => Named::Paste,
625 NamedKey::Redo => Named::Redo,
626 NamedKey::Undo => Named::Undo,
627 NamedKey::Accept => Named::Accept,
628 NamedKey::Again => Named::Again,
629 NamedKey::Attn => Named::Attn,
630 NamedKey::Cancel => Named::Cancel,
631 NamedKey::ContextMenu => Named::ContextMenu,
632 NamedKey::Escape => Named::Escape,
633 NamedKey::Execute => Named::Execute,
634 NamedKey::Find => Named::Find,
635 NamedKey::Help => Named::Help,
636 NamedKey::Pause => Named::Pause,
637 NamedKey::Play => Named::Play,
638 NamedKey::Props => Named::Props,
639 NamedKey::Select => Named::Select,
640 NamedKey::ZoomIn => Named::ZoomIn,
641 NamedKey::ZoomOut => Named::ZoomOut,
642 NamedKey::BrightnessDown => Named::BrightnessDown,
643 NamedKey::BrightnessUp => Named::BrightnessUp,
644 NamedKey::Eject => Named::Eject,
645 NamedKey::LogOff => Named::LogOff,
646 NamedKey::Power => Named::Power,
647 NamedKey::PowerOff => Named::PowerOff,
648 NamedKey::PrintScreen => Named::PrintScreen,
649 NamedKey::Hibernate => Named::Hibernate,
650 NamedKey::Standby => Named::Standby,
651 NamedKey::WakeUp => Named::WakeUp,
652 NamedKey::AllCandidates => Named::AllCandidates,
653 NamedKey::Alphanumeric => Named::Alphanumeric,
654 NamedKey::CodeInput => Named::CodeInput,
655 NamedKey::Compose => Named::Compose,
656 NamedKey::Convert => Named::Convert,
657 NamedKey::FinalMode => Named::FinalMode,
658 NamedKey::GroupFirst => Named::GroupFirst,
659 NamedKey::GroupLast => Named::GroupLast,
660 NamedKey::GroupNext => Named::GroupNext,
661 NamedKey::GroupPrevious => Named::GroupPrevious,
662 NamedKey::ModeChange => Named::ModeChange,
663 NamedKey::NextCandidate => Named::NextCandidate,
664 NamedKey::NonConvert => Named::NonConvert,
665 NamedKey::PreviousCandidate => Named::PreviousCandidate,
666 NamedKey::Process => Named::Process,
667 NamedKey::SingleCandidate => Named::SingleCandidate,
668 NamedKey::HangulMode => Named::HangulMode,
669 NamedKey::HanjaMode => Named::HanjaMode,
670 NamedKey::JunjaMode => Named::JunjaMode,
671 NamedKey::Eisu => Named::Eisu,
672 NamedKey::Hankaku => Named::Hankaku,
673 NamedKey::Hiragana => Named::Hiragana,
674 NamedKey::HiraganaKatakana => Named::HiraganaKatakana,
675 NamedKey::KanaMode => Named::KanaMode,
676 NamedKey::KanjiMode => Named::KanjiMode,
677 NamedKey::Katakana => Named::Katakana,
678 NamedKey::Romaji => Named::Romaji,
679 NamedKey::Zenkaku => Named::Zenkaku,
680 NamedKey::ZenkakuHankaku => Named::ZenkakuHankaku,
681 NamedKey::Soft1 => Named::Soft1,
682 NamedKey::Soft2 => Named::Soft2,
683 NamedKey::Soft3 => Named::Soft3,
684 NamedKey::Soft4 => Named::Soft4,
685 NamedKey::ChannelDown => Named::ChannelDown,
686 NamedKey::ChannelUp => Named::ChannelUp,
687 NamedKey::Close => Named::Close,
688 NamedKey::MailForward => Named::MailForward,
689 NamedKey::MailReply => Named::MailReply,
690 NamedKey::MailSend => Named::MailSend,
691 NamedKey::MediaClose => Named::MediaClose,
692 NamedKey::MediaFastForward => Named::MediaFastForward,
693 NamedKey::MediaPause => Named::MediaPause,
694 NamedKey::MediaPlay => Named::MediaPlay,
695 NamedKey::MediaPlayPause => Named::MediaPlayPause,
696 NamedKey::MediaRecord => Named::MediaRecord,
697 NamedKey::MediaRewind => Named::MediaRewind,
698 NamedKey::MediaStop => Named::MediaStop,
699 NamedKey::MediaTrackNext => Named::MediaTrackNext,
700 NamedKey::MediaTrackPrevious => Named::MediaTrackPrevious,
701 NamedKey::New => Named::New,
702 NamedKey::Open => Named::Open,
703 NamedKey::Print => Named::Print,
704 NamedKey::Save => Named::Save,
705 NamedKey::SpellCheck => Named::SpellCheck,
706 NamedKey::Key11 => Named::Key11,
707 NamedKey::Key12 => Named::Key12,
708 NamedKey::AudioBalanceLeft => Named::AudioBalanceLeft,
709 NamedKey::AudioBalanceRight => Named::AudioBalanceRight,
710 NamedKey::AudioBassBoostDown => Named::AudioBassBoostDown,
711 NamedKey::AudioBassBoostToggle => Named::AudioBassBoostToggle,
712 NamedKey::AudioBassBoostUp => Named::AudioBassBoostUp,
713 NamedKey::AudioFaderFront => Named::AudioFaderFront,
714 NamedKey::AudioFaderRear => Named::AudioFaderRear,
715 NamedKey::AudioSurroundModeNext => Named::AudioSurroundModeNext,
716 NamedKey::AudioTrebleDown => Named::AudioTrebleDown,
717 NamedKey::AudioTrebleUp => Named::AudioTrebleUp,
718 NamedKey::AudioVolumeDown => Named::AudioVolumeDown,
719 NamedKey::AudioVolumeUp => Named::AudioVolumeUp,
720 NamedKey::AudioVolumeMute => Named::AudioVolumeMute,
721 NamedKey::MicrophoneToggle => Named::MicrophoneToggle,
722 NamedKey::MicrophoneVolumeDown => Named::MicrophoneVolumeDown,
723 NamedKey::MicrophoneVolumeUp => Named::MicrophoneVolumeUp,
724 NamedKey::MicrophoneVolumeMute => Named::MicrophoneVolumeMute,
725 NamedKey::SpeechCorrectionList => Named::SpeechCorrectionList,
726 NamedKey::SpeechInputToggle => Named::SpeechInputToggle,
727 NamedKey::LaunchApplication1 => Named::LaunchApplication1,
728 NamedKey::LaunchApplication2 => Named::LaunchApplication2,
729 NamedKey::LaunchCalendar => Named::LaunchCalendar,
730 NamedKey::LaunchContacts => Named::LaunchContacts,
731 NamedKey::LaunchMail => Named::LaunchMail,
732 NamedKey::LaunchMediaPlayer => Named::LaunchMediaPlayer,
733 NamedKey::LaunchMusicPlayer => Named::LaunchMusicPlayer,
734 NamedKey::LaunchPhone => Named::LaunchPhone,
735 NamedKey::LaunchScreenSaver => Named::LaunchScreenSaver,
736 NamedKey::LaunchSpreadsheet => Named::LaunchSpreadsheet,
737 NamedKey::LaunchWebBrowser => Named::LaunchWebBrowser,
738 NamedKey::LaunchWebCam => Named::LaunchWebCam,
739 NamedKey::LaunchWordProcessor => Named::LaunchWordProcessor,
740 NamedKey::BrowserBack => Named::BrowserBack,
741 NamedKey::BrowserFavorites => Named::BrowserFavorites,
742 NamedKey::BrowserForward => Named::BrowserForward,
743 NamedKey::BrowserHome => Named::BrowserHome,
744 NamedKey::BrowserRefresh => Named::BrowserRefresh,
745 NamedKey::BrowserSearch => Named::BrowserSearch,
746 NamedKey::BrowserStop => Named::BrowserStop,
747 NamedKey::AppSwitch => Named::AppSwitch,
748 NamedKey::Call => Named::Call,
749 NamedKey::Camera => Named::Camera,
750 NamedKey::CameraFocus => Named::CameraFocus,
751 NamedKey::EndCall => Named::EndCall,
752 NamedKey::GoBack => Named::GoBack,
753 NamedKey::GoHome => Named::GoHome,
754 NamedKey::HeadsetHook => Named::HeadsetHook,
755 NamedKey::LastNumberRedial => Named::LastNumberRedial,
756 NamedKey::Notification => Named::Notification,
757 NamedKey::MannerMode => Named::MannerMode,
758 NamedKey::VoiceDial => Named::VoiceDial,
759 NamedKey::TV => Named::TV,
760 NamedKey::TV3DMode => Named::TV3DMode,
761 NamedKey::TVAntennaCable => Named::TVAntennaCable,
762 NamedKey::TVAudioDescription => Named::TVAudioDescription,
763 NamedKey::TVAudioDescriptionMixDown => {
764 Named::TVAudioDescriptionMixDown
765 }
766 NamedKey::TVAudioDescriptionMixUp => {
767 Named::TVAudioDescriptionMixUp
768 }
769 NamedKey::TVContentsMenu => Named::TVContentsMenu,
770 NamedKey::TVDataService => Named::TVDataService,
771 NamedKey::TVInput => Named::TVInput,
772 NamedKey::TVInputComponent1 => Named::TVInputComponent1,
773 NamedKey::TVInputComponent2 => Named::TVInputComponent2,
774 NamedKey::TVInputComposite1 => Named::TVInputComposite1,
775 NamedKey::TVInputComposite2 => Named::TVInputComposite2,
776 NamedKey::TVInputHDMI1 => Named::TVInputHDMI1,
777 NamedKey::TVInputHDMI2 => Named::TVInputHDMI2,
778 NamedKey::TVInputHDMI3 => Named::TVInputHDMI3,
779 NamedKey::TVInputHDMI4 => Named::TVInputHDMI4,
780 NamedKey::TVInputVGA1 => Named::TVInputVGA1,
781 NamedKey::TVMediaContext => Named::TVMediaContext,
782 NamedKey::TVNetwork => Named::TVNetwork,
783 NamedKey::TVNumberEntry => Named::TVNumberEntry,
784 NamedKey::TVPower => Named::TVPower,
785 NamedKey::TVRadioService => Named::TVRadioService,
786 NamedKey::TVSatellite => Named::TVSatellite,
787 NamedKey::TVSatelliteBS => Named::TVSatelliteBS,
788 NamedKey::TVSatelliteCS => Named::TVSatelliteCS,
789 NamedKey::TVSatelliteToggle => Named::TVSatelliteToggle,
790 NamedKey::TVTerrestrialAnalog => Named::TVTerrestrialAnalog,
791 NamedKey::TVTerrestrialDigital => Named::TVTerrestrialDigital,
792 NamedKey::TVTimer => Named::TVTimer,
793 NamedKey::AVRInput => Named::AVRInput,
794 NamedKey::AVRPower => Named::AVRPower,
795 NamedKey::ColorF0Red => Named::ColorF0Red,
796 NamedKey::ColorF1Green => Named::ColorF1Green,
797 NamedKey::ColorF2Yellow => Named::ColorF2Yellow,
798 NamedKey::ColorF3Blue => Named::ColorF3Blue,
799 NamedKey::ColorF4Grey => Named::ColorF4Grey,
800 NamedKey::ColorF5Brown => Named::ColorF5Brown,
801 NamedKey::ClosedCaptionToggle => Named::ClosedCaptionToggle,
802 NamedKey::Dimmer => Named::Dimmer,
803 NamedKey::DisplaySwap => Named::DisplaySwap,
804 NamedKey::DVR => Named::DVR,
805 NamedKey::Exit => Named::Exit,
806 NamedKey::FavoriteClear0 => Named::FavoriteClear0,
807 NamedKey::FavoriteClear1 => Named::FavoriteClear1,
808 NamedKey::FavoriteClear2 => Named::FavoriteClear2,
809 NamedKey::FavoriteClear3 => Named::FavoriteClear3,
810 NamedKey::FavoriteRecall0 => Named::FavoriteRecall0,
811 NamedKey::FavoriteRecall1 => Named::FavoriteRecall1,
812 NamedKey::FavoriteRecall2 => Named::FavoriteRecall2,
813 NamedKey::FavoriteRecall3 => Named::FavoriteRecall3,
814 NamedKey::FavoriteStore0 => Named::FavoriteStore0,
815 NamedKey::FavoriteStore1 => Named::FavoriteStore1,
816 NamedKey::FavoriteStore2 => Named::FavoriteStore2,
817 NamedKey::FavoriteStore3 => Named::FavoriteStore3,
818 NamedKey::Guide => Named::Guide,
819 NamedKey::GuideNextDay => Named::GuideNextDay,
820 NamedKey::GuidePreviousDay => Named::GuidePreviousDay,
821 NamedKey::Info => Named::Info,
822 NamedKey::InstantReplay => Named::InstantReplay,
823 NamedKey::Link => Named::Link,
824 NamedKey::ListProgram => Named::ListProgram,
825 NamedKey::LiveContent => Named::LiveContent,
826 NamedKey::Lock => Named::Lock,
827 NamedKey::MediaApps => Named::MediaApps,
828 NamedKey::MediaAudioTrack => Named::MediaAudioTrack,
829 NamedKey::MediaLast => Named::MediaLast,
830 NamedKey::MediaSkipBackward => Named::MediaSkipBackward,
831 NamedKey::MediaSkipForward => Named::MediaSkipForward,
832 NamedKey::MediaStepBackward => Named::MediaStepBackward,
833 NamedKey::MediaStepForward => Named::MediaStepForward,
834 NamedKey::MediaTopMenu => Named::MediaTopMenu,
835 NamedKey::NavigateIn => Named::NavigateIn,
836 NamedKey::NavigateNext => Named::NavigateNext,
837 NamedKey::NavigateOut => Named::NavigateOut,
838 NamedKey::NavigatePrevious => Named::NavigatePrevious,
839 NamedKey::NextFavoriteChannel => Named::NextFavoriteChannel,
840 NamedKey::NextUserProfile => Named::NextUserProfile,
841 NamedKey::OnDemand => Named::OnDemand,
842 NamedKey::Pairing => Named::Pairing,
843 NamedKey::PinPDown => Named::PinPDown,
844 NamedKey::PinPMove => Named::PinPMove,
845 NamedKey::PinPToggle => Named::PinPToggle,
846 NamedKey::PinPUp => Named::PinPUp,
847 NamedKey::PlaySpeedDown => Named::PlaySpeedDown,
848 NamedKey::PlaySpeedReset => Named::PlaySpeedReset,
849 NamedKey::PlaySpeedUp => Named::PlaySpeedUp,
850 NamedKey::RandomToggle => Named::RandomToggle,
851 NamedKey::RcLowBattery => Named::RcLowBattery,
852 NamedKey::RecordSpeedNext => Named::RecordSpeedNext,
853 NamedKey::RfBypass => Named::RfBypass,
854 NamedKey::ScanChannelsToggle => Named::ScanChannelsToggle,
855 NamedKey::ScreenModeNext => Named::ScreenModeNext,
856 NamedKey::Settings => Named::Settings,
857 NamedKey::SplitScreenToggle => Named::SplitScreenToggle,
858 NamedKey::STBInput => Named::STBInput,
859 NamedKey::STBPower => Named::STBPower,
860 NamedKey::Subtitle => Named::Subtitle,
861 NamedKey::Teletext => Named::Teletext,
862 NamedKey::VideoModeNext => Named::VideoModeNext,
863 NamedKey::Wink => Named::Wink,
864 NamedKey::ZoomToggle => Named::ZoomToggle,
865 NamedKey::F1 => Named::F1,
866 NamedKey::F2 => Named::F2,
867 NamedKey::F3 => Named::F3,
868 NamedKey::F4 => Named::F4,
869 NamedKey::F5 => Named::F5,
870 NamedKey::F6 => Named::F6,
871 NamedKey::F7 => Named::F7,
872 NamedKey::F8 => Named::F8,
873 NamedKey::F9 => Named::F9,
874 NamedKey::F10 => Named::F10,
875 NamedKey::F11 => Named::F11,
876 NamedKey::F12 => Named::F12,
877 NamedKey::F13 => Named::F13,
878 NamedKey::F14 => Named::F14,
879 NamedKey::F15 => Named::F15,
880 NamedKey::F16 => Named::F16,
881 NamedKey::F17 => Named::F17,
882 NamedKey::F18 => Named::F18,
883 NamedKey::F19 => Named::F19,
884 NamedKey::F20 => Named::F20,
885 NamedKey::F21 => Named::F21,
886 NamedKey::F22 => Named::F22,
887 NamedKey::F23 => Named::F23,
888 NamedKey::F24 => Named::F24,
889 NamedKey::F25 => Named::F25,
890 NamedKey::F26 => Named::F26,
891 NamedKey::F27 => Named::F27,
892 NamedKey::F28 => Named::F28,
893 NamedKey::F29 => Named::F29,
894 NamedKey::F30 => Named::F30,
895 NamedKey::F31 => Named::F31,
896 NamedKey::F32 => Named::F32,
897 NamedKey::F33 => Named::F33,
898 NamedKey::F34 => Named::F34,
899 NamedKey::F35 => Named::F35,
900 _ => return keyboard::Key::Unidentified,
901 })
902 }
903 _ => keyboard::Key::Unidentified,
904 }
905}
906
907pub fn physical_key(
912 physical_key: winit::keyboard::PhysicalKey,
913) -> keyboard::key::Physical {
914 match physical_key {
915 winit::keyboard::PhysicalKey::Code(code) => key_code(code)
916 .map(keyboard::key::Physical::Code)
917 .unwrap_or(keyboard::key::Physical::Unidentified(
918 keyboard::key::NativeCode::Unidentified,
919 )),
920 winit::keyboard::PhysicalKey::Unidentified(code) => {
921 keyboard::key::Physical::Unidentified(native_key_code(code))
922 }
923 }
924}
925
926pub fn key_code(
931 key_code: winit::keyboard::KeyCode,
932) -> Option<keyboard::key::Code> {
933 use winit::keyboard::KeyCode;
934
935 Some(match key_code {
936 KeyCode::Backquote => keyboard::key::Code::Backquote,
937 KeyCode::Backslash => keyboard::key::Code::Backslash,
938 KeyCode::BracketLeft => keyboard::key::Code::BracketLeft,
939 KeyCode::BracketRight => keyboard::key::Code::BracketRight,
940 KeyCode::Comma => keyboard::key::Code::Comma,
941 KeyCode::Digit0 => keyboard::key::Code::Digit0,
942 KeyCode::Digit1 => keyboard::key::Code::Digit1,
943 KeyCode::Digit2 => keyboard::key::Code::Digit2,
944 KeyCode::Digit3 => keyboard::key::Code::Digit3,
945 KeyCode::Digit4 => keyboard::key::Code::Digit4,
946 KeyCode::Digit5 => keyboard::key::Code::Digit5,
947 KeyCode::Digit6 => keyboard::key::Code::Digit6,
948 KeyCode::Digit7 => keyboard::key::Code::Digit7,
949 KeyCode::Digit8 => keyboard::key::Code::Digit8,
950 KeyCode::Digit9 => keyboard::key::Code::Digit9,
951 KeyCode::Equal => keyboard::key::Code::Equal,
952 KeyCode::IntlBackslash => keyboard::key::Code::IntlBackslash,
953 KeyCode::IntlRo => keyboard::key::Code::IntlRo,
954 KeyCode::IntlYen => keyboard::key::Code::IntlYen,
955 KeyCode::KeyA => keyboard::key::Code::KeyA,
956 KeyCode::KeyB => keyboard::key::Code::KeyB,
957 KeyCode::KeyC => keyboard::key::Code::KeyC,
958 KeyCode::KeyD => keyboard::key::Code::KeyD,
959 KeyCode::KeyE => keyboard::key::Code::KeyE,
960 KeyCode::KeyF => keyboard::key::Code::KeyF,
961 KeyCode::KeyG => keyboard::key::Code::KeyG,
962 KeyCode::KeyH => keyboard::key::Code::KeyH,
963 KeyCode::KeyI => keyboard::key::Code::KeyI,
964 KeyCode::KeyJ => keyboard::key::Code::KeyJ,
965 KeyCode::KeyK => keyboard::key::Code::KeyK,
966 KeyCode::KeyL => keyboard::key::Code::KeyL,
967 KeyCode::KeyM => keyboard::key::Code::KeyM,
968 KeyCode::KeyN => keyboard::key::Code::KeyN,
969 KeyCode::KeyO => keyboard::key::Code::KeyO,
970 KeyCode::KeyP => keyboard::key::Code::KeyP,
971 KeyCode::KeyQ => keyboard::key::Code::KeyQ,
972 KeyCode::KeyR => keyboard::key::Code::KeyR,
973 KeyCode::KeyS => keyboard::key::Code::KeyS,
974 KeyCode::KeyT => keyboard::key::Code::KeyT,
975 KeyCode::KeyU => keyboard::key::Code::KeyU,
976 KeyCode::KeyV => keyboard::key::Code::KeyV,
977 KeyCode::KeyW => keyboard::key::Code::KeyW,
978 KeyCode::KeyX => keyboard::key::Code::KeyX,
979 KeyCode::KeyY => keyboard::key::Code::KeyY,
980 KeyCode::KeyZ => keyboard::key::Code::KeyZ,
981 KeyCode::Minus => keyboard::key::Code::Minus,
982 KeyCode::Period => keyboard::key::Code::Period,
983 KeyCode::Quote => keyboard::key::Code::Quote,
984 KeyCode::Semicolon => keyboard::key::Code::Semicolon,
985 KeyCode::Slash => keyboard::key::Code::Slash,
986 KeyCode::AltLeft => keyboard::key::Code::AltLeft,
987 KeyCode::AltRight => keyboard::key::Code::AltRight,
988 KeyCode::Backspace => keyboard::key::Code::Backspace,
989 KeyCode::CapsLock => keyboard::key::Code::CapsLock,
990 KeyCode::ContextMenu => keyboard::key::Code::ContextMenu,
991 KeyCode::ControlLeft => keyboard::key::Code::ControlLeft,
992 KeyCode::ControlRight => keyboard::key::Code::ControlRight,
993 KeyCode::Enter => keyboard::key::Code::Enter,
994 KeyCode::SuperLeft => keyboard::key::Code::SuperLeft,
995 KeyCode::SuperRight => keyboard::key::Code::SuperRight,
996 KeyCode::ShiftLeft => keyboard::key::Code::ShiftLeft,
997 KeyCode::ShiftRight => keyboard::key::Code::ShiftRight,
998 KeyCode::Space => keyboard::key::Code::Space,
999 KeyCode::Tab => keyboard::key::Code::Tab,
1000 KeyCode::Convert => keyboard::key::Code::Convert,
1001 KeyCode::KanaMode => keyboard::key::Code::KanaMode,
1002 KeyCode::Lang1 => keyboard::key::Code::Lang1,
1003 KeyCode::Lang2 => keyboard::key::Code::Lang2,
1004 KeyCode::Lang3 => keyboard::key::Code::Lang3,
1005 KeyCode::Lang4 => keyboard::key::Code::Lang4,
1006 KeyCode::Lang5 => keyboard::key::Code::Lang5,
1007 KeyCode::NonConvert => keyboard::key::Code::NonConvert,
1008 KeyCode::Delete => keyboard::key::Code::Delete,
1009 KeyCode::End => keyboard::key::Code::End,
1010 KeyCode::Help => keyboard::key::Code::Help,
1011 KeyCode::Home => keyboard::key::Code::Home,
1012 KeyCode::Insert => keyboard::key::Code::Insert,
1013 KeyCode::PageDown => keyboard::key::Code::PageDown,
1014 KeyCode::PageUp => keyboard::key::Code::PageUp,
1015 KeyCode::ArrowDown => keyboard::key::Code::ArrowDown,
1016 KeyCode::ArrowLeft => keyboard::key::Code::ArrowLeft,
1017 KeyCode::ArrowRight => keyboard::key::Code::ArrowRight,
1018 KeyCode::ArrowUp => keyboard::key::Code::ArrowUp,
1019 KeyCode::NumLock => keyboard::key::Code::NumLock,
1020 KeyCode::Numpad0 => keyboard::key::Code::Numpad0,
1021 KeyCode::Numpad1 => keyboard::key::Code::Numpad1,
1022 KeyCode::Numpad2 => keyboard::key::Code::Numpad2,
1023 KeyCode::Numpad3 => keyboard::key::Code::Numpad3,
1024 KeyCode::Numpad4 => keyboard::key::Code::Numpad4,
1025 KeyCode::Numpad5 => keyboard::key::Code::Numpad5,
1026 KeyCode::Numpad6 => keyboard::key::Code::Numpad6,
1027 KeyCode::Numpad7 => keyboard::key::Code::Numpad7,
1028 KeyCode::Numpad8 => keyboard::key::Code::Numpad8,
1029 KeyCode::Numpad9 => keyboard::key::Code::Numpad9,
1030 KeyCode::NumpadAdd => keyboard::key::Code::NumpadAdd,
1031 KeyCode::NumpadBackspace => keyboard::key::Code::NumpadBackspace,
1032 KeyCode::NumpadClear => keyboard::key::Code::NumpadClear,
1033 KeyCode::NumpadClearEntry => keyboard::key::Code::NumpadClearEntry,
1034 KeyCode::NumpadComma => keyboard::key::Code::NumpadComma,
1035 KeyCode::NumpadDecimal => keyboard::key::Code::NumpadDecimal,
1036 KeyCode::NumpadDivide => keyboard::key::Code::NumpadDivide,
1037 KeyCode::NumpadEnter => keyboard::key::Code::NumpadEnter,
1038 KeyCode::NumpadEqual => keyboard::key::Code::NumpadEqual,
1039 KeyCode::NumpadHash => keyboard::key::Code::NumpadHash,
1040 KeyCode::NumpadMemoryAdd => keyboard::key::Code::NumpadMemoryAdd,
1041 KeyCode::NumpadMemoryClear => keyboard::key::Code::NumpadMemoryClear,
1042 KeyCode::NumpadMemoryRecall => keyboard::key::Code::NumpadMemoryRecall,
1043 KeyCode::NumpadMemoryStore => keyboard::key::Code::NumpadMemoryStore,
1044 KeyCode::NumpadMemorySubtract => {
1045 keyboard::key::Code::NumpadMemorySubtract
1046 }
1047 KeyCode::NumpadMultiply => keyboard::key::Code::NumpadMultiply,
1048 KeyCode::NumpadParenLeft => keyboard::key::Code::NumpadParenLeft,
1049 KeyCode::NumpadParenRight => keyboard::key::Code::NumpadParenRight,
1050 KeyCode::NumpadStar => keyboard::key::Code::NumpadStar,
1051 KeyCode::NumpadSubtract => keyboard::key::Code::NumpadSubtract,
1052 KeyCode::Escape => keyboard::key::Code::Escape,
1053 KeyCode::Fn => keyboard::key::Code::Fn,
1054 KeyCode::FnLock => keyboard::key::Code::FnLock,
1055 KeyCode::PrintScreen => keyboard::key::Code::PrintScreen,
1056 KeyCode::ScrollLock => keyboard::key::Code::ScrollLock,
1057 KeyCode::Pause => keyboard::key::Code::Pause,
1058 KeyCode::BrowserBack => keyboard::key::Code::BrowserBack,
1059 KeyCode::BrowserFavorites => keyboard::key::Code::BrowserFavorites,
1060 KeyCode::BrowserForward => keyboard::key::Code::BrowserForward,
1061 KeyCode::BrowserHome => keyboard::key::Code::BrowserHome,
1062 KeyCode::BrowserRefresh => keyboard::key::Code::BrowserRefresh,
1063 KeyCode::BrowserSearch => keyboard::key::Code::BrowserSearch,
1064 KeyCode::BrowserStop => keyboard::key::Code::BrowserStop,
1065 KeyCode::Eject => keyboard::key::Code::Eject,
1066 KeyCode::LaunchApp1 => keyboard::key::Code::LaunchApp1,
1067 KeyCode::LaunchApp2 => keyboard::key::Code::LaunchApp2,
1068 KeyCode::LaunchMail => keyboard::key::Code::LaunchMail,
1069 KeyCode::MediaPlayPause => keyboard::key::Code::MediaPlayPause,
1070 KeyCode::MediaSelect => keyboard::key::Code::MediaSelect,
1071 KeyCode::MediaStop => keyboard::key::Code::MediaStop,
1072 KeyCode::MediaTrackNext => keyboard::key::Code::MediaTrackNext,
1073 KeyCode::MediaTrackPrevious => keyboard::key::Code::MediaTrackPrevious,
1074 KeyCode::Power => keyboard::key::Code::Power,
1075 KeyCode::Sleep => keyboard::key::Code::Sleep,
1076 KeyCode::AudioVolumeDown => keyboard::key::Code::AudioVolumeDown,
1077 KeyCode::AudioVolumeMute => keyboard::key::Code::AudioVolumeMute,
1078 KeyCode::AudioVolumeUp => keyboard::key::Code::AudioVolumeUp,
1079 KeyCode::WakeUp => keyboard::key::Code::WakeUp,
1080 KeyCode::Meta => keyboard::key::Code::Meta,
1081 KeyCode::Hyper => keyboard::key::Code::Hyper,
1082 KeyCode::Turbo => keyboard::key::Code::Turbo,
1083 KeyCode::Abort => keyboard::key::Code::Abort,
1084 KeyCode::Resume => keyboard::key::Code::Resume,
1085 KeyCode::Suspend => keyboard::key::Code::Suspend,
1086 KeyCode::Again => keyboard::key::Code::Again,
1087 KeyCode::Copy => keyboard::key::Code::Copy,
1088 KeyCode::Cut => keyboard::key::Code::Cut,
1089 KeyCode::Find => keyboard::key::Code::Find,
1090 KeyCode::Open => keyboard::key::Code::Open,
1091 KeyCode::Paste => keyboard::key::Code::Paste,
1092 KeyCode::Props => keyboard::key::Code::Props,
1093 KeyCode::Select => keyboard::key::Code::Select,
1094 KeyCode::Undo => keyboard::key::Code::Undo,
1095 KeyCode::Hiragana => keyboard::key::Code::Hiragana,
1096 KeyCode::Katakana => keyboard::key::Code::Katakana,
1097 KeyCode::F1 => keyboard::key::Code::F1,
1098 KeyCode::F2 => keyboard::key::Code::F2,
1099 KeyCode::F3 => keyboard::key::Code::F3,
1100 KeyCode::F4 => keyboard::key::Code::F4,
1101 KeyCode::F5 => keyboard::key::Code::F5,
1102 KeyCode::F6 => keyboard::key::Code::F6,
1103 KeyCode::F7 => keyboard::key::Code::F7,
1104 KeyCode::F8 => keyboard::key::Code::F8,
1105 KeyCode::F9 => keyboard::key::Code::F9,
1106 KeyCode::F10 => keyboard::key::Code::F10,
1107 KeyCode::F11 => keyboard::key::Code::F11,
1108 KeyCode::F12 => keyboard::key::Code::F12,
1109 KeyCode::F13 => keyboard::key::Code::F13,
1110 KeyCode::F14 => keyboard::key::Code::F14,
1111 KeyCode::F15 => keyboard::key::Code::F15,
1112 KeyCode::F16 => keyboard::key::Code::F16,
1113 KeyCode::F17 => keyboard::key::Code::F17,
1114 KeyCode::F18 => keyboard::key::Code::F18,
1115 KeyCode::F19 => keyboard::key::Code::F19,
1116 KeyCode::F20 => keyboard::key::Code::F20,
1117 KeyCode::F21 => keyboard::key::Code::F21,
1118 KeyCode::F22 => keyboard::key::Code::F22,
1119 KeyCode::F23 => keyboard::key::Code::F23,
1120 KeyCode::F24 => keyboard::key::Code::F24,
1121 KeyCode::F25 => keyboard::key::Code::F25,
1122 KeyCode::F26 => keyboard::key::Code::F26,
1123 KeyCode::F27 => keyboard::key::Code::F27,
1124 KeyCode::F28 => keyboard::key::Code::F28,
1125 KeyCode::F29 => keyboard::key::Code::F29,
1126 KeyCode::F30 => keyboard::key::Code::F30,
1127 KeyCode::F31 => keyboard::key::Code::F31,
1128 KeyCode::F32 => keyboard::key::Code::F32,
1129 KeyCode::F33 => keyboard::key::Code::F33,
1130 KeyCode::F34 => keyboard::key::Code::F34,
1131 KeyCode::F35 => keyboard::key::Code::F35,
1132 _ => None?,
1133 })
1134}
1135
1136pub fn native_key_code(
1141 native_key_code: winit::keyboard::NativeKeyCode,
1142) -> keyboard::key::NativeCode {
1143 use winit::keyboard::NativeKeyCode;
1144
1145 match native_key_code {
1146 NativeKeyCode::Unidentified => keyboard::key::NativeCode::Unidentified,
1147 NativeKeyCode::Android(code) => {
1148 keyboard::key::NativeCode::Android(code)
1149 }
1150 NativeKeyCode::MacOS(code) => keyboard::key::NativeCode::MacOS(code),
1151 NativeKeyCode::Windows(code) => {
1152 keyboard::key::NativeCode::Windows(code)
1153 }
1154 NativeKeyCode::Xkb(code) => keyboard::key::NativeCode::Xkb(code),
1155 }
1156}
1157
1158pub fn user_attention(
1162 user_attention: window::UserAttention,
1163) -> winit::window::UserAttentionType {
1164 match user_attention {
1165 window::UserAttention::Critical => {
1166 winit::window::UserAttentionType::Critical
1167 }
1168 window::UserAttention::Informational => {
1169 winit::window::UserAttentionType::Informational
1170 }
1171 }
1172}
1173
1174pub fn resize_direction(
1176 resize_direction: window::Direction,
1177) -> winit::window::ResizeDirection {
1178 match resize_direction {
1179 window::Direction::North => winit::window::ResizeDirection::North,
1180 window::Direction::South => winit::window::ResizeDirection::South,
1181 window::Direction::East => winit::window::ResizeDirection::East,
1182 window::Direction::West => winit::window::ResizeDirection::West,
1183 window::Direction::NorthEast => {
1184 winit::window::ResizeDirection::NorthEast
1185 }
1186 window::Direction::NorthWest => {
1187 winit::window::ResizeDirection::NorthWest
1188 }
1189 window::Direction::SouthEast => {
1190 winit::window::ResizeDirection::SouthEast
1191 }
1192 window::Direction::SouthWest => {
1193 winit::window::ResizeDirection::SouthWest
1194 }
1195 }
1196}
1197
1198pub fn icon(icon: window::Icon) -> Option<winit::window::Icon> {
1202 let (pixels, size) = icon.into_raw();
1203
1204 winit::window::Icon::from_rgba(pixels, size.width, size.height).ok()
1205}
1206
1207pub fn ime_purpose(
1209 purpose: input_method::Purpose,
1210) -> winit::window::ImePurpose {
1211 match purpose {
1212 input_method::Purpose::Normal => winit::window::ImePurpose::Normal,
1213 input_method::Purpose::Secure => winit::window::ImePurpose::Password,
1214 input_method::Purpose::Terminal => winit::window::ImePurpose::Terminal,
1215 }
1216}
1217
1218fn is_private_use(c: char) -> bool {
1220 ('\u{E000}'..='\u{F8FF}').contains(&c)
1221}