ソースを参照

Merge branch 'master' of https://github.com/jackhumbert/qmk_firmware

cbbrowne 9 年 前
コミット
729b4cdef3

+ 0 - 20
keyboards/ergodox/ergodox.c

@@ -2,23 +2,3 @@
 #include "debug.h"
 #include "action_layer.h"
 
-// swap-hands action needs a matrix to define the swap
-const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = {
-    /* Left hand, matrix positions */
-    {{0,13}, {1,13}, {2,13}, {3,13}, {4,13}, {5,13}},
-    {{0,12}, {1,12}, {2,12}, {3,12}, {4,12}, {5,12}},
-    {{0,11}, {1,11}, {2,11}, {3,11}, {4,11}, {5,11}},
-    {{0,10}, {1,10}, {2,10}, {3,10}, {4,10}, {5,10}},
-    {{0,9}, {1,9}, {2,9}, {3,9}, {4,9}, {5,9}},
-    {{0,8}, {1,8}, {2,8}, {3,8}, {4,8}, {5,8}},
-    {{0,7}, {1,7}, {2,7}, {3,7}, {4,7}, {5,7}},
-    /* Right hand, matrix positions */
-    {{0,6}, {1,6}, {2,6}, {3,6}, {4,6}, {5,6}},
-    {{0,5}, {1,5}, {2,5}, {3,5}, {4,5}, {5,5}},
-    {{0,4}, {1,4}, {2,4}, {3,4}, {4,4}, {5,4}},
-    {{0,3}, {1,3}, {2,3}, {3,3}, {4,3}, {5,3}},
-    {{0,2}, {1,2}, {2,2}, {3,2}, {4,2}, {5,2}},
-    {{0,1}, {1,1}, {2,1}, {3,1}, {4,1}, {5,1}},
-    {{0,0}, {1,0}, {2,0}, {3,0}, {4,0}, {5,0}},
-};
-

+ 22 - 1
keyboards/ergodox/ez/ez.c

@@ -82,4 +82,25 @@ out:
     return mcp23018_status;
 }
 
-
+#ifdef ONEHAND_ENABLE
+__attribute__ ((weak))
+// swap-hands action needs a matrix to define the swap
+const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = {
+    /* Left hand, matrix positions */
+    {{0,13}, {1,13}, {2,13}, {3,13}, {4,13}, {5,13}},
+    {{0,12}, {1,12}, {2,12}, {3,12}, {4,12}, {5,12}},
+    {{0,11}, {1,11}, {2,11}, {3,11}, {4,11}, {5,11}},
+    {{0,10}, {1,10}, {2,10}, {3,10}, {4,10}, {5,10}},
+    {{0,9}, {1,9}, {2,9}, {3,9}, {4,9}, {5,9}},
+    {{0,8}, {1,8}, {2,8}, {3,8}, {4,8}, {5,8}},
+    {{0,7}, {1,7}, {2,7}, {3,7}, {4,7}, {5,7}},
+    /* Right hand, matrix positions */
+    {{0,6}, {1,6}, {2,6}, {3,6}, {4,6}, {5,6}},
+    {{0,5}, {1,5}, {2,5}, {3,5}, {4,5}, {5,5}},
+    {{0,4}, {1,4}, {2,4}, {3,4}, {4,4}, {5,4}},
+    {{0,3}, {1,3}, {2,3}, {3,3}, {4,3}, {5,3}},
+    {{0,2}, {1,2}, {2,2}, {3,2}, {4,2}, {5,2}},
+    {{0,1}, {1,1}, {2,1}, {3,1}, {4,1}, {5,1}},
+    {{0,0}, {1,0}, {2,0}, {3,0}, {4,0}, {5,0}},
+};
+#endif

+ 46 - 16
keyboards/ergodox/keymaps/algernon/NEWS.md

@@ -1,3 +1,33 @@
+<!-- -*- mode: markdown; fill-column: 8192 -*- -->
+
+## v1.9
+
+*2016-10-16*
+
+### Overall changes
+
+* `F12` was replaced by an `Fx` key, that activate the **Media** layer as a one-shot layer, and also `Alt` as a one-shot modifier.
+
+### Base layer changes
+
+* The `Media Stop` key is now a tap-dance key, and resets the device for programming on the fourth tap.
+
+### Miscellaneous
+
+* `π` can now be entered with UCIS.
+* `🐁` can now be entered with UCIS.
+
+### Tools
+
+* The `tools/layer-notify` tool was removed, it was an example, which I don't use.
+
+#### `tools/hid-commands`
+
+* Now looks at the `DISABLE_APPSEL_START` environment value, and does not display an AppSel notification if it is non-empty.
+* Will attempt to re-program the keyboard when receiving a `reflash` command.
+* No longer tries to select Emacs 24 on `APPSEL_EMACS`, rather, it goes for any Emacs.
+* The `APPSEL_MUSIC` command now includes Kodi in the list too, as the last choice.
+
 ## v1.8
 
 *2016-10-03*
@@ -13,7 +43,7 @@
 
 ### Miscellaneous
 
