]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/xd004/keymaps/system_and_media/keymap.c
[Keymap] Fix advanced keymap readme and macro function (#6342)
[qmk_firmware.git] / keyboards / xd004 / keymaps / system_and_media / keymap.c
1 #include QMK_KEYBOARD_H
2
3 #define _BASE 0    // Base layer
4 #define _SYSTEM 1  // System actions
5 #define _VOLUME 2  // Volume actions
6
7 #define SUPER_ALT_F4_TIMER 300  // Timeout on the super alt-f4 key
8
9 /*
10     The idea of this is pretty simple: base layer has four action, two of which (the outermost)
11     are regular keystrokes on tap, and a momentary layer switch on hold, sending you to layers 1 and 2.
12
13     The other bit of customization here is the 'Super Alt F4' which does Alt-F4, and then Enter if tapped
14     again SUPER_ALT_F4_TIMER miliseconds after. This lets you Alt-F4 applications, and finally quickly
15     double-tap it to Alt-F4+Enter to shut down the PC.
16 */
17
18 bool is_alt_f4_active = false;
19 uint16_t alt_f4_timer = 0;
20
21 enum custom_keycodes {  // Make sure have the awesome keycode ready
22     SUPER_ALT_F4 = SAFE_RANGE,
23 };
24
25 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
26
27     // 0: Base Layer
28     [_BASE] = LAYOUT_all(LT(_SYSTEM, KC_F5), C(G(KC_LEFT)), C(G(KC_RIGHT)), LT(_VOLUME, KC_F7)),
29
30     // 1: System actions
31     [_SYSTEM] = LAYOUT_all(_______, SUPER_ALT_F4, G(KC_D), G(KC_L)),
32
33     // 2: Volume actions
34     [_VOLUME] = LAYOUT_all(KC_MEDIA_NEXT_TRACK, KC_AUDIO_VOL_DOWN, KC_AUDIO_VOL_UP, _______),
35
36 };
37
38 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
39     switch (keycode) {  // This will do most of the grunt work with the keycodes.
40         case SUPER_ALT_F4:
41             if (record->event.pressed) {
42                 if (!is_alt_f4_active) {
43                     is_alt_f4_active = true;
44                     tap_code16(LALT(KC_F4));  // Alt-F4
45                 } else {
46                     tap_code(KC_ENTER);  // Tap enter
47                 }
48             }
49             alt_f4_timer = timer_read();
50             break;
51     }
52     return true;
53 }
54
55 void matrix_scan_user(void) {
56     if (is_alt_f4_active && timer_elapsed(alt_f4_timer) > SUPER_ALT_F4_TIMER) {
57         is_alt_f4_active = false;
58     }
59 };