summary refs log tree commit diff
path: root/quantum
diff options
context:
space:
mode:
authorWojciech Siewierski <wojciech.siewierski@onet.pl>2016-04-03 11:14:08 +0200
committerWojciech Siewierski <wojciech.siewierski@onet.pl>2016-04-03 11:23:00 +0200
commit47dd29513eeec7b7f639bef6df441a905ce8bacb (patch)
tree29170847273e786384bd3d7c7781e67dc4335bbb /quantum
parent8ef14d09b8451b3f2a77e6f019922eae0ac43642 (diff)
parent8d39263d2444f0273327902684c802b218efb7b6 (diff)
Merge branch 'master' of https://github.com/jackhumbert/qmk_firmware into modifier-release-fix
Diffstat (limited to 'quantum')
-rw-r--r--quantum/keymap_common.c1
-rw-r--r--quantum/keymap_extras/keymap_bepo.h311
-rw-r--r--quantum/keymap_extras/keymap_german_osx.h156
-rw-r--r--quantum/keymap_midi.c4
-rw-r--r--quantum/led.c9
-rw-r--r--quantum/matrix.c16
-rw-r--r--quantum/template/Makefile23
-rw-r--r--quantum/template/README.md2
-rw-r--r--quantum/template/config.h92
-rw-r--r--quantum/template/template.c49
-rw-r--r--quantum/template/template.h10
11 files changed, 544 insertions, 129 deletions
diff --git a/quantum/keymap_common.c b/quantum/keymap_common.c
index 7068ca4f31..2eef4f15a7 100644
--- a/quantum/keymap_common.c
+++ b/quantum/keymap_common.c
@@ -25,6 +25,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "debug.h"
 #include "backlight.h"
 #include "keymap_midi.h"
+#include "bootloader.h"
 
 #include <stdio.h>
 #include <inttypes.h>
