aboutsummaryrefslogtreecommitdiffstats
path: root/keyboards/xd004/keymaps/system_and_media/keymap.c
blob: 740132639c9f603cd86cce1fcb1449505d62a412 (plain) (blame)
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
#include QMK_KEYBOARD_H

#define _BASE 0    // Base layer
#define _SYSTEM 1  // System actions
#define _VOLUME 2  // Volume actions

#define SUPER_ALT_F4_TIMER 300  // Timeout on the super alt-f4 key

/*
    The idea of this is pretty simple: base layer has four action, two of which (the outermost)
    are regular keystrokes on tap, and a momentary layer switch on hold, sending you to layers 1 and 2.

    The other bit of customization here is the 'Super Alt F4' which does Alt-F4, and then Enter if tapped
    again SUPER_ALT_F4_TIMER miliseconds after. This lets you Alt-F4 applications, and finally quickly
    double-tap it to Alt-F4+Enter to shut down the PC.
*/

bool is_alt_f4_active = false;
uint16_t alt_f4_timer = 0;

enum custom_keycodes {  // Make sure have the awesome keycode ready
    SUPER_ALT_F4 = SAFE_RANGE,
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {

    // 0: Base Layer
    [_BASE] = LAYOUT_all(LT(_SYSTEM, KC_F5), C(G(KC_LEFT)), C(G(KC_RIGHT)), LT(_VOLUME, KC_F7)),

    // 1: System actions
    [_SYSTEM] = LAYOUT_all(_______, SUPER_ALT_F4, G(KC_D), G(KC_L)),

    // 2: Volume actions
    [_VOLUME] = LAYOUT_all(KC_MEDIA_NEXT_TRACK, KC_AUDIO_VOL_DOWN, KC_AUDIO_VOL_UP, _______),

};

bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    switch (keycode) {  // This will do most of the grunt work with the keycodes.
        case SUPER_ALT_F4:
            if (record->event.pressed) {
                if (!is_alt_f4_active) {
                    is_alt_f4_active = true;
                    tap_code_16(LALT(KC_F4);  // Alt-F4
                } else {
                    tap_code(KC_ENTER);  // Tap enter
                }
            } else {
                unregister_code(KC_TAB);
            }
            alt_f4_timer = timer_read();
            break;
    }
    return true;
}

void matrix_scan_user(void) {
    if (is_alt_f4_active && timer_elapsed(alt_f4_timer) > SUPER_ALT_F4_TIMER) {
        is_alt_f4_active = false;
    }
};