Warning: 20A3 This keyboard contains Ctrl,Alt and LCtrl,LAlt,RCtrl,RAlt sets of modifiers. Use only one or the other set for web target

Hello,

Upon compiling I got this warning:
Warning: 20A3 This keyboard contains Ctrl,Alt and LCtrl,LAlt,RCtrl,RAlt sets of modifiers. Use only one or the other set for web target.

Can you help me understand it? I couldn’t find any information online.

Does “web target” mean an embedded keyboard on a webpage, anytime a user tries to type something in an app running Chromuim, or something else?

What are the problems that could arise from mixing?

Here is the keyboard I’m working on:

c
c Keyman keyboard generated by ImportKeyboard
c Imported: 2024-03-11 14:40:31
c
c Source Keyboard File: KBDLA.DLL
c Source KeyboardID: 0000080a
c
c 

store(&Version) "10.0"
store(&NAME) 'Test Teclado Quechua'
store(&TARGETS) 'any'
store(&VISUALKEYBOARD) 'test_teclado_quechua.kvks'
store(&BITMAP) 'test_teclado_quechua.ico'
store(&LAYOUTFILE) 'test_teclado_quechua.keyman-touch-layout'
store(&COPYRIGHT) '©'
store(&KEYBOARDVERSION) '1.0'

begin Unicode > use(main)

c vea un mapa del teclado en https://help.keyman.com/developer/language/guide/virtual-keys
c Lo que aparece en [corchetes] es el nombre de la misma tecla física en el teclado. Su nombre por lo general se basa en la letra o carácter que tiene en el teclado inglés. 
c Los códigos que empiezan con U+ y que son seguidas por un código alfanumérico de 4 dígitos son los códigos Unicode, que especifican un carácter. 
c En este idioma de programación, la letra c empieza un comentario. Al final de cada Línea he puesto "c | " y después el carácter en sí

group(main) using keys

+ [K_SPACE] > U+0020       c |    (hace un espacio)
 
+ [K_0] > U+0030             c | 0
+ [SHIFT K_0] > U+003d       c | =
 
+ [K_1] > U+0031             c | 1
+ [SHIFT K_1] > U+0021       c | !
 
+ [K_2] > U+0032             c | 2
+ [SHIFT K_2] > U+0022       c | "
 
+ [K_3] > U+0033             c | 3
+ [SHIFT K_3] > U+0023       c | #
 
+ [K_4] > U+0034             c | 4
+ [SHIFT K_4] > U+0024       c | $
 
+ [K_5] > U+0035             c | 5
+ [SHIFT K_5] > U+0025       c | %
 
+ [K_6] > U+0036             c | 6
+ [SHIFT K_6] > U+0026       c | &
 
+ [K_7] > U+0037             c | 7
+ [SHIFT K_7] > U+002f       c | /
 
+ [K_8] > U+0038             c | 8
+ [SHIFT K_8] > U+0028       c | (
 
+ [K_9] > U+0039             c | 9
+ [SHIFT K_9] > U+0029       c | )
 
+ [NCAPS K_A] > U+0061       c | a    | cuando el usuario teclea la tecla de A, pone una "a"
+ [CAPS K_A] > U+0041        c | A    | cuando el usuario teclea la tecla de A y el Bloq Mayúscula está activado, pone una "A"
+ [NCAPS SHIFT K_A] > U+0041 c | A    | cuando el usuario teclea la tecla Mayúscula y después la tecla de A, pone una "A"
+ [CAPS SHIFT K_A] > U+0061  c | a    | cuando el usuario teclea la tecla Mayúscula y después la tecla de A, y el Bloq Mayúscula está activado, pone una "a"
 
+ [NCAPS K_B] > U+0062       c | b
+ [CAPS K_B] > U+0042        c | B
+ [NCAPS SHIFT K_B] > U+0042 c | B
+ [CAPS SHIFT K_B] > U+0062  c | b
 