diff --git a/quantum/keymap_extras/keymap_bepo.h b/quantum/keymap_extras/keymap_bepo.h
new file mode 100644
index 0000000000..1ab2d63ddd
--- /dev/null
+++ b/quantum/keymap_extras/keymap_bepo.h
@@ -0,0 +1,311 @@
+/* Keymap macros for the French BÉPO layout - http://bepo.fr */
+#ifndef KEYMAP_BEPO_H
+#define KEYMAP_BEPO_H
+
+#include "keymap_common.h"
+
+// Alt gr
+#ifndef ALTGR
+#define ALTGR(kc)   RALT(kc)
+#endif
+#ifndef ALGR
+#define ALGR(kc)    ALTGR(kc)
+#endif
+#define BP_ALGR KC_RALT
+
+// Normal characters
+// First row (on usual keyboards)
+#define BP_DOLLAR           KC_GRAVE            // $
+#define BP_DLR              BP_DOLLAR
+#define BP_DOUBLE_QUOTE     KC_1                // "
+#define BP_DQOT             BP_DOUBLE_QUOTE
+#define BP_LEFT_GUILLEMET   KC_2                // «
+#define BP_LGIL             BP_LEFT_GUILLEMET
+#define BP_RIGHT_GUILLEMET  KC_3                // »
+#define BP_RGIL             BP_RIGHT_GUILLEMET
+#define BP_LEFT_PAREN       KC_4                // (
+#define BP_LPRN             BP_LEFT_PAREN
+#define BP_RIGHT_PAREN      KC_5                // )
+#define BP_RPRN             BP_RIGHT_PAREN
+#define BP_AT               KC_6                // @
+#define BP_PLUS             KC_7                // +
+#define BP_MINUS            KC_8                // -
+#define BP_MINS             BP_MINUS
+#define BP_SLASH            KC_9                // /
+#define BP_SLSH             BP_SLASH
+#define BP_ASTERISK         KC_0                // *
+#define BP_ASTR             BP_ASTERISK
+#define BP_EQUAL            KC_MINUS            // =
+#define BP_EQL              BP_EQUAL
+#define BP_PERCENT          KC_EQUAL            // %
+#define BP_PERC             BP_PERCENT
+
+// Second row
+#define BP_B                KC_Q
+#define BP_E_ACUTE          KC_W        // é
+#define BP_ECUT             BP_E_ACUTE
+#define BP_P                KC_E
+#define BP_O                KC_R
+#define BP_E_GRAVE          KC_T        // è
+#define BP_EGRV             BP_E_GRAVE
+#define BP_DEAD_CIRCUMFLEX  KC_Y        // dead ^
+#define BP_DCRC             BP_DEAD_CIRCUMFLEX
+#define BP_V                KC_U
+#define BP_D                KC_I
+#define BP_L                KC_O
+#define BP_J                KC_P
+#define BP_Z                KC_LBRACKET
+#define BP_W                KC_RBRACKET
+
+// Third row
+#define BP_A            KC_A
+#define BP_U            KC_S
+#define BP_I            KC_D
+#define BP_E            KC_F
+#define BP_COMMA        KC_G        // ,
+#define BP_COMM         BP_COMMA
+#define BP_C            KC_H
+#define BP_T            KC_J
+#define BP_S            KC_K
+#define BP_R            KC_L
+#define BP_N            KC_SCOLON
+#define BP_M            KC_QUOTE
+#define BP_C_CEDILLA    KC_BSLASH   // ç
+#define BP_CCED         BP_C_CEDILLA
+
+// Fourth row
+#define BP_E_CIRCUMFLEX     KC_NONUS_BSLASH // ê
+#define BP_ECRC             BP_E_CIRCUMFLEX
+#define BP_A_GRAVE          KC_Z            // à
+#define BP_AGRV             BP_A_GRAVE
+#define BP_Y                KC_X
+#define BP_X                KC_C
+#define BP_DOT              KC_V            // .
+#define BP_K                KC_B
+#define BP_APOSTROPHE       KC_N
+#define BP_APOS             BP_APOSTROPHE   // '
+#define BP_Q                KC_M
+#define BP_G                KC_COMMA
+#define BP_H                KC_DOT
+#define BP_F                KC_SLASH
+
+// Shifted characters
+// First row
+#define BP_HASH     LSFT(BP_DOLLAR)     // #
+#define BP_1        LSFT(KC_1)
+#define BP_2        LSFT(KC_2)
+#define BP_3        LSFT(KC_3)
+#define BP_4        LSFT(KC_4)
+#define BP_5        LSFT(KC_5)
+#define BP_6        LSFT(KC_6)
+#define BP_7        LSFT(KC_7)
+#define BP_8        LSFT(KC_8)
+#define BP_9        LSFT(KC_9)
+#define BP_0        LSFT(KC_0)
+#define BP_DEGREE   LSFT(BP_EQUAL)      // °
+#define BP_DEGR     BP_DEGREE
+#define BP_GRAVE    LSFT(BP_PERCENT)    // `
+#define BP_GRV      BP_GRAVE
+
+// Second row
+#define BP_EXCLAIM  LSFT(BP_DEAD_CIRCUMFLEX)    // !
+#define BP_EXLM     BP_EXCLAIM
+
+// Third row
+#define BP_SCOLON   LSFT(BP_COMMA)  // ;
+#define BP_SCLN     BP_SCOLON
+
+// Fourth row
+#define BP_COLON    LSFT(BP_DOT)    // :
+#define BP_COLN     BP_COLON
+#define BP_QUESTION LSFT(BP_QUOTE)  // ?
+#define BP_QEST     BP_QUESTION
+
+// Space bar
+#define BP_NON_BREAKING_SPACE   LSFT(KC_SPACE)
+#define BP_NBSP                 BP_NON_BREAKING_SPACE
+
+// AltGr-ed characters
+// First row
+#define BP_EN_DASH          ALTGR(BP_DOLLAR)    // –
+#define BP_NDSH             BP_EN_DASH
+#define BP_EM_DASH          ALTGR(KC_1)         // —
+#define BP_MDSH             BP_EM_DASH
+#define BP_LESS             ALTGR(KC_2)         // <
+#define BP_GREATER          ALTGR(KC_3)         // >
+#define BP_GRTR             BP_GREATER
+#define BP_LBRACKET         ALTGR(KC_4)         // [
+#define BP_LBRC             BP_LBRACKET
+#define BP_RBRACKET         ALTGR(KC_5)         // ]
+#define BP_RBRC             BP_RBRACKET
+#define BP_CIRCUMFLEX       ALTGR(KC_6)         // ^
+#define BP_CIRC             BP_CIRCUMFLEX
+#define BP_PLUS_MINUS       ALTGR(KC_7)         // ±
+#define BP_PSMS             BP_PLUS_MINUS
+#define BP_MATH_MINUS       ALTGR(KC_8)         // −
+#define BP_MMNS             BP_MATH_MINUS
+#define BP_OBELUS           ALTGR(KC_9)         // ÷
+#define BP_OBEL             BP_OBELUS
+// more conventional name of the symbol
+#define BP_DIVISION_SIGN    BP_OBELUS
+#define BP_DVSN             BP_DIVISION_SIGN
+#define BP_TIMES            ALTGR(KC_0)         // ×
+#define BP_TIMS             BP_TIMES
+#define BP_DIFFERENT        ALTGR(BP_EQUAL)     // ≠
+#define BP_DIFF             BP_DIFFERENT
+#define BP_PERMILLE         ALTGR(BP_PERCENT)   // ‰
+#define BP_PMIL             BP_PERMILLE
+
+// Second row
+#define BP_PIPE                 ALTGR(BP_B)         // |
+#define BP_DEAD_ACUTE           ALTGR(BP_E_ACUTE)   // dead ´
+#define BP_DACT                 BP_DEAD_ACUTE
+#define BP_AMPERSAND            ALTGR(BP_P)         // &
+#define BP_AMPR                 BP_AMPERSAND
+#define BP_OE_LIGATURE          ALTGR(BP_O)         // œ
+#define BP_OE                   BP_OE_LIGATURE
+#define BP_DEAD_GRAVE           ALTGR(BP_E_GRAVE)   // `
+#define BP_DGRV                 BP_DEAD_GRAVE
+#define BP_INVERTED_EXCLAIM     ALTGR(BP_DEAD_CIRCUMFLEX)   // ¡
+#define BP_IXLM                 BP_INVERTED_EXCLAIM
+#define BP_DEAD_CARON           ALTGR(BP_V)         // dead ˇ
+#define BP_DCAR                 BP_DEAD_CARON
+#define BP_ETH                  ALTGR(BP_D)         // ð
+#define BP_DEAD_SLASH           ALTGR(BP_L)         // dead /
+#define BP_DSLH                 BP_DEAD_SLASH
+#define BP_IJ_LIGATURE          ALTGR(BP_J)         // ij
+#define BP_IJ                   BP_IJ_LIGATURE
+#define BP_SCHWA                ALTGR(BP_Z)         // ə
+#define BP_SCWA                 BP_SCHWA
+#define BP_DEAD_BREVE           ALTGR(BP_W)         // dead ˘
+#define BP_DBRV                 BP_DEAD_BREVE
+
+// Third row
+#define BP_AE_LIGATURE              ALTGR(BP_A)         // æ
+#define BP_AE                       BP_AE_LIGATURE
+#define BP_U_GRAVE                  AGR(BP_U)           // ù
+#define BP_UGRV                     BP_U_GRAVE
+#define BP_DEAD_TREMA               ALTGR(BP_I)         // dead ¨ (trema/umlaut/diaresis)
+#define BP_DTRM                     BP_DEAD_TREMA
+#define BP_EURO                     ALTGR(BP_E)         // €
+#define BP_TYPOGRAPHICAL_APOSTROPHE ALTGR(BP_COMMMA)    // ’
+#define BP_TAPO                     BP_TYPOGRAPHICAL_APOSTROPHE
+#define BP_COPYRIGHT                ALTGR(BP_C)         // ©
+#define BP_CPRT                     BP_COPYRIGHT
+#define BP_THORN                    ALTGR(BP_T)         // þ
+#define BP_THRN                     BP_THORN
+#define BP_SHARP_S                  ALTGR(BP_S)         // ß
+#define BP_SRPS                     BP_SHARP_S
+#define BP_REGISTERED_TRADEMARK     ALTGR(BP_R)         // ®
+#define BP_RTM                      BP_REGISTERED_TRADEMARK
+#define BP_DEAD_TILDE               ALTGR(BP_N)         // dead ~
+#define BP_DTLD                     BP_DEAD_TILDE
+#define BP_DEAD_MACRON              ALTGR(BP_M)         // dead ¯
+#define BP_DMCR                     BP_DEAD_MACRON
+#define BP_DEAD_CEDILLA             ALTGR(BP_C_CEDILLA) // dead ¸
+#define BP_DCED                     BP_DEAD_CEDILLA
+
+// Fourth row
+#define BP_NONUS_SLASH          ALTGR(BP_E_CIRCUMFLEX)  // / on non-us backslash key (102nd key, ê in bépo)
+#define BP_NUSL                 BP_NONUS_SLASH
+#define BP_BACKSLASH            ALTGR(BP_A_GRAVE)       /* \ */
+#define BP_BSLS                 BP_BACKSLASH
+#define BP_LEFT_CURLY_BRACE     ALTGR(BP_Y)             // {
+#define BP_LCBR                 BP_LEFT_CURLY_BRACE
+#define BP_RIGHT_CURLY_BRACE    ALTGR(BP_X)             // }
+#define BP_RCBR                 BP_RIGHT_CURLY_BRACE
+#define BP_ELLIPSIS             ALTGR(BP_DOT)           // …
+#define BP_ELPS                 BP_ELLIPSIS
+#define BP_TILDE                ALTGR(BP_K)             // ~
+#define BP_TILD                 BP_TILDE
+#define BP_INVERTED_QUESTION    ALTGR(BP_QUESTION)      // ¿
+#define BP_IQST                 BP_INVERTED_QUESTION
+#define BP_DEAD_RING            ALTGR(BP_Q)             // dead °
+#define BP_DRNG                 BP_DEAD_RING
+#define BP_DEAD_GREEK           ALTGR(BP_G)             // dead Greek key (following key will make a Greek letter)
+#define BP_DGRK                 BP_DEAD_GREEK
+#define BP_DAGGER               ALTGR(BP_H)             // †
+#define BP_DAGR                 BP_DAGGER
+#define BP_DEAD_OGONEK          ALTGR(BP_F)             // dead ˛
+#define BP_DOGO                 BP_DEAD_OGONEK
+
+// Space bar
+#define BP_UNDERSCORE   ALTGR(KC_SPACE)     // _
+#define BP_UNDS         BP_UNDERSCORE
+
+// AltGr-Shifted characters (different from capitalised AltGr-ed characters)
+// First row
+#define BP_PARAGRAPH            ALTGR(BP_HASH)      // ¶
+#define BP_PARG                 BP_PARAGRAPH
+#define BP_LOW_DOUBLE_QUOTE     ALTGR(BP_1)         // „
+#define BP_LWQT                 BP_LOW_DOUBLE_QUOTE
+#define BP_LEFT_DOUBLE_QUOTE    ALTGR(BP_2)         // “
+#define BP_LDQT                 BP_LEFT_DOUBLE_QUOTE
+#define BP_RIGHT_DOUBLE_QUOTE   ALTGR(BP_3)         // ”
+#define BP_RDQT                 BP_RIGHT_DOUBLE_QUOTE
+#define BP_LESS_OR_EQUAL        ALTGR(BP_4)         // ≤
+#define BP_LEQL                 BP_LESS_OR_EQUAL
+#define BP_GREATER_OR_EQUAL     ALTGR(BP_5)         // ≥
+#define BP_GEQL                 BP_GREATER_OR_EQUAL
+// nothing on ALTGR(BP_6)
+#define BP_NEGATION             ALTGR(BP_7)         // ¬
+#define BP_NEGT                 BP_NEGATION
+#define BP_ONE_QUARTER          ALTGR(BP_8)         // ¼
+#define BP_1QRT                 BP_ONE_QUARTER
+#define BP_ONE_HALF             ALTGR(BP_9)         // ½
+#define BP_1HLF                 BP_ONE_HALF
+#define BP_THREE_QUARTERS       ALTGR(BP_0)         // ¾
+#define BP_3QRT                 BP_THREE_QUARTERS
+#define BP_MINUTES              ALTGR(BP_DEGREE)    // ′
+#define BP_MNUT                 BP_MINUTES
+#define BP_SECONDS              ALTGR(BP_GRAVE)     // ″
+#define BP_SCND                 BP_SECONDS
+
+// Second row
+#define BP_BROKEN_PIPE          LSFT(BP_PIPE)           // ¦
+#define BP_BPIP                 BP_BROKEN_PIPE
+#define BP_DEAD_DOUBLE_ACUTE    LSFT(BP_DEAD_ACUTE)     // ˝
+#define BP_DDCT                 BP_DEAD_DOUBLE_ACUTE
+#define BP_SECTION              ALTGR(LSFT(BP_P))       // §
+#define BP_SECT                 BP_SECTION
+// LSFT(BP_DEAD_GRAVE) is actually the same character as LSFT(BP_PERCENT)
+#define BP_GRAVE_BIS            LSFT(BP_DEAD_GRAVE)     // `
+#define BP_GRVB                 BP_GRAVE_BIS
+
+// Third row
+#define BP_DEAD_DOT_ABOVE       LSFT(BP_DEAD_TREMA)     // dead ˙
+#define BP_DDTA                 BP_DEAD_DOT_ABOVE
+#define BP_DEAD_CURRENCY        LSFT(BP_EURO)           // dead ¤ (next key will generate a currency code like ¥ or £)
+#define BP_DCUR                 BP_DEAD_CURRENCY
+#define BP_DEAD_HORN            LSFT(ALTGR(BP_COMMA))   // dead ̛
+#define BP_DHRN                 BP_DEAD_HORN
+#define BP_LONG_S               LSFT(ALTGR(BP_C))       // ſ
+#define BP_LNGS                 BP_LONG_S
+#define BP_TRADEMARK            LSFT(BP_REGISTERED_TRADEMARK)   // ™
+#define BP_TM                   BP_TRADEMARK
+#define BP_ORDINAL_INDICATOR_O  LSFT(ALTGR(BP_M))               // º
+#define BP_ORDO                 BP_ORDINAL_INDICATOR_O
+#define BP_DEAD_COMMA           LSFT(BP_DEAD_CEDILLA)   // dead ˛
+#define BP_DCOM                 BP_DEAD_COMMA
+
+// Fourth row
+#define BP_LEFT_QUOTE           LSFT(ALTGR(BP_Y))       // ‘
+#define BP_LQOT                 BP_LEFT_QUOTE
+#define BP_RIGHT_QUOTE          LSFT(ALTGR(BP_X))       // ’
+#define BP_RQOT                 BP_RIGHT_QUOTE
+#define BP_INTERPUNCT           LSFT(ALTGR(BP_DOT))     // ·
+#define BP_IPCT                 BP_INTERPUNCT
+#define BP_DEAD_HOOK_ABOVE      LSFT(ALTGR(BP_QUESTION))    // dead ̉
+#define BP_DHKA                 BP_DEAD_HOOK_ABOVE
+#define BP_DEAD_UNDERDOT        LSFT(BP_DEAD_RING)      // dead ̣
+#define BP_DUDT                 BP_DEAD_UNDERDOT
+#define BP_DOUBLE_DAGGER        LSFT(BP_DAGGER)         // ‡
+#define BP_DDGR                 BP_DOUBLE_DAGGER
+#define BP_ORDINAL_INDICATOR_A  LSFT(ALTGR(BP_F))       // ª
+#define BP_ORDA                 BP_ORDINAL_INDICATOR_A
+
+// Space bar
+#define BP_NARROW_NON_BREAKING_SPACE    ALTGR(BP_NON_BREAKING_SPACE)
+#define BP_NNBS                         BP_NARROW_NON_BREAKING_SPACE
+
+#endif
diff --git a/quantum/keymap_extras/keymap_german_osx.h b/quantum/keymap_extras/keymap_german_osx.h
index b011561e2f..d0b77fb803 100644
--- a/quantum/keymap_extras/keymap_german_osx.h
+++ b/quantum/keymap_extras/keymap_german_osx.h
@@ -9,92 +9,92 @@
 // Alt gr
 
 // normal characters
