~ruther/qmk_firmware

fd8628ccdc97482aae1814cec5c2059c2978daad — Ryan 4 years ago e69c325
Migrate more `fn_actions` stuff (#13502)

M keyboards/atreus/keymaps/erlandsona/keymap.c => keyboards/atreus/keymaps/erlandsona/keymap.c +2 -13
@@ 1,6 1,3 @@
// this is the style you want to emulate.
// This is the canonical layout file for the Quantum project. If you want to add another keyboard,

#include QMK_KEYBOARD_H

// Each layer gets a name for readability, which is then used in the keymap matrix below.


@@ 23,21 20,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    KC_GRV , KC_1   , KC_2   , KC_3   , KC_4   ,                   KC_LPRN, KC_RPRN, KC_MINS, KC_EQL , KC_LBRC,
    KC_TAB , KC_5   , KC_6   , KC_7   , KC_8   ,                   KC_LEFT, KC_DOWN, KC_UP  , KC_RGHT, KC_RBRC,
    _______, KC_9   , KC_0   , KC_DOT , KC_COMM,                   KC_HOME, KC_PGDN, KC_PGUP, KC_END , _______,
    _______, _______, _______, _______, KC_DEL , F(MOUS), _______, _______, _______, _______, _______, _______
    _______, _______, _______, _______, KC_DEL , TG(MOUS), _______, _______, _______, _______, _______, _______
  ),

  [MOUS] = LAYOUT( /* Mouse and Media Keys */
    KC_SLCK, KC_PAUSE, KC_F11 , KC_F10 , KC_F9  ,                   KC_F8  , KC_F7  , KC_F6  , KC_F5  , KC_F4,
    KC_VOLD, KC_ACL0 , KC_ACL1, KC_ACL2, KC_VOLU,                   KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, KC_F3,
    KC_MUTE, KC_MPRV , KC_MPLY, KC_MNXT, KC_MUTE,                   KC_WH_R, KC_WH_U, KC_WH_D, KC_WH_L, KC_F2,
    _______, _______ , _______, _______, _______, _______, _______, KC_BTN1, F(BASE), RESET  , KC_F12 , KC_F1
    _______, _______ , _______, _______, _______, _______, _______, KC_BTN1, TO(BASE), RESET  , KC_F12 , KC_F1
  ),
};


// I prefer this layer switching strategy to the TG and MO functions.
// so that I can get out of mouse mode just by tapping/holding my base layer FN key.
const uint16_t PROGMEM fn_actions[] = {
  [BASE] = ACTION_LAYER_OFF(2, 1),  // switch back to layer 0
  [MOUS] = ACTION_LAYER_ON(2, 1)  // switch to layer 2
};

M keyboards/atreus/keymaps/khitsule/keymap.c => keyboards/atreus/keymaps/khitsule/keymap.c +0 -24
@@ 16,12 16,6 @@ enum layers {
#define KM_DRIGHT LGUI(LCTL(KC_RIGHT))
#define TSKMGR LCTL(LSFT(KC_ESC))

#define tap_mod_macro(record, mod, macro) ( ((record)->event.pressed) ? \
     ( ((record)->tap.count <= 0 || (record)->tap.interrupted) ? MACRO(D(mod), END) : MACRO_NONE ) : \
     ( ((record)->tap.count > 0 && !((record)->tap.interrupted)) ? (macro) : MACRO(U(mod), END) ) )



const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  [ALPH] = LAYOUT(
    KC_Q,    KC_W,     KC_E,     KC_R,           KC_T,                                               KC_Y,              KC_U,     KC_I,     KC_O,     KC_P,


@@ 54,21 48,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    RESET,    KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,   KC_TRNS,   KC_TRNS, KC_TRNS
  )
};

const uint16_t PROGMEM fn_actions[] = {
  [1] = ACTION_MACRO_TAP(1),
  [2] = ACTION_MACRO_TAP(2)
};

const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
  switch(id) {
    case 1:
      return tap_mod_macro(record, LGUI, MACRO( D(LSFT), T(9), U(LSFT), END));
      break;
    case 2:
      return tap_mod_macro(record, LALT, MACRO( D(LSFT), T(0), U(LSFT), END));
      break;

  }
  return MACRO_NONE;
};

M keyboards/bpiphany/kitten_paw/keymaps/ickerwx/keymap.c => keyboards/bpiphany/kitten_paw/keymaps/ickerwx/keymap.c +57 -97
@@ 1,12 1,6 @@
#include QMK_KEYBOARD_H
#include "mousekey.h"

#undef C
#undef S
#define C(kc) LCTL(KC_##kc)
#define S(kc) LSFT(KC_##kc)
#define RA(kc) RALT(KC_##kc)
#define KC_SLCT KC_SELECT
#define MEDAPP LT(MEDIA, KC_APP)

uint8_t current_layer_global = 255;


@@ 21,19 15,16 @@ enum layers {
    MISC,
};

enum function_id {
    LSHFT_PAREN,
enum custom_keycodes {
    LSHFT_PAREN = SAFE_RANGE,
    RSHFT_PAREN,
    LCTRL_BRACKET,
    RCTRL_BRACKET,
    LALT_CURLY,
    RALT_CURLY,
    CTRL_CLICK
};

enum macro_id {
    GRV,
    CFLEX
    CTRL_CLICK,
    M_GRV,
    M_CFLEX
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {


@@ 42,25 33,25 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
          KC_GRV,   KC_1,   KC_2,   KC_3,   KC_4,   KC_5,   KC_6,   KC_7,   KC_8,   KC_9,   KC_0,KC_MINS, KC_EQL,KC_BSPC,    KC_INS,KC_HOME,KC_PGUP,  KC_NLCK,KC_PSLS,KC_PAST,KC_PMNS, \
          KC_TAB,   KC_Q,   KC_W,   KC_E,   KC_R,   KC_T,   KC_Y,   KC_U,   KC_I,   KC_O,   KC_P,KC_LBRC,KC_RBRC,KC_BSLS,    KC_DEL, KC_END,KC_PGDN,    KC_P7,  KC_P8,  KC_P9,KC_PPLS, \
        TT(MOUSE1), KC_A,   KC_S,   KC_D,   KC_F,   KC_G,   KC_H,   KC_J,   KC_K,   KC_L,KC_SCLN,KC_QUOT,         KC_ENT,                               KC_P4,  KC_P5,  KC_P6,         \
            F(8),KC_NUBS,   KC_Z,   KC_X,   KC_C,   KC_V,   KC_B,   KC_N,   KC_M,KC_COMM, KC_DOT,KC_SLSH,           F(9),             KC_UP,            KC_P1,  KC_P2,  KC_P3,KC_PENT, \
            F(1),KC_LGUI,   F(3),              LT(MISC,  KC_SPC),                           F(4),TT(PROG1), MEDAPP, F(2),   KC_LEFT,KC_DOWN,KC_RGHT,    KC_P0,KC_PDOT),
            LSHFT_PAREN,KC_NUBS,   KC_Z,   KC_X,   KC_C,   KC_V,   KC_B,   KC_N,   KC_M,KC_COMM, KC_DOT,KC_SLSH,           RSHFT_PAREN,             KC_UP,            KC_P1,  KC_P2,  KC_P3,KC_PENT, \
            LCTRL_BRACKET,KC_LGUI,   LALT_CURLY,              LT(MISC,  KC_SPC),                           RALT_CURLY,TT(PROG1), MEDAPP, RCTRL_BRACKET,   KC_LEFT,KC_DOWN,KC_RGHT,    KC_P0,KC_PDOT),
  /* Layer 1: Programming Layer 1, emulating US l ayout */
  [PROG1] = LAYOUT(\
          KC_ESC,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,           _______,_______,_______,                                   \
          M(GRV),_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,KC_SLSH,   S(0),_______,   _______,_______,_______,  _______,_______,_______,_______, \
         _______,_______,_______,_______,_______,_______,   KC_Z,_______,_______,_______,_______,  RA(8),  RA(9),RA(MINS),  _______,_______,_______,  _______,_______,_______,_______, \
         _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,S(COMM),S(BSLS),        _______,                             _______,_______,_______,         \
       MO(PROG2),_______,   KC_Y,_______,_______,_______,_______,_______,_______,_______,_______,   S(7),      MO(PROG2),           _______,          _______,_______,_______,_______, \
          M_GRV,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,KC_SLSH,S(KC_0),_______,   _______,_______,_______,  _______,_______,_______,_______, \
         _______,_______,_______,_______,_______,_______,   KC_Z,_______,_______,_______,_______,ALGR(KC_8),ALGR(KC_9),ALGR(KC_MINS),  _______,_______,_______,  _______,_______,_______,_______, \
         _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,S(KC_COMM),S(KC_BSLS),        _______,                             _______,_______,_______,         \
       MO(PROG2),_______,   KC_Y,_______,_______,_______,_______,_______,_______,_______,_______,   S(KC_7),      MO(PROG2),           _______,          _______,_______,_______,_______, \
         _______,_______,_______,                        _______,                        _______,_______,_______,_______,   _______,_______,_______,  _______,_______),
    /* Layer 2: programming layer 2
       all keys that are not FN keys are sent as LSFT+key on this layer
    */
  [PROG2] = LAYOUT(\
         _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,           _______,_______,_______,                                   \
        RA(RBRC),_______,  RA(Q),KC_BSLS,_______,_______,M(CFLEX),  S(6),S(RBRC),   S(8),   S(9),S(SLSH),KC_RBRC,_______,   _______,_______,_______,  _______,_______,_______,_______, \
         _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,  RA(7),  RA(0),RA(NUBS),  _______,_______,_______,  _______,_______,_______,_______, \
         _______,_______,_______,_______,_______,_______,_______,_______,_______,_______, S(DOT),   S(2),        _______,                             _______,_______,_______,         \
         _______,S(NUBS),_______,_______,_______,_______,_______,_______,_______,KC_NUBS,S(NUBS),S(MINS),        _______,           _______,          _______,_______,_______,_______, \
        ALGR(KC_RBRC),_______,  ALGR(KC_Q),KC_BSLS,_______,_______,M_CFLEX,  S(KC_6),S(KC_RBRC),   S(KC_8),S(KC_9),S(KC_SLSH),KC_RBRC,_______,   _______,_______,_______,  _______,_______,_______,_______, \
         _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,  ALGR(KC_7),ALGR(KC_0),ALGR(KC_NUBS),  _______,_______,_______,  _______,_______,_______,_______, \
         _______,_______,_______,_______,_______,_______,_______,_______,_______,_______, S(KC_DOT),   S(KC_2),        _______,                             _______,_______,_______,         \
         _______,S(KC_NUBS),_______,_______,_______,_______,_______,_______,_______,KC_NUBS,S(KC_NUBS),S(KC_MINS),        _______,           _______,          _______,_______,_______,_______, \
         _______,_______,_______,                        _______,                        _______,_______,_______,_______,   _______,_______,_______,  _______,_______),
    /* Layer 3: media layer */
  [MEDIA] = LAYOUT(\


@@ 72,11 63,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
         XXXXXXX,XXXXXXX,XXXXXXX,                        XXXXXXX,                        XXXXXXX,XXXXXXX,_______,XXXXXXX,   KC_MRWD,KC_MSTP,KC_MFFD,  XXXXXXX,XXXXXXX),
    /* Layer 4: Mouse layer */
  [MOUSE1] = LAYOUT(\
            F(6),_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,           _______,_______,_______,                                   \
            TO(DEFAULT),_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,           _______,_______,_______,                                   \
         _______,KC_ACL0,KC_ACL1,KC_ACL2,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,   _______,_______,_______,  _______,_______,_______,_______, \
         _______,KC_BTN4,KC_WH_D,KC_MS_U,KC_WH_U,_______,   C(Z),_______,_______,_______,_______,_______,_______,_______,   _______,_______,_______,  _______,_______,_______,_______, \
         _______,KC_BTN5,KC_MS_L,KC_MS_D,KC_MS_R,   F(7),KC_WH_L,KC_WH_D,KC_WH_U,KC_WH_R,_______,_______,        _______,                             _______,_______,_______,         \
      MO(MOUSE2),_______,   C(Y),   C(X),   C(C),   C(V),_______,KC_BTN2,KC_BTN3,C(PGUP),C(PGDN),_______,        KC_RSFT,           _______,          _______,_______,_______,_______, \
         _______,KC_BTN4,KC_WH_D,KC_MS_U,KC_WH_U,_______,   C(KC_Z),_______,_______,_______,_______,_______,_______,_______,   _______,_______,_______,  _______,_______,_______,_______, \
         _______,KC_BTN5,KC_MS_L,KC_MS_D,KC_MS_R,   CTRL_CLICK,KC_WH_L,KC_WH_D,KC_WH_U,KC_WH_R,_______,_______,        _______,                             _______,_______,_______,         \
      MO(MOUSE2),_______,C(KC_Y),C(KC_X),C(KC_C),C(KC_V),_______,KC_BTN2,KC_BTN3,C(KC_PGUP),C(KC_PGDN),_______,        KC_RSFT,           _______,          _______,_______,_______,_______, \
         KC_LCTL,_______,KC_LALT,                        KC_BTN1,                        KC_RALT,KC_RGUI, KC_APP,KC_RCTL,   _______,_______,_______,  _______,_______),
    /* Layer 5: Mouse layer 2*/
  [MOUSE2] = LAYOUT(\


@@ 90,44 81,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  [MISC] = LAYOUT(\
         _______, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24,           _______,_______,_______,                                   \
         _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,   _______,_______,_______,  _______,_______,_______,_______, \
         _______,KC_SLCT,   C(W),  KC_UP,_______,_______,_______,_______,KC_BSPC, KC_DEL,_______,_______,_______,_______,   _______,_______,_______,  _______,_______,_______,_______, \
         _______,KC_SLCT,   C(KC_W),  KC_UP,_______,_______,_______,_______,KC_BSPC, KC_DEL,_______,_______,_______,_______,   _______,_______,_______,  _______,_______,_______,_______, \
         _______,_______,KC_LEFT,KC_DOWN,KC_RGHT,_______,KC_HOME,KC_PGDN,KC_PGUP,_______,_______,_______,        _______,                             _______,_______,_______,         \
         KC_LSFT,_______,   C(Y),   C(X),   C(C),   C(V), KC_SPC, KC_END,_______,C(PGUP),C(PGDN),_______,        _______,           _______,          _______,_______,_______,_______, \
         KC_LSFT,_______,C(KC_Y),C(KC_X),C(KC_C),C(KC_V), KC_SPC, KC_END,_______,C(KC_PGUP),C(KC_PGDN),_______,        _______,           _______,          _______,_______,_______,_______, \
         _______,_______,_______,               LT(MISC, KC_SPC),                        _______,_______,_______,_______,   _______,_______,_______,  _______,_______),
};

const uint16_t PROGMEM fn_actions[] = {
    [1] = ACTION_FUNCTION_TAP(LCTRL_BRACKET),   // tap to print [
    [2] = ACTION_FUNCTION_TAP(RCTRL_BRACKET),   // tap to print ]
    [3] = ACTION_FUNCTION_TAP(LALT_CURLY),      // tap to print {
    [4] = ACTION_FUNCTION_TAP(RALT_CURLY),      // tap to print }
    [6] = ACTION_LAYER_SET_CLEAR(DEFAULT),
    [7] = ACTION_FUNCTION_TAP(CTRL_CLICK),
    [8] = ACTION_FUNCTION_TAP(LSHFT_PAREN),     // tap to print (
    [9] = ACTION_FUNCTION_TAP(RSHFT_PAREN),     // tap to print )
};

const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
  // MACRODOWN only works in this function
      switch(id) {
        case GRV: // macro to print accent grave
            return (record->event.pressed ?
                    MACRO( D(LSFT), T(EQL), U(RALT), T(SPC), END) :
                    MACRO_NONE );
        case CFLEX: // print accent circonflex
            return (record->event.pressed ?
                    MACRO( T(GRV), T(SPC), END ) :
                    MACRO_NONE );
      }
    return MACRO_NONE;
};


