diff --git a/HISTORY.md b/HISTORY.md index a53152b45b..2bfb038014 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,9 @@ # Keyman Version History +## 15.0.261 stable 2022-06-18 + +* fix(web): crash on custom modifier keys (#6789) + ## 15.0.260 stable 2022-06-15 * chore: Release version 15.0 diff --git a/VERSION.md b/VERSION.md index 94fd4c233a..499859cd0a 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1 +1 @@ -15.0.261 \ No newline at end of file +15.0.262 \ No newline at end of file diff --git a/common/core/web/input-processor/package-lock.json b/common/core/web/input-processor/package-lock.json index c81e70eab9..8243dee798 100644 --- a/common/core/web/input-processor/package-lock.json +++ b/common/core/web/input-processor/package-lock.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/input-processor", - "version": "15.0.261", + "version": "15.0.262", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/common/core/web/input-processor/package.json b/common/core/web/input-processor/package.json index cb7fd2084c..c17d4fd18c 100644 --- a/common/core/web/input-processor/package.json +++ b/common/core/web/input-processor/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/input-processor", - "version": "15.0.261", + "version": "15.0.262", "description": "The core text and prediction processing engine for KeymanWeb", "repository": { "type": "git", @@ -18,8 +18,8 @@ }, "homepage": "https://github.com/keymanapp/keyman#readme", "devDependencies": { - "@keymanapp/lexical-model-compiler": "^15.0.261", - "@keymanapp/resources-gosh": "^15.0.261", + "@keymanapp/lexical-model-compiler": "^15.0.262", + "@keymanapp/resources-gosh": "^15.0.262", "@types/node": "^11.9.4", "chai": "^4.3.4", "mocha": "^8.4.0", @@ -34,11 +34,11 @@ "mocha": "mocha" }, "dependencies": { - "@keymanapp/keyboard-processor": "^15.0.261", - "@keymanapp/lexical-model-layer": "^15.0.261", - "@keymanapp/models-types": "^15.0.261", - "@keymanapp/web-environment": "^15.0.261", - "@keymanapp/web-utils": "^15.0.261", + "@keymanapp/keyboard-processor": "^15.0.262", + "@keymanapp/lexical-model-layer": "^15.0.262", + "@keymanapp/models-types": "^15.0.262", + "@keymanapp/web-environment": "^15.0.262", + "@keymanapp/web-utils": "^15.0.262", "eventemitter3": "^4.0.0" } } diff --git a/common/core/web/input-processor/src/text/inputProcessor.ts b/common/core/web/input-processor/src/text/inputProcessor.ts index 6fabe3f0dc..63dd1bc47b 100644 --- a/common/core/web/input-processor/src/text/inputProcessor.ts +++ b/common/core/web/input-processor/src/text/inputProcessor.ts @@ -141,27 +141,29 @@ namespace com.keyman.text { // If it's a key that we 'optimize out' of our fat-finger correction algorithm, // we MUST NOT trigger it for this keystroke. - let isOnlyLayerShift = text.Codes.isKnownOSKModifierKey(keyEvent.kName); + let isOnlyLayerSwitchKey = text.Codes.isKnownOSKModifierKey(keyEvent.kName); // Best-guess stopgap for possible custom modifier keys. // If a key (1) does not affect the context and (2) shifts the active layer, // we assume it's a modifier key. (Touch keyboards may define custom modifier keys.) // - // Note: this could cause an issue in the niche scenario where: + // Note: this will mean we won't generate alternates in the niche scenario where: // 1. Keypress does not alter the actual context // 2. It DOES emit a deadkey with an earlier processing rule. // 3. The FINAL processing rule does not match. // 4. The key ALSO signals a layer shift. // If any of the four above conditions aren't met - no problem! // So it's a pretty niche scenario. - if((ruleBehavior.transcription?.transform as TextTransform).isNoOp() && keyEvent.kNextLayer) { - isOnlyLayerShift = true; + if((ruleBehavior?.transcription?.transform as TextTransform)?.isNoOp() && keyEvent.kNextLayer) { + isOnlyLayerSwitchKey = true; } const keepRuleBehavior = ruleBehavior != null; // Should we swallow any further processing of keystroke events for this keydown-keypress sequence? - if(keepRuleBehavior && !isOnlyLayerShift) { - let alternates = this.buildAlternates(ruleBehavior, keyEvent, preInputMock); + if(keepRuleBehavior) { + // alternates are our fat-finger alternate outputs. We don't build these for keys we detect as + // layer switch keys + let alternates = isOnlyLayerSwitchKey ? null : this.buildAlternates(ruleBehavior, keyEvent, preInputMock); // Now that we've done all the keystroke processing needed, ensure any extra effects triggered // by the actual keystroke occur. @@ -173,7 +175,7 @@ namespace com.keyman.text { if(alternates && alternates.length > 0) { ruleBehavior.transcription.alternates = alternates; } - } else if(ruleBehavior == null) { + } else { // We need a dummy RuleBehavior for keys which have no output (e.g. Shift) ruleBehavior = new RuleBehavior(); ruleBehavior.transcription = outputTarget.buildTranscriptionFrom(outputTarget, null, false); diff --git a/common/core/web/keyboard-processor/package-lock.json b/common/core/web/keyboard-processor/package-lock.json index c1db3380e9..0891a24fd0 100644 --- a/common/core/web/keyboard-processor/package-lock.json +++ b/common/core/web/keyboard-processor/package-lock.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/keyboard-processor", - "version": "15.0.261", + "version": "15.0.262", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/common/core/web/keyboard-processor/package.json b/common/core/web/keyboard-processor/package.json index f92a941089..62396b3cbb 100644 --- a/common/core/web/keyboard-processor/package.json +++ b/common/core/web/keyboard-processor/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/keyboard-processor", - "version": "15.0.261", + "version": "15.0.262", "description": "Core module for Keyman keyboard support in KeymanWeb.", "repository": { "type": "git", @@ -18,7 +18,7 @@ }, "homepage": "https://github.com/keymanapp/keyman#readme", "devDependencies": { - "@keymanapp/resources-gosh": "^15.0.261", + "@keymanapp/resources-gosh": "^15.0.262", "chai": "^4.3.4", "mocha": "^8.4.0", "mocha-teamcity-reporter": "^4.0.0", @@ -32,9 +32,9 @@ "mocha": "mocha" }, "dependencies": { - "@keymanapp/models-types": "^15.0.261", - "@keymanapp/web-environment": "^15.0.261", - "@keymanapp/web-utils": "^15.0.261", + "@keymanapp/models-types": "^15.0.262", + "@keymanapp/web-environment": "^15.0.262", + "@keymanapp/web-utils": "^15.0.262", "@types/node": "^11.9.4" } } diff --git a/common/core/web/tools/recorder/package-lock.json b/common/core/web/tools/recorder/package-lock.json index 49f685a0f3..108fdeea36 100644 --- a/common/core/web/tools/recorder/package-lock.json +++ b/common/core/web/tools/recorder/package-lock.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/recorder-core", - "version": "15.0.261", + "version": "15.0.262", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/common/core/web/tools/recorder/package.json b/common/core/web/tools/recorder/package.json index f078dbb02b..90cbd323c7 100644 --- a/common/core/web/tools/recorder/package.json +++ b/common/core/web/tools/recorder/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/recorder-core", - "version": "15.0.261", + "version": "15.0.262", "description": "Core classes used to develop KeymanWeb test cases based on keystrokes", "main": "index.js", "scripts": { @@ -17,10 +17,10 @@ }, "homepage": "https://github.com/keymanapp/keyman#readme", "dependencies": { - "@keymanapp/keyboard-processor": "^15.0.261", - "@keymanapp/models-types": "^15.0.261", - "@keymanapp/web-environment": "^15.0.261", - "@keymanapp/web-utils": "^15.0.261", + "@keymanapp/keyboard-processor": "^15.0.262", + "@keymanapp/models-types": "^15.0.262", + "@keymanapp/web-environment": "^15.0.262", + "@keymanapp/web-utils": "^15.0.262", "@types/node": "^11.9.4" }, "devDependencies": { diff --git a/common/core/web/tools/sentry-manager/package-lock.json b/common/core/web/tools/sentry-manager/package-lock.json index a9e0c24544..79caba899b 100644 --- a/common/core/web/tools/sentry-manager/package-lock.json +++ b/common/core/web/tools/sentry-manager/package-lock.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/web-sentry-manager", - "version": "15.0.261", + "version": "15.0.262", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/common/core/web/tools/sentry-manager/package.json b/common/core/web/tools/sentry-manager/package.json index 363f204eb3..d2bcfa8f22 100644 --- a/common/core/web/tools/sentry-manager/package.json +++ b/common/core/web/tools/sentry-manager/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/web-sentry-manager", - "version": "15.0.261", + "version": "15.0.262", "description": "Common setup for KeymanWeb's Sentry-based error reporting", "main": "dist/index.js", "scripts": { @@ -20,7 +20,7 @@ "typescript": "^3.8.3" }, "dependencies": { - "@keymanapp/web-environment": "^15.0.261", + "@keymanapp/web-environment": "^15.0.262", "@sentry/browser": "^5.27.4" } } diff --git a/common/core/web/utils/package-lock.json b/common/core/web/utils/package-lock.json index 11c37b9afd..c1ba45213f 100644 --- a/common/core/web/utils/package-lock.json +++ b/common/core/web/utils/package-lock.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/web-utils", - "version": "15.0.261", + "version": "15.0.262", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/common/core/web/utils/package.json b/common/core/web/utils/package.json index a0860f341e..5ace271b65 100644 --- a/common/core/web/utils/package.json +++ b/common/core/web/utils/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/web-utils", - "version": "15.0.261", + "version": "15.0.262", "description": "Common utility functions used throughout other Keyman packages", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -20,8 +20,8 @@ }, "homepage": "https://github.com/keymanapp/keyman#readme", "devDependencies": { - "@keymanapp/resources-gosh": "^15.0.261", - "@keymanapp/web-environment": "^15.0.261", + "@keymanapp/resources-gosh": "^15.0.262", + "@keymanapp/web-environment": "^15.0.262", "@types/node": "^14.0.5", "typescript": "^3.8.3" } diff --git a/common/models/templates/package-lock.json b/common/models/templates/package-lock.json index ec3494e27c..920c38e47b 100644 --- a/common/models/templates/package-lock.json +++ b/common/models/templates/package-lock.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/models-templates", - "version": "15.0.261", + "version": "15.0.262", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/common/models/templates/package.json b/common/models/templates/package.json index ba2ccc6ba7..3760e9a56a 100644 --- a/common/models/templates/package.json +++ b/common/models/templates/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/models-templates", - "version": "15.0.261", + "version": "15.0.262", "description": "Backing model implementations (templates) for Keyman's modelling layer", "keywords": [ "lm", @@ -42,8 +42,8 @@ "url": "https://github.com/keymanapp/keyman/issues" }, "devDependencies": { - "@keymanapp/models-types": "^15.0.261", - "@keymanapp/web-utils": "^15.0.261", + "@keymanapp/models-types": "^15.0.262", + "@keymanapp/web-utils": "^15.0.262", "@types/chai": "^4.2.11", "@types/mocha": "^7.0.2", "@types/node": "^14.0.4", @@ -52,6 +52,6 @@ "typescript": "^3.8.3" }, "dependencies": { - "@keymanapp/models-wordbreakers": "^15.0.261" + "@keymanapp/models-wordbreakers": "^15.0.262" } } diff --git a/common/models/types/package-lock.json b/common/models/types/package-lock.json index a38d247d4d..a68ab60aa9 100644 --- a/common/models/types/package-lock.json +++ b/common/models/types/package-lock.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/models-types", - "version": "15.0.261", + "version": "15.0.262", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/common/models/types/package.json b/common/models/types/package.json index 4d9680837c..7387326fab 100644 --- a/common/models/types/package.json +++ b/common/models/types/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/models-types", - "version": "15.0.261", + "version": "15.0.262", "description": "Type definitions in used in the modeling (lexical model/predictive text) component of Keyman.", "types": "./index.d.ts", "scripts": { diff --git a/common/models/wordbreakers/package-lock.json b/common/models/wordbreakers/package-lock.json index 75e3529c81..df9e9fb899 100644 --- a/common/models/wordbreakers/package-lock.json +++ b/common/models/wordbreakers/package-lock.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/models-wordbreakers", - "version": "15.0.261", + "version": "15.0.262", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/common/models/wordbreakers/package.json b/common/models/wordbreakers/package.json index b0d3a75638..68030eb151 100644 --- a/common/models/wordbreakers/package.json +++ b/common/models/wordbreakers/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/models-wordbreakers", - "version": "15.0.261", + "version": "15.0.262", "description": "Word breakers bundled in the modeling layer", "keywords": [ "lexical model", @@ -40,7 +40,7 @@ "url": "https://github.com/keymanapp/keyman/issues" }, "devDependencies": { - "@keymanapp/models-types": "^15.0.261", + "@keymanapp/models-types": "^15.0.262", "@types/chai": "^4.2.11", "@types/mocha": "^7.0.2", "chai": "^4.3.4", diff --git a/common/predictive-text/package-lock.json b/common/predictive-text/package-lock.json index 541aa5d31e..7cf8f6e83a 100644 --- a/common/predictive-text/package-lock.json +++ b/common/predictive-text/package-lock.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/lexical-model-layer", - "version": "15.0.261", + "version": "15.0.262", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/common/predictive-text/package.json b/common/predictive-text/package.json index 527560bd51..d1cbe0ed34 100644 --- a/common/predictive-text/package.json +++ b/common/predictive-text/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/lexical-model-layer", - "version": "15.0.261", + "version": "15.0.262", "description": "Keyman/Predictive Text integration layer", "main": "build/index.js", "scripts": { @@ -21,8 +21,8 @@ }, "homepage": "https://github.com/keymanapp/keyman#readme", "devDependencies": { - "@keymanapp/models-types": "^15.0.261", - "@keymanapp/resources-gosh": "^15.0.261", + "@keymanapp/models-types": "^15.0.262", + "@keymanapp/resources-gosh": "^15.0.262", "@types/node": "^10.17.21", "chai": "^4.3.4", "karma": "^6.3.4", @@ -46,10 +46,10 @@ "typescript": "^3.8.3" }, "dependencies": { - "@keymanapp/models-templates": "^15.0.261", - "@keymanapp/models-wordbreakers": "^15.0.261", - "@keymanapp/web-environment": "^15.0.261", - "@keymanapp/web-utils": "^15.0.261", + "@keymanapp/models-templates": "^15.0.262", + "@keymanapp/models-wordbreakers": "^15.0.262", + "@keymanapp/web-environment": "^15.0.262", + "@keymanapp/web-utils": "^15.0.262", "es6-shim": "^0.35.5", "string.prototype.codepointat": "^0.2.1", "string.prototype.startswith": "^0.2.0" diff --git a/developer/js/package-lock.json b/developer/js/package-lock.json index 29bd77bd57..590448e800 100644 --- a/developer/js/package-lock.json +++ b/developer/js/package-lock.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/lexical-model-compiler", - "version": "15.0.261", + "version": "15.0.262", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/developer/js/package.json b/developer/js/package.json index 3d31cadbd1..ff36dc9ab7 100644 --- a/developer/js/package.json +++ b/developer/js/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/lexical-model-compiler", - "version": "15.0.261", + "version": "15.0.262", "description": "Keyman Developer lexical model compiler", "keywords": [ "keyboard", @@ -37,14 +37,14 @@ "node": ">=12.0.0" }, "dependencies": { - "@keymanapp/models-types": "^15.0.261", + "@keymanapp/models-types": "^15.0.262", "commander": "^3.0.0", "typescript": "^3.8.3", "xml2js": "^0.4.19" }, "devDependencies": { - "@keymanapp/models-templates": "^15.0.261", - "@keymanapp/models-wordbreakers": "^15.0.261", + "@keymanapp/models-templates": "^15.0.262", + "@keymanapp/models-wordbreakers": "^15.0.262", "@types/chai": "^4.1.7", "@types/mocha": "^5.2.7", "@types/node": "^10.14.6", diff --git a/developer/server/package-lock.json b/developer/server/package-lock.json index 14beca1627..32ae4ea712 100644 --- a/developer/server/package-lock.json +++ b/developer/server/package-lock.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/developer-server", - "version": "15.0.261", + "version": "15.0.262", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/developer/server/package.json b/developer/server/package.json index a8879ed042..5531d95d47 100644 --- a/developer/server/package.json +++ b/developer/server/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/developer-server", - "version": "15.0.261", + "version": "15.0.262", "description": "Keyman Developer backend server", "main": "dist/index.js", "scripts": { diff --git a/lerna.json b/lerna.json index 436f237494..9f6be375a9 100644 --- a/lerna.json +++ b/lerna.json @@ -21,5 +21,5 @@ "ts-node", "typescript" ], - "version": "15.0.261" + "version": "15.0.262" } diff --git a/resources/gosh/package-lock.json b/resources/gosh/package-lock.json index 586dd424d2..2b3ec91d6c 100644 --- a/resources/gosh/package-lock.json +++ b/resources/gosh/package-lock.json @@ -1,5 +1,5 @@ { "name": "@keymanapp/resources-gosh", - "version": "15.0.261", + "version": "15.0.262", "lockfileVersion": 1 } diff --git a/resources/gosh/package.json b/resources/gosh/package.json index fca823f0dc..397d57479c 100644 --- a/resources/gosh/package.json +++ b/resources/gosh/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/resources-gosh", - "version": "15.0.261", + "version": "15.0.262", "description": "Good Ol' Shell", "author": "Marc Durdin (https://github.com/mcdurdin)", "contributors": [ diff --git a/resources/web-environment/package-lock.json b/resources/web-environment/package-lock.json index 5d287aca08..9dc2271b77 100644 --- a/resources/web-environment/package-lock.json +++ b/resources/web-environment/package-lock.json @@ -1,5 +1,5 @@ { "name": "@keymanapp/web-environment", - "version": "15.0.261", + "version": "15.0.262", "lockfileVersion": 1 } diff --git a/resources/web-environment/package.json b/resources/web-environment/package.json index f672125259..a2b8b29d6b 100644 --- a/resources/web-environment/package.json +++ b/resources/web-environment/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/web-environment", - "version": "15.0.261", + "version": "15.0.262", "description": "A compilation utility for passing select environment variables into our TS builds", "author": "Joshua Horton (https://github.com/jahorton)", "homepage": "https://github.com/keymanapp/keyman", @@ -17,6 +17,6 @@ "url": "https://github.com/keymanapp/keyman/issues" }, "devDependencies": { - "@keymanapp/resources-gosh": "^15.0.261" + "@keymanapp/resources-gosh": "^15.0.262" } } diff --git a/web/package-lock.json b/web/package-lock.json index 966774b53f..af9a7f0f63 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1,6 +1,6 @@ { "name": "keyman", - "version": "15.0.261", + "version": "15.0.262", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/web/package.json b/web/package.json index 71cdec64b0..0decea963c 100644 --- a/web/package.json +++ b/web/package.json @@ -1,6 +1,6 @@ { "name": "keyman", - "version": "15.0.261", + "version": "15.0.262", "description": "Facilitates text input in any language.", "repository": { "type": "git", @@ -18,8 +18,8 @@ }, "homepage": "https://github.com/keymanapp/keyman#readme", "devDependencies": { - "@keymanapp/resources-gosh": "^15.0.261", - "@keymanapp/web-sentry-manager": "^15.0.261", + "@keymanapp/resources-gosh": "^15.0.262", + "@keymanapp/web-sentry-manager": "^15.0.262", "@sentry/cli": "^1.52.3", "chai": "^4.3.4", "google-closure-compiler-java": "^20200224.0.0", @@ -52,13 +52,13 @@ "sentry-cli": "sentry-cli" }, "dependencies": { - "@keymanapp/input-processor": "^15.0.261", - "@keymanapp/keyboard-processor": "^15.0.261", - "@keymanapp/lexical-model-layer": "^15.0.261", - "@keymanapp/models-types": "^15.0.261", - "@keymanapp/recorder-core": "^15.0.261", - "@keymanapp/web-environment": "^15.0.261", - "@keymanapp/web-utils": "^15.0.261", + "@keymanapp/input-processor": "^15.0.262", + "@keymanapp/keyboard-processor": "^15.0.262", + "@keymanapp/lexical-model-layer": "^15.0.262", + "@keymanapp/models-types": "^15.0.262", + "@keymanapp/recorder-core": "^15.0.262", + "@keymanapp/web-environment": "^15.0.262", + "@keymanapp/web-utils": "^15.0.262", "@types/node": "^11.9.4", "es6-shim": "^0.35.5", "eventemitter3": "^4.0.0" diff --git a/web/source/osk/browser/keytip.ts b/web/source/osk/browser/keytip.ts index fe5c7dd80d..7404edba3c 100644 --- a/web/source/osk/browser/keytip.ts +++ b/web/source/osk/browser/keytip.ts @@ -78,7 +78,8 @@ namespace com.keyman.osk.browser { let canvasWidth = xWidth + Math.ceil(xWidth * 0.3) * 2; let canvasHeight = Math.ceil(2.3 * xHeight) + (ySubPixelPadding); // - kts.top = Math.floor(y - canvasHeight) + 'px'; + kts.top = 'auto'; + kts.bottom = Math.floor(keyman.osk.computedHeight - y) + 'px'; kts.textAlign = 'center'; kts.overflow = 'visible'; kts.fontFamily = util.getStyleValue(kc,'font-family'); diff --git a/web/source/resources/osk/kmwosk.css b/web/source/resources/osk/kmwosk.css index 9c9bde7198..23c6327653 100644 --- a/web/source/resources/osk/kmwosk.css +++ b/web/source/resources/osk/kmwosk.css @@ -402,6 +402,13 @@ div.android div.kmw-keytip-tip { background: #999; } +div.android div.kmw-keytip-cap { + position: absolute; + background: #999; + border-radius: 0 0 5px 5px; + border-bottom: solid 1px #8a8d90 +} + /* Dark mode - ensure text is colored appropriately for key tips. */ @media (prefers-color-scheme: dark) { div.ios div.kmw-keytip {