-#define DE_Z KC_Y
-#define DE_Y KC_Z
+#define DE_OSX_Z KC_Y
+#define DE_OSX_Y KC_Z
 
-#define DE_A KC_A 
-#define DE_B KC_B
-#define DE_C KC_C
-#define DE_D KC_D
-#define DE_E KC_E
-#define DE_F KC_F
-#define DE_G KC_G
-#define DE_H KC_H
-#define DE_I KC_I
-#define DE_J KC_J
-#define DE_K KC_K
-#define DE_L KC_L
-#define DE_M KC_M
-#define DE_N KC_N
-#define DE_O KC_O
-#define DE_P KC_P
-#define DE_Q KC_Q
-#define DE_R KC_R
-#define DE_S KC_S
-#define DE_T KC_T
-#define DE_U KC_U
-#define DE_V KC_V
-#define DE_W KC_W
-#define DE_X KC_X
+#define DE_OSX_A KC_A
+#define DE_OSX_B KC_B
+#define DE_OSX_C KC_C
+#define DE_OSX_D KC_D
+#define DE_OSX_E KC_E
+#define DE_OSX_F KC_F
+#define DE_OSX_G KC_G
+#define DE_OSX_H KC_H
+#define DE_OSX_I KC_I
+#define DE_OSX_J KC_J
+#define DE_OSX_K KC_K
+#define DE_OSX_L KC_L
+#define DE_OSX_M KC_M
+#define DE_OSX_N KC_N
+#define DE_OSX_O KC_O
+#define DE_OSX_P KC_P
+#define DE_OSX_Q KC_Q
+#define DE_OSX_R KC_R
+#define DE_OSX_S KC_S
+#define DE_OSX_T KC_T
+#define DE_OSX_U KC_U
+#define DE_OSX_V KC_V
+#define DE_OSX_W KC_W
+#define DE_OSX_X KC_X
 