void matrix_init_user(void) {

}

void matrix_scan_user(void) {
    uint8_t layer;
    layer = biton32(layer_state);


@@ 147,10 106,6 @@ void matrix_scan_user(void) {
    }
}

void led_set_user(uint8_t usb_led) {

}

void tap_helper(keyrecord_t *record, uint16_t orig_mod, uint16_t macro_mod, uint16_t macro_kc ) {
  if (record->event.pressed) {
      if (record->tap.count > 0 && !record->tap.interrupted) {


@@ 175,28 130,45 @@ void tap_helper(keyrecord_t *record, uint16_t orig_mod, uint16_t macro_mod, uint
  }
}

/* if LCTRL is tabbed, print (, or ) if RCTRL is tabbed, same for LALT/RALT and [/] */
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
    // The code is copied from keymap_hasu.c in the tmk keyboards hhkb folder
    switch (id) {
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    uint8_t layer;
    layer = biton32(layer_state);
    if (layer == PROG2) {
         if (keycode >= KC_A && keycode <= KC_EXSEL && \
             !(  // do not send LSFT + these keycodes, they are needed for emulating the US layout
                 keycode == KC_NONUS_BSLASH ||
                 keycode == KC_RBRC ||
                 keycode == KC_BSLS ||
                 keycode == KC_GRV
            )) {
              // LSFT is the modifier for this layer, so we set LSFT for every key to get the expected behavior
              if (record->event.pressed) {
                  register_mods(MOD_LSFT);
              } else {
                  unregister_mods(MOD_LSFT);
              }
         }
    }

    switch (keycode) {
        case LCTRL_BRACKET:
            tap_helper(record, KC_LCTL, KC_RALT, KC_8);
            break;
            return false;
        case RCTRL_BRACKET:
            tap_helper(record, KC_RCTL, KC_RALT, KC_9);
            break;
            return false;
        case LALT_CURLY:
            tap_helper(record, KC_LALT, KC_RALT, KC_7);
            break;
            return false;
        case RALT_CURLY:
            tap_helper(record, KC_RALT, KC_RALT, KC_0);
            break;
            return false;
        case LSHFT_PAREN:
            tap_helper(record, KC_LSFT, KC_LSFT, KC_8);
            break;
            return false;
        case RSHFT_PAREN:
            tap_helper(record, KC_RSFT, KC_LSFT, KC_9);
            break;
            return false;
        case CTRL_CLICK:
            if (record->event.pressed) {
                mousekey_clear();


@@ 212,28 184,16 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
                unregister_mods(MOD_BIT(KC_LCTL));
                send_keyboard_report();
            }
            break;
            return false;
        case M_GRV:
            tap_code16(S(KC_EQL));
            tap_code(KC_SPC);
            return false;
        case M_CFLEX:
            tap_code(KC_GRV);
            tap_code(KC_SPC);
            return false;
    }
}

bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    uint8_t layer;
    layer = biton32(layer_state);
    if (layer == PROG2) {
         if (keycode >= KC_A && keycode <= KC_EXSEL && \
             !(  // do not send LSFT + these keycodes, they are needed for emulating the US layout
                 keycode == KC_NONUS_BSLASH ||
                 keycode == KC_RBRC ||
                 keycode == KC_BSLS ||
                 keycode == KC_GRV
            )) {
              // LSFT is the modifier for this layer, so we set LSFT for every key to get the expected behavior
              if (record->event.pressed) {
                  register_mods(MOD_LSFT);
              } else {
                  unregister_mods(MOD_LSFT);
              }
         }
    }
    return true;
}

M keyboards/clueboard/66/keymaps/magicmonty/keymap.c => keyboards/clueboard/66/keymaps/magicmonty/keymap.c +13 -17
@@ 40,8 40,9 @@
// CTRL when held, ESC when tapped
#define CTL_ESC CTL_T(KC_ESC)

// Reset RGB mode to layer signalling
#define RGB_RST F(0)
enum custom_keycodes {
    RGB_RST = SAFE_RANGE
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  /* Keymap _BL: Base Layer (Default Layer) */


@@ 103,21 104,16 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
#endif
};

/* This is a list of user defined functions. F(N) corresponds to item N
   of this list.
 */
const uint16_t PROGMEM fn_actions[] = {
  [0] = ACTION_FUNCTION(0),  // Calls action_function()
};

void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
  switch (id) {
    case 0:
      if (record->event.pressed) {
        rgblight_mode(1);
        rgblight_sethsv(206, 255, 255);
      }
  }
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    switch (keycode) {
        case RGB_RST:
            if (record->event.pressed) {
                rgblight_mode(1);
                rgblight_sethsv(206, 255, 255);
            }
            return false;
    }
    return true;
}

enum layer_id {

M keyboards/clueboard/66/keymaps/tetris/keymap.c => keyboards/clueboard/66/keymaps/tetris/keymap.c +37 -89
@@ 1,9 1,6 @@
#include QMK_KEYBOARD_H
#include "tetris_text.h"

// Helpful defines
#define GRAVE_MODS  (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)|MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI)|MOD_BIT(KC_LALT)|MOD_BIT(KC_RALT))

// Each layer gets a name for readability, which is then used in the keymap matrix below.
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
// Layer names don't all need to be of the same length, obviously, and you can also skip them


@@ 12,11 9,15 @@
#define _FL 1
#define _CL 2

enum custom_keycodes {
    TETRIS_START = SAFE_RANGE
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  /* Keymap _BL: Base Layer (Default Layer)
   */
[_BL] = LAYOUT(
  F(0),    KC_1,    KC_2,   KC_3,   KC_4,   KC_5,   KC_6,   KC_7,   KC_8,   KC_9,    KC_0,     KC_MINS,  KC_EQL,   KC_GRV,  KC_BSPC,          KC_PGUP,
  KC_GESC, KC_1,    KC_2,   KC_3,   KC_4,   KC_5,   KC_6,   KC_7,   KC_8,   KC_9,    KC_0,     KC_MINS,  KC_EQL,   KC_GRV,  KC_BSPC,          KC_PGUP,
  KC_TAB,  KC_Q,    KC_W,   KC_E,   KC_R,   KC_T,   KC_Y,   KC_U,   KC_I,   KC_O,    KC_P,     KC_LBRC,  KC_RBRC,  KC_BSLS,                   KC_PGDN,
  KC_CAPS, KC_A,    KC_S,   KC_D,   KC_F,   KC_G,   KC_H,   KC_J,   KC_K,   KC_L,    KC_SCLN,  KC_QUOT,  KC_NUHS,  KC_ENT,
  KC_LSFT, KC_NUBS, KC_Z,   KC_X,   KC_C,   KC_V,   KC_B,   KC_N,   KC_M,   KC_COMM, KC_DOT,   KC_SLSH,  KC_RO,    KC_RSFT,          KC_UP,


@@ 41,71 42,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  _______, _______, _______,_______,        RGB_MOD,   RGB_MOD,                            _______,  _______,  _______,  _______, RGB_HUD,    RGB_SAD,    RGB_HUI),
};

/* This is a list of user defined functions. F(N) corresponds to item N
   of this list.
 */
const uint16_t PROGMEM fn_actions[] = {
  [0] = ACTION_FUNCTION(0),  // Calls action_function()
  [1] = ACTION_FUNCTION(1)
};

static uint8_t tetris_key_presses = 0;
static uint16_t tetris_timer = 0;
static uint8_t tetris_running = 0;
static int tetris_keypress = 0;

void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
  static uint8_t mods_pressed;
  static bool mod_flag;

