2 Copyright 2013,2016 Jun Wako <wakojun@gmail.com>
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>.
20 #include "action_layer.h"
22 #include "action_macro.h"
25 #include "bootloader.h"
27 #include <avr/pgmspace.h>
30 #ifdef BOOTMAGIC_ENABLE
31 extern keymap_config_t keymap_config
;
34 static action_t
keycode_to_action(uint8_t keycode
);
37 /* converts key to action */
38 __attribute__ ((weak
))
39 action_t
action_for_key(uint8_t layer
, keypos_t key
)
41 uint8_t keycode
= keymap_key_to_keycode(layer
, key
);
43 case KC_FN0
... KC_FN31
:
44 return keymap_fn_to_action(keycode
);
45 #ifdef BOOTMAGIC_ENABLE
48 if (keymap_config
.swap_control_capslock
|| keymap_config
.capslock_to_control
) {
49 return keycode_to_action(KC_LCTL
);
51 return keycode_to_action(keycode
);
53 if (keymap_config
.swap_control_capslock
) {
54 return keycode_to_action(KC_CAPSLOCK
);
56 return keycode_to_action(KC_LCTL
);
58 if (keymap_config
.swap_lalt_lgui
) {
59 if (keymap_config
.no_gui
) {
60 return keycode_to_action(KC_NO
);
62 return keycode_to_action(KC_LGUI
);
64 return keycode_to_action(KC_LALT
);
66 if (keymap_config
.swap_lalt_lgui
) {
67 return keycode_to_action(KC_LALT
);
69 if (keymap_config
.no_gui
) {
70 return keycode_to_action(KC_NO
);
72 return keycode_to_action(KC_LGUI
);
74 if (keymap_config
.swap_ralt_rgui
) {
75 if (keymap_config
.no_gui
) {
76 return keycode_to_action(KC_NO
);
78 return keycode_to_action(KC_RGUI
);
80 return keycode_to_action(KC_RALT
);
82 if (keymap_config
.swap_ralt_rgui
) {
83 return keycode_to_action(KC_RALT
);
85 if (keymap_config
.no_gui
) {
86 return keycode_to_action(KC_NO
);
88 return keycode_to_action(KC_RGUI
);
90 if (keymap_config
.swap_grave_esc
) {
91 return keycode_to_action(KC_ESC
);
93 return keycode_to_action(KC_GRAVE
);
95 if (keymap_config
.swap_grave_esc
) {
96 return keycode_to_action(KC_GRAVE
);
98 return keycode_to_action(KC_ESC
);
100 if (keymap_config
.swap_backslash_backspace
) {
101 return keycode_to_action(KC_BSPACE
);
103 return keycode_to_action(KC_BSLASH
);
105 if (keymap_config
.swap_backslash_backspace
) {
106 return keycode_to_action(KC_BSLASH
);
108 return keycode_to_action(KC_BSPACE
);
111 return keycode_to_action(keycode
);
117 __attribute__ ((weak
))
118 const macro_t
*action_get_macro(keyrecord_t
*record
, uint8_t id
, uint8_t opt
)
127 __attribute__ ((weak
))
128 void action_function(keyrecord_t
*record
, uint8_t id
, uint8_t opt
)
137 /* translates keycode to action */
138 static action_t
keycode_to_action(uint8_t keycode
)
141 case KC_A
... KC_EXSEL
:
142 case KC_LCTRL
... KC_RGUI
:
143 return (action_t
)ACTION_KEY(keycode
);
145 case KC_SYSTEM_POWER
... KC_SYSTEM_WAKE
:
146 return (action_t
)ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(keycode
));
148 case KC_AUDIO_MUTE
... KC_WWW_FAVORITES
:
149 return (action_t
)ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(keycode
));
151 case KC_MS_UP
... KC_MS_ACCEL2
:
152 return (action_t
)ACTION_MOUSEKEY(keycode
);
155 return (action_t
)ACTION_TRANSPARENT
;
160 bootloader_jump(); // not return
163 return (action_t
)ACTION_NO
;
166 return (action_t
)ACTION_NO
;
171 #ifdef USE_LEGACY_KEYMAP
173 * Legacy keymap support
174 * Consider using new keymap API instead.
176 extern const uint8_t keymaps
[][MATRIX_ROWS
][MATRIX_COLS
];
177 extern const uint8_t fn_layer
[];
178 extern const uint8_t fn_keycode
[];
180 __attribute__ ((weak
))
181 uint8_t keymap_get_keycode(uint8_t layer
, uint8_t row
, uint8_t col
)
183 return pgm_read_byte(&keymaps
[(layer
)][(row
)][(col
)]);
186 __attribute__ ((weak
))
187 uint8_t keymap_fn_layer(uint8_t index
)
189 return pgm_read_byte(&fn_layer
[index
]);
192 __attribute__ ((weak
))
193 uint8_t keymap_fn_keycode(uint8_t index
)
195 return pgm_read_byte(&fn_keycode
[index
]);
198 __attribute__ ((weak
))
199 uint8_t keymap_key_to_keycode(uint8_t layer
, keypos_t key
)
201 return keymap_get_keycode(layer
, key
.row
, key
.col
);
205 /* Legacy keymap support */
206 __attribute__ ((weak
))
207 action_t
keymap_fn_to_action(uint8_t keycode
)
210 case KC_FN0
... KC_FN31
:
212 uint8_t layer
= keymap_fn_layer(FN_INDEX(keycode
));
213 uint8_t key
= keymap_fn_keycode(FN_INDEX(keycode
));
215 return (action_t
)ACTION_LAYER_TAP_KEY(layer
, key
);
217 return (action_t
)ACTION_LAYER_MOMENTARY(layer
);
220 return (action_t
)ACTION_NO
;
222 return (action_t
)ACTION_NO
;
228 /* user keymaps should be defined somewhere */
229 extern const uint8_t keymaps
[][MATRIX_ROWS
][MATRIX_COLS
];
230 extern const action_t fn_actions
[];
232 __attribute__ ((weak
))
233 uint8_t keymap_key_to_keycode(uint8_t layer
, keypos_t key
)
236 return pgm_read_byte(&keymaps
[(layer
)][(key
.row
)][(key
.col
)]);
238 return keymaps
[(layer
)][(key
.row
)][(key
.col
)];
242 __attribute__ ((weak
))
243 action_t
keymap_fn_to_action(uint8_t keycode
)
246 return (action_t
)pgm_read_word(&fn_actions
[FN_INDEX(keycode
)]);
248 return fn_actions
[FN_INDEX(keycode
)];