From a2fa2ea0dd1712da9f01f386e1bcc334206ba280 Mon Sep 17 00:00:00 2001 From: "Joshua A. Horton" Date: Mon, 30 Apr 2018 13:41:00 +0700 Subject: [PATCH] Adds a warning to ambiguous AltGr emulation cases, defaulting to 'on.' --- web/source/kmwosk.ts | 57 ++++++++++++++---- .../resources/keyboards/test_chirality.js | 2 +- .../resources/keyboards/test_chirality.kmn | 2 - .../resources/keyboards/test_chirality.kmx | Bin 1908 -> 1864 bytes 4 files changed, 46 insertions(+), 15 deletions(-) diff --git a/web/source/kmwosk.ts b/web/source/kmwosk.ts index f43ebc0594..bc1fe34cf3 100644 --- a/web/source/kmwosk.ts +++ b/web/source/kmwosk.ts @@ -3094,26 +3094,53 @@ if(!window['keyman']['initialized']) { * @return {boolean} */ osk.emulatesAltGr = function(keyLabels) { - var activeKeyboard = keymanweb.keyboardManager.activeKeyboard; - if(activeKeyboard == null || activeKeyboard['KV'] == null) { + var layers; + + // If we're not chiral, we're not emulating. + if(!keymanweb.keyboardManager.isChiral()) { return false; } - var layers = keyLabels ? keyLabels : activeKeyboard['KV']['KLS']; + if(!keyLabels) { + var activeKeyboard = keymanweb.keyboardManager.activeKeyboard; + if(activeKeyboard == null || activeKeyboard['KV'] == null) { + return false; + } + + layers = activeKeyboard['KV']['KLS']; + } else { + layers = keyLabels; + } - var unshiftedEmulationLayer = layers[osk.getLayerId(osk.modifierCodes['LCTRL'] | osk.modifierCodes['LALT'])]; - var shiftedEmulationLayer = layers[osk.getLayerId(osk.modifierCodes['SHIFT'] | osk.modifierCodes['LCTRL'] | osk.modifierCodes['LALT'])]; + var emulationMask = osk.modifierCodes['LCTRL'] | osk.modifierCodes['LALT']; + + var unshiftedEmulationLayer = layers[osk.getLayerId(emulationMask)]; + var shiftedEmulationLayer = layers[osk.getLayerId(osk.modifierCodes['SHIFT'] | emulationMask)]; // buildDefaultLayout ensures that these are aliased to the original modifier set being emulated. // As a result, we can directly test for reference equality. - if(unshiftedEmulationLayer != layers[osk.getLayerId(osk.modifierCodes['RALT'])]) { + if(unshiftedEmulationLayer != null && + unshiftedEmulationLayer != layers[osk.getLayerId(osk.modifierCodes['RALT'])]) { return false; } - if(shiftedEmulationLayer != layers[osk.getLayerId(osk.modifierCodes['RALT'] | osk.modifierCodes('SHIFT'))]) { + if(shiftedEmulationLayer != null && + shiftedEmulationLayer != layers[osk.getLayerId(osk.modifierCodes['RALT'] | osk.modifierCodes['SHIFT'])]) { return false; } + // It's technically possible for the OSK to not specify anything while allowing chiral input. A last-ditch catch: + + var bitmask = keymanweb.keyboardManager.getKeyboardModifierBitmask(); + if((bitmask & emulationMask) != emulationMask) { + // At least one of the emulation modifiers is never used by the keyboard! We can confirm everything's safe. + return true; + } + + if(unshiftedEmulationLayer == null && shiftedEmulationLayer == null) { + // We've run out of things to go on; we can't detect if chiral AltGr emulation is intended or not. + console.warn("Could not detect if AltGr emulation is safe, but defaulting to active emulation!") + } return true; } @@ -3160,11 +3187,17 @@ if(!window['keyman']['initialized']) { validIdList = [ 'default' ].concat(validIdList); // Automatic AltGr emulation if the 'leftctrl-leftalt' layer is otherwise undefined. - if(osk.emulatesAltGr(keyLabels) && validIdList.indexOf('rightalt') != -1) { - validIdList.push('leftctrl-leftalt'); - validIdList.push('leftctrl-leftalt-shift'); - keyLabels['leftctrl-leftalt'] = keyLabels['rightalt']; - keyLabels['leftctrl-leftalt-shift'] = keyLabels['rightalt-shift']; + if(osk.emulatesAltGr(keyLabels)) { + // We insert only the layers that need to be emulated. + if((validIdList.indexOf('leftctrl-leftalt') == -1) && validIdList.indexOf('rightalt') != -1) { + validIdList.push('leftctrl-leftalt'); + keyLabels['leftctrl-leftalt'] = keyLabels['rightalt']; + } + + if((validIdList.indexOf('leftctrl-leftalt-shift') == -1) && validIdList.indexOf('rightalt-shift') != -1) { + validIdList.push('leftctrl-leftalt-shift'); + keyLabels['leftctrl-leftalt-shift'] = keyLabels['rightalt-shift']; + } } // For desktop devices, we must create all layers, even if invalid. diff --git a/web/unit_tests/resources/keyboards/test_chirality.js b/web/unit_tests/resources/keyboards/test_chirality.js index da50da1312..1011b551b3 100644 --- a/web/unit_tests/resources/keyboards/test_chirality.js +++ b/web/unit_tests/resources/keyboards/test_chirality.js @@ -1 +1 @@ -if(typeof keyman === 'undefined') {console.log('Keyboard requires KeymanWeb 10.0 or later');if(typeof tavultesoft !== 'undefined') tavultesoft.keymanweb.util.alert("This keyboard requires KeymanWeb 10.0 or later");} else {KeymanWeb.KR(new Keyboard_test_chirality());}function Keyboard_test_chirality(){this.KI="Keyboard_test_chirality";this.KN="KeymanWeb Chirality Tester";this.KMINVER="10.0";this.KV={F:' 1em "Arial"',K102:0};this.KDU=1;this.KLS={};this.KV.BK=(function(x){var e=Array.apply(null,Array(65)).map(String.prototype.valueOf,""),r=[],v,i,m=['default','shift','ctrl','shift-ctrl','alt','shift-alt','ctrl-alt','shift-ctrl-alt'];for(i=m.length-1;i>=0;i--)if((v=x[m[i]])||r.length)r=(v?v:e).slice().concat(r);return r})(this.KLS);this.KH='';this.KM=0;this.KBVER="1.0";this.KMBM=0x031F;this.KVER="10.0.1014.0";this.gs=function(t,e) {return this.g0(t,e);};this.g0=function(t,e) {var k=KeymanWeb,r=0,m=0;if(k.KKM(e,16658,65)) {r=m=1;k.KO(0,t,"CAPSLOCK_RC_CAP_a");}else if(k.KKM(e,16666,65)) {r=m=1;k.KO(0,t,"CAPSLOCK_RCA_CAP_a");}else if(k.KKM(e,16664,65)) {r=m=1;k.KO(0,t,"CAPSLOCK_RA_CAP_a");}else if(k.KKM(e,16657,65)) {r=m=1;k.KO(0,t,"CAPSLOCK_LC_CAP_a");}else if(k.KKM(e,16660,65)) {r=m=1;k.KO(0,t,"CAPSLOCK_LA_CAP_a");}else if(k.KKM(e,16642,65)) {r=m=1;k.KO(0,t,"CAPSLOCK_RC_a");}else if(k.KKM(e,16650,65)) {r=m=1;k.KO(0,t,"CAPSLOCK_RCA_a");}else if(k.KKM(e,16648,65)) {r=m=1;k.KO(0,t,"CAPSLOCK_RA_a");}else if(k.KKM(e,16644,65)) {r=m=1;k.KO(0,t,"CAPSLOCK_LA_a");}else if(k.KKM(e,16641,65)) {r=m=1;k.KO(0,t,"CAPSLOCK_LC_a");}else if(k.KKM(e,16645,65)) {r=m=1;k.KO(0,t,"CAPSLOCK_LCA_a");}else if(k.KKM(e,16644,65)) {r=m=1;k.KO(0,t,"CAPSLOCK_LA_a");}else if(k.KKM(e,16641,65)) {r=m=1;k.KO(0,t,"CAPSLOCK_LC_a");}else if(k.KKM(e,16914,65)) {r=m=1;k.KO(0,t,"RC_CAP_a");}else if(k.KKM(e,16922,65)) {r=m=1;k.KO(0,t,"RCA_CAP_a");}else if(k.KKM(e,16920,65)) {r=m=1;k.KO(0,t,"RA_CAP_a");}else if(k.KKM(e,16913,65)) {r=m=1;k.KO(0,t,"LC_CAP_a");}else if(k.KKM(e,16916,65)) {r=m=1;k.KO(0,t,"LA_CAP_a");}else if(k.KKM(e,16898,65)) {r=m=1;k.KO(0,t,"RC_a");}else if(k.KKM(e,16906,65)) {r=m=1;k.KO(0,t,"RCA_a");}else if(k.KKM(e,16904,65)) {r=m=1;k.KO(0,t,"RA_a");}else if(k.KKM(e,16900,65)) {r=m=1;k.KO(0,t,"LA_a");}else if(k.KKM(e,16897,65)) {r=m=1;k.KO(0,t,"LC_a");}else if(k.KKM(e,16901,65)) {r=m=1;k.KO(0,t,"LCA_a");}else if(k.KKM(e,16900,65)) {r=m=1;k.KO(0,t,"LA_a");}else if(k.KKM(e,16897,65)) {r=m=1;k.KO(0,t,"LC_a");}else if(k.KKM(e,16640,65)) {r=m=1;k.KO(0,t,"CAPSLOCK_DF_a");}else if(k.KKM(e,16912,65)) {r=m=1;k.KO(0,t,"DF_CAP_a");}else if(k.KKM(e,16656,65)) {r=m=1;k.KO(0,t,"CAPSLOCK_DF_CAP_a");}else if(k.KKM(e,16896,65)) {r=m=1;k.KO(0,t,"DF_a");}else if(k.KKM(e,16384,66)) {r=m=1;k.KO(0,t,"b");}return r;};} \ No newline at end of file +if(typeof keyman === 'undefined') {console.log('Keyboard requires KeymanWeb 10.0 or later');if(typeof tavultesoft !== 'undefined') tavultesoft.keymanweb.util.alert("This keyboard requires KeymanWeb 10.0 or later");} else {KeymanWeb.KR(new Keyboard_test_chirality());}function Keyboard_test_chirality(){this.KI="Keyboard_test_chirality";this.KN="KeymanWeb Chirality Tester";this.KMINVER="10.0";this.KV={F:' 1em "Arial"',K102:0};this.KDU=1;this.KV.KLS={};this.KV.BK=(function(x){var e=Array.apply(null,Array(65)).map(String.prototype.valueOf,""),r=[],v,i,m=['default','shift','ctrl','shift-ctrl','alt','shift-alt','ctrl-alt','shift-ctrl-alt'];for(i=m.length-1;i>=0;i--)if((v=x[m[i]])||r.length)r=(v?v:e).slice().concat(r);return r})(this.KV.KLS);this.KH='';this.KM=0;this.KBVER="1.0";this.KMBM=0x031F;this.KVER="10.0.1057.0";this.gs=function(t,e) {return this.g0(t,e);};this.g0=function(t,e) {var k=KeymanWeb,r=0,m=0;if(k.KKM(e,16658,65)) {r=m=1;k.KDC(0,t);k.KO(-1,t,"CAPSLOCK_RC_CAP_a");}else if(k.KKM(e,16666,65)) {r=m=1;k.KDC(0,t);k.KO(-1,t,"CAPSLOCK_RCA_CAP_a");}else if(k.KKM(e,16664,65)) {r=m=1;k.KDC(0,t);k.KO(-1,t,"CAPSLOCK_RA_CAP_a");}else if(k.KKM(e,16657,65)) {r=m=1;k.KDC(0,t);k.KO(-1,t,"CAPSLOCK_LC_CAP_a");}else if(k.KKM(e,16660,65)) {r=m=1;k.KDC(0,t);k.KO(-1,t,"CAPSLOCK_LA_CAP_a");}else if(k.KKM(e,16642,65)) {r=m=1;k.KDC(0,t);k.KO(-1,t,"CAPSLOCK_RC_a");}else if(k.KKM(e,16650,65)) {r=m=1;k.KDC(0,t);k.KO(-1,t,"CAPSLOCK_RCA_a");}else if(k.KKM(e,16648,65)) {r=m=1;k.KDC(0,t);k.KO(-1,t,"CAPSLOCK_RA_a");}else if(k.KKM(e,16644,65)) {r=m=1;k.KDC(0,t);k.KO(-1,t,"CAPSLOCK_LA_a");}else if(k.KKM(e,16641,65)) {r=m=1;k.KDC(0,t);k.KO(-1,t,"CAPSLOCK_LC_a");}else if(k.KKM(e,16645,65)) {r=m=1;k.KDC(0,t);k.KO(-1,t,"CAPSLOCK_LCA_a");}else if(k.KKM(e,16644,65)) {r=m=1;k.KDC(0,t);k.KO(-1,t,"CAPSLOCK_LA_a");}else if(k.KKM(e,16641,65)) {r=m=1;k.KDC(0,t);k.KO(-1,t,"CAPSLOCK_LC_a");}else if(k.KKM(e,16914,65)) {r=m=1;k.KDC(0,t);k.KO(-1,t,"RC_CAP_a");}else if(k.KKM(e,16922,65)) {r=m=1;k.KDC(0,t);k.KO(-1,t,"RCA_CAP_a");}else if(k.KKM(e,16920,65)) {r=m=1;k.KDC(0,t);k.KO(-1,t,"RA_CAP_a");}else if(k.KKM(e,16913,65)) {r=m=1;k.KDC(0,t);k.KO(-1,t,"LC_CAP_a");}else if(k.KKM(e,16916,65)) {r=m=1;k.KDC(0,t);k.KO(-1,t,"LA_CAP_a");}else if(k.KKM(e,16898,65)) {r=m=1;k.KDC(0,t);k.KO(-1,t,"RC_a");}else if(k.KKM(e,16906,65)) {r=m=1;k.KDC(0,t);k.KO(-1,t,"RCA_a");}else if(k.KKM(e,16904,65)) {r=m=1;k.KDC(0,t);k.KO(-1,t,"RA_a");}else if(k.KKM(e,16900,65)) {r=m=1;k.KDC(0,t);k.KO(-1,t,"LA_a");}else if(k.KKM(e,16897,65)) {r=m=1;k.KDC(0,t);k.KO(-1,t,"LC_a");}else if(k.KKM(e,16901,65)) {r=m=1;k.KDC(0,t);k.KO(-1,t,"LCA_a");}else if(k.KKM(e,16900,65)) {r=m=1;k.KDC(0,t);k.KO(-1,t,"LA_a");}else if(k.KKM(e,16897,65)) {r=m=1;k.KDC(0,t);k.KO(-1,t,"LC_a");}else if(k.KKM(e,16640,65)) {r=m=1;k.KDC(0,t);k.KO(-1,t,"CAPSLOCK_DF_a");}else if(k.KKM(e,16912,65)) {r=m=1;k.KDC(0,t);k.KO(-1,t,"DF_CAP_a");}else if(k.KKM(e,16656,65)) {r=m=1;k.KDC(0,t);k.KO(-1,t,"CAPSLOCK_DF_CAP_a");}else if(k.KKM(e,16896,65)) {r=m=1;k.KDC(0,t);k.KO(-1,t,"DF_a");}else if(k.KKM(e,16384,66)) {r=m=1;k.KDC(0,t);k.KO(-1,t,"b");}return r;};} \ No newline at end of file diff --git a/web/unit_tests/resources/keyboards/test_chirality.kmn b/web/unit_tests/resources/keyboards/test_chirality.kmn index eb870422e4..e0d4ecbe90 100644 --- a/web/unit_tests/resources/keyboards/test_chirality.kmn +++ b/web/unit_tests/resources/keyboards/test_chirality.kmn @@ -1,8 +1,6 @@ store(&TARGETS) 'any web desktop' store(©RIGHT) '© 2018 SIL International' store(&VISUALKEYBOARD) 'test_chirality.kvks' -store(&LANGUAGE) 'x0409' -store(&WINDOWSLANGUAGES) 'x0409' store(&NAME) 'KeymanWeb Chirality Tester' begin Unicode > use(main) diff --git a/web/unit_tests/resources/keyboards/test_chirality.kmx b/web/unit_tests/resources/keyboards/test_chirality.kmx index 8e276f650aa1a30fad62648053c6cbbd4b28b185..9eed98954574084b344c77010bf18dd26a6f76bd 100644 GIT binary patch literal 1864 zcmb`G!D>@M6oyYiqA?3eL#&|-&8oN(D_UKYnwnB93ACgIU5K$YEiF+iiKrA})$gQACQM-$<9o za>+SC%OBaqH&B&yb7$@09>#Q?s#eUy8Y7)mA zJS%dC>X(U8u4iddMU7f(e^qgvOuBcWBR(gyt{%UaP(}E;NGSUeefoBqLG4)J(}>$K zku`dY4ItL>n}%g!@9?{Z^}#;jzZ;f;9pF#J+xeof9Dc;GBy1Fa)35~W7Jk*R80;zj zrC|}+EBuyWao9HgvthdS3x3})UHc86KGLo)eUV`VOTyOi&kak!Uf^FF7K3fz-x?NyZQ{2Ki^I0@JBI1n_xKNn>DpcV zo?-g(zv2%JOA+@2f1DqaY1dMS6#jx?LfkMuPe=NeN8=~x1y)bRrUF7>OGgbm# z;V;k@9yQieTrW|jp7tzJYj2euUU&C%=^ou?eFfcT_2&LH`+stWy&+|tw^I&bVRs#N tvwjzUnpXCfYoEj3h|la}R39GI`CX06#P2)w+Q)Ri*RUv?W!`c)I(@e1>*)f6Y6JZN(ZBf zJ{9VB=&+1Fpwl7WMHf`loTgRhcUDw=C+;!GP*+9w=zf71$K6>PbWx?(Dp4b3$+NDJdzd+bw&%P}7S~UqEk{=6u!5^E zvP7SiN6NNd4*E1R#vEh1F@Si%OWI(z*dSsPzhzhk_5;6XSijrQBb{Zo_NEaz{B^_P zup)lmuoP?&ziwC(_8i|dECG9i|7=(c_65IfSPyImA3w6+i`$#PXAN_E&)}~ZHgJ{i z0bep~5LU*|8Qe3jf-$IIM}^Ff0Yz#D6p_3HyZqYFGmH4gcM+ z7;Fo_ZCDR%2fu5W+xrv$%P_Zh51-^C8bCa z^HX|>lhII8`BHLh!a@6c-> P)A?SbqHLC#;2-=4s_WKo