mirror of
https://github.com/qmk/qmk_firmware.git
synced 2024-11-22 03:19:24 +00:00
suspend: suppress wake up keypress
Waking the host from suspend is done by pressing any key on the keyboard, the regular key codes assigned to the keys are not important and must not be sent - otherwise they usually end up in password prompts as ghost characters that have to be deleted again. This commit adds suppression for all keys pressed at the time of wake up. Once a key is released it functions as a regular key again. Signed-off-by: Stefan Kerkmann <karlk90@pm.me>
This commit is contained in:
parent
5478051d74
commit
fe35558ec7
@ -4,6 +4,8 @@
|
||||
#include "suspend.h"
|
||||
#include "matrix.h"
|
||||
|
||||
static matrix_row_t wakeup_matrix[MATRIX_ROWS];
|
||||
|
||||
// TODO: Move to more correct location
|
||||
__attribute__((weak)) void matrix_power_up(void) {}
|
||||
__attribute__((weak)) void matrix_power_down(void) {}
|
||||
@ -44,8 +46,22 @@ bool suspend_wakeup_condition(void) {
|
||||
matrix_power_up();
|
||||
matrix_scan();
|
||||
matrix_power_down();
|
||||
|
||||
bool wakeup = false;
|
||||
for (uint8_t r = 0; r < MATRIX_ROWS; r++) {
|
||||
if (matrix_get_row(r)) return true;
|
||||
wakeup_matrix[r] = matrix_get_row(r);
|
||||
wakeup |= wakeup_matrix[r] != 0;
|
||||
}
|
||||
|
||||
return wakeup;
|
||||
}
|
||||
|
||||
bool keypress_is_wakeup_key(uint8_t row, uint8_t col) {
|
||||
return (wakeup_matrix[row] & ((matrix_row_t)1 << col));
|
||||
}
|
||||
|
||||
void wakeup_matrix_handle_key_event(uint8_t row, uint8_t col, bool pressed) {
|
||||
if (!pressed) {
|
||||
wakeup_matrix[row] &= ~((matrix_row_t)1 << col);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -14,6 +14,9 @@ void suspend_power_down_user(void);
|
||||
void suspend_power_down_kb(void);
|
||||
void suspend_power_down_quantum(void);
|
||||
|
||||
bool keypress_is_wakeup_key(uint8_t row, uint8_t col);
|
||||
void wakeup_matrix_handle_key_event(uint8_t row, uint8_t col, bool pressed);
|
||||
|
||||
#ifndef USB_SUSPEND_WAKEUP_DELAY
|
||||
# define USB_SUSPEND_WAKEUP_DELAY 0
|
||||
#endif
|
||||
|
@ -32,6 +32,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#include "sendchar.h"
|
||||
#include "eeconfig.h"
|
||||
#include "action_layer.h"
|
||||
#include "suspend.h"
|
||||
#ifdef BOOTMAGIC_ENABLE
|
||||
# include "bootmagic.h"
|
||||
#endif
|
||||
@ -505,6 +506,7 @@ void switch_events(uint8_t row, uint8_t col, bool pressed) {
|
||||
#if defined(RGB_MATRIX_ENABLE)
|
||||
rgb_matrix_handle_key_event(row, col, pressed);
|
||||
#endif
|
||||
wakeup_matrix_handle_key_event(row, col, pressed);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -568,7 +570,7 @@ static bool matrix_task(void) {
|
||||
if (row_changes & col_mask) {
|
||||
const bool key_pressed = current_row & col_mask;
|
||||
|
||||
if (process_keypress) {
|
||||
if (process_keypress && !keypress_is_wakeup_key(row, col)) {
|
||||
action_exec(MAKE_KEYEVENT(row, col, key_pressed));
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user