-#define DE_0 KC_0
-#define DE_1 KC_1
-#define DE_2 KC_2
-#define DE_3 KC_3
-#define DE_4 KC_4
-#define DE_5 KC_5
-#define DE_6 KC_6
-#define DE_7 KC_7
-#define DE_8 KC_8
-#define DE_9 KC_9
+#define DE_OSX_0 KC_0
+#define DE_OSX_1 KC_1
+#define DE_OSX_2 KC_2
+#define DE_OSX_3 KC_3
+#define DE_OSX_4 KC_4
+#define DE_OSX_5 KC_5
+#define DE_OSX_6 KC_6
+#define DE_OSX_7 KC_7
+#define DE_OSX_8 KC_8
+#define DE_OSX_9 KC_9
 
-#define DE_DOT KC_DOT
-#define DE_COMM KC_COMM
+#define DE_OSX_DOT KC_DOT
+#define DE_OSX_COMM KC_COMM
 
-#define DE_SS KC_MINS
-#define DE_AE KC_QUOT
-#define DE_UE KC_LBRC
-#define DE_OE KC_SCLN
+#define DE_OSX_SS KC_MINS
+#define DE_OSX_AE KC_QUOT
+#define DE_OSX_UE KC_LBRC
+#define DE_OSX_OE KC_SCLN
 
