diff --git a/HISTORY.md b/HISTORY.md index df57d7815d..adb01c5355 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,17 @@ # Keyman Version History +## 15.0.218 beta 2022-03-21 + +* chore(android/engine): Remove visual gaps in keyboard picker menu (#6370) + +## 15.0.217 beta 2022-03-19 + +* fix(web): bounding rect offset was incorrect (#6357) + +## 15.0.216 beta 2022-03-18 + +* feat(linux): Allow to run ibus tests on Wayland ️ (#6202) + ## 15.0.215 beta 2022-03-17 * fix(web): crash on focus before init (#6393) diff --git a/VERSION.md b/VERSION.md index 8b01078ed3..0b68b966eb 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1 +1 @@ -15.0.216 \ No newline at end of file +15.0.219 \ No newline at end of file diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KeyboardPickerActivity.java b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KeyboardPickerActivity.java index d73043244e..db63d2c2f9 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KeyboardPickerActivity.java +++ b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KeyboardPickerActivity.java @@ -214,7 +214,8 @@ public final class KeyboardPickerActivity extends BaseActivity { imeListAdapter = new SimpleAdapter(this, imeList, R.layout.list_row_layout5, from, to); imeListView.setAdapter(imeListAdapter); // Rescale IME listview so entire list is visible (wrap_content not working) - imeListView.getLayoutParams().height = actionBarHeight * imeListAdapter.getCount(); + imeListView.getLayoutParams().height = ((int) context.getResources().getDimension(R.dimen.other_ime_row_height)) * + imeListAdapter.getCount(); imeListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { diff --git a/android/KMEA/app/src/main/res/layout/ime_list_layout.xml b/android/KMEA/app/src/main/res/layout/ime_list_layout.xml index 0cc705cfb9..bad2c6ba19 100644 --- a/android/KMEA/app/src/main/res/layout/ime_list_layout.xml +++ b/android/KMEA/app/src/main/res/layout/ime_list_layout.xml @@ -16,8 +16,7 @@ android:ellipsize="end" android:singleLine="true" android:textSize="@dimen/titlebar_label_textsize" - android:textStyle="bold" - android:layout_marginTop="@dimen/fab_margin"/> + android:textStyle="bold" /> 80dp 0.5dp 10dp + 50dp + 60dp diff --git a/android/KMEA/app/src/main/res/values/dimens.xml b/android/KMEA/app/src/main/res/values/dimens.xml index 703451bd98..068e1d1847 100644 --- a/android/KMEA/app/src/main/res/values/dimens.xml +++ b/android/KMEA/app/src/main/res/values/dimens.xml @@ -16,6 +16,7 @@ 0.5dp 6dp 35dp + 50dp 10dp 70dp 250dp diff --git a/common/core/web/input-processor/package-lock.json b/common/core/web/input-processor/package-lock.json index 53ee499c90..1cd7df94e8 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.216", + "version": "15.0.219", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/common/core/web/input-processor/package.json b/common/core/web/input-processor/package.json index d75de9055b..4b85c78042 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.216", + "version": "15.0.219", "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.216", - "@keymanapp/resources-gosh": "^15.0.216", + "@keymanapp/lexical-model-compiler": "^15.0.219", + "@keymanapp/resources-gosh": "^15.0.219", "@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.216", - "@keymanapp/lexical-model-layer": "^15.0.216", - "@keymanapp/models-types": "^15.0.216", - "@keymanapp/web-environment": "^15.0.216", - "@keymanapp/web-utils": "^15.0.216", + "@keymanapp/keyboard-processor": "^15.0.219", + "@keymanapp/lexical-model-layer": "^15.0.219", + "@keymanapp/models-types": "^15.0.219", + "@keymanapp/web-environment": "^15.0.219", + "@keymanapp/web-utils": "^15.0.219", "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 fe44fb7853..b8c1e4deea 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.216", + "version": "15.0.219", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/common/core/web/keyboard-processor/package.json b/common/core/web/keyboard-processor/package.json index 347f838f6b..1a9e119975 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.216", + "version": "15.0.219", "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.216", + "@keymanapp/resources-gosh": "^15.0.219", "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.216", - "@keymanapp/web-environment": "^15.0.216", - "@keymanapp/web-utils": "^15.0.216", + "@keymanapp/models-types": "^15.0.219", + "@keymanapp/web-environment": "^15.0.219", + "@keymanapp/web-utils": "^15.0.219", "@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 c44727da9a..01fab46fbd 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.216", + "version": "15.0.219", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/common/core/web/tools/recorder/package.json b/common/core/web/tools/recorder/package.json index b12e1b6284..8208aa6b5b 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.216", + "version": "15.0.219", "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.216", - "@keymanapp/models-types": "^15.0.216", - "@keymanapp/web-environment": "^15.0.216", - "@keymanapp/web-utils": "^15.0.216", + "@keymanapp/keyboard-processor": "^15.0.219", + "@keymanapp/models-types": "^15.0.219", + "@keymanapp/web-environment": "^15.0.219", + "@keymanapp/web-utils": "^15.0.219", "@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 a932f2a8d8..9a88067f7a 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.216", + "version": "15.0.219", "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 4f432b8ffc..f534eb7bd8 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.216", + "version": "15.0.219", "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.216", + "@keymanapp/web-environment": "^15.0.219", "@sentry/browser": "^5.27.4" } } diff --git a/common/core/web/utils/package-lock.json b/common/core/web/utils/package-lock.json index f90dd640fe..ab1fb40773 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.216", + "version": "15.0.219", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/common/core/web/utils/package.json b/common/core/web/utils/package.json index 016e57bdb7..3d236c7c69 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.216", + "version": "15.0.219", "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.216", - "@keymanapp/web-environment": "^15.0.216", + "@keymanapp/resources-gosh": "^15.0.219", + "@keymanapp/web-environment": "^15.0.219", "@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 aed3769f2c..53946a4c7b 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.216", + "version": "15.0.219", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/common/models/templates/package.json b/common/models/templates/package.json index f7fc5c69be..d6f6cbec11 100644 --- a/common/models/templates/package.json +++ b/common/models/templates/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/models-templates", - "version": "15.0.216", + "version": "15.0.219", "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.216", - "@keymanapp/web-utils": "^15.0.216", + "@keymanapp/models-types": "^15.0.219", + "@keymanapp/web-utils": "^15.0.219", "@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.216" + "@keymanapp/models-wordbreakers": "^15.0.219" } } diff --git a/common/models/types/package-lock.json b/common/models/types/package-lock.json index 8a5baf0b92..960b9d7e08 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.216", + "version": "15.0.219", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/common/models/types/package.json b/common/models/types/package.json index 78762c80d3..a9eb601fdb 100644 --- a/common/models/types/package.json +++ b/common/models/types/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/models-types", - "version": "15.0.216", + "version": "15.0.219", "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 745b40eeed..f7788d5bc6 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.216", + "version": "15.0.219", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/common/models/wordbreakers/package.json b/common/models/wordbreakers/package.json index f90fb38d59..4ae0429e71 100644 --- a/common/models/wordbreakers/package.json +++ b/common/models/wordbreakers/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/models-wordbreakers", - "version": "15.0.216", + "version": "15.0.219", "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.216", + "@keymanapp/models-types": "^15.0.219", "@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 08ec16035f..4d7782ac3a 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.216", + "version": "15.0.219", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/common/predictive-text/package.json b/common/predictive-text/package.json index b2b0df0192..5f8dbf819f 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.216", + "version": "15.0.219", "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.216", - "@keymanapp/resources-gosh": "^15.0.216", + "@keymanapp/models-types": "^15.0.219", + "@keymanapp/resources-gosh": "^15.0.219", "@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.216", - "@keymanapp/models-wordbreakers": "^15.0.216", - "@keymanapp/web-environment": "^15.0.216", - "@keymanapp/web-utils": "^15.0.216", + "@keymanapp/models-templates": "^15.0.219", + "@keymanapp/models-wordbreakers": "^15.0.219", + "@keymanapp/web-environment": "^15.0.219", + "@keymanapp/web-utils": "^15.0.219", "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 7c5242c7ad..a1648d22ce 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.216", + "version": "15.0.219", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/developer/js/package.json b/developer/js/package.json index feb257b144..4bd6cb4a14 100644 --- a/developer/js/package.json +++ b/developer/js/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/lexical-model-compiler", - "version": "15.0.216", + "version": "15.0.219", "description": "Keyman Developer lexical model compiler", "keywords": [ "keyboard", @@ -37,14 +37,14 @@ "node": ">=12.0.0" }, "dependencies": { - "@keymanapp/models-types": "^15.0.216", + "@keymanapp/models-types": "^15.0.219", "commander": "^3.0.0", "typescript": "^3.8.3", "xml2js": "^0.4.19" }, "devDependencies": { - "@keymanapp/models-templates": "^15.0.216", - "@keymanapp/models-wordbreakers": "^15.0.216", + "@keymanapp/models-templates": "^15.0.219", + "@keymanapp/models-wordbreakers": "^15.0.219", "@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 d446541e4f..203ec08f85 100644 --- a/developer/server/package-lock.json +++ b/developer/server/package-lock.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/developer-server", - "version": "15.0.216", + "version": "15.0.219", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/developer/server/package.json b/developer/server/package.json index aa88108be2..0bc1854154 100644 --- a/developer/server/package.json +++ b/developer/server/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/developer-server", - "version": "15.0.216", + "version": "15.0.219", "description": "Keyman Developer backend server", "main": "dist/index.js", "scripts": { diff --git a/docs/build/macos.md b/docs/build/macos.md index 70d055a13e..7870c8d04b 100644 --- a/docs/build/macos.md +++ b/docs/build/macos.md @@ -48,11 +48,15 @@ These dependencies are also listed below if you'd prefer to install manually. ## Shared Dependencies -* Shared: HomeBrew, Bash 5.0+, jq, Python 3, Meson, Ninja, coreutils, Pandoc +* Shared: HomeBrew, Bash 5.0+, jq, Python 2.7, Python 3, Meson, Ninja, coreutils, Pandoc ```shell /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" - brew install bash jq python3 meson ninja coreutils pandoc + brew install bash jq python3 meson ninja coreutils pandoc pyenv + # Python 2.7 required for DeviceKit (among others?) at present + pyenv install 2.7.18 + pyenv global 2.7.18 + echo 'eval "$(pyenv init --path)"' >> ~/.bash_profile ``` On M1 only (as greadlink is not on the path otherwise in XCode): diff --git a/ios/keyman/Keyman/Keyman/AppDelegate.swift b/ios/keyman/Keyman/Keyman/AppDelegate.swift index 91e84589a4..c7ca42e078 100644 --- a/ios/keyman/Keyman/Keyman/AppDelegate.swift +++ b/ios/keyman/Keyman/Keyman/AppDelegate.swift @@ -87,9 +87,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate { window!.rootViewController = navigationController window!.makeKeyAndVisible() - //TODO: look in documents directory for .zip / .kmp files - //TODO: OR browse documents Dir from new keyboard window - //self.installAdhocKeyboard(filePath: "") + // TODO: look in documents directory for .zip / .kmp files + // TODO: OR browse documents Dir from new keyboard window + // self.installAdhocKeyboard(filePath: "") return true } diff --git a/ios/keyman/Keyman/Keyman/Classes/KMWebBrowser/BookmarksViewController.swift b/ios/keyman/Keyman/Keyman/Classes/KMWebBrowser/BookmarksViewController.swift index d453978ed1..fe0ecba47a 100644 --- a/ios/keyman/Keyman/Keyman/Classes/KMWebBrowser/BookmarksViewController.swift +++ b/ios/keyman/Keyman/Keyman/Classes/KMWebBrowser/BookmarksViewController.swift @@ -57,7 +57,7 @@ class BookmarksViewController: UIViewController, UITableViewDelegate, UITableVie message: "", preferredStyle: UIAlertController.Style.alert) alertController.addTextField(configurationHandler: { (textField) in - //listen for changes + // listen for changes NotificationCenter.default.addObserver(self, selector: #selector(BookmarksViewController.handleTextFieldTextChangedNotification(notification:)), name: UITextField.textDidChangeNotification, object: textField) @@ -70,7 +70,7 @@ class BookmarksViewController: UIViewController, UITableViewDelegate, UITableVie self.inputTitleField = textField }) alertController.addTextField(configurationHandler: { (textField) in - //listen for changes + // listen for changes NotificationCenter.default.addObserver(self, selector: #selector(BookmarksViewController.handleTextFieldTextChangedNotification(notification:)), name: UITextField.textDidChangeNotification, object: textField) @@ -207,7 +207,7 @@ class BookmarksViewController: UIViewController, UITableViewDelegate, UITableVie tableView.reloadData() } - //handler + // handler @objc func handleTextFieldTextChangedNotification(notification: NSNotification) { updateAddButtonEnableState() } diff --git a/ios/keyman/Keyman/Keyman/Classes/LogoBackgroundView/KMUnderscoreView.swift b/ios/keyman/Keyman/Keyman/Classes/LogoBackgroundView/KMUnderscoreView.swift index 96e6a2f1ab..689ba469f4 100644 --- a/ios/keyman/Keyman/Keyman/Classes/LogoBackgroundView/KMUnderscoreView.swift +++ b/ios/keyman/Keyman/Keyman/Classes/LogoBackgroundView/KMUnderscoreView.swift @@ -11,7 +11,7 @@ import UIKit class KMUnderscoreView: KMView { override func draw(_ rect: CGRect) { - //percentage based widths for the color bar portion of the logo + // percentage based widths for the color bar portion of the logo let widths: [CGFloat] = [0.6, 0.25, 0.15] let colors: [UIColor] = [ UIColor.keymanOrange, UIColor.keymanRed, diff --git a/lerna.json b/lerna.json index 780730545e..0acd3a3269 100644 --- a/lerna.json +++ b/lerna.json @@ -21,5 +21,5 @@ "ts-node", "typescript" ], - "version": "15.0.216" + "version": "15.0.219" } diff --git a/resources/devbox/macos/keyman.macos.env.sh b/resources/devbox/macos/keyman.macos.env.sh index b6fc5b83d8..34acdfce0f 100644 --- a/resources/devbox/macos/keyman.macos.env.sh +++ b/resources/devbox/macos/keyman.macos.env.sh @@ -17,3 +17,6 @@ export PATH=$ANDROID_HOME/build-tools/30.0.3:$PATH export PATH="/usr/local/opt/openjdk@8/bin:$PATH" export JAVA_HOME=/usr/local/opt/openjdk@8 + +# Python 2.7 +eval "$(pyenv init --path)" diff --git a/resources/devbox/macos/macos.sh b/resources/devbox/macos/macos.sh index ca5568806a..19ebea01bc 100755 --- a/resources/devbox/macos/macos.sh +++ b/resources/devbox/macos/macos.sh @@ -144,7 +144,7 @@ which brew || ( ## Install devchain components -BREW_ALL="bash jq python3 meson ninja coreutils" +BREW_ALL="bash jq python3 meson ninja coreutils pyenv" BREW_WEB="node emscripten openjdk@8" BREW_IOS="swiftlint carthage" BREW_MACOS="carthage cocoapods" @@ -162,6 +162,10 @@ $REQUIRE_MACOS && brew install $BREW_MACOS $REQUIRE_PANDOC && brew install pandoc $REQUIRE_SENTRYCLI && brew install getsentry/tools/sentry-cli +# Add python 2.7.18 from pyenv +pyenv install 2.7.18 +pyenv global 2.7.18 + # Install WINE $REQUIRE_KMCOMP && ( brew tap homebrew/cask-versions diff --git a/resources/gosh/package-lock.json b/resources/gosh/package-lock.json index 52c6bf6913..1b830282b7 100644 --- a/resources/gosh/package-lock.json +++ b/resources/gosh/package-lock.json @@ -1,5 +1,5 @@ { "name": "@keymanapp/resources-gosh", - "version": "15.0.216", + "version": "15.0.219", "lockfileVersion": 1 } diff --git a/resources/gosh/package.json b/resources/gosh/package.json index 88c1df00d1..9f6053eafc 100644 --- a/resources/gosh/package.json +++ b/resources/gosh/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/resources-gosh", - "version": "15.0.216", + "version": "15.0.219", "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 29b4be57ff..7f1f416ab7 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.216", + "version": "15.0.219", "lockfileVersion": 1 } diff --git a/resources/web-environment/package.json b/resources/web-environment/package.json index 001df8b36a..3bad58f8bf 100644 --- a/resources/web-environment/package.json +++ b/resources/web-environment/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/web-environment", - "version": "15.0.216", + "version": "15.0.219", "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.216" + "@keymanapp/resources-gosh": "^15.0.219" } } diff --git a/web/package-lock.json b/web/package-lock.json index 1e3873552f..f448c1391a 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1,6 +1,6 @@ { "name": "keyman", - "version": "15.0.216", + "version": "15.0.219", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/web/package.json b/web/package.json index b952160f48..26e4cb0210 100644 --- a/web/package.json +++ b/web/package.json @@ -1,6 +1,6 @@ { "name": "keyman", - "version": "15.0.216", + "version": "15.0.219", "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.216", - "@keymanapp/web-sentry-manager": "^15.0.216", + "@keymanapp/resources-gosh": "^15.0.219", + "@keymanapp/web-sentry-manager": "^15.0.219", "@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.216", - "@keymanapp/keyboard-processor": "^15.0.216", - "@keymanapp/lexical-model-layer": "^15.0.216", - "@keymanapp/models-types": "^15.0.216", - "@keymanapp/recorder-core": "^15.0.216", - "@keymanapp/web-environment": "^15.0.216", - "@keymanapp/web-utils": "^15.0.216", + "@keymanapp/input-processor": "^15.0.219", + "@keymanapp/keyboard-processor": "^15.0.219", + "@keymanapp/lexical-model-layer": "^15.0.219", + "@keymanapp/models-types": "^15.0.219", + "@keymanapp/recorder-core": "^15.0.219", + "@keymanapp/web-environment": "^15.0.219", + "@keymanapp/web-utils": "^15.0.219", "@types/node": "^11.9.4", "es6-shim": "^0.35.5", "eventemitter3": "^4.0.0" diff --git a/web/source/kmwembedded.ts b/web/source/kmwembedded.ts index f0f0c68cb1..97e4f19956 100644 --- a/web/source/kmwembedded.ts +++ b/web/source/kmwembedded.ts @@ -34,7 +34,7 @@ namespace com.keyman.osk { } } else if(keyName.indexOf('K_ROPT') >= 0) { if(keyDown) { - this.highlightKey(e,false); + this.highlightKey(e,false); if(typeof keyman['hideKeyboard'] == 'function') { keyman['hideKeyboard'](); } @@ -49,10 +49,10 @@ namespace com.keyman.osk { if(device.OS == 'Android') { // assumption - if this file is being loaded, keyman.isEmbedded == true. // Send the subkey array to iOS, with centre,top of base key position /** - * Create a popup key array natively - * + * Create a popup key array natively + * * @param {Object} key base key element - */ + */ VisualKeyboard.prototype.startLongpress = function(this: VisualKeyboard, key: KeyElement): PendingGesture { if(typeof(window['oskCreatePopup']) == 'function') { var xBase = dom.Utils.getAbsoluteX(key) - dom.Utils.getAbsoluteX(this.kbdDiv) + key.offsetWidth/2, @@ -78,11 +78,11 @@ namespace com.keyman.osk { this.keytip = new osk.embedded.KeyTip(window['oskCreateKeyPreview'], window['oskClearKeyPreview']); } }; + } - VisualKeyboard.prototype.waitForFonts = function(this: VisualKeyboard, kfd, ofd) { - // a dummy function; it's only really used for 'native' KMW. - return true; - } + VisualKeyboard.prototype.waitForFonts = function(this: VisualKeyboard, kfd, ofd) { + // a dummy function; it's only really used for 'native' KMW. + return true; } SuggestionManager.prototype.platformHold = function(this: SuggestionManager, suggestionObj: BannerSuggestion, isCustom: boolean) { @@ -129,10 +129,10 @@ namespace com.keyman.text { // Allow definition of application name keymanweb.options['app']=''; - + // Flag to control refreshing of a keyboard that is already loaded keymanweb.mustReloadKeyboard = true; - + // Skip full page initialization - skips native-mode only code keymanweb.isEmbedded = true; @@ -140,14 +140,14 @@ namespace com.keyman.text { keymanweb.setDefaultDeviceOptions = function(opt: com.keyman.OptionType) { opt['attachType'] = 'manual'; device.app=opt['app']; - device.touchable=true; - device.formFactor='phone'; + device.touchable=true; + device.formFactor='phone'; if(navigator && navigator.userAgent && navigator.userAgent.indexOf('iPad') >= 0) device.formFactor='tablet'; if(device.app.indexOf('Mobile') >= 0) device.formFactor='phone'; if(device.app.indexOf('Tablet') >= 0) device.formFactor='tablet'; device.browser='native'; }; - + // Get default style sheet path keymanweb.getStyleSheetPath = function(ssName) { return keymanweb.rootPath+ssName; @@ -191,7 +191,7 @@ namespace com.keyman.text { /** * Force reload of resource - * + * * @param {string} s unmodified URL * @return {string} modified URL */ @@ -200,7 +200,7 @@ namespace com.keyman.text { s = s + '?v=' + t; return s; }; - + util.wait = function() { // Empty stub - this function should not be implemented or used within embedded code routes. console.warn("util.wait() call attempted in embedded mode!"); // Sends log message to embedding app. @@ -213,39 +213,39 @@ namespace com.keyman.text { /** * Refresh element content after change of text (if required) - * + * * @param {Object} Pelem input element - */ - keymanweb.refreshElementContent = function(Pelem) + */ + keymanweb.refreshElementContent = function(Pelem) { if('ontextchange' in keymanweb) keymanweb['ontextchange'](Pelem); }; /** * Set target element text direction (LTR or RTL): not functional for KMEI, KMEA - * + * * @param {Object} Ptarg Target element - */ + */ keymanweb.domManager._SetTargDir = function(Ptarg){}; - + /** * Align input fields (should not be needed with KMEI, KMEA) - * + * * @param {object} eleList A list of specific elements to align. If nil, selects all elements. - * + * **/ keymanweb.alignInputs = function(eleList: HTMLElement[]) {}; /** * Use rotation events to adjust OSK element positions and scaling if necessary - */ + */ keymanweb.handleRotationEvents = function() {}; - + /** * Caret position always determined from the active (but hidden) element - * + * * @return {boolean} - **/ + **/ keymanweb.isPositionSynthesized = function() { return false; @@ -264,7 +264,7 @@ namespace com.keyman.text { /** * Register a lexical model - * + * * @param {com.keyman.text.prediction.ModelSpec} model Spec of the lexical model */ keymanweb['registerModel']=function(model: com.keyman.text.prediction.ModelSpec) { @@ -272,12 +272,12 @@ namespace com.keyman.text { }; /** - * Function called by Android and iOS when a device-implemented keyboard popup + * Function called by Android and iOS when a device-implemented keyboard popup * is displayed or hidden. As this is controlled by the app, we use it as a * trigger for 'embedded'-mode gesture state management. - * + * * @param {boolean} isVisible - * + * **/ keymanweb['popupVisible'] = function(isVisible) { let osk = keymanweb.osk; @@ -287,7 +287,7 @@ namespace com.keyman.text { /* * If a longpress popup was visible, but is no longer, this means that the * associated longpress gesture was cancelled. It is possible for the base - * key to emit if selected at this time; detecton of this is managed by + * key to emit if selected at this time; detecton of this is managed by * the `SubkeyDelegator` class. */ if(!isVisible) { @@ -302,9 +302,9 @@ namespace com.keyman.text { /* * If the popup was not visible, but now is, that means our previously-pending - * longpress is now 'realized' (complete). The OSK relies upon this state + * longpress is now 'realized' (complete). The OSK relies upon this state * information, which will be properly updated by `resolve`. - * + * * Prominent uses of such state info helps prevent change of base key, key * previews, and key output from occurring while a subkey popup remains active. */ @@ -316,9 +316,9 @@ namespace com.keyman.text { /** * Return position of language menu key to KeymanTouch - * + * * @return {string} comma-separated x,y,w,h of language menu key - * + * **/ keymanweb['touchMenuPos'] = function() { let osk = keymanweb.osk; @@ -329,14 +329,14 @@ namespace com.keyman.text { var key: HTMLElement = osk.vkbd.lgKey; // A CSS change of kmd-key-square from position:fixed to position:static was needed // for Android 4.3 to display the OSK correctly, but resulted in the position of - // the menu key not being returned correctly. The following line gets the - // key element, instead of the key-square element, fixes this. It should be + // the menu key not being returned correctly. The following line gets the + // key element, instead of the key-square element, fixes this. It should be // removed again when the key-square elements are all removed as planned. if(typeof key.firstChild != 'undefined' && key.firstChild != null && util.hasClass(key.firstChild,'kmw-key')) { key = key.firstChild; } - var w=key.offsetWidth, + var w=key.offsetWidth, h=key.offsetHeight, // Since the full OSKManager '_Box' is displayed within the keyboards' WebViews, // these calculations should be performed with respect to that, rather than osk.vkbd.kbdDiv. @@ -345,13 +345,13 @@ namespace com.keyman.text { return x+','+y+','+w+','+h; }; - + /** * Accept an external key ID (from KeymanTouch) and pass to the keyboard mapping - * + * * @param {string} keyName key identifier which could contain a display layer and a "functional" layer * e.g: 'shift-K_E+rightalt-shift' - **/ + **/ keymanweb['executePopupKey'] = function(keyName: string) { let osk = keymanweb.osk; var origArg = keyName; @@ -376,7 +376,7 @@ namespace com.keyman.text { return false; } keyName = matches[2] + (matches[3] ? '+' + matches[3] : ''); - + // Note: this assumes Lelem is properly attached and has an element interface. // Currently true in the Android and iOS apps. var Lelem=keymanweb.domManager.lastActiveElement; @@ -394,13 +394,13 @@ namespace com.keyman.text { /** * API endpoint for hardware keystroke events from Android external keyboards - * + * * @param {number} code key identifier * @param {number} shift shift state (0x01=left ctrl 0x02=right ctrl 0x04=left alt 0x08=right alt * 0x10=shift 0x20=ctrl 0x40=alt) * @param {number} lstates lock state (0x0200=no caps 0x0400=num 0x0800=no num 0x1000=scroll 0x2000=no scroll locks) * @return {boolean} false when KMW _has_ fully handled the event and true when not. - **/ + **/ keymanweb['executeHardwareKeystroke'] = function(code, shift, lstates = 0): boolean { if(!keymanweb.core.activeKeyboard || code == 0) { return false; @@ -408,14 +408,14 @@ namespace com.keyman.text { // Clear any pending (non-popup) key keymanweb.osk.vkbd.keyPending = null; - + // Note: this assumes Lelem is properly attached and has an element interface. // Currently true in the Android and iOS apps. var Lelem = keymanweb.domManager.lastActiveElement; - + keymanweb.domManager.initActiveElement(Lelem); - // Check the virtual key + // Check the virtual key var Lkc: com.keyman.text.KeyEvent = { Lmodifiers: shift, vkCode: code, @@ -425,7 +425,7 @@ namespace com.keyman.text { kName: '', device: keymanweb.util.physicalDevice.coreSpec, // As we're executing a hardware keystroke. isSynthetic: false - }; + }; try { // Now that we've manually constructed a proper keystroke-sourced KeyEvent, pass control diff --git a/web/source/osk/visualKeyboard.ts b/web/source/osk/visualKeyboard.ts index bb4c075ca5..eb1ee6a201 100644 --- a/web/source/osk/visualKeyboard.ts +++ b/web/source/osk/visualKeyboard.ts @@ -457,9 +457,8 @@ namespace com.keyman.osk { */ private getInteractiveBoundingRect(): BoundingRect { // Determine the important geometric values involved - const _Box = this.element.offsetParent as HTMLElement; - let oskX = this.element.offsetLeft + (_Box?.offsetLeft || 0); - let oskY = this.element.offsetTop + (_Box?.offsetTop || 0); + let oskX = dom.Utils.getAbsoluteX(this.element); + let oskY = dom.Utils.getAbsoluteY(this.element); // Determine the out-of-bounds threshold at which touch-cancellation should automatically occur. // Assuming square key-squares, we'll use 1/3 the height of a row for bounds detection @@ -476,15 +475,6 @@ namespace com.keyman.osk { bottom: oskY + this.height + buffer }; - // If the OSK is using fixed positioning (thus, viewport-relative), we need to - // convert the 'clientX'-like values into 'pageX'-like values. - if (this.usesFixedPositioning) { - boundingRect.left += window.pageXOffset; - boundingRect.right += window.pageXOffset; - boundingRect.top += window.pageYOffset; - boundingRect.bottom += window.pageYOffset; - } - return boundingRect; } diff --git a/windows/src/developer/TIKE/xml/layoutbuilder/builder.js b/windows/src/developer/TIKE/xml/layoutbuilder/builder.js index 6cae305b1f..6d49f16c27 100644 --- a/windows/src/developer/TIKE/xml/layoutbuilder/builder.js +++ b/windows/src/developer/TIKE/xml/layoutbuilder/builder.js @@ -1446,11 +1446,18 @@ $(function () { builder.updateKeyId(builder.selectedKey()); }, {saveOnce: true}); + const wrapInstant = function(f) { + return function() { + window.setTimeout(f.bind(this), 0); + } + } + $('#inpKeyName') .change(inpKeyNameChange) .autocomplete({ source: builder.lookupKeyNames, - change: inpKeyNameChange + change: inpKeyNameChange, + select: wrapInstant(inpKeyNameChange) }) .on('input', inpKeyNameChange) .blur(function () { @@ -1494,7 +1501,8 @@ $(function () { .change(inpKeyCapChange) .autocomplete({ source: builder.specialKeyNames, - change: inpKeyCapChange + change: inpKeyCapChange, + select: wrapInstant(inpKeyCapChange) }) .mouseup(function () { builder.updateCharacterMap($(this).val(), false); @@ -1721,7 +1729,8 @@ $(function () { .on('input', subKeyNameChange) .autocomplete({ source: builder.lookupKeyNames, - change: subKeyNameChange + change: subKeyNameChange, + select: wrapInstant(subKeyNameChange) }).blur(function () { builder.hasSavedKeyUndo = false; }); @@ -1744,7 +1753,8 @@ $(function () { .change(inpSubKeyCapChange) .autocomplete({ source: builder.specialKeyNames, - change: inpSubKeyCapChange + change: inpSubKeyCapChange, + select: wrapInstant(inpSubKeyCapChange) }) .on('input', inpSubKeyCapChange) .mouseup(function () { diff --git a/windows/src/ext/sentry/Sentry.Client.pas b/windows/src/ext/sentry/Sentry.Client.pas index d1aaf7d67b..74f3183a36 100644 --- a/windows/src/ext/sentry/Sentry.Client.pas +++ b/windows/src/ext/sentry/Sentry.Client.pas @@ -276,11 +276,13 @@ begin {$WARN SYMBOL_PLATFORM OFF} // W1002 Symbol 'CmdLine' is specific to a platform if CmdLine <> nil then begin - sentry_set_tag('keyman.commandline', PAnsiChar(AnsiString(string(CmdLine)))); + sentry_set_extra('keyman.commandline', sentry_value_new_string(PAnsiChar(AnsiString(string(CmdLine))))); end; {$WARN SYMBOL_PLATFORM DEFAULT} - sentry_set_tag('keyman.executable', PAnsiChar(AnsiString(ParamStr(0)))); + sentry_set_extra('keyman.executable.fullpath', sentry_value_new_string(PAnsiChar(AnsiString(ParamStr(0))))); + sentry_set_tag('keyman.executable', PAnsiChar(AnsiString(ExtractFileName(ParamStr(0))))); + // TODO: callback to capture list of keyboard filenames, TSF settings, additional diag? if scfCaptureExceptions in AFlags then begin