// 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 }