forked from forks/qmk_firmware
7f805cc779
Co-authored-by: Wilba <wilba@wilba.tech> Co-authored-by: zvecr <git@zvecr.com>
89 lines
2.4 KiB
C
89 lines
2.4 KiB
C
// Copyright 2022 Vino Rodrigues (@vinorodrigues)
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
#include "specialk.h"
|
|
|
|
bool delkey_registered = false;
|
|
uint32_t __keycode_raised = 0;
|
|
|
|
bool get_keycode_raised(uint8_t n) {
|
|
return __keycode_raised & (1 << n);
|
|
}
|
|
|
|
void set_keycode_raised(uint8_t n, bool b) {
|
|
if (b) {
|
|
__keycode_raised |= 1 << n;
|
|
} else {
|
|
__keycode_raised &= ~(1 << n);
|
|
}
|
|
}
|
|
|
|
bool ID61_process_special_k(uint16_t keycode, keyrecord_t *record, bool arrow_mode, uint8_t k_norm, uint8_t k_spcl, uint8_t k_altr) {
|
|
bool is_raised = get_highest_layer(layer_state|default_layer_state) != 0;
|
|
|
|
if (record->event.pressed) {
|
|
set_keycode_raised(keycode - QK_KB_0, is_raised); // save for key release event
|
|
if (is_raised) {
|
|
// *** Fn keyed ***
|
|
if (arrow_mode) {
|
|
// alternate key
|
|
register_code(k_altr);
|
|
} else {
|
|
// special key
|
|
register_code(k_spcl);
|
|
}
|
|
} else {
|
|
// *** normal, un-Fn'ed ***
|
|
if (arrow_mode) {
|
|
// special key
|
|
register_code(k_spcl);
|
|
} else {
|
|
// normal key
|
|
register_code(k_norm);
|
|
}
|
|
}
|
|
} else {
|
|
if (get_keycode_raised(keycode - QK_KB_0)) {
|
|
// *** Fn keyed ***
|
|
if (arrow_mode) {
|
|
// alternate key
|
|
unregister_code(k_altr);
|
|
} else {
|
|
// special key
|
|
unregister_code(k_spcl);
|
|
}
|
|
} else {
|
|
// *** normal, un-Fn'ed ***
|
|
if (arrow_mode) {
|
|
// special key
|
|
unregister_code(k_spcl);
|
|
} else {
|
|
// normal key
|
|
unregister_code(k_norm);
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool ID61_backspace_special(uint16_t keycode, keyrecord_t *record) {
|
|
uint8_t mod_state = get_mods();
|
|
|
|
if (record->event.pressed) {
|
|
if (mod_state & MOD_MASK_SHIFT) {
|
|
del_mods(MOD_MASK_SHIFT);
|
|
register_code(KC_DEL);
|
|
delkey_registered = true;
|
|
set_mods(mod_state);
|
|
return false;
|
|
}
|
|
} else {
|
|
if (delkey_registered) {
|
|
unregister_code(KC_DEL);
|
|
delkey_registered = false;
|
|
return false;
|
|
}
|
|
}
|
|
return true; // normal backspace, pass on
|
|
}
|