summaryrefslogtreecommitdiff
path: root/users/gourdo1/custom_double_taps.h
blob: 4f551e1fa12b3dd43c1f2e7eddc98553dcb35453 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// Copyright 2022 Google LLC
// SPDX-License-Identifier: Apache-2.0

#pragma once

#include "gourdo1.h"

static bool process_capsnum(uint16_t keycode, keyrecord_t * record) {
    static bool toggled = false;
    static bool tapped = false;
    static uint16_t tap_timer = 0;

    if (keycode == CAPSNUM) {
        if (user_config.double_tap_shift_for_capslock) {
            // Act as TT(_NUMPADMOUSE)
            if (record -> event.pressed) { // CAPSNUM key was pressed
                // Check whether the key was recently tapped
                if (tapped && !timer_expired(record -> event.time, tap_timer)) {
                    // This is a double tap (or possibly a triple tap or more)
                    // Toggle the layer on.
                    toggled = true;
                } else if (toggled) {
                    // Otherwise if currently toggled, turn it off
                    toggled = false;
                    tapped = false;
                    layer_off(_NUMPADMOUSE);
                }
                // Set that the first tap occurred in a potential double tap
                tapped = true;
                tap_timer = record -> event.time + TAPPING_TERM;
                layer_on(_NUMPADMOUSE);
            } else if (!toggled) {
                // If not currently toggled, turn off on key release
                layer_off(_NUMPADMOUSE);
                return false;
            }
        } else { // When double_tap_shift_for_capslock == false
            // Act as KC_CAPS
            if (record -> event.pressed) {
                register_code(KC_CAPS);
            } else {
                unregister_code(KC_CAPS);
            }
        }
        return false;
    } else {
        // On an event with any other key, reset the double tap state
        tapped = false;
    }
    return true;
}

static bool process_esc_to_base(uint16_t keycode, keyrecord_t * record) {
    static bool tapped = false;
    static uint16_t tap_timer = 0;

    if (keycode == KC_ESC) {
        if (user_config.esc_double_tap_to_baselyr) {
            if (record -> event.pressed) {
                if (tapped && !timer_expired(record -> event.time, tap_timer)) {
                    // The key was double tapped.
                    layer_clear();
                }
                tapped = true;
                tap_timer = record -> event.time + TAPPING_TERM;
            }
        }
    } else {
        // On an event with any other key, reset the double tap state.
        tapped = false;
    }
    return true;
}