1use cue_sdk_sys as ffi;
2use num_traits::FromPrimitive;
3
4#[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#[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#[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}