-#define DE_CIRC KC_NUBS // accent circumflex ^ and ring °
-#define DE_ACUT KC_EQL // accent acute ´ and grave `
-#define DE_PLUS KC_RBRC // + and * and ~
-#define DE_HASH KC_BSLS // # and '
-#define DE_LESS KC_GRV // < and > and |
-#define DE_MINS KC_SLSH // - and _
+#define DE_OSX_CIRC KC_NUBS // accent circumflex ^ and ring °
+#define DE_OSX_ACUT KC_EQL // accent acute ´ and grave `
+#define DE_OSX_PLUS KC_RBRC // + and * and ~
+#define DE_OSX_HASH KC_BSLS // # and '
+#define DE_OSX_LESS KC_GRV // < and > and |
+#define DE_OSX_MINS KC_SLSH // - and _
 
 // shifted characters
-#define DE_RING LSFT(DE_CIRC) // °
-#define DE_EXLM LSFT(KC_1) // !
-#define DE_DQOT LSFT(KC_2) // "
-#define DE_PARA LSFT(KC_3) // §
-#define DE_DLR  LSFT(KC_4) // $
-#define DE_PERC LSFT(KC_5) // %
-#define DE_AMPR LSFT(KC_6) // &
-#define DE_SLSH LSFT(KC_7) // /
-#define DE_LPRN LSFT(KC_8) // (
-#define DE_RPRN LSFT(KC_9) // )
-#define DE_EQL  LSFT(KC_0) // =
-#define DE_QST  LSFT(DE_SS) // ?
-#define DE_GRV  LSFT(DE_ACUT) // `
-#define DE_ASTR LSFT(DE_PLUS) // *
-#define DE_QUOT LSFT(DE_HASH) // '
-#define DE_MORE LSFT(DE_LESS) // >
-#define DE_COLN LSFT(KC_DOT) // :
-#define DE_SCLN LSFT(KC_COMM) // ;
-#define DE_UNDS LSFT(DE_MINS) // _
+#define DE_OSX_RING LSFT(DE_OSX_CIRC) // °
+#define DE_OSX_EXLM LSFT(KC_1) // !
+#define DE_OSX_DQOT LSFT(KC_2) // "
+#define DE_OSX_PARA LSFT(KC_3) // §
+#define DE_OSX_DLR  LSFT(KC_4) // $
+#define DE_OSX_PERC LSFT(KC_5) // %
+#define DE_OSX_AMPR LSFT(KC_6) // &
+#define DE_OSX_SLSH LSFT(KC_7) // /
+#define DE_OSX_LPRN LSFT(KC_8) // (
+#define DE_OSX_RPRN LSFT(KC_9) // )
+#define DE_OSX_EQL  LSFT(KC_0) // =
+#define DE_OSX_QST  LSFT(DE_OSX_SS) // ?
+#define DE_OSX_GRV  LSFT(DE_OSX_ACUT) // `
+#define DE_OSX_ASTR LSFT(DE_OSX_PLUS) // *
+#define DE_OSX_QUOT LSFT(DE_OSX_HASH) // '
+#define DE_OSX_MORE LSFT(DE_OSX_LESS) // >
+#define DE_OSX_COLN LSFT(KC_DOT) // :
+#define DE_OSX_SCLN LSFT(KC_COMM) // ;
+#define DE_OSX_UNDS LSFT(DE_OSX_MINS) // _
 
 // Alt-ed characters
