rusty1s/dotfiles

View on GitHub
settings/tmk_keyboard/hhkb.c

Summary

Maintainability
Test Coverage
/*
 * HHKB Custom Keyboard Layout
 *
 * American HHKB Layout with following additions:
 * - german umlauts
 * - y and z swapped
 * - next, play/pause and prev media keys
 * - arrow keys on wasd
 * - ctrl layer/esc tap key
 * - shift oneshot modifier
 */
#include "keymap_common.h"


const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = {
  /* Layer 0: Default Layer
   * ,-----------------------------------------------------------.
   * |Esc|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|  \|  `|
   * |-----------------------------------------------------------|
   * |Tab  |  Q|  W|  E|  R|  T|  Z|  U|  I|  O|  P|  [|  ]|Backs|
   * |-----------------------------------------------------------|
   * |Fn1   |  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Enter   |
   * |-----------------------------------------------------------|
   * |Shift   |  Y|  X|  C|  V|  B|  N|  M|  ,|  .|  /|Shift |Fn0|
   * `-----------------------------------------------------------'
   *       |Alt|Gui  |         Space         |Gui  |Alt|
   *       `-------------------------------------------'
   */
  KEYMAP(ESC, 1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   MINS,EQL, BSLS,GRV,   \
      TAB, Q,   W,   E,   R,   T,   Z,   U,   I,   O,   P,   LBRC,RBRC,BSPC,       \
      FN1, A,   S,   D,   F,   G,   H,   J,   K,   L,   SCLN,QUOT,ENT,             \
      LSFT,Y,   X,   C,   V,   B,   N,   M,   COMM,DOT, SLSH,RSFT,FN0,             \
      LALT,LGUI,          SPC,                RGUI,RALT),

  /* Layer 1: Fn with umlauts
   * ,-----------------------------------------------------------.
   * |Sle| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del|
   * |-----------------------------------------------------------|
   * |Caps |   |Up |   |   |   |   |   |   |   |   |  Ü|  ß|     |
   * |-----------------------------------------------------------|
   * |      |Lef|Dow|Rig|   |   |   |   |   |   |  Ö|  Ä|        |
   * |-----------------------------------------------------------|
   * |        |Prv|Ply|Nxt|Mut|VoD|VoU|   |   |PgD|PgU|      |   |
   * `-----------------------------------------------------------'
   *       |   |     |                       |     |   |
   *       `-------------------------------------------'
   */
  KEYMAP(SLEP, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, INS, DEL,  \
      CAPS,TRNS,UP,  TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, FN4, FN5, TRNS,      \
      TRNS,LEFT,DOWN,RGHT,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, FN3, FN2,TRNS,            \
      TRNS,MPRV,MPLY,MNXT,MUTE,VOLD,VOLU,TRNS,TRNS,PGDN,PGUP,TRNS,TRNS,            \
      TRNS,TRNS,          TRNS,               TRNS,TRNS),
};

/*
 * Macro definiton
 */
enum macro_id {
  MAC_UMLAUT_A,
  MAC_UMLAUT_O,
  MAC_UMLAUT_U,
  MAC_UMLAUT_S,
};

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

  uint8_t hold_shift = 0;
  if (keyboard_report->mods & MOD_BIT(KC_LSFT)) {
    unregister_code(KC_LSFT);
    hold_shift = 1;
  }

  switch(id) {
    case MAC_UMLAUT_A:
      if (hold_shift) {
        return (event.pressed ?
            MACRO(D(LALT), T(U), U(LALT), D(LSHIFT), T(A), U(LSHIFT), END) :
            MACRO(END));
      } else {
        return (event.pressed ?
            MACRO(D(LALT), T(U), U(LALT), T(A), END) :
            MACRO(END));
      }
    case MAC_UMLAUT_O:
      if (hold_shift) {
        return (event.pressed ?
            MACRO(D(LALT), T(U), U(LALT), D(LSHIFT), T(O), U(LSHIFT), END) :
            MACRO(END));
      } else {
        return (event.pressed ?
            MACRO(D(LALT), T(U), U(LALT), T(O), END) :
            MACRO(END));
      }
    case MAC_UMLAUT_U:
      if (hold_shift) {
        return (event.pressed ?
            MACRO(D(LALT), T(U), U(LALT), D(LSHIFT), T(U), U(LSHIFT), END) :
            MACRO(END));
      } else {
        return (event.pressed ?
            MACRO(D(LALT), T(U), U(LALT), T(U), END) :
            MACRO(END));
      }
    case MAC_UMLAUT_S:
      return (event.pressed ?
          MACRO(D(LALT), T(S), U(LALT), END) :
          MACRO(END));
    default:
      return MACRO_NONE;
  }
}

/*
 * Fn action definition
 */
const action_t fn_actions[] PROGMEM = {
  [0]  = ACTION_LAYER_MOMENTARY(1),
  [1]  = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_ESC),
  [2]  = ACTION_MACRO(MAC_UMLAUT_A),
  [3]  = ACTION_MACRO(MAC_UMLAUT_O),
  [4]  = ACTION_MACRO(MAC_UMLAUT_U),
  [5]  = ACTION_MACRO(MAC_UMLAUT_S),
};