  switch (id) {
    case 0:
      // clueboard specific hook to make escape quite tetris
      if (tetris_running) {
        tetris_running = 0;
        return;
      }
      
      /* Handle the combined Grave/Esc key
       */
      mods_pressed = get_mods()&GRAVE_MODS; // Check to see what mods are pressed

      if (record->event.pressed) {
        /* The key is being pressed.
         */
        if (mods_pressed) {
          mod_flag = true;
          add_key(KC_GRV);
          send_keyboard_report();
        } else {
          add_key(KC_ESC);
          send_keyboard_report();
        }
      } else {
        /* The key is being released.
         */
        if (mod_flag) {
          mod_flag = false;
          del_key(KC_GRV);
          send_keyboard_report();
        } else {
          del_key(KC_ESC);
          send_keyboard_report();
        }
      }
      break;
  case 1:
      if (record->event.pressed) {
        tetris_running = 1;
        tetris_timer = 0;
        tetris_keypress = 0;
        // set randomness using total number of key presses
        tetris_start(tetris_key_presses);
      }
      break;
  }
}

/*
 * Set up tetris
 */


@@ 130,6 71,25 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    }
  }

  switch (keycode) {
    case KC_GESC:
      // clueboard specific hook to make escape quite tetris
      if (tetris_running) {
        tetris_running = 0;
        return false;
      }
      break;
    case TETRIS_START:
      if (record->event.pressed) {
        tetris_running = 1;
        tetris_timer = 0;
        tetris_keypress = 0;
        // set randomness using total number of key presses
        tetris_start(tetris_key_presses);
      }
      return false;
  }

  return true;
}



@@ 148,57 108,45 @@ void matrix_scan_user(void) {
  }      
}

void send_keycode(uint16_t keycode) {
  register_code(keycode);
  unregister_code(keycode);
}

void send_keycode_shift(uint16_t keycode) {
  register_code(KC_LSFT);
  register_code(keycode);
  unregister_code(keycode);
  unregister_code(KC_LSFT);
}

void tetris_send_up(void) {
  send_keycode(KC_UP);
  tap_code(KC_UP);
}
void tetris_send_left(void) {
  send_keycode(KC_LEFT);
  tap_code(KC_LEFT);
}
void tetris_send_down(void) {
  send_keycode(KC_DOWN);
  tap_code(KC_DOWN);
}
void tetris_send_right(void) {
  send_keycode(KC_RGHT);
  tap_code(KC_RGHT);
}
void tetris_send_backspace(void) {
  send_keycode(KC_BSPC);
  tap_code(KC_BSPC);
}
void tetris_send_delete(void) {
  send_keycode(KC_DEL);
  tap_code(KC_DEL);
}

void tetris_send_string(const char *s) {
  for (int i = 0; s[i] != 0; i++) {
    if (s[i] >= 'a' && s[i] <= 'z') {
      send_keycode(KC_A + (s[i] - 'a'));
      tap_code(KC_A + (s[i] - 'a'));
    } else if (s[i] >= 'A' && s[i] <= 'Z') {
      send_keycode_shift(KC_A + (s[i] - 'A'));
      tap_code16(S(KC_A + (s[i] - 'A')));
    } else if (s[i] >= '1' && s[i] <= '9') {
      send_keycode(KC_1 + (s[i] - '1'));
      tap_code(KC_1 + (s[i] - '1'));
    } else {
      switch (s[i]) {
      case ' ': send_keycode(KC_SPACE); break;
      case '.': send_keycode(KC_DOT); break;
      case '0': send_keycode(KC_0); break;
      case ' ': tap_code(KC_SPACE); break;
      case '.': tap_code(KC_DOT); break;
      case '0': tap_code(KC_0); break;
      }
    }
  }
}

void tetris_send_newline(void) {
  send_keycode(KC_ENT);
  tap_code(KC_ENT);
}

