summaryrefslogtreecommitdiffstats
path: root/keyboards/lily58/keymaps/paulomp90/features/custom_shift_keys.c
diff options
context:
space:
mode:
authorPaulo Pereira <paulomp90@gmail.com>2023-04-12 20:28:26 +0100
committerGitHub <noreply@github.com>2023-04-12 13:28:26 -0600
commit0382a25e3535c1067bb31faac63ac5fc82132b72 (patch)
tree1823a061cf0f75dea8850bf7f30c7b9f73a9ae83 /keyboards/lily58/keymaps/paulomp90/features/custom_shift_keys.c
parent83dcbefeedc56f6450d0dc90430f8f1003bfb726 (diff)
[Keymap] Add paulomp90 lily58 keymap (#20327)
Co-authored-by: Drashna Jaelre <drashna@live.com>
Diffstat (limited to 'keyboards/lily58/keymaps/paulomp90/features/custom_shift_keys.c')
-rw-r--r--keyboards/lily58/keymaps/paulomp90/features/custom_shift_keys.c67
1 files changed, 67 insertions, 0 deletions
diff --git a/keyboards/lily58/keymaps/paulomp90/features/custom_shift_keys.c b/keyboards/lily58/keymaps/paulomp90/features/custom_shift_keys.c
new file mode 100644
index 0000000000..f2e091c0b9
--- /dev/null
+++ b/keyboards/lily58/keymaps/paulomp90/features/custom_shift_keys.c
@@ -0,0 +1,67 @@
+/* Copyright 2023 Paulo Pereira
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "custom_shift_keys.h"
+
+bool process_custom_shift_keys(uint16_t keycode, keyrecord_t *record) {
+ static uint16_t registered_keycode = KC_NO;
+
+ // If a custom shift key is registered, then this event is either
+ // releasing it or manipulating another key at the same time. Either way,
+ // we release the currently registered key.
+ if (registered_keycode != KC_NO) {
+ unregister_code16(registered_keycode);
+ registered_keycode = KC_NO;
+ }
+
+ if (record->event.pressed) { // Press event.
+ const uint8_t mods = get_mods();
+#ifndef NO_ACTION_ONESHOT
+ if ((mods | get_weak_mods() | get_oneshot_mods()) & MOD_MASK_SHIFT) {
+#else
+ if ((mods | get_weak_mods()) & MOD_MASK_SHIFT) { // Shift is held.
+#endif // NO_ACTION_ONESHOT
+ // Continue default handling if this is a tap-hold key being held.
+ if ((IS_QK_MOD_TAP(keycode) || IS_QK_LAYER_TAP(keycode)) &&
+ record->tap.count == 0) {
+ return true;
+ }
+
+ // Search for a custom shift key whose keycode is `keycode`.
+ for (int i = 0; i < NUM_CUSTOM_SHIFT_KEYS; ++i) {
+ if (keycode == custom_shift_keys[i].keycode) {
+ registered_keycode = custom_shift_keys[i].shifted_keycode;
+ if (IS_QK_MODS(registered_keycode) && // Should key be shifted?
+ (QK_MODS_GET_MODS(registered_keycode) & MOD_LSFT) != 0) {
+ register_code16(registered_keycode); // If so, press directly.
+ } else {
+ // If not, cancel shift mods, press the key, and restore mods.
+ del_weak_mods(MOD_MASK_SHIFT);
+#ifndef NO_ACTION_ONESHOT
+ del_oneshot_mods(MOD_MASK_SHIFT);
+#endif // NO_ACTION_ONESHOT
+ unregister_mods(MOD_MASK_SHIFT);
+ register_code16(registered_keycode);
+ set_mods(mods);
+ }
+ return false;
+ }
+ }
+ }
+ }
+
+ return true; // Continue with default handling.
+}