]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/diverge3/keymaps/default/keymap.c
Merge branch 'master' of github.com:qmk/qmk_firmware into hf/shinydox
[qmk_firmware.git] / keyboards / diverge3 / keymaps / default / keymap.c
1 /* Copyright 2017 IslandMan93
2  *
3  * This program is free software: you can redistribute it and/or modify
4  * it under the terms of the GNU General Public License as published by
5  * the Free Software Foundation, either version 2 of the License, or
6  * (at your option) any later version.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
15  */
16 #include QMK_KEYBOARD_H
17
18 //**************** Definitions needed for quad function to work *********************//
19 enum {
20   SE_TAP_DANCE = 0
21 };
22 //Enums used to clearly convey the state of the tap dance
23 enum {
24   SINGLE_TAP = 1,
25   SINGLE_HOLD = 2,
26   DOUBLE_TAP = 3,
27   DOUBLE_HOLD = 4,
28   DOUBLE_SINGLE_TAP = 5 //send SINGLE_TAP twice - NOT DOUBLE_TAP
29   // Add more enums here if you want for triple, quadruple, etc.
30 };
31
32 typedef struct {
33   bool is_press_action;
34   int state;
35 } tap;
36
37 int cur_dance (qk_tap_dance_state_t *state) {
38   if (state->count == 1) {
39     //If count = 1, and it has been interrupted - it doesn't matter if it is pressed or not: Send SINGLE_TAP
40     if (state->interrupted || state->pressed==0) return SINGLE_TAP;
41     else return SINGLE_HOLD;
42   }
43   //If count = 2, and it has been interrupted - assume that user is trying to type the letter associated
44   //with single tap. In example below, that means to send `xx` instead of `Escape`.
45   else if (state->count == 2) {
46     if (state->interrupted) return DOUBLE_SINGLE_TAP;
47     else if (state->pressed) return DOUBLE_HOLD;
48     else return DOUBLE_TAP;
49   }
50   else return 6; //magic number. At some point this method will expand to work for more presses
51 }
52
53 //**************** Definitions needed for quad function to work *********************//
54 // Backspace Shift TD
55 //instanalize an instance of 'tap' for the 'x' tap dance.
56 static tap se_tap_state = {
57   .is_press_action = true,
58   .state = 0
59 };
60
61 void se_finished (qk_tap_dance_state_t *state, void *user_data) {
62   se_tap_state.state = cur_dance(state);
63   switch (se_tap_state.state) {
64     case SINGLE_TAP: register_code(KC_SPC); break;
65     case SINGLE_HOLD: register_code(KC_ENT); break;
66     default: register_code(KC_SPC); unregister_code(KC_SPC); register_code(KC_SPC);
67     //Last case is for fast typing. Assuming your key is `f`:
68     //For example, when typing the word `buffer`, and you want to make sure that you send `ff` and not `Esc`.
69     //In order to type `ff` when typing fast, the next character will have to be hit within the `TAPPING_TERM`, which by default is 200ms.
70   }
71 }
72
73 void se_reset (qk_tap_dance_state_t *state, void *user_data) {
74   switch (se_tap_state.state) {
75     case SINGLE_TAP: unregister_code(KC_SPC); break;
76     case SINGLE_HOLD: unregister_code(KC_ENT); break;
77     default: unregister_code(KC_SPC);
78   }
79   se_tap_state.state = 0;
80 }
81
82 qk_tap_dance_action_t tap_dance_actions[] = {
83   [SE_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, se_finished, se_reset)
84 };
85
86 // KEYMAP
87 extern keymap_config_t keymap_config;
88
89 #define _QWERTY 0
90 #define _LOWER 1
91
92 enum custom_keycodes {
93   PAREN_MACRO = SAFE_RANGE,
94   ARROW_MACRO,
95   PSELF_MACRO
96 };
97
98 // Make layer undefined do nothing
99 #define _______ KC_TRNS
100
101 // Macros
102 #define KC_PMAC PAREN_MACRO
103 #define KC_AMAC ARROW_MACRO
104
105 // Holds for layer
106 #define KC_DEL1 LT(_LOWER, KC_DEL)
107 #define KC_TAB1 LT(_LOWER, KC_TAB)
108
109 // Space on tap, enter on hold.
110 #define KC_SPNT TD(SE_TAP_DANCE)
111
112 #define KC_BSHT SFT_T(KC_BSPC)
113
114 // Jumps the cursor a word right or left
115 #define KC_WRDRT LCTL(KC_RIGHT)
116 #define KC_WRDLT LCTL(KC_LEFT)
117
118 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
119
120   [_QWERTY] = LAYOUT(
121     KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_MUTE,                   KC_MPLY,  KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_PSCR,
122     KC_GRV,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_VOLD,                   KC_VOLU,  KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_CAPS,
123     KC_TAB,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_PGDN,                   KC_PGUP,  KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_BSLS,
124     KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_WRDLT,                  KC_WRDRT, KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_QUOT,
125     KC_LCTL, KC_LGUI, KC_APP,  KC_LALT, KC_HOME, KC_SPNT, KC_DEL1,  KC_BSHT, KC_ENT, KC_TAB1,  KC_BSHT, KC_END,  KC_DOWN, KC_UP,   KC_LEFT, KC_RIGHT
126   ),
127
128   [_LOWER] = LAYOUT(
129     _______, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F11,                    KC_F12,  KC_F6,   KC_F7,   KC_F8,   KC_F9,   _______, _______,
130     KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, _______,                   _______, KC_CIRC, KC_AMPR, KC_ASTR, _______, _______, _______,
131     _______, _______, KC_LBRC, KC_LPRN, KC_UNDS, KC_LCBR, _______,                   _______, KC_RCBR, KC_EQL,  KC_RPRN, KC_RBRC, KC_COLN, _______,
132     _______, _______, _______, KC_PMAC, KC_MINS, KC_AMAC, _______,                   _______, _______, KC_PLUS, _______, _______, _______, _______,
133     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
134   )
135
136 };
137
138 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
139     if (record->event.pressed) {
140         switch(keycode) {
141             case PAREN_MACRO:
142                 SEND_STRING("()");
143                 return false; break;
144             case ARROW_MACRO:
145                 SEND_STRING("->");
146                 return false; break;
147         }
148     }
149     return true;
150 };