int tetris_get_keypress(void) {

M keyboards/gh60/revc/keymaps/dbroqua_7U/keymap.c => keyboards/gh60/revc/keymaps/dbroqua_7U/keymap.c +15 -18
@@ 3,6 3,10 @@
#define _DEFAULT 0
#define _FN 1

enum custom_keycodes {
    LED_TOGGLE = SAFE_RANGE
};

int esc_led = 0;

// Fillers to make layering more clear


@@ 44,7 48,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 *         `-----------------------------------------------------------------'
 */
  [_FN] = LAYOUT_60_ansi_split_bs_rshift( /* Layer 1 */
      F(0),   KC_F1,   KC_F2,   KC_F3,   KC_F4,  KC_F5,  KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11, KC_F12, KC_INS,  KC_DEL, \
      LED_TOGGLE,KC_F1,   KC_F2,   KC_F3,   KC_F4,  KC_F5,  KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11, KC_F12, KC_INS,  KC_DEL, \
      KC_CAPS, ______,  ______,  ______,  ______, ______, ______,  ______,  KC_PSCR, KC_SLCK, KC_PAUS, KC_UP,  ______, ______,  \
      ______,  KC_VOLD, KC_VOLU, KC_MUTE, ______, ______, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT,______,   \
      ______,  KC_MPRV, KC_MPLY, KC_MNXT, ______, ______, KC_PPLS, KC_PMNS, KC_END,  KC_PGDN, KC_DOWN, ______, ______,  \


@@ 52,14 56,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
      )
};

enum function_id {
    LED_TOGGLE
};

const uint16_t PROGMEM fn_actions[] = {
  [0]  = ACTION_FUNCTION(LED_TOGGLE)
};

void esc_led_toggle(void) {
    if (esc_led == 0){
        esc_led = 1;


@@ 70,12 66,13 @@ void esc_led_toggle(void) {
    }
}

void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
  switch (id) {
    case LED_TOGGLE:
      if (record->event.pressed) {
        esc_led_toggle();
      }
      break;
  }
}
\ No newline at end of file
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    switch (keycode) {
        case LED_TOGGLE:
            if (record->event.pressed) {
                esc_led_toggle();
            }
            return false;
    }
    return true;
}

M keyboards/infinity60/keymaps/jpetermans/keymap.c => keyboards/infinity60/keymaps/jpetermans/keymap.c +39 -62
@@ 11,20 11,25 @@
//IS31 chip has 8 available led pages, using 0 for all leds and 7 for single toggles
#define max_pages 6

enum ic60_keycodes {
  NUMPAD,
  FNAV,
  MEDIA,
  BACKLIGHT,
  BRIGHT,
  DIM,
  ALL,
  GAME,
enum led_modes {
  MODE_ALL,
  MODE_GAME,
  MODE_SINGLE,
  MODE_PAGE,
  MODE_FLASH
};

enum macro_id {
  LED_ALL = SAFE_RANGE,
  LED_GAME,
  LED_BACKLIGHT,
  LED_BRIGHT,
  LED_DIM,
  LED_SINGLE,
  LED_PAGE,
  LED_FLASH
};

uint8_t current_layer_global = 0;
uint8_t led_mode_global = MODE_SINGLE;
uint8_t backlight_status_global = 1; //init on/off state of backlight


@@ 77,10 82,10 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = {

    /* media */
    [_MEDIA] = LAYOUT_60_ansi_split_bs_rshift( \
        _______,F(MODE_SINGLE),F(MODE_PAGE),F(MODE_FLASH),_______,_______,_______, _______, _______, _______,KC_MUTE, KC_VOLD, KC_VOLU,_______,KC_NO,\
        _______,LED_SINGLE,LED_PAGE,LED_FLASH,_______,_______,_______, _______, _______, _______,KC_MUTE, KC_VOLD, KC_VOLU,_______,KC_NO,\
        _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,\
        _______,_______,_______,_______,_______,F(GAME),_______, _______, _______, _______,_______, _______,_______,     \
        _______,_______,F(ALL) ,F(BRIGHT),F(DIM),F(BACKLIGHT),_______, _______, KC_MPRV, KC_MNXT,KC_MSTP, _______,KC_NO,       \
        _______,_______,_______,_______,_______,LED_GAME,_______, _______, _______, _______,_______, _______,_______,     \
        _______,_______,LED_ALL ,LED_BRIGHT,LED_DIM,LED_BACKLIGHT,_______, _______, KC_MPRV, KC_MNXT,KC_MSTP, _______,KC_NO,       \
        _______,_______,_______,               KC_MPLY,             _______,_______, _______,_______      \
    ),
    /* ~ */


@@ 101,22 106,6 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    ),
};

//id for user defined functions and macros
enum function_id {
    NONE,
};

enum macro_id {
    ACTION_LEDS_ALL,
    ACTION_LEDS_GAME,
    ACTION_LEDS_BACKLIGHT,
    ACTION_LEDS_BRIGHT,
    ACTION_LEDS_DIM,
    ACTION_LEDS_SINGLE,
    ACTION_LEDS_PAGE,
    ACTION_LEDS_FLASH
};

/* ==================================
 *          LED MAPPING
 * ==================================*/


@@ 158,74 147,62 @@ uint8_t led_game[5] = {
     47,48,51
};

//======== qmk functions =========
const uint16_t fn_actions[] = {
    [ALL] = ACTION_FUNCTION(ACTION_LEDS_ALL),
    [GAME] = ACTION_FUNCTION(ACTION_LEDS_GAME),
    [BACKLIGHT] = ACTION_FUNCTION(ACTION_LEDS_BACKLIGHT),
    [BRIGHT] = ACTION_FUNCTION(ACTION_LEDS_BRIGHT),
    [DIM] = ACTION_FUNCTION(ACTION_LEDS_DIM),
    [MODE_SINGLE] = ACTION_FUNCTION(ACTION_LEDS_SINGLE),
    [MODE_PAGE] = ACTION_FUNCTION(ACTION_LEDS_PAGE),
    [MODE_FLASH] = ACTION_FUNCTION(ACTION_LEDS_FLASH),
};

/* custom action function */
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  msg_t msg;

  switch(id) {
    case ACTION_LEDS_ALL:
  switch(keycode) {
    case LED_ALL:
      if(record->event.pressed) {
        led_mode_global = led_mode_global == ALL ? MODE_SINGLE : ALL;
        led_mode_global = led_mode_global == MODE_ALL ? MODE_SINGLE : MODE_ALL;
        msg=TOGGLE_ALL;
        chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
      }
      break;
      return false;

    case ACTION_LEDS_BACKLIGHT:
    case LED_BACKLIGHT:
      if(record->event.pressed) {
        backlight_status_global ^= 1;
        msg=(backlight_status_global << 8) | TOGGLE_BACKLIGHT;
        chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
      }
      break;
      return false;

    case ACTION_LEDS_GAME:
    case LED_GAME:
      if(record->event.pressed) {
        led_mode_global = led_mode_global == GAME ? MODE_SINGLE : GAME;
        led_mode_global = led_mode_global == MODE_GAME ? MODE_SINGLE : MODE_GAME;

        msg=(4 << 8) | DISPLAY_PAGE;
        chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
      }
      break;
      return false;

    case ACTION_LEDS_BRIGHT:
    case LED_BRIGHT:
      if(record->event.pressed) {
        msg=(1 << 8) | STEP_BRIGHTNESS;
        chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
      }
      break;
      return false;

    case ACTION_LEDS_DIM:
    case LED_DIM:
      if(record->event.pressed) {
        msg=(0 << 8) | STEP_BRIGHTNESS;
        chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
      }
      break;
      return false;

    //set led_mode for matrix_scan to toggle leds
    case ACTION_LEDS_SINGLE:
    case LED_SINGLE:
      led_mode_global = MODE_SINGLE;
      break;
    case ACTION_LEDS_PAGE:
      return false;
    case LED_PAGE:
      led_mode_global = MODE_PAGE;
      break;
    case ACTION_LEDS_FLASH:
      return false;
    case LED_FLASH:
      led_mode_global = MODE_FLASH;
      break;
      return false;

  }
  return true;
}

// Runs just one time when the keyboard initializes.


@@ 257,7 234,7 @@ void matrix_scan_user(void) {
    return;
  }

  if (led_layer_state != layer_state && led_mode_global != GAME && led_mode_global != ALL) {
  if (led_layer_state != layer_state && led_mode_global != MODE_GAME && led_mode_global != MODE_ALL) {
    //check mode
    //Turn on layer indicator or page depending on mode
    switch(led_mode_global) {

M keyboards/whitefox/keymaps/kim-kim/keymap.c => keyboards/whitefox/keymaps/kim-kim/keymap.c +0 -15
@@ 51,18 51,3 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
        _______,_______,_______,               _______,          _______,_______,_______,     KC_HOME,_______,KC_END  \
    ),
};

/* Give numbers some descriptive names */
#define ACTION_LEDS_ALL 1
#define ACTION_LEDS_GAME 2

const uint16_t fn_actions[] = {
    [2] = ACTION_FUNCTION(ACTION_LEDS_ALL),
    [3] = ACTION_FUNCTION(ACTION_LEDS_GAME),

    [4] = ACTION_USAGE_CONSUMER(0x1B4),
    [5] = ACTION_USAGE_CONSUMER(0x196),
    [6] = ACTION_USAGE_CONSUMER(0x1A6),
    [7] = ACTION_USAGE_CONSUMER(0x1A0),

};

M keyboards/whitefox/keymaps/matt3o/keymap.c => keyboards/whitefox/keymaps/matt3o/keymap.c +43 -17
@@ 16,6 16,13 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H

enum custom_keycodes {
    AL_FILE = SAFE_RANGE,
    AL_WWW,
    AL_HELP,
    AL_CMD
};

const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    /* Layer 0: Default Layer
     * ,---------------------------------------------------------------.


@@ 45,25 52,44 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
        KC_TRNS,KC_TRNS,KC_TRNS,               KC_TRNS,          KC_TRNS,KC_TRNS,KC_TRNS,     KC_HOME,KC_PGDN,KC_END  \
    ),
    [2] = LAYOUT( \
        KC_SLEP,KC_P1,  KC_P2,  KC_P3,  KC_P4,  KC_P5,  KC_P6,  KC_P7,  KC_P8,  KC_P9,  KC_P0,  KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_FN2, \
        KC_TRNS,KC_TRNS,KC_FN5 ,KC_FN6 ,KC_TRNS,KC_FN7 ,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PSCR,KC_TRNS,KC_TRNS,KC_TRNS,     KC_FN3, \
        KC_CAPS,KC_TRNS,KC_TRNS,KC_TRNS,KC_FN4 ,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,     KC_TRNS,\
        KC_SLEP,KC_P1,  KC_P2,  KC_P3,  KC_P4,  KC_P5,  KC_P6,  KC_P7,  KC_P8,  KC_P9,  KC_P0,  KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_NO, \
        KC_TRNS,KC_TRNS,AL_WWW ,AL_HELP ,KC_TRNS,AL_CMD ,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PSCR,KC_TRNS,KC_TRNS,KC_TRNS,     KC_NO, \
        KC_CAPS,KC_TRNS,KC_TRNS,KC_TRNS,AL_FILE ,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,     KC_TRNS,\
        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_CALC,KC_TRNS,KC_TRNS,KC_TRNS,KC_MAIL,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,     KC_TRNS,KC_TRNS,\
        KC_TRNS,KC_TRNS,KC_TRNS,               KC_TRNS,          KC_TRNS,KC_TRNS,KC_TRNS,     KC_TRNS,KC_TRNS,KC_TRNS \
    ),
};

/* Give numbers some descriptive names */
#define ACTION_LEDS_ALL 1
#define ACTION_LEDS_GAME 2

const uint16_t fn_actions[] = {
    [2] = ACTION_FUNCTION(ACTION_LEDS_ALL),
    [3] = ACTION_FUNCTION(ACTION_LEDS_GAME),

    [4] = ACTION_USAGE_CONSUMER(0x1B4),
    [5] = ACTION_USAGE_CONSUMER(0x196),
    [6] = ACTION_USAGE_CONSUMER(0x1A6),
    [7] = ACTION_USAGE_CONSUMER(0x1A0),

};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    switch (keycode) {
        case AL_FILE:
            if (record->event.pressed) {
                host_consumer_send(0x1B4); // AL File Browser
            } else {
                host_consumer_send(0);
            }
            return false;
        case AL_WWW:
            if (record->event.pressed) {
                host_consumer_send(0x196); // AL Internet Browser
            } else {
                host_consumer_send(0);
            }
            return false;
        case AL_HELP:
            if (record->event.pressed) {
                host_consumer_send(0x1A6); // AL Integrated Help Center
            } else {
                host_consumer_send(0);
            }
            return false;
        case AL_CMD:
            if (record->event.pressed) {
                host_consumer_send(0x1A0); // AL Command Line Processor/Run
            } else {
                host_consumer_send(0);
            }
            return false;
    }
    return true;
}

M layouts/community/ergodox/coderkun_neo2/keymap.c => layouts/community/ergodox/coderkun_neo2/keymap.c +0 -6
@@ 215,12 215,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    ),
};

const uint16_t PROGMEM fn_actions[] = {
    [BASE] = ACTION_FUNCTION(BASE),
    [PMQ]  = ACTION_FUNCTION(PMQ),
    [PMN]  = ACTION_FUNCTION(PMN),
};

// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
    set_unicode_input_mode(UC_LNX);

M layouts/community/ergodox/colemak_osx_pc_no/keymap.c => layouts/community/ergodox/colemak_osx_pc_no/keymap.c +61 -39
@@ 9,6 9,18 @@
#define NUMB_SYMB_MAC 3 // numbers and symbols mac
#define FUNCTION 4 // function keys

enum custom_keycodes {
    TILDE_NO = SAFE_RANGE,
    LESS_NO,
    GRTR_NO,
    CIRC_NO,
    ACUT_NO,
    GRV_NO,
    LESS_NO_MAC,
    GRTR_NO_MAC,
    ACUT_NO_MAC
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {

/* Keymap 0: Basic layer PC


@@ 43,11 55,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
                                                              NO_PLUS,
                                               OSM(MOD_LSFT),CTL_T(KC_DOT),ALT_T(NO_MINS),
        // right hand
             KC_FN5, NO_DLR, NO_LPRN, NO_RPRN ,KC_FN3, KC_FN4,NO_AT,
             CIRC_NO, NO_DLR, NO_LPRN, NO_RPRN ,LESS_NO, GRTR_NO,NO_AT,
             NO_QUOT,      KC_J,    KC_L,    KC_U,      KC_Y,     NO_ARNG, NO_AE  ,
                           KC_H,    KC_N,    KC_E,      KC_I,      KC_O,    NO_OSTR,
             NO_EQL,        KC_K,    KC_M, KC_RIGHT,  KC_DOWN,   KC_UP, NO_UNDS,
                                  KC_LEFT,  KC_ESC,   KC_FN7,   KC_HASH,   MO(2),
                                  KC_LEFT,  KC_ESC,   GRV_NO,   KC_HASH,   MO(2),
             KC_INSERT,  NO_SLSH,
             KC_DEL,
             KC_BSPC,KC_ENT,KC_SPC


@@ 83,7 95,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
                                                    KC_TRNS,
                                  KC_TRNS,GUI_T(KC_DOT) , KC_TRNS,
    // right hand
       KC_TRNS,  S(NO_4), KC_TRNS,KC_TRNS,KC_FN8, KC_FN9,NO_QUOT,
       KC_TRNS,  S(NO_4), KC_TRNS,KC_TRNS,LESS_NO_MAC, GRTR_NO_MAC,NO_QUOT,
       NO_LABK,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
                 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
       KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,


@@ 125,7 137,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
                                  KC_TRNS, KC_TRNS, KC_TRNS,
    // right hand
       KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
       KC_TRNS,  KC_TRNS, KC_FN2, KC_FN6 , KC_TRNS, KC_TRNS, KC_TRNS,
       KC_TRNS,  KC_TRNS, TILDE_NO, ACUT_NO , KC_TRNS, KC_TRNS, KC_TRNS,
                 KC_TRNS, KC_5, KC_6, KC_7, KC_8, KC_TRNS,
       KC_TRNS,  KC_HOME, KC_9, KC_END, KC_PGDN, KC_PGUP, KC_TRNS,
                          KC_HOME, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,


@@ 166,7 178,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
                                  KC_TRNS, KC_TRNS, KC_TRNS,
    // right hand
       KC_TRNS,  KC_TRNS, KC_TRNS , KC_TRNS, KC_TRNS , KC_TRNS, KC_TRNS,
       KC_TRNS,  KC_TRNS, KC_FN2, KC_FN10, KC_TRNS, KC_TRNS, KC_TRNS,
       KC_TRNS,  KC_TRNS, TILDE_NO, ACUT_NO_MAC, KC_TRNS, KC_TRNS, KC_TRNS,
                 KC_TRNS, KC_5, KC_6, KC_7, KC_8, KC_TRNS,
       KC_TRNS,  KC_HOME, KC_9, KC_END, KC_PGDN, KC_PGUP, KC_TRNS,
                          KC_HOME, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,


@@ 217,47 229,57 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
)
};

enum macro_id {
    TILDE_NO, LESS_NO, GRTR_NO, CIRC_NO, ACUT_NO,  GRV_NO, LESS_NO_MAC, GRTR_NO_MAC, ACUT_NO_MAC
};

const uint16_t PROGMEM fn_actions[] = {
    [2] = ACTION_MACRO(TILDE_NO), // Completed ~ character(pc and mac), no space needed.
    [3] = ACTION_MACRO(LESS_NO), // < completed on keypress down, to avoid shifting the next character if it is not released first.
    [4] = ACTION_MACRO(GRTR_NO), // > completed on keypress down, to avoid shifting the next character if it is not released first.
    [5] = ACTION_MACRO(CIRC_NO), // Completed ^ character, no space needed.
    [6] = ACTION_MACRO(ACUT_NO), // Completed ´ character, no space needed.
    [7] = ACTION_MACRO(GRV_NO), // Completed ` character, no space needed.
    [8] = ACTION_MACRO(LESS_NO_MAC), // < completed on keypress down, to avoid same button problem when typing <> quickly
    [9] = ACTION_MACRO(GRTR_NO_MAC), // > completed on keypress down, to avoid same button problem when typing <> quickly
    [10] = ACTION_MACRO(ACUT_NO_MAC), // Completed ´ character, no space needed
};



