Parent directory

keymap_common.c

8969 bytes
  1/*
  2Copyright 2012-2017 Jun Wako <wakojun@gmail.com>
  3
  4This program is free software: you can redistribute it and/or modify
  5it under the terms of the GNU General Public License as published by
  6the Free Software Foundation, either version 2 of the License, or
  7(at your option) any later version.
  8
  9This program is distributed in the hope that it will be useful,
 10but WITHOUT ANY WARRANTY; without even the implied warranty of
 11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 12GNU General Public License for more details.
 13
 14You should have received a copy of the GNU General Public License
 15along with this program.  If not, see <http://www.gnu.org/licenses/>.
 16*/
 17
 18#include "keymap_common.h"
 19#include "keymap_introspection.h"
 20#include "report.h"
 21#include "keycode.h"
 22#include "action_layer.h"
 23#include "action.h"
 24#include "debug.h"
 25#include "keycode_config.h"
 26#include "quantum_keycodes.h"
 27
 28#ifdef ENCODER_MAP_ENABLE
 29#    include "encoder.h"
 30#endif
 31
 32#ifdef DIP_SWITCH_MAP_ENABLE
 33#    include "dip_switch.h"
 34#endif
 35
 36#ifdef BACKLIGHT_ENABLE
 37#    include "backlight.h"
 38#endif
 39
 40#ifdef MIDI_ENABLE
 41#    include "process_midi.h"
 42#endif
 43
 44extern keymap_config_t keymap_config;
 45
 46#include <inttypes.h>
 47
 48/* converts key to action */
 49action_t action_for_key(uint8_t layer, keypos_t key) {
 50    // 16bit keycodes - important
 51    uint16_t keycode = keymap_key_to_keycode(layer, key);
 52    return action_for_keycode(keycode);
 53};
 54
 55action_t action_for_keycode(uint16_t keycode) {
 56    // keycode remapping
 57    keycode = keycode_config(keycode);
 58
 59    action_t action = {};
 60    uint8_t  action_layer, mod;
 61
 62    (void)action_layer;
 63    (void)mod;
 64
 65    switch (keycode) {
 66        case BASIC_KEYCODE_RANGE:
 67        case MODIFIER_KEYCODE_RANGE:
 68            action.code = ACTION_KEY(keycode);
 69            break;
 70#ifdef EXTRAKEY_ENABLE
 71        case SYSTEM_KEYCODE_RANGE:
 72            action.code = ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(keycode));
 73            break;
 74        case CONSUMER_KEYCODE_RANGE:
 75            action.code = ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(keycode));
 76            break;
 77#endif
 78        case MOUSE_KEYCODE_RANGE:
 79            action.code = ACTION_MOUSEKEY(keycode);
 80            break;
 81        case KC_TRANSPARENT:
 82            action.code = ACTION_TRANSPARENT;
 83            break;
 84        case QK_MODS ... QK_MODS_MAX:;
 85        // Has a modifier
 86        // Split it up
 87#ifdef LEGACY_MAGIC_HANDLING
 88            action.code = ACTION_MODS_KEY(QK_MODS_GET_MODS(keycode), QK_MODS_GET_BASIC_KEYCODE(keycode)); // adds modifier to key
 89#else                                                                                                     // LEGACY_MAGIC_HANDLING
 90            action.code = ACTION_MODS_KEY(mod_config(QK_MODS_GET_MODS(keycode)), keycode_config(QK_MODS_GET_BASIC_KEYCODE(keycode))); // adds modifier to key
 91#endif                                                                                                    // LEGACY_MAGIC_HANDLING
 92            break;
 93        case QK_LAYER_TAP ... QK_LAYER_TAP_MAX:
 94#if !defined(NO_ACTION_LAYER) && !defined(NO_ACTION_TAPPING)
 95#    ifdef LEGACY_MAGIC_HANDLING
 96            action.code = ACTION_LAYER_TAP_KEY(QK_LAYER_TAP_GET_LAYER(keycode), QK_LAYER_TAP_GET_TAP_KEYCODE(keycode));
 97#    else  // LEGACY_MAGIC_HANDLING
 98            action.code = ACTION_LAYER_TAP_KEY(QK_LAYER_TAP_GET_LAYER(keycode), keycode_config(QK_LAYER_TAP_GET_TAP_KEYCODE(keycode)));
 99#    endif // LEGACY_MAGIC_HANDLING
