2 Copyright 2012,2013 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/>.
21 #include "action_layer.h"
22 #include <util/delay.h>
24 #include "action_macro.h"
26 #include "backlight.h"
30 #include "keymap_midi.h"
33 extern keymap_config_t keymap_config
;
38 /* converts key to action */
39 action_t
action_for_key(uint8_t layer
, keypos_t key
)
41 // 16bit keycodes - important
42 uint16_t keycode
= keymap_key_to_keycode(layer
, key
);
45 keycode
= keycode_config(keycode
);
48 uint8_t action_layer
, when
, mod
;
51 case KC_FN0
... KC_FN31
:
52 action
.code
= pgm_read_word(&fn_actions
[FN_INDEX(keycode
)]);
54 case KC_A
... KC_EXSEL
:
55 case KC_LCTRL
... KC_RGUI
:
56 action
.code
= ACTION_KEY(keycode
);
58 case KC_SYSTEM_POWER
... KC_SYSTEM_WAKE
:
59 action
.code
= ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(keycode
));
61 case KC_AUDIO_MUTE
... KC_WWW_FAVORITES
:
62 action
.code
= ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(keycode
));
64 case KC_MS_UP
... KC_MS_ACCEL2
:
65 action
.code
= ACTION_MOUSEKEY(keycode
);
68 action
.code
= ACTION_TRANSPARENT
;
70 case QK_MODS
... QK_MODS_MAX
: ;
73 action
.code
= ACTION_MODS_KEY(keycode
>> 8, keycode
& 0xFF); // adds modifier to key
75 case QK_FUNCTION
... QK_FUNCTION_MAX
: ;
76 // Is a shortcut for function action_layer, pull last 12bits
77 // This means we have 4,096 FN macros at our disposal
78 action
.code
= pgm_read_word(&fn_actions
[(int)keycode
& 0xFFF]);
80 case QK_MACRO
... QK_MACRO_MAX
:
81 action
.code
= ACTION_MACRO(keycode
& 0xFF);
83 case QK_LAYER_TAP
... QK_LAYER_TAP_MAX
:
84 action
.code
= ACTION_LAYER_TAP_KEY((keycode
>> 0x8) & 0xF, keycode
& 0xFF);
86 case QK_TO
... QK_TO_MAX
: ;
88 when
= (keycode
>> 0x4) & 0x3;
89 action_layer
= keycode
& 0xF;
90 action
.code
= ACTION_LAYER_SET(action_layer
, when
);
92 case QK_MOMENTARY
... QK_MOMENTARY_MAX
: ;
93 // Momentary action_layer
94 action_layer
= keycode
& 0xFF;
95 action
.code
= ACTION_LAYER_MOMENTARY(action_layer
);
97 case QK_DEF_LAYER
... QK_DEF_LAYER_MAX
: ;
98 // Set default action_layer
99 action_layer
= keycode
& 0xFF;
100 action
.code
= ACTION_DEFAULT_LAYER_SET(action_layer
);
102 case QK_TOGGLE_LAYER
... QK_TOGGLE_LAYER_MAX
: ;
104 action_layer
= keycode
& 0xFF;
105 action
.code
= ACTION_LAYER_TOGGLE(action_layer
);
107 case QK_ONE_SHOT_LAYER
... QK_ONE_SHOT_LAYER_MAX
: ;
108 // OSL(action_layer) - One-shot action_layer
109 action_layer
= keycode
& 0xFF;
110 action
.code
= ACTION_LAYER_ONESHOT(action_layer
);
112 case QK_ONE_SHOT_MOD
... QK_ONE_SHOT_MOD_MAX
: ;
113 // OSM(mod) - One-shot mod
114 mod
= keycode
& 0xFF;
115 action
.code
= ACTION_MODS_ONESHOT(mod
);
117 case QK_MOD_TAP
... QK_MOD_TAP_MAX
:
118 action
.code
= ACTION_MODS_TAP_KEY((keycode
>> 0x8) & 0xF, keycode
& 0xFF);
120 #ifdef BACKLIGHT_ENABLE
122 action
.code
= ACTION_BACKLIGHT_LEVEL(keycode
- BL_0
);
125 action
.code
= ACTION_BACKLIGHT_DECREASE();
128 action
.code
= ACTION_BACKLIGHT_INCREASE();
131 action
.code
= ACTION_BACKLIGHT_TOGGLE();
134 action
.code
= ACTION_BACKLIGHT_STEP();
138 action
.code
= ACTION_NO
;
144 __attribute__ ((weak
))
145 const uint16_t PROGMEM fn_actions
[] = {
150 __attribute__ ((weak
))
151 const macro_t
*action_get_macro(keyrecord_t
*record
, uint8_t id
, uint8_t opt
)
157 __attribute__ ((weak
))
158 void action_function(keyrecord_t
*record
, uint8_t id
, uint8_t opt
)
162 /* translates key to keycode */
163 uint16_t keymap_key_to_keycode(uint8_t layer
, keypos_t key
)
165 // Read entire word (16bits)
166 return pgm_read_word(&keymaps
[(layer
)][(key
.row
)][(key
.col
)]);