]> git.donarmstrong.com Git - qmk_firmware.git/commitdiff
ergodox: Update my keymap to v1.5
authorGergely Nagy <algernon@madhouse-project.org>
Fri, 12 Aug 2016 14:36:07 +0000 (16:36 +0200)
committerGergely Nagy <algernon@madhouse-project.org>
Fri, 12 Aug 2016 14:36:07 +0000 (16:36 +0200)
Major changes include:

* The **1HAND** layer has been removed.
* A `Delete` key is now available on the right thumb cluster.
* The **ADORE** layer received a major update, see the updated layout
  image.
* It is now possible to enable automatic logging for the **ADORE**
  layer, by setting the `ADORE_AUTOLOG` makefile variable to `yes` when
  compiling the keymap. It is off by default.
* The `~` key and the `Media Next/Prev` key have been swapped on
  the **base** layer.
* On the **ARROW** layer, `Backspace` has been replaced by `Enter`.
* There is some experimental support for entering Unicode symbols.

Signed-off-by: Gergely Nagy <algernon@madhouse-project.org>
keyboards/ergodox/keymaps/algernon/Makefile
keyboards/ergodox/keymaps/algernon/images/adore-layer.png
keyboards/ergodox/keymaps/algernon/images/base-layer.png
keyboards/ergodox/keymaps/algernon/images/one-handed-layer.png [deleted file]
keyboards/ergodox/keymaps/algernon/keymap.c
keyboards/ergodox/keymaps/algernon/readme.md

index 6bf3976b9d2cbdffa690985803612b68adf47f59..00194857ac30f284826d371c3b16f8ada1be8448 100644 (file)
@@ -8,10 +8,17 @@ CONSOLE_ENABLE = no
 TAP_DANCE_ENABLE = yes
 KEYLOGGER_ENABLE ?= yes
 
+ADORE_AUTOLOG ?= no
+
 ifeq (${FORCE_NKRO},yes)
 OPT_DEFS += -DFORCE_NKRO
 endif
 
+ifeq (${ADORE_AUTOLOG},yes)
+KEYLOGGER_ENABLE = yes
+OPT_DEFS += -DADORE_AUTOLOG
+endif
+
 ifeq (${KEYLOGGER_ENABLE},yes)
 OPT_DEFS += -DKEYLOGGER_ENABLE
 CONSOLE_ENABLE = yes
index 3df68ea53da8a4be15cfbfe4dac5f0623bc0d0ad..44ad8a1eb7560b552aa6010b2051fcabb00f01cd 100644 (file)
Binary files a/keyboards/ergodox/keymaps/algernon/images/adore-layer.png and b/keyboards/ergodox/keymaps/algernon/images/adore-layer.png differ
index 7b25a05b3afa30354fa240925b959233b88fea96..da159fbe2ec5e8e084fee3b9ae934b8c1f5aadab 100644 (file)
Binary files a/keyboards/ergodox/keymaps/algernon/images/base-layer.png and b/keyboards/ergodox/keymaps/algernon/images/base-layer.png differ
diff --git a/keyboards/ergodox/keymaps/algernon/images/one-handed-layer.png b/keyboards/ergodox/keymaps/algernon/images/one-handed-layer.png
deleted file mode 100644 (file)
index 698d11e..0000000
Binary files a/keyboards/ergodox/keymaps/algernon/images/one-handed-layer.png and /dev/null differ
index c4de53da27c14cc9172e87951696830cfeaea62e..244bfb51fe467da1e3e291a5ce8d713fe4c98af1 100644 (file)
-/*\r
- * algernon's ErgoDox EZ layout, please see the readme.md file!\r
- */\r
-\r
-#include "ergodox.h"\r
-#include "led.h"\r
-#include "debug.h"\r
-#include "action_layer.h"\r
-#include "action_util.h"\r
-#include "mousekey.h"\r
-#include "timer.h"\r
-#include "keymap_plover.h"\r
-#include "eeconfig.h"\r
-#include "wait.h"\r
+/*
+ * algernon's ErgoDox EZ layout, please see the readme.md file!
+ */
+
+#include "ergodox.h"
+#include "led.h"
+#include "debug.h"
+#include "action_layer.h"
+#include "action_util.h"
+#include "mousekey.h"
+#include "timer.h"
+#include "keymap_plover.h"
+#include "eeconfig.h"
+#include "wait.h"
 #include "version.h"
