Behold! Actual chiral output! Supported both by physical keystrokes and osk interaction.

Yet to do:  state keys, embedded integration.
This commit is contained in:
Joshua Horton 2017-09-06 15:02:02 +07:00
parent 4633ebbf34
commit 7a57fa884c
4 changed files with 104 additions and 153 deletions

View file

@ -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;
};
}

View file

@ -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;

View file

@ -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)

View file

@ -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 = {