const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
    keyevent_t event = record->event;

    switch (id) {
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    switch (keycode) {
        case TILDE_NO:
            return (event.pressed ? MACRO( D(RALT), T(RBRC), U(RALT), T(SPC), END ) : MACRO_NONE);
            if (record->event.pressed) {
                tap_code16(ALGR(KC_RBRC));
                tap_code(KC_SPC);
            }
            return false;
        case LESS_NO:
            return (event.pressed ? MACRO( T(NUBS), END ) : MACRO_NONE);
            if (record->event.pressed) {
                tap_code(KC_NUBS);
            }
            return false;
        case GRTR_NO:
            return (event.pressed ? MACRO( D(LSFT), T(NUBS), U(LSFT), END ) : MACRO_NONE);
            if (record->event.pressed) {
                tap_code16(S(KC_NUBS));
            }
            return false;
        case CIRC_NO:
            return (event.pressed ? MACRO( D(LSFT), T(RBRC), U(LSFT), T(SPC), END ) : MACRO_NONE);
            if (record->event.pressed) {
                tap_code16(S(KC_RBRC));
                tap_code(KC_SPC);
            }
            return false;
        case ACUT_NO:
            return (event.pressed ? MACRO( D(RALT), T(EQL), U(RALT), T(SPC),  END ) : MACRO_NONE);
            if (record->event.pressed) {
                tap_code16(ALGR(KC_EQL));
                tap_code(KC_SPC);
            }
            return false;
        case GRV_NO:
            return (event.pressed ? MACRO( D(LSFT), T(EQL), T(SPC), U(LSFT),  END ) : MACRO_NONE);
            if (record->event.pressed) {
                SEND_STRING(SS_LSFT("= "));
            }
            return false;
        case LESS_NO_MAC:
            return (event.pressed ? MACRO( T(GRV), END ) : MACRO_NONE);
            if (record->event.pressed) {
                tap_code(KC_GRV);
            }
            return false;
        case GRTR_NO_MAC:
            return (event.pressed ? MACRO( D(LSFT), T(GRV), U(LSFT), END ) : MACRO_NONE);
            if (record->event.pressed) {
                tap_code16(S(KC_GRV));
            }
            return false;
        case ACUT_NO_MAC:
            return (event.pressed ? MACRO( T(EQL), T(SPC),  END ) : MACRO_NONE);
            if (record->event.pressed) {
                tap_code(KC_EQL);
                tap_code(KC_SPC);
            }
            return false;
    }
    return MACRO_NONE;
};
    return true;
}

M layouts/community/ergodox/deadcyclo/keymap.c => layouts/community/ergodox/deadcyclo/keymap.c +97 -274
@@ 1,6 1,4 @@
#include QMK_KEYBOARD_H
#include "debug.h"
#include "action_layer.h"
#include "version.h"

#define BASE 0 // default layer


@@ 9,45 7,19 @@
#define UNI 3  // unicode 1
#define UNI2 4 // unicode 2

enum macros {
  RUN
};

