floem_winit/platform/
scancode.rs

1#![cfg(any(windows_platform, macos_platform, x11_platform, wayland_platform))]
2
3use crate::keyboard::{KeyCode, PhysicalKey};
4
5// TODO: Describe what this value contains for each platform
6
7/// Additional methods for the [`PhysicalKey`] type that allow the user to access the platform-specific
8/// scancode.
9///
10/// [`PhysicalKey`]: crate::keyboard::PhysicalKey
11pub trait PhysicalKeyExtScancode {
12    /// The raw value of the platform-specific physical key identifier.
13    ///
14    /// Returns `Some(key_id)` if the conversion was succesful; returns `None` otherwise.
15    ///
16    /// ## Platform-specific
17    /// - **Windows:** A 16bit extended scancode
18    /// - **Wayland/X11**: A 32-bit linux scancode, which is X11/Wayland keycode subtracted by 8.
19    fn to_scancode(self) -> Option<u32>;
20
21    /// Constructs a `PhysicalKey` from a platform-specific physical key identifier.
22    ///
23    /// Note that this conversion may be lossy, i.e. converting the returned `PhysicalKey` back
24    /// using `to_scancode` might not yield the original value.
25    ///
26    /// ## Platform-specific
27    /// - **Wayland/X11**: A 32-bit linux scancode. When building from X11/Wayland keycode subtract
28    ///                    `8` to get the value you wanted.
29    fn from_scancode(scancode: u32) -> PhysicalKey;
30}
31
32impl PhysicalKeyExtScancode for KeyCode
33where
34    PhysicalKey: PhysicalKeyExtScancode,
35{
36    #[inline]
37    fn from_scancode(scancode: u32) -> PhysicalKey {
38        <PhysicalKey as PhysicalKeyExtScancode>::from_scancode(scancode)
39    }
40
41    #[inline]
42    fn to_scancode(self) -> Option<u32> {
43        <PhysicalKey as PhysicalKeyExtScancode>::to_scancode(PhysicalKey::Code(self))
44    }
45}