100#else
101            // pass through keycode_config again, since it previously missed it
102            // and then only send as ACTION_KEY to bypass most of action.c handling
103            action.code = ACTION_KEY(keycode_config(QK_LAYER_TAP_GET_TAP_KEYCODE(keycode)));
104#endif
105            break;
106#ifndef NO_ACTION_LAYER
107        case QK_TO ... QK_TO_MAX:;
108            // Layer set "GOTO"
109            action_layer = QK_TO_GET_LAYER(keycode);
110            action.code  = ACTION_LAYER_GOTO(action_layer);
111            break;
112        case QK_MOMENTARY ... QK_MOMENTARY_MAX:;
113            // Momentary action_layer
114            action_layer = QK_MOMENTARY_GET_LAYER(keycode);
115            action.code  = ACTION_LAYER_MOMENTARY(action_layer);
116            break;
117        case QK_DEF_LAYER ... QK_DEF_LAYER_MAX:;
118            // Set default action_layer
119            action_layer = QK_DEF_LAYER_GET_LAYER(keycode);
120            action.code  = ACTION_DEFAULT_LAYER_SET(action_layer);
121            break;
122        case QK_TOGGLE_LAYER ... QK_TOGGLE_LAYER_MAX:;
123            // Set toggle
124            action_layer = QK_TOGGLE_LAYER_GET_LAYER(keycode);
125            action.code  = ACTION_LAYER_TOGGLE(action_layer);
126            break;
127#endif
128#ifndef NO_ACTION_ONESHOT
129        case QK_ONE_SHOT_LAYER ... QK_ONE_SHOT_LAYER_MAX:;
130            // OSL(action_layer) - One-shot action_layer
131            action_layer = QK_ONE_SHOT_LAYER_GET_LAYER(keycode);
132            action.code  = ACTION_LAYER_ONESHOT(action_layer);
133            break;
134#endif // NO_ACTION_ONESHOT
135        case QK_ONE_SHOT_MOD ... QK_ONE_SHOT_MOD_MAX:;
136            // OSM(mod) - One-shot mod
137            mod = mod_config(QK_ONE_SHOT_MOD_GET_MODS(keycode));
138#if defined(NO_ACTION_TAPPING) || defined(NO_ACTION_ONESHOT)
139            action.code = ACTION_MODS(mod);
140#else  // defined(NO_ACTION_TAPPING) || defined(NO_ACTION_ONESHOT)
141            action.code = ACTION_MODS_ONESHOT(mod);
142#endif // defined(NO_ACTION_TAPPING) || defined(NO_ACTION_ONESHOT)
143            break;
144#ifndef NO_ACTION_LAYER
145        case QK_LAYER_TAP_TOGGLE ... QK_LAYER_TAP_TOGGLE_MAX:
146#    ifndef NO_ACTION_TAPPING
147            action.code = ACTION_LAYER_TAP_TOGGLE(QK_LAYER_TAP_TOGGLE_GET_LAYER(keycode));
148#    else // NO_ACTION_TAPPING
149#        ifdef NO_ACTION_TAPPING_TAP_TOGGLE_MO
150            action.code = ACTION_LAYER_MOMENTARY(QK_LAYER_TAP_TOGGLE_GET_LAYER(keycode));
151#        else  // NO_ACTION_TAPPING_TAP_TOGGLE_MO
152            action.code = ACTION_LAYER_TOGGLE(QK_LAYER_TAP_TOGGLE_GET_LAYER(keycode));
153#        endif // NO_ACTION_TAPPING_TAP_TOGGLE_MO
154#    endif     // NO_ACTION_TAPPING
155            break;
156        case QK_LAYER_MOD ... QK_LAYER_MOD_MAX:
157            mod          = mod_config(QK_LAYER_MOD_GET_MODS(keycode));
158            action_layer = QK_LAYER_MOD_GET_LAYER(keycode);
159            action.code  = ACTION_LAYER_MODS(action_layer, (mod & 0x10) ? mod << 4 : mod);
160            break;
161#endif // NO_ACTION_LAYER
162        case QK_MOD_TAP ... QK_MOD_TAP_MAX:
163#ifndef NO_ACTION_TAPPING
164            mod = mod_config(QK_MOD_TAP_GET_MODS(keycode));
165#    ifdef LEGACY_MAGIC_HANDLING
166            action.code = ACTION_MODS_TAP_KEY(mod, QK_MOD_TAP_GET_TAP_KEYCODE(keycode));
167#    else  // LEGACY_MAGIC_HANDLING
168            action.code = ACTION_MODS_TAP_KEY(mod, keycode_config(QK_MOD_TAP_GET_TAP_KEYCODE(keycode)));
169#    endif // LEGACY_MAGIC_HANDLING
170#else      // NO_ACTION_TAPPING
171#    ifdef NO_ACTION_TAPPING_MODTAP_MODS
172            // pass through mod_config again, since it previously missed it
173            // and then only send as ACTION_KEY to bypass most of action.c handling
174            action.code = ACTION_MODS(mod_config(QK_MOD_TAP_GET_MODS(keycode)));
175#    else  // NO_ACTION_TAPPING_MODTAP_MODS
176           // pass through keycode_config again, since it previously missed it
177           // and then only send as ACTION_KEY to bypass most of action.c handling
178            action.code = ACTION_KEY(keycode_config(QK_MOD_TAP_GET_TAP_KEYCODE(keycode)));
179#    endif // NO_ACTION_TAPPING_MODTAP_MODS
180#endif     // NO_ACTION_TAPPING
181            break;
182#ifdef SWAP_HANDS_ENABLE
183        case QK_SWAP_HANDS ... QK_SWAP_HANDS_MAX:
184#    ifdef LEGACY_MAGIC_HANDLING
185            action.code = ACTION(ACT_SWAP_HANDS, QK_SWAP_HANDS_GET_TAP_KEYCODE(keycode));
186#    else  // LEGACY_MAGIC_HANDLING
187            action.code = ACTION(ACT_SWAP_HANDS, keycode_config(QK_SWAP_HANDS_GET_TAP_KEYCODE(keycode)));
188#    endif // LEGACY_MAGIC_HANDLING
189            break;
190#endif
191
192        default:
193            action.code = ACTION_NO;
194            break;
195    }
196    return action;
197}
198
199// translates key to keycode
200__attribute__((weak)) uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key) {
201    if (key.row < MATRIX_ROWS && key.col < MATRIX_COLS) {
202        return keycode_at_keymap_location(layer, key.row, key.col);
203    }
204#ifdef ENCODER_MAP_ENABLE
205    else if (key.row == KEYLOC_ENCODER_CW && key.col < NUM_ENCODERS) {
206        return keycode_at_encodermap_location(layer, key.col, true);
207    } else if (key.row == KEYLOC_ENCODER_CCW && key.col < NUM_ENCODERS) {
208        return keycode_at_encodermap_location(layer, key.col, false);
209    }
210#endif // ENCODER_MAP_ENABLE
211#ifdef DIP_SWITCH_MAP_ENABLE
212    else if (key.row == KEYLOC_DIP_SWITCH_ON && key.col < NUM_DIP_SWITCHES) {
213        return keycode_at_dip_switch_map_location(key.col, true);
214    } else if (key.row == KEYLOC_DIP_SWITCH_OFF && key.col < NUM_DIP_SWITCHES) {
215        return keycode_at_dip_switch_map_location(key.col, false);
216    }
217#endif // DIP_SWITCH_MAP_ENABLE
218
219    return KC_NO;
220}