+static action_t keycode_to_action(uint8_t keycode);
+
+#ifdef USE_KEYMAP_V2
+/* converts key to action */
+action_t action_for_key(uint8_t layer, key_t key)
+{
+ uint8_t keycode = keymap_key_to_keycode(layer, key);
+ switch (keycode) {
+ case KC_FN0 ... KC_FN31:
+ return keymap_fn_to_action(keycode);
+ default:
+ return keycode_to_action(keycode);
+ }
+}
+
+__attribute__ ((weak))
+void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+}
+#else
+/*
+ * legacy keymap support
+ */
+/* translation for legacy keymap */
+action_t action_for_key(uint8_t layer, key_t key)
+{
+ /* convert from legacy keycode to action */
+ /* layer 16-31 indicate 'overlay' but not supported in legacy keymap */
+ uint8_t keycode = keymap_get_keycode((layer & OVERLAY_MASK), key.row, key.col);
+ action_t action;
+ 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_KEYMAP_TAP_KEY(layer, key);
+ } else {
+ action.code = ACTION_KEYMAP_MOMENTARY(layer);
+ }
+ }
+ return action;
+ default:
+ return keycode_to_action(keycode);
+ }
+}
+/* not used for legacy keymap */
+void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+}
+#endif
+
+
+
+/* translates keycode to action */
+static action_t keycode_to_action(uint8_t keycode)