enum function_ids {
  EMOJI,
  EMOJI2,
  EPRM,
enum custom_keycodes {
  I3_RUN = SAFE_RANGE,
  VRSN,
  RGB_SLD,
  GO_GROUP
};

/* opt can only be 0-15 */
enum emojis {
  SHRUG,
  YAY,
  HUG,
  SMILE,
  SMILE2,
  HMM1,
  HMM2,
  BEAR1,
  BEAR2,
  FUU,
  EGGY1,
  EGGY2,
  FACE1,
  FACE2,
  UHU,
  SMRK1
};

enum emojis2 {
  SMRK2,
  LOVE
};

enum progmem_ids {
  I3_GO_GROUP_1,
  I3_GO_GROUP_2,
  I3_GO_GROUP_3,
  I3_GO_GROUP_4,
  I3_GO_GROUP_5,
  I3_GO_GROUP_6,
  I3_GO_GROUP_7,
  I3_GO_GROUP_8,
  I3_GO_GROUP_9,
  I3_GO_GROUP_10,
  EMOJI_SHRUG,
  EMOJI_YAY,
  EMOJI_HUG,


@@ 65,20 37,7 @@ enum progmem_ids {
  EMOJI_UHU,
  EMOJI_SMRK1,
  EMOJI_SMRK2,
  EMOJI_LOVE,
  F_EPRM,
  F_VRSN,
  F_RGB_SLD,
  I3_GO_GROUP_10,
  I3_GO_GROUP_1,
  I3_GO_GROUP_2,
  I3_GO_GROUP_3,
  I3_GO_GROUP_4,
  I3_GO_GROUP_5,
  I3_GO_GROUP_6,
  I3_GO_GROUP_7,
  I3_GO_GROUP_8,
  I3_GO_GROUP_9,
  EMOJI_LOVE
};

// TODO: Finish the macros for i3 (Macros should potentially be own function instead to make things easier? some of them at least, f. ex. the ones that use 1-0 keys so we can have a single switch)


@@ 163,7 122,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
       KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS,
       KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
                                       RGB_TOG,RGB_MOD,
       F(F_RGB_SLD),
       RGB_M_P,
                               RGB_VAD,RGB_VAI,KC_TRNS,
       // right hand
       KC_F6, KC_F7,   KC_F8,  KC_F9,   KC_F10,   KC_F11,  KC_F12,


@@ 173,7 132,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
                         KC_TRNS,KC_DOT,  KC_0,    KC_EQL,  KC_TRNS,
       RGB_HUD, RGB_HUI,
       KC_TRNS,
       F(F_EPRM), KC_DEL, KC_TRNS
       EEP_RST, KC_DEL, KC_TRNS
),
/* Keymap 2: Media, mouse and navigation
 *


@@ 198,8 157,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 */
// MEDIA , MOUSE and NAVIGATION
[MDIA] = LAYOUT_ergodox(
		KC_TRNS, F(I3_GO_GROUP_1), F(I3_GO_GROUP_2), F(I3_GO_GROUP_3), F(I3_GO_GROUP_4), F(I3_GO_GROUP_5), F(I3_GO_GROUP_6),
KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, M(RUN), KC_TRNS, KC_TRNS,
		KC_TRNS, I3_GO_GROUP_1, I3_GO_GROUP_2, I3_GO_GROUP_3, I3_GO_GROUP_4, I3_GO_GROUP_5, I3_GO_GROUP_6,
KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, I3_RUN, KC_TRNS, KC_TRNS,
       KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
       KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
       KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2,


@@ 207,7 166,7 @@ KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, M(RUN), KC_TRNS, KC_TRNS,
                                                    KC_TRNS,
                                  KC_TRNS, KC_TRNS, KC_TRNS,
    // right hand
		F(I3_GO_GROUP_6), F(I3_GO_GROUP_7), F(I3_GO_GROUP_8), F(I3_GO_GROUP_9), F(I3_GO_GROUP_10), KC_TRNS, KC_TRNS,
		I3_GO_GROUP_6, I3_GO_GROUP_7, I3_GO_GROUP_8, I3_GO_GROUP_9, I3_GO_GROUP_10, KC_TRNS, KC_TRNS,
       KC_TRNS,  KC_TRNS, KC_TRNS, KC_UP,   KC_TRNS,  KC_TRNS, KC_TRNS,
                 KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_MPLY,
       KC_TRNS,  KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS,  KC_TRNS, KC_TRNS,


@@ 241,10 200,10 @@ KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, M(RUN), KC_TRNS, KC_TRNS,
// Unicode
[UNI] = LAYOUT_ergodox(
		KC_TRNS, UC(0x250c), UC(0x2510), UC(0x2514), UC(0x2518), UC(0x2502), UC(0x2500),
		KC_TRNS, F(EMOJI_SHRUG), F(EMOJI_YAY), F(EMOJI_HUG), F(EMOJI_SMILE), F(EMOJI_SMILE2), KC_TRNS,
		KC_TRNS, F(EMOJI_HMM1), F(EMOJI_HMM2), F(EMOJI_BEAR1), F(EMOJI_BEAR2), F(EMOJI_FUU),
		KC_TRNS, F(EMOJI_EGGY1), F(EMOJI_EGGY2), F(EMOJI_FACE1), F(EMOJI_FACE2), F(EMOJI_UHU), KC_TRNS,
		KC_TRNS, F(EMOJI_SMRK1), F(EMOJI_SMRK2), F(EMOJI_LOVE), F(F_VRSN),
		KC_TRNS, EMOJI_SHRUG, EMOJI_YAY, EMOJI_HUG, EMOJI_SMILE, EMOJI_SMILE2, KC_TRNS,
		KC_TRNS, EMOJI_HMM1, EMOJI_HMM2, EMOJI_BEAR1, EMOJI_BEAR2, EMOJI_FUU,
		KC_TRNS, EMOJI_EGGY1, EMOJI_EGGY2, EMOJI_FACE1, EMOJI_FACE2, EMOJI_UHU, KC_TRNS,
		KC_TRNS, EMOJI_SMRK1, EMOJI_SMRK2, EMOJI_LOVE, VRSN,
		KC_TRNS, KC_TRNS,
                                                    KC_TRNS,
                                  KC_TRNS, KC_TRNS, KC_TRNS,


@@ 302,220 261,84 @@ KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, M(RUN), KC_TRNS, KC_TRNS,
),
};

const uint16_t PROGMEM fn_actions[] = {
  [EMOJI_SHRUG]   = ACTION_FUNCTION_OPT(EMOJI, SHRUG),
  [EMOJI_YAY]     = ACTION_FUNCTION_OPT(EMOJI, YAY),
  [EMOJI_HUG]     = ACTION_FUNCTION_OPT(EMOJI,HUG),
  [EMOJI_SMILE]   = ACTION_FUNCTION_OPT(EMOJI,SMILE),
  [EMOJI_SMILE2]  = ACTION_FUNCTION_OPT(EMOJI,SMILE2),
  [EMOJI_HMM1]    = ACTION_FUNCTION_OPT(EMOJI,HMM1),
  [EMOJI_HMM2]    = ACTION_FUNCTION_OPT(EMOJI,HMM2),
  [EMOJI_BEAR1]   = ACTION_FUNCTION_OPT(EMOJI,BEAR1),
  [EMOJI_BEAR2]   = ACTION_FUNCTION_OPT(EMOJI,BEAR2),
  [EMOJI_FUU]     = ACTION_FUNCTION_OPT(EMOJI,FUU),
  [EMOJI_EGGY1]   = ACTION_FUNCTION_OPT(EMOJI,EGGY1),
  [EMOJI_EGGY2]   = ACTION_FUNCTION_OPT(EMOJI,EGGY2),
  [EMOJI_FACE1]   = ACTION_FUNCTION_OPT(EMOJI,FACE1),
  [EMOJI_FACE2]   = ACTION_FUNCTION_OPT(EMOJI,FACE2),
  [EMOJI_UHU]     = ACTION_FUNCTION_OPT(EMOJI,UHU),
  [EMOJI_SMRK1]   = ACTION_FUNCTION_OPT(EMOJI,SMRK1),
  [EMOJI_SMRK2]   = ACTION_FUNCTION_OPT(EMOJI2,SMRK2),
  [EMOJI_LOVE]    = ACTION_FUNCTION_OPT(EMOJI2,LOVE),
  [F_EPRM]        = ACTION_FUNCTION(EPRM),
  [F_VRSN]        = ACTION_FUNCTION(VRSN),
  [F_RGB_SLD]     = ACTION_FUNCTION(RGB_SLD),
  [I3_GO_GROUP_10]= ACTION_FUNCTION_OPT(GO_GROUP,0),
  [I3_GO_GROUP_1] = ACTION_FUNCTION_OPT(GO_GROUP,1),
  [I3_GO_GROUP_2] = ACTION_FUNCTION_OPT(GO_GROUP,2),
  [I3_GO_GROUP_3] = ACTION_FUNCTION_OPT(GO_GROUP,3),
  [I3_GO_GROUP_4] = ACTION_FUNCTION_OPT(GO_GROUP,4),
  [I3_GO_GROUP_5] = ACTION_FUNCTION_OPT(GO_GROUP,5),
  [I3_GO_GROUP_6] = ACTION_FUNCTION_OPT(GO_GROUP,6),
  [I3_GO_GROUP_7] = ACTION_FUNCTION_OPT(GO_GROUP,7),
  [I3_GO_GROUP_8] = ACTION_FUNCTION_OPT(GO_GROUP,8),
  [I3_GO_GROUP_9] = ACTION_FUNCTION_OPT(GO_GROUP,9),
};

#define TAP_ONCE(code)  \
  register_code (code); \
  unregister_code (code)

void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
  if (record->event.pressed) {
    switch(id) {
    case EPRM:
      eeconfig_init();
      break;
    case VRSN:
      SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
      break;
    case RGB_SLD:
#ifdef RGBLIGHT_ENABLE
      rgblight_mode(1);
#endif
      break;
    case GO_GROUP:
      register_code(KC_LCTL); TAP_ONCE(KC_I); unregister_code(KC_LCTL);
      TAP_ONCE(KC_G);
      if (opt == 0) {
	TAP_ONCE(39);
      } else {
	TAP_ONCE(29+opt);
      }
      break;
    case EMOJI:
      switch(opt) {
      case SHRUG:
	unicode_input_start(); register_hex(0xaf); unicode_input_finish();
	TAP_ONCE (KC_BSLS);
	register_code (KC_RSFT); TAP_ONCE (KC_MINS); TAP_ONCE (KC_9); unregister_code (KC_RSFT);
	unicode_input_start (); register_hex(0x30c4); unicode_input_finish();
	register_code (KC_RSFT); TAP_ONCE (KC_0); TAP_ONCE (KC_MINS); unregister_code (KC_RSFT);
	TAP_ONCE (KC_SLSH);
	unicode_input_start (); register_hex(0xaf); unicode_input_finish();
	break;
      case YAY:
	SEND_STRING ("\\o/");	
	break;
      case HUG:
	unicode_input_start(); register_hex(0x0f3c); unicode_input_finish();
	TAP_ONCE (KC_SPC);
	unicode_input_start(); register_hex(0x3064); unicode_input_finish();
	TAP_ONCE (KC_SPC);
	unicode_input_start(); register_hex(0x25d5); unicode_input_finish();
	unicode_input_start(); register_hex(0x005f); unicode_input_finish();
	unicode_input_start(); register_hex(0x25d5); unicode_input_finish();
	TAP_ONCE (KC_SPC);
	unicode_input_start(); register_hex(0x0f3d); unicode_input_finish();
	unicode_input_start(); register_hex(0x3064); unicode_input_finish();
	break;
      case SMILE:
	unicode_input_start(); register_hex(0x0298); unicode_input_finish();
	unicode_input_start(); register_hex(0x203f); unicode_input_finish();
	unicode_input_start(); register_hex(0x0298); unicode_input_finish();
	break;
      case SMILE2:
	unicode_input_start(); register_hex(0x0028); unicode_input_finish();
	unicode_input_start(); register_hex(0x0298); unicode_input_finish();
	unicode_input_start(); register_hex(0x203f); unicode_input_finish();
	unicode_input_start(); register_hex(0x0298); unicode_input_finish();
	unicode_input_start(); register_hex(0x0029); unicode_input_finish();
	break;
      case HMM1:
	unicode_input_start(); register_hex(0x0ca0); unicode_input_finish();
	unicode_input_start(); register_hex(0x005f); unicode_input_finish();
	unicode_input_start(); register_hex(0x0ca0); unicode_input_finish();
	break;
      case HMM2:
	unicode_input_start(); register_hex(0x0028); unicode_input_finish();
	unicode_input_start(); register_hex(0x0ca0); unicode_input_finish();
	unicode_input_start(); register_hex(0x005f); unicode_input_finish();
	unicode_input_start(); register_hex(0x0ca0); unicode_input_finish();
	unicode_input_start(); register_hex(0x0029); unicode_input_finish();
	break;
      case BEAR1:
	unicode_input_start(); register_hex(0x0295); unicode_input_finish();
	unicode_input_start(); register_hex(0x2022); unicode_input_finish();
	unicode_input_start(); register_hex(0x1d25); unicode_input_finish();
	unicode_input_start(); register_hex(0x2022); unicode_input_finish();
	unicode_input_start(); register_hex(0x0294); unicode_input_finish();
	break;
      case BEAR2:
	unicode_input_start(); register_hex(0x0028); unicode_input_finish();
	unicode_input_start(); register_hex(0x1d54); unicode_input_finish();
	unicode_input_start(); register_hex(0x1d25); unicode_input_finish();
	unicode_input_start(); register_hex(0x1d54); unicode_input_finish();
	unicode_input_start(); register_hex(0x0029); unicode_input_finish();
	break;
      case FUU:
	unicode_input_start(); register_hex(0x256d); unicode_input_finish();
	unicode_input_start(); register_hex(0x2229); unicode_input_finish();
	unicode_input_start(); register_hex(0x256e); unicode_input_finish();
	unicode_input_start(); register_hex(0x0028); unicode_input_finish();
	unicode_input_start(); register_hex(0x002d); unicode_input_finish();
	unicode_input_start(); register_hex(0x005f); unicode_input_finish();
	unicode_input_start(); register_hex(0x002d); unicode_input_finish();
	unicode_input_start(); register_hex(0x0029); unicode_input_finish();
	unicode_input_start(); register_hex(0x256d); unicode_input_finish();
	unicode_input_start(); register_hex(0x2229); unicode_input_finish();
	unicode_input_start(); register_hex(0x256e); unicode_input_finish();
	break;
      case EGGY1:
	unicode_input_start(); register_hex(0x0028); unicode_input_finish();
	unicode_input_start(); register_hex(0x256f); unicode_input_finish();
	unicode_input_start(); register_hex(0x00b0); unicode_input_finish();
	unicode_input_start(); register_hex(0x25a1); unicode_input_finish();
	unicode_input_start(); register_hex(0x00b0); unicode_input_finish();
	unicode_input_start(); register_hex(0xff09); unicode_input_finish();
	unicode_input_start(); register_hex(0x256f); unicode_input_finish();
	break;
      case EGGY2:
	unicode_input_start(); register_hex(0x30ce); unicode_input_finish();
	unicode_input_start(); register_hex(0x0028); unicode_input_finish();
	unicode_input_start(); register_hex(0x0020); unicode_input_finish();
	unicode_input_start(); register_hex(0x309c); unicode_input_finish();
	unicode_input_start(); register_hex(0x002d); unicode_input_finish();
	unicode_input_start(); register_hex(0x309c); unicode_input_finish();
	unicode_input_start(); register_hex(0x30ce); unicode_input_finish();
	unicode_input_start(); register_hex(0x0029); unicode_input_finish();
	break;
      case FACE1:
	unicode_input_start(); register_hex(0x0028); unicode_input_finish();
	unicode_input_start(); register_hex(0x002d); unicode_input_finish();
	unicode_input_start(); register_hex(0x005f); unicode_input_finish();
	unicode_input_start(); register_hex(0x002d); unicode_input_finish();
	unicode_input_start(); register_hex(0x0029); unicode_input_finish();
	break;
      case FACE2:
	unicode_input_start(); register_hex(0x0028); unicode_input_finish();
	unicode_input_start(); register_hex(0x2022); unicode_input_finish();
	unicode_input_start(); register_hex(0x005f); unicode_input_finish();
	unicode_input_start(); register_hex(0x2022); unicode_input_finish();
	unicode_input_start(); register_hex(0x0029); unicode_input_finish();
	break;
      case UHU:
	unicode_input_start(); register_hex(0x2299); unicode_input_finish();
	unicode_input_start(); register_hex(0xfe4f); unicode_input_finish();
	unicode_input_start(); register_hex(0x2299); unicode_input_finish();
	break;
      case SMRK1:
	unicode_input_start(); register_hex(0x005e); unicode_input_finish();
	unicode_input_start(); register_hex(0x032e); unicode_input_finish();
	unicode_input_start(); register_hex(0x005e); unicode_input_finish();
	break;
      }
      break;
    case EMOJI2:
      switch(opt) {
	case SMRK2:
	  unicode_input_start(); register_hex(0x0028); unicode_input_finish();
	  unicode_input_start(); register_hex(0x005e); unicode_input_finish();
	  unicode_input_start(); register_hex(0x032e); unicode_input_finish();
	  unicode_input_start(); register_hex(0x005e); unicode_input_finish();
	  unicode_input_start(); register_hex(0x0029); unicode_input_finish();
	  break;
      case LOVE:
	unicode_input_start(); register_hex(0x2665); unicode_input_finish();
	unicode_input_start(); register_hex(0x203f); unicode_input_finish();
	unicode_input_start(); register_hex(0x2665); unicode_input_finish();
	break;
      }
      break;   
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    if (record->event.pressed) {
        switch (keycode) {
            case I3_RUN:
                tap_code16(C(KC_I));
                tap_code(KC_R);
                return false;
            case VRSN:
                SEND_STRING(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
                return false;
            case I3_GO_GROUP_1 ... I3_GO_GROUP_10:
                tap_code16(C(KC_I));
                tap_code(KC_G);
                if (keycode == I3_GO_GROUP_10) {
                    tap_code(KC_0);
                } else {
                    tap_code(KC_1 + (keycode - I3_GO_GROUP_1));
                }
                return false;
            case EMOJI_SHRUG:
                send_unicode_string("¯\\_(ツ)_/¯");
                return false;
            case EMOJI_YAY:
                SEND_STRING("\\o/");
                return false;
            case EMOJI_HUG:
                send_unicode_string("༼ つ ◕_◕ ༽つ");
                return false;
            case EMOJI_SMILE:
                send_unicode_string("ʘ‿ʘ");
                return false;
            case EMOJI_SMILE2:
                send_unicode_string("(ʘ‿ʘ)");
                return false;
            case EMOJI_HMM1:
                send_unicode_string("ಠ_ಠ");
                return false;
            case EMOJI_HMM2:
                send_unicode_string("(ಠ_ಠ)");
                return false;
            case EMOJI_BEAR1:
                send_unicode_string("ʕ•ᴥ•ʔ");
                return false;
            case EMOJI_BEAR2:
                send_unicode_string("(ᵔᴥᵔ)");
                return false;
            case EMOJI_FUU:
                send_unicode_string("╭∩╮(-_-)╭∩╮");
                return false;
            case EMOJI_EGGY1:
                send_unicode_string("(╯°□°)╯");
                return false;
            case EMOJI_EGGY2:
                send_unicode_string("ノ( ゜-゜ノ)");
                return false;
            case EMOJI_FACE1:
                SEND_STRING("(-_-)");
                return false;
            case EMOJI_FACE2:
                send_unicode_string("(•_•)");
                return false;
            case EMOJI_UHU:
                send_unicode_string("⊙﹏⊙");
                return false;
            case EMOJI_SMRK1:
                send_unicode_string("^̮^");
                return false;
            case EMOJI_SMRK2:
                send_unicode_string("(^̮^)");
                return false;
            case EMOJI_LOVE:
                send_unicode_string("♥‿♥");
                return false;
        }
    }
  }
    return true;
}

const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
  if (record->event.pressed) {
    switch(id) {
      case RUN:
	return MACRO( D(LCTL), T(I), U(LCTL), T(R), END  );
      break;
    }
  }
  return MACRO_NONE;
};

// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
  set_unicode_input_mode(UC_LNX);

M layouts/community/ergodox/guni/keymap.c => layouts/community/ergodox/guni/keymap.c +5 -36
@@ 1,7 1,4 @@
#include QMK_KEYBOARD_H
#include "debug.h"
#include "action_layer.h"
#include "bootloader.h"

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    LAYOUT_ergodox(  // layer 0 : default


@@ 13,7 10,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
        KC_LGUI , KC_GRV,KC_LEFT,KC_RGHT,KC_LALT,
                                          KC_NO , KC_NO  ,
                                               KC_NO  ,
                                     KC_BSPC,KC_DEL ,KC_FN23,
                                     KC_BSPC,KC_DEL ,TO(3),
        // right hand
             KC_RBRC , KC_6,   KC_7 ,  KC_8,   KC_9,   KC_0,   KC_MINS,
             KC_END  , KC_Y,   KC_U ,  KC_I,   KC_O,   KC_P,   MT(MOD_RCTL, KC_BSLS),


@@ 34,7 31,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
                                       KC_TRNS,KC_TRNS,
                                           KC_TRNS,
                                 KC_TRNS,KC_TRNS,KC_FN1,
                                 KC_TRNS,KC_TRNS,TO(0),
        // right hand
             KC_F12, KC_F6,  KC_F7,  KC_F8,  KC_F9,  KC_F10, KC_TRNS,
             KC_TRNS,KC_EXLM,LSFT(KC_COMM),LSFT(KC_DOT),KC_EQL,KC_AMPR, KC_TRNS,


@@ 55,7 52,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
                                      KC_TRNS,KC_TRNS,
                                           KC_TRNS,
                                 KC_TRNS,KC_TRNS,KC_FN1 ,
                                 KC_TRNS,KC_TRNS,TO(0) ,
        // right hand
             KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
             KC_TRNS ,KC_TRNS,  KC_HOME,  KC_TRNS,  KC_TRNS, KC_END ,KC_TRNS,


@@ 68,14 65,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    ),
    LAYOUT_ergodox(  // layer 3 : teensy bootloader functions
        // left hand
        KC_FN0, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
        RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
                                      KC_TRNS,KC_TRNS,
                                           KC_TRNS,
                                 KC_TRNS,KC_TRNS,KC_FN1 ,
                                 KC_TRNS,KC_TRNS,TO(0) ,
        // right hand
             KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
             KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,


@@ 110,31 107,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    ),

};

