summaryrefslogtreecommitdiff
path: root/users/gourdo1/custom_double_taps.h
blob: fe97b8cd1f95689d9d2b6bcd98ea464d64361eea (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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// 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;
}

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

    if (keycode == KC_LSFT) {
        if (user_config.double_tap_shift_for_capslock) {
          if (!keymap_config.no_gui) {
            if (record->event.pressed) {
                if (tapped && !timer_expired(record->event.time, tap_timer)) {
                  // The key was double tapped.
                  //clear_mods();  // If needed, clear the mods.
                  // Do something interesting...
                  register_code(KC_CAPS);
                }
                tapped = true;
                tap_timer = record->event.time + TAPPING_TERM;
            } else {
                unregister_code(KC_CAPS);
            }
          }
        }
    } else {
            // On an event with any other key, reset the double tap state.
            tapped = false;
    }
    return true;
}