+ [NCAPS K_C] > U+0063       c | c
+ [CAPS K_C] > U+0043        c | C
+ [NCAPS SHIFT K_C] > U+0043 c | C
+ [CAPS SHIFT K_C] > U+0063  c | c
 
+ [NCAPS K_D] > U+0064       c | d
+ [CAPS K_D] > U+0044        c | D
+ [NCAPS SHIFT K_D] > U+0044 c | D
+ [CAPS SHIFT K_D] > U+0064  c | d
 
+ [NCAPS K_E] > U+0065       c | e
+ [CAPS K_E] > U+0045        c | E
+ [NCAPS SHIFT K_E] > U+0045 c | E
+ [CAPS SHIFT K_E] > U+0065  c | e
 
+ [NCAPS K_F] > U+0066       c | f
+ [CAPS K_F] > U+0046        c | F
+ [NCAPS SHIFT K_F] > U+0046 c | F
+ [CAPS SHIFT K_F] > U+0066  c | f
 
+ [NCAPS K_G] > U+0067       c | g
+ [CAPS K_G] > U+0047        c | G
+ [NCAPS SHIFT K_G] > U+0047 c | G
+ [CAPS SHIFT K_G] > U+0067  c | g
 
+ [NCAPS K_H] > U+0068       c | h
+ [CAPS K_H] > U+0048        c | H
+ [NCAPS SHIFT K_H] > U+0048 c | H
+ [CAPS SHIFT K_H] > U+0068  c | h
 
+ [NCAPS K_I] > U+0069       c | i
+ [CAPS K_I] > U+0049        c | I
+ [NCAPS SHIFT K_I] > U+0049 c | I
+ [CAPS SHIFT K_I] > U+0069  c | i
 
+ [NCAPS K_J] > U+006a       c | j
+ [CAPS K_J] > U+004a        c | J
+ [NCAPS SHIFT K_J] > U+004a c | J
+ [CAPS SHIFT K_J] > U+006a  c | j
 
+ [NCAPS K_K] > U+006b       c | k
+ [CAPS K_K] > U+004b        c | K
+ [NCAPS SHIFT K_K] > U+004b c | K
+ [CAPS SHIFT K_K] > U+006b  c | k
 
+ [NCAPS K_L] > U+006c       c | l
+ [CAPS K_L] > U+004c        c | L
+ [NCAPS SHIFT K_L] > U+004c c | L
+ [CAPS SHIFT K_L] > U+006c  c | l
 
+ [NCAPS K_M] > U+006d       c | m
+ [CAPS K_M] > U+004d        c | M
+ [NCAPS SHIFT K_M] > U+004d c | M
+ [CAPS SHIFT K_M] > U+006d  c | m
 
+ [NCAPS K_N] > U+006e       c | n
+ [CAPS K_N] > U+004e        c | N
+ [NCAPS SHIFT K_N] > U+004e c | N
+ [CAPS SHIFT K_N] > U+006e  c | n
 
+ [NCAPS K_O] > U+006f       c | o
+ [CAPS K_O] > U+004f        c | O
+ [NCAPS SHIFT K_O] > U+004f c | O
+ [CAPS SHIFT K_O] > U+006f  c | o
 
+ [NCAPS K_P] > U+0070       c | p
+ [CAPS K_P] > U+0050        c | P
+ [NCAPS SHIFT K_P] > U+0050 c | P
+ [CAPS SHIFT K_P] > U+0070  c | p
 
+ [NCAPS K_Q] > U+0071       c | q
+ [CAPS K_Q] > U+0051        c | Q
+ [NCAPS SHIFT K_Q] > U+0051 c | Q
+ [CAPS SHIFT K_Q] > U+0071  c | q
+ [NCAPS RALT K_Q] > U+0040  c | @
 
+ [NCAPS K_R] > U+0072       c | r
+ [CAPS K_R] > U+0052        c | R
+ [NCAPS SHIFT K_R] > U+0052 c | R
+ [CAPS SHIFT K_R] > U+0072  c | r
 