-* Fixed the [Steno](#steno-layer) toggle key.
+* Fixed the **Steno** toggle key.
 
 ## v1.7
 
@@ -21,9 +51,9 @@
 
 ### Overall changes
 
-* The number row has been completely rearranged on both the [Base](#base-layer) and the [ADORE](#adore-layer) layers.
+* The number row has been completely rearranged on both the **Base** and the **ADORE** layers.
 * The number/function key behavior was changed: function keys are now on the **Media**.
-* The `:`/`;` and `-`/`_` keys were put back to their thumb position on the bottom row, on both the [Base](#base-layer) and [ADORE](#adore-layer) layers.
+* The `:`/`;` and `-`/`_` keys were put back to their thumb position on the bottom row, on both the **Base** and **ADORE** layers.
 * The bottom large keys on the inner side of each half now function as [tmux](http://tmux.github.io/) keys: the left to send the prefix, the right to send the `display-panes` key. The left also doubles as a GNU screen prefix key, and sends `C-a` when double tapped.
 * A number of functions, such as the **AppSel** layer, now require the `hid-commands` tool to be running, with the output of `hid_listen` being piped to it.
 
@@ -59,13 +89,13 @@
 ### Base layer changes
 
 * The parentheses & bracket keys have been merged: tapping them results in `[` or `{` (if it was shifted), double tapping leads to `(`.
-* The `:;` and `-_` keys are now available on the base layer, on their [ADORE](#adore-layer) location, too, just below `[{(`/`]})`.
+* The `:;` and `-_` keys are now available on the base layer, on their **ADORE** location, too, just below `[{(`/`]})`.
 * The `Apps` key has been replaced by `F12`.
 * The `-`/`_` is no longer a tap-dance key.
 
 ### ADORE layer changes
 
-* Adjustments were made to the [ADORE](#adore-layer) layer, to separate some inconvenient combinations.
+* Adjustments were made to the **ADORE** layer, to separate some inconvenient combinations.
 
 ### Miscellaneous changes
 
@@ -84,9 +114,9 @@
 
 * 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).
+* The **ADORE** layer received a major update, see the layout image above.
+* 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.
 
@@ -104,33 +134,33 @@
 
 *2016-07-06*
 
-* Added support for logging keys, by pressing `LEAD d`. Also included is a tool to generate a [heatmap](#heatmap) out of the logs.
-* The arrow and navigation keys were rearranged again, and now require an additional key being held to activate. See the [base layer](#base-layer) for an image that shows where arrows are.
-* The **experimental** layer has been redone, and is now called [ADORE](#adore-layer), and as such, can be enabled by `LEAD a` now.
+* Added support for logging keys, by pressing `LEAD d`. Also included is a tool to generate a *heatmap* out of the logs.
+* The arrow and navigation keys were rearranged again, and now require an additional key being held to activate. See the **Base** layer for an image that shows where arrows are.
+* The **experimental** layer has been redone, and is now called **ADORE**, and as such, can be enabled by `LEAD a` now.
 * Switching between Dvorak and ADORE is now persisted into EEPROM, and survives a reboot.
 
 ## v1.2
 
 *2016-06-22*
 
-* The forced NKRO mode can be easily toggled off at compile-time, to make the firmware compatible with [certain operating systems](#using-on-windows).
+* The forced NKRO mode can be easily toggled off at compile-time, to make the firmware compatible with certain operating systems.
 * The `:;` key has changed behaviour: to access the `;` symbol, the key needs to be double-tapped, instead of shifted.
-* The `=` and `\` keys were swapped, `=` moved to the home row, on both the [base](#base-layer) and the **experimental** layers.
+* The `=` and `\` keys were swapped, `=` moved to the home row, on both the **Base** and the **experimental** layers.
 * The arrow and navigation keys were redone, they are now more accessible, but the navigation keys require an extra tap to access.
 * The **Emacs** layer is gone, replaced by a simplified **navigation and media** layer.
 * `LEAD v` types the firmware version, and the keymap version.
 * On the **experimental** layer, the `L` and `Q`, and the `K` and `G` keys were swapped.
-* The [Steno](#steno-layer) layer gained a few more `#` and `*` keys, to make it easier on my fingers.
+* The **Steno** layer gained a few more `#` and `*` keys, to make it easier on my fingers.
 
 ## v1.1
 
 *2016-06-14*
 
 * The keyboard starts in NKRO mode, bootmagic and other things are disabled.
-* A [Steno](#steno-layer) layer was added, to be used with Plover.
+* A **Steno** layer was added, to be used with Plover.
 * An **experimental** layer was added, something halfway between Dvorak and Capewell-Dvorak. A work in progress.
 * `LEAD y` types `\o/`.
-* Some keys on the [Base](#base-layer) layer have been moved around:
+* Some keys on the **Base** layer have been moved around:
     - `?` moved to the left pinky, left of `Q`.
     - `=` shifted one row down, but `F11` stayed where it was.
     - `-` on the left half was replaced by `Tab`.

BIN
keyboards/ergodox/keymaps/algernon/images/adore-layer.png


BIN
keyboards/ergodox/keymaps/algernon/images/base-layer.png


+ 129 - 63
keyboards/ergodox/keymaps/algernon/keymap.c

@@ -64,6 +64,9 @@ enum {
   A_8,
   A_9,
   A_0,
+
+  // Fx
+  Fx,
 };
 
 /* Fn keys */
@@ -86,6 +89,7 @@ enum {
   CT_RBP,
   CT_TMUX,
   CT_TPS,
+  CT_SR,
 };
 
 /* States & timers */
@@ -103,6 +107,7 @@ bool log_enable = false;
 #endif
 
 bool time_travel = false;
+bool skip_leds = false;
 
 static uint8_t is_adore = 0;
 
@@ -113,13 +118,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 /* Keymap 0: Base Layer
  *
  * ,-----------------------------------------------------.           ,-----------------------------------------------------.
- * | Next/Prev | 9    | 7  @ | 5  * | 3  ^ | 1  $ | F11  |           |  F12 | 0  % | 2  ! | 4  # | 6  & | 8    |    Plover |
+ * | Next/Prev | 9    | 7  @ | 5  * | 3  ^ | 1  $ | F11  |           |  Fx  | 0  % | 2  ! | 4  # | 6  & | 8    |    Plover |
  * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|
  * |         ~ |   '  |   ,  |   .  |   P  |   Y  |   (  |           |  )   |   F  |   G  |   C  |   R  |  L   | \         |
  * |-----------+------+------+------+------+------|   [  |           |  ]   |------+------+------+------+------+-----------|
  * | Tab/ARROW |   A  |   O  |   E  |   U  |   I  |------|           |------|   D  |   H  |   T  |   N  |  S   | = / Arrow |
  * |-----------+------+------+------+------+------| tmux |           | tmux |------+------+------+------+------+-----------|
- * | Play/Pause|   /  |   Q  |   J  |   K  |   X  |      |           | Pane |   B  |   M  |   W  |   V  |  Z   |      Stop |
+ * | Play/Pause|   /  |   Q  |   J  |   K  |   X  |      |           | Pane |   B  |   M  |   W  |   V  |  Z   | Stop/Reset|
  * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'
  *     |       |      |      |      |   :  |                                       |   -  |      |      |      |       |
  *     `-----------------------------------'                                       `-----------------------------------'
@@ -144,10 +149,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
                                                     ,KC_BSPC,F(F_SFT),KC_ESC
 
                                                                 // right hand
-                                                               ,KC_F12    ,M(A_0)  ,M(A_2)    ,M(A_4)  ,M(A_6)  ,M(A_8)   ,M(A_PLVR)
+                                                               ,M(Fx)     ,M(A_0)  ,M(A_2)    ,M(A_4)  ,M(A_6)  ,M(A_8)   ,M(A_PLVR)
                                                                ,TD(CT_RBP),KC_F    ,KC_G      ,KC_C    ,KC_R    ,KC_L     ,KC_BSLS
                                                                           ,KC_D    ,KC_H      ,KC_T    ,KC_N    ,KC_S     ,KC_EQL
-                                                               ,TD(CT_TPS),KC_B    ,KC_M      ,KC_W    ,KC_V    ,KC_Z     ,KC_MSTP
+                                                               ,TD(CT_TPS),KC_B    ,KC_M      ,KC_W    ,KC_V    ,KC_Z     ,TD(CT_SR)
                                                                                    ,KC_MINS   ,KC_NO   ,KC_NO   ,KC_NO    ,KC_NO
 
                                                                ,OSL(NMDIA),KC_DEL
@@ -158,7 +163,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 /* Keymap 1: Adore layer
  *
  * ,-----------------------------------------------------.           ,-----------------------------------------------------.
- * | Play/Pause| 9    | 7  @ | 5  * | 3  ^ | 1  $ | F11  |           |  F12 | 0  % | 2  ! | 4  # | 6  & | 8    |    Plover |
+ * | Play/Pause| 9    | 7  @ | 5  * | 3  ^ | 1  $ | F11  |           |  Fx  | 0  % | 2  ! | 4  # | 6  & | 8    |    Plover |
  * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|
  * |         \ |   X  |   W  |   C  |   H  |   F  |   (  |           |  )   |   M  |   G  |   L  |   P  |  /   | `~        |
  * |-----------+------+------+------+------+------|   [  |           |  ]   |------+------+------+------+------+-----------|
@@ -189,7 +194,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
                                                     ,KC_BSPC,F(F_SFT),KC_ESC
 
                                                                 // right hand
-                                                               ,KC_F12    ,M(A_0)   ,M(A_2)  ,M(A_4)  ,M(A_6)  ,M(A_8)  ,M(A_PLVR)
+                                                               ,M(Fx)     ,M(A_0)   ,M(A_2)  ,M(A_4)  ,M(A_6)  ,M(A_8)  ,M(A_PLVR)
                                                                ,TD(CT_RBP),KC_M     ,KC_G    ,KC_L    ,KC_P    ,KC_SLSH ,KC_GRV
                                                                           ,KC_D     ,KC_R    ,KC_T    ,KC_N    ,KC_S    ,KC_EQL
                                                                ,TD(CT_TPS),KC_B     ,KC_K    ,KC_V    ,KC_Y    ,KC_J    ,KC_NO
@@ -342,7 +347,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 /* Keymap 5: Navigation & Media layer
  *
  * ,-----------------------------------------------------.           ,-----------------------------------------------------.
- * |           |  F9  |  F7  |  F5  |  F3  |  F1  |      |           |ScrLCK| F10  |  F2  |  F4  |  F6  |  F8  |           |
+ * |           |  F9  |  F7  |  F5  |  F3  |  F1  |ScrLCK|           |      | F10  |  F2  |  F4  |  F6  |  F8  |           |
  * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|
  * |           |      |      |      |      |      |      |           |      |      |      |      |      |      |           |
  * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|
@@ -362,7 +367,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  */
 [NMDIA] = KEYMAP(
 // left hand
- KC_NO      ,KC_F9       ,KC_F7      ,KC_F5   ,KC_F3   ,KC_F1   ,KC_NO
+ KC_NO      ,KC_F9       ,KC_F7      ,KC_F5   ,KC_F3   ,KC_F1   ,LGUI(KC_L)
 ,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
@@ -372,7 +377,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
                                                  ,KC_NO ,KC_NO   ,KC_TRNS
 
                                                                      // right hand
-                                                                     ,LGUI(KC_L),KC_F10  ,KC_F2   ,KC_F4   ,KC_F6   ,KC_F8    ,KC_NO
+                                                                     ,KC_TRNS   ,KC_F10  ,KC_F2   ,KC_F4   ,KC_F6   ,KC_F8    ,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
@@ -611,6 +616,17 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
         toggle_steno(record->event.pressed);
         break;
 
+        /* Fx */
+      case Fx:
+        if (record->event.pressed) {
+          set_oneshot_mods (MOD_LALT);
+          layer_on (NMDIA);
+          set_oneshot_layer (NMDIA, ONESHOT_START);
+        } else {
+          clear_oneshot_layer_state (ONESHOT_PRESSED);
+        }
+        break;
+
         /* GUI & AppSel */
       case A_GUI:
         if (record->event.pressed) {
@@ -780,6 +796,56 @@ static void ang_tap_dance_tmux_pane_select (qk_tap_dance_state_t *state, void *u
   unregister_code(kc);
 }
 
+static void
+_td_sr_each (qk_tap_dance_state_t *state, void *user_data) {
+  skip_leds = true;
+
+  switch (state->count) {
+  case 1:
+    ergodox_right_led_3_on ();
+    break;
+  case 2:
+    ergodox_right_led_2_on ();
+    break;
+  case 3:
+    ergodox_right_led_1_on ();
+    break;
+  case 4:
+    ergodox_right_led_3_off ();
+    wait_ms (50);
+    ergodox_right_led_2_off ();
+    wait_ms (50);
+    ergodox_right_led_1_off ();
+    break;
+  }
+}
+
+static void
+_td_sr_finished (qk_tap_dance_state_t *state, void *user_data) {
+  if (state->count == 1) {
+    register_code (KC_MSTP);
+  }
+  if (state->count >= 4) {
+    uprintf("CMD:reflash\n");
+    wait_ms (1000);
+    reset_keyboard ();
+    reset_tap_dance (state);
+  }
+}
+
+static void
+_td_sr_reset (qk_tap_dance_state_t *state, void *user_data) {
+  ergodox_right_led_1_off ();
+  wait_ms (50);
+  ergodox_right_led_2_off ();
+  wait_ms (50);
+  ergodox_right_led_3_off ();
+
+  if (state->count == 1) {
+    unregister_code (KC_MSTP);
+  }
+}
+
 qk_tap_dance_action_t tap_dance_actions[] = {
    [CT_CLN] = ACTION_TAP_DANCE_DOUBLE (KC_COLN, KC_SCLN)
   ,[CT_TA]  = {
@@ -790,77 +856,75 @@ qk_tap_dance_action_t tap_dance_actions[] = {
   ,[CT_RBP] = ACTION_TAP_DANCE_DOUBLE (KC_RBRC, KC_RPRN)
   ,[CT_TMUX]= ACTION_TAP_DANCE_FN (ang_tap_dance_tmux_finished)
   ,[CT_TPS] = ACTION_TAP_DANCE_FN (ang_tap_dance_tmux_pane_select)
+  ,[CT_SR]  = ACTION_TAP_DANCE_FN_ADVANCED (_td_sr_each, _td_sr_finished, _td_sr_reset)
 };
 
 // Runs constantly in the background, in a loop.
 void matrix_scan_user(void) {
-  static uint32_t prev_layer_state;
   uint8_t layer = biton32(layer_state);
   bool is_arrow = false;
-  static char *layer_lookup[] = {"Dvorak", "ADORE", "Arrows", "AppSel", "Hungarian", "Nav/Media", "Plover"};
-
-  if (layer_state != prev_layer_state) {
-    prev_layer_state = layer_state;
-    if (layer_lookup[layer])
-      uprintf("LAYER: %s\n", layer_lookup[layer]);
-  }
-
 
   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 (!skip_leds) {
+    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 (layer_state & (1UL << ARRW)) {
-    ergodox_right_led_1_on ();
-    ergodox_right_led_3_on ();
+    if (!skip_leds) {
+      ergodox_right_led_1_on ();
+      ergodox_right_led_3_on ();
+    }
     is_arrow = true;
   }
 
-  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 && !is_arrow)
-      ergodox_right_led_1_off ();
-  }
+  if (!skip_leds) {
+    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 && !is_arrow)
+        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_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 && !is_arrow)
-      ergodox_right_led_3_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 && !is_arrow)
+        ergodox_right_led_3_off ();
+    }
   }
 
   LEADER_DICTIONARY() {
@@ -974,7 +1038,9 @@ const qk_ucis_symbol_t ucis_symbol_table[] = UCIS_TABLE
  UCIS_SYM("snowman", 0x2603),
  UCIS_SYM("coffee", 0x2615),
  UCIS_SYM("heart", 0x2764),
- UCIS_SYM("bolt", 0x26a1)
+ UCIS_SYM("bolt", 0x26a1),
+ UCIS_SYM("pi", 0x03c0),
+ UCIS_SYM("mouse", 0x1f401)
 );
 
 bool process_record_user (uint16_t keycode, keyrecord_t *record) {

+ 2 - 6
keyboards/ergodox/keymaps/algernon/readme.md

@@ -43,6 +43,7 @@ At its core, this is a Dvorak layout, with some minor changes. The more interest
 * 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 **STENO** key is a toggle.
+* The **Fx** key is one-shot, and activates the **Media** layer, along with a one-shot `Alt`.
 * When holding the `Tab`/**Arrow** key, the arrow layer activates while the key is held. Tapping the key produces the normal, `Tab` key. Double-tapping it toggles the **Arrow** layer on until a third tap.
 * Tapping the `:` key once yields `:`, tapping it twice yields `;`.
 * Tapping the `[{(`/`)}]` keys once yields `[` (or `{` when shifted), tapping them twice yields `(`.
@@ -93,12 +94,7 @@ Unless noted otherwise, the layers use a dim light for the LEDs, while modifiers
 
 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`: 💩
+For the list of supported symbols, please see the source.
 
 This is an experimental feature, and may or may not work reliably.
 

+ 1 - 1
keyboards/ergodox/keymaps/algernon/tools/heatmap-layout.ADORE.json

@@ -65,7 +65,7 @@
       "x": 4.5,
       "f": 3
     },
-    "F12",
+    "Fx",
     {
       "a": 4,
       "f": 3,

+ 1 - 1
keyboards/ergodox/keymaps/algernon/tools/heatmap-layout.Dvorak.json

@@ -65,7 +65,7 @@
       "x": 4.5,
       "f": 3
     },
-    "F12",
+    "Fx",
     {
       "a": 4,
       "f": 3,

+ 10 - 4
keyboards/ergodox/keymaps/algernon/tools/hid-commands

@@ -16,7 +16,7 @@ _cmd_appsel () {
 }
 
 cmd_appsel_music () {
-    wmctrl -x -a rhythmbox || wmctrl -x -a spotify || true
+    wmctrl -x -a rhythmbox || wmctrl -x -a spotify || wmctrl -x -a kodi || true
     xdotool key Escape
 }
 
@@ -25,7 +25,7 @@ cmd_appsel_slack () {
 }
 
 cmd_appsel_emacs () {
-    _cmd_appsel emacs24
+    _cmd_appsel emacs
 }
 
 cmd_appsel_term () {
@@ -37,6 +37,10 @@ cmd_appsel_chrome () {
 }
 
 cmd_appsel_start () {
+    if [ ! -z "${DISABLE_APPSEL_START}" ]; then
+        return
+    fi
+
     APPSEL_START=$(date +%s)
     if [ $APPSEL_START -lt $(expr $LAST_APPSEL_START + 10) ]; then
         return
@@ -46,6 +50,10 @@ cmd_appsel_start () {
                 -i /usr/share/icons/Adwaita/24x24/devices/video-display.png
 }
 
+cmd_reflash () {
+    teensy_loader_cli -v -w ~/src/ext/qmk_firmware/algernon.hex --mcu atmega32u4 || true
+}
+
 cmd_help () {
     cat <<EOF
 Use the source, Luke!
@@ -69,5 +77,3 @@ while read l; do
         cmd_${cmd}
     fi
 done
-
-

+ 0 - 12
keyboards/ergodox/keymaps/algernon/tools/layer-notify

@@ -1,12 +0,0 @@
-#!/bin/sh
-HL="${HID_LISTEN:-$HOME/src/ext/hid_listen/hid_listen}"
-
-sudo "${HL}" | grep --line-buffered LAYER: | \
-(while read line; do
-     case $line in
-         LAYER:*)
-             layer="$(echo $(echo $line | cut -d: -f2-))"
-             notify-send -i mark-location-symbolic "Switched to layer: $layer"
-             ;;
-     esac
- done)

+ 3 - 0
keyboards/pegasushoof/Makefile

@@ -0,0 +1,3 @@
+ifndef MAKEFILE_INCLUDED
+	include ../../Makefile
+endif

+ 24 - 0
keyboards/pegasushoof/README.md

@@ -0,0 +1,24 @@
+pegasushoof keyboard firmware
+=============================
+
+## Quantum MK Firmware
+
+For the full Quantum feature list, see [the parent README.md](/README.md).
+
+## Building
+
+Download or clone the whole firmware and navigate to the `keyboard/pegasushoof` folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your `.hex` file.
+
+Depending on which keymap you would like to use, you will have to compile slightly differently.
+
+### Default
+To build all keymaps, simply run `make`, the `.hex` files will end up in the top directory.
+
+### Specific Keymap
+Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `<name>/keymap.c` in the `keymaps` folder, and see keymap document (you can find in top README.md) and existent keymap files.
+
+To build the firmware binary hex file with a keymap just enter the keymap directory and type `make`:
+```
+$ cd keymaps/default
+$ make
+```

+ 46 - 0
keyboards/pegasushoof/config.h

@@ -0,0 +1,46 @@
+/*
+Copyright 2016 Daniel Svensson <dsvensson@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef CONFIG_H
+#define CONFIG_H
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID       0xFEED
+#define PRODUCT_ID      0x6050
+#define DEVICE_VER      0x0104
+#define MANUFACTURER    Filco
+#define PRODUCT         Majestouch TKL \\w The Pegasus Hoof
+#define DESCRIPTION     QMK firmware for Majestouch TKL
+
+/* key matrix size */
+#define MATRIX_ROWS 8
+#define MATRIX_COLS 18
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
+
+/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
+#define DEBOUNCING_DELAY 5
+
+/* key combination for magic key command */
+#define IS_COMMAND() ( \
+	keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
+)
+
+#endif

+ 22 - 0
keyboards/pegasushoof/keymaps/blowrak/Makefile

@@ -0,0 +1,22 @@
+# Build Options
+#   change to "no" to disable the options, or define them in the Makefile in 
+#   the appropriate keymap folder that will get included automatically
+#
+BOOTMAGIC_ENABLE ?= yes      # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
+CONSOLE_ENABLE ?= yes        # Console for debug(+400)
+COMMAND_ENABLE ?= yes        # Commands for debug and configuration
+CUSTOM_MATRIX ?= yes         # Custom matrix file for the Pegasus Hoof due to the 2x74HC42
+NKRO_ENABLE ?= no            # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE ?= no       # Enable keyboard backlight functionality
+MIDI_ENABLE ?= no            # MIDI controls
+AUDIO_ENABLE ?= no           # Audio output on port C6
+UNICODE_ENABLE ?= no         # Unicode
+BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
+RGBLIGHT_ENABLE ?= no        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
+
+
+ifndef QUANTUM_DIR
+	include ../../../../Makefile
+endif

+ 112 - 0
keyboards/pegasushoof/keymaps/blowrak/keymap.c

@@ -0,0 +1,112 @@
+/*
+Copyright 2016 Daniel Svensson <dsvensson@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "pegasushoof.h"
+
+#define _______ KC_TRNS
+
+/* Swedish keys */
+#define SE_HALF KC_GRV
+#define SE_PLUS KC_MINS
+#define SE_ACUT KC_EQL
+#define SE_AO   KC_LBRC
+#define SE_CIRC KC_RBRC
+#define SE_QUOT KC_BSLS
+#define SE_OE   KC_SCLN
+#define SE_AE   KC_QUOT
+#define SE_MINS KC_SLSH
+#define SE_LTGT KC_NUBS
+#define SE_LCBR RALT(KC_7)
+#define SE_LBRC RALT(KC_8)
+#define SE_RBRC RALT(KC_9)
+#define SE_RCBR RALT(KC_0)
+#define SE_PIPE RALT(SE_LTGT)
+#define SE_BSLS RALT(SE_PLUS)
+
+#define KM_BLOWRAK 0
+#define KM_QWERTY  1
+#define KM_MEDIA   2
+#define KM_HAXHAX  3
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+	/* Layer 0: Blowrak ISO layer, a Swedish take on Dvorak */
+	[KM_BLOWRAK] = KEYMAP( \
+		KC_ESC,          KC_F1,  KC_F2,  KC_F3,  KC_F4,  KC_F5,  KC_F6,  KC_F7,  KC_F8,  KC_F9,  KC_F10, KC_F11, KC_F12,    KC_PSCR,KC_SLCK,KC_PAUS, \
+		SE_HALF, KC_1,   KC_2,   KC_3,   KC_4,   KC_5,   KC_6,   KC_7,   KC_8,   KC_9,   KC_0,   SE_PLUS,SE_ACUT,KC_BSPC,   KC_INS, KC_HOME,KC_PGUP, \
+		KC_TAB,  SE_AO,  SE_AE,  SE_OE,  KC_P,   KC_Y,   KC_F,   KC_G,   KC_C,   KC_R,   KC_L,   KC_COMM,SE_CIRC,SE_QUOT,   KC_DEL, KC_END, KC_PGDN, \
+		KC_LCTRL,KC_A,   KC_O,   KC_E,   KC_U,   KC_I,   KC_H,   KC_D,   KC_T,   KC_N,   KC_S,   SE_MINS,        KC_ENT,                             \
+		KC_LSFT, SE_LTGT,KC_DOT, KC_Q,   KC_J,   KC_K,   KC_B,   KC_X,   KC_M,   KC_W,   KC_V,   KC_Z,           KC_RSFT,           KC_UP,           \
+		KC_FN0,  KC_LGUI,KC_LALT,                       KC_SPC,                          KC_RALT,KC_RGUI,KC_MENU,KC_FN1,    KC_LEFT,KC_DOWN,KC_RGHT),
+	/* Layer 1: Standard ISO layer */
+	[KM_QWERTY] = KEYMAP( \
+		KC_ESC,          KC_F1,  KC_F2,  KC_F3,  KC_F4,  KC_F5,  KC_F6,  KC_F7,  KC_F8,  KC_F9,  KC_F10, KC_F11, KC_F12,    KC_PSCR,KC_SLCK,KC_PAUS, \
+		SE_HALF, KC_1,   KC_2,   KC_3,   KC_4,   KC_5,   KC_6,   KC_7,   KC_8,   KC_9,   KC_0,   SE_PLUS,SE_ACUT,KC_BSPC,   KC_INS, KC_HOME,KC_PGUP, \
+		KC_TAB,  KC_Q,   KC_W,   KC_E,   KC_R,   KC_T,   KC_Y,   KC_U,   KC_I,   KC_O,   KC_P,   SE_AO,  SE_CIRC,SE_QUOT,   KC_DEL, KC_END, KC_PGDN, \
+		KC_LCTRL,KC_A,   KC_S,   KC_D,   KC_F,   KC_G,   KC_H,   KC_J,   KC_K,   KC_L,   SE_OE,  SE_AE,          KC_ENT,                             \
+		KC_LSFT, SE_LTGT,KC_Z,   KC_X,   KC_C,   KC_V,   KC_B,   KC_N,   KC_M,   KC_COMM,KC_DOT, SE_MINS,        KC_RSFT,           KC_UP,           \
+		KC_FN0,  KC_LGUI,KC_LALT,                       KC_SPC,                          KC_RALT,KC_RGUI,KC_MENU,KC_FN1,    KC_LEFT,KC_DOWN,KC_RGHT),
+	/* Layer 2: Media layer */
+	[KM_MEDIA] = KEYMAP( \
+		_______,        _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,   KC_WAKE,KC_PWR, KC_SLEP, \
+		_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,   _______,_______,KC_VOLU, \
+		_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,   KC_MUTE,_______,KC_VOLD, \
+		_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,        _______,                            \
+		_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,        _______,           KC_MPLY,         \
+		_______,_______,_______,                        _______,                        _______,_______,RESET  ,_______,   KC_MPRV,KC_MSTP,KC_MNXT),
+	/* Layer 3: Programming layer */
+	[KM_HAXHAX] = KEYMAP( \
+		_______,        _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,   _______,_______,_______, \
+		_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,   _______,_______,_______, \
+		_______,SE_LCBR,SE_PIPE,SE_RCBR,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,   _______,_______,_______, \
+		_______,SE_LBRC,SE_BSLS,SE_RBRC,_______,_______,_______,_______,_______,_______,_______,_______,        _______,                            \
+		_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,        _______,           _______,         \
+		_______,_______,_______,                        _______,                        _______,_______,_______,_______,   _______,_______,_______),
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+	[0] = ACTION_LAYER_MOMENTARY(KM_MEDIA),
+	[1] = ACTION_LAYER_TOGGLE(KM_QWERTY)
+};
+
+void matrix_scan_user(void)
+{
+	uint8_t layer = biton32(layer_state);
+	switch (layer) {
+		case KM_BLOWRAK:
+			ph_caps_led_on();
+			ph_sclk_led_off();
+			break;
+		case KM_QWERTY:
+			ph_sclk_led_on();
+			ph_caps_led_off();
+			break;
+	}
+}
+
+/* Mixes in KM_HAXHAX via RALT modifier without shadowing the RALT key combinations. */
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+	uint8_t modifiers = get_mods();
+	if (modifiers & MOD_BIT(KC_RALT) && record->event.pressed) {
+		uint16_t kc = keymap_key_to_keycode(KM_HAXHAX, record->event.key);
+		if (kc != KC_TRNS) {
+			register_code(kc);
+			unregister_code(kc);
+			return false;
+		}
+	}
+	return true;
+}

+ 22 - 0
keyboards/pegasushoof/keymaps/default/Makefile

@@ -0,0 +1,22 @@
+# Build Options
+#   change to "no" to disable the options, or define them in the Makefile in 
+#   the appropriate keymap folder that will get included automatically
+#
+BOOTMAGIC_ENABLE ?= yes      # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
+CONSOLE_ENABLE ?= yes        # Console for debug(+400)
+COMMAND_ENABLE ?= yes        # Commands for debug and configuration
+CUSTOM_MATRIX ?= yes         # Custom matrix file for the Pegasus Hoof due to the 2x74HC42
+NKRO_ENABLE ?= no            # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE ?= no       # Enable keyboard backlight functionality
+MIDI_ENABLE ?= no            # MIDI controls
+AUDIO_ENABLE ?= no           # Audio output on port C6
+UNICODE_ENABLE ?= no         # Unicode
+BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
+RGBLIGHT_ENABLE ?= no        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
+
+
+ifndef QUANTUM_DIR
+	include ../../../../Makefile
+endif

+ 60 - 0
keyboards/pegasushoof/keymaps/default/keymap.c

@@ -0,0 +1,60 @@
+/*
+Copyright 2016 Daniel Svensson <dsvensson@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "pegasushoof.h"
+
+#define _______ KC_TRNS
+
+#define KM_QWERTY  0
+#define KM_MEDIA   1
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+	/* Layer 0: Standard ISO layer */
+	[KM_QWERTY] = KEYMAP( \
+		KC_ESC,          KC_F1,  KC_F2,  KC_F3,  KC_F4,  KC_F5,  KC_F6,  KC_F7,  KC_F8,  KC_F9,  KC_F10, KC_F11, KC_F12,   KC_PSCR,KC_SLCK,KC_PAUS, \
+		KC_GRV,  KC_1,   KC_2,   KC_3,   KC_4,   KC_5,   KC_6,   KC_7,   KC_8,   KC_9,   KC_0,   KC_MINS,KC_EQL, KC_BSPC,  KC_INS, KC_HOME,KC_PGUP, \
+		KC_TAB,  KC_Q,   KC_W,   KC_E,   KC_R,   KC_T,   KC_Y,   KC_U,   KC_I,   KC_O,   KC_P,   KC_LBRC,KC_RBRC,KC_BSLS,  KC_DEL, KC_END, KC_PGDN, \
+		KC_CLCK, KC_A,   KC_S,   KC_D,   KC_F,   KC_G,   KC_H,   KC_J,   KC_K,   KC_L,   KC_SCLN,KC_QUOT,        KC_ENT,                            \
+		KC_LSFT, KC_NUBS,KC_Z,   KC_X,   KC_C,   KC_V,   KC_B,   KC_N,   KC_M,   KC_COMM,KC_DOT, KC_SLSH,        KC_RSFT,          KC_UP,           \
+		KC_LCTL, KC_LGUI,KC_LALT,                       KC_SPC,                          KC_RALT,KC_RGUI,KC_MENU,KC_FN0,   KC_LEFT,KC_DOWN,KC_RGHT),
+	/* Layer 1: Function layer */
+	[KM_MEDIA] = KEYMAP( \
+		_______,        _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,   KC_WAKE,KC_PWR, KC_SLEP, \
+		_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,   _______,_______,KC_VOLU, \
+		_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,   _______,_______,KC_VOLD, \
+		_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,        _______,                            \
+		_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,        _______,           KC_MPLY,         \
+		_______,_______,_______,                        _______,                        _______,_______,RESET  ,_______,   KC_MPRV,KC_MSTP,KC_MNXT)
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+	[0] = ACTION_LAYER_MOMENTARY(KM_MEDIA)
+};
+
+void led_set_user(uint8_t usb_led) {
+	if (usb_led & (1 << USB_LED_CAPS_LOCK)) {
+		ph_caps_led_on();
+	} else {
+		ph_caps_led_off();
+	}
+
+	if (usb_led & (1 << USB_LED_SCROLL_LOCK)) {
+		ph_sclk_led_on();
+	} else {
+		ph_sclk_led_off();
+	}
+}

+ 204 - 0
keyboards/pegasushoof/matrix.c

@@ -0,0 +1,204 @@
+/*
+Copyright 2014 Ralf Schmitt <ralf@bunkertor.net>
+Copyright 2016 Daniel Svensson <dsvensson@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <stdint.h>
+#include <stdbool.h>
+#include <avr/io.h>
+#include <util/delay.h>
+#include "wait.h"
+#include "print.h"
+#include "debug.h"
+#include "util.h"
+#include "matrix.h"
+
+static uint8_t debouncing = DEBOUNCING_DELAY;
+static matrix_row_t matrix[MATRIX_ROWS];
+static matrix_row_t matrix_debouncing[MATRIX_ROWS];
+
+static matrix_row_t read_cols(void);
+static void select_row(uint8_t col);
+
+inline uint8_t matrix_rows(void)
+{
+	return MATRIX_ROWS;
+}
+
+inline uint8_t matrix_cols(void)
+{
+	return MATRIX_COLS;
+}
+
+void matrix_init(void)
+{
+	/* Column output pins */
+	DDRD  |=  0b01111011;
+	/* Row input pins */
+	DDRC  &= ~0b10000000;
+	DDRB  &= ~0b01111111;
+	PORTC |=  0b10000000;
+	PORTB |=  0b01111111;
+
+	for (uint8_t i=0; i < MATRIX_ROWS; i++)  {
+		matrix[i] = 0;
+		matrix_debouncing[i] = 0;
+	}
+
+	matrix_init_quantum();
+}
+
+uint8_t matrix_scan(void)
+{
+	for (uint8_t col = 0; col < MATRIX_COLS; col++) {
+		select_row(col);
+		wait_us(30);
+		matrix_row_t rows = read_cols();
+		for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+			bool prev_bit = matrix_debouncing[row] & ((matrix_row_t)1<<col);
+			bool curr_bit = rows & (1<<row);
+			if (prev_bit != curr_bit) {
+				matrix_debouncing[row] ^= (matrix_row_t) 1 << col;
+				debouncing = DEBOUNCING_DELAY;
+			}
+		}
+	}
+
+	if (debouncing) {
+		if (--debouncing) {
+			wait_ms(1);
+		} else {
+			for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
+				matrix[i] = matrix_debouncing[i];
+			}
+		}
+	}
+
+	matrix_scan_quantum();
+
+	return 1;
+}
+
+bool matrix_is_modified(void)
+{
+	if (debouncing)
+		return false;
+	return true;
+}
+
+inline
+bool matrix_is_on(uint8_t row, uint8_t col)
+{
+	return matrix[row] & 1 << col;
+}
+
+inline
+matrix_row_t matrix_get_row(uint8_t row)
+{
+	return matrix[row];
+}
+
+void matrix_print(void)
+{
+	print("\nr/c 0123456789ABCDEF\n");
+	for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+		phex(row); print(": ");
+		pbin_reverse16(matrix_get_row(row));
+		print("\n");
+	}
+}
+
+uint8_t matrix_key_count(void)
+{
+	uint8_t count = 0;
+	for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
+		count += bitpop16(matrix[i]);
+	}
+	return count;
+}
+
+static matrix_row_t read_cols(void)
+{
+	return
+		(PINB & (1 << 5) ? 0 : 1 << 0) |
+		(PINC & (1 << 7) ? 0 : 1 << 1) |
+		(PINB & (1 << 4) ? 0 : 1 << 2) |
+		(PINB & (1 << 6) ? 0 : 1 << 3) |
+		(PINB & (1 << 1) ? 0 : 1 << 4) |
+		(PINB & (1 << 0) ? 0 : 1 << 5) |
+		(PINB & (1 << 3) ? 0 : 1 << 6) |
+		(PINB & (1 << 2) ? 0 : 1 << 7);
+}
+
+static void select_row(uint8_t col)
+{
+	switch (col) {
+		case 0:
+			PORTD = (PORTD & ~0b01111011) | 0b00110011;
+			break;
+		case 1:
+			PORTD = (PORTD & ~0b01111011) | 0b01110000;
+			break;
+		case 2:
+			PORTD = (PORTD & ~0b01111011) | 0b00010011;
+			break;
+		case 3:
+			PORTD = (PORTD & ~0b01111011) | 0b01101000;
+			break;
+		case 4:
+			PORTD = (PORTD & ~0b01111011) | 0b00001011;
+			break;
+		case 5:
+			PORTD = (PORTD & ~0b01111011) | 0b00111011;
+			break;
+		case 6:
+			PORTD = (PORTD & ~0b01111011) | 0b01111000;
+			break;
+		case 7:
+			PORTD = (PORTD & ~0b01111011) | 0b01100001;
+			break;
+		case 8:
+			PORTD = (PORTD & ~0b01111011) | 0b01101001;
+			break;
+		case 9:
+			PORTD = (PORTD & ~0b01111011) | 0b01110001;
+			break;
+		case 10:
+			PORTD = (PORTD & ~0b01111011) | 0b01101010;
+			break;
+		case 11:
+			PORTD = (PORTD & ~0b01111011) | 0b01100010;
+			break;
+		case 12:
+			PORTD = (PORTD & ~0b01111011) | 0b01111001;
+			break;
+		case 13:
+			PORTD = (PORTD & ~0b01111011) | 0b01100000;
+			break;
+		case 14:
+			PORTD = (PORTD & ~0b01111011) | 0b01000011;
+			break;
+		case 15:
+			PORTD = (PORTD & ~0b01111011) | 0b00011011;
+			break;
+		case 16:
+			PORTD = (PORTD & ~0b01111011) | 0b00100011;
+			break;
+		case 17:
+			PORTD = (PORTD & ~0b01111011) | 0b00101011;
+			break;
+	}
+}

+ 51 - 0
keyboards/pegasushoof/pegasushoof.c

@@ -0,0 +1,51 @@
+/*
+Copyright 2016 Daniel Svensson <dsvensson@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "pegasushoof.h"
+
+__attribute__ ((weak))
+void matrix_init_user(void) {
+};
+
+__attribute__ ((weak))
+void matrix_scan_user(void) {
+}
+
+__attribute__ ((weak))
+bool process_action_user(keyrecord_t *record) {
+    return true;
+}
+
+__attribute__ ((weak))
+void led_set_user(uint8_t usb_led) {
+}
+
+void matrix_init_kb(void) {
+	matrix_init_user();
+}
+
+void matrix_scan_kb(void) {
+	matrix_scan_user();
+}
+
+bool process_action_kb(keyrecord_t *record) {
+	return process_action_user(record);
+}
+
+void led_set_kb(uint8_t usb_led) {
+	led_set_user(usb_led);
+}

+ 51 - 0
keyboards/pegasushoof/pegasushoof.h

@@ -0,0 +1,51 @@
+/*
+Copyright 2016 Daniel Svensson <dsvensson@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef PEGASUSHOOF_H
+#define PEGASUSHOOF_H
+
+#include "matrix.h"
+#include "quantum.h"
+
+#define  ___ KC_NO
+
+#define KEYMAP( \
+	KG6,      KH4, KI4, KI2, KI6, KP5, KL6, KM2, KM4, KO4, KO5, KO6, KO0,   KN5, KN7, KP7, \
+	KG4, KG5, KH5, KI5, KJ5, KJ4, KK4, KK5, KL5, KM5, KF5, KF4, KL4, KO2,   KR4, KC4, KE4, \
+	KG2, KG7, KH7, KI7, KJ7, KJ2, KK2, KK7, KL7, KM7, KF7, KF2, KL2, KO3,   KQ4, KC5, KE5, \
+	KH2, KG3, KH3, KI3, KJ3, KJ6, KK6, KK3, KL3, KM3, KF3, KF6,      KO1,                  \
+	KB2, KH6, KG1, KH1, KI1, KJ1, KJ0, KK0, KK1, KL1, KM1, KF0,      KB3,        KC6,      \
+	KP4, KD2, KN6,                KQ6,                KN0, KA3, KM0, KP1,   KC0, KQ0, KR0  \
+	) { /*        00-A  01-B  02-C  03-D  04-E  05-F  06-G  07-H  08-I  09-J  10-K  11-L  12-M  13-N  14-O  15-P  16-Q  17-R */ \
+		/* 0 */  { ___ , ___ , KC0 , ___ , ___ , KF0 , ___ , ___ , ___ , KJ0 , KK0 , ___ , KM0 , KN0 , KO0 , ___ , KQ0 , KR0 }, \
+		/* 1 */  { ___ , ___ , ___ , ___ , ___ , ___ , KG1 , KH1 , KI1 , KJ1 , KK1 , KL1 , KM1 , ___ , KO1 , KP1 , ___ , ___ }, \
+		/* 2 */  { ___ , KB2 , ___ , KD2 , ___ , KF2 , KG2 , KH2 , KI2 , KJ2 , KK2 , KL2 , KM2 , ___ , KO2 , ___ , ___ , ___ }, \
+		/* 3 */  { KA3 , KB3 , ___ , ___ , ___ , KF3 , KG3 , KH3 , KI3 , KJ3 , KK3 , KL3 , KM3 , ___ , KO3 , ___ , ___ , ___ }, \
+		/* 4 */  { ___ , ___ , KC4 , ___ , KE4 , KF4 , KG4 , KH4 , KI4 , KJ4 , KK4 , KL4 , KM4 , ___ , KO4 , KP4 , KQ4 , KR4 }, \
+		/* 5 */  { ___ , ___ , KC5 , ___ , KE5 , KF5 , KG5 , KH5 , KI5 , KJ5 , KK5 , KL5 , KM5 , KN5 , KO5 , KP5 , ___ , ___ }, \
+		/* 6 */  { ___ , ___ , KC6 , ___ , ___ , KF6 , KG6 , KH6 , KI6 , KJ6 , KK6 , KL6 , ___ , KN6 , KO6 , ___ , KQ6 , ___ }, \
+		/* 7 */  { ___ , ___ , ___ , ___ , ___ , KF7 , KG7 , KH7 , KI7 , KJ7 , KK7 , KL7 , KM7 , KN7 , ___ , KP7 , ___ , ___ }, \
+	}
+
+inline void ph_caps_led_on(void)  { DDRC |=  (1<<6); PORTC &= ~(1<<6); }
+inline void ph_caps_led_off(void) { DDRC &= ~(1<<6); PORTC &= ~(1<<6); }
+
+inline void ph_sclk_led_on(void)  { DDRC |=  (1<<5); PORTC &= ~(1<<5); }
+inline void ph_sclk_led_off(void) { DDRC &= ~(1<<5); PORTC &= ~(1<<5); }
+
+
+#endif

+ 67 - 0
keyboards/pegasushoof/rules.mk

@@ -0,0 +1,67 @@
+# MCU name
+MCU = atmega32u2
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+
+# Build Options
+#   change yes to no to disable
+#
+BOOTMAGIC_ENABLE ?= yes      # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
+CONSOLE_ENABLE ?= yes        # Console for debug(+400)
+COMMAND_ENABLE ?= yes        # Commands for debug and configuration
+NKRO_ENABLE ?= no            # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE ?= no       # Enable keyboard backlight functionality
+MIDI_ENABLE ?= no            # MIDI controls
+AUDIO_ENABLE ?= no           # Audio output on port C6
+UNICODE_ENABLE ?= no         # Unicode
+BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
+RGBLIGHT_ENABLE ?= no        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
+
+
+CUSTOM_MATRIX ?= yes
+SRC = matrix.c

+ 0 - 3
keyboards/planck/rev3/Makefile

@@ -1,3 +0,0 @@
-ifndef MAKEFILE_INCLUDED
-	include ../../../Makefile
-endif