aboutsummaryrefslogtreecommitdiff
path: root/keyboard/hhkb
diff options
context:
space:
mode:
authortmk <nobody@nowhere>2013-02-01 14:48:11 +0900
committertmk <nobody@nowhere>2013-02-01 14:48:11 +0900
commit1d7962ba8a20323dc13cc913381608e117afaeb4 (patch)
tree7f345a164f79364a3d7178be8b828d648b3e6c8a /keyboard/hhkb
parentd95463f2e0369dc0e28497bb923b3012fb09e900 (diff)
downloadqmk_firmware-1d7962ba8a20323dc13cc913381608e117afaeb4.tar.gz
qmk_firmware-1d7962ba8a20323dc13cc913381608e117afaeb4.zip
Add user defined function to action.
Diffstat (limited to 'keyboard/hhkb')
-rw-r--r--keyboard/hhkb/keymap.c163
1 files changed, 113 insertions, 50 deletions
diff --git a/keyboard/hhkb/keymap.c b/keyboard/hhkb/keymap.c
index c7e4cfc38..e11b4563a 100644
--- a/keyboard/hhkb/keymap.c
+++ b/keyboard/hhkb/keymap.c
@@ -51,23 +51,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
51} 51}
52 52
53 53
54static const uint16_t PROGMEM fn_actions[] = {
55 ACTION_LAYER_TO_DEFAULT_ON_RELEASED, // Fn0
56 ACTION_LAYER_SET_ON_PRESSED(1), // Fn1
57 ACTION_LAYER_SET_TAP_KEY(2, KC_SLASH), // Fn2
58 ACTION_LAYER_SET_TAP_KEY(3, KC_SCLN), // Fn3
59 //ACTION_LAYER_SET_ON_PRESSED(3), // Fn4
60 ACTION_FUNCTION(0x01, 0xA), // Fn4
61 ACTION_LAYER_SET_TAP_KEY(5, KC_SPC), // Fn5
62 ACTION_LMODS_TAP(MOD_BIT(KC_LCTL), KC_BSPC), // Fn6
63 ACTION_RMODS_TAP(MOD_BIT(KC_RCTL), KC_ENT), // Fn7
64
65 ACTION_LMODS_TAP(MOD_BIT(KC_LSFT), ONE_SHOT), // Fn8
66 ACTION_LAYER_SET_ON_RELEASED_TAP_TOGGLE(1), // Fn9
67 ACTION_LAYER_BIT_TAP_TOGGLE(1), // Fn10
68};
69
70
71static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 54static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
72 /* Layer 0: Default Layer 55 /* Layer 0: Default Layer
73 * ,-----------------------------------------------------------. 56 * ,-----------------------------------------------------------.
@@ -85,7 +68,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
85 KEYMAP(ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS,GRV, \ 68 KEYMAP(ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS,GRV, \
86 TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSPC, \ 69 TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSPC, \
87 FN6, A, S, D, F, G, H, J, K, L, FN3, QUOT,FN7, \ 70 FN6, A, S, D, F, G, H, J, K, L, FN3, QUOT,FN7, \
88 FN8, Z, X, C, V, B, N, M, COMM,DOT, FN2, RSFT,FN10, \ 71 FN8, Z, X, C, V, B, N, M, COMM,DOT, FN2, FN12,FN10, \
89 LGUI,LALT, FN5, RALT,FN4), 72 LGUI,LALT, FN5, RALT,FN4),
90 73
91 /* Layer 1: HHKB mode (HHKB Fn) 74 /* Layer 1: HHKB mode (HHKB Fn)
@@ -173,24 +156,127 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
173 LGUI,LALT, FN0, RALT,RGUI), 156 LGUI,LALT, FN0, RALT,RGUI),
174}; 157};
175 158
176#define KEYCODE(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)]))
177 159
178 160
179/* legacy interface */ 161/* id for user defined functions */
180uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col) { return 0; } 162enum function_id {
181uint8_t keymap_fn_layer(uint8_t fn_bits) { return 0; } 163 LSHIFT_LPAREN,
182uint8_t keymap_fn_keycode(uint8_t fn_bits) { return 0; } 164 RSHIFT_RPAREN,
165};
166
167/*
168 * Fn action definition
169 */
170static const uint16_t PROGMEM fn_actions[] = {
171 ACTION_LAYER_RETURN_DEFAULT, // FN0
172 ACTION_LAYER_SET(1), // FN1
173 ACTION_LAYER_SET_TAP_KEY(2, KC_SLASH), // FN2
174 ACTION_LAYER_SET_TAP_KEY(3, KC_SCLN), // FN3
175 ACTION_LAYER_SET(3), // FN4
176 ACTION_LAYER_SET_TAP_KEY(5, KC_SPC), // FN5
177 ACTION_LMOD_TAP_KEY(KC_LCTL, KC_BSPC), // FN6
178 ACTION_RMOD_TAP_KEY(KC_RCTL, KC_ENT), // FN7
179 ACTION_LMOD_ONESHOT(KC_LSFT), // FN8 Oneshot Shift
180 ACTION_LAYER_SET_ON_RELEASED_TAP_TOGGLE(1), // FN9
181 ACTION_LAYER_BIT_TAP_KEY(1, KC_GRV), // FN10
182 //ACTION_LAYER_BIT(1), // FN10
183 //ACTION_LAYER_BIT_TAP_TOGGLE(1), // FN10
184 ACTION_FUNCTION_TAP(LSHIFT_LPAREN), // FN11
185 ACTION_FUNCTION_TAP(RSHIFT_RPAREN), // FN12
186};
187
188/*
189 * user defined action function
190 */
191void keymap_call_function(keyrecord_t *record, uint8_t id)
192{
193 keyevent_t event = record->event;
194 uint8_t tap_count = record->tap_count;
195
196 debug("action_call_function: ");
197 if (event.pressed) debug("pressed"); else debug("released");
198 debug(" id: "); debug_hex(id);
199 debug(" tap_count: "); debug_dec(tap_count);
200 debug("\n");
183 201
202 switch (id) {
203 case LSHIFT_LPAREN:
204 // LShft + tap '('
205 if (event.pressed) {
206 if (tap_count == 0) {
207 add_mods(MOD_BIT(KC_LSHIFT));
208 } else {
209 if (waiting_buffer_has_anykey_pressed()) {
210 // ad hoc: set 0 to cancel tap
211 record->tap_count = 0;
212 add_mods(MOD_BIT(KC_LSHIFT));
213 } else {
214 // NOTE to avoid conflicting command key bind(LShift+RShift)
215 //register_code(KC_LSHIFT);
216 //register_code(KC_9);
217 host_add_mods(MOD_BIT(KC_LSHIFT));
218 host_add_key(KC_9);
219 host_send_keyboard_report();
220 }
221 }
222 } else {
223 if (tap_count == 0) {
224 del_mods(MOD_BIT(KC_LSHIFT));
225 } else {
226 //unregister_code(KC_9);
227 //unregister_code(KC_LSHIFT);
228 host_del_mods(MOD_BIT(KC_LSHIFT));
229 host_del_key(KC_9);
230 host_send_keyboard_report();
231 }
232 }
233 break;
234 case RSHIFT_RPAREN:
235 // RShift + tap ')'
236 if (event.pressed) {
237 if (tap_count == 0) {
238 add_mods(MOD_BIT(KC_RSHIFT));
239 } else {
240 if (waiting_buffer_has_anykey_pressed()) {
241 // ad hoc: set 0 to cancel tap
242 record->tap_count = 0;
243 add_mods(MOD_BIT(KC_RSHIFT));
244 } else {
245 //register_code(KC_RSHIFT);
246 //register_code(KC_0);
247 host_add_mods(MOD_BIT(KC_RSHIFT));
248 host_add_key(KC_0);
249 host_send_keyboard_report();
250 }
251 }
252 } else {
253 if (tap_count == 0) {
254 del_mods(MOD_BIT(KC_RSHIFT));
255 } else {
256 //unregister_code(KC_0);
257 //unregister_code(KC_RSHIFT);
258 host_del_mods(MOD_BIT(KC_RSHIFT));
259 host_del_key(KC_0);
260 host_send_keyboard_report();
261 }
262 }
263 break;
264 }
265}
184 266
267/* convert keycode to action */
185action_t keymap_get_action(uint8_t layer, uint8_t row, uint8_t col) { 268action_t keymap_get_action(uint8_t layer, uint8_t row, uint8_t col) {
186 /* convert from legacy keycode to action */ 269 uint8_t key = (pgm_read_byte(&keymaps[(layer)][(row)][(col)]));
187 uint8_t key = KEYCODE(layer, row, col);
188 action_t action; 270 action_t action;
189 switch (key) { 271 switch (key) {
190 case KC_A ... KC_EXSEL: 272 case KC_A ... KC_EXSEL:
273 action.code = ACTION_KEY(key);
274 break;
191 case KC_LCTRL ... KC_LGUI: 275 case KC_LCTRL ... KC_LGUI:
276 action.code = ACTION_LMOD(key);
277 break;
192 case KC_RCTRL ... KC_RGUI: 278 case KC_RCTRL ... KC_RGUI:
193 action.code = ACTION_KEY(key); 279 action.code = ACTION_RMOD(key);
194 break; 280 break;
195 case KC_SYSTEM_POWER ... KC_SYSTEM_WAKE: 281 case KC_SYSTEM_POWER ... KC_SYSTEM_WAKE:
196 action.code = ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(key)); 282 action.code = ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(key));
@@ -201,15 +287,7 @@ action_t keymap_get_action(uint8_t layer, uint8_t row, uint8_t col) {
201 case KC_MS_UP ... KC_MS_ACCEL2: 287 case KC_MS_UP ... KC_MS_ACCEL2:
202 action.code = ACTION_MOUSEKEY(key); 288 action.code = ACTION_MOUSEKEY(key);
203 break; 289 break;
204/* TODO 290 case KC_FN0 ... KC_FN31:
205 case KC_LCTRL ... KC_LGUI:
206 action.code = ACTION_LMODS(MOD_BIT(key));
207 break;
208 case KC_RCTRL ... KC_RGUI:
209 action.code = ACTION_RMODS(MOD_BIT(key)>>4);
210 break;
211*/
212 case KC_FN0 ... FN_MAX:
213 if (FN_INDEX(key) < sizeof(fn_actions) / sizeof(fn_actions[0])) { 291 if (FN_INDEX(key) < sizeof(fn_actions) / sizeof(fn_actions[0])) {
214 action.code = pgm_read_word(&fn_actions[FN_INDEX(key)]); 292 action.code = pgm_read_word(&fn_actions[FN_INDEX(key)]);
215 } else { 293 } else {
@@ -223,18 +301,3 @@ action_t keymap_get_action(uint8_t layer, uint8_t row, uint8_t col) {
223 } 301 }
224 return action; 302 return action;
225} 303}
226
227// TODO: how to define action function
228void action_call_function(keyevent_t event, uint8_t id)
229{
230 // '(' Shift+9
231 if (event.pressed) {
232 register_code(KC_LSHIFT);
233 register_code(KC_9);
234 debug("action_call_function: pressed: id: "); debug_hex(id); debug("\n");
235 } else {
236 unregister_code(KC_9);
237 unregister_code(KC_LSHIFT);
238 debug("action_call_function: released: id: "); debug_hex(id); debug("\n");
239 }
240}