+ [NCAPS K_S] > U+0073       c | s
+ [CAPS K_S] > U+0053        c | S
+ [NCAPS SHIFT K_S] > U+0053 c | S
+ [CAPS SHIFT K_S] > U+0073  c | s
 
+ [NCAPS K_T] > U+0074       c | t
+ [CAPS K_T] > U+0054        c | T
+ [NCAPS SHIFT K_T] > U+0054 c | T
+ [CAPS SHIFT K_T] > U+0074  c | t
 
+ [NCAPS K_U] > U+0075       c | u
+ [CAPS K_U] > U+0055        c | U
+ [NCAPS SHIFT K_U] > U+0055 c | U
+ [CAPS SHIFT K_U] > U+0075  c | u
 
+ [NCAPS K_V] > U+0076       c | v
+ [CAPS K_V] > U+0056        c | V
+ [NCAPS SHIFT K_V] > U+0056 c | V
+ [CAPS SHIFT K_V] > U+0076  c | v
 
+ [NCAPS K_W] > U+0077       c | w
+ [CAPS K_W] > U+0057        c | W
+ [NCAPS SHIFT K_W] > U+0057 c | W
+ [CAPS SHIFT K_W] > U+0077  c | w
 
+ [NCAPS K_X] > U+0078       c | x
+ [CAPS K_X] > U+0058        c | X
+ [NCAPS SHIFT K_X] > U+0058 c | X
+ [CAPS SHIFT K_X] > U+0078  c | x
 
+ [NCAPS K_Y] > U+0079       c | y
+ [CAPS K_Y] > U+0059        c | Y
+ [NCAPS SHIFT K_Y] > U+0059 c | Y
+ [CAPS SHIFT K_Y] > U+0079  c | y
 
+ [NCAPS K_Z] > U+007a       c | z
+ [CAPS K_Z] > U+005a        c | Z
+ [NCAPS SHIFT K_Z] > U+005a c | Z
+ [CAPS SHIFT K_Z] > U+007a  c | z

+ [K_LBRKT] > dk(00b4)       c | Esta tecla pone los acentos encima de los vocales en español. ( " ´ " ). Es una tecla muerta. 
+ [SHIFT K_LBRKT] > dk(00a8) c | Esta tecla (con Mayúscula) pone los umlaut encima de los vocales en español. ( " ¨ " ). Es una tecla muerta. 
 
+ [K_RBRKT] > U+002b         c | +
+ [SHIFT K_RBRKT] > U+002a   c | *
+ [RALT K_RBRKT] > U+007e    c | ~
 
+ [K_COMMA] > U+002c         c | ,
+ [SHIFT K_COMMA] > U+003b   c | ;
 
+ [K_SLASH] > U+002d         c | -
+ [SHIFT K_SLASH] > U+005f   c | _
 
+ [K_PERIOD] > U+002e        c | .
+ [SHIFT K_PERIOD] > U+003a  c | :
 
+ [K_BKSLASH] > U+007d           c | }
+ [SHIFT K_BKSLASH] > U+005d     c | ]
+ [RALT K_BKSLASH] > dk(0060)    c | alt derecho más "}" hace una "tecla muerta virtual" que pondrá un  "`" encima del vocal siguiente. Por ejemplo: ALT-DERECHO + "}" + e > ê

 
+ [NCAPS K_COLON] > U+00f1       c | ñ
+ [CAPS K_COLON] > U+00d1        c | Ñ
+ [NCAPS SHIFT K_COLON] > U+00d1 c | Ñ
+ [CAPS SHIFT K_COLON] > U+00f1  c | ñ
 
+ [K_HYPHEN] > U+0027        c | '
+ [SHIFT K_HYPHEN] > U+003f  c | ?
+ [RALT K_HYPHEN] > U+005c   c | \
 
+ [K_BKQUOTE] > U+007c       c | |
+ [SHIFT K_BKQUOTE] > U+00b0 c | °
+ [RALT K_BKQUOTE] > U+00ac  c | ¬
 