-#define DE_SQ2 LALT(KC_2) // ²
-#define DE_SQ3 LALT(KC_3) // ³
-#define DE_LCBR LALT(KC_7) // {
-#define DE_LBRC LALT(KC_5) // [
-#define DE_RBRC LALT(KC_6) // ]
-#define DE_RCBR LALT(KC_9) // }
-#define DE_BSLS LALT(LSFT(KC_7)) // backslash
-#define DE_AT  LALT(DE_L) // @
-#define DE_EURO LALT(KC_E) // €
-#define DE_TILD LALT(DE_N) // ~
-#define DE_PIPE LALT(DE_7) // |
+#define DE_OSX_SQ2 LALT(KC_2) // ²
+#define DE_OSX_SQ3 LALT(KC_3) // ³
+#define DE_OSX_LCBR LALT(KC_8) // {
+#define DE_OSX_LBRC LALT(KC_5) // [
+#define DE_OSX_RBRC LALT(KC_6) // ]
+#define DE_OSX_RCBR LALT(KC_9) // }
+#define DE_OSX_BSLS LALT(LSFT(KC_7)) // backslash
+#define DE_OSX_AT  LALT(DE_OSX_L) // @
+#define DE_OSX_EURO LALT(KC_E) // €
+#define DE_OSX_TILD LALT(DE_OSX_N) // ~
+#define DE_OSX_PIPE LALT(DE_OSX_7) // |
 
 #endif
diff --git a/quantum/keymap_midi.c b/quantum/keymap_midi.c
index e37ea31039..ac45d25892 100644
--- a/quantum/keymap_midi.c
+++ b/quantum/keymap_midi.c
@@ -99,11 +99,11 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
 
     if (record->event.pressed) {
     	// midi_send_noteon(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127);
-        midi_send_noteon(&midi_device, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127);
+        // midi_send_noteon(&midi_device, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127);
         play_note(((double)261.626)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF);
     } else {
         // midi_send_noteoff(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127);
-        midi_send_noteoff(&midi_device, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127);
+        // midi_send_noteoff(&midi_device, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127);
         stop_note(((double)261.626)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)));
     }
 }
\ No newline at end of file
diff --git a/quantum/led.c b/quantum/led.c
index 2c05746607..9cdb8a5c20 100644
--- a/quantum/led.c
+++ b/quantum/led.c
@@ -19,9 +19,16 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "stdint.h"
 #include "led.h"
 
+__attribute__ ((weak))
+void led_set_kb(uint8_t usb_led) {
+
+}
 
 void led_set(uint8_t usb_led)
 {
+
+	// Example LED Code
+	//
     // // Using PE6 Caps Lock LED
     // if (usb_led & (1<<USB_LED_CAPS_LOCK))
     // {
@@ -35,4 +42,6 @@ void led_set(uint8_t usb_led)
     //     DDRE &= ~(1<<6);
     //     PORTE &= ~(1<<6);
     // }
+
+	led_set_kb(usb_led);
 }
