]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/diverge3/keymaps/default/keymap.c
a failed attempt at hot-plugging
[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 "diverge3.h"
17 #include "action_layer.h"
18 #include "eeconfig.h"
19
20 //**************** Definitions needed for quad function to work *********************//
21 enum {
22   SE_TAP_DANCE = 0
23 };
24 //Enums used to clearly convey the state of the tap dance
25 enum {
26   SINGLE_TAP = 1,
27   SINGLE_HOLD = 2,
28   DOUBLE_TAP = 3,
29   DOUBLE_HOLD = 4,
30   DOUBLE_SINGLE_TAP = 5 //send SINGLE_TAP twice - NOT DOUBLE_TAP
31   // Add more enums here if you want for triple, quadruple, etc.
32 };
33
34 typedef struct {
35   bool is_press_action;
36   int state;
37 } tap;
38
39 int cur_dance (qk_tap_dance_state_t *state) {
40   if (state->count == 1) {
41     //If count = 1, and it has been interrupted - it doesn't matter if it is pressed or not: Send SINGLE_TAP
42     if (state->interrupted || state->pressed==0) return SINGLE_TAP;
43     else return SINGLE_HOLD;
44   }
45   //If count = 2, and it has been interrupted - assume that user is trying to type the letter associated
46   //with single tap. In example below, that means to send `xx` instead of `Escape`.
47   else if (state->count == 2) {
48     if (state->interrupted) return DOUBLE_SINGLE_TAP;
49     else if (state->pressed) return DOUBLE_HOLD;
50     else return DOUBLE_TAP;
51   }
52   else return 6; //magic number. At some point this method will expand to work for more presses
53 }
54
55 //**************** Definitions needed for quad function to work *********************//
56 // Backspace Shift TD
57 //instanalize an instance of 'tap' for the 'x' tap dance.
58 static tap se_tap_state = {
59   .is_press_action = true,
60   .state = 0
61 };
62
63 void se_finished (qk_tap_dance_state_t *state, void *user_data) {
64   se_tap_state.state = cur_dance(state);
65   switch (se_tap_state.state) {
66     case SINGLE_TAP: register_code(KC_SPC); break;
67     case SINGLE_HOLD: register_code(KC_ENT); break;
68     default: register_code(KC_SPC); unregister_code(KC_SPC); register_code(KC_SPC);
69     //Last case is for fast typing. Assuming your key is `f`:
70     //For example, when typing the word `buffer`, and you want to make sure that you send `ff` and not `Esc`.
71     //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.
72   }
73 }
74
75 void se_reset (qk_tap_dance_state_t *state, void *user_data) {
76   switch (se_tap_state.state) {
77     case SINGLE_TAP: unregister_code(KC_SPC); break;
78     case SINGLE_HOLD: unregister_code(KC_ENT); break;
79     default: unregister_code(KC_SPC);
80   }
81   se_tap_state.state = 0;
82 }
83
84 qk_tap_dance_action_t tap_dance_actions[] = {
85   [SE_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, se_finished, se_reset)
86 };
87
88 // KEYMAP
89 extern keymap_config_t keymap_config;
90
91 #define _QWERTY 0
92 #define _LOWER 1
93
94 enum custom_keycodes {
95   PAREN_MACRO = SAFE_RANGE,
96   ARROW_MACRO,
97   PSELF_MACRO
98 };
99
100 // Make layer undefined do nothing
101 #define KC_ KC_TRNS
102
103 // Macros
104 #define KC_PMAC PAREN_MACRO
105 #define KC_AMAC ARROW_MACRO
106
107 // Holds for layer
108 #define KC_DEL1 LT(_LOWER, KC_DEL)
109 #define KC_TAB1 LT(_LOWER, KC_TAB)
110
111 // Space on tap, enter on hold.
112 #define KC_SPNT TD(SE_TAP_DANCE)
113
114 #define KC_BSHT SFT_T(KC_BSPC)
115
116 // Jumps the cursor a word right or left
117 #define KC_WRDRT LCTL(KC_RIGHT)
118 #define KC_WRDLT LCTL(KC_LEFT)
119
120 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
121
122   [_QWERTY] = LAYOUT(
123   //,----+----+----+----+----+----+----|           |----+----+----+----+----+----+----|
124       ESC, 1  , 2  , 3  , 4  , 5  ,MUTE,            MPLY, 6  , 7  , 8  , 9  , 0  ,PSCR,
125   //|----+----+----+----+----+----+----|           |----+----+----+----+----+----+----|
126       GRV, Q  , W  , E  , R  , T  ,VOLD,            VOLU, Y  , U  , I  , O  , P  ,CAPS,
127   //|----+----+----+----+----+----+----|           |----+----+----+----+----+----+----|
128       TAB, A  , S  , D  , F  , G  ,PGDN,            PGUP, H  , J  , K  , L  ,SCLN,BSLS,
129   //|----+----+----+----+----+----+----|           |----+----+----+----+----+----+----|
130      LSFT, Z  , X  , C  , V  , B  ,WRDLT,          WRDRT, N  , M  ,COMM,DOT ,SLSH,QUOT,
131   //|----+----+----+----+----+----+----+----|||----+----+----+----+----+----+----+----|
132      LCTL,LGUI, APP,LALT,HOME,SPNT,DEL1,BSHT , ENT ,TAB1,BSHT,END ,DOWN, UP ,LEFT,RIGHT
133   ),
134
135   [_LOWER] = LAYOUT(
136   //,----+----+----+----+----+----+----|           |----+----+----+----+----+----+----|
137          , F1 , F2 , F3 , F4 , F5 ,F11 ,             F12, F6 , F7 , F8 , F9 ,    ,    ,
138   //|----+----+----+----+----+----+----|           |----+----+----+----+----+----+----|
139      TILD,EXLM, AT ,HASH,DLR ,PERC,    ,                ,CIRC,AMPR,ASTR,    ,    ,    ,
140   //|----+----+----+----+----+----+----|           |----+----+----+----+----+----+----|
141          ,    ,LBRC,LPRN,UNDS,LCBR,    ,                ,RCBR, EQL,RPRN,RBRC,COLN,    ,
142   //|----+----+----+----+----+----+----|           |----+----+----+----+----+----+----|
143          ,    ,    ,PMAC,MINS,AMAC,    ,                ,    ,PLUS,    ,    ,    ,    ,
144   //|----+----+----+----+----+----+----+----|||----+----+----+----+----+----+----+----|
145          ,    ,    ,    ,    ,    ,    ,     ,     ,    ,    ,    ,    ,    ,    ,
146   )
147 };
148
149 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
150     if (record->event.pressed) {
151         switch(keycode) {
152             case PAREN_MACRO:
153                 SEND_STRING("()");
154                 return false; break;
155             case ARROW_MACRO:
156                 SEND_STRING("->");
157                 return false; break;
158         }
159     }
160     return true;
161 };