/* id for user defined functions */
enum function_id {
    TEENSY_KEY,
};

/*
 * Fn action definition
 */
const uint16_t PROGMEM fn_actions[] = {
   	[0]   =  ACTION_FUNCTION(TEENSY_KEY),                    // FN0 - Teensy key
	[1]   =  ACTION_LAYER_SET(0, ON_PRESS),              
	[23]  =  ACTION_LAYER_SET(3, ON_PRESS),
        [24]  =  ACTION_LAYER_SET(2, ON_PRESS),   
	[26]  =  ACTION_LAYER_SET(1, ON_PRESS),
};

void action_function(keyrecord_t *event, uint8_t id, uint8_t opt)
{
   
    if (id == TEENSY_KEY) {
        clear_keyboard();
        print("\n\nJump to bootloader... ");
        wait_ms(250);
        bootloader_jump(); // should not return
        print("not supported.\n");
    }
}

M layouts/community/ergodox/norwegian_programmer_osx_pc/keymap.c => layouts/community/ergodox/norwegian_programmer_osx_pc/keymap.c +62 -40
@@ 7,6 7,18 @@
#define BASE_MAC 1 // default layer mac
#define NUMB_FUNC 2 // numbers and function keys

enum custom_keycodes {
    TILDE_NO = SAFE_RANGE,
    LESS_NO,
    GRTR_NO,
    CIRC_NO,
    ACUT_NO,
    GRV_NO,
    LESS_NO_MAC,
    GRTR_NO_MAC,
    ACUT_NO_MAC
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {

/* Keymap 0: Basic layer PC


@@ 32,16 44,16 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 */
[BASE] = LAYOUT_ergodox(
        // left hand
        KC_PAST,       NO_LBRC, NO_RBRC, NO_LCBR,  NO_RCBR, KC_FN2,  TG(1),
        KC_PAST,       NO_LBRC, NO_RBRC, NO_LCBR,  NO_RCBR, TILDE_NO,  TG(1),
        KC_PPLS,         KC_Q,         KC_W,    KC_E,   KC_R,   KC_T,   NO_DQUO,
        KC_PSLS,         KC_A,         KC_S,    KC_D,   KC_F,   KC_G,
        KC_PMNS,        KC_Z,         KC_X,    KC_C,   KC_V,   KC_B,   NO_SCLN,
        ALT_T(KC_ESC), KC_EXLM , NO_QUES, NO_COLN, KC_TAB,
                                                      KC_HASH, KC_FN7,
                                                              KC_FN6,
                                                      KC_HASH, GRV_NO,
                                                              ACUT_NO,
                                               OSM(MOD_LSFT),CTL_T(KC_DOT),GUI_T(KC_COMMA),
        // right hand
             KC_FN5, NO_DLR, NO_LPRN, NO_RPRN ,KC_FN3, KC_FN4,NO_AT,
             CIRC_NO, NO_DLR, NO_LPRN, NO_RPRN ,LESS_NO, GRTR_NO,NO_AT,
             NO_QUOT,      KC_Y,    KC_U,    KC_I,      KC_O,     KC_P,   NO_ARNG,
                           KC_H,    KC_J,    KC_K,      KC_L,  NO_OSTR,    NO_AE,
             NO_EQL,        KC_N,    KC_M, KC_RIGHT,  KC_DOWN,   KC_UP,    NO_BSLS,


@@ 78,10 90,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
       KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
       KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
                                           KC_TRNS, ALGR(NO_BSLS),
                                                    KC_FN10,
                                                    ACUT_NO_MAC,
                                  KC_TRNS,GUI_T(KC_DOT) , CTL_T(KC_COMMA),
    // right hand
       KC_TRNS,  S(NO_4), KC_TRNS,KC_TRNS,KC_FN8, KC_FN9,NO_QUOT,
       KC_TRNS,  S(NO_4), KC_TRNS,KC_TRNS,LESS_NO_MAC, GRTR_NO_MAC,NO_QUOT,
       NO_LABK,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
                 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
       KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, S(ALGR(NO_7)),


@@ 133,47 145,57 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
)
};

enum macro_id {
    TILDE_NO, LESS_NO, GRTR_NO, CIRC_NO, ACUT_NO,  GRV_NO, LESS_NO_MAC, GRTR_NO_MAC, ACUT_NO_MAC
};

const uint16_t PROGMEM fn_actions[] = {
    [2] = ACTION_MACRO(TILDE_NO), // Completed ~ character(pc and mac), no space needed.
    [3] = ACTION_MACRO(LESS_NO), // < completed on keypress down, to avoid shifting the next character if it is not released first.
    [4] = ACTION_MACRO(GRTR_NO), // > completed on keypress down, to avoid shifting the next character if it is not released first.
    [5] = ACTION_MACRO(CIRC_NO), // Completed ^ character, no space needed.
    [6] = ACTION_MACRO(ACUT_NO), // Completed ´ character, no space needed.
    [7] = ACTION_MACRO(GRV_NO), // Completed ` character, no space needed.
    [8] = ACTION_MACRO(LESS_NO_MAC), // < completed on keypress down, to avoid same button problem when typing <> quickly
    [9] = ACTION_MACRO(GRTR_NO_MAC), // > completed on keypress down, to avoid same button problem when typing <> quickly
    [10] = ACTION_MACRO(ACUT_NO_MAC), // Completed ´ character, no space needed
};



const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
    keyevent_t event = record->event;

    switch (id) {
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    switch (keycode) {
        case TILDE_NO:
            return (event.pressed ? MACRO( D(RALT), T(RBRC), U(RALT), T(SPC), END ) : MACRO_NONE);
            if (record->event.pressed) {
                tap_code16(ALGR(KC_RBRC));
                tap_code(KC_SPC);
            }
            return false;
        case LESS_NO:
            return (event.pressed ? MACRO( T(NUBS), END ) : MACRO_NONE);
            if (record->event.pressed) {
                tap_code(KC_NUBS);
            }
            return false;
        case GRTR_NO:
            return (event.pressed ? MACRO( D(LSFT), T(NUBS), U(LSFT), END ) : MACRO_NONE);
            if (record->event.pressed) {
                tap_code16(S(KC_NUBS));
            }
            return false;
        case CIRC_NO:
            return (event.pressed ? MACRO( D(LSFT), T(RBRC), U(LSFT), T(SPC), END ) : MACRO_NONE);
            if (record->event.pressed) {
                tap_code16(S(KC_RBRC));
                tap_code(KC_SPC);
            }
            return false;
        case ACUT_NO:
            return (event.pressed ? MACRO( D(RALT), T(EQL), U(RALT), T(SPC),  END ) : MACRO_NONE);
            if (record->event.pressed) {
                tap_code16(ALGR(KC_EQL));
                tap_code(KC_SPC);
            }
            return false;
        case GRV_NO:
            return (event.pressed ? MACRO( D(LSFT), T(EQL), T(SPC), U(LSFT),  END ) : MACRO_NONE);
            if (record->event.pressed) {
                SEND_STRING(SS_LSFT("= "));
            }
            return false;
        case LESS_NO_MAC:
            return (event.pressed ? MACRO( T(GRV), END ) : MACRO_NONE);
            if (record->event.pressed) {
                tap_code(KC_GRV);
            }
            return false;
        case GRTR_NO_MAC:
            return (event.pressed ? MACRO( D(LSFT), T(GRV), U(LSFT), END ) : MACRO_NONE);
            if (record->event.pressed) {
                tap_code16(S(KC_GRV));
            }
            return false;
        case ACUT_NO_MAC:
            return (event.pressed ? MACRO( T(EQL), T(SPC),  END ) : MACRO_NONE);
            if (record->event.pressed) {
                tap_code(KC_EQL);
                tap_code(KC_SPC);
            }
            return false;
    }
    return MACRO_NONE;
};
    return true;
}

M layouts/community/ergodox/norwegian_programmer_osx_pc_colemak/keymap.c => layouts/community/ergodox/norwegian_programmer_osx_pc_colemak/keymap.c +62 -40
@@ 7,6 7,18 @@
#define BASE_MAC 1 // default layer mac
#define NUMB_FUNC 2 // numbers and function keys

enum custom_keycodes {
    TILDE_NO = SAFE_RANGE,
    LESS_NO,
    GRTR_NO,
    CIRC_NO,
    ACUT_NO,
    GRV_NO,
    LESS_NO_MAC,
    GRTR_NO_MAC,
    ACUT_NO_MAC
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {

/* Keymap 0: Basic layer PC


@@ 32,16 44,16 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 */
[BASE] = LAYOUT_ergodox(
        // left hand
        KC_PAST,       NO_LBRC, NO_RBRC, NO_LCBR,  NO_RCBR, KC_FN2,  TG(1),
        KC_PAST,       NO_LBRC, NO_RBRC, NO_LCBR,  NO_RCBR, TILDE_NO,  TG(1),
        KC_PPLS,         KC_Q,         KC_W,    KC_F,   KC_P,   KC_G,   NO_DQUO,
        KC_PSLS,         KC_A,         KC_R,    KC_S,   KC_T,   KC_D,
        KC_PMNS,        KC_Z,         KC_X,    KC_C,   KC_V,   KC_B,   NO_SCLN,
        ALT_T(KC_ESC), KC_EXLM , NO_QUES, NO_COLN, KC_TAB,
                                                      KC_HASH, KC_FN7,
                                                              KC_FN6,
                                                      KC_HASH, GRV_NO,
                                                              ACUT_NO,
                                               OSM(MOD_LSFT),CTL_T(KC_DOT),GUI_T(KC_COMMA),
        // right hand
             KC_FN5, NO_DLR, NO_LPRN, NO_RPRN ,KC_FN3, KC_FN4,NO_AT,
             CIRC_NO, NO_DLR, NO_LPRN, NO_RPRN ,LESS_NO, GRTR_NO,NO_AT,
             NO_QUOT,      KC_J,    KC_L,    KC_U,      KC_Y,     NO_ARNG, NO_AE  ,
                           KC_H,    KC_N,    KC_E,      KC_I,      KC_O,    NO_OSTR,
             NO_EQL,        KC_K,    KC_M, KC_RIGHT,  KC_DOWN,   KC_UP,    NO_BSLS,


@@ 78,10 90,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
       KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
       KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
                                           KC_TRNS, ALGR(NO_BSLS),
                                                    KC_FN10,
                                                    ACUT_NO_MAC,
                                  KC_TRNS,GUI_T(KC_DOT) , CTL_T(KC_COMMA),
    // right hand
       KC_TRNS,  S(NO_4), KC_TRNS,KC_TRNS,KC_FN8, KC_FN9,NO_QUOT,
       KC_TRNS,  S(NO_4), KC_TRNS,KC_TRNS,LESS_NO_MAC, GRTR_NO_MAC,NO_QUOT,
       NO_LABK,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
                 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
       KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, S(ALGR(NO_7)),


@@ 133,47 145,57 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
)
};

enum macro_id {
    TILDE_NO, LESS_NO, GRTR_NO, CIRC_NO, ACUT_NO,  GRV_NO, LESS_NO_MAC, GRTR_NO_MAC, ACUT_NO_MAC
};

const uint16_t PROGMEM fn_actions[] = {
    [2] = ACTION_MACRO(TILDE_NO), // Completed ~ character(pc and mac), no space needed.
    [3] = ACTION_MACRO(LESS_NO), // < completed on keypress down, to avoid shifting the next character if it is not released first.
    [4] = ACTION_MACRO(GRTR_NO), // > completed on keypress down, to avoid shifting the next character if it is not released first.
    [5] = ACTION_MACRO(CIRC_NO), // Completed ^ character, no space needed.
    [6] = ACTION_MACRO(ACUT_NO), // Completed ´ character, no space needed.
    [7] = ACTION_MACRO(GRV_NO), // Completed ` character, no space needed.
    [8] = ACTION_MACRO(LESS_NO_MAC), // < completed on keypress down, to avoid same button problem when typing <> quickly
    [9] = ACTION_MACRO(GRTR_NO_MAC), // > completed on keypress down, to avoid same button problem when typing <> quickly
    [10] = ACTION_MACRO(ACUT_NO_MAC), // Completed ´ character, no space needed
};



const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
    keyevent_t event = record->event;

    switch (id) {
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    switch (keycode) {
        case TILDE_NO:
            return (event.pressed ? MACRO( D(RALT), T(RBRC), U(RALT), T(SPC), END ) : MACRO_NONE);
            if (record->event.pressed) {
                tap_code16(ALGR(KC_RBRC));
                tap_code(KC_SPC);
            }
            return false;
        case LESS_NO:
            return (event.pressed ? MACRO( T(NUBS), END ) : MACRO_NONE);
            if (record->event.pressed) {
                tap_code(KC_NUBS);
            }
            return false;
        case GRTR_NO:
            return (event.pressed ? MACRO( D(LSFT), T(NUBS), U(LSFT), END ) : MACRO_NONE);
            if (record->event.pressed) {
                tap_code16(S(KC_NUBS));
            }
            return false;
        case CIRC_NO:
            return (event.pressed ? MACRO( D(LSFT), T(RBRC), U(LSFT), T(SPC), END ) : MACRO_NONE);
            if (record->event.pressed) {
                tap_code16(S(KC_RBRC));
                tap_code(KC_SPC);
            }
            return false;
        case ACUT_NO:
            return (event.pressed ? MACRO( D(RALT), T(EQL), U(RALT), T(SPC),  END ) : MACRO_NONE);
            if (record->event.pressed) {
                tap_code16(ALGR(KC_EQL));
                tap_code(KC_SPC);
            }
            return false;
        case GRV_NO:
            return (event.pressed ? MACRO( D(LSFT), T(EQL), T(SPC), U(LSFT),  END ) : MACRO_NONE);
            if (record->event.pressed) {
                SEND_STRING(SS_LSFT("= "));
            }
            return false;
        case LESS_NO_MAC:
            return (event.pressed ? MACRO( T(GRV), END ) : MACRO_NONE);
            if (record->event.pressed) {
                tap_code(KC_GRV);
            }
            return false;
        case GRTR_NO_MAC:
            return (event.pressed ? MACRO( D(LSFT), T(GRV), U(LSFT), END ) : MACRO_NONE);
            if (record->event.pressed) {
                tap_code16(S(KC_GRV));
            }
            return false;
        case ACUT_NO_MAC:
            return (event.pressed ? MACRO( T(EQL), T(SPC),  END ) : MACRO_NONE);
            if (record->event.pressed) {
                tap_code(KC_EQL);
                tap_code(KC_SPC);
            }
            return false;
    }
    return MACRO_NONE;
};
    return true;
}

M layouts/community/ergodox/osx_whiskey_tango_foxtrot_capslock/keymap.c => layouts/community/ergodox/osx_whiskey_tango_foxtrot_capslock/keymap.c +3 -3
@@ 49,7 49,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
        M(KC_CAPS), M(KC_A),  M(KC_S), M(KC_D), M(KC_F), M(KC_G),
        KC_LSFT,    M(KC_Z),  M(KC_X), M(KC_C), M(KC_V), M(KC_B), MO(SYMB),
        KC_LCTL,    KC_LALT,  KC_LGUI, KC_LEFT, KC_RGHT,
                                                         KC_TRNS, KC_FN1,
                                                         KC_TRNS, F(1),
                                                                  KC_HOME,
                                                KC_BSPC, KC_DEL,  KC_END,
        // right hand


@@ 91,7 91,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
       KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
       KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
               KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
                                               KC_FN3, KC_FN2,
                                               F(3),   F(2),
                                                       KC_TRNS,
                                       KC_TRNS,KC_TRNS,KC_TRNS,
       // right hand


@@ 132,7 132,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
       KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,
       KC_TRNS, KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,
       KC_TRNS, KC_TRNS, KC_TRNS, KC_NO,   KC_NO,
                                                    KC_FN4,  KC_NO,
                                                    F(4),    KC_NO,
                                                             KC_TRNS,
                                           KC_TRNS, KC_TRNS, KC_TRNS,
       // right hand

M layouts/community/ergodox/workman_osx_mdw/keymap.c => layouts/community/ergodox/workman_osx_mdw/keymap.c +1 -1
@@ 55,7 55,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
             TG(1),       KC_J,   KC_F,   KC_U,   KC_P,   KC_SCLN,          KC_BSLS,
                          KC_Y,   KC_N,   KC_E,   KC_O,   KC_I,             KC_QUOT,
             MEH_T(KC_NO),KC_K,   KC_L,   KC_COMM,KC_DOT, CTL_T(KC_SLSH),   KC_RSFT,
                                  KC_LEFT,KC_DOWN,KC_UP,  KC_RGHT,          KC_FN4,
                                  KC_LEFT,KC_DOWN,KC_UP,  KC_RGHT,          F(4),
             KC_NO,        KC_NO,
             KC_PGUP,
             KC_PGDN,KC_SPC,KC_ENT