diff --git a/quantum/matrix.c b/quantum/matrix.c
index 95bf4c0973..2dab6ae941 100644
--- a/quantum/matrix.c
+++ b/quantum/matrix.c
@@ -48,14 +48,14 @@ static void unselect_rows(void);
 static void select_row(uint8_t row);
 
 __attribute__ ((weak))
-void * matrix_init_kb(void) {
+void matrix_init_kb(void) {
 
-};
+}
 
 __attribute__ ((weak))
-void * matrix_scan_kb(void) {
+void matrix_scan_kb(void) {
 
-};
+}
 
 inline
 uint8_t matrix_rows(void)
@@ -86,9 +86,7 @@ void matrix_init(void)
         matrix_debouncing[i] = 0;
     }
 
-    if (matrix_init_kb) {
-        (*matrix_init_kb)();
-    }
+    matrix_init_kb();
 }
 
 
@@ -152,9 +150,7 @@ uint8_t matrix_scan(void)
     }
 #endif
 
-    if (matrix_scan_kb) {
-        (*matrix_scan_kb)();
-    }
+    matrix_scan_kb();
 
     return 1;
 }
diff --git a/quantum/template/Makefile b/quantum/template/Makefile
index 2efa691380..4fa195468d 100644
--- a/quantum/template/Makefile
+++ b/quantum/template/Makefile
@@ -113,18 +113,19 @@ OPT_DEFS += -DBOOTLOADER_SIZE=512
 # Build Options
 #   comment out to disable the options.
 #
-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
+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
+KEYBOARD_LOCK_ENABLE = yes	# Allow locking of keyboard via magic key
 # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-# SLEEP_LED_ENABLE = yes  # Breathing sleep LED during USB suspend
-# NKRO_ENABLE = yes		# USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-# BACKLIGHT_ENABLE = yes  # Enable keyboard backlight functionality
-# MIDI_ENABLE = YES 		# MIDI controls
-# UNICODE_ENABLE = YES 		# Unicode
-# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
+# SLEEP_LED_ENABLE = yes	# Breathing sleep LED during USB suspend
+#NKRO_ENABLE = yes			# USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+# BACKLIGHT_ENABLE = yes	# Enable keyboard backlight functionality
+# MIDI_ENABLE = YES			# MIDI controls
+# UNICODE_ENABLE = YES		# Unicode
+# BLUETOOTH_ENABLE = yes	# Enable Bluetooth with the Adafruit EZ-Key HID
 
 
 # Optimize size but this may cause error "relocation truncated to fit"
diff --git a/quantum/template/README.md b/quantum/template/README.md
index dc163a2f4b..39f9f59d10 100644
--- a/quantum/template/README.md
+++ b/quantum/template/README.md
@@ -15,7 +15,7 @@ Depending on which keymap you would like to use, you will have to compile slight
 To build with the default keymap, simply run `make`.
 
 ### Other Keymaps
-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>.c` and see keymap document (you can find in top README.md) and existent keymap files.
+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>.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 do `make` with `KEYMAP` option like:
 ```
diff --git a/quantum/template/config.h b/quantum/template/config.h
index 7d6149f436..e6fb7866c6 100644
--- a/quantum/template/config.h
+++ b/quantum/template/config.h
@@ -32,34 +32,110 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define MATRIX_ROWS 2
 #define MATRIX_COLS 3
 
-// Planck PCB default pin-out
-// Change this to how you wired your keyboard
-// COLS: Left to right, ROWS: Top to bottom
+/*
+ * Keyboard Matrix Assignments
+ *
+ * Change this to how you wired your keyboard
+ * COLS: AVR pins used for columns, left to right
+ * ROWS: AVR pins used for rows, top to bottom
+ * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
+ *                  ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
+ *
+*/ 
 #define COLS (int []){ F1, F0, B0 }
 #define ROWS (int []){ D0, D5 }
 
 /* COL2ROW or ROW2COL */
 #define DIODE_DIRECTION COL2ROW
 
-/* define if matrix has ghost */
+/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
+#define DEBOUNCE    5
+
+/* define if matrix has ghost (lacks anti-ghosting diodes) */
 //#define MATRIX_HAS_GHOST
 
 /* number of backlight levels */
 #define BACKLIGHT_LEVELS 3
 
-/* Set 0 if debouncing isn't needed */
-#define DEBOUNCE    5
-
 /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
 #define LOCKING_SUPPORT_ENABLE
 /* Locking resynchronize hack */
 #define LOCKING_RESYNC_ENABLE
 
