diff --git a/HISTORY.md b/HISTORY.md index 6fc80375d9..ee5d3ad9a5 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,15 @@ # Keyman Version History +## 15.0.68 alpha 2021-06-15 + +* chore(common): Add YouTube links to Keyman 14 features (#5276) +* chore(common): Check in crowdin strings for Spanish (Latin America) (#5269) +* refactor(web): polishes management of OSK keys (#5257) +* refactor(web): Visual Keyboard disentanglement - pass 1 (#5259) +* refactor(web): VisualKeyboard height styling consistency (#5278) +* fix(common/models): predictive-text engine use of NFD input (#5273) +* chore(linux): Fix warnings (#5282) + ## 15.0.67 alpha 2021-06-12 * feat(linux): Fix Linux packaging on i386 (#5250) diff --git a/VERSION.md b/VERSION.md index 73267416bb..c89f10253c 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1 +1 @@ -15.0.68 \ No newline at end of file +15.0.69 \ 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 fbbce42d29..d0bf9600d6 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.68", + "version": "15.0.69", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/common/core/web/input-processor/package.json b/common/core/web/input-processor/package.json index 909a6ca5ef..a197093e8d 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.68", + "version": "15.0.69", "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.68", - "@keymanapp/resources-gosh": "^15.0.68", + "@keymanapp/lexical-model-compiler": "^15.0.69", + "@keymanapp/resources-gosh": "^15.0.69", "@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.68", - "@keymanapp/lexical-model-layer": "^15.0.68", - "@keymanapp/models-types": "^15.0.68", - "@keymanapp/web-environment": "^15.0.68", - "@keymanapp/web-utils": "^15.0.68", + "@keymanapp/keyboard-processor": "^15.0.69", + "@keymanapp/lexical-model-layer": "^15.0.69", + "@keymanapp/models-types": "^15.0.69", + "@keymanapp/web-environment": "^15.0.69", + "@keymanapp/web-utils": "^15.0.69", "eventemitter3": "^4.0.0" } } diff --git a/common/core/web/keyboard-processor/package-lock.json b/common/core/web/keyboard-processor/package-lock.json index 72bad24d3a..c1722f7911 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.68", + "version": "15.0.69", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/common/core/web/keyboard-processor/package.json b/common/core/web/keyboard-processor/package.json index 0ede7a4e03..7c14a034d7 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.68", + "version": "15.0.69", "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.68", + "@keymanapp/resources-gosh": "^15.0.69", "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.68", - "@keymanapp/web-environment": "^15.0.68", - "@keymanapp/web-utils": "^15.0.68", + "@keymanapp/models-types": "^15.0.69", + "@keymanapp/web-environment": "^15.0.69", + "@keymanapp/web-utils": "^15.0.69", "@types/node": "^11.9.4" } } diff --git a/common/core/web/keyboard-processor/src/keyboards/activeLayout.ts b/common/core/web/keyboard-processor/src/keyboards/activeLayout.ts index 94636e90ec..6cdddf7d83 100644 --- a/common/core/web/keyboard-processor/src/keyboards/activeLayout.ts +++ b/common/core/web/keyboard-processor/src/keyboards/activeLayout.ts @@ -29,6 +29,7 @@ namespace com.keyman.keyboards { private baseKeyEvent: text.KeyEvent; isMnemonic: boolean = false; + proportionalPad: number; proportionalX: number; proportionalWidth: number; @@ -286,6 +287,12 @@ namespace com.keyman.keyboards { * and are intended for use with layout testing (while headless) in the future. */ + let setProportions = function(key: ActiveKey, padPc: number, keyPc: number, totalPc: number) { + key.proportionalPad = padPc; + key.proportionalWidth = keyPc; + key.proportionalX = (totalPc + padPc + (keyPc/2)); + } + // Calculate percentage-based scalings by summing defined widths and scaling each key to %. // Save each percentage key width as a separate member (do *not* overwrite layout specified width!) var keyPercent: number, padPercent: number, totalPercent=0; @@ -296,9 +303,7 @@ namespace com.keyman.keyboards { keys[j]['padpc']=padPercent; // compute center's default x-coord (used in headless modes) - ( keys[j]).proportionalX = (totalPercent + padPercent + (keyPercent/2)); - ( keys[j]).proportionalWidth = keyPercent; - + setProportions(keys[j] as ActiveKey, padPercent, keyPercent, totalPercent); totalPercent += padPercent+keyPercent; } @@ -314,9 +319,7 @@ namespace com.keyman.keyboards { keys[0]['padpc']=1-totalPercent; // compute center's default x-coord (used in headless modes) - ( keys[0]).proportionalX = ((totalPercent - rightMargin) - keyPercent/2); - ( keys[0]).proportionalWidth = keyPercent; - + setProportions(keys[0] as ActiveKey, padPercent, keyPercent, totalPercent); } else if(keys.length > 0) { let j=keys.length-1; padPercent=parseInt(keys[j]['pad'],10)/totalWidth; @@ -325,8 +328,7 @@ namespace com.keyman.keyboards { keys[j]['widthpc'] = keyPercent = 1-totalPercent; // compute center's default x-coord (used in headless modes) - ( keys[j]).proportionalX = (1 - rightMargin) - keyPercent/2; - ( keys[j]).proportionalWidth = keyPercent; + setProportions(keys[j] as ActiveKey, padPercent, keyPercent, totalPercent); } // Add class functions to the existing layout object, allowing it to act as an ActiveLayout. diff --git a/common/core/web/tools/recorder/package-lock.json b/common/core/web/tools/recorder/package-lock.json index b2a2f8ed56..01fd429cc4 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.68", + "version": "15.0.69", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/common/core/web/tools/recorder/package.json b/common/core/web/tools/recorder/package.json index c2c0a31199..b5c718fac9 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.68", + "version": "15.0.69", "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.68", - "@keymanapp/models-types": "^15.0.68", - "@keymanapp/web-environment": "^15.0.68", - "@keymanapp/web-utils": "^15.0.68" + "@keymanapp/keyboard-processor": "^15.0.69", + "@keymanapp/models-types": "^15.0.69", + "@keymanapp/web-environment": "^15.0.69", + "@keymanapp/web-utils": "^15.0.69" }, "devDependencies": { "typescript": "^3.8.3" diff --git a/common/core/web/tools/sentry-manager/package-lock.json b/common/core/web/tools/sentry-manager/package-lock.json index 5aa4361c79..2497d0f78e 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.68", + "version": "15.0.69", "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 24f2310dfd..4728189104 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.68", + "version": "15.0.69", "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.68", + "@keymanapp/web-environment": "^15.0.69", "@sentry/browser": "^5.27.4" } } diff --git a/common/core/web/utils/package-lock.json b/common/core/web/utils/package-lock.json index 4e63b6ea91..78b5dfe009 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.68", + "version": "15.0.69", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/common/core/web/utils/package.json b/common/core/web/utils/package.json index 71230bddbb..2bd7b2c7b6 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.68", + "version": "15.0.69", "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.68", - "@keymanapp/web-environment": "^15.0.68", + "@keymanapp/resources-gosh": "^15.0.69", + "@keymanapp/web-environment": "^15.0.69", "@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 bf8d95d86d..68d5706ecc 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.68", + "version": "15.0.69", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/common/models/templates/package.json b/common/models/templates/package.json index 8c1f678cf5..0a34dc0f00 100644 --- a/common/models/templates/package.json +++ b/common/models/templates/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/models-templates", - "version": "15.0.68", + "version": "15.0.69", "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.68", - "@keymanapp/web-utils": "^15.0.68", + "@keymanapp/models-types": "^15.0.69", + "@keymanapp/web-utils": "^15.0.69", "@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.68" + "@keymanapp/models-wordbreakers": "^15.0.69" } } diff --git a/common/models/types/package-lock.json b/common/models/types/package-lock.json index 208411199c..04e3131f32 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.68", + "version": "15.0.69", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/common/models/types/package.json b/common/models/types/package.json index ee5f44bd8a..36f17a09d1 100644 --- a/common/models/types/package.json +++ b/common/models/types/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/models-types", - "version": "15.0.68", + "version": "15.0.69", "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 f07ebac66a..c37198ded6 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.68", + "version": "15.0.69", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/common/models/wordbreakers/package.json b/common/models/wordbreakers/package.json index d2b1fb8992..211fcbf6e8 100644 --- a/common/models/wordbreakers/package.json +++ b/common/models/wordbreakers/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/models-wordbreakers", - "version": "15.0.68", + "version": "15.0.69", "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.68", + "@keymanapp/models-types": "^15.0.69", "@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 e978cc025b..227b3b625e 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.68", + "version": "15.0.69", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/common/predictive-text/package.json b/common/predictive-text/package.json index e04518fd36..1392719d5e 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.68", + "version": "15.0.69", "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.68", - "@keymanapp/resources-gosh": "^15.0.68", + "@keymanapp/models-types": "^15.0.69", + "@keymanapp/resources-gosh": "^15.0.69", "@types/node": "^10.17.21", "chai": "^4.3.4", "karma": "^6.3.2", @@ -46,10 +46,10 @@ "typescript": "^3.8.3" }, "dependencies": { - "@keymanapp/models-templates": "^15.0.68", - "@keymanapp/models-wordbreakers": "^15.0.68", - "@keymanapp/web-environment": "^15.0.68", - "@keymanapp/web-utils": "^15.0.68", + "@keymanapp/models-templates": "^15.0.69", + "@keymanapp/models-wordbreakers": "^15.0.69", + "@keymanapp/web-environment": "^15.0.69", + "@keymanapp/web-utils": "^15.0.69", "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 c4a2c46106..0d60e5b7d2 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.68", + "version": "15.0.69", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/developer/js/package.json b/developer/js/package.json index 4a20180e07..0fa1e3e59b 100644 --- a/developer/js/package.json +++ b/developer/js/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/lexical-model-compiler", - "version": "15.0.68", + "version": "15.0.69", "description": "Keyman Developer lexical model compiler", "keywords": [ "keyboard", @@ -37,14 +37,14 @@ "node": ">=12.0.0" }, "dependencies": { - "@keymanapp/models-types": "^15.0.68", + "@keymanapp/models-types": "^15.0.69", "commander": "^3.0.0", "typescript": "^3.8.3", "xml2js": "^0.4.19" }, "devDependencies": { - "@keymanapp/models-templates": "^15.0.68", - "@keymanapp/models-wordbreakers": "^15.0.68", + "@keymanapp/models-templates": "^15.0.69", + "@keymanapp/models-wordbreakers": "^15.0.69", "@types/chai": "^4.1.7", "@types/mocha": "^5.2.7", "@types/node": "^10.14.6", diff --git a/lerna.json b/lerna.json index b9f07ab803..f8b353f310 100644 --- a/lerna.json +++ b/lerna.json @@ -20,5 +20,5 @@ "ts-node", "typescript" ], - "version": "15.0.68" + "version": "15.0.69" } diff --git a/linux/ibus-keyman/src/engine.c b/linux/ibus-keyman/src/engine.c index 91cafb5cef..6853aa4149 100644 --- a/linux/ibus-keyman/src/engine.c +++ b/linux/ibus-keyman/src/engine.c @@ -832,7 +832,8 @@ ibus_keyman_engine_process_key_event (IBusEngine *engine, g_message("Saving keyboard option to DConf"); // Load the current keyboard options from DConf keyman_put_options_todconf(keyman->kb_name, keyman->kb_name, - action_items[i].option->key, action_items[i].option->value); + (gchar *)action_items[i].option->key, + (gchar *)action_items[i].option->value); } } break; diff --git a/linux/ibus-keyman/src/keymanutil.c b/linux/ibus-keyman/src/keymanutil.c index 75a7344fed..c699b603a9 100644 --- a/linux/ibus-keyman/src/keymanutil.c +++ b/linux/ibus-keyman/src/keymanutil.c @@ -437,7 +437,7 @@ keyman_put_options_todconf(gchar *package_id, if (child_settings != NULL) { g_message("writing keyboard options to DConf"); - g_settings_set_strv(child_settings, KEYMAN_DCONF_OPTIONS_KEY, options); + g_settings_set_strv(child_settings, KEYMAN_DCONF_OPTIONS_KEY, (const gchar *const *)options); } g_object_unref(G_OBJECT(child_settings)); diff --git a/resources/gosh/package-lock.json b/resources/gosh/package-lock.json index 7a34a3b506..1c8f1b1e48 100644 --- a/resources/gosh/package-lock.json +++ b/resources/gosh/package-lock.json @@ -1,5 +1,5 @@ { "name": "@keymanapp/resources-gosh", - "version": "15.0.68", + "version": "15.0.69", "lockfileVersion": 1 } diff --git a/resources/gosh/package.json b/resources/gosh/package.json index 39456c4578..4bc5085bcc 100644 --- a/resources/gosh/package.json +++ b/resources/gosh/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/resources-gosh", - "version": "15.0.68", + "version": "15.0.69", "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 777388218c..a6caa2eb03 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.68", + "version": "15.0.69", "lockfileVersion": 1 } diff --git a/resources/web-environment/package.json b/resources/web-environment/package.json index 926bd269a1..7575c4b182 100644 --- a/resources/web-environment/package.json +++ b/resources/web-environment/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/web-environment", - "version": "15.0.68", + "version": "15.0.69", "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.68" + "@keymanapp/resources-gosh": "^15.0.69" } } diff --git a/web/.gitignore b/web/.gitignore index 86e05f06b7..fe29333720 100644 --- a/web/.gitignore +++ b/web/.gitignore @@ -1,9 +1,6 @@ # Legacy build folders. output/ build/ -embedded/ - -!source/**/embedded # Current build folders. intermediate/ diff --git a/web/package-lock.json b/web/package-lock.json index 4a075cdf84..4e6dcfa279 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1,6 +1,6 @@ { "name": "keyman", - "version": "15.0.68", + "version": "15.0.69", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/web/package.json b/web/package.json index 38c5ce53e5..2924c69c00 100644 --- a/web/package.json +++ b/web/package.json @@ -1,6 +1,6 @@ { "name": "keyman", - "version": "15.0.68", + "version": "15.0.69", "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.68", - "@keymanapp/web-sentry-manager": "^15.0.68", + "@keymanapp/resources-gosh": "^15.0.69", + "@keymanapp/web-sentry-manager": "^15.0.69", "@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.68", - "@keymanapp/keyboard-processor": "^15.0.68", - "@keymanapp/lexical-model-layer": "^15.0.68", - "@keymanapp/models-types": "^15.0.68", - "@keymanapp/recorder-core": "^15.0.68", - "@keymanapp/web-environment": "^15.0.68", - "@keymanapp/web-utils": "^15.0.68", + "@keymanapp/input-processor": "^15.0.69", + "@keymanapp/keyboard-processor": "^15.0.69", + "@keymanapp/lexical-model-layer": "^15.0.69", + "@keymanapp/models-types": "^15.0.69", + "@keymanapp/recorder-core": "^15.0.69", + "@keymanapp/web-environment": "^15.0.69", + "@keymanapp/web-utils": "^15.0.69", "@types/node": "^11.9.4", "es6-shim": "^0.35.5", "eventemitter3": "^4.0.0" diff --git a/web/source/osk/abstractions.ts b/web/source/osk/keytip.interface.ts similarity index 100% rename from web/source/osk/abstractions.ts rename to web/source/osk/keytip.interface.ts diff --git a/web/source/osk/preProcessor.ts b/web/source/osk/preProcessor.ts index 28d286685a..82871c0325 100644 --- a/web/source/osk/preProcessor.ts +++ b/web/source/osk/preProcessor.ts @@ -1,26 +1,5 @@ namespace com.keyman.osk { export class PreProcessor { - static _GetClickEventProperties(e: keyboards.ActiveKey, Lelem: HTMLElement): text.KeyEvent { - let keyman = com.keyman.singleton; - let core = keyman.core; - - // Start: mirrors _GetKeyEventProperties - - // First check the virtual key, and process shift, control, alt or function keys - let Lkc = e.constructKeyEvent(core.keyboardProcessor, keyman.util.device.coreSpec); - - // If it's actually a state key modifier, trigger its effects immediately, as KeyboardEvents would do the same. - switch(Lkc.kName) { - case 'K_CAPS': - case 'K_NUMLOCK': - case 'K_SCROLL': - core.keyboardProcessor.stateKeys[Lkc.kName] = ! core.keyboardProcessor.stateKeys[Lkc.kName]; - } - - // End - mirrors _GetKeyEventProperties - return Lkc; - } - /** * Simulate a keystroke according to the touched keyboard button element * @@ -30,7 +9,17 @@ namespace com.keyman.osk { * * @param {Object} e element touched (or clicked) */ - static clickKey(e: osk.KeyElement, touch?: Touch, layerId?: string, keyDistribution?: text.KeyDistribution) { + static clickKey(e: osk.KeyElement, touch?: Touch) { + let keyman = com.keyman.singleton; + let Lkc = keyman['osk'].vkbd.initKeyEvent(e, touch); + if(!Lkc) { + return true; + } + + return this.raiseKeyEvent(Lkc); + } + + static raiseKeyEvent(keyEvent: text.KeyEvent) { let keyman = com.keyman.singleton; var Lelem = keyman.domManager.getLastActiveElement(); @@ -38,9 +27,6 @@ namespace com.keyman.osk { // Handle any DOM state management related to click inputs. let outputTarget = dom.Utils.getOutputTarget(Lelem); keyman.domManager.initActiveElement(Lelem); - - // Turn off key highlighting (or preview) - keyman['osk'].vkbd.highlightKey(e,false); // Clear any cached codepoint data; we can rebuild it if it's unchanged. outputTarget.invalidateSelection(); @@ -48,24 +34,6 @@ namespace com.keyman.osk { // Deleting matched deadkeys here seems to correct some of the issues. (JD 6/6/14) outputTarget.deadkeys().deleteMatched(); // Delete any matched deadkeys before continuing - // Future note: we need to refactor osk.OSKKeySpec to instead be a 'tag field' for - // keyboards.ActiveKey. (Prob with generics, allowing the Web-only parts to - // be fully specified within the tag.) - // - // Would avoid the type shenanigans needed here because of our current type-abuse setup - // for key spec tracking. - let keySpec = (e['key'] ? e['key'].spec : null) as unknown as keyboards.ActiveKey; - if(!keySpec) { - console.error("OSK key with ID '" + e.id + "', keyID '" + e.keyId + "' missing needed specification"); - return true; - } - - let Lkc = PreProcessor._GetClickEventProperties(keySpec, Lelem); - if(keyman.core.languageProcessor.isActive) { - Lkc.source = touch; - Lkc.keyDistribution = keyDistribution; - } - if(!keyman.isEmbedded) { keyman.uiManager.setActivatingUI(true); com.keyman.dom.DOMEventHandlers.states._IgnoreNextSelChange = 100; @@ -73,7 +41,7 @@ namespace com.keyman.osk { com.keyman.dom.DOMEventHandlers.states._IgnoreNextSelChange = 0; } - let retVal = PreProcessor.handleClick(Lkc, outputTarget, e); + let retVal = PreProcessor.handleClick(keyEvent, outputTarget, null); // Now that processing is done, we can do a bit of post-processing, too. keyman.uiManager.setActivatingUI(false); // I2498 - KeymanWeb OSK does not accept clicks in FF when using automatic UI @@ -87,7 +55,7 @@ namespace com.keyman.osk { // after the KeyEvent object has been properly instantiated. This should help catch any // mutual last-minute DOM-side interactions before passing control to the processor... such as // the UI-control command keys as seen below. - static handleClick(Lkc: text.KeyEvent, outputTarget: text.OutputTarget, e: KeyElement) { + static handleClick(Lkc: text.KeyEvent, outputTarget: text.OutputTarget, e: osk.KeyElement) { let keyman = com.keyman.singleton; // Exclude menu and OSK hide keys from normal click processing if(Lkc.kName == 'K_LOPT' || Lkc.kName == 'K_ROPT') { diff --git a/web/source/osk/visualKeyboard.ts b/web/source/osk/visualKeyboard.ts index c6152e665e..89c111755a 100644 --- a/web/source/osk/visualKeyboard.ts +++ b/web/source/osk/visualKeyboard.ts @@ -1,6 +1,6 @@ /// /// -/// +/// /// /// @@ -872,7 +872,7 @@ namespace com.keyman.osk { var n: number, i: number, j: number; var layers: keyboards.LayoutLayer[], gDiv: HTMLDivElement; var rowHeight: number, rDiv: HTMLDivElement; - var keys: keyboards.LayoutKey[], key: keyboards.LayoutKey, rs: CSSStyleDeclaration, gs: CSSStyleDeclaration; + var keys: keyboards.ActiveKey[], key: keyboards.ActiveKey, rs: CSSStyleDeclaration, gs: CSSStyleDeclaration; layers=layout['layer']; @@ -966,49 +966,16 @@ namespace com.keyman.osk { // Overwrite the previously-computed percent. // NB: the 'percent' suffix is historical, units are percent on desktop devices, but pixels on touch devices // All key widths and paddings are rounded for uniformity - var keyPercent: number, padPercent: number, totalPercent=0; - for(j=0; j keys[j]).proportionalX = (totalPercent + padPercent + (keyPercent/2))/objectWidth; - ( keys[j]).proportionalWidth = keyPercent / objectWidth; - - totalPercent += padPercent+keyPercent; - } - - // Allow for right OSK margin (15 layout units) - let rightMargin = keyboards.ActiveKey.DEFAULT_RIGHT_MARGIN*objectWidth/layer.totalWidth; - totalPercent += rightMargin; - - // If a single key, and padding is negative, add padding to right align the key - if(keys.length == 1 && parseInt(keys[0]['pad'],10) < 0) { - keyPercent = keys[0]['widthpc'] * objectWidth; - keys[0]['widthpc']=keyPercent; - totalPercent += keyPercent; - keys[0]['padpc']=(objectWidth-totalPercent); - - // Recompute center's x-coord with exact, in-browser values. - ( keys[0]).proportionalX = (totalPercent - rightMargin - keyPercent/2)/objectWidth; - ( keys[0]).proportionalWidth = keyPercent / objectWidth; - } else if(keys.length > 0) { - j=keys.length-1; - padPercent = keys[j]['padpc'] * objectWidth; - keys[j]['padpc']=padPercent; - totalPercent += padPercent; - keys[j]['widthpc']= keyPercent = (objectWidth-totalPercent); - - // Recompute center's x-coord with exact, in-browser values. - ( keys[j]).proportionalX = (objectWidth - rightMargin - keyPercent/2)/objectWidth; - ( keys[j]).proportionalWidth = keyPercent / objectWidth; + for(j=0; j 0 && !beyondEdge) { - let touchProbabilities = this.getTouchProbabilities(e.changedTouches[0]); - PreProcessor.clickKey(this.keyPending, e.changedTouches[0], this.layerId, touchProbabilities); + this.modelKeyClick(this.keyPending, e.changedTouches[0]); } this.clearPopup(); this.keyPending = null; @@ -1556,7 +1520,7 @@ namespace com.keyman.osk { **/ repeatDelete: () => void = function(this: VisualKeyboard) { if(this.deleting) { - PreProcessor.clickKey(this.deleteKey); + this.modelKeyClick(this.deleteKey); this.deleting = window.setTimeout(this.repeatDelete,100); } }.bind(this); @@ -1574,6 +1538,57 @@ namespace com.keyman.osk { } //#endregion + modelKeyClick(e: osk.KeyElement, touch?: Touch) { + let keyEvent = this.initKeyEvent(e, touch); + + // TODO: convert into an actual event, raised by the VisualKeyboard. + // Its code is intended to lie outside of the OSK-Core library/module. + PreProcessor.raiseKeyEvent(keyEvent); + } + + initKeyEvent(e: osk.KeyElement, touch?: Touch) { + // Turn off key highlighting (or preview) + this.highlightKey(e,false); + + let core = com.keyman.singleton.core; // only singleton-based ref currently needed here. + + // Future note: we need to refactor osk.OSKKeySpec to instead be a 'tag field' for + // keyboards.ActiveKey. (Prob with generics, allowing the Web-only parts to + // be fully specified within the tag.) + // + // Would avoid the type shenanigans needed here because of our current type-abuse setup + // for key spec tracking. + let keySpec = (e['key'] ? e['key'].spec : null) as unknown as keyboards.ActiveKey; + if(!keySpec) { + console.error("OSK key with ID '" + e.id + "', keyID '" + e.keyId + "' missing needed specification"); + return null; + } + + + // Start: mirrors _GetKeyEventProperties + + // First check the virtual key, and process shift, control, alt or function keys + let Lkc = keySpec.constructKeyEvent(core.keyboardProcessor, this.device.coreSpec); + + // If it's actually a state key modifier, trigger its effects immediately, as KeyboardEvents would do the same. + switch(Lkc.kName) { + case 'K_CAPS': + case 'K_NUMLOCK': + case 'K_SCROLL': + core.keyboardProcessor.stateKeys[Lkc.kName] = ! core.keyboardProcessor.stateKeys[Lkc.kName]; + } + + // End - mirrors _GetKeyEventProperties + + if(core.languageProcessor.isActive && touch) { + Lkc.source = touch; + Lkc.keyDistribution = this.getTouchProbabilities(touch);; + } + + // Return the event object. + return Lkc; + } + // cancel = function(e) {} //cancel event is never generated by iOS /** @@ -1846,7 +1861,7 @@ namespace com.keyman.osk { // Process as click if mouse button released anywhere over key if(util.eventType(e) == 'mouseup') { if(key.id == this.currentKey) { - PreProcessor.clickKey(key); + this.modelKeyClick(key); } this.currentKey=''; } diff --git a/web/tools/recorder/scribe.ts b/web/tools/recorder/scribe.ts index f6c083a01c..06f9a0bb98 100644 --- a/web/tools/recorder/scribe.ts +++ b/web/tools/recorder/scribe.ts @@ -29,6 +29,7 @@ namespace com.keyman { export namespace osk { export declare var PreProcessor: any; + export declare var VisualKeyboard: any; } } @@ -199,15 +200,15 @@ namespace KMWRecorder { return retVal; } - var _originalClickKey = com.keyman.osk.PreProcessor.clickKey; //.bind(keyman.osk); - com.keyman.osk.PreProcessor.clickKey = function(e) { + var _originalModelKeyClick = com.keyman.osk.VisualKeyboard.prototype.modelKeyClick; //.bind(keyman.osk); + com.keyman.osk.VisualKeyboard.prototype.modelKeyClick = function(e, touch) { let in_output = com.keyman.dom.Utils.getOutputTarget(recordingElement); if(!in_output || com.keyman.dom.DOMEventHandlers.states.activeElement != in_output.getElement()) { - return _originalClickKey(e); + return _originalModelKeyClick.call(this, e, touch); } let event = KMWRecorder.Scribe.recordOSKEvent(e); - var retVal = _originalClickKey(e); + var retVal = _originalModelKeyClick.call(this, e, touch); let recording = Scribe.recordKeystroke(recorderScribe._currentKeyEvent, event); @@ -254,9 +255,9 @@ namespace KMWRecorder { } var _originalProcessKeyEvent = keyman.core.processKeyEvent.bind(keyman.core); - keyman.core.processKeyEvent = function(keyEvent /* com.keyman.text.KeyEvent */) { + keyman.core.processKeyEvent = function(keyEvent /* com.keyman.text.KeyEvent */, target /* com.keyman.text.OutputTarget */) { recorderScribe._currentKeyEvent = keyEvent; - return _originalProcessKeyEvent(keyEvent); + return _originalProcessKeyEvent(keyEvent, target); } } }