diff --git a/web/samples/chirality/chirality.js b/web/samples/chirality/chirality.js index f2bb3ac656..5d3cdd2ced 100644 --- a/web/samples/chirality/chirality.js +++ b/web/samples/chirality/chirality.js @@ -1,152 +1,65 @@ KeymanWeb.KR(new Keyboard_chirality()); function Keyboard_chirality() { - this.KI = "Keyboard_chirality"; - this.KN = "Development Chirality Test Keyboard"; - this.KV = { - KMBM: 0x001F, - F: ' 1em "Arial"', - K102: 0, - KLS: { 'default': new Array("`", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-", "=", "", "", "", "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "[", "]", "\\", "", "", "", "a", "s", "d", "f", "g", "h", "j", "k", "l", ";", "'", "", "", "", "", "", "", "z", "x", "c", "v", "b", "n", "m", ",", ".", "/", "", "", "", "", "", ""), - 'shift': new Array("~", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "_", "+", "", "", "", "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "{", "}", "|", "", "", "", "A", "S", "D", "F", "G", "H", "J", "K", "L", ":", "\"", "", "", "", "", "", "", "Z", "X", "C", "V", "B", "N", "M", "<", ">", "?", "", "", "", "", "", ""), - 'leftctrl': new Array("", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "ʍ", "ə", "ɹ", "ð", "ʏ", "ʉ", "ɨ", "ɵ", "ʘ", "", "", "", "", "", "", "ɑ", "ʃ", "", "ɸ", "ɣ", "ɥ", "ɟ", "", "ɬ", "ː", "", "", "", "", "", "", "", "ʒ", "χ", "ç", "ʋ", "β", "ɲ", "", "", "", "", "", "", "", "", "", ""), - 'leftctrl-shift': new Array("", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "ʡ", "", "ɘ", "ʀ", "θ", "", "ɯ", "ɪ", "", "", "", "", "", "", "", "", "ɒ", "ᶘ", "", "", "ɢ", "ʜ", "", "", "ʟ", "ː", "", "", "", "", "", "", "", "ᶚ", "", "", "", "ʙ", "ɴ", "", "", "", "ʔ", "", "", "", "", "", ""), - 'leftalt': new Array("", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "ɛ", "ɽ", "ʈ", "ɥ", "ʊ", "", "ɔ", "", "", "", "", "", "", "", "æ", "", "ɖ", "", "ɡ", "ɦ", "ʝ", "", "ɭ", "", "", "", "", "", "", "", "", "ʐ", "", "ɕ", "", "", "ɳ", "", "", "", "", "", "", "", "", "", ""), - 'rightalt': new Array("", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "ʠ", "ɰ", "ɜ", "ɾ", "ƭ", "", "ʌ", "", "ø", "ƥ", "", "", "", "", "", "", "ɐ", "σ", "ɗ", "", "ɠ", "ħ", "ʄ", "ƙ", "ɮ", "", "", "", "", "", "", "", "", "ʑ", "", "ƈ", "", "ɓ", "ŋ", "ɱ", "", "", "", "", "", "", "", "", ""), - 'leftalt-shift': new Array("", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "ʢ", "", "œ", "ɻ", "", "", "", "ᵻ", "ɞ", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "ʎ", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""), - 'rightalt-shift': new Array("", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "ɶ", "ʁ", "", "", "ᵾ", "ᵼ", "ɤ", "", "", "", "", "", "", "", "ᴂ", "", "", "", "ʛ", "ɧ", "", "", "ɺ", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "") + this.KI = "Keyboard_chirality"; + this.KN = "Development Chirality Test Keyboard"; + this.KV = { + KMBM: 0x001F, + F: ' 1em "Arial"', + K102: 0, + KLS: { 'default': new Array("`", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-", "=", "", "", "", "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "[", "]", "\\", "", "", "", "a", "s", "d", "f", "g", "h", "j", "k", "l", ";", "'", "", "", "", "", "", "", "z", "x", "c", "v", "b", "n", "m", ",", ".", "/", "", "", "", "", "", ""), + 'shift': new Array("~", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "_", "+", "", "", "", "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "{", "}", "|", "", "", "", "A", "S", "D", "F", "G", "H", "J", "K", "L", ":", "\"", "", "", "", "", "", "", "Z", "X", "C", "V", "B", "N", "M", "<", ">", "?", "", "", "", "", "", ""), + 'leftctrl': new Array("", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "ʍ", "ə", "ɹ", "ð", "ʏ", "ʉ", "ɨ", "ɵ", "ʘ", "", "", "", "", "", "", "ɑ", "ʃ", "", "ɸ", "ɣ", "ɥ", "ɟ", "", "ɬ", "ː", "", "", "", "", "", "", "", "ʒ", "χ", "ç", "ʋ", "β", "ɲ", "", "", "", "", "", "", "", "", "", ""), + 'leftctrl-shift': new Array("", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "ʡ", "", "ɘ", "ʀ", "θ", "", "ɯ", "ɪ", "", "", "", "", "", "", "", "", "ɒ", "ᶘ", "", "", "ɢ", "ʜ", "", "", "ʟ", "ː", "", "", "", "", "", "", "", "ᶚ", "", "", "", "ʙ", "ɴ", "", "", "", "ʔ", "", "", "", "", "", ""), + 'leftalt': new Array("", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "ɛ", "ɽ", "ʈ", "ɥ", "ʊ", "", "ɔ", "", "", "", "", "", "", "", "æ", "", "ɖ", "", "ɡ", "ɦ", "ʝ", "", "ɭ", "", "", "", "", "", "", "", "", "ʐ", "", "ɕ", "", "", "ɳ", "", "", "", "", "", "", "", "", "", ""), + 'rightalt': new Array("", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "ʠ", "ɰ", "ɜ", "ɾ", "ƭ", "", "ʌ", "", "ø", "ƥ", "", "", "", "", "", "", "ɐ", "σ", "ɗ", "", "ɠ", "ħ", "ʄ", "ƙ", "ɮ", "", "", "", "", "", "", "", "", "ʑ", "", "ƈ", "", "ɓ", "ŋ", "ɱ", "", "", "", "", "", "", "", "", ""), + 'leftalt-shift': new Array("", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "ʢ", "", "œ", "ɻ", "", "", "", "ᵻ", "ɞ", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "ʎ", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""), + 'rightalt-shift': new Array("", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "ɶ", "ʁ", "", "", "ᵾ", "ᵼ", "ɤ", "", "", "", "", "", "", "", "ᴂ", "", "", "", "ʛ", "ɧ", "", "", "ɺ", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "") + } + }; + this.KH = ''; + this.KM = 0; + + this.dfltCodes = ["K_BKQUOTE","K_1","K_2","K_3","K_4","K_5","K_6","K_7","K_8","K_9","K_0", + "K_HYPHEN","K_EQUAL","K_*","K_*","K_*","K_Q","K_W","K_E","K_R","K_T", + "K_Y","K_U","K_I","K_O","K_P","K_LBRKT","K_RBRKT","K_BKSLASH","K_*", + "K_*","K_*","K_A","K_S","K_D","K_F","K_G","K_H","K_J","K_K","K_L", + "K_COLON","K_QUOTE","K_*","K_*","K_*","K_*","K_*","K_oE2", + "K_Z","K_X","K_C","K_V","K_B","K_N","K_M","K_COMMA","K_PERIOD", + "K_SLASH","K_*","K_*","K_*","K_*","K_*","K_SPACE"]; + + this.gs = function (t, e) { + return this.g0(t, e); + }; + this.g0 = function (t, e) { + var k = KeymanWeb, r = 0, m = 0; + + // Handwritten time! + var kls = this.KV.KLS; + + var layers = ['leftctrl', 'default', 'shift', 'leftctrl', 'leftctrl-shift', 'leftalt', 'rightalt', 'leftalt-shift', 'rightalt-shift']; + + // Maps keystrokes by base key-codes and array into the key symbols displayed in KLS. + for(var i = 0; i < layers.length; i++) { + // Obtain the modifier code to match for the selected layer. + var modCode = k.osk.modifierCodes['VIRTUAL_KEY'] | k.osk.getModifierState(layers[i]); + var layer = layers[i]; + + for(var key=0; key < kls[layer].length; key++) { + var keySymbol = this.dfltCodes[key]; + + if(keySymbol == "K_*") { + continue; + } else if(kls[layer][key] != '') { + if (k.KKM(e, modCode, k.osk.keyCodes[keySymbol])) { + r = m = 1; + k.KO(0, t, kls[layer][key]); + return r; + } } - }; - this.KH = ''; - this.KM = 0; - this.gs = function (t, e) { - return 0; //this.g0(t, e); - }; - this.g0 = function (t, e) { - // var k = KeymanWeb, r = 0, m = 0; - // if (k.KKM(e, 16480, 48)) { - // r = m = 1; - // k.KO(0, t, "໘"); - // } else if (k.KKM(e, 16480, 49)) { - // r = m = 1; - // k.KO(0, t, "໑"); - // } else if (k.KKM(e, 16480, 50)) { - // r = m = 1; - // k.KO(0, t, "໒"); - // } else if (k.KKM(e, 16480, 51)) { - // r = m = 1; - // k.KO(0, t, "໓"); - // } else if (k.KKM(e, 16480, 52)) { - // r = m = 1; - // k.KO(0, t, "໔"); - // } else if (k.KKM(e, 16480, 55)) { - // r = m = 1; - // k.KO(0, t, "໕"); - // } else if (k.KKM(e, 16480, 56)) { - // r = m = 1; - // k.KO(0, t, "໖"); - // } else if (k.KKM(e, 16480, 57)) { - // r = m = 1; - // k.KO(0, t, "໗"); - // } else if (k.KKM(e, 16480, 87)) { - // r = m = 1; - // k.KO(0, t, "໐"); - // } else if (k.KKM(e, 16384, 96)) { - // r = m = 1; - // k.KO(0, t, "0"); - // } else if (k.KKM(e, 16384, 97)) { - // r = m = 1; - // k.KO(0, t, "1"); - // } else if (k.KKM(e, 16384, 98)) { - // r = m = 1; - // k.KO(0, t, "2"); - // } else if (k.KKM(e, 16384, 99)) { - // r = m = 1; - // k.KO(0, t, "3"); - // } else if (k.KKM(e, 16384, 100)) { - // r = m = 1; - // k.KO(0, t, "4"); - // } else if (k.KKM(e, 16384, 101)) { - // r = m = 1; - // k.KO(0, t, "5"); - // } else if (k.KKM(e, 16384, 102)) { - // r = m = 1; - // k.KO(0, t, "6"); - // } else if (k.KKM(e, 16384, 103)) { - // r = m = 1; - // k.KO(0, t, "7"); - // } else if (k.KKM(e, 16384, 104)) { - // r = m = 1; - // k.KO(0, t, "8"); - // } else if (k.KKM(e, 16384, 105)) { - // r = m = 1; - // k.KO(0, t, "9"); - // } else if (k.KKM(e, 16384, 106)) { - // r = m = 1; - // k.KO(0, t, "*"); - // } else if (k.KKM(e, 16384, 107)) { - // r = m = 1; - // k.KO(0, t, "+"); - // } else if (k.KKM(e, 16384, 109)) { - // r = m = 1; - // k.KO(0, t, "-"); - // } else if (k.KKM(e, 16384, 110)) { - // r = m = 1; - // k.KO(0, t, "."); - // } else if (k.KKM(e, 16384, 111)) { - // r = m = 1; - // k.KO(0, t, "/"); - // } else if (k.KKM(e, 16480, 187)) { - // r = m = 1; - // k.KO(0, t, "€"); - // } else if (k.KKM(e, 16480, 189)) { - // r = m = 1; - // k.KO(0, t, "໙"); - // } else if (k.KKM(e, 16480, 192)) { - // r = m = 1; - // k.KO(0, t, "₭"); - // } else if (k.KKM(e, 16480, 219)) { - // r = m = 1; - // k.KO(0, t, "["); - // } else if (k.KKM(e, 16480, 221)) { - // r = m = 1; - // k.KO(0, t, "]"); - // } - // if (!m && k.KIK(e)) { - // r = this.g1(t, e); - // } - // return r; - }; - // this.g1 = function (t, e) { - // var k = KeymanWeb, r = 0, m = 0; - // if (k.KKM(e, 16400, 49)) { - // r = m = 1; - // k.KO(0, t, "1"); - // } else if (k.KKM(e, 16400, 222)) { - // r = m = 1; - // k.KO(0, t, "="); - // } else if (k.KKM(e, 16400, 51)) { - // r = m = 1; - // k.KO(0, t, "3"); - // } else if (k.KKM(e, 16400, 52)) { - // r = m = 1; - // k.KO(0, t, "4"); - // } else if (k.KKM(e, 16400, 53) && k.KCM(1, t, "ຳ", 1)) { - // r = m = 1; - // k.KO(1, t, "໌"); - // } else if (k.KKM(e, 16400, 53) && k.KA(0, k.KC(1, 1, t), this.s22)) { - // r = m = 1; - // k.KB(t); - // } else if (k.KKM(e, 16400, 53) && k.KA(0, k.KC(1, 1, t), this.s18)) { - // r = m = 1; - // k.KB(t); - // } else if (k.KKM(e, 16400, 53) && k.KA(0, k.KC(1, 1, t), this.s20)) { - // r = m = 1; - // k.KB(t); - // } else if (k.KKM(e, 16400, 53) && k.KA(0, k.KC(1, 1, t), this.s24)) { - // r = m = 1; - // k.KB(t); - // } - // return r; - // }; + } + } + + return r; + }; } \ No newline at end of file diff --git a/web/source/keymanweb.js b/web/source/keymanweb.js index 504a797c26..6e18f3fdcb 100644 --- a/web/source/keymanweb.js +++ b/web/source/keymanweb.js @@ -2775,9 +2775,37 @@ if(!window['tavultesoft']['keymanweb']['initialized']) { var osk = keymanweb["osk"]; if(keymanweb.isChiral()) { - s.Lmodifiers = (e.shiftKey ? 0x10 : 0); - s.Lmodifiers = s.Lmodifiers | (e.ctrlKey ? (e.location == 1 ? osk.modifierCodes['LCTRL'] : osk.modifierCodes['RCTRL']) : 0); - s.Lmodifiers = s.Lmodifiers | (e.altKey ? (e.location == 1 ? osk.modifierCodes['LALT'] : osk.modifierCodes['RALT']) : 0); + s.Lmodifiers = (e.shiftKey ? 0x10 : 0); + + var ctrlEvent = false, altEvent = false; + + switch(s.Lcode) { + case osk.keyCodes["K_CONTROL"]: + case osk.keyCodes["K_CTRL"]: + case osk.keyCodes["K_LCONTROL"]: + case osk.keyCodes["K_LCTRL"]: + case osk.keyCodes["K_RCONTROL"]: + case osk.keyCodes["K_RCTRL"]: + ctrlEvent = true; + break; + case osk.keyCodes["K_ALT"]: + case osk.keyCodes["K_LALT"]: + case osk.keyCodes["K_LMENU"]: + case osk.keyCodes["K_RALT"]: + case osk.keyCodes["K_RMENU"]: + altEvent = true; + break; + } + + // TODO: Ensure the keypress is also the CTRL or the ALT for the e.location != 0 check. + if(e.ctrlKey) { + s.Lmodifiers = s.Lmodifiers | ((e.location != 0 && ctrlEvent) ? + (e.location == 1 ? osk.modifierCodes['LCTRL'] : osk.modifierCodes['RCTRL']) : osk.getModifierState(osk.layerId) & 0x0003); + } + if(e.altKey) { + s.Lmodifiers = s.Lmodifiers | ((e.location != 0 && altEvent) ? + (e.location == 1 ? osk.modifierCodes['LALT'] : osk.modifierCodes['RALT']) : osk.getModifierState(osk.layerId) & 0x000C); + } } else { s.Lmodifiers = (e.shiftKey ? 0x10 : 0) | @@ -2787,7 +2815,8 @@ if(!window['tavultesoft']['keymanweb']['initialized']) { //s.LisVirtualKey = (e.charCode != null && (e.charCode == 0 || (s.Lmodifiers & 0x60) != 0)) || e.type != 'keypress'; //s.LisVirtualKeyCode = false; - s.LisVirtualKeyCode = (typeof e.charCode != 'undefined' && e.charCode != null && (e.charCode == 0 || (s.Lmodifiers & 0x60) != 0)); + // The 0x6F used to be 0x60 - this adjustment now includes the chiral alt and ctrl modifiers in that check. + s.LisVirtualKeyCode = (typeof e.charCode != 'undefined' && e.charCode != null && (e.charCode == 0 || (s.Lmodifiers & 0x6F) != 0)); s.LisVirtualKey = s.LisVirtualKeyCode || e.type != 'keypress'; return s; diff --git a/web/source/kmwcallback.js b/web/source/kmwcallback.js index 212292cb98..56706d4b02 100644 --- a/web/source/kmwcallback.js +++ b/web/source/kmwcallback.js @@ -290,13 +290,21 @@ if(!window['tavultesoft']['keymanweb']['initialized']) { var retVal = 0; // I3318 var keyCode = (e.Lcode == 173 ? 189 : e.Lcode); //I3555 (Firefox hyphen issue) + var bitmask; + if(keymanweb._ActiveKeyboard['KV']) { + bitmask = keymanweb._ActiveKeyboard['KV']['KMBM']; + if(typeof bitmask == 'undefined' || !bitmask) { + bitmask = osk.modifierBitmasks["NON_CHIRAL"]; + } + } + if(e.vkCode > 255) keyCode = e.vkCode; // added to support extended (touch-hold) keys for mnemonic layouts if(e.LisVirtualKey || keyCode > 255) { if((Lruleshift & 0x4000) == 0x4000 || (keyCode > 255)) // added keyCode test to support extended keys { - retVal = ((Lrulekey == keyCode) && ((Lruleshift&0x7F) == e.Lmodifiers)); //I3318, I3555 + retVal = ((Lrulekey == keyCode) && ((Lruleshift & bitmask) == e.Lmodifiers)); //I3318, I3555 } } else if((Lruleshift & 0x4000) == 0) diff --git a/web/source/kmwosk.js b/web/source/kmwosk.js index 6df0883e91..a67cf1899a 100644 --- a/web/source/kmwosk.js +++ b/web/source/kmwosk.js @@ -33,7 +33,8 @@ if(!window['tavultesoft']['keymanweb']['initialized']) { "NUM_LOCK":0x0400, "NO_NUM_LOCK":0x0800, "SCROLL_LOCK":0x1000, - "NO_SCROLL_LOCK":0x2000 + "NO_SCROLL_LOCK":0x2000, + "VIRTUAL_KEY":0x4000 }; osk.modifierBitmasks = {