-\r
-/* Layers */\r
-\r
-enum {\r
-  BASE = 0,\r
-  ADORE,\r
-  ARRW,\r
-  APPSEL,\r
-  HUN,\r
-  NMDIA,\r
-  OHLFT,\r
-  OHRGT,\r
-  PLVR,\r
-};\r
-\r
-/* Macros */\r
-\r
-enum {\r
-  NONE = 0,\r
-  // Buttons that do extra stuff\r
-  A_GUI,\r
-  A_PLVR,\r
-  A_ESC,\r
-  A_MPN,\r
-\r
-  // Function / number keys\r
-  KF_1, // 1, F1\r
-  KF_2, // 2, F2\r
-  KF_3, // ...\r
-  KF_4,\r
-  KF_5,\r
-  KF_6,\r
-  KF_7,\r
-  KF_8,\r
-  KF_9,\r
-  KF_10,\r
-  KF_11, // =, F11\r
-\r
-  // Application select keys\r
-  APP_SLK, // Slack\r
-  APP_EMCS, // Emacs\r
-  APP_TERM, // Terminal\r
-  APP_CHRM, // Chrome\r
-  APP_MSIC, // Music\r
-\r
-  // Diagonal mouse movement\r
-  A_MUL,\r
-  A_MUR,\r
-  A_MDL,\r
-  A_MDR,\r
-\r
-  // Hungarian layer keys\r
-  HU_AA, // Á\r
-  HU_OO, // Ó\r
-  HU_EE, // É\r
-  HU_UU, // Ú\r
-  HU_II, // Í\r
-  HU_OE, // Ö\r
-  HU_UE, // Ü\r
-  HU_OEE, // Ő\r
-  HU_UEE, // Ű\r
-\r
-  // One-handed layout specials\r
-  OH_BSSPC,\r
-  OH_ENTSFT,\r
-  OH_BASE,\r
-  OH_LEFT,\r
-  OH_RIGHT,\r
-};\r
-\r
-/* Fn keys */\r
-\r
-enum {\r
-  F_BSE = 0,\r
-  F_HUN,\r
-  F_GUI,\r
-  F_SFT,\r
-  F_ALT,\r
-  F_CTRL\r
-};\r
-\r
-/* Custom keycodes */\r
-\r
-enum {\r
-  CT_CLN = 0,\r
-  CT_MNS,\r
-  CT_TA,\r
-};\r
-\r
-/* States & timers */\r
-\r
-uint16_t gui_timer = 0;\r
-\r
-uint16_t kf_timers[12];\r
-\r
-uint16_t oh_base_timer = 0;\r
-uint16_t oh_bsspc_timer = 0;\r
-uint16_t oh_entsft_timer = 0;\r
-\r
-#define OH_BLINK_INTERVAL 500\r
-\r
-uint8_t oh_left_blink = 0;\r
-uint16_t oh_left_blink_timer = 0;\r
-uint8_t oh_right_blink = 0;\r
-uint16_t oh_right_blink_timer = 0;\r
-\r
-#if KEYLOGGER_ENABLE\r
-bool log_enable = false;\r
-#endif\r
-\r
-bool time_travel = false;\r
-\r
-/* The Keymap */\r
-\r
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {\r
-\r
-/* Keymap 0: Base Layer\r
- *\r
- * ,-----------------------------------------------------.           ,-----------------------------------------------------.\r
- * |        `~ | 1 F1 | 2 F2 | 3 F3 | 4 F4 | 5 F5 | Plvr |           | Apps | 6 F6 | 7 F7 | 8 F8 | 9 F9 | 0 F10|       F11 |\r
- * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|\r
- * | Next/Prev |   '  |   ,  |   .  |   P  |   Y  |   [  |           |  ]   |   F  |   G  |   C  |   R  |  L   | \         |\r
- * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|\r
- * | Tab/ARROW |   A  |   O  |   E  |   U  |   I  |------|           |------|   D  |   H  |   T  |   N  |  S   | = / Arrow |\r
- * |-----------+------+------+------+------+------|   (  |           |  )   |------+------+------+------+------+-----------|\r
- * | Play/Pause|   /  |   Q  |   J  |   K  |   X  |      |           |      |   B  |   M  |   W  |   V  |  Z   |      Stop |\r
- * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'\r
- *     |       |      |      |      |   :  |                                       |   -  |      |      |      |       |\r
- *     `-----------------------------------'                                       `-----------------------------------'\r
- *                                         ,-------------.           ,-------------.\r
- *                                         | LAlt | GUI  |           | MDIA | 1HND |\r
- *                                  ,------|------|------|           |------+------+------.\r
- *                                  |      |      | Ctrl |           | LEAD |      |      |\r
- *                                  |Backsp|LShift|------|           |------| Enter| Space|\r
- *                                  |      |      | ESC  |           | HUN  |      |      |\r
- *                                  `--------------------'           `--------------------'\r
- */\r
-[BASE] = KEYMAP(\r
-// left hand\r
- KC_GRV             ,M(KF_1)     ,M(KF_2)     ,M(KF_3),M(KF_4),M(KF_5),M(A_PLVR)\r
-,M(A_MPN)           ,KC_QUOT     ,KC_COMM     ,KC_DOT ,KC_P   ,KC_Y   ,KC_LBRC\r
-,TD(CT_TA)          ,KC_A        ,KC_O        ,KC_E   ,KC_U   ,KC_I\r
-,KC_MPLY            ,KC_SLSH     ,KC_Q        ,KC_J   ,KC_K   ,KC_X   ,KC_LPRN\r
-,KC_NO              ,KC_NO       ,KC_NO       ,KC_NO  ,TD(CT_CLN)\r
-\r
-                                                            ,F(F_ALT),F(F_GUI)\r
-                                                                     ,F(F_CTRL)\r
-                                                    ,KC_BSPC,F(F_SFT),M(A_ESC)\r
-\r
-                                                                // right hand\r
-                                                               ,KC_APP    ,M(KF_6),M(KF_7)   ,M(KF_8),M(KF_9) ,M(KF_10) ,KC_F11\r
-                                                               ,KC_RBRC   ,KC_F   ,KC_G      ,KC_C   ,KC_R    ,KC_L     ,KC_BSLS\r
-                                                                          ,KC_D   ,KC_H      ,KC_T   ,KC_N    ,KC_S     ,KC_EQL\r
-                                                               ,KC_RPRN   ,KC_B   ,KC_M      ,KC_W   ,KC_V    ,KC_Z     ,KC_MSTP\r
-                                                                                  ,TD(CT_MNS),KC_NO  ,KC_NO   ,KC_NO    ,KC_NO\r
-\r
-                                                               ,OSL(NMDIA),M(OH_LEFT)\r
-                                                               ,KC_LEAD\r
-                                                               ,F(F_HUN)  ,KC_ENT ,KC_SPC\r
-    ),\r
-\r
-/* Keymap 1: Adore layer\r
- *\r
- * ,-----------------------------------------------------.           ,-----------------------------------------------------.\r
- * |        `~ | 1 F1 | 2 F2 | 3 F3 | 4 F4 | 5 F5 | Plvr |           | Apps | 6 F6 | 7 F7 | 8 F8 | 9 F9 | 0 F10|       F11 |\r
- * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|\r
- * | Next/Prev |   ,  |   .  |   L  |   W  |   M  |   [  |           |  ]   |   F  |   H  |   C  |   P  |  Y   | \         |\r
- * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|\r
- * | Tab/Arrow |   A  |   O  |   E  |   I  |   U  |------|           |------|   D  |   R  |   T  |   N  |  S   | = / Arrow |\r
- * |-----------+------+------+------+------+------|   (  |           |  )   |------+------+------+------+------+-----------|\r
- * | Play/Pause|   /  |   Z  |   '  |   K  |   X  |      |           |      |   B  |   G  |   V  |   J  |  Q   |      Stop |\r
- * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'\r
- *     |       |      |      |      |   :  |                                       |   -  |      |      |      |       |\r
- *     `-----------------------------------'                                       `-----------------------------------'\r
- *                                         ,-------------.           ,-------------.\r
- *                                         | LAlt | GUI  |           | MDIA | 1HND |\r
- *                                  ,------|------|------|           |------+------+------.\r
- *                                  |      |      | Ctrl |           | LEAD |      |      |\r
- *                                  |Backsp|LShift|------|           |------| Enter| Space|\r
- *                                  |      |      | ESC  |           | HUN  |      |      |\r
- *                                  `--------------------'           `--------------------'\r
- */\r
-[ADORE] = KEYMAP(\r
-// left hand\r
- KC_GRV             ,M(KF_1)     ,M(KF_2)     ,M(KF_3),M(KF_4),M(KF_5),M(A_PLVR)\r
-,M(A_MPN)           ,KC_COMM     ,KC_DOT      ,KC_L   ,KC_W   ,KC_M   ,KC_LBRC\r
-,TD(CT_TA)          ,KC_A        ,KC_O        ,KC_E   ,KC_I   ,KC_U\r
-,KC_MPLY            ,KC_SLSH     ,KC_Z        ,KC_QUOT,KC_K   ,KC_X   ,KC_LPRN\r
-,KC_NO              ,KC_NO       ,KC_NO       ,KC_NO  ,TD(CT_CLN)\r
-\r
-                                                            ,F(F_ALT),F(F_GUI)\r
-                                                                     ,F(F_CTRL)\r
-                                                    ,KC_BSPC,F(F_SFT),M(A_ESC)\r
-\r
-                                                                // right hand\r
-                                                               ,KC_APP    ,M(KF_6),M(KF_7)   ,M(KF_8),M(KF_9) ,M(KF_10) ,KC_F11\r
-                                                               ,KC_RBRC   ,KC_F   ,KC_H      ,KC_C   ,KC_P    ,KC_Y     ,KC_BSLS\r
-                                                                          ,KC_D   ,KC_R      ,KC_T   ,KC_N    ,KC_S     ,KC_EQL\r
-                                                               ,KC_RPRN   ,KC_B   ,KC_G      ,KC_V   ,KC_J    ,KC_Q     ,KC_MSTP\r
-                                                                                  ,TD(CT_MNS),KC_NO  ,KC_NO   ,KC_NO    ,KC_NO\r
-\r
-                                                               ,OSL(NMDIA),M(OH_LEFT)\r
-                                                               ,KC_LEAD\r
-                                                               ,F(F_HUN)  ,KC_ENT ,KC_SPC\r
-    ),\r
-\r
-/* Keymap 2: Arrow layer\r
- *\r
- * ,-----------------------------------------------------.           ,-----------------------------------------------------.\r
- * |           |      |      |      |      |      |      |           |      |      |      |      |      |      |           |\r
- * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|\r
- * |           |      |      |      |      |      |      |           |      |      | Home |  Up  |  End |      |           |\r
- * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|\r
- * |           |      |      |      |      |      |------|           |------|      | Left | Down | Rght |      |           |\r
- * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|\r
- * |           |      |      |      |      |      |      |           |      |      |      |      |      |      |           |\r
- * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'\r
- *      |      |      |      |      |      |                                       |      |      |      |      |      |\r
- *      `----------------------------------'                                       `----------------------------------'\r
- *                                         ,-------------.           ,-------------.\r
- *                                         |      |      |           |      |      |\r
- *                                  ,------|------|------|           |------+------+------.\r
- *                                  |      |      |      |           |      |      |      |\r
- *                                  |      |      |------|           |------| PgUp | PgDn |\r
- *                                  |      |      |      |           |      |      |      |\r
- *                                  `--------------------'           `--------------------'\r
- */\r
-\r
-[ARRW] = KEYMAP(\r
-// left hand\r
- KC_TRNS ,KC_TRNS    ,KC_TRNS   ,KC_TRNS    ,KC_TRNS    ,KC_TRNS    ,KC_TRNS\r
-,KC_TRNS ,KC_TRNS    ,KC_TRNS   ,KC_TRNS    ,KC_TRNS    ,KC_TRNS    ,KC_TRNS\r
-,KC_TRNS ,KC_TRNS    ,KC_TRNS   ,KC_TRNS    ,KC_TRNS    ,KC_TRNS\r
-,KC_TRNS ,KC_TRNS    ,KC_TRNS   ,KC_TRNS    ,KC_TRNS    ,KC_TRNS    ,KC_TRNS\r
-,KC_TRNS ,KC_TRNS    ,KC_TRNS   ,KC_TRNS    ,KC_TRNS\r
-\r
-                                             ,KC_TRNS ,KC_TRNS\r
-                                                      ,KC_TRNS\r
-                                    ,KC_TRNS ,KC_TRNS ,KC_TRNS\r
-\r
-                                                                // right hand\r
-                                                               ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS\r
-                                                               ,KC_TRNS ,KC_TRNS ,KC_HOME ,KC_UP   ,KC_END  ,KC_TRNS ,KC_TRNS\r
-                                                                        ,KC_TRNS ,KC_LEFT ,KC_DOWN ,KC_RGHT ,KC_TRNS ,KC_TRNS\r
-                                                               ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS\r
-                                                                                 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS\r
-\r
-                                                               ,KC_TRNS ,KC_TRNS\r
-                                                               ,KC_TRNS\r
-                                                               ,KC_TRNS ,KC_PGUP ,KC_PGDN\r
-    ),\r
-\r
-/* Keymap 3: Application select layer\r
- *\r
- * ,-----------------------------------------------------.           ,-----------------------------------------------------.\r
- * |           |Music |Slack |Emacs |Term  |Chrome|      |           |      |      |      |      |      |      |           |\r
- * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|\r
- * |           |      |      |      |      |      |      |           |      |      |      |      |      |      |           |\r
- * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|\r
- * |           |      |      |      |      |      |------|           |------|      |      |      |      |      |           |\r
- * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|\r
- * |           |      |      |      |      |      |      |           |      |      |      |      |      |      |           |\r
- * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'\r
- *      |      |      |      |      |      |                                       |      |      |      |      |      |\r
- *      `----------------------------------'                                       `----------------------------------'\r
- *                                         ,-------------.           ,-------------.\r
- *                                         |      |      |           |      |      |\r
- *                                  ,------|------|------|           |------+------+------.\r
- *                                  |      |      |      |           |      |      |      |\r
- *                                  |      |      |------|           |------|      |      |\r
- *                                  |      |      |      |           |      |      |      |\r
- *                                  `--------------------'           `--------------------'\r
- */\r
-\r
-[APPSEL] = KEYMAP(\r
-// left hand\r
- KC_TRNS ,M(APP_MSIC),M(APP_SLK),M(APP_EMCS),M(APP_TERM),M(APP_CHRM),KC_TRNS\r
-,KC_TRNS ,KC_TRNS    ,KC_TRNS   ,KC_TRNS    ,KC_TRNS    ,KC_TRNS    ,KC_TRNS\r
-,KC_TRNS ,KC_TRNS    ,KC_TRNS   ,KC_TRNS    ,KC_TRNS    ,KC_TRNS\r
-,KC_TRNS ,KC_TRNS    ,KC_TRNS   ,KC_TRNS    ,KC_TRNS    ,KC_TRNS    ,KC_TRNS\r
-,KC_TRNS ,KC_TRNS    ,KC_TRNS   ,KC_TRNS    ,KC_TRNS\r
-\r
-                                             ,KC_TRNS ,KC_TRNS\r
-                                                      ,KC_TRNS\r
-                                    ,KC_TRNS ,KC_TRNS ,KC_TRNS\r
-\r
-                                                                // right hand\r
-                                                               ,KC_TRNS ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_TRNS\r
-                                                               ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS\r
-                                                                        ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS\r
-                                                               ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS\r
-                                                                                 ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS\r
-\r
-                                                               ,KC_TRNS ,KC_TRNS\r
-                                                               ,KC_TRNS\r
-                                                               ,KC_TRNS ,KC_TRNS  ,KC_TRNS\r
-    ),\r
-\r
-\r
-/* Keymap 4: Hungarian Layer\r
- *\r
- * ,-----------------------------------------------------.           ,-----------------------------------------------------.\r
- * |           |      |      |      |      |      |      |           |      |      |      |      |      |      |           |\r
- * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|\r
- * |           |      |  Ő   |      |  Ű   |      |      |           |      |      |      |      |      |      |           |\r
- * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|\r
- * |           |   Á  |  Ó   |  É   |  Ú   |  Í   |------|           |------|      |      |      |      |      |           |\r
- * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|\r
- * |           |      |  Ö   |      |  Ü   |      |      |           |      |      |      |      |      |      |           |\r
- * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'\r
- *      |      |      |      |      |      |                                       |      |      |      |      |      |\r
- *      `----------------------------------'                                       `----------------------------------'\r
- *                                         ,-------------.           ,-------------.\r
- *                                         |      |      |           |      |      |\r
- *                                  ,------|------|------|           |------+------+------.\r
- *                                  |      |      |      |           |      |      |      |\r
- *                                  |      |      |------|           |------|      |      |\r
- *                                  |      |      |      |           | BASE |      |      |\r
- *                                  `--------------------'           `--------------------'\r
- */\r
-\r
-[HUN] = KEYMAP(\r
-// left hand\r
- KC_NO   ,KC_NO   ,KC_NO    ,KC_NO   ,KC_NO    ,KC_NO   ,KC_NO\r
-,KC_NO   ,KC_NO   ,M(HU_OEE),KC_NO   ,M(HU_UEE),KC_NO   ,KC_NO\r
-,KC_NO   ,M(HU_AA),M(HU_OO) ,M(HU_EE),M(HU_UU) ,M(HU_II)\r
-,KC_NO   ,KC_NO   ,M(HU_OE) ,KC_NO   ,M(HU_UE) ,KC_NO   ,KC_NO\r
-,KC_NO   ,KC_NO   ,KC_NO    ,KC_NO   ,KC_NO\r
-\r
-                                             ,KC_NO   ,KC_NO\r
-                                                      ,KC_NO\r
-                                    ,KC_NO   ,KC_TRNS ,KC_TRNS\r
-\r
-                                                                // right hand\r
-                                                               ,KC_TRNS ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO\r
-                                                               ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO\r
-                                                                        ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO\r
-                                                               ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO\r
-                                                                                 ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO\r
-\r
-                                                               ,KC_NO   ,KC_NO\r
-                                                               ,KC_NO\r
-                                                               ,F(F_BSE),KC_TRNS  ,KC_TRNS\r
-    ),\r
-\r
-/* Keymap 5: Navigation & Media layer\r
- *\r
- * ,-----------------------------------------------------.           ,-----------------------------------------------------.\r
- * | MS Slow   |      |      |      |      |      |ScrLCK|           |ScrLCK|      |      |      |      |      |           |\r
- * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|\r
- * | MS Normal |      | Home |  Up  | PgUp |      |      |           |Scroll|      |MsUpL | MsUp |MsUpR |      |PrintScreen|\r
- * |-----------+------+------+------+------+------|      |           |  Up  |------+------+------+------+------+-----------|\r
- * | MS Fast   |      | Left | Down | Right|      |------|           |------|      |MsLeft| MsDn |MsRght|      |           |\r
- * |-----------+------+------+------+------+------|      |           |Scroll|------+------+------+------+------+-----------|\r
- * | Play/Pause|      | End  | Down | PgDn |      |      |           | Down |      |MsDnL | MsDn |MsDnR |      |      Stop |\r
- * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'\r
- *      |      |      |      |      |      |                                       |      |      |      |      |      |\r
- *      `----------------------------------'                                       `----------------------------------'\r
- *                                         ,-------------.           ,-------------.\r
- *                                         | Mute | VlUp |           | BASE | MClk |\r
- *                                  ,------|------|------|           |------+------+------.\r
- *                                  |      |      | VlDn |           | Prev |Left  |Right |\r
- *                                  |  SPC | Enter|------|           |------| Click| Click|\r
- *                                  |      |      | ESC  |           | Next |      |      |\r
- *                                  `--------------------'           `--------------------'\r
- */\r
-[NMDIA] = KEYMAP(\r
-// left hand\r
- KC_ACL0    ,KC_NO       ,KC_NO      ,KC_NO   ,KC_NO   ,KC_NO   ,LGUI(KC_L)\r
-,KC_ACL1    ,KC_NO       ,KC_HOME    ,KC_UP   ,KC_PGUP ,KC_NO   ,KC_NO\r
-,KC_ACL2    ,KC_NO       ,KC_LEFT    ,KC_DOWN ,KC_RIGHT,KC_NO\r
-,KC_MPLY    ,KC_NO       ,KC_END     ,KC_DOWN ,KC_PGDN ,KC_NO   ,KC_NO\r
-,KC_NO      ,KC_NO       ,KC_NO      ,KC_NO   ,KC_NO\r
-                                                        ,KC_MUTE ,KC_VOLU\r
-                                                                 ,KC_VOLD\r
-                                                 ,KC_SPC,KC_ENTER,M(A_ESC)\r
-\r
-                                                                     // right hand\r
-                                                                     ,LGUI(KC_L),KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO    ,KC_NO\r
-                                                                     ,KC_WH_U   ,KC_NO   ,M(A_MUL),KC_MS_U ,M(A_MUR),KC_NO    ,KC_PSCR\r
-                                                                                ,KC_NO   ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_NO    ,KC_NO\r
-                                                                     ,KC_WH_D   ,KC_NO   ,M(A_MDL),KC_MS_D ,M(A_MDR),KC_NO    ,KC_MSTP\r
-                                                                                         ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO    ,KC_NO\r
-\r
-                                                                     ,KC_TRNS   ,KC_MS_BTN3\r
-                                                                     ,KC_MPRV\r
-                                                                     ,KC_MNXT   ,KC_BTN1 ,KC_BTN2\r
-    ),\r
-\r
-/* Keymap 6: One-handed, left side\r
- *\r
- * ,-----------------------------------------------------.\r
- * |        `~ | 1 F1 | 2 F2 | 3 F3 | 4 F4 | 5 F5 |A  BSE|\r
- * |-----------+------+------+------+------+-------------|\r
- * |       Tab |   '  |   ,  |   .  |   P  |   Y  |   [  |\r
- * |-----------+------+------+------+------+------|      |\r
- * |         - |   A  |   O  |   E  |   U  |   I  |------|\r
- * |-----------+------+------+------+------+------|   (  |\r
- * | Play/Pause|   ;  |   Q  |   J  |   K  |   X  |      |\r
- * `-----------+------+------+------+------+-------------'\r
- *     |  Home | End  | Down |  Up  | ESC  |\r
- *     `-----------------------------------'\r
- *                                         ,-------------.\r
- *                                         | LAlt | GUI  |\r
- *                                  ,------|------|------|\r
- *                                  |BackSp|LShift| Ctrl |\r
- *                                  |      |      |------|\r
- *                                  |Space |Enter |OTHER |\r
- *                                  `--------------------'\r
- */\r
-[OHLFT] = KEYMAP(\r
-// left hand\r
- KC_GRV     ,M(KF_1)     ,M(KF_2)     ,M(KF_3)   ,M(KF_4)    ,M(KF_5) ,M(OH_BASE)\r
-,KC_TAB     ,KC_QUOT     ,KC_COMM     ,KC_DOT    ,KC_P       ,KC_Y    ,KC_LBRC\r
-,KC_MINS    ,KC_A        ,KC_O        ,KC_E      ,KC_U       ,KC_I\r
-,KC_MPLY    ,KC_SCLN     ,KC_Q        ,KC_J      ,KC_K       ,KC_X    ,KC_LPRN\r
-,KC_HOME    ,KC_END      ,KC_DOWN     ,KC_UP     ,M(A_ESC)\r
-\r
-                                                                ,KC_TRNS     ,KC_TRNS\r
-                                                                             ,KC_TRNS\r
-                                                    ,M(OH_BSSPC),M(OH_ENTSFT),M(OH_RIGHT)\r
-\r
-                                                                // right hand\r
-                                                               ,KC_NO   ,KC_NO  ,KC_NO  ,KC_NO  ,KC_NO       ,KC_NO       ,KC_NO\r
-                                                               ,KC_NO   ,KC_NO  ,KC_NO  ,KC_NO  ,KC_NO       ,KC_NO       ,KC_NO\r
-                                                                        ,KC_NO  ,KC_NO  ,KC_NO  ,KC_NO       ,KC_NO       ,KC_NO\r
-                                                               ,KC_NO   ,KC_NO  ,KC_NO  ,KC_NO  ,KC_NO       ,KC_NO       ,KC_NO\r
-                                                                                ,KC_NO  ,KC_NO  ,KC_NO       ,KC_NO       ,KC_NO\r
-\r
-                                                               ,KC_NO   ,KC_NO\r
-                                                               ,KC_NO\r
-                                                               ,KC_NO   ,KC_NO  ,KC_NO\r
-    ),\r
-\r
-/* Keymap 7: One-handed, right side\r
- *\r
- * ,-----------------------------------------------------.\r
- * | =     F11 | 0 F10| 9 F9 | 8 F8 | 7 F7 | 6 F6 |A  BSE|\r
- * |-----------+------+------+------+------+-------------|\r
- * |         / |   L  |   R  |   C  |   G  |   F  |   ]  |\r
- * |-----------+------+------+------+------+------|      |\r
- * |         \ |   S  |   N  |   T  |   H  |   D  |------|\r
- * |-----------+------+------+------+------+------|   )  |\r
- * |      Stop |   Z  |   V  |   W  |   M  |   B  |      |\r
- * `-----------+------+------+------+------+-------------'\r
- *     |  PgDn | PgUp | Right| Left | ESC  |\r
- *     `-----------------------------------'\r
- *                                         ,-------------.\r
- *                                         | LAlt | GUI  |\r
- *                                  ,------|------|------|\r
- *                                  |BackSp|LShift| Ctrl |\r
- *                                  |      |      |------|\r
- *                                  |Space |Enter |OTHER |\r
- *                                  `--------------------'\r
- */\r
-[OHRGT] = KEYMAP(\r
-// left hand\r
- M(KF_11)   ,M(KF_10)    ,M(KF_9)     ,M(KF_8)   ,M(KF_7)    ,M(KF_6) ,M(OH_BASE)\r
-,KC_SLSH    ,KC_L        ,KC_R        ,KC_C      ,KC_G       ,KC_F    ,KC_RBRC\r
-,KC_BSLS    ,KC_S        ,KC_N        ,KC_T      ,KC_H       ,KC_D\r
-,KC_MSTP    ,KC_Z        ,KC_V        ,KC_W      ,KC_M       ,KC_B    ,KC_RPRN\r
-,KC_PGDN    ,KC_PGUP     ,KC_RGHT     ,KC_LEFT   ,M(A_ESC)\r
-\r
-                                                                ,KC_TRNS     ,KC_TRNS\r
-                                                                             ,KC_TRNS\r
-                                                    ,M(OH_BSSPC),M(OH_ENTSFT),M(OH_LEFT)\r
-\r
-                                                                // right hand\r
-                                                               ,KC_NO   ,KC_NO  ,KC_NO  ,KC_NO  ,KC_NO       ,KC_NO       ,KC_NO\r
-                                                               ,KC_NO   ,KC_NO  ,KC_NO  ,KC_NO  ,KC_NO       ,KC_NO       ,KC_NO\r
-                                                                        ,KC_NO  ,KC_NO  ,KC_NO  ,KC_NO       ,KC_NO       ,KC_NO\r
-                                                               ,KC_NO   ,KC_NO  ,KC_NO  ,KC_NO  ,KC_NO       ,KC_NO       ,KC_NO\r
-                                                                                ,KC_NO  ,KC_NO  ,KC_NO       ,KC_NO       ,KC_NO\r
-\r
-                                                               ,KC_NO   ,KC_NO\r
-                                                               ,KC_NO\r
-                                                               ,KC_NO   ,KC_NO  ,KC_NO\r
-    ),\r
-\r
-/* Keymap 8: Steno for Plover\r
- *\r
- * ,--------------------------------------------------.           ,--------------------------------------------------.\r
- * |        |      |      |      |      |      | BASE |           |      |      |      |      |      |      |        |\r
- * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|\r
- * |        |   #  |   #  |   #  |   #  |   #  |   #  |           |  #   |  #   |  #   |   #  |   #  |  #   |   #    |\r
- * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|\r
- * |        |      |   T  |   P  |   H  |      |------|           |------|      |  F   |   P  |   L  |  T   |   D    |\r
- * |--------+   S  +------+------+------+   *  |   *  |           |  *   |  *   +------+------+------+------+--------|\r
- * |        |      |   K  |   W  |   R  |      |      |           |      |      |  R   |   B  |   G  |  S   |   Z    |\r
- * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'\r
- *   |      |      |      |      |      |                                       |      |      |      |      |      |\r
- *   `----------------------------------'                                       `----------------------------------'\r
- *                                        ,-------------.       ,-------------.\r
- *                                        |      |      |       |      |      |\r
- *                                 ,------|------|------|       |------+------+------.\r
- *                                 |      |      |      |       |      |      |      |\r
- *                                 |   A  |   O  |------|       |------|  E   |  U   |\r
- *                                 |      |      |      |       |      |      |      |\r
- *                                 `--------------------'       `--------------------'\r
- */\r
-\r
-[PLVR] = KEYMAP(\r
-// left hand\r
-KC_NO,  KC_NO,  KC_NO,  KC_NO,   KC_NO,  KC_NO,   M(A_PLVR),\r
-KC_NO,  PV_NUM, PV_NUM, PV_NUM,  PV_NUM, PV_NUM,  PV_NUM,\r
-KC_NO,  PV_LS,  PV_LT,  PV_LP,   PV_LH,  PV_STAR,\r
-KC_NO,  PV_LS,  PV_LK,  PV_LW,   PV_LR,  PV_STAR, PV_STAR,\r
-KC_NO,  KC_NO,  KC_NO,  KC_NO,   KC_NO,\r
-                                           KC_NO, KC_NO,\r
-                                           KC_NO,\r
-                                           PV_A,  PV_O,  KC_NO,\r
-\r
-                                                 // right hand\r
-                                                 KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,\r
-                                                 PV_NUM,  PV_NUM,  PV_NUM,  PV_NUM,  PV_NUM,  PV_NUM,  PV_NUM,\r
-                                                          PV_STAR, PV_RF,   PV_RP,   PV_RL,   PV_RT,   PV_RD,\r
-                                                 PV_STAR, PV_STAR, PV_RR,   PV_RB,   PV_RG,   PV_RS,   PV_RZ,\r
-                                                                   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,\r
-                                           KC_NO,      KC_NO,\r
-                                           KC_NO,\r
-                                           KC_NO,PV_E, PV_U\r
- ),\r
-\r
-};\r
-\r
-const uint16_t PROGMEM fn_actions[] = {\r
-   [F_BSE]  = ACTION_LAYER_CLEAR(ON_PRESS)\r
-  ,[F_HUN]  = ACTION_LAYER_INVERT(HUN, ON_PRESS)\r
-  ,[F_GUI]  = ACTION_MACRO_TAP(A_GUI)\r
-  ,[F_SFT]  = ACTION_MODS_ONESHOT (MOD_LSFT)\r
-  ,[F_ALT]  = ACTION_MODS_ONESHOT (MOD_LALT)\r
-  ,[F_CTRL] = ACTION_MODS_ONESHOT (MOD_LCTL)\r
-};\r
-\r
-void toggle_steno(int pressed)\r
-{\r
-  uint8_t layer = biton32(layer_state);\r
-\r
-  if (pressed) {\r
-    if (layer != PLVR) layer_on(PLVR); else layer_off(PLVR);\r
-\r
-    register_code(PV_LP);\r
-    register_code(PV_LH);\r
-    register_code(PV_LR);\r
-    register_code(PV_O);\r
-    register_code(PV_RL);\r
-    register_code(PV_RG);\r
-  } else {\r
-    unregister_code(PV_LP);\r
-    unregister_code(PV_LH);\r
-    unregister_code(PV_LR);\r
-    unregister_code(PV_O);\r
-    unregister_code(PV_RL);\r
-    unregister_code(PV_RG);\r
-  }\r
-}\r
-\r
-macro_t *ang_do_hun (keyrecord_t *record, uint16_t accent, uint16_t hun_char)\r
-{\r
-  uint8_t need_shift = 0;\r
-  uint8_t hold_shift = 0;\r
-\r
-  if (!record->event.pressed)\r
-    return MACRO_NONE;\r
-\r
-  layer_off (HUN);\r
-\r
-  if (keyboard_report->mods & MOD_BIT (KC_LSFT)) {\r
-    hold_shift = 1;\r
-    need_shift = 1;\r
-    unregister_code (KC_LSFT);\r
-  }\r
-  if ((get_oneshot_mods () & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out ()) {\r
-    need_shift = 1;\r
-    hold_shift = 0;\r
-    unregister_code (KC_LSFT);\r
-  }\r
-\r
-  clear_oneshot_mods ();\r
-\r
-  register_code (KC_RALT);\r
-  unregister_code (KC_RALT);\r
-  if (accent == (KC_DQT)) {\r
-    register_code (KC_RSFT);\r
-  }\r
-  register_code (accent);\r
-  unregister_code (accent);\r
-  if (need_shift && accent != (KC_DQT)) {\r
-    register_code (KC_RSFT);\r
-  } else if (accent == (KC_DQT) && !need_shift) {\r
-    unregister_code (KC_RSFT);\r
-  }\r
-  register_code (hun_char);\r
-  unregister_code (hun_char);\r
-  if (need_shift || accent == (KC_DQT))\r
-    unregister_code (KC_RSFT);\r
-  if (hold_shift)\r
-    register_code (KC_LSFT);\r
-\r
-  return MACRO_NONE;\r
-}\r
-\r
-void ang_handle_kf (keyrecord_t *record, uint8_t id)\r
-{\r
-  uint8_t code = id - KF_1;\r
-\r
-  if (record->event.pressed) {\r
-    kf_timers[code] = timer_read ();\r
-  } else {\r
-    uint8_t kc;\r
-\r
-    if (timer_elapsed (kf_timers[code]) > TAPPING_TERM) {\r
-      // Long press\r
-      kc = KC_F1 + code;\r
-    } else {\r
-      if (id == KF_11)\r
-        kc = KC_EQL;\r
-      else\r
-        kc = KC_1 + code;\r
-    }\r
-\r
-    register_code (kc);\r
-    unregister_code (kc);\r
-  }\r
-}\r
-\r
-const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)\r
-{\r
-      switch(id) {\r
-      case A_ESC:\r
-        if (record->event.pressed) {\r
-          if ((get_oneshot_mods ()) && !has_oneshot_mods_timed_out ()) {\r
-            clear_oneshot_mods ();\r
-          } else {\r
-            register_code (KC_ESC);\r
-          }\r
-          layer_off (HUN);\r
-        } else {\r
-          unregister_code (KC_ESC);\r
-        }\r
-        break;\r
-\r
-      case A_MPN:\r
-        if (record->event.pressed) {\r
-          if (keyboard_report->mods & MOD_BIT(KC_LSFT) ||\r
-              ((get_oneshot_mods() & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out())) {\r
-            int oneshot = ((get_oneshot_mods() & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out());\r
-\r
-            if (oneshot)\r
-              clear_oneshot_mods ();\r
-            unregister_code (KC_LSFT);\r
-\r
-            register_code (KC_MPRV);\r
-            unregister_code (KC_MPRV);\r
-\r
-            if (!oneshot)\r
-              register_code (KC_LSFT);\r
-          } else {\r
-            return MACRO (T(MNXT), END);\r
-          }\r
-        }\r
-        break;\r
-\r
-        /* Hungarian layer */\r
-      case HU_AA:\r
-        return ang_do_hun (record, KC_QUOT, KC_A);\r
-      case HU_OO:\r
-        return ang_do_hun (record, KC_QUOT, KC_O);\r
-      case HU_EE:\r
-        return ang_do_hun (record, KC_QUOT, KC_E);\r
-      case HU_UU:\r
-        return ang_do_hun (record, KC_QUOT, KC_U);\r
-      case HU_II:\r
-        return ang_do_hun (record, KC_QUOT, KC_I);\r
-      case HU_OE:\r
-        return ang_do_hun (record, KC_DQT, KC_O);\r
-      case HU_UE:\r
-        return ang_do_hun (record, KC_DQT, KC_U);\r
-      case HU_OEE:\r
-        return ang_do_hun (record, KC_EQL, KC_O);\r
-      case HU_UEE:\r
-        return ang_do_hun (record, KC_EQL, KC_U);\r
-\r
-        /* Mouse movement */\r
-      case A_MUL:\r
-        if (record->event.pressed) {\r
-          mousekey_on(KC_MS_UP);\r
-          mousekey_on(KC_MS_LEFT);\r
-        } else {\r
-          mousekey_off(KC_MS_UP);\r
-          mousekey_off(KC_MS_LEFT);\r
-        }\r
-        mousekey_send();\r
-        break;\r
-\r
-      case A_MUR:\r
-        if (record->event.pressed) {\r
-          mousekey_on(KC_MS_UP);\r
-          mousekey_on(KC_MS_RIGHT);\r
-        } else {\r
-          mousekey_off(KC_MS_UP);\r
-          mousekey_off(KC_MS_RIGHT);\r
-        }\r
-        mousekey_send();\r
-        break;\r
-\r
-      case A_MDL:\r
-        if (record->event.pressed) {\r
-          mousekey_on(KC_MS_DOWN);\r
-          mousekey_on(KC_MS_LEFT);\r
-        } else {\r
-          mousekey_off(KC_MS_DOWN);\r
-          mousekey_off(KC_MS_LEFT);\r
-        }\r
-        mousekey_send();\r
-        break;\r
-\r
-      case A_MDR:\r
-        if (record->event.pressed) {\r
-          mousekey_on(KC_MS_DOWN);\r
-          mousekey_on(KC_MS_RIGHT);\r
-        } else {\r
-          mousekey_off(KC_MS_DOWN);\r
-          mousekey_off(KC_MS_RIGHT);\r
-        }\r
-        mousekey_send();\r
-        break;\r
-\r
-        /* Plover base */\r
-      case A_PLVR:\r
-        toggle_steno(record->event.pressed);\r
-        break;\r
-\r
-        /* GUI & AppSel */\r
-      case A_GUI:\r
-        if (record->event.pressed) {\r
-          register_code (KC_LGUI);\r
-          if (record->tap.count && !record->tap.interrupted) {\r
-            if (record->tap.count >= 2) {\r
-              register_code (KC_W);\r
-              layer_on (APPSEL);\r
-              set_oneshot_layer (APPSEL, ONESHOT_START);\r
-            }\r
-          } else {\r
-            record->tap.count = 0;\r
-          }\r
-          gui_timer = 0;\r
-        } else {\r
-          if (record->tap.count >= 2)\r
-            {\r
-              unregister_code (KC_W);\r
-              clear_oneshot_layer_state (ONESHOT_PRESSED);\r
-            }\r
-          gui_timer = timer_read ();\r
-        }\r
-        break;\r
-\r
-      case APP_SLK:\r
-        return MACRODOWN(T(S), T(L), T(A), T(C), T(K), T(ENT), END);\r
-\r
-      case APP_EMCS:\r
-        return MACRODOWN(T(E), T(M), T(A), T(C), T(S), T(ENT), END);\r
-\r
-      case APP_TERM:\r
-        return MACRODOWN(T(T), T(E), T(R), T(M), T(ENT), END);\r
-\r
-      case APP_CHRM:\r
-        return MACRODOWN(T(C), T(H), T(R), T(O), T(M), T(ENT), END);\r
-\r
-      case APP_MSIC:\r
-        return MACRODOWN(T(R), T(H), T(Y), T(T), T(H), T(M), T(B), T(O), T(X), T(ENT), END);\r
-\r
-        /* Function keys */\r
-      case KF_1 ... KF_11:\r
-        ang_handle_kf (record, id);\r
-        break;\r
-\r
-        /* 1HAND layout */\r
-      case OH_BASE:\r
-        if (record->event.pressed) {\r
-          oh_base_timer = timer_read ();\r
-        } else {\r
-          if (timer_elapsed (oh_base_timer) > TAPPING_TERM) {\r
-            layer_clear ();\r
-          } else {\r
-            return MACRO (T(APP), END);\r
-          }\r
-        }\r
-        break;\r
-\r
-      case OH_BSSPC:\r
-        if (record->event.pressed) {\r
-          oh_bsspc_timer = timer_read ();\r
-        } else {\r
-          if (timer_elapsed (oh_bsspc_timer) > TAPPING_TERM) {\r
-            return MACRO (T(BSPC), END);\r
-          } else {\r
-            return MACRO (T(SPC), END);\r
-          }\r
-        }\r
-        break;\r
-\r
-      case OH_ENTSFT:\r
-        if (record->event.pressed) {\r
-          oh_entsft_timer = timer_read ();\r
-        } else {\r
-          if (timer_elapsed (oh_entsft_timer) > TAPPING_TERM) {\r
-            if (keyboard_report->mods & MOD_BIT(KC_LSFT))\r
-              unregister_code (KC_LSFT);\r
-            else\r
-              register_code (KC_LSFT);\r
-          } else {\r
-            return MACRO (T(ENT), END);\r
-          }\r
-        }\r
-        break;\r
-\r
-      case OH_LEFT:\r
-        if (record->event.pressed) {\r
-          layer_move (OHLFT);\r
-          oh_left_blink = 1;\r
-          oh_left_blink_timer = timer_read ();\r
-          ergodox_right_led_1_on ();\r
-        }\r
-        break;\r
-\r
-      case OH_RIGHT:\r
-        if (record->event.pressed) {\r
-          layer_move (OHRGT);\r
-          oh_right_blink = 1;\r
-          oh_right_blink_timer = timer_read ();\r
-          ergodox_right_led_3_on ();\r
-        }\r
-        break;\r
-      }\r
-      return MACRO_NONE;\r
-};\r
-\r
-uint8_t is_adore = 0;\r
-\r
-// Runs just one time when the keyboard initializes.\r
-void matrix_init_user(void) {\r
-  uint8_t dl;\r
-\r
-  ergodox_led_all_on();\r
-  for (int i = LED_BRIGHTNESS_HI; i > LED_BRIGHTNESS_LO; i--) {\r
-    ergodox_led_all_set (i);\r
-    wait_ms (5);\r
-  }\r
-  wait_ms(1000);\r
-  for (int i = LED_BRIGHTNESS_LO; i > 0; i--) {\r
-    ergodox_led_all_set (i);\r
-    wait_ms (10);\r
-  }\r
-  ergodox_led_all_off();\r
-\r
-  if (!eeconfig_is_enabled())\r
-    eeconfig_init();\r
-  dl = eeconfig_read_default_layer ();\r
-  if (dl == (1UL << ADORE))\r
-    is_adore = 1;\r
-};\r
-\r
-LEADER_EXTERNS();\r
-\r
-void ang_do_unicode (void) {\r
-  register_code (KC_RCTL);\r
-  register_code (KC_RSFT);\r
-  register_code (KC_U);\r
-  unregister_code (KC_U);\r
-  unregister_code (KC_RSFT);\r
-  unregister_code (KC_RCTL);\r
-  wait_ms (100);\r
-}\r
-\r
-void ang_tap (uint16_t codes[]) {\r
-  for (int i = 0; codes[i] != 0; i++) {\r
-    register_code (codes[i]);\r
-    unregister_code (codes[i]);\r
-    wait_ms (50);\r
-  }\r
-}\r
-\r
-#define TAP_ONCE(code) \\r
-  register_code (code); \\r
-  unregister_code (code)\r
-\r
-void ang_tap_dance_cln_finished (qk_tap_dance_state_t *state, void *user_data) {\r
-  if (state->count == 1) {\r
-    register_code (KC_RSFT);\r
-    register_code (KC_SCLN);\r
-  } else if (state->count == 2) {\r
-    register_code (KC_SCLN);\r
-  }\r
-}\r
-\r
-void ang_tap_dance_cln_reset (qk_tap_dance_state_t *state, void *user_data) {\r
-  if (state->count == 1) {\r
-    unregister_code (KC_SCLN);\r
-    unregister_code (KC_RSFT);\r
-  } else if (state->count == 2) {\r
-    unregister_code (KC_SCLN);\r
-  }\r
-}\r
-\r
-void ang_tap_dance_mns_finished (qk_tap_dance_state_t *state, void *user_data) {\r
-  if (state->count == 1) {\r
-    register_code (KC_MINS);\r
-  } else if (state->count == 2) {\r
-    register_code (KC_RSFT);\r
-    register_code (KC_MINS);\r
-  }\r
-}\r
-\r
-void ang_tap_dance_mns_reset (qk_tap_dance_state_t *state, void *user_data) {\r
-  if (state->count == 1) {\r
-    unregister_code (KC_MINS);\r
-  } else if (state->count == 2) {\r
-    unregister_code (KC_RSFT);\r
-    unregister_code (KC_MINS);\r
-  }\r
-}\r
-\r
-typedef struct {\r
-  bool layer_toggle;\r
-  bool sticky;\r
-  bool finished_once;\r
-} td_ta_state_t;\r
-\r
-void ang_tap_dance_ta_finished (qk_tap_dance_state_t *state, void *user_data) {\r
-  td_ta_state_t *td_ta = (td_ta_state_t *) user_data;\r
-\r
-  if (td_ta->finished_once) {\r
-    return;\r
-  }\r
-\r
-  if (td_ta->sticky) {\r
-    td_ta->sticky = false;\r
-    td_ta->layer_toggle = false;\r
-    layer_off (ARRW);\r
-    return;\r
-  }\r
-\r
-  td_ta->finished_once = true;\r
-  if (state->count == 1 && !state->pressed) {\r
-    register_code (KC_TAB);\r
-    td_ta->sticky = false;\r
-    td_ta->layer_toggle = false;\r
-  } else {\r
-    td_ta->layer_toggle = true;\r
-    layer_on (ARRW);\r
-    td_ta->sticky = (state->count == 2);\r
-  }\r
-}\r
-\r
-void ang_tap_dance_ta_reset (qk_tap_dance_state_t *state, void *user_data) {\r
-  td_ta_state_t *td_ta = (td_ta_state_t *) user_data;\r
-\r
-  if (!td_ta->layer_toggle)\r
-    unregister_code (KC_TAB);\r
-  if (!td_ta->sticky)\r
-    layer_off (ARRW);\r
-\r
-  td_ta->finished_once = false;\r
-}\r
-\r
-const qk_tap_dance_action_t tap_dance_actions[] = {\r
-   [CT_CLN] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, ang_tap_dance_cln_finished, ang_tap_dance_cln_reset)\r
-  ,[CT_MNS] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, ang_tap_dance_mns_finished, ang_tap_dance_mns_reset)\r
-  ,[CT_TA]  = {\r
-     .fn = { NULL, ang_tap_dance_ta_finished, ang_tap_dance_ta_reset },\r
-     .user_data = (void *)&((td_ta_state_t) { false, false, false })\r
-   }\r
-};\r
-\r
-// Runs constantly in the background, in a loop.\r
-void matrix_scan_user(void) {\r
-  uint8_t layer = biton32(layer_state);\r
-\r
-  if (gui_timer && timer_elapsed (gui_timer) > TAPPING_TERM)\r
-    unregister_code (KC_LGUI);\r
-\r
-  if (layer != OHLFT)\r
-    oh_left_blink = 0;\r
-  if (layer != OHRGT)\r
-    oh_right_blink = 0;\r
-\r
-  if (layer == HUN) {\r
-    ergodox_right_led_2_on();\r
-    ergodox_right_led_3_on();\r
-  } else if (layer == NMDIA) {\r
-    ergodox_right_led_1_on();\r
-    ergodox_right_led_2_on();\r
-  } else if (layer == PLVR) {\r
-    ergodox_right_led_1_on ();\r
-    ergodox_right_led_2_on ();\r
-    ergodox_right_led_3_on ();\r
-  } else if (layer == ADORE) {\r
-    ergodox_right_led_1_on ();\r
-    ergodox_right_led_2_on ();\r
-    ergodox_right_led_3_on ();\r
-\r
-    ergodox_right_led_2_set (LED_BRIGHTNESS_HI);\r
-  }\r
-\r
-  if (layer == OHLFT || layer == OHRGT) {\r
-    ergodox_right_led_2_on();\r
-\r
-    if (oh_left_blink) {\r
-      if (timer_elapsed (oh_left_blink_timer) > OH_BLINK_INTERVAL) {\r
-        if ((keyboard_report->mods & MOD_BIT(KC_LSFT)) == 0)\r
-          ergodox_right_led_1_off ();\r
-      }\r
-      if (timer_elapsed (oh_left_blink_timer) > OH_BLINK_INTERVAL * 2) {\r
-        ergodox_right_led_1_on ();\r
-        oh_left_blink_timer = timer_read ();\r
-      }\r
-    }\r
-\r
-    if (oh_right_blink) {\r
-      if (timer_elapsed (oh_right_blink_timer) > OH_BLINK_INTERVAL) {\r
-        if ((keyboard_report->mods & MOD_BIT(KC_LCTRL)) == 0)\r
-          ergodox_right_led_3_off ();\r
-      }\r
-      if (timer_elapsed (oh_right_blink_timer) > OH_BLINK_INTERVAL * 2) {\r
-        ergodox_right_led_3_on ();\r
-        oh_right_blink_timer = timer_read ();\r
-      }\r
-    }\r
-  }\r
-\r
-  if (keyboard_report->mods & MOD_BIT(KC_LSFT) ||\r
-      ((get_oneshot_mods() & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out())) {\r
-    ergodox_right_led_1_set (LED_BRIGHTNESS_HI);\r
-    ergodox_right_led_1_on ();\r
-  } else {\r
-    ergodox_right_led_1_set (LED_BRIGHTNESS_LO);\r
-    if (layer != OHLFT && layer != NMDIA && layer != PLVR && layer != ADORE)\r
-      ergodox_right_led_1_off ();\r
-  }\r
-\r
-  if (keyboard_report->mods & MOD_BIT(KC_LALT) ||\r
-      ((get_oneshot_mods() & MOD_BIT(KC_LALT)) && !has_oneshot_mods_timed_out())) {\r
-    ergodox_right_led_2_set (LED_BRIGHTNESS_HI);\r
-    ergodox_right_led_2_on ();\r
-  } else {\r
-    ergodox_right_led_2_set (LED_BRIGHTNESS_LO);\r
-    if (layer != OHRGT && layer != HUN && layer != OHLFT && layer != NMDIA && layer != PLVR && layer != ADORE)\r
-      ergodox_right_led_2_off ();\r
-  }\r
-\r
-  if (keyboard_report->mods & MOD_BIT(KC_LCTRL) ||\r
-      ((get_oneshot_mods() & MOD_BIT(KC_LCTRL)) && !has_oneshot_mods_timed_out())) {\r
-    ergodox_right_led_3_set (LED_BRIGHTNESS_HI);\r
-    ergodox_right_led_3_on ();\r
-  } else {\r
-    ergodox_right_led_3_set (LED_BRIGHTNESS_LO);\r
-    if (layer != OHRGT && layer != HUN && layer != PLVR && layer != ADORE)\r
-      ergodox_right_led_3_off ();\r
-  }\r
-\r
-  LEADER_DICTIONARY() {\r
-    leading = false;\r
-    leader_end ();\r
-\r
-#if KEYLOGGER_ENABLE\r
-    SEQ_ONE_KEY (KC_D) {\r
-      ergodox_led_all_on();\r
-      wait_ms(100);\r
-      ergodox_led_all_off();\r
-      log_enable = !log_enable;\r
-    }\r
-#endif\r
-\r
-    SEQ_ONE_KEY (KC_T) {\r
-      time_travel = !time_travel;\r
-    }\r
-\r
-    SEQ_ONE_KEY (KC_U) {\r
-      ang_do_unicode ();\r
-    }\r
-\r
-    SEQ_ONE_KEY (KC_V) {\r
-      SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ (" QMK_VERSION "/" KEYMAP_VERSION ")");\r
-    }\r
-\r
-    SEQ_ONE_KEY (KC_L) {\r
-      /* λ */\r
-      ang_do_unicode ();\r
-\r
-      uint16_t codes[] = {KC_0, KC_3, KC_B, KC_B, KC_ENT, 0};\r
-      ang_tap (codes);\r
-    }\r
-\r
-    SEQ_ONE_KEY (KC_Y) {\r
-      uint16_t codes[] = {KC_BSLS, KC_O, KC_SLSH, 0};\r
-      ang_tap (codes);\r
-    }\r
-\r
-    SEQ_ONE_KEY (KC_S) {\r
-      ang_do_unicode (); TAP_ONCE (KC_A); TAP_ONCE (KC_F); TAP_ONCE (KC_SPC);\r
-      TAP_ONCE (KC_BSLS);\r
-      register_code (KC_RSFT); TAP_ONCE (KC_MINS); TAP_ONCE (KC_9); unregister_code (KC_RSFT);\r
-      ang_do_unicode (); TAP_ONCE (KC_3); TAP_ONCE (KC_0); TAP_ONCE (KC_C); TAP_ONCE (KC_4); TAP_ONCE (KC_SPC);\r
-      register_code (KC_RSFT); TAP_ONCE (KC_0); TAP_ONCE (KC_MINS); unregister_code (KC_RSFT);\r
-      TAP_ONCE (KC_SLSH);\r
-      ang_do_unicode (); TAP_ONCE (KC_A); TAP_ONCE (KC_F); TAP_ONCE (KC_SPC);\r
-    }\r
-\r
-    SEQ_TWO_KEYS (KC_W, KC_M) {\r
-      register_code (KC_LALT);\r
-      register_code (KC_F2);\r
-      unregister_code (KC_F2);\r
-      unregister_code (KC_LALT);\r
-\r
-      wait_ms (1000);\r
-\r
-      uint16_t codes[] = {KC_M, KC_A, KC_X, KC_MINS, KC_F, KC_O, KC_C, KC_U, KC_S, KC_E, KC_D, KC_ENT, 0};\r
-      ang_tap (codes);\r
-      register_code (KC_LGUI);\r
-      register_code (KC_UP);\r
-      unregister_code (KC_UP);\r
-      unregister_code (KC_LGUI);\r
-    }\r
-\r
-    SEQ_ONE_KEY (KC_A) {\r
-      if (is_adore == 0) {\r
-        default_layer_and (0);\r
-        default_layer_or ((1UL << ADORE));\r
-        eeconfig_update_default_layer ((1UL << ADORE));\r
-        is_adore = 1;\r
-\r
-        ergodox_led_all_off ();\r
-        ergodox_right_led_3_on ();\r
-        wait_ms (100);\r
-        ergodox_right_led_2_on ();\r
-        wait_ms (100);\r
-        ergodox_right_led_3_off ();\r
-        ergodox_right_led_1_on ();\r
-        wait_ms (100);\r
-        ergodox_right_led_2_off ();\r
-        wait_ms (100);\r
-        ergodox_right_led_1_off ();\r
-      } else {\r
-        is_adore = 0;\r
-        default_layer_and (0);\r
-        default_layer_or (1UL << BASE);\r
-        eeconfig_update_default_layer ((1UL << BASE));\r
-\r
-        ergodox_led_all_off ();\r
-        ergodox_right_led_1_on ();\r
-        wait_ms (100);\r
-        ergodox_right_led_2_on ();\r
-        wait_ms (100);\r
-        ergodox_right_led_1_off ();\r
-        ergodox_right_led_3_on ();\r
-        wait_ms (100);\r
-        ergodox_right_led_2_off ();\r
-        wait_ms (100);\r
-        ergodox_right_led_3_off ();\r
-      }\r
-    }\r
-  }\r
-}\r
-\r
-static uint16_t last4[4];\r
-\r
-bool process_record_user (uint16_t keycode, keyrecord_t *record) {\r
-#if KEYLOGGER_ENABLE\r
-  uint8_t layer = biton32(layer_state);\r
-\r
-  if (log_enable && layer == BASE) {\r
-    xprintf ("KL: col=%d, row=%d\n", record->event.key.col,\r
-             record->event.key.row);\r
-  }\r
-#endif\r
-\r
-  if (time_travel && !record->event.pressed) {\r
-    uint8_t p;\r
-\r
-    // shift cache one to the left\r
-    for (p = 0; p < 3; p++) {\r
-      last4[p] = last4[p + 1];\r
-    }\r
-    last4[3] = keycode;\r
-\r
-    if (last4[0] == KC_D && last4[1] == KC_A && last4[2] == KC_T && last4[3] == KC_E) {\r
-      uint16_t codes[] = {KC_E, KC_SPC, KC_MINS, KC_D, KC_SPC, KC_QUOT, 0};\r
-      ang_tap (codes);\r
-      register_code (KC_RSFT);\r
-      register_code (KC_EQL);\r
-      unregister_code (KC_EQL);\r
-      unregister_code (KC_RSFT);\r
-\r
-      uint16_t codes2[] = {KC_4, KC_SPC, KC_D, KC_A, KC_Y, KC_S, KC_QUOT, 0};\r
-      ang_tap (codes2);\r
-\r
-      return false;\r
-    }\r
-  }\r
-\r
-  return true;\r
-}\r
+
+/* Layers */
+
+enum {
+  BASE = 0,
+  ADORE,
+  ARRW,
+  APPSEL,
+  HUN,
+  NMDIA,
+  PLVR,
+};
+
+/* Macros */
+
+enum {
+  NONE = 0,
+  // Buttons that do extra stuff
+  A_GUI,
+  A_PLVR,
+  A_ESC,
+  A_MPN,
+
+  // Function / number keys
+  KF_1, // 1, F1
+  KF_2, // 2, F2
+  KF_3, // ...
+  KF_4,
+  KF_5,
+  KF_6,
+  KF_7,
+  KF_8,
+  KF_9,
+  KF_10,
+  KF_11, // =, F11
+
+  // Application select keys
+  APP_SLK, // Slack
+  APP_EMCS, // Emacs
+  APP_TERM, // Terminal
+  APP_CHRM, // Chrome
+  APP_MSIC, // Music
+
+  // Diagonal mouse movement
+  A_MUL,
+  A_MUR,
+  A_MDL,
+  A_MDR,
+
+  // Hungarian layer keys
+  HU_AA, // Á
+  HU_OO, // Ó
+  HU_EE, // É
+  HU_UU, // Ú
+  HU_II, // Í
+  HU_OE, // Ö
+  HU_UE, // Ü
+  HU_OEE, // Ő
+  HU_UEE, // Ű
+};
+
+/* Fn keys */
+
+enum {
+  F_BSE = 0,
+  F_HUN,
+  F_GUI,
+  F_SFT,
+  F_ALT,
+  F_CTRL
+};
+
+/* Custom keycodes */
+
+enum {
+  CT_CLN = 0,
+  CT_MNS,
+  CT_TA,
+  CT_LBP,
+  CT_RBP
+};
+
+/* States & timers */
+
+uint16_t gui_timer = 0;
+
+uint16_t kf_timers[12];
+
+#if KEYLOGGER_ENABLE
+bool log_enable = false;
+#endif
+
+bool time_travel = false;
+
+/* The Keymap */
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/* Keymap 0: Base Layer
+ *
+ * ,-----------------------------------------------------.           ,-----------------------------------------------------.
+ * | Next/Prev | 1 F1 | 2 F2 | 3 F3 | 4 F4 | 5 F5 | Plvr |           | Apps | 6 F6 | 7 F7 | 8 F8 | 9 F9 | 0 F10|       F11 |
+ * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|
+ * |         ~ |   '  |   ,  |   .  |   P  |   Y  |   [  |           |  ]   |   F  |   G  |   C  |   R  |  L   | \         |
+ * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|
+ * | Tab/ARROW |   A  |   O  |   E  |   U  |   I  |------|           |------|   D  |   H  |   T  |   N  |  S   | = / Arrow |
+ * |-----------+------+------+------+------+------|   (  |           |  )   |------+------+------+------+------+-----------|
+ * | Play/Pause|   /  |   Q  |   J  |   K  |   X  |      |           |      |   B  |   M  |   W  |   V  |  Z   |      Stop |
+ * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'
+ *     |       |      |      |      |   :  |                                       |   -  |      |      |      |       |
+ *     `-----------------------------------'                                       `-----------------------------------'
+ *                                         ,-------------.           ,-------------.
+ *                                         | LAlt | GUI  |           | MDIA | Del  |
+ *                                  ,------|------|------|           |------+------+------.
+ *                                  |      |      | Ctrl |           | LEAD |      |      |
+ *                                  |Backsp|LShift|------|           |------| Enter| Space|
+ *                                  |      |      | ESC  |           | HUN  |      |      |
+ *                                  `--------------------'           `--------------------'
+ */
+[BASE] = KEYMAP(
+// left hand
+ M(A_MPN)           ,M(KF_1)     ,M(KF_2)     ,M(KF_3),M(KF_4),M(KF_5),M(A_PLVR)
+,KC_GRV             ,KC_QUOT     ,KC_COMM     ,KC_DOT ,KC_P   ,KC_Y   ,KC_LBRC
+,TD(CT_TA)          ,KC_A        ,KC_O        ,KC_E   ,KC_U   ,KC_I
+,KC_MPLY            ,KC_SLSH     ,KC_Q        ,KC_J   ,KC_K   ,KC_X   ,KC_LPRN
+,KC_NO              ,KC_NO       ,KC_NO       ,KC_NO  ,TD(CT_CLN)
+
+                                                            ,F(F_ALT),F(F_GUI)
+                                                                     ,F(F_CTRL)
+                                                    ,KC_BSPC,F(F_SFT),M(A_ESC)
+
+                                                                // right hand
+                                                               ,KC_APP    ,M(KF_6),M(KF_7)   ,M(KF_8),M(KF_9) ,M(KF_10) ,KC_F11
+                                                               ,KC_RBRC   ,KC_F   ,KC_G      ,KC_C   ,KC_R    ,KC_L     ,KC_BSLS
+                                                                          ,KC_D   ,KC_H      ,KC_T   ,KC_N    ,KC_S     ,KC_EQL
+                                                               ,KC_RPRN   ,KC_B   ,KC_M      ,KC_W   ,KC_V    ,KC_Z     ,KC_MSTP
+                                                                                  ,TD(CT_MNS),KC_NO  ,KC_NO   ,KC_NO    ,KC_NO
+
+                                                               ,OSL(NMDIA),KC_DEL
+                                                               ,KC_LEAD
+                                                               ,F(F_HUN)  ,KC_ENT ,KC_SPC
+    ),
+
+/* Keymap 1: Adore layer
+ *
+ * ,-----------------------------------------------------.           ,-----------------------------------------------------.
+ * | Play/Pause| 1 F1 | 2 F2 | 3 F3 | 4 F4 | 5 F5 | Plvr |           | Apps | 6 F6 | 7 F7 | 8 F8 | 9 F9 | 0 F10|       F11 |
+ * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|
+ * |        `~ |   X  |   W  |   K  |   L  |   M  |   (  |           |  )   |   F  |   H  |   C  |   P  |  Y   | \         |
+ * |-----------+------+------+------+------+------|   [  |           |  ]   |------+------+------+------+------+-----------|
+ * | Tab/Arrow |   A  |   O  |   E  |   I  |   U  |------|           |------|   D  |   R  |   T  |   N  |  S   | =         |
+ * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|
+ * |           |   Z  |   Q  |   '  |   ,  |   .  |   :  |           |  -   |   B  |   G  |   V  |   J  |  /   |           |
+ * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'
+ *     |       |      |      |      |      |                                       |      |      |      |      |       |
+ *     `-----------------------------------'                                       `-----------------------------------'
+ *                                         ,-------------.           ,-------------.
+ *                                         | LAlt | GUI  |           | MDIA | Del  |
+ *                                  ,------|------|------|           |------+------+------.
+ *                                  |      |      | Ctrl |           | HUN  |      |      |
+ *                                  |Backsp|LShift|------|           |------| Enter| Space|
+ *                                  |      |      | ESC  |           | LEAD |      |      |
+ *                                  `--------------------'           `--------------------'
+ */
+[ADORE] = KEYMAP(
+// left hand
+ KC_MPLY            ,M(KF_1)     ,M(KF_2)     ,M(KF_3),M(KF_4),M(KF_5),M(A_PLVR)
+,KC_GRV             ,KC_X        ,KC_W        ,KC_K   ,KC_L   ,KC_M   ,TD(CT_LBP)
+,TD(CT_TA)          ,KC_A        ,KC_O        ,KC_E   ,KC_I   ,KC_U
+,KC_NO              ,KC_Z        ,KC_Q        ,KC_QUOT,KC_COMM,KC_DOT ,TD(CT_CLN)
+,KC_NO              ,KC_NO       ,KC_NO       ,KC_NO  ,KC_NO
+
+                                                            ,F(F_ALT),F(F_GUI)
+                                                                     ,F(F_CTRL)
+                                                    ,KC_BSPC,F(F_SFT),M(A_ESC)
+
+                                                                // right hand
+                                                               ,KC_APP    ,M(KF_6),M(KF_7),M(KF_8),M(KF_9) ,M(KF_10) ,KC_F11
+                                                               ,TD(CT_RBP),KC_F   ,KC_H   ,KC_C   ,KC_P    ,KC_Y     ,KC_BSLS
+                                                                          ,KC_D   ,KC_R   ,KC_T   ,KC_N    ,KC_S     ,KC_EQL
+                                                               ,TD(CT_MNS),KC_B   ,KC_G   ,KC_V   ,KC_J    ,KC_SLSH  ,KC_NO
+                                                                                  ,KC_NO  ,KC_NO  ,KC_NO   ,KC_NO    ,KC_NO
+
+                                                               ,OSL(NMDIA),KC_DEL
+                                                               ,F(F_HUN)
+                                                               ,KC_LEAD   ,KC_ENT ,KC_SPC
+    ),
+
+/* Keymap 2: Arrow layer
+ *
+ * ,-----------------------------------------------------.           ,-----------------------------------------------------.
+ * |           |      |      |      |      |      |      |           |      |      |      |      |      |      |           |
+ * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|
+ * |           |      |      |      |      |      |      |           |      |      | Home |  Up  |  End |      |           |
+ * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|
+ * |           |      |      |      |      |      |------|           |------|      | Left | Down | Rght |      |           |
+ * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|
+ * |           |      |      |      |      |      |      |           |      |      |      |      |      |      |           |
+ * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'
+ *      |      |      |      |      |      |                                       |      |      |      |      |      |
+ *      `----------------------------------'                                       `----------------------------------'
+ *                                         ,-------------.           ,-------------.
+ *                                         |      |      |           |      |      |
+ *                                  ,------|------|------|           |------+------+------.
+ *                                  |      |      |      |           |      |      |      |
+ *                                  | Enter|      |------|           |------| PgUp | PgDn |
+ *                                  |      |      |      |           |      |      |      |
+ *                                  `--------------------'           `--------------------'
+ */
+
+[ARRW] = KEYMAP(
+// left 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
+,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_ENT  ,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_HOME ,KC_UP   ,KC_END  ,KC_TRNS ,KC_TRNS
+                                                                        ,KC_TRNS ,KC_LEFT ,KC_DOWN ,KC_RGHT ,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_PGUP ,KC_PGDN
+    ),
+
+/* Keymap 3: Application select layer
+ *
+ * ,-----------------------------------------------------.           ,-----------------------------------------------------.
+ * |           |Music |Slack |Emacs |Term  |Chrome|      |           |      |      |      |      |      |      |           |
+ * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|
+ * |           |      |      |      |      |      |      |           |      |      |      |      |      |      |           |
+ * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|
+ * |           |      |      |      |      |      |------|           |------|      |      |      |      |      |           |
+ * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|
+ * |           |      |      |      |      |      |      |           |      |      |      |      |      |      |           |
+ * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'
+ *      |      |      |      |      |      |                                       |      |      |      |      |      |
+ *      `----------------------------------'                                       `----------------------------------'
+ *                                         ,-------------.           ,-------------.
+ *                                         |      |      |           |      |      |
+ *                                  ,------|------|------|           |------+------+------.
+ *                                  |      |      |      |           |      |      |      |
+ *                                  |      |      |------|           |------|      |      |
+ *                                  |      |      |      |           |      |      |      |
+ *                                  `--------------------'           `--------------------'
+ */
+
+[APPSEL] = KEYMAP(
+// left hand
+ KC_TRNS ,M(APP_MSIC),M(APP_SLK),M(APP_EMCS),M(APP_TERM),M(APP_CHRM),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
+
+                                                                // right hand
+                                                               ,KC_TRNS ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,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
+    ),
+
+
+/* Keymap 4: Hungarian Layer
+ *
+ * ,-----------------------------------------------------.           ,-----------------------------------------------------.
+ * |           |      |      |      |      |      |      |           |      |      |      |      |      |      |           |
+ * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|
+ * |           |      |  Ő   |      |  Ű   |      |      |           |      |      |      |      |      |      |           |
+ * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|
+ * |           |   Á  |  Ó   |  É   |  Ú   |  Í   |------|           |------|      |      |      |      |      |           |
+ * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|
+ * |           |      |  Ö   |      |  Ü   |      |      |           |      |      |      |      |      |      |           |
+ * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'
+ *      |      |      |      |      |      |                                       |      |      |      |      |      |
+ *      `----------------------------------'                                       `----------------------------------'
+ *                                         ,-------------.           ,-------------.
+ *                                         |      |      |           |      |      |
+ *                                  ,------|------|------|           |------+------+------.
+ *                                  |      |      |      |           |      |      |      |
+ *                                  |      |      |------|           |------|      |      |
+ *                                  |      |      |      |           | BASE |      |      |
+ *                                  `--------------------'           `--------------------'
+ */
+
+[HUN] = KEYMAP(
+// left hand
+ KC_NO   ,KC_NO   ,KC_NO    ,KC_NO   ,KC_NO    ,KC_NO   ,KC_NO
+,KC_NO   ,KC_NO   ,M(HU_OEE),KC_NO   ,M(HU_UEE),KC_NO   ,KC_NO
+,KC_NO   ,M(HU_AA),M(HU_OO) ,M(HU_EE),M(HU_UU) ,M(HU_II)
+,KC_NO   ,KC_NO   ,M(HU_OE) ,KC_NO   ,M(HU_UE) ,KC_NO   ,KC_NO
+,KC_NO   ,KC_NO   ,KC_NO    ,KC_NO   ,KC_NO
+
+                                             ,KC_NO   ,KC_NO
+                                                      ,KC_NO
+                                    ,KC_NO   ,KC_TRNS ,KC_TRNS
+
+                                                                // right hand
+                                                               ,KC_TRNS ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO
+                                                               ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO
+                                                                        ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO
+                                                               ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO
+                                                                                 ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO
+
+                                                               ,KC_NO   ,KC_NO
+                                                               ,KC_NO
+                                                               ,F(F_BSE),KC_TRNS  ,KC_TRNS
+    ),
+
+/* Keymap 5: Navigation & Media layer
+ *
+ * ,-----------------------------------------------------.           ,-----------------------------------------------------.
+ * | MS Slow   |      |      |      |      |      |ScrLCK|           |ScrLCK|      |      |      |      |      |           |
+ * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|
+ * | MS Normal |      | Home |  Up  | PgUp |      |      |           |Scroll|      |MsUpL | MsUp |MsUpR |      |PrintScreen|
+ * |-----------+------+------+------+------+------|      |           |  Up  |------+------+------+------+------+-----------|
+ * | MS Fast   |      | Left | Down | Right|      |------|           |------|      |MsLeft| MsDn |MsRght|      |           |
+ * |-----------+------+------+------+------+------|      |           |Scroll|------+------+------+------+------+-----------|
+ * | Play/Pause|      | End  | Down | PgDn |      |      |           | Down |      |MsDnL | MsDn |MsDnR |      |      Stop |
+ * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'
+ *      |      |      |      |      |      |                                       |      |      |      |      |      |
+ *      `----------------------------------'                                       `----------------------------------'
+ *                                         ,-------------.           ,-------------.
+ *                                         | Mute | VlUp |           | BASE | MClk |
+ *                                  ,------|------|------|           |------+------+------.
+ *                                  |      |      | VlDn |           | Prev |Left  |Right |
+ *                                  |  SPC | Enter|------|           |------| Click| Click|
+ *                                  |      |      | ESC  |           | Next |      |      |
+ *                                  `--------------------'           `--------------------'
+ */
+[NMDIA] = KEYMAP(
+// left hand
+ KC_ACL0    ,KC_NO       ,KC_NO      ,KC_NO   ,KC_NO   ,KC_NO   ,LGUI(KC_L)
+,KC_ACL1    ,KC_NO       ,KC_HOME    ,KC_UP   ,KC_PGUP ,KC_NO   ,KC_NO
+,KC_ACL2    ,KC_NO       ,KC_LEFT    ,KC_DOWN ,KC_RIGHT,KC_NO
+,KC_MPLY    ,KC_NO       ,KC_END     ,KC_DOWN ,KC_PGDN ,KC_NO   ,KC_NO
+,KC_NO      ,KC_NO       ,KC_NO      ,KC_NO   ,KC_NO
+                                                        ,KC_MUTE ,KC_VOLU
+                                                                 ,KC_VOLD
+                                                 ,KC_SPC,KC_ENTER,M(A_ESC)
+
+                                                                     // right hand
+                                                                     ,LGUI(KC_L),KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO    ,KC_NO
+                                                                     ,KC_WH_U   ,KC_NO   ,M(A_MUL),KC_MS_U ,M(A_MUR),KC_NO    ,KC_PSCR
+                                                                                ,KC_NO   ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_NO    ,KC_NO
+                                                                     ,KC_WH_D   ,KC_NO   ,M(A_MDL),KC_MS_D ,M(A_MDR),KC_NO    ,KC_MSTP
+                                                                                         ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO    ,KC_NO
+
+                                                                     ,KC_TRNS   ,KC_MS_BTN3
+                                                                     ,KC_MPRV
+                                                                     ,KC_MNXT   ,KC_BTN1 ,KC_BTN2
+    ),
+
+/* Keymap 6: Steno for Plover
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |        |      |      |      |      |      | BASE |           |      |      |      |      |      |      |        |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * |        |   #  |   #  |   #  |   #  |   #  |   #  |           |  #   |  #   |  #   |   #  |   #  |  #   |   #    |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |      |   T  |   P  |   H  |      |------|           |------|      |  F   |   P  |   L  |  T   |   D    |
+ * |--------+   S  +------+------+------+   *  |   *  |           |  *   |  *   +------+------+------+------+--------|
+ * |        |      |   K  |   W  |   R  |      |      |           |      |      |  R   |   B  |   G  |  S   |   Z    |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |      |      |      |      |      |                                       |      |      |      |      |      |
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                        ,-------------.       ,-------------.
+ *                                        |      |      |       |      |      |
+ *                                 ,------|------|------|       |------+------+------.
+ *                                 |      |      |      |       |      |      |      |
+ *                                 |   A  |   O  |------|       |------|  E   |  U   |
+ *                                 |      |      |      |       |      |      |      |
+ *                                 `--------------------'       `--------------------'
+ */
+
+[PLVR] = KEYMAP(
+// left hand
+KC_NO,  KC_NO,  KC_NO,  KC_NO,   KC_NO,  KC_NO,   M(A_PLVR),
+KC_NO,  PV_NUM, PV_NUM, PV_NUM,  PV_NUM, PV_NUM,  PV_NUM,
+KC_NO,  PV_LS,  PV_LT,  PV_LP,   PV_LH,  PV_STAR,
+KC_NO,  PV_LS,  PV_LK,  PV_LW,   PV_LR,  PV_STAR, PV_STAR,
+KC_NO,  KC_NO,  KC_NO,  KC_NO,   KC_NO,
+                                           KC_NO, KC_NO,
+                                           KC_NO,
+                                           PV_A,  PV_O,  KC_NO,
+
+                                                 // right hand
+                                                 KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,
+                                                 PV_NUM,  PV_NUM,  PV_NUM,  PV_NUM,  PV_NUM,  PV_NUM,  PV_NUM,
+                                                          PV_STAR, PV_RF,   PV_RP,   PV_RL,   PV_RT,   PV_RD,
+                                                 PV_STAR, PV_STAR, PV_RR,   PV_RB,   PV_RG,   PV_RS,   PV_RZ,
+                                                                   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,
+                                           KC_NO,      KC_NO,
+                                           KC_NO,
+                                           KC_NO,PV_E, PV_U
+ ),
+
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+   [F_BSE]  = ACTION_LAYER_CLEAR(ON_PRESS)
+  ,[F_HUN]  = ACTION_LAYER_INVERT(HUN, ON_PRESS)
+  ,[F_GUI]  = ACTION_MACRO_TAP(A_GUI)
+  ,[F_SFT]  = ACTION_MODS_ONESHOT (MOD_LSFT)
+  ,[F_ALT]  = ACTION_MODS_ONESHOT (MOD_LALT)
+  ,[F_CTRL] = ACTION_MODS_ONESHOT (MOD_LCTL)
+};
+
+void toggle_steno(int pressed)
+{
+  uint8_t layer = biton32(layer_state);
+
+  if (pressed) {
+    if (layer != PLVR) layer_on(PLVR); else layer_off(PLVR);
+
+    register_code(PV_LP);
+    register_code(PV_LH);
+    register_code(PV_LR);
+    register_code(PV_O);
+    register_code(PV_RL);
+    register_code(PV_RG);
+  } else {
+    unregister_code(PV_LP);
+    unregister_code(PV_LH);
+    unregister_code(PV_LR);
+    unregister_code(PV_O);
+    unregister_code(PV_RL);
+    unregister_code(PV_RG);
+  }
+}
+
+macro_t *ang_do_hun (keyrecord_t *record, uint16_t accent, uint16_t hun_char)
+{
+  uint8_t need_shift = 0;
+  uint8_t hold_shift = 0;
+
+  if (!record->event.pressed)
+    return MACRO_NONE;
+
+  layer_off (HUN);
+
+  if (keyboard_report->mods & MOD_BIT (KC_LSFT)) {
+    hold_shift = 1;
+    need_shift = 1;
+    unregister_code (KC_LSFT);
+  }
+  if ((get_oneshot_mods () & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out ()) {
+    need_shift = 1;
+    hold_shift = 0;
+    unregister_code (KC_LSFT);
+  }
+
+  clear_oneshot_mods ();
+
+  register_code (KC_RALT);
+  unregister_code (KC_RALT);
+  if (accent == (KC_DQT)) {
+    register_code (KC_RSFT);
+  }
+  register_code (accent);
+  unregister_code (accent);
+  if (need_shift && accent != (KC_DQT)) {
+    register_code (KC_RSFT);
+  } else if (accent == (KC_DQT) && !need_shift) {
+    unregister_code (KC_RSFT);
+  }
+  register_code (hun_char);
+  unregister_code (hun_char);
+  if (need_shift || accent == (KC_DQT))
+    unregister_code (KC_RSFT);
+  if (hold_shift)
+    register_code (KC_LSFT);
+
+  return MACRO_NONE;
+}
+
+void ang_handle_kf (keyrecord_t *record, uint8_t id)
+{
+  uint8_t code = id - KF_1;
+
+  if (record->event.pressed) {
+    kf_timers[code] = timer_read ();
+  } else {
+    uint8_t kc;
+
+    if (timer_elapsed (kf_timers[code]) > TAPPING_TERM) {
+      // Long press
+      kc = KC_F1 + code;
+    } else {
+      if (id == KF_11)
+        kc = KC_EQL;
+      else
+        kc = KC_1 + code;
+    }
+
+    register_code (kc);
+    unregister_code (kc);
+  }
+}
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+      switch(id) {
+      case A_ESC:
+        if (record->event.pressed) {
+          if ((get_oneshot_mods ()) && !has_oneshot_mods_timed_out ()) {
+            clear_oneshot_mods ();
+          } else {
+            register_code (KC_ESC);
+          }
+          layer_off (HUN);
+        } else {
+          unregister_code (KC_ESC);
+        }
+        break;
+
+      case A_MPN:
+        if (record->event.pressed) {
+          if (keyboard_report->mods & MOD_BIT(KC_LSFT) ||
+              ((get_oneshot_mods() & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out())) {
+            int oneshot = ((get_oneshot_mods() & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out());
+
+            if (oneshot)
+              clear_oneshot_mods ();
+            unregister_code (KC_LSFT);
+
+            register_code (KC_MPRV);
+            unregister_code (KC_MPRV);
+
+            if (!oneshot)
+              register_code (KC_LSFT);
+          } else {
+            return MACRO (T(MNXT), END);
+          }
+        }
+        break;
+
+        /* Hungarian layer */
+      case HU_AA:
+        return ang_do_hun (record, KC_QUOT, KC_A);
+      case HU_OO:
+        return ang_do_hun (record, KC_QUOT, KC_O);
+      case HU_EE:
+        return ang_do_hun (record, KC_QUOT, KC_E);
+      case HU_UU:
+        return ang_do_hun (record, KC_QUOT, KC_U);
+      case HU_II:
+        return ang_do_hun (record, KC_QUOT, KC_I);
+      case HU_OE:
+        return ang_do_hun (record, KC_DQT, KC_O);
+      case HU_UE:
+        return ang_do_hun (record, KC_DQT, KC_U);
+      case HU_OEE:
+        return ang_do_hun (record, KC_EQL, KC_O);
+      case HU_UEE:
+        return ang_do_hun (record, KC_EQL, KC_U);
+
+        /* Mouse movement */
+      case A_MUL:
+        if (record->event.pressed) {
+          mousekey_on(KC_MS_UP);
+          mousekey_on(KC_MS_LEFT);
+        } else {
+          mousekey_off(KC_MS_UP);
+          mousekey_off(KC_MS_LEFT);
+        }
+        mousekey_send();
+        break;
+
+      case A_MUR:
+        if (record->event.pressed) {
+          mousekey_on(KC_MS_UP);
+          mousekey_on(KC_MS_RIGHT);
+        } else {
+          mousekey_off(KC_MS_UP);
+          mousekey_off(KC_MS_RIGHT);
+        }
+        mousekey_send();
+        break;
+
+      case A_MDL:
+        if (record->event.pressed) {
+          mousekey_on(KC_MS_DOWN);
+          mousekey_on(KC_MS_LEFT);
+        } else {
+          mousekey_off(KC_MS_DOWN);
+          mousekey_off(KC_MS_LEFT);
+        }
+        mousekey_send();
+        break;
+
+      case A_MDR:
+        if (record->event.pressed) {
+          mousekey_on(KC_MS_DOWN);
+          mousekey_on(KC_MS_RIGHT);
+        } else {
+          mousekey_off(KC_MS_DOWN);
+          mousekey_off(KC_MS_RIGHT);
+        }
+        mousekey_send();
+        break;
+
+        /* Plover base */
+      case A_PLVR:
+        toggle_steno(record->event.pressed);
+        break;
+
+        /* GUI & AppSel */
+      case A_GUI:
+        if (record->event.pressed) {
+          register_code (KC_LGUI);
+          if (record->tap.count && !record->tap.interrupted) {
+            if (record->tap.count >= 2) {
+              register_code (KC_W);
+              layer_on (APPSEL);
+              set_oneshot_layer (APPSEL, ONESHOT_START);
+            }
+          } else {
+            record->tap.count = 0;
+          }
+          gui_timer = 0;
+        } else {
+          if (record->tap.count >= 2)
+            {
+              unregister_code (KC_W);
+              clear_oneshot_layer_state (ONESHOT_PRESSED);
+            }
+          gui_timer = timer_read ();
+        }
+        break;
+
+      case APP_SLK:
+        return MACRODOWN(T(S), T(L), T(A), T(C), T(K), T(ENT), END);
+
+      case APP_EMCS:
+        return MACRODOWN(T(G), T(N), T(U), T(SPC), T(E), T(M), T(A), T(C), T(S), T(SPC), T(2), T(4), T(ENT), END);
+
+      case APP_TERM:
+        return MACRODOWN(T(T), T(E), T(R), T(M), T(ENT), END);
+
+      case APP_CHRM:
+        return MACRODOWN(T(C), T(H), T(R), T(O), T(M), T(ENT), END);
+
+      case APP_MSIC:
+        return MACRODOWN(T(R), T(H), T(Y), T(T), T(H), T(M), T(B), T(O), T(X), T(ENT), END);
+
+        /* Function keys */
+      case KF_1 ... KF_11:
+        ang_handle_kf (record, id);
+        break;
+      }
+
+      return MACRO_NONE;
+};
+
+uint8_t is_adore = 0;
+
+// Runs just one time when the keyboard initializes.
+void matrix_init_user(void) {
+  uint8_t dl;
+
+  ergodox_led_all_on();
+  for (int i = LED_BRIGHTNESS_HI; i > LED_BRIGHTNESS_LO; i--) {
+    ergodox_led_all_set (i);
+    wait_ms (5);
+  }
+  wait_ms(1000);
+  for (int i = LED_BRIGHTNESS_LO; i > 0; i--) {
+    ergodox_led_all_set (i);
+    wait_ms (10);
+  }
+  ergodox_led_all_off();
+
+  if (!eeconfig_is_enabled())
+    eeconfig_init();
+  dl = eeconfig_read_default_layer ();
+  if (dl == (1UL << ADORE)) {
+    is_adore = 1;
+#if ADORE_AUTOLOG
+    log_enable = true;
+#endif
+  }
+};
+
+LEADER_EXTERNS();
+
+void ang_do_unicode (void) {
+  register_code (KC_RCTL);
+  register_code (KC_RSFT);
+  register_code (KC_U);
+  unregister_code (KC_U);
+  unregister_code (KC_RSFT);
+  unregister_code (KC_RCTL);
+  wait_ms (100);
+}
+
+void ang_tap (uint16_t codes[]) {
+  for (int i = 0; codes[i] != 0; i++) {
+    register_code (codes[i]);
+    unregister_code (codes[i]);
+    wait_ms (50);
+  }
+}
+
+#define TAP_ONCE(code)  \
+  register_code (code); \
+  unregister_code (code)
+
+void ang_tap_dance_bp_finished (qk_tap_dance_state_t *state, void *user_data) {
+  bool left, parens;
+
+  if (state->count > 2) {
+    state->count = 0;
+    return;
+  }
+
+  if (state->keycode == TD(CT_LBP))
+    left = true;
+  else
+    left = false;
+
+  if (state->count == 1)
+    parens = false;
+  else
+    parens = true;
+
+  if (parens) {
+    register_code (KC_RSFT);
+    if (left) {
+      TAP_ONCE(KC_9);
+    } else {
+      TAP_ONCE(KC_0);
+    }
+    unregister_code (KC_RSFT);
+  } else {
+    if (left) {
+      TAP_ONCE (KC_LBRC);
+    } else {
+      TAP_ONCE (KC_RBRC);
+    }
+  }
+}
+
+void ang_tap_dance_cln_finished (qk_tap_dance_state_t *state, void *user_data) {
+  if (state->count == 1) {
+    register_code (KC_RSFT);
+    register_code (KC_SCLN);
+  } else if (state->count == 2) {
+    register_code (KC_SCLN);
+  }
+}
+
+void ang_tap_dance_cln_reset (qk_tap_dance_state_t *state, void *user_data) {
+  if (state->count == 1) {
+    unregister_code (KC_SCLN);
+    unregister_code (KC_RSFT);
+  } else if (state->count == 2) {
+    unregister_code (KC_SCLN);
+  }
+}
+
+void ang_tap_dance_mns_finished (qk_tap_dance_state_t *state, void *user_data) {
+  if (state->count == 1) {
+    register_code (KC_MINS);
+  } else if (state->count == 2) {
+    register_code (KC_RSFT);
+    register_code (KC_MINS);
+  }
+}
+
+void ang_tap_dance_mns_reset (qk_tap_dance_state_t *state, void *user_data) {
+  if (state->count == 1) {
+    unregister_code (KC_MINS);
+  } else if (state->count == 2) {
+    unregister_code (KC_RSFT);
+    unregister_code (KC_MINS);
+  }
+}
+
+typedef struct {
+  bool layer_toggle;
+  bool sticky;
+  bool finished_once;
+} td_ta_state_t;
+
+void ang_tap_dance_ta_finished (qk_tap_dance_state_t *state, void *user_data) {
+  td_ta_state_t *td_ta = (td_ta_state_t *) user_data;
+
+  if (td_ta->finished_once) {
+    return;
+  }
+
+  if (td_ta->sticky) {
+    td_ta->sticky = false;
+    td_ta->layer_toggle = false;
+    layer_off (ARRW);
+    return;
+  }
+
+  td_ta->finished_once = true;
+  if (state->count == 1 && !state->pressed) {
+    register_code (KC_TAB);
+    td_ta->sticky = false;
+    td_ta->layer_toggle = false;
+  } else {
+    td_ta->layer_toggle = true;
+    layer_on (ARRW);
+    td_ta->sticky = (state->count == 2);
+  }
+}
+
+void ang_tap_dance_ta_reset (qk_tap_dance_state_t *state, void *user_data) {
+  td_ta_state_t *td_ta = (td_ta_state_t *) user_data;
+
+  if (!td_ta->layer_toggle)
+    unregister_code (KC_TAB);
+  if (!td_ta->sticky)
+    layer_off (ARRW);
+
+  td_ta->finished_once = false;
+}
+
+const qk_tap_dance_action_t tap_dance_actions[] = {
+   [CT_CLN] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, ang_tap_dance_cln_finished, ang_tap_dance_cln_reset)
+  ,[CT_MNS] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, ang_tap_dance_mns_finished, ang_tap_dance_mns_reset)
+  ,[CT_TA]  = {
+     .fn = { NULL, ang_tap_dance_ta_finished, ang_tap_dance_ta_reset },
+     .user_data = (void *)&((td_ta_state_t) { false, false, false })
+   }
+  ,[CT_LBP] = ACTION_TAP_DANCE_FN (ang_tap_dance_bp_finished)
+  ,[CT_RBP] = ACTION_TAP_DANCE_FN (ang_tap_dance_bp_finished)
+};
+
+static uint16_t uni[32];
+static uint8_t unicnt;
+static bool unimagic = false;
+
+// Runs constantly in the background, in a loop.
+void matrix_scan_user(void) {
+  uint8_t layer = biton32(layer_state);
+
+  if (gui_timer && timer_elapsed (gui_timer) > TAPPING_TERM)
+    unregister_code (KC_LGUI);
+
+  if (layer == HUN) {
+    ergodox_right_led_2_on();
+    ergodox_right_led_3_on();
+  } else if (layer == NMDIA) {
+    ergodox_right_led_1_on();
+    ergodox_right_led_2_on();
+  } else if (layer == PLVR) {
+    ergodox_right_led_1_on ();
+    ergodox_right_led_2_on ();
+    ergodox_right_led_3_on ();
+  } else if (layer == ADORE) {
+    ergodox_right_led_1_on ();
+    ergodox_right_led_2_on ();
+    ergodox_right_led_3_on ();
+
+    ergodox_right_led_2_set (LED_BRIGHTNESS_HI);
+  }
+
+  if (keyboard_report->mods & MOD_BIT(KC_LSFT) ||
+      ((get_oneshot_mods() & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out())) {
+    ergodox_right_led_1_set (LED_BRIGHTNESS_HI);
+    ergodox_right_led_1_on ();
+  } else {
+    ergodox_right_led_1_set (LED_BRIGHTNESS_LO);
+    if (layer != NMDIA && layer != PLVR && layer != ADORE)
+      ergodox_right_led_1_off ();
+  }
+
+  if (keyboard_report->mods & MOD_BIT(KC_LALT) ||
+      ((get_oneshot_mods() & MOD_BIT(KC_LALT)) && !has_oneshot_mods_timed_out())) {
+    ergodox_right_led_2_set (LED_BRIGHTNESS_HI);
+    ergodox_right_led_2_on ();
+  } else {
+    ergodox_right_led_2_set (LED_BRIGHTNESS_LO);
+    if (layer != HUN && layer != NMDIA && layer != PLVR && layer != ADORE)
+      ergodox_right_led_2_off ();
+  }
+
+  if (keyboard_report->mods & MOD_BIT(KC_LCTRL) ||
+      ((get_oneshot_mods() & MOD_BIT(KC_LCTRL)) && !has_oneshot_mods_timed_out())) {
+    ergodox_right_led_3_set (LED_BRIGHTNESS_HI);
+    ergodox_right_led_3_on ();
+  } else {
+    ergodox_right_led_3_set (LED_BRIGHTNESS_LO);
+    if (layer != HUN && layer != PLVR && layer != ADORE)
+      ergodox_right_led_3_off ();
+  }
+
+  LEADER_DICTIONARY() {
+    leading = false;
+    leader_end ();
+
+#if KEYLOGGER_ENABLE
+    SEQ_ONE_KEY (KC_D) {
+      ergodox_led_all_on();
+      wait_ms(100);
+      ergodox_led_all_off();
+      log_enable = !log_enable;
+    }
+#endif
+
+    SEQ_ONE_KEY (KC_T) {
+      time_travel = !time_travel;
+    }
+
+    SEQ_ONE_KEY (KC_U) {
+      ang_do_unicode ();
+    }
+
+    SEQ_TWO_KEYS (KC_LEAD, KC_U) {
+      unicnt = 0;
+      unimagic = true;
+      register_code(KC_RSFT);
+      TAP_ONCE(KC_U);
+      unregister_code(KC_RSFT);
+    }
+
+    SEQ_ONE_KEY (KC_V) {
+      SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ (" QMK_VERSION "/" KEYMAP_VERSION ")");
+    }
+
+    SEQ_ONE_KEY (KC_L) {
+      /* λ */
+      ang_do_unicode ();
+
+      uint16_t codes[] = {KC_0, KC_3, KC_B, KC_B, KC_ENT, 0};
+      ang_tap (codes);
+    }
+
+    SEQ_ONE_KEY (KC_Y) {
+      uint16_t codes[] = {KC_BSLS, KC_O, KC_SLSH, 0};
+      ang_tap (codes);
+    }
+
+    SEQ_ONE_KEY (KC_S) {
+      ang_do_unicode (); TAP_ONCE (KC_A); TAP_ONCE (KC_F); TAP_ONCE (KC_SPC);
+      TAP_ONCE (KC_BSLS);
+      register_code (KC_RSFT); TAP_ONCE (KC_MINS); TAP_ONCE (KC_9); unregister_code (KC_RSFT);
+      ang_do_unicode (); TAP_ONCE (KC_3); TAP_ONCE (KC_0); TAP_ONCE (KC_C); TAP_ONCE (KC_4); TAP_ONCE (KC_SPC);
+      register_code (KC_RSFT); TAP_ONCE (KC_0); TAP_ONCE (KC_MINS); unregister_code (KC_RSFT);
+      TAP_ONCE (KC_SLSH);
+      ang_do_unicode (); TAP_ONCE (KC_A); TAP_ONCE (KC_F); TAP_ONCE (KC_SPC);
+    }
+
+    SEQ_TWO_KEYS (KC_W, KC_M) {
+      register_code (KC_LALT);
+      register_code (KC_F2);
+      unregister_code (KC_F2);
+      unregister_code (KC_LALT);
+
+      wait_ms (1000);
+
+      uint16_t codes[] = {KC_M, KC_A, KC_X, KC_MINS, KC_F, KC_O, KC_C, KC_U, KC_S, KC_E, KC_D, KC_ENT, 0};
+      ang_tap (codes);
+      register_code (KC_LGUI);
+      register_code (KC_UP);
+      unregister_code (KC_UP);
+      unregister_code (KC_LGUI);
+    }
+
+    SEQ_ONE_KEY (KC_A) {
+      if (is_adore == 0) {
+        default_layer_and (0);
+        default_layer_or ((1UL << ADORE));
+        eeconfig_update_default_layer ((1UL << ADORE));
+        is_adore = 1;
+
+        ergodox_led_all_off ();
+        ergodox_right_led_3_on ();
+        wait_ms (100);
+        ergodox_right_led_2_on ();
+        wait_ms (100);
+        ergodox_right_led_3_off ();
+        ergodox_right_led_1_on ();
+        wait_ms (100);
+        ergodox_right_led_2_off ();
+        wait_ms (100);
+        ergodox_right_led_1_off ();
+#if ADORE_AUTOLOG
+        log_enable = true;
+#endif
+      } else {
+#if ADORE_AUTOLOG
+        log_enable = false;
+#endif
+        is_adore = 0;
+        default_layer_and (0);
+        default_layer_or (1UL << BASE);
+        eeconfig_update_default_layer ((1UL << BASE));
+
+        ergodox_led_all_off ();
+        ergodox_right_led_1_on ();
+        wait_ms (100);
+        ergodox_right_led_2_on ();
+        wait_ms (100);
+        ergodox_right_led_1_off ();
+        ergodox_right_led_3_on ();
+        wait_ms (100);
+        ergodox_right_led_2_off ();
+        wait_ms (100);
+        ergodox_right_led_3_off ();
+      }
+    }
+  }
+}
+
+static uint16_t last4[4];
+
+bool is_uni_seq(char *seq) {
+  uint8_t i;
+
+  for (i = 0; seq[i]; i++) {
+    uint16_t code;
+    if (('1' <= seq[i]) && (seq[i] <= '9'))
+      code = seq[i] - '1' + KC_1;
+    else if (seq[i] == '0')
+      code = KC_0;
+    else
+      code = seq[i] - 'a' + KC_A;
+
+    if (i > unicnt)
+      return false;
+    if (uni[i] != code)
+      return false;
+  }
+
+  if (uni[i] == KC_ENT || uni[i] == KC_SPC)
+    return true;
+
+  return false;
+}
+
+uint16_t hex_to_keycode(uint8_t hex)
+{
+  if (hex == 0x0) {
+    return KC_0;
+  } else if (hex < 0xA) {
+    return KC_1 + (hex - 0x1);
+  } else {
+    return KC_A + (hex - 0xA);
+  }
+}
+
+void register_hex(uint16_t hex) {
+  bool leading_zeros = true;
+
+  for(int i = 3; i >= 0; i--) {
+    uint8_t digit = ((hex >> (i*4)) & 0xF);
+    if (digit != 0)
+      leading_zeros = false;
+    else if (leading_zeros)
+      continue;
+    register_code(hex_to_keycode(digit));
+    unregister_code(hex_to_keycode(digit));
+    wait_ms(10);
+  }
+}
+
+typedef struct {
+  char *symbol;
+  uint16_t codes[4];
+} qk_ucis_symbol_t;
+
+static qk_ucis_symbol_t ucis_symbol_table[] = {
+  {"poop", {0x1, 0xf4a9, 0}},
+  {"rofl", {0x1, 0xf923, 0}},
+  {"kiss", {0x1, 0xf619, 0}},
+  {"snowman", {0x2603, 0}},
+  {NULL, {}}
+};
+
+bool process_record_ucis (uint16_t keycode, keyrecord_t *record) {
+  uint8_t i;
+
+  if (!unimagic)
+    return true;
+
+  if (!record->event.pressed)
+    return true;
+
+  uni[unicnt] = keycode;
+  unicnt++;
+
+  if (keycode == KC_BSPC) {
+    if (unicnt >= 2) {
+      unicnt-= 2;
+      return true;
+    } else {
+      unicnt--;
+      return false;
+    }
+  }
+
+  if (keycode == KC_ENT || keycode == KC_SPC) {
+    bool symbol_found = false;
+
+    for (i = unicnt; i > 0; i--) {
+      register_code (KC_BSPC);
+      unregister_code (KC_BSPC);
+      wait_ms(10);
+    }
+
+    ang_do_unicode();
+    wait_ms(10);
+    for (i = 0; ucis_symbol_table[i].symbol; i++) {
+      if (is_uni_seq (ucis_symbol_table[i].symbol)) {
+        symbol_found = true;
+        for (uint8_t j = 0; ucis_symbol_table[i].codes[j]; j++) {
+          register_hex(ucis_symbol_table[i].codes[j]);
+        }
+        break;
+      }
+    }
+    if (!symbol_found) {
+      for (i = 0; i < unicnt - 1; i++) {
+        uint8_t code;
+
+        if (uni[i] > KF_1)
+          code = uni[i] - KF_1 + KC_1;
+        else
+          code = uni[i];
+        TAP_ONCE(code);
+        wait_ms (10);
+      }
+    }
+
+    unimagic = false;
+    return true;
+  }
+  return true;
+}
+
+bool process_record_user (uint16_t keycode, keyrecord_t *record) {
+#if KEYLOGGER_ENABLE
+  if (log_enable) {
+    xprintf ("KL: col=%d, row=%d\n", record->event.key.col,
+             record->event.key.row);
+  }
+#endif
+
+  if (!process_record_ucis (keycode, record))
+    return false;
+
+  if (time_travel && !record->event.pressed) {
+    uint8_t p;
+
+    // shift cache one to the left
+    for (p = 0; p < 3; p++) {
+      last4[p] = last4[p + 1];
+    }
+    last4[3] = keycode;
+
+    if (last4[0] == KC_D && last4[1] == KC_A && last4[2] == KC_T && last4[3] == KC_E) {
+      uint16_t codes[] = {KC_E, KC_SPC, KC_MINS, KC_D, KC_SPC, KC_QUOT, 0};
+      ang_tap (codes);
+      register_code (KC_RSFT);
+      register_code (KC_EQL);
+      unregister_code (KC_EQL);
+      unregister_code (KC_RSFT);
+
+      uint16_t codes2[] = {KC_4, KC_SPC, KC_D, KC_A, KC_Y, KC_S, KC_QUOT, 0};
+      ang_tap (codes2);
+
+      return false;
+    }
+  }
+
+  return true;
+}
index 6fe1775111f7a9c28ac73d44a77af457ae2dd9a9..26dfddbe6a25ca64740af56112acc7cb6cd6afeb 100644 (file)
@@ -16,11 +16,12 @@ Some of the things in the layout only work when one uses Spacemacs and GNOME und
     - [ADORE layer](#adore-layer)
     - [Hungarian layer](#hungarian-layer)
     - [Navigation and media layer](#navigation-and-media-layer)
-    - [One-handed layer](#one-handed-layer)
     - [Steno layer](#steno-layer)
     - [LED states](#led-states)
 * [Tools](#tools)
     - [Heatmap](#heatmap)
+* [Special features](#special-features)
+    - [Unicode Symbol Input](#unicode-symbol-input)
 * [Building](#building)
     - [Using on Windows](#using-on-windows)
 * [Changelog](#changelog)
@@ -38,7 +39,7 @@ At its core, this is a Dvorak layout, with some minor changes. The more interest
 * The `Shift`, `Alt`, and `Control` modifiers are one-shot. When tapped, they are considered active for the next key press only. When double tapped, they toggle on, until a third, single tap sometime later. When held, they act as expected. My usual pattern is that I use these for the next keypress only, so this behaviour is perfect. If I need them held, I'll just double-tap.
 * The `GUI` key is special, because when I double-tap it, it sends `GUI + w`, which pops up an application selector. It also switches to a one-shot layer, where the number row on the left half turns into app selector macros, for the most common things I usually want to switch to. Otherwise it behaves as on a normal layout.
 * The `ESC` key also doubles as a one-shot cancel key: if tapped while any of the one-shot modifiers are in-flight (as in, single-tapped, and not expired yet), it cancels all one-shot modifiers. It also cancels the **Hun** layer, if active. Otherwise it sends the usual keycode.
-* The **Media** and **Hun** layer keys are one-shot, the **1Hand** and **STENO** keys are toggles.
+* The **Media** and **Hun** layer keys are one-shot, the **STENO** key is a toggle.
 * When holding any of the **Arrow** layer keys, the arrow layer activates while the layer key is held. Tapping the key produces the normal key.
 * Tapping the `:` key once yields `:`, tapping it twice yields `;`.
 * The **Lead** key allows me to type in a sequence of keys, and trigger some actions:
@@ -51,6 +52,7 @@ At its core, this is a Dvorak layout, with some minor changes. The more interest
     - `LEAD v` prints the firmware version, the keyboard and the keymap.
     - `LEAD d` toggles logging keypress positions to the HID console.
     - `LEAD t` toggles time travel. Figuring out the current `date` is left as an exercise to the reader.
+    - `LEAD LEAD u` enters the [Unicode symbol input][#unicode-symbol-input] mode.
 
 ## ADORE layer
 
@@ -74,20 +76,6 @@ On this layer, the accented characters are at the same position as their base va
 
 This layer is primarily for navigating with the cursor or the mouse, and some media things.
 
-## One-handed layer
-
-[![One-handed layer](images/one-handed-layer.png)](http://www.keyboard-layout-editor.com/#/gists/edff2495135955b8963198dace7f7ece)
-
-The one-handed layer is used in situations where the right hand is occupied, by mousing around, for example. Tapping the `OTHER` key switches which side is active. For the most part, keys remain in their usual position. When the right half is active, keys are mirrored to the left half.
-
-The differences are as follows:
-
-* The `ESC` key has been moved to the bottom row, so the `OTHER` key is easier to tap.
-* Most keys on the thumb cluster now have dual uses, and these do not change when switching sides:
-    - The `Space`/`Backspace` key sends `Space` on tap, `Backspace` when held for longer than a normal tap.
-    - The `Enter`/`Shift` key sends `Enter` on short-tap, `Shift` on long-tap.
-* The `Apps`/`BASE` key can be used to go back to the base layer, by long-tapping it. A short-tap will send the `App` key, as usual.
-
 ## Steno layer
 
 [![Steno layer for Plover](images/steno-layer.png)](http://www.keyboard-layout-editor.com/#/gists/401ef9a84369e47c57f9aedcf0a0d667)
@@ -103,11 +91,25 @@ For the layers, the following rules apply:
 * When the [ADORE layer](#adore-layer) is toggled on, LEDs will light up from left to right in a sequence, then turn off. When the layer is toggled off, the LEDs light up and turn off in the other direction. No LEDs are on while the layer is active.
 * When the [Hungarian layer](#hungarian-layer) is active, the *green* and *blue* LEDs are on.
 * When the [Navigation and media layer](#navigation-and-media-layer) is active, the *red* and *green* ones are on.
-* When the [One-handed layer](#one-handed-layer) is active, the *green* LED is on and bright, and either the *red* or the *blue* one is going to slowly blink, depending on the currently active side.
 * For the [Steno layer](#steno-layer), all LEDs will be turned on.
 
 Unless noted otherwise, the layers use a dim light for the LEDs, while modifiers use a stronger one, and modifiers override any layer preferences. For example, when on the one-handed layer, with the left side active (*red* light blinking), if `Shift` is on, the *red* light will be constantly on.
 
+# Special features
+
+## Unicode Symbol Input
+
+Once in the Unicode Symbol Input mode, one is able to type in symbol names, press `Enter` or `Space`, and get the Unicode symbol itself back. When in the mode, a capital `U` is printed first. Once the sequence is finished, all of it is erased by sending enough `Backspace` taps, and the firmware starts the OS-specific unicode input sequence. Then, it looks up the symbol name, and enters the associated code. If it is not found, it will just replay the pressed keycodes.
+
+The currently supported symbols are:
+
+- `snowman`: ☃
+- `kiss`: 😙
+- `rofl`: 🤣
+- `poop`: 💩
+
+This is an experimental feature, and may or may not work reliably.
+
 # Tools
 
 ## Heatmap
@@ -133,14 +135,14 @@ To make my workflow easier, this layout is maintained in [its own repository][al
 $ git clone https://github.com/jackhumbert/qmk_firmware.git
 $ cd qmk_firmware
 $ git clone https://github.com/algernon/ergodox-layout.git \
-            keyboards/ergodox_ez/keymaps/algernon-master
-$ make KEYBOARD=ergodox_ez KEYMAP=algernon-master
+            keyboards/ergodox/keymaps/algernon-master
+$ make keyboard=ergodox keymap=algernon-master
 ```
 
 From time to time, updates may be submitted back to the QMK repository. If you are reading it there, you can build the firmware like any other firmware included with it (assuming you are in the root directory of the firmware):
 
 ```
-$ make KEYBOARD=ergodox_ez KEYMAP=algernon
+$ make keyboard=ergodox keymap=algernon
 ```
 
 ## Using on Windows
@@ -149,6 +151,16 @@ The keymap default to forcing NKRO, which seems to upset Windows, and except the
 
 # Changelog
 
+## v1.5 - 2016-08-12
+
+* The **1HAND** layer has been removed.
+* A `Delete` key is now available on the right thumb cluster.
+* The [ADORE](#adore-layer) layer received a major update, see the layout image above.
+* It is now possible to enable automatic logging for the [ADORE](#adore-layer) layer, by setting the `ADORE_AUTOLOG` makefile variable to `yes` when compiling the keymap. It is off by default.
+* The `~` key and the `Media Next/Prev` key have been swapped on the [base layer](#base-layer).
+* On the **ARROW** layer, `Backspace` has been replaced by `Enter`.
+* There is some experimental support for entering Unicode symbols.
+
 ## v1.4 - 2016-07-29
 
 * When toggling the key logging on or off, the LEDs will do a little dance.