Fixed GUI lock feature

This commit is contained in:
Christoffer Martinsson 2023-07-17 16:32:47 +02:00
parent abff78ad98
commit 60309e3c7a

View File

@ -164,7 +164,7 @@ fn main() -> ! {
// Create variables to track caps lock and fn mode // Create variables to track caps lock and fn mode
let mut caps_lock_active: bool = false; let mut caps_lock_active: bool = false;
let mut fn_mode: u8; let mut fn_mode: u8;
let mut gui_lock_active: bool = false; let mut gui_lock_state: u8 = 0;
let mut gui_lock_trigger_index: u8 = 0; let mut gui_lock_trigger_index: u8 = 0;
// Initialize button matrix // Initialize button matrix
@ -185,7 +185,7 @@ fn main() -> ! {
loop { loop {
if status_led_count_down.wait().is_ok() { if status_led_count_down.wait().is_ok() {
update_status_led(&mut status_led, caps_lock_active, gui_lock_active); update_status_led(&mut status_led, &caps_lock_active, &gui_lock_state);
} }
if usb_hid_report_count_down.wait().is_ok() { if usb_hid_report_count_down.wait().is_ok() {
@ -194,7 +194,7 @@ fn main() -> ! {
fn_mode = get_fn_mode(pressed_keys); fn_mode = get_fn_mode(pressed_keys);
if !caps_lock_active { if !caps_lock_active {
update_status_led(&mut status_led, caps_lock_active, gui_lock_active); update_status_led(&mut status_led, &caps_lock_active, &gui_lock_state);
} }
for (index, key) in pressed_keys.iter().enumerate() { for (index, key) in pressed_keys.iter().enumerate() {
buttons[index].pressed = *key; buttons[index].pressed = *key;
@ -203,7 +203,7 @@ fn main() -> ! {
let keyboard_report = get_keyboard_report( let keyboard_report = get_keyboard_report(
&mut buttons, &mut buttons,
fn_mode, fn_mode,
&mut gui_lock_active, &mut gui_lock_state,
&mut gui_lock_trigger_index, &mut gui_lock_trigger_index,
); );
@ -258,17 +258,17 @@ fn main() -> ! {
/// * `caps_lock_active` - Is capslock active /// * `caps_lock_active` - Is capslock active
fn update_status_led<P, SM, I>( fn update_status_led<P, SM, I>(
status_led: &mut Ws2812StatusLed<P, SM, I>, status_led: &mut Ws2812StatusLed<P, SM, I>,
caps_lock_active: bool, caps_lock_active: &bool,
gui_lock_active: bool, gui_lock_state: &u8,
) where ) where
P: PIOExt + FunctionConfig, P: PIOExt + FunctionConfig,
I: PinId, I: PinId,
Function<P>: ValidPinMode<I>, Function<P>: ValidPinMode<I>,
SM: StateMachineIndex, SM: StateMachineIndex,
{ {
if caps_lock_active { if *caps_lock_active {
status_led.update(StatusMode::Warning); status_led.update(StatusMode::Warning);
} else if gui_lock_active { } else if *gui_lock_state != 0 {
status_led.update(StatusMode::Activity); status_led.update(StatusMode::Activity);
} else { } else {
status_led.update(StatusMode::Normal); status_led.update(StatusMode::Normal);
@ -307,7 +307,7 @@ fn get_fn_mode(pressed_keys: [bool; NUMBER_OF_KEYS]) -> u8 {
fn get_keyboard_report( fn get_keyboard_report(
matrix_keys: &mut [KeyboardButton; NUMBER_OF_KEYS], matrix_keys: &mut [KeyboardButton; NUMBER_OF_KEYS],
fn_mode: u8, fn_mode: u8,
gui_lock_active: &mut bool, gui_lock_state: &mut u8,
gui_lock_trigger_index: &mut u8, gui_lock_trigger_index: &mut u8,
) -> [Keyboard; NUMBER_OF_KEYS] { ) -> [Keyboard; NUMBER_OF_KEYS] {
let mut keyboard_report: [Keyboard; NUMBER_OF_KEYS] = let mut keyboard_report: [Keyboard; NUMBER_OF_KEYS] =
@ -315,24 +315,27 @@ fn get_keyboard_report(
// Filter report based on Fn mode and pressed keys // Filter report based on Fn mode and pressed keys
for (index, key) in matrix_keys.iter_mut().enumerate() { for (index, key) in matrix_keys.iter_mut().enumerate() {
if key.pressed != key.previous_pressed && key.pressed {
key.fn_mode = fn_mode;
}
// Check if GUI lock button is pressed // Check if GUI lock button is pressed
if key.pressed != key.previous_pressed if key.pressed != key.previous_pressed
&& key.pressed && key.pressed
&& index == layout::GUI_LOCK_BUTTON[0] as usize && index as u8 == layout::GUI_LOCK_BUTTON[0]
&& !(*gui_lock_active)
&& fn_mode == layout::GUI_LOCK_BUTTON[1] && fn_mode == layout::GUI_LOCK_BUTTON[1]
&& *gui_lock_state == 0
{ {
*gui_lock_active = true; *gui_lock_state = 1;
key.previous_pressed = key.pressed;
continue;
} }
// Set fn mode for the pressed button
if key.pressed != key.previous_pressed && key.pressed {
key.fn_mode = fn_mode;
}
key.previous_pressed = key.pressed; key.previous_pressed = key.pressed;
// Skip key if defined as NoEventIndicated
if layout::MAP[key.fn_mode as usize][index] == Keyboard::NoEventIndicated {
continue;
}
/// Index of GUI key in keyboard report /// Index of GUI key in keyboard report
/// Index 36, 37, 38, 45, 46, 47 are not used by any other keys /// Index 36, 37, 38, 45, 46, 47 are not used by any other keys
const GUI_REPORT_INDEX: usize = 47; const GUI_REPORT_INDEX: usize = 47;
@ -340,15 +343,18 @@ fn get_keyboard_report(
// If GUI lock is active, set LeftGUI key to pressed // If GUI lock is active, set LeftGUI key to pressed
// when next button is pressed. Keep LeftGUI pressed // when next button is pressed. Keep LeftGUI pressed
// until next button is released // until next button is released
if *gui_lock_active && key.pressed { if *gui_lock_state == 1 && key.pressed {
*gui_lock_trigger_index = index as u8; *gui_lock_trigger_index = index as u8;
*gui_lock_state = 2;
keyboard_report[GUI_REPORT_INDEX] = Keyboard::LeftGUI; keyboard_report[GUI_REPORT_INDEX] = Keyboard::LeftGUI;
} else if *gui_lock_trigger_index as usize == index && key.pressed { } else if *gui_lock_state == 2 && *gui_lock_trigger_index == index as u8 && key.pressed {
keyboard_report[GUI_REPORT_INDEX] = Keyboard::LeftGUI; keyboard_report[GUI_REPORT_INDEX] = Keyboard::LeftGUI;
} else if *gui_lock_trigger_index as usize == index && !key.pressed { *gui_lock_state = 3;
*gui_lock_active = false; } else if *gui_lock_state == 3 && *gui_lock_trigger_index == index as u8 && !key.pressed {
*gui_lock_state = 0;
} }
// Add defined HID key to the report
if key.pressed { if key.pressed {
keyboard_report[index] = layout::MAP[key.fn_mode as usize][index]; keyboard_report[index] = layout::MAP[key.fn_mode as usize][index];
} }