+ [K_EQUAL] > U+00bf         c | ¿
+ [SHIFT K_EQUAL] > U+00a1   c | ¡
 
+ [K_QUOTE] > U+007b         c | {
+ [SHIFT K_QUOTE] > U+005b   c | [
+ [RALT K_QUOTE] > dk(005e)  c | alt derecho más "{" hace una "tecla muerta virtual" que pondrá un  "^" encima del vocal siguiente. 
c |                              Por ejemplo: ALT-DERECHO + "{" + e > ê. También, para conseguir el "^" solo, solo hay que teclear
c |                              Alt-DERECHO + "{" + ESPACIO > "^"
 
+ [K_oE2] > U+003c           c | <
+ [SHIFT K_oE2] > U+003e     c | >

c | == Habilitar menor-que y mayor-que en teclados norteamericanos 
+ [ALT K_COMMA] > U+003C c | Alt + "," = "<"
+ [ALT K_PERIOD] > U+003E c | Alt + "." = ">" 

match > use(deadkeys)

group(deadkeys)


c | "store(vocales) A E I O U" quiere decir, "recuerda esta lista de caracteres que nombro 'vocales'
c | "store(vocales_con_acentos) Á E Í Ó U" quiere decir, "recuerda esta lista de caracteres que nombro 'vocales_con_acentos'
c | "dk(tecla_muerta_de_acento) any(vocales) > index(vocales_con_acentos, 2)" quiere decir, "Cuando tecleo la tecla muerta de acento 
c |     y después un carácter en la lista "vocales", pone el carácter de la lista "vocales_con_acentos" que aparece en la misma posición 
c |     del carater en la lista de "vocales". Por elemplo, "´" + "e" > "é". 


store(dkf00b4) U+0020 U+0061 U+0041 U+0065 U+0045 U+0069 U+0049 U+006f U+004f U+0075 U+0055 U+0079 U+0059 c |   a A e E i I o O u U y Y
store(dkt00b4) U+00b4 U+00e1 U+00c1 U+00e9 U+00c9 U+00ed U+00cd U+00f3 U+00d3 U+00fa U+00da U+00fd U+00dd c | ´ á Á é É í Í ó Ó ú Ú ý Ý
dk(00b4) any(dkf00b4) > index(dkt00b4, 2)

store(dkf00a8) U+0020 U+0061 U+0041 U+0065 U+0045 U+0069 U+0049 U+006f U+004f U+0075 U+0055 U+0079 c |   a A e E i I o O u U y
store(dkt00a8) U+00a8 U+00e4 U+00c4 U+00eb U+00cb U+00ef U+00cf U+00f6 U+00d6 U+00fc U+00dc U+00ff c | ¨ ä Ä ë Ë ï Ï ö Ö ü Ü ÿ
dk(00a8) any(dkf00a8) > index(dkt00a8, 2)

store(dkf0060) U+0020 U+0061 U+0041 U+0065 U+0045 U+0069 U+0049 U+006f U+004f U+0075 U+0055 c |   a A e E i I o O u U
store(dkt0060) U+0060 U+00e0 U+00c0 U+00e8 U+00c8 U+00ec U+00cc U+00f2 U+00d2 U+00f9 U+00d9 c | ` à À è È ì Ì ò Ò ù Ù
dk(0060) any(dkf0060) > index(dkt0060, 2)

store(dkf005e) U+0020 U+0061 U+0041 U+0065 U+0045 U+0069 U+0049 U+006f U+004f U+0075 U+0055 c |   a A e E i I o O u U
store(dkt005e) U+005e U+00e2 U+00c2 U+00ea U+00ca U+00ee U+00ce U+00f4 U+00d4 U+00fb U+00db c | ^ â Â ê Ê î Î ô Ô û Û
dk(005e) any(dkf005e) > index(dkt005e, 2)

c | inicio de modificaciones para el teclado Quechua

c | == sección de consonantes ==

c | == Habilitar consonantes con acento ==
store(consonantes_sin_tilde)           U+0063 U+0043 U+0072 U+0052 U+0073 U+0053 c | c C r R s S
store(consonantes_con_tilde) U+0107 U+0106 U+0155 U+0154 U+015B U+015A c | ć Ć ŕ Ŕ ś Ś
dk(00b4) any(consonantes_sin_tilde) > index(consonantes_con_tilde, 2) c | usa la tecla "´" para poner el acento, igual como los vocales
U+007c any(consonantes_sin_tilde) > index(consonantes_con_tilde, 2) c | usa la tecla "|" ("`" en teclados norteamericanos) para lograr lo mismo que "'" (método heredero)

c | == Habilitar la C con circunflejo ==
store(c)                 U+0063 U+0043 c | c C
store(c_con_circunflejo) U+0109 U+0108 c | ĉ Ĉ
dk(005e) any(c) > index(c_con_circunflejo, 2) c | AltDerecho + "{" + "c" > "ĉ"
U+0026 any(c) > index(c_con_circunflejo, 2) c | Mayús + "6" + c" > "ĉ"

c | == Habilitar consonantes con caron ==
store(consonantes_sin_caron) U+0063 U+0043 U+0073 U+0053 c | c C s S
store(consonantes_con_caron) U+010D U+010C U+0161 U+0160 c | č Č š Š
U+0025 any(consonantes_sin_caron) > index(consonantes_con_caron, 2) c | Mayús + "5" + c > "č"

c | == sección de puntuación ==

c | == Habilitar las comillas angulares simples y dobles ==
c | ==== Primer método. Funciona en teclados Latinoamericanos. ====
U+003c U+003c > U+00AB c | "<" + "<" = "«"
U+00AB U+003c > U+2039 c | "«" + "<" = "‹" No estoy seguro si esto va a funcionar
U+003e U+003e > U+00BB c | ">" + ">" = "»"
U+00BB U+003e > U+203A c | "»" + ">" = "›" No estoy seguro si esto va a funcionar
c | ==== segundo método. Funciona en teclados norteamericanos. ====
c |  WON'T BE NEEDED SI SECCIÓN "Habilitar menor-que y mayor-que en teclados norteamericanos" FUNCIONE
c | U+002c U+002c        > U+00AB c |       Alt + "," + "," > "«"
c | U+002c U+002c U+002c > U+2039 c | Alt + "," + "," + "," > "‹" . No estoy seguro si esto va a funcionar
c | U+003e U+003e        > U+00BB c |       Alt + "." + "." > "»"
c | U+003e U+003e U+003e > U+203A c | Alt + "." + "." + "." > "›" . No estoy seguro si esto va a funcionar

dk(00a8) U+0027 > U+A78C c | ' ꞌ para teclear el glotal, teclea la tecla de acento 
c |                              (a la derecha de la "P") y después la tecla de comilla 
c |                              (a la derecha de la "0"). En breve "´" + "'" > "ꞌ"

c | == Seccion de AFI == 
c | basado en el SIL IPA Keyboard (https://help.keyman.com/keyboard/sil_ipa/1.8.6/sil_ipa),
c | pero considerando la configuración del teclado latinoamericano

U+005f U+005f   > U+02BC c | ʼ  "]" + "]" eyectiva
dk(00a8) U+003d > U+0294 c | ʔ	"?" + "=" glotal
U+0061 U+003d   > U+0251 c | ɑ 	"a" + "=" 
U+0061 U+005b   > U+00E6 c | æ	"a" + "[" 
U+006f U+005b   > U+0254 c | ɔ	"o" + "[" 
U+0065 U+003d   > U+0259 c | ə	"e" + "=" 
U+0065 U+005b   > U+025B c | ɛ	"e" + "["
U+0047 U+003d   > U+0262 c | ɢ	"G" + "="
U+0067 U+003d   > U+0263 c | ɣ	"g" + "="
U+0068 U+0026   > U+02B0 c | ʰ	"h" + "&"	
U+0069 U+003d   > U+026A c | ɪ	"i" + "="	
U+006e U+003d   > U+0272 c | ɲ	"n" + "="	
U+0066 U+003d   > U+0278 c | ɸ	"f" + "="	
U+0073 U+003d   > U+0283 c | ʃ	"s" + "="	
U+0075 U+005b   > U+028A c | ʊ	"u" + "["	
U+004c U+005b   > U+028E c | ʎ	"L" + "["	
U+0062 U+003d   > U+03B2 c | β	"b" + "="	
U+0074 U+003d   > U+03B8 c | θ	"t" + "="	
U+0078 U+003d   > U+03C7 c | χ	"x" + "="	

It appears that lines 238 and 239 are the problem lines:

c | == Habilitar menor-que y mayor-que en teclados norteamericanos 
+ [ALT K_COMMA] > U+003C c | Alt + "," = "<"
+ [ALT K_PERIOD] > U+003E c | Alt + "." = ">"

The only other lines that appear to be relevant come before them, are all RALT, and are a part of the default Latin American keyboard. Here they are listed with their line numbers:

196 + [RALT K_RBRKT] > U+007e    c | ~
209 + [RALT K_BKSLASH] > dk(0060)    c | alt derecho más "}" hace una "tecla muerta virtual" que pondrá un  "`" encima del vocal siguiente. Por ejemplo: ALT-DERECHO + "}" + e > ê
219 + [RALT K_HYPHEN] > U+005c   c | \
223 + [RALT K_BKQUOTE] > U+00ac  c | ¬
230 + [RALT K_QUOTE] > dk(005e)  c | alt derecho más "{" hace una "tecla muerta virtual" que pondrá un  "^" encima del vocal siguiente. 
    c |                              Por ejemplo: ALT-DERECHO + "{" + e > ê. También, para conseguir el "^" olo, solo hay que teclear
    c |                              Alt-DERECHO + "{" + ESPACIO > "^"

(Comments mine.)

I would really like the user to be able to use left Alt for lines 238 and 239, as it would be much more ergonomic. (Or right Alt if typing with just one hand.)

Also, would this warning be why I got the error message Failure: 'D:\l...\Keyman Developer\Projects\...\source\..._teclado_quechua.kmn' was not compiled successfully for Web, iPhone, iPad, Android phone, Android tablet, Mobile devices, Tablet devices.? I got no other warning or error messages.

Thanks so much for your help!

This is a warning about mixing rules that have, e.g. [ALT ... and [RALT ...] – i.e. some that are specific to one left or right modifiers and others that are either.

‘web target’ here refers to KeymanWeb.

With the compile for KeymanWeb, you may find that some rules are skipped if you mix modifiers, because KeymanWeb will test e.g. the right-alt rule and then skip another rule which uses either alt.

For users, it can be confusing that some keys work with either alt and some only with right-alt.

We recommend using only RALT. In fact, the only recommended modifier keys to use for best cross-platform predictibility are: SHIFT and RALT (along with the CAPS/NCAPS state keys). Left Alt on Windows overlaps with shortcut keys, e.g. Alt+F to open File menu. and either Ctrl key is reserved for commands such as Ctrl+V to paste.

Keyboards that use only those two modifier keys will work best on Windows, Linux, and macOS platforms without further tweaks.

1 Like

Thanks so much Marc! This helps me understand the situation better. Right Alt it is then. I just made the change and it compiled perfectly!

Perhaps Warning 20A3 should be reclassified as an Error since it prevents the compiler from compiling successfully?

I expect that under Project menu, Project settings, you have the “Treat compiler hints and warnings as errors” box ticked. This is our preferred setting (since we think it produces keyboards that are more solid), but there are occasions when an author wants to ignore certain warnings and then has to untick this box.

Ah yes, you are right. Good call!