aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/reference_keymap_extras.md1
-rw-r--r--quantum/keymap_extras/keymap_french_afnor.h253
-rw-r--r--quantum/keymap_extras/sendstring_french_afnor.h100
3 files changed, 354 insertions, 0 deletions
diff --git a/docs/reference_keymap_extras.md b/docs/reference_keymap_extras.md
index a7026a099..7e3d9bf27 100644
--- a/docs/reference_keymap_extras.md
+++ b/docs/reference_keymap_extras.md
@@ -22,6 +22,7 @@ To use these, simply `#include` the corresponding [header file](https://github.c
22|Estonian |`keymap_estonian.h` | 22|Estonian |`keymap_estonian.h` |
23|Finnish |`keymap_finnish.h` | 23|Finnish |`keymap_finnish.h` |
24|French |`keymap_french.h` | 24|French |`keymap_french.h` |
25|French (AFNOR) |`keymap_french_afnor.h` |
25|French (BÉPO) |`keymap_bepo.h` | 26|French (BÉPO) |`keymap_bepo.h` |
26|French (Belgium) |`keymap_belgian.h` | 27|French (Belgium) |`keymap_belgian.h` |
27|French (Switzerland) |`keymap_fr_ch.h` | 28|French (Switzerland) |`keymap_fr_ch.h` |
diff --git a/quantum/keymap_extras/keymap_french_afnor.h b/quantum/keymap_extras/keymap_french_afnor.h
new file mode 100644
index 000000000..be67fdc95
--- /dev/null
+++ b/quantum/keymap_extras/keymap_french_afnor.h
@@ -0,0 +1,253 @@
1/* Copyright 2020 Guillaume Gérard
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17/* French AZERTY - AFNOR NF Z71-300
18 *
19 * A standard for the French keyboard
20 *
21 * The project was launched at the end of 2015 on the proposal of the General
22 * Delegation for the French language and the languages ​​of France (Ministry
23 * of Culture), starting from the observation that the current "azerty"
24 * keyboards constrain the writing of French, languages regional and European
25 * languages ​​with Latin alphabet.
26 *
27 * For the first time, a standard (NF Z71-300) defines the placement of
28 * characters on the French keyboard. It offers two layouts, one of which
29 * closely follows the QWERTY keyboard used by most people who write in French.
30 *
31 * However, it is in many ways superior to the old keyboard:
32 *
33 * - it contains all the characters required to enter text in French (for example É, œ and ")
34 * - it is designed to be more ergonomic and allow faster typing
35 * - it includes almost 60 additional characters for entering foreign languages, technical content, etc
36 * - however, the characters remain easy to locate thanks to intuitive groupings
37 *
38 * Source: https://norme-azerty.fr
39 */
40
41#pragma once
42
43#include "keymap.h"
44
45// clang-format off
46
47/*
48 * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
49 * │ @ │ à │ é │ è │ ê │ ( │ ) │ ‘ │ ’ │ « │ » │ ' │ ^ │       │
50 * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
51 * │     │ A │ Z │ E │ R │ T │ Y │ U │ I │ O │ P │ - │ + │     │
52 * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐    │
53 * │      │ Q │ S │ D │ F │ G │ H │ J │ K │ L │ M │ / │ * │    │
54 * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
55 * │    │ < │ W │ X │ C │ V │ B │ N │ . │ , │ : │ ; │          │
56 * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
57 * │    │    │    │                        │    │    │    │    │
58 * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
59 */
60// Row 1
61#define FR_AT KC_GRV // @
62#define FR_AGRV KC_1 // à
63#define FR_EACU KC_2 // é
64#define FR_EGRV KC_3 // è
65#define FR_ECIR KC_4 // ê
66#define FR_LPRN KC_5 // (
67#define FR_RPRN KC_6 // )
68#define FR_LSQU KC_7 // ‘
69#define FR_RSQU KC_8 // ’
70#define FR_LDAQ KC_9 // «
71#define FR_RDAQ KC_0 // »
72#define FR_QUOT KC_MINS // '
73#define FR_DCIR KC_EQL // ^ (dead)
74// Row 2
75#define FR_A KC_Q // A
76#define FR_Z KC_W // Z
77#define FR_E KC_E // E
78#define FR_R KC_R // R
79#define FR_T KC_T // T
80#define FR_Y KC_Y // Y
81#define FR_U KC_U // U
82#define FR_I KC_I // I
83#define FR_O KC_O // O
84#define FR_P KC_P // P
85#define FR_MINS KC_LBRC // -
86#define FR_PLUS KC_RBRC // +
87// Row 3
88#define FR_Q KC_A // Q
89#define FR_S KC_S // S
90#define FR_D KC_D // D
91#define FR_F KC_F // F
92#define FR_G KC_G // G
93#define FR_H KC_H // H
94#define FR_J KC_J // J
95#define FR_K KC_K // K
96#define FR_L KC_L // L
97#define FR_M KC_SCLN // M
98#define FR_SLSH KC_QUOT // /
99#define FR_ASTR KC_NUHS // *
100// Row 4
101#define FR_LABK KC_NUBS // <
102#define FR_W KC_Z // W
103#define FR_X KC_X // X
104#define FR_C KC_C // C
105#define FR_V KC_V // V
106#define FR_B KC_B // B
107#define FR_N KC_N // N
108#define FR_DOT KC_M // .
109#define FR_COMM KC_COMM // ,
110#define FR_COLN KC_DOT // :
111#define FR_SCLN KC_SLSH // ;
112
113/* Shifted symbols
114 * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
115 * │ # │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ " │ ¨ │       │
116 * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
117 * │     │   │   │   │   │   │   │   │   │   │   │ – │ ± │     │
118 * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐    │
119 * │      │   │   │   │   │   │   │   │   │   │   │ \ │ ½ │    │
120 * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
121 * │    │ > │   │   │   │   │   │   │ ? │ ! │ … │ = │          │
122 * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
123 * │    │    │    │                        │    │    │    │    │
124 * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
125 */
126// Row 1
127#define FR_HASH S(FR_AT) // #
128#define FR_1 S(FR_AGRV) // 1
129#define FR_2 S(FR_EACU) // 2
130#define FR_3 S(FR_EGRV) // 3
131#define FR_4 S(FR_ECIR) // 4
132#define FR_5 S(FR_LPRN) // 5
133#define FR_6 S(FR_RPRN) // 6
134#define FR_7 S(FR_LSQU) // 7
135#define FR_8 S(FR_RSQU) // 8
136#define FR_9 S(FR_LDAQ) // 9
137#define FR_0 S(FR_RDAQ) // 0
138#define FR_DQUO S(FR_QUOT) // "
139#define FR_DIAE S(FR_DCIR) // ¨ (dead)
140// Row 2
141#define FR_NDSH S(FR_MINS) // –
142#define FR_PLMN S(FR_PLUS) // ±
143// Row 3
144#define FR_BSLS S(FR_SLSH) // (backslash)
145#define FR_HALF S(FR_ASTR) // ½
146// Row 4
147#define FR_RABK S(FR_LABK) // >
148#define FR_QUES S(FR_DOT) // ?
149#define FR_EXLM S(FR_COMM) // !
150#define FR_ELLP S(FR_COLN) // …
151#define FR_EQL S(FR_SCLN) // =
152
153/* AltGr symbols
154 * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
155 * │ ˘ │ § │ ´ │ ` │ & │ [ │ ] │ ¯ │ _ │ “ │ ” │ ° │ ˇ │       │
156 * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
157 * │     │ æ │ £ │ € │ ® │ { │ } │ ù │ ˙ │ œ │ % │ − │ † │     │
158 * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐    │
159 * │      │ θ │ ß │ $ │ ¤ │ µ │ Eu│   │ ∕ │ | │ ∞ │ ÷ │ × │    │
160 * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
161 * │    │ ≤ │ ʒ │ © │ ç │ ¸ │ − │ ~ │ ¿ │ ¡ │ · │ ≃ │          │
162 * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
163 * │    │    │    │                        │    │    │    │    │
164 * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
165 */
166// Row 1
167#define FR_BREV ALGR(FR_AT) // ˘ (dead)
168#define FR_SECT ALGR(FR_AGRV) // §
169#define FR_ACUT ALGR(FR_EACU) // ´ (dead)
170#define FR_GRV ALGR(FR_EGRV) // ` (dead)
171#define FR_AMPR ALGR(FR_ECIR) // &
172#define FR_LBRC ALGR(FR_LPRN) // [
173#define FR_RBRC ALGR(FR_RPRN) // ]
174#define FR_MACR ALGR(FR_LSQU) // ¯ (dead)
175#define FR_UNDS ALGR(FR_RSQU) // _
176#define FR_LDQU ALGR(FR_LDAQ) // “
177#define FR_RDQU ALGR(FR_RDAQ) // ”
178#define FR_DEG ALGR(FR_QUOT) // °
179#define FR_CARN ALGR(FR_DCIR) // ˇ (dead)
180// Row 2
181#define FR_AE ALGR(FR_A) // æ
182#define FR_PND ALGR(FR_Z) // £
183#define FR_EURO ALGR(FR_E) // €
184#define FR_REGD ALGR(FR_R) // ®
185#define FR_LCBR ALGR(FR_T) // {
186#define FR_RCBR ALGR(FR_Y) // }
187#define FR_UGRV ALGR(FR_U) // ù
188#define FR_DOTA ALGR(FR_I) // ˙ (dead)
189#define FR_OE ALGR(FR_O) // œ
190#define FR_PERC ALGR(FR_P) // %
191#define FR_MMNS ALGR(FR_MINS) // −
192#define FR_DAGG ALGR(FR_PLUS) // †
193// Row 3
194#define FR_THET ALGR(FR_Q) // θ
195#define FR_SS ALGR(FR_S) // ß
196#define FR_DLR ALGR(FR_D) // $
197#define FR_CURR ALGR(FR_F) // ¤ (dead monetary key)
198#define FR_DGRK ALGR(FR_G) // µ (dead Greek key)
199#define FR_EU ALGR(FR_H) // Eu (dead European symbol key)
200#define FR_DSLS ALGR(FR_K) // ∕ (dead)
201#define FR_PIPE ALGR(FR_L) // |
202#define FR_INFN ALGR(FR_M) // ∞
203#define FR_DIV ALGR(FR_SLSH) // ÷
204#define FR_MUL ALGR(FR_ASTR) // ×
205// Row 4
206#define FR_LEQL ALGR(FR_LABK) // ≤
207#define FR_EZH ALGR(FR_W) // ʒ
208#define FR_COPY ALGR(FR_X) // ©
209#define FR_CCED ALGR(FR_C) // ç
210#define FR_CEDL ALGR(FR_V) // ¸ (dead)
211#define FR_DMNS ALGR(FR_B) // − (dead)
212#define FR_DTIL ALGR(FR_N) // ~ (dead)
213#define FR_IQUE ALGR(FR_DOT) // ¿
214#define FR_IEXL ALGR(FR_COMM) // ¡
215#define FR_MDDT ALGR(FR_COLN) // ·
216#define FR_AEQL ALGR(FR_SCLN) // ≃
217
218/* Shift+AltGr symbols
219 * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
220 * │  ̑ │   │   │   │   │ ˝ │  ̏ │   │ — │ ‹ │ › │ ˚ │   │       │
221 * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
222 * │     │   │   │   │   │ ™ │   │   │  ̣ │   │ ‰ │ ‑ │ ‡ │     │
223 * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐    │
224 * │      │   │   │   │   │   │ ˍ │   │   │   │   │ √ │ ¼ │    │
225 * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
226 * │    │ ≥ │   │   │   │ ˛ │   │   │   │  ̦ │   │ ≠ │          │
227 * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
228 * │    │    │    │                        │    │    │    │    │
229 * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
230 */
231// Row 1
232#define FR_IBRV S(ALGR(FR_AT)) //  ̑ (dead)
233#define FR_DACU S(ALGR(FR_LPRN)) // ˝ (dead)
234#define FR_DGRV S(ALGR(FR_RPRN)) //  ̏ (dead)
235#define FR_MDSH S(ALGR(FR_RSQU)) // —
236#define FR_LSAQ S(ALGR(FR_LDAQ)) // ‹
237#define FR_RSAQ S(ALGR(FR_RDAQ)) // ›
238#define FR_RNGA S(ALGR(FR_QUOT)) // ˚ (dead)
239// Row 2
240#define FR_TM S(ALGR(FR_T)) // ™
241#define FR_DOTB S(ALGR(FR_I)) //  ̣ (dead)
242#define FR_PERM S(ALGR(FR_P)) // ‰
243#define FR_NBHY S(ALGR(FR_MINS)) // ‑ (non-breaking hyphen)
244#define FR_DDAG S(ALGR(FR_PLUS)) // ‡
245// Row 3
246#define FR_MACB S(ALGR(FR_H)) // ˍ (dead)
247#define FR_SQRT S(ALGR(FR_SLSH)) // √
248#define FR_QRTR S(ALGR(FR_ASTR)) // ¼
249// Row 4
250#define FR_GEQL S(ALGR(FR_LABK)) // ≥
251#define FR_OGON S(ALGR(FR_V)) // ˛ (dead)
252#define FR_DCMM S(ALGR(FR_COMM)) //  ̦ (dead)
253#define FR_NEQL S(ALGR(FR_SCLN)) // ≠
diff --git a/quantum/keymap_extras/sendstring_french_afnor.h b/quantum/keymap_extras/sendstring_french_afnor.h
new file mode 100644
index 000000000..690daaaf0
--- /dev/null
+++ b/quantum/keymap_extras/sendstring_french_afnor.h
@@ -0,0 +1,100 @@
1/* Copyright 2020 Guillaume Gérard
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17// Sendstring lookup tables for French (AZERTY - AFNOR NF Z71-300) layouts
18
19#pragma once
20
21#include "keymap_french_afnor.h"
22#include "quantum.h"
23
24// clang-format off
25
26const uint8_t ascii_to_shift_lut[16] PROGMEM = {
27 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
28 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
29 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
30 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
31
32 KCLUT_ENTRY(0, 1, 1, 1, 0, 0, 0, 0),
33 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
34 KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
35 KCLUT_ENTRY(1, 1, 0, 0, 0, 1, 1, 1),
36 KCLUT_ENTRY(0, 1, 1, 1, 1, 1, 1, 1),
37 KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
38 KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
39 KCLUT_ENTRY(1, 1, 1, 0, 1, 0, 0, 0),
40 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
41 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
42 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
43 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0)
44};
45
46const uint8_t ascii_to_altgr_lut[16] PROGMEM = {
47 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
48 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
49 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
50 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
51
52 KCLUT_ENTRY(0, 0, 0, 0, 1, 1, 1, 0),
53 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
54 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
55 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
56 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
57 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
58 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
59 KCLUT_ENTRY(0, 0, 0, 1, 0, 1, 0, 1),
60 KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
61 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
62 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
63 KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 1, 0)
64};
65
66const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
67 // NUL SOH STX ETX EOT ENQ ACK BEL
68 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
69 // BS TAB LF VT FF CR SO SI
70 KC_BSPC, KC_TAB, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
71 // DLE DC1 DC2 DC3 DC4 NAK SYN ETB
72 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
73 // CAN EM SUB ESC FS GS RS US
74 XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
75
76 // ! " # $ % & '
77 KC_SPC, FR_COMM, FR_QUOT, FR_AT, FR_D, FR_P, FR_ECIR, FR_QUOT,
78 // ( ) * + , - . /
79 FR_LPRN, FR_RPRN, FR_ASTR, FR_PLUS, FR_COMM, FR_MINS, FR_DOT, FR_SLSH,
80 // 0 1 2 3 4 5 6 7
81 FR_RDAQ, FR_AGRV, FR_EACU, FR_EGRV, FR_ECIR, FR_LPRN, FR_RPRN, FR_LSQU,
82 // 8 9 : ; < = > ?
83 FR_RSQU, FR_LDAQ, FR_COLN, FR_SCLN, FR_LABK, FR_SCLN, FR_LABK, FR_DOT,
84 // @ A B C D E F G
85 FR_AT, FR_A, FR_B, FR_C, FR_D, FR_E, FR_F, FR_G,
86 // H I J K L M N O
87 FR_H, FR_I, FR_J, FR_K, FR_L, FR_M, FR_N, FR_O,
88 // P Q R S T U V W
89 FR_P, FR_Q, FR_R, FR_S, FR_T, FR_U, FR_V, FR_W,
90 // X Y Z [ \ ] ^ _
91 FR_X, FR_Y, FR_Z, FR_LPRN, FR_SLSH, FR_RPRN, FR_DCIR, FR_RSQU,
92 // ` a b c d e f g
93 FR_EGRV, FR_A, FR_B, FR_C, FR_D, FR_E, FR_F, FR_G,
94 // h i j k l m n o
95 FR_H, FR_I, FR_J, FR_K, FR_L, FR_M, FR_N, FR_O,
96 // p q r s t u v w
97 FR_P, FR_Q, FR_R, FR_S, FR_T, FR_U, FR_V, FR_W,
98 // x y z { | } ~ DEL
99 FR_X, FR_Y, FR_Z, FR_T, FR_L, FR_Y, FR_N, KC_DEL
100};