Skip to main content

cue_sdk/
led.rs

1use cue_sdk_sys as ffi;
2
3// ---------------------------------------------------------------------------
4// LedColor
5// ---------------------------------------------------------------------------
6
7/// An LED color value that is layout-compatible with [`ffi::CorsairLedColor`].
8///
9/// The `#[repr(C)]` layout means a `&[LedColor]` slice can be passed directly
10/// to FFI functions via pointer cast — no per-element copying required.
11#[repr(C)]
12#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
13pub struct LedColor {
14    /// LED locally-unique identifier.
15    pub id: u32,
16    pub r: u8,
17    pub g: u8,
18    pub b: u8,
19    pub a: u8,
20}
21
22impl LedColor {
23    /// Create a new LED color.
24    pub fn new(id: u32, r: u8, g: u8, b: u8, a: u8) -> Self {
25        Self { id, r, g, b, a }
26    }
27
28    /// Create an opaque RGB color (alpha = 255).
29    pub fn rgb(id: u32, r: u8, g: u8, b: u8) -> Self {
30        Self::new(id, r, g, b, 255)
31    }
32}
33
34// Safety: LedColor is a plain-old-data type with the exact same layout as
35// CorsairLedColor.  These assertions prove it at compile time.
36const _: () = {
37    assert!(
38        std::mem::size_of::<LedColor>() == std::mem::size_of::<ffi::CorsairLedColor>(),
39        "LedColor size mismatch"
40    );
41    assert!(
42        std::mem::align_of::<LedColor>() == std::mem::align_of::<ffi::CorsairLedColor>(),
43        "LedColor alignment mismatch"
44    );
45};
46
47// ---------------------------------------------------------------------------
48// LedPosition
49// ---------------------------------------------------------------------------
50
51/// Position of an LED on a device, as reported by the SDK.
52#[derive(Debug, Clone, Copy)]
53pub struct LedPosition {
54    /// LED locally-unique identifier.
55    pub id: u32,
56    /// X coordinate (center).
57    pub cx: f64,
58    /// Y coordinate (center).
59    pub cy: f64,
60}
61
62impl LedPosition {
63    pub(crate) fn from_ffi(raw: &ffi::CorsairLedPosition) -> Self {
64        Self {
65            id: raw.id,
66            cx: raw.cx,
67            cy: raw.cy,
68        }
69    }
70}
71
72// ---------------------------------------------------------------------------
73// Keyboard LED constants
74// ---------------------------------------------------------------------------
75
76/// Named constants for keyboard LED LUIDs from the `CLG_Keyboard` group.
77///
78/// These correspond to `CorsairLedId_Keyboard_CLK_*` values and can be used
79/// as the `id` field in [`LedColor`].
80pub mod keyboard {
81    use cue_sdk_sys as ffi;
82
83    pub const ESCAPE: u32 = ffi::CorsairLedId_Keyboard_CLK_Escape;
84    pub const F1: u32 = ffi::CorsairLedId_Keyboard_CLK_F1;
85    pub const F2: u32 = ffi::CorsairLedId_Keyboard_CLK_F2;
86    pub const F3: u32 = ffi::CorsairLedId_Keyboard_CLK_F3;
87    pub const F4: u32 = ffi::CorsairLedId_Keyboard_CLK_F4;
88    pub const F5: u32 = ffi::CorsairLedId_Keyboard_CLK_F5;
89    pub const F6: u32 = ffi::CorsairLedId_Keyboard_CLK_F6;
90    pub const F7: u32 = ffi::CorsairLedId_Keyboard_CLK_F7;
91    pub const F8: u32 = ffi::CorsairLedId_Keyboard_CLK_F8;
92    pub const F9: u32 = ffi::CorsairLedId_Keyboard_CLK_F9;
93    pub const F10: u32 = ffi::CorsairLedId_Keyboard_CLK_F10;
94    pub const F11: u32 = ffi::CorsairLedId_Keyboard_CLK_F11;
95    pub const F12: u32 = ffi::CorsairLedId_Keyboard_CLK_F12;
96    pub const GRAVE_ACCENT: u32 = ffi::CorsairLedId_Keyboard_CLK_GraveAccentAndTilde;
97    pub const KEY_1: u32 = ffi::CorsairLedId_Keyboard_CLK_1;
98    pub const KEY_2: u32 = ffi::CorsairLedId_Keyboard_CLK_2;
99    pub const KEY_3: u32 = ffi::CorsairLedId_Keyboard_CLK_3;
100    pub const KEY_4: u32 = ffi::CorsairLedId_Keyboard_CLK_4;
101    pub const KEY_5: u32 = ffi::CorsairLedId_Keyboard_CLK_5;
102    pub const KEY_6: u32 = ffi::CorsairLedId_Keyboard_CLK_6;
103    pub const KEY_7: u32 = ffi::CorsairLedId_Keyboard_CLK_7;
104    pub const KEY_8: u32 = ffi::CorsairLedId_Keyboard_CLK_8;
105    pub const KEY_9: u32 = ffi::CorsairLedId_Keyboard_CLK_9;
106    pub const KEY_0: u32 = ffi::CorsairLedId_Keyboard_CLK_0;
107    pub const MINUS: u32 = ffi::CorsairLedId_Keyboard_CLK_MinusAndUnderscore;
108    pub const EQUALS: u32 = ffi::CorsairLedId_Keyboard_CLK_EqualsAndPlus;
109    pub const BACKSPACE: u32 = ffi::CorsairLedId_Keyboard_CLK_Backspace;
110    pub const TAB: u32 = ffi::CorsairLedId_Keyboard_CLK_Tab;
111    pub const Q: u32 = ffi::CorsairLedId_Keyboard_CLK_Q;
112    pub const W: u32 = ffi::CorsairLedId_Keyboard_CLK_W;
113    pub const E: u32 = ffi::CorsairLedId_Keyboard_CLK_E;
114    pub const R: u32 = ffi::CorsairLedId_Keyboard_CLK_R;
115    pub const T: u32 = ffi::CorsairLedId_Keyboard_CLK_T;
116    pub const Y: u32 = ffi::CorsairLedId_Keyboard_CLK_Y;
117    pub const U: u32 = ffi::CorsairLedId_Keyboard_CLK_U;
118    pub const I: u32 = ffi::CorsairLedId_Keyboard_CLK_I;
119    pub const O: u32 = ffi::CorsairLedId_Keyboard_CLK_O;
120    pub const P: u32 = ffi::CorsairLedId_Keyboard_CLK_P;
121    pub const BRACKET_LEFT: u32 = ffi::CorsairLedId_Keyboard_CLK_BracketLeft;
122    pub const BRACKET_RIGHT: u32 = ffi::CorsairLedId_Keyboard_CLK_BracketRight;
123    pub const CAPS_LOCK: u32 = ffi::CorsairLedId_Keyboard_CLK_CapsLock;
124    pub const A: u32 = ffi::CorsairLedId_Keyboard_CLK_A;
125    pub const S: u32 = ffi::CorsairLedId_Keyboard_CLK_S;
126    pub const D: u32 = ffi::CorsairLedId_Keyboard_CLK_D;
127    pub const F: u32 = ffi::CorsairLedId_Keyboard_CLK_F;
128    pub const G: u32 = ffi::CorsairLedId_Keyboard_CLK_G;
129    pub const H: u32 = ffi::CorsairLedId_Keyboard_CLK_H;
130    pub const J: u32 = ffi::CorsairLedId_Keyboard_CLK_J;
131    pub const K: u32 = ffi::CorsairLedId_Keyboard_CLK_K;
132    pub const L: u32 = ffi::CorsairLedId_Keyboard_CLK_L;
133    pub const SEMICOLON: u32 = ffi::CorsairLedId_Keyboard_CLK_SemicolonAndColon;
134    pub const APOSTROPHE: u32 = ffi::CorsairLedId_Keyboard_CLK_ApostropheAndDoubleQuote;
135    pub const BACKSLASH: u32 = ffi::CorsairLedId_Keyboard_CLK_Backslash;
136    pub const ENTER: u32 = ffi::CorsairLedId_Keyboard_CLK_Enter;
137    pub const LEFT_SHIFT: u32 = ffi::CorsairLedId_Keyboard_CLK_LeftShift;
138    pub const NON_US_BACKSLASH: u32 = ffi::CorsairLedId_Keyboard_CLK_NonUsBackslash;
139    pub const Z: u32 = ffi::CorsairLedId_Keyboard_CLK_Z;
140    pub const X: u32 = ffi::CorsairLedId_Keyboard_CLK_X;
141    pub const C: u32 = ffi::CorsairLedId_Keyboard_CLK_C;
142    pub const V: u32 = ffi::CorsairLedId_Keyboard_CLK_V;
143    pub const B: u32 = ffi::CorsairLedId_Keyboard_CLK_B;
144    pub const N: u32 = ffi::CorsairLedId_Keyboard_CLK_N;
145    pub const M: u32 = ffi::CorsairLedId_Keyboard_CLK_M;
146    pub const COMMA: u32 = ffi::CorsairLedId_Keyboard_CLK_CommaAndLessThan;
147    pub const PERIOD: u32 = ffi::CorsairLedId_Keyboard_CLK_PeriodAndBiggerThan;
148    pub const SLASH: u32 = ffi::CorsairLedId_Keyboard_CLK_SlashAndQuestionMark;
149    pub const RIGHT_SHIFT: u32 = ffi::CorsairLedId_Keyboard_CLK_RightShift;
150    pub const LEFT_CTRL: u32 = ffi::CorsairLedId_Keyboard_CLK_LeftCtrl;
151    pub const LEFT_GUI: u32 = ffi::CorsairLedId_Keyboard_CLK_LeftGui;
152    pub const LEFT_ALT: u32 = ffi::CorsairLedId_Keyboard_CLK_LeftAlt;
153    pub const SPACE: u32 = ffi::CorsairLedId_Keyboard_CLK_Space;
154    pub const RIGHT_ALT: u32 = ffi::CorsairLedId_Keyboard_CLK_RightAlt;
155    pub const RIGHT_GUI: u32 = ffi::CorsairLedId_Keyboard_CLK_RightGui;
156    pub const APPLICATION: u32 = ffi::CorsairLedId_Keyboard_CLK_Application;
157    pub const RIGHT_CTRL: u32 = ffi::CorsairLedId_Keyboard_CLK_RightCtrl;
158    pub const LED_PROGRAMMING: u32 = ffi::CorsairLedId_Keyboard_CLK_LedProgramming;
159    pub const LANG1: u32 = ffi::CorsairLedId_Keyboard_CLK_Lang1;
160    pub const LANG2: u32 = ffi::CorsairLedId_Keyboard_CLK_Lang2;
161    pub const INTERNATIONAL1: u32 = ffi::CorsairLedId_Keyboard_CLK_International1;
162    pub const INTERNATIONAL2: u32 = ffi::CorsairLedId_Keyboard_CLK_International2;
163    pub const INTERNATIONAL3: u32 = ffi::CorsairLedId_Keyboard_CLK_International3;
164    pub const INTERNATIONAL4: u32 = ffi::CorsairLedId_Keyboard_CLK_International4;
165    pub const INTERNATIONAL5: u32 = ffi::CorsairLedId_Keyboard_CLK_International5;
166    pub const PRINT_SCREEN: u32 = ffi::CorsairLedId_Keyboard_CLK_PrintScreen;
167    pub const SCROLL_LOCK: u32 = ffi::CorsairLedId_Keyboard_CLK_ScrollLock;
168    pub const PAUSE_BREAK: u32 = ffi::CorsairLedId_Keyboard_CLK_PauseBreak;
169    pub const INSERT: u32 = ffi::CorsairLedId_Keyboard_CLK_Insert;
170    pub const HOME: u32 = ffi::CorsairLedId_Keyboard_CLK_Home;
171    pub const PAGE_UP: u32 = ffi::CorsairLedId_Keyboard_CLK_PageUp;
172    pub const DELETE: u32 = ffi::CorsairLedId_Keyboard_CLK_Delete;
173    pub const END: u32 = ffi::CorsairLedId_Keyboard_CLK_End;
174    pub const PAGE_DOWN: u32 = ffi::CorsairLedId_Keyboard_CLK_PageDown;
175    pub const UP_ARROW: u32 = ffi::CorsairLedId_Keyboard_CLK_UpArrow;
176    pub const LEFT_ARROW: u32 = ffi::CorsairLedId_Keyboard_CLK_LeftArrow;
177    pub const DOWN_ARROW: u32 = ffi::CorsairLedId_Keyboard_CLK_DownArrow;
178    pub const RIGHT_ARROW: u32 = ffi::CorsairLedId_Keyboard_CLK_RightArrow;
179    pub const NON_US_TILDE: u32 = ffi::CorsairLedId_Keyboard_CLK_NonUsTilde;
180    pub const BRIGHTNESS: u32 = ffi::CorsairLedId_Keyboard_CLK_Brightness;
181    pub const WIN_LOCK: u32 = ffi::CorsairLedId_Keyboard_CLK_WinLock;
182    pub const MUTE: u32 = ffi::CorsairLedId_Keyboard_CLK_Mute;
183    pub const STOP: u32 = ffi::CorsairLedId_Keyboard_CLK_Stop;
184    pub const SCAN_PREVIOUS_TRACK: u32 = ffi::CorsairLedId_Keyboard_CLK_ScanPreviousTrack;
185    pub const PLAY_PAUSE: u32 = ffi::CorsairLedId_Keyboard_CLK_PlayPause;
186    pub const SCAN_NEXT_TRACK: u32 = ffi::CorsairLedId_Keyboard_CLK_ScanNextTrack;
187    pub const NUM_LOCK: u32 = ffi::CorsairLedId_Keyboard_CLK_NumLock;
188    pub const KEYPAD_SLASH: u32 = ffi::CorsairLedId_Keyboard_CLK_KeypadSlash;
189    pub const KEYPAD_ASTERISK: u32 = ffi::CorsairLedId_Keyboard_CLK_KeypadAsterisk;
190    pub const KEYPAD_MINUS: u32 = ffi::CorsairLedId_Keyboard_CLK_KeypadMinus;
191    pub const KEYPAD_7: u32 = ffi::CorsairLedId_Keyboard_CLK_Keypad7;
192    pub const KEYPAD_8: u32 = ffi::CorsairLedId_Keyboard_CLK_Keypad8;
193    pub const KEYPAD_9: u32 = ffi::CorsairLedId_Keyboard_CLK_Keypad9;
194    pub const KEYPAD_PLUS: u32 = ffi::CorsairLedId_Keyboard_CLK_KeypadPlus;
195    pub const KEYPAD_4: u32 = ffi::CorsairLedId_Keyboard_CLK_Keypad4;
196    pub const KEYPAD_5: u32 = ffi::CorsairLedId_Keyboard_CLK_Keypad5;
197    pub const KEYPAD_6: u32 = ffi::CorsairLedId_Keyboard_CLK_Keypad6;
198    pub const KEYPAD_1: u32 = ffi::CorsairLedId_Keyboard_CLK_Keypad1;
199    pub const KEYPAD_2: u32 = ffi::CorsairLedId_Keyboard_CLK_Keypad2;
200    pub const KEYPAD_3: u32 = ffi::CorsairLedId_Keyboard_CLK_Keypad3;
201    pub const KEYPAD_COMMA: u32 = ffi::CorsairLedId_Keyboard_CLK_KeypadComma;
202    pub const KEYPAD_ENTER: u32 = ffi::CorsairLedId_Keyboard_CLK_KeypadEnter;
203    pub const KEYPAD_0: u32 = ffi::CorsairLedId_Keyboard_CLK_Keypad0;
204    pub const KEYPAD_PERIOD_DELETE: u32 = ffi::CorsairLedId_Keyboard_CLK_KeypadPeriodAndDelete;
205    pub const VOLUME_UP: u32 = ffi::CorsairLedId_Keyboard_CLK_VolumeUp;
206    pub const VOLUME_DOWN: u32 = ffi::CorsairLedId_Keyboard_CLK_VolumeDown;
207    pub const MR: u32 = ffi::CorsairLedId_Keyboard_CLK_MR;
208    pub const M1: u32 = ffi::CorsairLedId_Keyboard_CLK_M1;
209    pub const M2: u32 = ffi::CorsairLedId_Keyboard_CLK_M2;
210    pub const M3: u32 = ffi::CorsairLedId_Keyboard_CLK_M3;
211    pub const FN: u32 = ffi::CorsairLedId_Keyboard_CLK_Fn;
212}