-/* key combination for command */
+/* 
+ * Force NKRO
+ *
+ * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved 
+ * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
+ * makefile for this to work.)
+ *
+ * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
+ * until the next keyboard reset.
+ *
+ * NKRO may prevent your keystrokes from being detected in the BIOS, but it is 
+ * fully operational during normal computer usage.
+ *
+ * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
+ * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
+ * bootmagic, NKRO mode will always be enabled until it is toggled again during a
+ * power-up.
+ *
+ */
+//#define FORCE_NKRO
+
+/*
+ * Magic Key Options
+ *
+ * Magic keys are hotkey commands that allow control over firmware functions of
+ * the keyboard. They are best used in combination with the HID Listen program,
+ * found here: https://www.pjrc.com/teensy/hid_listen.html
+ *
+ * The options below allow the magic key functionality to be changed. This is 
+ * useful if your keyboard/keypad is missing keys and you want magic key support.
+ *
+ */
+
+/* key combination for magic key command */
 #define IS_COMMAND() ( \
     keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
 )
 
+/* control how magic key switches layers */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS  true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS  true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
+
+/* override magic key keymap */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
+//#define MAGIC_KEY_HELP1          H
+//#define MAGIC_KEY_HELP2          SLASH
+//#define MAGIC_KEY_DEBUG          D
+//#define MAGIC_KEY_DEBUG_MATRIX   X
+//#define MAGIC_KEY_DEBUG_KBD      K
+//#define MAGIC_KEY_DEBUG_MOUSE    M
+//#define MAGIC_KEY_VERSION        V
+//#define MAGIC_KEY_STATUS         S
+//#define MAGIC_KEY_CONSOLE        C
+//#define MAGIC_KEY_LAYER0_ALT1    ESC
+//#define MAGIC_KEY_LAYER0_ALT2    GRAVE
+//#define MAGIC_KEY_LAYER0         0
+//#define MAGIC_KEY_LAYER1         1
+//#define MAGIC_KEY_LAYER2         2
+//#define MAGIC_KEY_LAYER3         3
+//#define MAGIC_KEY_LAYER4         4
+//#define MAGIC_KEY_LAYER5         5
+//#define MAGIC_KEY_LAYER6         6
+//#define MAGIC_KEY_LAYER7         7
+//#define MAGIC_KEY_LAYER8         8
+//#define MAGIC_KEY_LAYER9         9
+//#define MAGIC_KEY_BOOTLOADER     PAUSE
+//#define MAGIC_KEY_LOCK           CAPS
+//#define MAGIC_KEY_EEPROM         E
+//#define MAGIC_KEY_NKRO           N
+//#define MAGIC_KEY_SLEEP_LED      Z
+
 /*
  * Feature disable options
  *  These options are also useful to firmware size reduction.
diff --git a/quantum/template/template.c b/quantum/template/template.c
index 7be7dfc3d1..cc52e496ff 100644
--- a/quantum/template/template.c
+++ b/quantum/template/template.c
@@ -1,29 +1,48 @@
 #include "%KEYBOARD%.h"
 
 __attribute__ ((weak))
-void * matrix_init_user(void) {
-	// leave these blank
+void matrix_init_user(void) {
+	// leave this function blank - it can be defined in a keymap file
 };
 
 __attribute__ ((weak))
-void * matrix_scan_user(void) {
-	// leave these blank
-};
+void matrix_scan_user(void) {
+	// leave this function blank - it can be defined in a keymap file
+}
+
+__attribute__ ((weak))
+void process_action_user(keyrecord_t *record) {
+	// leave this function blank - it can be defined in a keymap file
+}
+
+__attribute__ ((weak))
+void led_set_user(uint8_t usb_led) {
+	// leave this function blank - it can be defined in a keymap file
+}
 
-void * matrix_init_kb(void) {
+void matrix_init_kb(void) {
 	// put your keyboard start-up code here
 	// runs once when the firmware starts up
 
-	if (matrix_init_user) {
-		(*matrix_init_user)();
-	}
-};
+	matrix_init_user();
+}
 
-void * matrix_scan_kb(void) {
+void matrix_scan_kb(void) {
 	// put your looping keyboard code here
 	// runs every cycle (a lot)
 
-	if (matrix_scan_user) {
-		(*matrix_scan_user)();
-	}
-};
\ No newline at end of file
+	matrix_scan_user();
+}
+
+void process_action_kb(keyrecord_t *record) {
+	// put your per-action keyboard code here
+	// runs for every action, just before processing by the firmware
+
+	process_action_user(record);
+}
+
+void led_set_kb(uint8_t usb_led) {
+	// put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
+
+	led_set_user(usb_led);
+}
diff --git a/quantum/template/template.h b/quantum/template/template.h
index a15061b267..b1c34d3cbe 100644
--- a/quantum/template/template.h
+++ b/quantum/template/template.h
@@ -17,9 +17,11 @@
 { \
     { k00, k01,   k02 }, \
     { k10, KC_NO, k11 }, \
-} 
+}
 
-void * matrix_init_user(void);
-void * matrix_scan_user(void);
+void matrix_init_user(void);
+void matrix_scan_user(void);
+void process_action_user(keyrecord_t *record);
+void led_set_user(uint8_t usb_led);
 
-#endif
\ No newline at end of file
+#endif