From f43cb314767403b8289fc957bd1d3b8250874192 Mon Sep 17 00:00:00 2001
From: Ryan <fauxpark@gmail.com>
Date: Sun, 19 Apr 2020 06:57:05 +1000
Subject: [PATCH] Update French and German macOS keymaps and add sendstring
 LUTs (#8700)

---
 quantum/keymap_extras/keymap_french_osx.h     | 306 ++++++++++----
 quantum/keymap_extras/keymap_german_osx.h     | 385 ++++++++++++++----
 quantum/keymap_extras/sendstring_french.h     |   2 +-
 quantum/keymap_extras/sendstring_french_osx.h | 100 +++++
 quantum/keymap_extras/sendstring_german_osx.h | 100 +++++
 5 files changed, 736 insertions(+), 157 deletions(-)
 create mode 100644 quantum/keymap_extras/sendstring_french_osx.h
 create mode 100644 quantum/keymap_extras/sendstring_german_osx.h

diff --git a/quantum/keymap_extras/keymap_french_osx.h b/quantum/keymap_extras/keymap_french_osx.h
index 3a231874a4..d0132a2d85 100644
--- a/quantum/keymap_extras/keymap_french_osx.h
+++ b/quantum/keymap_extras/keymap_french_osx.h
@@ -13,80 +13,248 @@
  * 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 KEYMAP_FRENCH_OSX_H
-#define KEYMAP_FRENCH_OSX_H
+
+#pragma once
 
 #include "keymap.h"
 
-// Normal characters
-#define FR_AT KC_GRV
-#define FR_AMP KC_1
-#define FR_EACU KC_2
-#define FR_QUOT KC_3
-#define FR_APOS KC_4
-#define FR_LPRN KC_5
-#define FR_SECT KC_6
-#define FR_EGRV KC_7
-#define FR_EXLM KC_8
-#define FR_CCED KC_9
-#define FR_AGRV KC_0
-#define FR_RPRN KC_MINS
-#define FR_MINS KC_EQL
+// clang-format off
 
-#define FR_A KC_Q
-#define FR_Z KC_W
-#define FR_CIRC KC_LBRC
-#define FR_DLR KC_RBRC
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐
+ * │ @ │ & │ é │ " │ ' │ ( │ § │ è │ ! │ ç │ à │ ) │ - │     │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬───┤
+ * │     │ A │ Z │ E │ R │ T │ Y │ U │ I │ O │ P │ ^ │ $ │   │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐  │
+ * │      │ Q │ S │ D │ F │ G │ H │ J │ K │ L │ M │ ù │ ` │  │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴──┤
+ * │    │ < │ W │ X │ C │ V │ B │ N │ , │ ; │ : │ = │        │
+ * ├────┴┬──┴─┬─┴───┼───┴───┴───┴───┴───┴───┼───┴─┬─┴──┬─────┤
+ * │     │    │     │                       │     │    │     │
+ * └─────┴────┴─────┴───────────────────────┴─────┴────┴─────┘
+ */
+// Row 1
+#define FR_AT   KC_GRV  // @
+#define FR_AMPR KC_1    // &
+#define FR_LEAC KC_2    // é
+#define FR_DQUO KC_3    // "
+#define FR_QUOT KC_4    // '
+#define FR_LPRN KC_5    // (
+#define FR_SECT KC_6    // §
+#define FR_LEGR KC_7    // è
+#define FR_EXLM KC_8    // !
+#define FR_LCCE KC_9    // ç
+#define FR_LAGR KC_0    // à
+#define FR_RPRN KC_MINS // )
+#define FR_MINS KC_EQL  // -
+// Row 2
+#define FR_A    KC_Q    // A
+#define FR_Z    KC_W    // Z
+#define FR_E    KC_E    // E
+#define FR_R    KC_R    // R
+#define FR_T    KC_T    // T
+#define FR_Y    KC_Y    // Y
+#define FR_U    KC_U    // U
+#define FR_I    KC_I    // I
+#define FR_O    KC_O    // O
+#define FR_P    KC_P    // P
+#define FR_CIRC KC_LBRC // ^
+#define FR_DLR  KC_RBRC // $
+// Row 3
+#define FR_Q    KC_A    // Q
+#define FR_S    KC_S    // S
+#define FR_D    KC_D    // D
+#define FR_F    KC_F    // F
+#define FR_G    KC_G    // G
+#define FR_H    KC_H    // H
+#define FR_J    KC_J    // J
+#define FR_K    KC_K    // K
+#define FR_L    KC_L    // L
+#define FR_M    KC_SCLN // M
+#define FR_LUGR KC_QUOT // ù
+#define FR_GRV  KC_NUHS // `
+// Row 4
+#define FR_LABK KC_NUBS // <
+#define FR_W    KC_Z    // W
+#define FR_X    KC_X    // X
+#define FR_C    KC_C    // C
+#define FR_V    KC_V    // V
+#define FR_B    KC_B    // B
+#define FR_N    KC_N    // N
+#define FR_COMM KC_M    // ,
+#define FR_SCLN KC_COMM // ;
+#define FR_COLN KC_DOT  // :
+#define FR_EQL  KC_SLSH // =
 
-#define FR_Q KC_A
-#define FR_M KC_SCLN
-#define FR_UGRV KC_QUOT
-#define FR_GRV KC_NUHS
+/* Shifted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐
+ * │ # │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ ° │ _ │     │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬───┤
+ * │     │   │   │   │   │   │   │   │   │   │   │ ¨ │ * │   │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐  │
+ * │      │   │   │   │   │   │   │   │   │   │   │ % │ £ │  │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴──┤
+ * │    │ > │   │   │   │   │   │   │ ? │ . │ / │ + │        │
+ * ├────┴┬──┴─┬─┴───┼───┴───┴───┴───┴───┴───┼───┴─┬─┴──┬─────┤
+ * │     │    │     │                       │     │    │     │
+ * └─────┴────┴─────┴───────────────────────┴─────┴────┴─────┘
+ */
+// Row 1
+#define FR_HASH S(FR_AT)   // #
+#define FR_1    S(FR_AMPR) // 1
+#define FR_2    S(FR_LEAC) // 2
+#define FR_3    S(FR_DQUO) // 3
+#define FR_4    S(FR_QUOT) // 4
+#define FR_5    S(FR_LPRN) // 5
+#define FR_6    S(FR_SECT) // 6
+#define FR_7    S(FR_LEGR) // 7
+#define FR_8    S(FR_EXLM) // 8
+#define FR_9    S(FR_LCCE) // 9
+#define FR_0    S(FR_LAGR) // 0
+#define FR_DEG  S(FR_RPRN) // °
+#define FR_UNDS S(FR_MINS) // _
+// Row 2
+#define FR_DIAE S(FR_CIRC) // ¨ (dead)
+#define FR_ASTR S(FR_DLR)  // *
+// Row 3
+#define FR_PERC S(FR_LUGR) // %
+#define FR_PND  S(FR_GRV)  // £
+// Row 4
+#define FR_RABK S(FR_LABK) // >
+#define FR_QUES S(FR_COMM) // ?
+#define FR_DOT  S(FR_SCLN) // .
+#define FR_SLSH S(FR_COLN) // /
+#define FR_PLUS S(FR_EQL)  // +
 
-#define FR_LESS KC_NUBS
-#define FR_W KC_Z
-#define FR_COMM KC_M
-#define FR_SCLN KC_COMM
-#define FR_COLN KC_DOT
-#define FR_EQL KC_SLSH
+/* Alted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐
+ * │ • │  │ ë │ “ │ ‘ │ { │ ¶ │ « │ ¡ │ Ç │ Ø │ } │ — │     │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬───┤
+ * │     │ Æ │ Â │ Ê │ ® │ † │ Ú │ º │ î │ Œ │ π │ Ô │ € │   │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐  │
+ * │      │ ‡ │ Ò │ ∂ │ ƒ │ fi │ Ì │ Ï │ È │ ¬ │ µ │ Ù │   │  │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴──┤
+ * │    │ ≤ │ ‹ │ ≈ │ © │ ◊ │ ß │ ~ │ ∞ │ … │ ÷ │ ≠ │        │
+ * ├────┴┬──┴─┬─┴───┼───┴───┴───┴───┴───┴───┼───┴─┬─┴──┬─────┤
+ * │     │    │     │                       │     │    │     │
+ * └─────┴────┴─────┴───────────────────────┴─────┴────┴─────┘
+ */
+// Row 1
+#define FR_BULT A(FR_AT)   // •
+#define FR_APPL A(FR_AMPR) //  (Apple logo)
+#define FR_LEDI A(FR_LEAC) // ë
+#define FR_LDQU A(FR_DQUO) // “
+#define FR_LSQU A(FR_QUOT) // ‘
+#define FR_LCBR A(FR_LPRN) // {
+#define FR_PILC A(FR_SECT) // ¶
+#define FR_LDAQ A(FR_LEGR) // «
+#define FR_IEXL A(FR_EXLM) // ¡
+#define FR_CCCE A(FR_LCCE) // Ç
+#define FR_OSTR A(FR_LAGR) // Ø
+#define FR_RCBR A(FR_RPRN) // }
+#define FR_MDSH A(FR_MINS) // —
+// Row 2
+#define FR_AE   A(FR_A)    // Æ
+#define FR_CACI A(FR_Z)    // Â
+#define FR_ECIR A(FR_E)    // Ê
+#define FR_REGD A(FR_R)    // ®
+#define FR_DAGG A(FR_T)    // †
+#define FR_CUAC A(FR_Y)    // Ú
+#define FR_MORD A(FR_U)    // º
+#define FR_LICI A(FR_I)    // î
+#define FR_OE   A(FR_O)    // Œ
+#define FR_PI   A(FR_P)    // π
+#define FR_OCIR A(FR_CIRC) // Ô
+#define FR_EURO A(FR_DLR)  // €
+// Row 3
+#define FR_DDAG A(FR_Q)    // ‡
+#define FR_COGR A(FR_S)    // Ò
+#define FR_PDIF A(FR_D)    // ∂
+#define FR_FHK  A(FR_F)    // ƒ
+#define FR_FI   A(FR_G)    // fi
+#define FR_CIGR A(FR_H)    // Ì
+#define FR_CIDI A(FR_J)    // Ï
+#define FR_CEGR A(FR_K)    // È
+#define FR_NOT  A(FR_L)    // ¬
+#define FR_MICR A(FR_M)    // µ
+#define FR_CUGR A(FR_LUGR) // Ù
+// Row 4
+#define FR_LTEQ A(FR_LABK) // ≤
+#define FR_LSAQ A(FR_W)    // ‹
+#define FR_AEQL A(FR_X)    // ≈
+#define FR_COPY A(FR_C)    // ©
+#define FR_LOZN A(FR_V)    // ◊
+#define FR_SS   A(FR_B)    // ß
+#define FR_TILD A(FR_N)    // ~ (dead)
+#define FR_INFN A(FR_COMM) // ∞
+#define FR_ELLP A(FR_SCLN) // …
+#define FR_DIV  A(FR_COLN) // ÷
+#define FR_NEQL A(FR_EQL)  // ≠
 
-// Shifted characters
-#define FR_HASH LSFT(KC_GRV)
-#define FR_1 LSFT(KC_1)
-#define FR_2 LSFT(KC_2)
-#define FR_3 LSFT(KC_3)
-#define FR_4 LSFT(KC_4)
-#define FR_5 LSFT(KC_5)
-#define FR_6 LSFT(KC_6)
-#define FR_7 LSFT(KC_7)
-#define FR_8 LSFT(KC_8)
-#define FR_9 LSFT(KC_9)
-#define FR_0 LSFT(KC_0)
-#define FR_UNDS LSFT(FR_MINS)
+/* Shift+Alted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐
+ * │ Ÿ │ ´ │ „ │   │   │ [ │ å │ » │ Û │ Á │   │ ] │ – │     │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬───┤
+ * │     │   │ Å │   │ ‚ │ ™ │   │ ª │ ï │   │ ∏ │   │ ¥ │   │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐  │
+ * │      │ Ω │ ∑ │ ∆ │ · │ fl │ Î │ Í │ Ë │ | │ Ó │ ‰ │   │  │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴──┤
+ * │    │ ≥ │ › │ ⁄ │ ¢ │ √ │ ∫ │ ı │ ¿ │   │ \ │ ± │        │
+ * ├────┴┬──┴─┬─┴───┼───┴───┴───┴───┴───┴───┼───┴─┬─┴──┬─────┤
+ * │     │    │     │                       │     │    │     │
+ * └─────┴────┴─────┴───────────────────────┴─────┴────┴─────┘
+ */
+// Row 1
+#define FR_CYDI S(A(FR_AT))   // Ÿ
+#define FR_ACUT S(A(FR_AMPR)) // ´ (dead)
+#define FR_DLQU S(A(FR_LEAC)) // „
+#define FR_LBRC S(A(FR_LPRN)) // [
+#define FR_LARI S(A(FR_SECT)) // å
+#define FR_RDAQ S(A(FR_LEGR)) // »
+#define FR_CUCI S(A(FR_EXLM)) // Û
+#define FR_CAAC S(A(FR_LCCE)) // Á
+#define FR_RBRC S(A(FR_RPRN)) // ]
+#define FR_NDSH S(A(FR_MINS)) // –
+// Row 2
+#define FR_CARI S(A(FR_Z))    // Å
+#define FR_SLQU S(A(FR_R))    // ‚
+#define FR_TM   S(A(FR_T))    // ™
+#define FR_FORD S(A(FR_U))    // ª
+#define FR_LIDI S(A(FR_I))    // ï
+#define FR_NARP S(A(FR_P))    // ∏
+#define FR_YEN  S(A(FR_DLR))  // ¥
+// Row 3
+#define FR_OMEG S(A(FR_Q))    // Ω
+#define FR_NARS S(A(FR_S))    // ∑
+#define FR_INCR S(A(FR_D))    // ∆
+#define FR_MDDT S(A(FR_F))    // ·
+#define FR_FL   S(A(FR_G))    // fl
+#define FR_CICI S(A(FR_H))    // Î
+#define FR_CIAC S(A(FR_J))    // Í
+#define FR_CEDI S(A(FR_K))    // Ë
+#define FR_PIPE S(A(FR_L))    // |
+#define FR_COAC S(A(FR_M))    // Ó
+#define FR_PERM S(A(FR_LUGR)) // ‰
+// Row 4
+#define FR_GTEQ S(A(FR_LABK)) // ≥
+#define FR_LSAQ S(A(FR_W))    // ›
+#define FR_FRSL S(A(FR_X))    // ⁄
+#define FR_CENT S(A(FR_C))    // ¢
+#define FR_SQRT S(A(FR_V))    // √
+#define FR_INTG S(A(FR_B))    // ∫
+#define FR_DLSI S(A(FR_N))    // ı
+#define FR_IQUE S(A(FR_COMM)) // ¿
+#define FR_BSLS S(A(FR_COLN)) // (backslash)
+#define FR_PLMN S(A(FR_EQL))  // ±
 
-#define FR_UMLT LSFT(FR_CIRC)
-#define FR_ASTR LSFT(FR_DLR)
-
-#define FR_PERC LSFT(FR_UGRV)
-#define FR_PND LSFT(FR_GRV)
-
-#define FR_GRTR LSFT(FR_LESS)
-#define FR_QUES LSFT(FR_COMM)
-#define FR_DOT LSFT(FR_SCLN)
-#define FR_SLSH LSFT(FR_COLN)
-#define FR_PLUS LSFT(FR_EQL)
-
-// Alted characters
-#define FR_LCBR LALT(KC_5)
-#define FR_RCBR LALT(FR_RPRN)
-#define FR_EURO LALT(KC_E)
-#define FR_BULT LALT(FR_DLR)
-#define FR_TILD LALT(KC_N)
-
-// Shift+Alt-ed characters
-#define FR_LBRC LSFT(LALT(KC_5))
-#define FR_RBRC LSFT(LALT(FR_RPRN))
-#define FR_PIPE LSFT(LALT(KC_L))
-#define FR_BSLS LSFT(LALT(FR_COLN))
-
-#endif
+// DEPRECATED
+#define FR_AMP  FR_AMPR
+#define FR_EACU FR_LEAC
+#define FR_APOS FR_QUOT
+#define FR_EGRV FR_LEGR
+#define FR_CCED FR_LCCE
+#define FR_AGRV FR_LAGR
+#define FR_UGRV FR_LUGR
+#define FR_LESS FR_LABK
+#define FR_UMLT FR_DIAE
+#define FR_GRTR FR_RABK
diff --git a/quantum/keymap_extras/keymap_german_osx.h b/quantum/keymap_extras/keymap_german_osx.h
index 29dee07ee0..0d15532e40 100644
--- a/quantum/keymap_extras/keymap_german_osx.h
+++ b/quantum/keymap_extras/keymap_german_osx.h
@@ -13,100 +13,311 @@
  * 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 KEYMAP_GERMAN_OSX
-#define KEYMAP_GERMAN_OSX
+
+#pragma once
 
 #include "keymap.h"
 
-// Alt gr
+// clang-format off
 
-// normal characters
-#define DE_OSX_Z KC_Y
-#define DE_OSX_Y KC_Z
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐
+ * │ ^ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ ß │ ´ │     │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬───┤
+ * │     │ Q │ W │ E │ R │ T │ Z │ U │ I │ O │ P │ Ü │ + │   │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐  │
+ * │      │ A │ S │ D │ F │ G │ H │ J │ K │ L │ Ö │ Ä │ # │  │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴──┤
+ * │    │ < │ Y │ X │ C │ V │ B │ N │ M │ , │ . │ - │        │
+ * ├────┴┬──┴─┬─┴───┼───┴───┴───┴───┴───┴───┼───┴─┬─┴──┬─────┤
+ * │     │    │     │                       │     │    │     │
+ * └─────┴────┴─────┴───────────────────────┴─────┴────┴─────┘
+ */
+// Row 1
+#define DE_CIRC KC_GRV  // ^ (dead)
+#define DE_1    KC_1    // 1
+#define DE_2    KC_2    // 2
+#define DE_3    KC_3    // 3
+#define DE_4    KC_4    // 4
+#define DE_5    KC_5    // 5
+#define DE_6    KC_6    // 6
+#define DE_7    KC_7    // 7
+#define DE_8    KC_8    // 8
+#define DE_9    KC_9    // 9
+#define DE_0    KC_0    // 0
+#define DE_SS   KC_MINS // ß
+#define DE_ACUT KC_EQL  // ´ (dead)
+// Row 2
+#define DE_Q    KC_Q    // Q
+#define DE_W    KC_W    // W
+#define DE_E    KC_E    // E
+#define DE_R    KC_R    // R
+#define DE_T    KC_T    // T
+#define DE_Z    KC_Y    // Z
+#define DE_U    KC_U    // U
+#define DE_I    KC_I    // I
+#define DE_O    KC_O    // O
+#define DE_P    KC_P    // P
+#define DE_UDIA KC_LBRC // Ü
+#define DE_PLUS KC_RBRC // +
+// Row 3
+#define DE_A    KC_A    // A
+#define DE_S    KC_S    // S
+#define DE_D    KC_D    // D
+#define DE_F    KC_F    // F
+#define DE_G    KC_G    // G
+#define DE_H    KC_H    // H
+#define DE_J    KC_J    // J
+#define DE_K    KC_K    // K
+#define DE_L    KC_L    // L
+#define DE_ODIA KC_SCLN // Ö
+#define DE_ADIA KC_QUOT // Ä
+#define DE_HASH KC_NUHS // #
+// Row 4
+#define DE_LABK KC_NUBS // <
+#define DE_Y    KC_Z    // Y
+#define DE_X    KC_X    // X
+#define DE_C    KC_C    // C
+#define DE_V    KC_V    // V
+#define DE_B    KC_B    // B
+#define DE_N    KC_N    // N
+#define DE_M    KC_M    // M
+#define DE_COMM KC_COMM // ,
+#define DE_DOT  KC_DOT  // .
+#define DE_MINS KC_SLSH // -
 
-#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
+/* Shifted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐
+ * │ ° │ ! │ " │ § │ $ │ % │ & │ / │ ( │ ) │ = │ ? │ ` │     │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬───┤
+ * │     │   │   │   │   │   │   │   │   │   │   │   │ * │   │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐  │
+ * │      │   │   │   │   │   │   │   │   │   │   │   │ ' │  │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴──┤
+ * │    │ > │   │   │   │   │   │   │   │ ; │ : │ _ │        │
+ * ├────┴┬──┴─┬─┴───┼───┴───┴───┴───┴───┴───┼───┴─┬─┴──┬─────┤
+ * │     │    │     │                       │     │    │     │
+ * └─────┴────┴─────┴───────────────────────┴─────┴────┴─────┘
+ */
+// Row 1
+#define DE_DEG  S(DE_CIRC) // °
+#define DE_EXLM S(DE_1)    // !
+#define DE_DQUO S(DE_2)    // "
+#define DE_SECT S(DE_3)    // §
+#define DE_DLR  S(DE_4)    // $
+#define DE_PERC S(DE_5)    // %
+#define DE_AMPR S(DE_6)    // &
+#define DE_SLSH S(DE_7)    // /
+#define DE_LPRN S(DE_8)    // (
+#define DE_RPRN S(DE_9)    // )
+#define DE_EQL  S(DE_0)    // =
+#define DE_QUES S(DE_SS)   // ?
+#define DE_GRV  S(DE_ACUT) // ` (dead)
+// Row 2
+#define DE_ASTR S(DE_PLUS) // *
+// Row 3
+#define DE_QUOT S(DE_HASH) // '
+// Row 4
+#define DE_RABK S(DE_LABK) // >
+#define DE_SCLN S(DE_COMM) // ;
+#define DE_COLN S(DE_DOT)  // :
+#define DE_UNDS S(DE_MINS) // _
 
-#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
+/* Alted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐
+ * │ „ │ ¡ │ “ │ ¶ │ ¢ │ [ │ ] │ | │ { │ } │ ≠ │ ¿ │   │     │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬───┤
+ * │     │ « │ ∑ │ € │ ® │ † │ Ω │ ¨ │ ⁄ │ Ø │ π │ • │ ± │   │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐  │
+ * │      │ Å │ ‚ │ ∂ │ ƒ │ © │ ª │ º │ ∆ │ @ │ Œ │ Æ │ ‘ │  │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴──┤
+ * │    │ ≤ │ ¥ │ ≈ │ Ç │ √ │ ∫ │ ~ │ µ │ ∞ │ … │ – │        │
+ * ├────┴┬──┴─┬─┴───┼───┴───┴───┴───┴───┴───┼───┴─┬─┴──┬─────┤
+ * │     │    │     │                       │     │    │     │
+ * └─────┴────┴─────┴───────────────────────┴─────┴────┴─────┘
+ */
+// Row 1
+#define DE_DLQU A(DE_CIRC) // „
+#define DE_IEXL A(DE_1)    // ¡
+#define DE_LDQU A(DE_2)    // “
+#define DE_PILC A(DE_3)    // ¶
+#define DE_CENT A(DE_4)    // ¢
+#define DE_LBRC A(DE_5)    // [
+#define DE_RBRC A(DE_6)    // ]
+#define DE_PIPE A(DE_7)    // |
+#define DE_LCBR A(DE_8)    // {
+#define DE_RCBR A(DE_9)    // }
+#define DE_NEQL A(DE_0)    // ≠
+#define DE_IQUE A(DE_SS)   // ¿
+// Row 2
+#define DE_LDAQ A(DE_Q)    // «
+#define DE_NARS A(DE_W)    // ∑
+#define DE_EURO A(DE_E)    // €
+#define DE_REGD A(DE_R)    // ®
+#define DE_DAGG A(DE_T)    // †
+#define DE_OMEG A(DE_Z)    // Ω
+#define DE_DIAE A(DE_U)    // ¨ (dead)
+#define DE_FRSL A(DE_I)    // ⁄
+#define DE_OSTR A(DE_O)    // Ø
+#define DE_PI   A(DE_P)    // π
+#define DE_BULT A(DE_UDIA) // •
+#define DE_PLMN A(DE_PLUS) // ±
+// Row 3
+#define DE_ARNG A(DE_A)    // Å
+#define DE_SLQU A(DE_S)    // ‚
+#define DE_PDIF A(DE_D)    // ∂
+#define DE_FHK  A(DE_F)    // ƒ
+#define DE_COPY A(DE_G)    // ©
+#define DE_FORD A(DE_H)    // ª
+#define DE_MORD A(DE_J)    // º
+#define DE_INCR A(DE_K)    // ∆
+#define DE_AT   A(DE_L)    // @
+#define DE_OE   A(DE_ODIA) // Œ
+#define DE_AE   A(DE_ADIA) // Æ
+#define DE_LSQU A(DE_HASH) // ‘
+// Row 4
+#define DE_LTEQ A(DE_LABK) // ≤
+#define DE_YEN  A(DE_Y)    // ¥
+#define DE_AEQL A(DE_X)    // ≈
+#define DE_CCCE A(DE_C)    // Ç
+#define DE_SQRT A(DE_V)    // √
+#define DE_INTG A(DE_B)    // ∫
+#define DE_TILD A(DE_N)    // ~ (dead)
+#define DE_MICR A(DE_M)    // µ
+#define DE_INFN A(DE_COMM) // ∞
+#define DE_ELLP A(DE_DOT)  // …
+#define DE_NDSH A(DE_MINS) // –
 
-#define DE_OSX_DOT KC_DOT
-#define DE_OSX_COMM KC_COMM
+/* Shift+Alted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐
+ * │   │ ¬ │ ” │   │ £ │ fi │   │ \ │ ˜ │ · │ ¯ │ ˙ │ ˚ │     │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬───┤
+ * │     │ » │   │ ‰ │ ¸ │ ˝ │ ˇ │ Á │ Û │   │ ∏ │   │  │   │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐  │
+ * │      │   │ Í │ ™ │ Ï │ Ì │ Ó │ ı │   │ fl │   │   │   │  │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴──┤
+ * │    │ ≥ │ ‡ │ Ù │   │ ◊ │ ‹ │ › │ ˘ │ ˛ │ ÷ │ — │        │
+ * ├────┴┬──┴─┬─┴───┼───┴───┴───┴───┴───┴───┼───┴─┬─┴──┬─────┤
+ * │     │    │     │                       │     │    │     │
+ * └─────┴────┴─────┴───────────────────────┴─────┴────┴─────┘
+ */
+// Row 1
+#define DE_NOT  S(A(DE_1))    // ¬
+#define DE_RDQU S(A(DE_2))    // ”
+#define DE_PND  S(A(DE_4))    // £
+#define DE_FI   S(A(DE_5))    // fi
+#define DE_BSLS S(A(DE_7))    // (backslash)
+#define DE_STIL S(A(DE_8))    // ˜
+#define DE_MDDT S(A(DE_9))    // ·
+#define DE_MACR S(A(DE_0))    // ¯
+#define DE_DOTA S(A(DE_SS))   // ˙
+#define DE_RNGA S(A(DE_ACUT)) // ˚
+// Row 2
+#define DE_RDAQ S(A(DE_Q))    // »
+#define DE_PERM S(A(DE_E))    // ‰
+#define DE_CEDL S(A(DE_R))    // ¸
+#define DE_DACU S(A(DE_T))    // ˝
+#define DE_CARN S(A(DE_Z))    // ˇ
+#define DE_AACU S(A(DE_U))    // Á
+#define DE_UCIR S(A(DE_I))    // Û
+#define DE_NARP S(A(DE_P))    // ∏
+#define DE_APPL S(A(DE_PLUS)) //  (Apple logo)
+// Row 3
+#define DE_IACU S(A(DE_S))    // Í
+#define DE_TM   S(A(DE_D))    // ™
+#define DE_IDIA S(A(DE_F))    // Ï
+#define DE_IGRV S(A(DE_G))    // Ì
+#define DE_OACU S(A(DE_H))    // Ó
+#define DE_DLSI S(A(DE_J))    // ı
+#define DE_FL   S(A(DE_L))    // fl
+// Row 4
+#define DE_GTEQ S(A(DE_LABK)) // ≥
+#define DE_DDAG S(A(DE_Y))    // ‡
+#define DE_UGRV S(A(DE_X))    // Ù
+#define DE_LOZN S(A(DE_V))    // ◊
+#define DE_LSAQ S(A(DE_B))    // ‹
+#define DE_RSAQ S(A(DE_N))    // ›
+#define DE_BREV S(A(DE_M))    // ˘
+#define DE_OGON S(A(DE_COMM)) // ˛
+#define DE_DIV  S(A(DE_DOT))  // ÷
+#define DE_MDSH S(A(DE_MINS)) // —
 
-#define DE_OSX_SS KC_MINS
-#define DE_OSX_AE KC_QUOT
-#define DE_OSX_UE KC_LBRC
-#define DE_OSX_OE KC_SCLN
+// DEPRECATED
+#define DE_OSX_CIRC DE_CIRC
+#define DE_OSX_1    DE_1
+#define DE_OSX_2    DE_2
+#define DE_OSX_3    DE_3
+#define DE_OSX_4    DE_4
+#define DE_OSX_5    DE_5
+#define DE_OSX_6    DE_6
+#define DE_OSX_7    DE_7
+#define DE_OSX_8    DE_8
+#define DE_OSX_9    DE_9
+#define DE_OSX_0    DE_0
+#define DE_OSX_SS   DE_SS
+#define DE_OSX_ACUT DE_ACUT
+#define DE_OSX_Q    DE_Q
+#define DE_OSX_W    DE_W
+#define DE_OSX_E    DE_E
+#define DE_OSX_R    DE_R
+#define DE_OSX_T    DE_T
+#define DE_OSX_Z    DE_Z
+#define DE_OSX_U    DE_U
+#define DE_OSX_I    DE_I
+#define DE_OSX_O    DE_O
+#define DE_OSX_P    DE_P
+#define DE_OSX_UE   DE_UDIA
+#define DE_OSX_PLUS DE_PLUS
+#define DE_OSX_A    DE_A
+#define DE_OSX_S    DE_S
+#define DE_OSX_D    DE_D
+#define DE_OSX_F    DE_F
+#define DE_OSX_G    DE_G
+#define DE_OSX_H    DE_H
+#define DE_OSX_J    DE_J
+#define DE_OSX_K    DE_K
+#define DE_OSX_L    DE_L
+#define DE_OSX_OE   DE_ODIA
+#define DE_OSX_AE   DE_ADIA
+#define DE_OSX_HASH DE_HASH
+#define DE_OSX_LESS DE_LABK
+#define DE_OSX_Y    DE_Y
+#define DE_OSX_X    DE_X
+#define DE_OSX_C    DE_C
+#define DE_OSX_V    DE_V
+#define DE_OSX_B    DE_B
+#define DE_OSX_N    DE_N
+#define DE_OSX_M    DE_M
+#define DE_OSX_COMM DE_COMM
+#define DE_OSX_DOT  DE_DOT
+#define DE_OSX_MINS DE_MINS
 
-#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 _
+#define DE_OSX_RING DE_DEG
+#define DE_OSX_EXLM DE_EXLM
+#define DE_OSX_DQOT DE_DQUO
+#define DE_OSX_PARA DE_SECT
+#define DE_OSX_DLR  DE_DLR
+#define DE_OSX_PERC DE_PERC
+#define DE_OSX_AMPR DE_AMPR
+#define DE_OSX_SLSH DE_SLSH
+#define DE_OSX_LPRN DE_LPRN
+#define DE_OSX_RPRN DE_RPRN
+#define DE_OSX_EQL  DE_EQL
+#define DE_OSX_QST  DE_QUES
+#define DE_OSX_GRV  DE_GRV
+#define DE_OSX_ASTR DE_ASTR
+#define DE_OSX_QUOT DE_QUOT
+#define DE_OSX_MORE DE_RABK
+#define DE_OSX_COLN DE_COLN
+#define DE_OSX_SCLN DE_SCLN
+#define DE_OSX_UNDS DE_UNDS
 
-// shifted characters
-#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_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
+#define DE_OSX_LBRC DE_LBRC
+#define DE_OSX_RBRC DE_RBRC
+#define DE_OSX_PIPE DE_PIPE
+#define DE_OSX_LCBR DE_LCBR
+#define DE_OSX_RCBR DE_RCBR
+#define DE_OSX_AT   DE_AT
+#define DE_OSX_EURO DE_EURO
+#define DE_OSX_TILD DE_TILD
+#define DE_OSX_BSLS DE_BSLS
diff --git a/quantum/keymap_extras/sendstring_french.h b/quantum/keymap_extras/sendstring_french.h
index a02f114b4e..17ea3ed454 100644
--- a/quantum/keymap_extras/sendstring_french.h
+++ b/quantum/keymap_extras/sendstring_french.h
@@ -74,7 +74,7 @@ const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
     XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC,  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
 
     //       !        "        #        $        %        &        '
-    KC_SPC,  FR_EXLM, FR_QUOT, FR_DQUO, FR_DLR,  FR_UGRV, FR_AMP,  FR_QUOT,
+    KC_SPC,  FR_EXLM, FR_QUOT, FR_DQUO, FR_DLR,  FR_UGRV, FR_AMPR, FR_QUOT,
     // (     )        *        +        ,        -        .        /
     FR_LPRN, FR_RPRN, FR_ASTR, FR_EQL,  FR_COMM, FR_MINS, FR_SCLN, FR_COLN,
     // 0     1        2        3        4        5        6        7
diff --git a/quantum/keymap_extras/sendstring_french_osx.h b/quantum/keymap_extras/sendstring_french_osx.h
new file mode 100644
index 0000000000..6cadbac153
--- /dev/null
+++ b/quantum/keymap_extras/sendstring_french_osx.h
@@ -0,0 +1,100 @@
+/* Copyright 2020
+ *
+ * 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/>.
+ */
+
+// Sendstring lookup tables for macOS French (AZERTY) layouts
+
+#pragma once
+
+#include "keymap_french_osx.h"
+#include "quantum.h"
+
+// clang-format off
+
+const uint8_t ascii_to_shift_lut[16] PROGMEM = {
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+    KCLUT_ENTRY(0, 0, 0, 1, 0, 1, 0, 0),
+    KCLUT_ENTRY(0, 0, 1, 1, 0, 0, 1, 1),
+    KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+    KCLUT_ENTRY(1, 1, 0, 0, 0, 0, 1, 1),
+    KCLUT_ENTRY(0, 1, 1, 1, 1, 1, 1, 1),
+    KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+    KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+    KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 0, 1),
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 0, 1, 0, 0, 0)
+};
+
+const uint8_t ascii_to_altgr_lut[16] PROGMEM = {
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 1, 0)
+};
+
+const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
+    // NUL   SOH      STX      ETX      EOT      ENQ      ACK      BEL
+    XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+    // BS    TAB      LF       VT       FF       CR       SO       SI
+    KC_BSPC, KC_TAB,  KC_ENT,  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+    // DLE   DC1      DC2      DC3      DC4      NAK      SYN      ETB
+    XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+    // CAN   EM       SUB      ESC      FS       GS       RS       US
+    XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC,  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+
+    //       !        "        #        $        %        &        '
+    KC_SPC,  FR_EXLM, FR_DQUO, FR_AT,   FR_DLR,  FR_LUGR, FR_AMPR, FR_QUOT,
+    // (     )        *        +        ,        -        .        /
+    FR_LPRN, FR_RPRN, FR_DLR,  FR_EQL,  FR_COMM, FR_MINS, FR_SCLN, FR_COLN,
+    // 0     1        2        3        4        5        6        7
+    FR_LAGR, FR_AMPR, FR_LEAC, FR_DQUO, FR_QUOT, FR_LPRN, FR_SECT, FR_LEGR,
+    // 8     9        :        ;        <        =        >        ?
+    FR_EXLM, FR_LCCE, FR_COLN, FR_SCLN, FR_LABK, FR_EQL,  FR_LABK, FR_COMM,
+    // @     A        B        C        D        E        F        G
+    FR_AT,   FR_A,    FR_B,    FR_C,    FR_D,    FR_E,    FR_F,    FR_G,
+    // H     I        J        K        L        M        N        O
+    FR_H,    FR_I,    FR_J,    FR_K,    FR_L,    FR_M,    FR_N,    FR_O,
+    // P     Q        R        S        T        U        V        W
+    FR_P,    FR_Q,    FR_R,    FR_S,    FR_T,    FR_U,    FR_V,    FR_W,
+    // X     Y        Z        [        \        ]        ^        _
+    FR_X,    FR_Y,    FR_Z,    FR_LPRN, FR_COLN, FR_RPRN, FR_CIRC, FR_MINS,
+    // `     a        b        c        d        e        f        g
+    FR_GRV,  FR_A,    FR_B,    FR_C,    FR_D,    FR_E,    FR_F,    FR_G,
+    // h     i        j        k        l        m        n        o
+    FR_H,    FR_I,    FR_J,    FR_K,    FR_L,    FR_M,    FR_N,    FR_O,
+    // p     q        r        s        t        u        v        w
+    FR_P,    FR_Q,    FR_R,    FR_S,    FR_T,    FR_U,    FR_V,    FR_W,
+    // x     y        z        {        |        }        ~        DEL
+    FR_X,    FR_Y,    FR_Z,    FR_LPRN, FR_L,    FR_RPRN, FR_N,    KC_DEL
+};
diff --git a/quantum/keymap_extras/sendstring_german_osx.h b/quantum/keymap_extras/sendstring_german_osx.h
new file mode 100644
index 0000000000..03f54da2af
--- /dev/null
+++ b/quantum/keymap_extras/sendstring_german_osx.h
@@ -0,0 +1,100 @@
+/* Copyright 2020
+ *
+ * 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/>.
+ */
+
+// Sendstring lookup tables for macOS German layouts
+
+#pragma once
+
+#include "keymap_german_osx.h"
+#include "quantum.h"
+
+// clang-format off
+
+const uint8_t ascii_to_shift_lut[16] PROGMEM = {
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+    KCLUT_ENTRY(0, 1, 1, 0, 1, 1, 1, 1),
+    KCLUT_ENTRY(1, 1, 1, 0, 0, 0, 0, 1),
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 1, 1, 0, 1, 1, 1),
+    KCLUT_ENTRY(0, 1, 1, 1, 1, 1, 1, 1),
+    KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+    KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+    KCLUT_ENTRY(1, 1, 1, 0, 1, 0, 0, 1),
+    KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0)
+};
+
+const uint8_t ascii_to_altgr_lut[16] PROGMEM = {
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+    KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 1, 0)
+};
+
+const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
+    // NUL   SOH      STX      ETX      EOT      ENQ      ACK      BEL
+    XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+    // BS    TAB      LF       VT       FF       CR       SO       SI
+    KC_BSPC, KC_TAB,  KC_ENT,  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+    // DLE   DC1      DC2      DC3      DC4      NAK      SYN      ETB
+    XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+    // CAN   EM       SUB      ESC      FS       GS       RS       US
+    XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC,  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+
+    //       !        "        #        $        %        &        '
+    KC_SPC,  DE_1,    DE_2,    DE_HASH, DE_4,    DE_5,    DE_6,    DE_HASH,
+    // (     )        *        +        ,        -        .        /
+    DE_8,    DE_9,    DE_PLUS, DE_PLUS, DE_COMM, DE_MINS, DE_DOT,  DE_7,
+    // 0     1        2        3        4        5        6        7
+    DE_0,    DE_1,    DE_2,    DE_3,    DE_4,    DE_5,    DE_6,    DE_7,
+    // 8     9        :        ;        <        =        >        ?
+    DE_8,    DE_9,    DE_DOT,  DE_COMM, DE_LABK, DE_0,    DE_LABK, DE_SS,
+    // @     A        B        C        D        E        F        G
+    DE_L,    DE_A,    DE_B,    DE_C,    DE_D,    DE_E,    DE_F,    DE_G,
+    // H     I        J        K        L        M        N        O
+    DE_H,    DE_I,    DE_J,    DE_K,    DE_L,    DE_M,    DE_N,    DE_O,
+    // P     Q        R        S        T        U        V        W
+    DE_P,    DE_Q,    DE_R,    DE_S,    DE_T,    DE_U,    DE_V,    DE_W,
+    // X     Y        Z        [        \        ]        ^        _
+    DE_X,    DE_Y,    DE_Z,    DE_5,    DE_7,    DE_6,    DE_CIRC, DE_MINS,
+    // `     a        b        c        d        e        f        g
+    DE_ACUT, DE_A,    DE_B,    DE_C,    DE_D,    DE_E,    DE_F,    DE_G,
+    // h     i        j        k        l        m        n        o
+    DE_H,    DE_I,    DE_J,    DE_K,    DE_L,    DE_M,    DE_N,    DE_O,
+    // p     q        r        s        t        u        v        w
+    DE_P,    DE_Q,    DE_R,    DE_S,    DE_T,    DE_U,    DE_V,    DE_W,
+    // x     y        z        {        |        }        ~        DEL
+    DE_X,    DE_Y,    DE_Z,    DE_8,    DE_7,    DE_9,    DE_N,    KC_DEL
+};