mirror of
https://github.com/keymanapp/keyman.git
synced 2026-09-24 08:37:42 +00:00
fix(web): first-pass workaround for popup-key corrections
This commit is contained in:
parent
59f313ece4
commit
6298bb27f6
1 changed files with 66 additions and 1 deletions
|
|
@ -1050,9 +1050,74 @@ namespace com.keyman.osk {
|
|||
return null;
|
||||
}
|
||||
|
||||
// Note: if subkeys are active, they will still be displayed at this time.
|
||||
// TODO: In such cases, we should build an ActiveLayout (of sorts) for subkey displays,
|
||||
// update their geometries to the actual display values, and use the results here.
|
||||
let touchKbdPos = this.getTouchCoordinatesOnKeyboard(touch);
|
||||
let layerGroup = this.kbdDiv.firstChild as HTMLDivElement; // Always has proper dimensions, unlike kbdDiv itself.
|
||||
return this.layout.getLayer(this.layerId).getTouchProbabilities(touchKbdPos, layerGroup.offsetWidth / layerGroup.offsetHeight);
|
||||
let baseKeyProbabilities = this.layout.getLayer(this.layerId).getTouchProbabilities(touchKbdPos, layerGroup.offsetWidth / layerGroup.offsetHeight);
|
||||
|
||||
if(!this.popupBaseKey || !this.popupBaseKey.key) {
|
||||
return baseKeyProbabilities;
|
||||
} else {
|
||||
// A temp-hack, as this was noted just before 14.0's release.
|
||||
// Since a more... comprehensive solution would be way too complex this late in the game,
|
||||
// this provides a half-decent stopgap measure.
|
||||
//
|
||||
// Will not correct to nearby subkeys; only includes the selected subkey and its base keys.
|
||||
// Still, better than ignoring them both for whatever base key is beneath the final cursor location.
|
||||
let baseMass = 1.0;
|
||||
|
||||
let baseKeyMass = 1.0;
|
||||
let baseKeyID = this.popupBaseKey.key.spec.coreID;
|
||||
|
||||
let popupKeyMass = 0.0;
|
||||
let popupKeyID: string = null;
|
||||
|
||||
// Note: when embedded on Android (as of 14.0, at least), we don't get access to this.
|
||||
// Just the base key.
|
||||
if(this.keyPending && this.keyPending.key) {
|
||||
popupKeyMass = 3.0;
|
||||
popupKeyID = this.keyPending.key.spec.coreID;
|
||||
}
|
||||
|
||||
// If the base key appears in the subkey array and was selected, merge the probability masses.
|
||||
if(popupKeyID == baseKeyID) {
|
||||
baseKeyMass += popupKeyMass;
|
||||
popupKeyMass = 0;
|
||||
}
|
||||
|
||||
// Compute the normalization factor
|
||||
let totalMass = baseMass + baseKeyMass + popupKeyMass;
|
||||
let scalar = 1.0 / totalMass;
|
||||
|
||||
// Prevent duplicate entries in the final map & normalize the remaining entries!
|
||||
for(let i=0; i < baseKeyProbabilities.length; i++) {
|
||||
let entry = baseKeyProbabilities[i];
|
||||
if(entry.keyId == baseKeyID) {
|
||||
baseKeyMass += entry.p * scalar;
|
||||
baseKeyProbabilities.splice(i, 1);
|
||||
i--;
|
||||
} else if(entry.keyId == popupKeyID) {
|
||||
popupKeyMass =+ entry.p * scalar;
|
||||
baseKeyProbabilities.splice(i, 1);
|
||||
i--;
|
||||
} else {
|
||||
entry.p *= scalar;
|
||||
}
|
||||
}
|
||||
|
||||
let finalArray: {keyId: string, p: number}[] = [];
|
||||
|
||||
if(popupKeyMass > 0) {
|
||||
finalArray.push({keyId: popupKeyID, p: popupKeyMass * scalar});
|
||||
}
|
||||
|
||||
finalArray.push({keyId: baseKeyID, p: baseKeyMass * scalar});
|
||||
|
||||
finalArray = finalArray.concat(baseKeyProbabilities);
|
||||
return finalArray;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue