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