diff options
| author | tmk <[email protected]> | 2015-04-10 01:32:04 +0900 | 
|---|---|---|
| committer | tmk <[email protected]> | 2015-04-10 01:32:04 +0900 | 
| commit | 1a02ebcc612e9a9c0d87e02295c7258de3a70ccc (patch) | |
| tree | e517f3c70bb2d542797e57d13e9023c84af230fb /tmk_core/common/keymap.c | |
| parent | 6746e37088ce8ba03529c1226bd216705edb2b1f (diff) | |
| parent | a074364c3731d66b56d988c8a6c960a83ea0e0a1 (diff) | |
| download | qmk_firmware-1a02ebcc612e9a9c0d87e02295c7258de3a70ccc.tar.gz qmk_firmware-1a02ebcc612e9a9c0d87e02295c7258de3a70ccc.zip | |
Merge commit 'a074364c3731d66b56d988c8a6c960a83ea0e0a1' as 'tmk_core'
Diffstat (limited to 'tmk_core/common/keymap.c')
| -rw-r--r-- | tmk_core/common/keymap.c | 185 | 
1 files changed, 185 insertions, 0 deletions
| diff --git a/tmk_core/common/keymap.c b/tmk_core/common/keymap.c new file mode 100644 index 0000000000..4c0b61b8c1 --- /dev/null +++ b/tmk_core/common/keymap.c @@ -0,0 +1,185 @@ +/* +Copyright 2013 Jun Wako <[email protected]> + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program.  If not, see <http://www.gnu.org/licenses/>. +*/ +#include "keymap.h" +#include "report.h" +#include "keycode.h" +#include "action_layer.h" +#include "action.h" +#include "action_macro.h" +#include "debug.h" + + +static action_t keycode_to_action(uint8_t keycode); + + +/* converts key to action */ +action_t action_for_key(uint8_t layer, keypos_t key) +{ +    uint8_t keycode = keymap_key_to_keycode(layer, key); +    switch (keycode) { +        case KC_FN0 ... KC_FN31: +            return keymap_fn_to_action(keycode); +#ifdef BOOTMAGIC_ENABLE +        case KC_CAPSLOCK: +        case KC_LOCKING_CAPS: +            if (keymap_config.swap_control_capslock || keymap_config.capslock_to_control) { +                return keycode_to_action(KC_LCTL); +            } +            return keycode_to_action(keycode); +        case KC_LCTL: +            if (keymap_config.swap_control_capslock) { +                return keycode_to_action(KC_CAPSLOCK); +            } +            return keycode_to_action(KC_LCTL); +        case KC_LALT: +            if (keymap_config.swap_lalt_lgui) { +                if (keymap_config.no_gui) { +                    return keycode_to_action(ACTION_NO); +                } +                return keycode_to_action(KC_LGUI); +            } +            return keycode_to_action(KC_LALT); +        case KC_LGUI: +            if (keymap_config.swap_lalt_lgui) { +                return keycode_to_action(KC_LALT); +            } +            if (keymap_config.no_gui) { +                return keycode_to_action(ACTION_NO); +            } +            return keycode_to_action(KC_LGUI); +        case KC_RALT: +            if (keymap_config.swap_ralt_rgui) { +                if (keymap_config.no_gui) { +                    return keycode_to_action(ACTION_NO); +                } +                return keycode_to_action(KC_RGUI); +            } +            return keycode_to_action(KC_RALT); +        case KC_RGUI: +            if (keymap_config.swap_ralt_rgui) { +                return keycode_to_action(KC_RALT); +            } +            if (keymap_config.no_gui) { +                return keycode_to_action(ACTION_NO); +            } +            return keycode_to_action(KC_RGUI); +        case KC_GRAVE: +            if (keymap_config.swap_grave_esc) { +                return keycode_to_action(KC_ESC); +            } +            return keycode_to_action(KC_GRAVE); +        case KC_ESC: +            if (keymap_config.swap_grave_esc) { +                return keycode_to_action(KC_GRAVE); +            } +            return keycode_to_action(KC_ESC); +        case KC_BSLASH: +            if (keymap_config.swap_backslash_backspace) { +                return keycode_to_action(KC_BSPACE); +            } +            return keycode_to_action(KC_BSLASH); +        case KC_BSPACE: +            if (keymap_config.swap_backslash_backspace) { +                return keycode_to_action(KC_BSLASH); +            } +            return keycode_to_action(KC_BSPACE); +#endif +        default: +            return keycode_to_action(keycode); +    } +} + + +/* Macro */ +__attribute__ ((weak)) +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ +    return MACRO_NONE; +} + +/* Function */ +__attribute__ ((weak)) +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) +{ +} + + + +/* translates keycode to action */ +static action_t keycode_to_action(uint8_t keycode) +{ +    action_t action; +    switch (keycode) { +        case KC_A ... KC_EXSEL: +        case KC_LCTRL ... KC_RGUI: +            action.code = ACTION_KEY(keycode); +            break; +        case KC_SYSTEM_POWER ... KC_SYSTEM_WAKE: +            action.code = ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(keycode)); +            break; +        case KC_AUDIO_MUTE ... KC_WWW_FAVORITES: +            action.code = ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(keycode)); +            break; +        case KC_MS_UP ... KC_MS_ACCEL2: +            action.code = ACTION_MOUSEKEY(keycode); +            break; +        case KC_TRNS: +            action.code = ACTION_TRANSPARENT; +            break; +        default: +            action.code = ACTION_NO; +            break; +    } +    return action; +} + + + +#ifdef USE_LEGACY_KEYMAP +/* + * Legacy keymap support + *      Consider using new keymap API instead. + */ +__attribute__ ((weak)) +uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) +{ +    return keymap_get_keycode(layer, key.row, key.col); +} + + +/* Legacy keymap support */ +__attribute__ ((weak)) +action_t keymap_fn_to_action(uint8_t keycode) +{ +    action_t action = { .code = ACTION_NO }; +    switch (keycode) { +        case KC_FN0 ... KC_FN31: +            { +                uint8_t layer = keymap_fn_layer(FN_INDEX(keycode)); +                uint8_t key = keymap_fn_keycode(FN_INDEX(keycode)); +                if (key) { +                    action.code = ACTION_LAYER_TAP_KEY(layer, key); +                } else { +                    action.code = ACTION_LAYER_MOMENTARY(layer); +                } +            } +            return action; +        default: +            return action; +    } +} +#endif | 
