cue_sdk/device/
layout.rs

1use cue_sdk_sys as ffi;
2use num_traits::FromPrimitive;
3
4/// The layout of the given device, with keyboards having a `physical_layout` and `logical_layout`
5/// while mice only have a `physical_layout`.
6#[derive(Debug, Clone, PartialEq)]
7pub enum DeviceLayout {
8    Keyboard {
9        physical_layout: PhysicalLayout,
10        logical_layout: LogicalLayout,
11    },
12    Mouse {
13        physical_layout: PhysicalLayout,
14    },
15}
16
17impl DeviceLayout {
18    pub(crate) fn from_ffi_values(
19        physical_layout: ffi::CorsairPhysicalLayout,
20        logical_layout: ffi::CorsairLogicalLayout,
21    ) -> Option<Self> {
22        let physical = PhysicalLayout::from_u32(physical_layout);
23        let logical = LogicalLayout::from_u32(logical_layout);
24
25        match physical {
26            None => None,
27            Some(pl) => match logical {
28                Some(ll) => Some(DeviceLayout::Keyboard {
29                    physical_layout: pl,
30                    logical_layout: ll,
31                }),
32                None => Some(DeviceLayout::Mouse {
33                    physical_layout: pl,
34                }),
35            },
36        }
37    }
38}
39
40/// The various physical layouts that a keyboard `CueDevice` can have.
41#[derive(Debug, Copy, Clone, FromPrimitive, PartialEq)]
42#[repr(u32)]
43pub enum PhysicalLayout {
44    KeyboardUs = ffi::CorsairPhysicalLayout_CPL_US,
45    KeyboardUk = ffi::CorsairPhysicalLayout_CPL_UK,
46    KeyboardBr = ffi::CorsairPhysicalLayout_CPL_BR,
47    KeyboardJp = ffi::CorsairPhysicalLayout_CPL_JP,
48    KeyboardKr = ffi::CorsairPhysicalLayout_CPL_KR,
49    MouseLedCount1 = ffi::CorsairPhysicalLayout_CPL_Zones1,
50    MouseLedCount2 = ffi::CorsairPhysicalLayout_CPL_Zones2,
51    MouseLedCount3 = ffi::CorsairPhysicalLayout_CPL_Zones3,
52    MouseLedCount4 = ffi::CorsairPhysicalLayout_CPL_Zones4,
53}
54
55/// The various logical layouts a mouse `CueDevice` can have.
56#[derive(Debug, Copy, Clone, FromPrimitive, PartialEq)]
57#[repr(u32)]
58pub enum LogicalLayout {
59    KeyboardUsInt = ffi::CorsairLogicalLayout_CLL_US_Int,
60    KeyboardNa = ffi::CorsairLogicalLayout_CLL_NA,
61    KeyboardEu = ffi::CorsairLogicalLayout_CLL_EU,
62    KeyboardUk = ffi::CorsairLogicalLayout_CLL_UK,
63    KeyboardBe = ffi::CorsairLogicalLayout_CLL_BE,
64    KeyboardBr = ffi::CorsairLogicalLayout_CLL_BR,
65    KeyboardCh = ffi::CorsairLogicalLayout_CLL_CH,
66    KeyboardCn = ffi::CorsairLogicalLayout_CLL_CN,
67    KeyboardDe = ffi::CorsairLogicalLayout_CLL_DE,
68    KeyboardEs = ffi::CorsairLogicalLayout_CLL_ES,
69    KeyboardFr = ffi::CorsairLogicalLayout_CLL_FR,
70    KeyboardIt = ffi::CorsairLogicalLayout_CLL_IT,
71    KeyboardNd = ffi::CorsairLogicalLayout_CLL_ND,
72    KeyboardRu = ffi::CorsairLogicalLayout_CLL_RU,
73    KeyboardJp = ffi::CorsairLogicalLayout_CLL_JP,
74    KeyboardKr = ffi::CorsairLogicalLayout_CLL_KR,
75    KeyboardTw = ffi::CorsairLogicalLayout_CLL_TW,
76    KeyboardMex = ffi::CorsairLogicalLayout_CLL_MEX,
77}
78
79#[cfg(test)]
80mod tests {
81
82    use super::{DeviceLayout, LogicalLayout, PhysicalLayout};
83    use cue_sdk_sys as ffi;
84
85    #[test]
86    fn from_ffi_values_no_physical() {
87        let layout = DeviceLayout::from_ffi_values(
88            ffi::CorsairPhysicalLayout_CPL_Invalid,
89            ffi::CorsairLogicalLayout_CLL_DE,
90        );
91        assert_eq!(layout, None)
92    }
93
94    #[test]
95    fn from_ffi_values_physical_but_no_logical() {
96        let layout = DeviceLayout::from_ffi_values(
97            ffi::CorsairPhysicalLayout_CPL_Zones2,
98            ffi::CorsairLogicalLayout_CLL_Invalid,
99        );
100        assert_eq!(
101            layout,
102            Some(DeviceLayout::Mouse {
103                physical_layout: PhysicalLayout::MouseLedCount2
104            })
105        )
106    }
107
108    #[test]
109    fn from_ffi_values_both() {
110        let layout = DeviceLayout::from_ffi_values(
111            ffi::CorsairPhysicalLayout_CPL_US,
112            ffi::CorsairLogicalLayout_CLL_US_Int,
113        );
114        assert_eq!(
115            layout,
116            Some(DeviceLayout::Keyboard {
117                physical_layout: PhysicalLayout::KeyboardUs,
118                logical_layout: LogicalLayout::KeyboardUsInt
119            })
120        )
121    }
122}