diff --git a/HISTORY.md b/HISTORY.md index d9a081a066..fc17d76a2a 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,37 @@ # Keyman Version History +## 15.0.56 alpha 2021-05-27 + +* fix(ios): link, but NOT embed KeymanEngine.xcframework in app exs (#5164) +* feat(common): offline help css (#5157) +* change(ios): help always offline (#5158) + +## 15.0.55 alpha 2021-05-27 + +* fix(ios): artifact upload preparation (#5160) + +## 15.0.54 alpha 2021-05-26 + +* docs(windows): Initial commit - README.md (#5119) +* chore(windows): Update Sentry to 0.4.9 (#5144) +* chore(web): Add CI script to kill BrowserStack tunnel (#5136) +* docs(linux): Update readme (#5147) +* chore(linux): Update changelogs 🍒 (#5146) +* fix(ios): re-enable SKIP_INSTALL (#5155) + +## 15.0.53 alpha 2021-05-25 + +* fix(developer): buffer size for range expansions (#4831) +* feat(web): basic promise wrapper on cloud api call (#5121) +* feat(android/app): Auto-generate Play Store release notes (#5132) +* fix(web): active element selection in multi-touch scenarios (#5134) +* chore(windows): cleanup old .dof, .bdsproj and .cfg files (#5131) +* chore(ios): shift to use of XCFrameworks (#5107) +* chore(ios): imports iOS artifact-upload script for CI use (#5140) +* refactor(ios/engine): "should reload keyboard" now a property of the keyboard (#4847) +* docs(windows): Initial commit - README.md (#5119) +* chore(windows): move to vc++ 2019 (#5143) + ## 15.0.52 alpha 2021-05-24 * chore(android): Update targetSDKVersion to 30 (#5126) diff --git a/VERSION.md b/VERSION.md index e7af67f707..4f82314ed7 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1 +1 @@ -15.0.53 \ No newline at end of file +15.0.57 \ No newline at end of file diff --git a/android/build-help.sh b/android/build-help.sh index 28017caf89..d533119159 100755 --- a/android/build-help.sh +++ b/android/build-help.sh @@ -72,6 +72,7 @@ displayInfo "" \ cd $KEYMAN_ROOT/android/help MDLUA="$KEYMAN_ROOT/resources/build/html-link.lua" +CSS="../../resources/build/offline-help-style-spec.txt" MD=`find . -name "*.md"` DESTHTM="$THIS_DIR/KMAPro/kMAPro/src/main/assets/info" @@ -94,7 +95,7 @@ if $DO_HTM; then OUTFILE="$DESTHTM/${INFILE%.md}.html" echo "Processing $INFILE to $(basename "$OUTFILE")" mkdir -p "$(dirname "$OUTFILE")" - pandoc -s --lua-filter="$MDLUA" -t html -o "$OUTFILE" $INFILE + pandoc -s -H "$CSS" --lua-filter="$MDLUA" -t html -o "$OUTFILE" $INFILE done fi diff --git a/common/core/desktop/debian/changelog b/common/core/desktop/debian/changelog index c3e29e7235..36e12f54dc 100644 --- a/common/core/desktop/debian/changelog +++ b/common/core/desktop/debian/changelog @@ -1,3 +1,9 @@ +keyman-keyboardprocessor (14.0.273-1) unstable; urgency=medium + + * Keyman 14 + + -- Eberhard Beilharz Mon, 26 Apr 2021 18:24:41 +0200 + keyman-keyboardprocessor (11.0.101-3) unstable; urgency=medium * Team upload. diff --git a/common/core/desktop/doc/BUILDING.md b/common/core/desktop/doc/BUILDING.md index fa9e65340e..bb7ef01ce7 100644 --- a/common/core/desktop/doc/BUILDING.md +++ b/common/core/desktop/doc/BUILDING.md @@ -3,8 +3,8 @@ ## Prerequisites - Python 3 -- Meson build system. -- C++14 or later compiler (VC++ 2017 or later for Windows). +- Meson build system 0.50 or later. +- C++14 or later compiler (VC++ 2019 or later for Windows). - lib std::fs - kmcomp (for tests) -- must be added to path diff --git a/common/core/web/input-processor/package-lock.json b/common/core/web/input-processor/package-lock.json index d31f004011..391956ab66 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.53", + "version": "15.0.57", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/common/core/web/input-processor/package.json b/common/core/web/input-processor/package.json index c643d2999a..4b6d0cfced 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.53", + "version": "15.0.57", "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.53", - "@keymanapp/resources-gosh": "^15.0.53", + "@keymanapp/lexical-model-compiler": "^15.0.57", + "@keymanapp/resources-gosh": "^15.0.57", "@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.53", - "@keymanapp/lexical-model-layer": "^15.0.53", - "@keymanapp/models-types": "^15.0.53", - "@keymanapp/web-environment": "^15.0.53", - "@keymanapp/web-utils": "^15.0.53", + "@keymanapp/keyboard-processor": "^15.0.57", + "@keymanapp/lexical-model-layer": "^15.0.57", + "@keymanapp/models-types": "^15.0.57", + "@keymanapp/web-environment": "^15.0.57", + "@keymanapp/web-utils": "^15.0.57", "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 a1f869b1fd..1a6bde7b1e 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.53", + "version": "15.0.57", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/common/core/web/keyboard-processor/package.json b/common/core/web/keyboard-processor/package.json index 7e7792f140..6d1bdae1c3 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.53", + "version": "15.0.57", "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.53", + "@keymanapp/resources-gosh": "^15.0.57", "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.53", - "@keymanapp/web-environment": "^15.0.53", - "@keymanapp/web-utils": "^15.0.53", + "@keymanapp/models-types": "^15.0.57", + "@keymanapp/web-environment": "^15.0.57", + "@keymanapp/web-utils": "^15.0.57", "@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 70548bdd1c..57d189a8ff 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.53", + "version": "15.0.57", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/common/core/web/tools/recorder/package.json b/common/core/web/tools/recorder/package.json index 0924d0324e..d785fa1e2c 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.53", + "version": "15.0.57", "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.53", - "@keymanapp/models-types": "^15.0.53", - "@keymanapp/web-environment": "^15.0.53", - "@keymanapp/web-utils": "^15.0.53" + "@keymanapp/keyboard-processor": "^15.0.57", + "@keymanapp/models-types": "^15.0.57", + "@keymanapp/web-environment": "^15.0.57", + "@keymanapp/web-utils": "^15.0.57" }, "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 f779736f25..488bb39327 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.53", + "version": "15.0.57", "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 64af8d2b38..eafd207172 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.53", + "version": "15.0.57", "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.53", + "@keymanapp/web-environment": "^15.0.57", "@sentry/browser": "^5.27.4" } } diff --git a/common/core/web/utils/package-lock.json b/common/core/web/utils/package-lock.json index 23f15fede9..21b9f46d66 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.53", + "version": "15.0.57", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/common/core/web/utils/package.json b/common/core/web/utils/package.json index 421fc38389..51080c56df 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.53", + "version": "15.0.57", "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.53", - "@keymanapp/web-environment": "^15.0.53", + "@keymanapp/resources-gosh": "^15.0.57", + "@keymanapp/web-environment": "^15.0.57", "@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 dbb22d2a26..15e130519d 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.53", + "version": "15.0.57", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/common/models/templates/package.json b/common/models/templates/package.json index bf49efc5fd..4bd5126358 100644 --- a/common/models/templates/package.json +++ b/common/models/templates/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/models-templates", - "version": "15.0.53", + "version": "15.0.57", "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.53", - "@keymanapp/web-utils": "^15.0.53", + "@keymanapp/models-types": "^15.0.57", + "@keymanapp/web-utils": "^15.0.57", "@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.53" + "@keymanapp/models-wordbreakers": "^15.0.57" } } diff --git a/common/models/types/package-lock.json b/common/models/types/package-lock.json index cfade32724..4912ca3eb6 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.53", + "version": "15.0.57", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/common/models/types/package.json b/common/models/types/package.json index 538895fcf5..0992794a06 100644 --- a/common/models/types/package.json +++ b/common/models/types/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/models-types", - "version": "15.0.53", + "version": "15.0.57", "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 6f59583b1a..3baa586c43 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.53", + "version": "15.0.57", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/common/models/wordbreakers/package.json b/common/models/wordbreakers/package.json index a318cac42a..6e96458679 100644 --- a/common/models/wordbreakers/package.json +++ b/common/models/wordbreakers/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/models-wordbreakers", - "version": "15.0.53", + "version": "15.0.57", "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.53", + "@keymanapp/models-types": "^15.0.57", "@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 11673f0fe4..c214af7e4b 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.53", + "version": "15.0.57", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/common/predictive-text/package.json b/common/predictive-text/package.json index 2e0f909a3f..2374729f78 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.53", + "version": "15.0.57", "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.53", - "@keymanapp/resources-gosh": "^15.0.53", + "@keymanapp/models-types": "^15.0.57", + "@keymanapp/resources-gosh": "^15.0.57", "@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.53", - "@keymanapp/models-wordbreakers": "^15.0.53", - "@keymanapp/web-environment": "^15.0.53", - "@keymanapp/web-utils": "^15.0.53", + "@keymanapp/models-templates": "^15.0.57", + "@keymanapp/models-wordbreakers": "^15.0.57", + "@keymanapp/web-environment": "^15.0.57", + "@keymanapp/web-utils": "^15.0.57", "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 85fabd55e9..a8ebd0a257 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.53", + "version": "15.0.57", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/developer/js/package.json b/developer/js/package.json index 744433ab35..c0b4139a89 100644 --- a/developer/js/package.json +++ b/developer/js/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/lexical-model-compiler", - "version": "15.0.53", + "version": "15.0.57", "description": "Keyman Developer lexical model compiler", "keywords": [ "keyboard", @@ -37,14 +37,14 @@ "node": ">=12.0.0" }, "dependencies": { - "@keymanapp/models-types": "^15.0.53", + "@keymanapp/models-types": "^15.0.57", "commander": "^3.0.0", "typescript": "^3.8.3", "xml2js": "^0.4.19" }, "devDependencies": { - "@keymanapp/models-templates": "^15.0.53", - "@keymanapp/models-wordbreakers": "^15.0.53", + "@keymanapp/models-templates": "^15.0.57", + "@keymanapp/models-wordbreakers": "^15.0.57", "@types/chai": "^4.1.7", "@types/mocha": "^5.2.7", "@types/node": "^10.14.6", diff --git a/ios/.gitignore b/ios/.gitignore index afbd278bc2..34a4f715a7 100644 --- a/ios/.gitignore +++ b/ios/.gitignore @@ -19,6 +19,9 @@ engine/KMEI/KeymanEngine/resources/Keyman.bundle/Contents/Resources/keyman-sentr Keyman 2* Carthage +# Path for build artifact upload preparation +upload + # Default resource packages (which may be downloaded automatically via build-script engine/KMEI/KeymanEngine/resources/Keyman.bundle/Contents/Resources/*.kmp diff --git a/ios/README.md b/ios/README.md index c22dc6a394..cacaabf271 100644 --- a/ios/README.md +++ b/ios/README.md @@ -11,6 +11,7 @@ * Coreutils (`brew install coreutils`) * sentry-cli (`brew install getsentry/tools/sentry-cli`) to utilize Sentry-based error reporting * jq (`brew install jq`) +* `bash` (`brew install bash`) Note that the `brew` command mentioned above is Homebrew, which may be found at https://brew.sh/. While not strictly necessary, it certainly simplifies installing the prerequisites above. diff --git a/ios/build-help.sh b/ios/build-help.sh index 3a10a1f071..328d0fa77f 100755 --- a/ios/build-help.sh +++ b/ios/build-help.sh @@ -72,6 +72,7 @@ displayInfo "" \ cd $KEYMAN_ROOT/ios/help MDLUA="$KEYMAN_ROOT/resources/build/html-link.lua" +CSS="../../resources/build/offline-help-style-spec.txt" MD=`find . -name "*.md"` DESTHTM="$THIS_DIR/keyman/Keyman/resources/OfflineHelp.bundle/Contents/Resources" @@ -94,7 +95,7 @@ if $DO_HTM; then OUTFILE="$DESTHTM/${INFILE%.md}.html" echo "Processing $INFILE to $(basename "$OUTFILE")" mkdir -p "$(dirname "$OUTFILE")" - pandoc -s --lua-filter="$MDLUA" -t html -o "$OUTFILE" $INFILE + pandoc -s -H "$CSS" --lua-filter="$MDLUA" -t html -o "$OUTFILE" $INFILE done fi diff --git a/ios/engine/KMEI/KeymanEngine.xcodeproj/project.pbxproj b/ios/engine/KMEI/KeymanEngine.xcodeproj/project.pbxproj index ecbebef3bd..029cb1bd4f 100644 --- a/ios/engine/KMEI/KeymanEngine.xcodeproj/project.pbxproj +++ b/ios/engine/KMEI/KeymanEngine.xcodeproj/project.pbxproj @@ -1704,7 +1704,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = SystemKeyboard/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1750,7 +1750,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = SystemKeyboard/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1893,7 +1893,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = KeymanEngine/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1904,7 +1904,6 @@ PRODUCT_BUNDLE_IDENTIFIER = org.sil.Keyman.ios.Engine; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = NO; STRIP_INSTALLED_PRODUCT = NO; STRIP_SWIFT_SYMBOLS = NO; SUPPORTS_MACCATALYST = NO; @@ -1949,7 +1948,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = KeymanEngine/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1960,7 +1959,6 @@ PRODUCT_BUNDLE_IDENTIFIER = org.sil.Keyman.ios.Engine; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = NO; SUPPORTS_MACCATALYST = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; @@ -2016,7 +2014,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = "KeymanEngine/resources/Keyman.bundle/Contents/Resources/KeymanEngine-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 13.2; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -2053,7 +2051,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = "KeymanEngine/resources/Keyman.bundle/Contents/Resources/KeymanEngine-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 13.2; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -2107,6 +2105,7 @@ GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 9.0; KEYMAN_ROOT = "$(SRCROOT)/../../.."; + SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; }; name = "Debug + Sentry"; @@ -2145,7 +2144,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = KeymanEngine/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -2156,7 +2155,6 @@ PRODUCT_BUNDLE_IDENTIFIER = org.sil.Keyman.ios.Engine; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = NO; SUPPORTS_MACCATALYST = NO; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -2189,7 +2187,7 @@ DEFINES_MODULE = YES; DEVELOPMENT_TEAM = 3YE4W86L3G; ENABLE_BITCODE = NO; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -2239,7 +2237,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = SystemKeyboard/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -2328,7 +2326,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = "KeymanEngine/resources/Keyman.bundle/Contents/Resources/KeymanEngine-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 13.2; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -2382,6 +2380,7 @@ GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 9.0; KEYMAN_ROOT = "$(SRCROOT)/../../.."; + SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG NO_SENTRY"; }; name = Debug; @@ -2424,6 +2423,7 @@ GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 9.0; KEYMAN_ROOT = "$(SRCROOT)/../../.."; + SKIP_INSTALL = YES; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; }; @@ -2442,7 +2442,7 @@ DEFINES_MODULE = YES; DEVELOPMENT_TEAM = 3YE4W86L3G; ENABLE_BITCODE = NO; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -2475,7 +2475,7 @@ DEFINES_MODULE = YES; DEVELOPMENT_TEAM = 3YE4W86L3G; ENABLE_BITCODE = NO; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/ios/engine/KMEI/KeymanEngine/Classes/Colors+Extension.swift b/ios/engine/KMEI/KeymanEngine/Classes/Colors+Extension.swift index c22556f7bd..d719e55dd7 100644 --- a/ios/engine/KMEI/KeymanEngine/Classes/Colors+Extension.swift +++ b/ios/engine/KMEI/KeymanEngine/Classes/Colors+Extension.swift @@ -24,95 +24,50 @@ extension Colors { // The primary color used for selected UI elements in the settings menu. public static var selectionPrimary: UIColor { get { - if #available(iOS 11.0, *) { - return UIColor(named: "SelectionPrimary")! - } else { - return UIColor(red: 204.0 / 255.0, - green: 136.0 / 255.0, - blue: 34.0 / 255.0, - alpha: 1.0) - } + return UIColor(named: "SelectionPrimary")! } } // The primary color used for selected UI elements in Get Started menu. public static var selectionSecondary: UIColor { get { - if #available(iOS 11.0, *) { - return UIColor(named: "SelectionSecondary")! - } else { - return UIColor(red: 95.0 / 255.0, - green: 196.0 / 255.0, - blue: 217.0 / 255.0, - alpha: 1.0) - } + return UIColor(named: "SelectionSecondary")! } } public static var statusToolbar: UIColor { get { - if #available(iOS 11.0, *) { - return UIColor(named: "StatusToolbar")! - } else { - return UIColor(red: 0.5, - green: 0.75, - blue: 0.25, - alpha: 0.9) - } + return UIColor(named: "StatusToolbar")! } } public static var statusResourceUpdateButton: UIColor { get { - if #available(iOS 11.0, *) { - return UIColor(named: "StatusResourceUpdateButton")! - } else { - return UIColor(red: 0.75, - green: 1.0, - blue: 0.5, - alpha: 1.0) - } + return UIColor(named: "StatusResourceUpdateButton")! } } public static var spinnerBackground: UIColor { get { - if #available(iOS 11.0, *) { - return UIColor(named: "SpinnerBackground")! - } else { - return UIColor(white: 0.5, - alpha: 0.8) - } + return UIColor(named: "SpinnerBackground")! } } public static var labelNormal: UIColor { get { - if #available(iOS 11.0, *) { - return UIColor(named: "LabelNormal")! - } else { - return UIColor.lightGray - } + return UIColor(named: "LabelNormal")! } } public static var labelHighlighted: UIColor { get { - if #available(iOS 11.0, *) { - return UIColor(named: "LabelHighlighted")! - } else { - return UIColor.darkGray - } + return UIColor(named: "LabelHighlighted")! } } public static var listSeparator: UIColor { get { - if #available(iOS 11.0, *) { - return UIColor(named: "ListSeparator")! - } else { - return UIColor.lightGray - } + return UIColor(named: "ListSeparator")! } } } diff --git a/ios/engine/KMEI/KeymanEngine/Classes/Colors.swift b/ios/engine/KMEI/KeymanEngine/Classes/Colors.swift index 6ab3352616..3b105870fc 100644 --- a/ios/engine/KMEI/KeymanEngine/Classes/Colors.swift +++ b/ios/engine/KMEI/KeymanEngine/Classes/Colors.swift @@ -32,103 +32,50 @@ public class Colors { public static var popupKey: UIColor { get { - if #available(iOSApplicationExtension 11.0, *) { - return UIColor(named: "KeyPrimary", in: engineBundle, compatibleWith: nil)! - } else { - return UIColor(red: 244.0 / 255.0, - green: 244.0 / 255.0, - blue: 244.0 / 255.0, - alpha: 1.0) - } + return UIColor(named: "KeyPrimary", in: engineBundle, compatibleWith: nil)! } } public static var keyText: UIColor { get { - if #available(iOSApplicationExtension 11.0, *) { - return UIColor(named: "KeyText", in: engineBundle, compatibleWith: nil)! - } else { - return UIColor.black - } + return UIColor(named: "KeyText", in: engineBundle, compatibleWith: nil)! } } public static var popupKeyHighlighted: UIColor { get { - if #available(iOSApplicationExtension 11.0, *) { - return UIColor(named: "SelectedKey", in: engineBundle, compatibleWith: nil)! - } else { - return UIColor(red: 136.0 / 255.0, - green: 136.0 / 255.0, - blue: 1.0, - alpha: 1.0) - } + return UIColor(named: "SelectedKey", in: engineBundle, compatibleWith: nil)! } } // I'm not 100% on the distinction, but this should be fine for now. public static var popupKeyTint: UIColor { get { - if #available(iOSApplicationExtension 11.0, *) { - return UIColor(named: "SelectedKey", in: engineBundle, compatibleWith: nil)! - } else { - return UIColor(red: 181.0 / 255.0, - green: 181.0 / 255.0, - blue: 181.0 / 255.0, - alpha: 1.0) - } + return UIColor(named: "SelectedKey", in: engineBundle, compatibleWith: nil)! } } public static var keyboardBackground: UIColor { get { - if #available(iOSApplicationExtension 11.0, *) { - return UIColor(named: "KeyboardBackground", in: engineBundle, compatibleWith: nil)! - } else { - return UIColor(red: 210.0 / 255.0, - green: 214.0 / 255.0, - blue: 220.0 / 255.0, - alpha: 1.0) - } + return UIColor(named: "KeyboardBackground", in: engineBundle, compatibleWith: nil)! } } public static var keyboardSelectionPrimary: UIColor { get { - if #available(iOS 11.0, *) { - return UIColor(named: "KeyboardSelectionPrimary", in: engineBundle, compatibleWith: nil)! - } else { - return UIColor(red: 204.0 / 255.0, - green: 136.0 / 255.0, - blue: 34.0 / 255.0, - alpha: 1.0) - } + return UIColor(named: "KeyboardSelectionPrimary", in: engineBundle, compatibleWith: nil)! } } public static var helpBubbleGradient1: UIColor { get { - if #available(iOSApplicationExtension 11.0, *) { - return UIColor(named: "HelpBubbleGradient1", in: engineBundle, compatibleWith: nil)! - } else { - return UIColor(red: 253.0 / 255.0, - green: 244.0 / 255.0, - blue: 196.0 / 255.0, - alpha: 1.0) - } + return UIColor(named: "HelpBubbleGradient1", in: engineBundle, compatibleWith: nil)! } } public static var helpBubbleGradient2: UIColor { get { - if #available(iOSApplicationExtension 11.0, *) { - return UIColor(named: "HelpBubbleGradient2", in: engineBundle, compatibleWith: nil)! - } else { - return UIColor(red: 233.0 / 255.0, - green: 224.0 / 255.0, - blue: 176.0 / 255.0, - alpha: 1.0) - } + return UIColor(named: "HelpBubbleGradient2", in: engineBundle, compatibleWith: nil)! } } } diff --git a/ios/engine/KMEI/KeymanEngine/Classes/Extension/JSONDecoder.DateDecodingStrategy+ISO8601Fallback.swift b/ios/engine/KMEI/KeymanEngine/Classes/Extension/JSONDecoder.DateDecodingStrategy+ISO8601Fallback.swift index ed187adfbb..3d54485496 100644 --- a/ios/engine/KMEI/KeymanEngine/Classes/Extension/JSONDecoder.DateDecodingStrategy+ISO8601Fallback.swift +++ b/ios/engine/KMEI/KeymanEngine/Classes/Extension/JSONDecoder.DateDecodingStrategy+ISO8601Fallback.swift @@ -16,13 +16,7 @@ extension JSONDecoder.DateDecodingStrategy { return .formatted(formatter) } static var ios8601WithFallback: JSONDecoder.DateDecodingStrategy { - if #available(iOS 10.0, *) { - return .iso8601 - } - let formatter = DateFormatter() - formatter.locale = Locale(identifier: "en_US_POSIX") - formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ" - return .formatted(formatter) + return .iso8601 } static var ios8601WithMilliseconds: JSONDecoder.DateDecodingStrategy { diff --git a/ios/engine/KMEI/KeymanEngine/Classes/InputViewController.swift b/ios/engine/KMEI/KeymanEngine/Classes/InputViewController.swift index 2df1429312..a254a0df2b 100644 --- a/ios/engine/KMEI/KeymanEngine/Classes/InputViewController.swift +++ b/ios/engine/KMEI/KeymanEngine/Classes/InputViewController.swift @@ -73,34 +73,18 @@ private class CustomInputView: UIInputView, UIInputViewAudioFeedback { func setConstraints() { let innerView = keymanWeb.view! - var guide: UILayoutGuide - var conditionalGuide: Bool = false - - if #available(iOSApplicationExtension 11.0, *) { - guide = self.safeAreaLayoutGuide - conditionalGuide = true - } else { - guide = self.layoutMarginsGuide - } + let guide = self.safeAreaLayoutGuide // Fallback on earlier versions innerView.topAnchor.constraint(equalTo: guide.topAnchor).isActive = true innerView.bottomAnchor.constraint(equalTo: guide.bottomAnchor).isActive = true - if conditionalGuide { - innerView.leftAnchor.constraint(equalTo: guide.leftAnchor).isActive = true - innerView.rightAnchor.constraint(equalTo: guide.rightAnchor).isActive = true - } else { - innerView.leftAnchor.constraint(equalTo: self.leftAnchor).isActive = true - innerView.rightAnchor.constraint(equalTo: self.rightAnchor).isActive = true - } + + innerView.leftAnchor.constraint(equalTo: guide.leftAnchor).isActive = true + innerView.rightAnchor.constraint(equalTo: guide.rightAnchor).isActive = true // Allow these to be broken if/as necessary to resolve layout issues. - var kbdWidthConstraint: NSLayoutConstraint - if conditionalGuide { - kbdWidthConstraint = innerView.widthAnchor.constraint(equalTo: guide.widthAnchor) - } else { - kbdWidthConstraint = innerView.widthAnchor.constraint(equalTo: self.widthAnchor) - } + let kbdWidthConstraint = innerView.widthAnchor.constraint(equalTo: guide.widthAnchor) + kbdWidthConstraint.priority = .defaultHigh kbdWidthConstraint.isActive = true @@ -166,7 +150,6 @@ open class InputViewController: UIInputViewController, KeymanWebDelegate { var landscapeConstraint: NSLayoutConstraint? private var keymanWeb: KeymanWebViewController - private var swallowBackspaceTextChange: Bool = false open class var isPortrait: Bool { @@ -179,14 +162,6 @@ open class InputViewController: UIInputViewController, KeymanWebDelegate { return scaling?.bannerHeight ?? 38 // default for iPhone SE, older/smaller devices } - open override var hasFullAccess: Bool { - if #available(iOS 11.0, *) { - // Nice and straight-forward here! - return super.hasFullAccess - } - return Storage.shared != nil - } - private var keyboardListCount: Int { return Storage.active.userDefaults.userKeyboards?.count ?? 0 } @@ -267,8 +242,8 @@ open class InputViewController: UIInputViewController, KeymanWebDelegate { if (!Manager.shared.didSynchronize || shouldSynchronize) && Storage.shared != nil { Manager.shared.synchronizeSWKeyboard() - if Manager.shared.currentKeyboardID != nil || Manager.shared.shouldReloadKeyboard { - Manager.shared.shouldReloadKeyboard = true + if Manager.shared.currentKeyboardID != nil || keymanWeb.shouldReload { + keymanWeb.shouldReload = true reload() } Manager.shared.didSynchronize = true @@ -280,10 +255,7 @@ open class InputViewController: UIInputViewController, KeymanWebDelegate { open override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) - - if Manager.shared.shouldReloadKeyboard { - self.reload() - } + self.reloadIfNeeded() } open override func viewDidAppear(_ animated: Bool) { @@ -304,7 +276,7 @@ open class InputViewController: UIInputViewController, KeymanWebDelegate { // Necessary for existing infrastructure to resend info for the keyboard after reloading // as system keyboard. Do NOT perform if in-app, as this unnecessarily resets the WebView. if(Manager.shared.isSystemKeyboard) { - Manager.shared.shouldReloadKeyboard = true + keymanWeb.shouldReload = true } } @@ -356,11 +328,9 @@ open class InputViewController: UIInputViewController, KeymanWebDelegate { // A full-context deletion will report numCharsToDelete == 0 and won't // otherwise delete selected text. - if #available(iOSApplicationExtension 11.0, *) { - if let selected = textDocumentProxy.selectedText { - if selected.count > 0 { - textDocumentProxy.deleteBackward() - } + if let selected = textDocumentProxy.selectedText { + if selected.count > 0 { + textDocumentProxy.deleteBackward() } } return @@ -455,12 +425,7 @@ open class InputViewController: UIInputViewController, KeymanWebDelegate { // These require the view to appear - parent and our relationship with it must exist! private func setOuterConstraints() { var baseWidthConstraint: NSLayoutConstraint - if #available(iOSApplicationExtension 11.0, *) { - baseWidthConstraint = self.inputView!.widthAnchor.constraint(equalTo: parent!.view.safeAreaLayoutGuide.widthAnchor) - } else { - //baseWidthConstraint = self.inputView!.widthAnchor.constraint(equalTo: parent!.view.layoutMarginsGuide.widthAnchor) - baseWidthConstraint = self.inputView!.widthAnchor.constraint(equalTo: parent!.view.widthAnchor) - } + baseWidthConstraint = self.inputView!.widthAnchor.constraint(equalTo: parent!.view.safeAreaLayoutGuide.widthAnchor) baseWidthConstraint.priority = UILayoutPriority(rawValue: 999) baseWidthConstraint.isActive = true } @@ -528,10 +493,25 @@ open class InputViewController: UIInputViewController, KeymanWebDelegate { func reload() { keymanWeb.reloadKeyboard() } + + func reloadIfNeeded() { + if keymanWeb.shouldReload { + reload() + keymanWeb.shouldReload = false + } + } func setKeyboard(_ kb: InstallableKeyboard) { keymanWeb.setKeyboard(kb) } + + public func setShouldReload() { + keymanWeb.shouldReload = true + } + + internal var shouldReload: Bool { + return keymanWeb.shouldReload + } func registerLexicalModel(_ lm: InstallableLexicalModel) { keymanWeb.registerLexicalModel(lm) diff --git a/ios/engine/KMEI/KeymanEngine/Classes/KeymanWebViewController.swift b/ios/engine/KMEI/KeymanEngine/Classes/KeymanWebViewController.swift index e4d059ba92..efc8207b7e 100644 --- a/ios/engine/KMEI/KeymanEngine/Classes/KeymanWebViewController.swift +++ b/ios/engine/KMEI/KeymanEngine/Classes/KeymanWebViewController.swift @@ -61,6 +61,7 @@ class KeymanWebViewController: UIViewController { /// when predictive text is not active private var bannerImgPath: String = "" + var shouldReload: Bool = true var isLoading: Bool = false private var currentText: String = "" @@ -569,17 +570,12 @@ extension KeymanWebViewController: WKScriptMessageHandler { // Not usable by older iPhone models. AudioServicesPlaySystemSound(kSystemSoundID_MediumVibrate) } else { // if vibrationSupport == .taptic - if #available(iOSApplicationExtension 10.0, *) { - // Available with iPhone 7 and beyond, we can now produce nicely customized haptic feedback. - // We use this style b/c it's short, and in essence it is a minor UI element collision - - // a single key with blocked (erroneous) output. - // Oddly, is a closer match to SystemSoundID 1520 than 1521. - let vibrator = UIImpactFeedbackGenerator(style: UIImpactFeedbackGenerator.FeedbackStyle.heavy) - vibrator.impactOccurred() - } else { - // Fallback on earlier feedback style - AudioServicesPlaySystemSound(kSystemSoundID_MediumVibrate) - } + // Available with iPhone 7 and beyond, we can now produce nicely customized haptic feedback. + // We use this style b/c it's short, and in essence it is a minor UI element collision - + // a single key with blocked (erroneous) output. + // Oddly, is a closer match to SystemSoundID 1520 than 1521. + let vibrator = UIImpactFeedbackGenerator(style: UIImpactFeedbackGenerator.FeedbackStyle.heavy) + vibrator.impactOccurred() } } } @@ -616,11 +612,10 @@ extension KeymanWebViewController: KeymanWebDelegate { } setDeviceType(UIDevice.current.userInterfaceIdiom) - - let shouldReloadKeyboard = Manager.shared.shouldReloadKeyboard + var newKb = Manager.shared.currentKeyboard - if !shouldReloadKeyboard { // otherwise, we automatically reload anyway. + if !shouldReload { // otherwise, we automatically reload anyway. let userData = Manager.shared.isSystemKeyboard ? UserDefaults.standard : Storage.active.userDefaults if newKb == nil { if let id = userData.currentKeyboardID { @@ -642,7 +637,7 @@ extension KeymanWebViewController: KeymanWebDelegate { _ = Manager.shared.setKeyboard(newKb!) } - // in case `shouldReloadKeyboard == true`. Is set otherwise above. + // in case `shouldReload == true`. Is set otherwise above. if(newKb == nil) { newKb = Defaults.keyboard } @@ -655,10 +650,10 @@ extension KeymanWebViewController: KeymanWebDelegate { fixLayout() NotificationCenter.default.post(name: Notifications.keyboardLoaded, object: self, value: newKb!) - if shouldReloadKeyboard { + if shouldReload { NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(self.resetKeyboard), object: nil) perform(#selector(self.resetKeyboard), with: nil, afterDelay: 0.25) - Manager.shared.shouldReloadKeyboard = false + shouldReload = false } } diff --git a/ios/engine/KMEI/KeymanEngine/Classes/Manager.swift b/ios/engine/KMEI/KeymanEngine/Classes/Manager.swift index ec02b892af..5497c79897 100644 --- a/ios/engine/KMEI/KeymanEngine/Classes/Manager.swift +++ b/ios/engine/KMEI/KeymanEngine/Classes/Manager.swift @@ -141,9 +141,6 @@ public class Manager: NSObject, UIGestureRecognizerDelegate { } } - // Set to true on init - this allows other engine consumers to set the - // keyboard before it displays. - var shouldReloadKeyboard = true var shouldReloadLexicalModel = false var _inputViewController: InputViewController? @@ -279,7 +276,7 @@ public class Manager: NSObject, UIGestureRecognizerDelegate { // // We MUST NOT shortcut this method as a result; doing so may (rarely) result in the infamous // blank keyboard bug! - if kb.fullID == currentKeyboardID && !self.isSystemKeyboard && !self.shouldReloadKeyboard { + if kb.fullID == currentKeyboardID && !self.isSystemKeyboard && !inputViewController.shouldReload { SentryManager.breadcrumbAndLog("Keyboard unchanged: \(kb.fullID)") return false // throw KeyboardError.unchanged @@ -754,6 +751,7 @@ public class Manager: NSObject, UIGestureRecognizerDelegate { // true source of the problems. viewController.dismiss(animated: false) showKeyboard() + inputViewController.reloadIfNeeded() NotificationCenter.default.post(name: Notifications.keyboardPickerDismissed, object: self, value: ()) } diff --git a/ios/engine/KMEI/KeymanEngine/Classes/Resource Management/PackageInstallViewController.swift b/ios/engine/KMEI/KeymanEngine/Classes/Resource Management/PackageInstallViewController.swift index 748edfacab..717a824c5e 100644 --- a/ios/engine/KMEI/KeymanEngine/Classes/Resource Management/PackageInstallViewController.swift +++ b/ios/engine/KMEI/KeymanEngine/Classes/Resource Management/PackageInstallViewController.swift @@ -352,11 +352,11 @@ public class PackageInstallViewController: UIViewCon let selectedResources = self.package.installableResourceSets.flatMap { $0.filter { selectedLanguageCodes.contains($0.languageID) }} as! [Resource] // Always reload after installing or updating resources. - Manager.shared.shouldReloadKeyboard = true + Manager.shared.inputViewController.setShouldReload() self.pickingCompletionHandler(selectedResources.map { $0.typedFullID }) // Prevent swipe dismissal. - if #available(iOSApplicationExtension 13.0, *) { + if #available(iOS 13.0, *) { self.isModalInPresentation = true } @@ -375,7 +375,7 @@ public class PackageInstallViewController: UIViewCon // First, show the package's welcome - if it exists. if let welcomeVC = PackageWebViewController(for: package, page: .welcome) { // Prevent swipe dismissal. - if #available(iOSApplicationExtension 13.0, *) { + if #available(iOS 13.0, *) { welcomeVC.isModalInPresentation = true } @@ -467,11 +467,7 @@ public class PackageInstallViewController: UIViewCon } else { let selectionColor = UIView() - if #available(iOSApplicationExtension 11.0, *) { - selectionColor.backgroundColor = UIColor(named: "SelectionPrimary") - } else { - selectionColor.backgroundColor = Colors.selectionPrimary - } + selectionColor.backgroundColor = Colors.selectionPrimary cell = UITableViewCell(style: .subtitle, reuseIdentifier: cellIdentifier) cell.selectedBackgroundView = selectionColor diff --git a/ios/engine/KMEI/KeymanEngine/Classes/Settings/InstalledLanguagesViewController.swift b/ios/engine/KMEI/KeymanEngine/Classes/Settings/InstalledLanguagesViewController.swift index b6c7b85b17..8b67cc0ff8 100644 --- a/ios/engine/KMEI/KeymanEngine/Classes/Settings/InstalledLanguagesViewController.swift +++ b/ios/engine/KMEI/KeymanEngine/Classes/Settings/InstalledLanguagesViewController.swift @@ -197,11 +197,7 @@ public class InstalledLanguagesViewController: UITableViewController, UIAlertVie } else { let selectionColor = UIView() - if #available(iOSApplicationExtension 11.0, *) { - selectionColor.backgroundColor = UIColor(named: "SelectionPrimary") - } else { - selectionColor.backgroundColor = Colors.selectionPrimary - } + selectionColor.backgroundColor = Colors.selectionPrimary if keyboards.count < 2 { cell = KeyboardNameTableViewCell(style: .subtitle, reuseIdentifier: cellIdentifier) @@ -310,6 +306,7 @@ public class InstalledLanguagesViewController: UITableViewController, UIAlertVie switch(package.resourceType()) { case .keyboard: + Manager.shared.inputViewController.setShouldReload() msg = NSLocalizedString("notification-download-success-keyboard", bundle: engineBundle, comment: "") case .lexicalModel: msg = NSLocalizedString("notification-download-success-lexical-model", bundle: engineBundle, comment: "") diff --git a/ios/engine/KMEI/KeymanEngine/Classes/Settings/LanguageSettingsViewController.swift b/ios/engine/KMEI/KeymanEngine/Classes/Settings/LanguageSettingsViewController.swift index e8f8c96c0b..89d1a95412 100644 --- a/ios/engine/KMEI/KeymanEngine/Classes/Settings/LanguageSettingsViewController.swift +++ b/ios/engine/KMEI/KeymanEngine/Classes/Settings/LanguageSettingsViewController.swift @@ -151,10 +151,9 @@ class LanguageSettingsViewController: UITableViewController { doPredictionsSwitch!.isOn = userDefaults.predictSettingForLanguage(languageID: self.language.id) doPredictionsSwitch!.addTarget(self, action: #selector(self.predictionSwitchValueChanged), for: .valueChanged) cell.addSubview(doPredictionsSwitch!) - if #available(iOSApplicationExtension 9.0, *) { - doPredictionsSwitch!.rightAnchor.constraint(equalTo: cell.layoutMarginsGuide.rightAnchor).isActive = true - doPredictionsSwitch!.centerYAnchor.constraint(equalTo: cell.layoutMarginsGuide.centerYAnchor).isActive = true - } + + doPredictionsSwitch!.rightAnchor.constraint(equalTo: cell.layoutMarginsGuide.rightAnchor).isActive = true + doPredictionsSwitch!.centerYAnchor.constraint(equalTo: cell.layoutMarginsGuide.centerYAnchor).isActive = true } else if 1 == indexPath.row { correctionsCell = cell cell.accessoryType = .none @@ -167,10 +166,9 @@ class LanguageSettingsViewController: UITableViewController { doCorrectionsSwitch!.isOn = userDefaults.correctSettingForLanguage(languageID: self.language.id) doCorrectionsSwitch!.addTarget(self, action: #selector(self.correctionSwitchValueChanged), for: .valueChanged) cell.addSubview(doCorrectionsSwitch!) - if #available(iOSApplicationExtension 9.0, *) { - doCorrectionsSwitch!.rightAnchor.constraint(equalTo: cell.layoutMarginsGuide.rightAnchor).isActive = true - doCorrectionsSwitch!.centerYAnchor.constraint(equalTo: cell.layoutMarginsGuide.centerYAnchor).isActive = true - } + + doCorrectionsSwitch!.rightAnchor.constraint(equalTo: cell.layoutMarginsGuide.rightAnchor).isActive = true + doCorrectionsSwitch!.centerYAnchor.constraint(equalTo: cell.layoutMarginsGuide.centerYAnchor).isActive = true // Disable interactivity if the prediction toggle is set to 'off'. doCorrectionsSwitch!.isHidden = !userDefaults.predictSettingForLanguage(languageID: self.language.id) diff --git a/ios/engine/KMEI/KeymanEngine/Classes/Settings/SettingsViewController.swift b/ios/engine/KMEI/KeymanEngine/Classes/Settings/SettingsViewController.swift index 8ecf21bf72..074b2551ab 100644 --- a/ios/engine/KMEI/KeymanEngine/Classes/Settings/SettingsViewController.swift +++ b/ios/engine/KMEI/KeymanEngine/Classes/Settings/SettingsViewController.swift @@ -78,31 +78,28 @@ open class SettingsViewController: UITableViewController { "reuseid": "enablecrashreporting" ]) - // The iOS Files app is only available with 11.0+. - if #available(iOS 11.0, *) { - if let _ = URL(string: UIApplication.openSettingsURLString) { - itemsArray.append([ - "title": NSLocalizedString("menu-settings-system-keyboard-menu", bundle: engineBundle, comment: ""), - "subtitle": "", - "reuseid": "systemkeyboardsettings" - ]) - } - + if let _ = URL(string: UIApplication.openSettingsURLString) { itemsArray.append([ - "title": NSLocalizedString("menu-settings-install-from-file", bundle: engineBundle, comment: ""), - "subtitle": NSLocalizedString("menu-settings-install-from-file-description", bundle: engineBundle, comment: ""), - "reuseid" : "installfile" + "title": NSLocalizedString("menu-settings-system-keyboard-menu", bundle: engineBundle, comment: ""), + "subtitle": "", + "reuseid": "systemkeyboardsettings" ]) - - #if DEBUG && !NO_SENTRY - itemsArray.append([ - "title": "Force a crash", - "subtitle": "Test Sentry error-reporting integration", - "reuseid" : "forcederror" - ]) - #endif } + itemsArray.append([ + "title": NSLocalizedString("menu-settings-install-from-file", bundle: engineBundle, comment: ""), + "subtitle": NSLocalizedString("menu-settings-install-from-file-description", bundle: engineBundle, comment: ""), + "reuseid" : "installfile" + ]) + + #if DEBUG && !NO_SENTRY + itemsArray.append([ + "title": "Force a crash", + "subtitle": "Test Sentry error-reporting integration", + "reuseid" : "forcederror" + ]) + #endif + _ = view } @@ -158,11 +155,9 @@ open class SettingsViewController: UITableViewController { showBannerSwitch.addTarget(self, action: #selector(self.bannerSwitchValueChanged), for: .valueChanged) cell.addSubview(showBannerSwitch) - - if #available(iOSApplicationExtension 9.0, *) { - showBannerSwitch.rightAnchor.constraint(equalTo: cell.layoutMarginsGuide.rightAnchor).isActive = true - showBannerSwitch.centerYAnchor.constraint(equalTo: cell.layoutMarginsGuide.centerYAnchor).isActive = true - } + + showBannerSwitch.rightAnchor.constraint(equalTo: cell.layoutMarginsGuide.rightAnchor).isActive = true + showBannerSwitch.centerYAnchor.constraint(equalTo: cell.layoutMarginsGuide.centerYAnchor).isActive = true case "showgetstarted": let showAgainSwitch = UISwitch() showAgainSwitch.translatesAutoresizingMaskIntoConstraints = false @@ -174,11 +169,9 @@ open class SettingsViewController: UITableViewController { showAgainSwitch.addTarget(self, action: #selector(self.showGetStartedSwitchValueChanged), for: .valueChanged) cell.addSubview(showAgainSwitch) - - if #available(iOSApplicationExtension 9.0, *) { - showAgainSwitch.rightAnchor.constraint(equalTo: cell.layoutMarginsGuide.rightAnchor).isActive = true - showAgainSwitch.centerYAnchor.constraint(equalTo: cell.layoutMarginsGuide.centerYAnchor).isActive = true - } + + showAgainSwitch.rightAnchor.constraint(equalTo: cell.layoutMarginsGuide.rightAnchor).isActive = true + showAgainSwitch.centerYAnchor.constraint(equalTo: cell.layoutMarginsGuide.centerYAnchor).isActive = true case "enablecrashreporting": let enableReportingSwitch = UISwitch() enableReportingSwitch.translatesAutoresizingMaskIntoConstraints = false @@ -191,10 +184,9 @@ open class SettingsViewController: UITableViewController { for: .valueChanged) cell.addSubview(enableReportingSwitch) - if #available(iOSApplicationExtension 9.0, *) { - enableReportingSwitch.rightAnchor.constraint(equalTo: cell.layoutMarginsGuide.rightAnchor).isActive = true - enableReportingSwitch.centerYAnchor.constraint(equalTo: cell.layoutMarginsGuide.centerYAnchor).isActive = true - } + enableReportingSwitch.rightAnchor.constraint(equalTo: cell.layoutMarginsGuide.rightAnchor).isActive = true + enableReportingSwitch.centerYAnchor.constraint(equalTo: cell.layoutMarginsGuide.centerYAnchor).isActive = true + case "systemkeyboardsettings", "installfile", "forcederror": break default: @@ -222,7 +214,7 @@ open class SettingsViewController: UITableViewController { // Necessary for the keyboard to visually update to match // the new setting. - Manager.shared.shouldReloadKeyboard = true + Manager.shared.inputViewController.setShouldReload() } @objc func showGetStartedSwitchValueChanged(_ sender: Any) { diff --git a/ios/engine/KMEI/KeymanEngine/Classes/TextField.swift b/ios/engine/KMEI/KeymanEngine/Classes/TextField.swift index 523f4a0228..42f8ea8297 100644 --- a/ios/engine/KMEI/KeymanEngine/Classes/TextField.swift +++ b/ios/engine/KMEI/KeymanEngine/Classes/TextField.swift @@ -46,10 +46,8 @@ public class TextField: UITextField, KeymanResponder { delegateProxy = TextFieldDelegateProxy(self) delegate = delegateProxy - if #available(iOS 9.0, *) { - inputAssistantItem.leadingBarButtonGroups = [] - inputAssistantItem.trailingBarButtonGroups = [] - } + inputAssistantItem.leadingBarButtonGroups = [] + inputAssistantItem.trailingBarButtonGroups = [] self.inputView = Manager.shared.inputViewController.view diff --git a/ios/engine/KMEI/KeymanEngine/Classes/TextView.swift b/ios/engine/KMEI/KeymanEngine/Classes/TextView.swift index 87fe2fde28..8f0ab0c639 100644 --- a/ios/engine/KMEI/KeymanEngine/Classes/TextView.swift +++ b/ios/engine/KMEI/KeymanEngine/Classes/TextView.swift @@ -45,10 +45,8 @@ public class TextView: UITextView, KeymanResponder { delegateProxy = TextViewDelegateProxy(self) delegate = delegateProxy - if #available(iOS 9.0, *) { - inputAssistantItem.leadingBarButtonGroups = [] - inputAssistantItem.trailingBarButtonGroups = [] - } + inputAssistantItem.leadingBarButtonGroups = [] + inputAssistantItem.trailingBarButtonGroups = [] self.inputView = Manager.shared.inputViewController.view diff --git a/ios/help/about/history.md b/ios/help/about/history.md index 3a0b9af3a6..17905b7e5a 100644 --- a/ios/help/about/history.md +++ b/ios/help/about/history.md @@ -2,7 +2,7 @@ title: Version History --- -A frequent updated changelog for Keyman is kept at [help.keyman.com/version-history](https://help.keyman.com/version-history/) on the Keyman Help website. +A frequently-updated changelog for Keyman is kept at [help.keyman.com/version-history](https://help.keyman.com/version-history/) on the Keyman Help website. ## Related Topics * [What's New](whatsnew) diff --git a/ios/help/index.md b/ios/help/index.md index 356e127b6a..c1d7e7332b 100644 --- a/ios/help/index.md +++ b/ios/help/index.md @@ -1,5 +1,5 @@ --- -title: Keyman for iPhone and iPad 14.0 Help +title: Keyman for iPhone and iPad 15.0 Help --- ## [About Keyman](about/) diff --git a/ios/keyman/Keyman/Keyman.xcodeproj/project.pbxproj b/ios/keyman/Keyman/Keyman.xcodeproj/project.pbxproj index 05805c9841..b98437460d 100644 --- a/ios/keyman/Keyman/Keyman.xcodeproj/project.pbxproj +++ b/ios/keyman/Keyman/Keyman.xcodeproj/project.pbxproj @@ -145,7 +145,6 @@ CE80AD33257F2B4A008D2150 /* KeymanEngine.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE80AD32257F2B4A008D2150 /* KeymanEngine.framework */; }; CE80AD34257F2B4B008D2150 /* KeymanEngine.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = CE80AD32257F2B4A008D2150 /* KeymanEngine.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; CEBD34322654FE3500EB2EA8 /* KeymanEngine.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE80AD32257F2B4A008D2150 /* KeymanEngine.framework */; }; - CEBD34332654FE3500EB2EA8 /* KeymanEngine.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = CE80AD32257F2B4A008D2150 /* KeymanEngine.framework */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; CEBD343B2654FEB400EB2EA8 /* DeviceKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEBD34352654FEB400EB2EA8 /* DeviceKit.xcframework */; }; CEBD343C2654FEB400EB2EA8 /* DeviceKit.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = CEBD34352654FEB400EB2EA8 /* DeviceKit.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; CEBD343D2654FEB400EB2EA8 /* ObjcExceptionBridging.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEBD34362654FEB400EB2EA8 /* ObjcExceptionBridging.xcframework */; }; @@ -193,17 +192,6 @@ name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; - CEBD34342654FE3500EB2EA8 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - CEBD34332654FE3500EB2EA8 /* KeymanEngine.framework in Embed Frameworks */, - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ @@ -344,13 +332,13 @@ CEACC90E25F07D58006EAB45 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; CEACC90F25F07D5A006EAB45 /* km */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = km; path = km.lproj/Localizable.strings; sourceTree = ""; }; CEACC91225F07D77006EAB45 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = ""; }; - CEBD3458265511B700EB2EA8 /* am */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = am; path = am.lproj/Localizable.strings; sourceTree = ""; }; CEBD34352654FEB400EB2EA8 /* DeviceKit.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = DeviceKit.xcframework; path = ../../Carthage/Build/DeviceKit.xcframework; sourceTree = ""; }; CEBD34362654FEB400EB2EA8 /* ObjcExceptionBridging.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = ObjcExceptionBridging.xcframework; path = ../../Carthage/Build/ObjcExceptionBridging.xcframework; sourceTree = ""; }; CEBD34372654FEB400EB2EA8 /* Reachability.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = Reachability.xcframework; path = ../../Carthage/Build/Reachability.xcframework; sourceTree = ""; }; CEBD34382654FEB400EB2EA8 /* Sentry.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = Sentry.xcframework; path = ../../Carthage/Build/Sentry.xcframework; sourceTree = ""; }; CEBD34392654FEB400EB2EA8 /* XCGLogger.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = XCGLogger.xcframework; path = ../../Carthage/Build/XCGLogger.xcframework; sourceTree = ""; }; CEBD343A2654FEB400EB2EA8 /* Zip.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = Zip.xcframework; path = ../../Carthage/Build/Zip.xcframework; sourceTree = ""; }; + CEBD3458265511B700EB2EA8 /* am */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = am; path = am.lproj/Localizable.strings; sourceTree = ""; }; CEF4E55523E95B7B0065B9C7 /* ImageBanner.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ImageBanner.xib; sourceTree = ""; }; CEF4E55823E967140065B9C7 /* ImageBannerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageBannerViewController.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -748,7 +736,6 @@ 98CD125A19CA85710089385F /* Resources */, CED3CFDA240E49DF001540A1 /* ShellScript */, 37BC8FFD1DE83BBD006AEBFF /* Headers */, - CEBD34342654FE3500EB2EA8 /* Embed Frameworks */, ); buildRules = ( ); @@ -1118,7 +1105,7 @@ GCC_PREFIX_HEADER = "Keyman/Keyman-Prefix.pch"; GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; INFOPLIST_FILE = "Keyman-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1153,7 +1140,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Keyman/Keyman-Prefix.pch"; INFOPLIST_FILE = "Keyman-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1310,7 +1297,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; INFOPLIST_FILE = SWKeyboard/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1354,7 +1341,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; INFOPLIST_FILE = SWKeyboard/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1449,7 +1436,7 @@ GCC_PREFIX_HEADER = "Keyman/Keyman-Prefix.pch"; GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; INFOPLIST_FILE = "Keyman-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1494,7 +1481,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; INFOPLIST_FILE = SWKeyboard/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/ios/keyman/Keyman/Keyman/AppDelegate.swift b/ios/keyman/Keyman/Keyman/AppDelegate.swift index a6b440a23e..91e84589a4 100644 --- a/ios/keyman/Keyman/Keyman/AppDelegate.swift +++ b/ios/keyman/Keyman/Keyman/AppDelegate.swift @@ -64,7 +64,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { _ = KeymanEngine.log UniversalLinks.externalLinkLauncher = { url in - UIApplication.shared.openURL(url) + UIApplication.shared.open(url) } Manager.applicationGroupIdentifier = "group.KM4I" @@ -170,11 +170,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate { } // Workaround to display overlay window above keyboard - if #available(iOS 9.0, *) { - let windows = UIApplication.shared.windows - if let lastWindow = windows.last { - _overlayWindow!.windowLevel = lastWindow.windowLevel + 1 - } + let windows = UIApplication.shared.windows + if let lastWindow = windows.last { + _overlayWindow!.windowLevel = lastWindow.windowLevel + 1 } return _overlayWindow! } diff --git a/ios/keyman/Keyman/Keyman/GetStartedViewController/GetStartedViewController.swift b/ios/keyman/Keyman/Keyman/GetStartedViewController/GetStartedViewController.swift index dcdd3e553b..1b6aa48314 100644 --- a/ios/keyman/Keyman/Keyman/GetStartedViewController/GetStartedViewController.swift +++ b/ios/keyman/Keyman/Keyman/GetStartedViewController/GetStartedViewController.swift @@ -114,17 +114,14 @@ class GetStartedViewController: UIViewController, UITableViewDelegate, UITableVi } case 1: cell.textLabel?.text = NSLocalizedString("tutorial-system-keyboard", comment: "") - if #available(iOS 11.0, *) { - // We can expedite this via near-direct settings link. - // So, let's add the one extra needed detail to our detail text. - let keyboardsMenuText = NSLocalizedString("ios-settings-keyboards", comment: "") - let enableText = String.init(format: NSLocalizedString("toggle-to-enable", comment: ""), "Keyman") - // Probably needs to be i18n-adjusted too. - let menuBreadcrumbing = NSLocalizedString("menu-breadcrumbing", comment: "") - cell.detailTextLabel?.text = String.init(format: menuBreadcrumbing, keyboardsMenuText, enableText) - } else { - cell.detailTextLabel?.text = "" - } + // We can expedite this via near-direct settings link. + // So, let's add the one extra needed detail to our detail text. + let keyboardsMenuText = NSLocalizedString("ios-settings-keyboards", comment: "") + let enableText = String.init(format: NSLocalizedString("toggle-to-enable", comment: ""), "Keyman") + // Probably needs to be i18n-adjusted too. + let menuBreadcrumbing = NSLocalizedString("menu-breadcrumbing", comment: "") + cell.detailTextLabel?.text = String.init(format: menuBreadcrumbing, keyboardsMenuText, enableText) + if !AppDelegate.isKeymanEnabledSystemWide() { cell.accessoryType = .none } else { @@ -155,8 +152,7 @@ class GetStartedViewController: UIViewController, UITableViewDelegate, UITableVi mainViewController.dismissGetStartedView(nil) mainViewController.showInstalledLanguages() case 1: - if #available(iOS 11.0, *), // if "Keyboards" is an option in our app's settings menu - let appSettings = URL(string: UIApplication.openSettingsURLString) { + if let appSettings = URL(string: UIApplication.openSettingsURLString) { UniversalLinks.externalLinkLauncher?(appSettings) } else { let setUpVC = SetUpViewController() diff --git a/ios/keyman/Keyman/Keyman/InfoViewController/InfoViewController.swift b/ios/keyman/Keyman/Keyman/InfoViewController/InfoViewController.swift index cd5558f886..7a87ac8e0a 100644 --- a/ios/keyman/Keyman/Keyman/InfoViewController/InfoViewController.swift +++ b/ios/keyman/Keyman/Keyman/InfoViewController/InfoViewController.swift @@ -43,16 +43,7 @@ class InfoViewController: UIViewController, UIWebViewDelegate { } func reloadKeymanHelp() { - if let networkStatus = networkReachable?.connection { - switch networkStatus { - case Reachability.Connection.none, Reachability.Connection.unavailable: - loadFromLocal() - default: - loadFromServer() - } - } else { - loadFromLocal() - } + loadFromLocal() } private func loadFromLocal() { @@ -63,6 +54,8 @@ class InfoViewController: UIViewController, UIWebViewDelegate { webView.loadRequest(URLRequest(url: URL.init(fileURLWithPath: filePath!))) } + // Currently unused, as we haven't yet added a toggle to allow users to choose online + // over the default of offline. private func loadFromServer() { let appVersion = Version.current.majorMinor let url = "\(KeymanHosts.HELP_KEYMAN_COM)/products/iphone-and-ipad/\(appVersion.plainString)/" diff --git a/ios/keyman/Keyman/Keyman/MainViewController.swift b/ios/keyman/Keyman/Keyman/MainViewController.swift index b708befd8e..03c926b862 100644 --- a/ios/keyman/Keyman/Keyman/MainViewController.swift +++ b/ios/keyman/Keyman/Keyman/MainViewController.swift @@ -83,11 +83,13 @@ class MainViewController: UIViewController, TextViewDelegate, UIActionSheetDeleg super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) // Setup Notifications - NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow), + NotificationCenter.default.addObserver(self, selector: #selector(self.onKeyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardDidShow), + // `keyboardDidShow` apparently matches an internal Apple API and will fail an app submission. + // So, cheap workaround: just prefix the thing. + NotificationCenter.default.addObserver(self, selector: #selector(self.onKeyboardDidShow), name: UIResponder.keyboardDidShowNotification, object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide), + NotificationCenter.default.addObserver(self, selector: #selector(self.onKeyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil) keyboardLoadedObserver = NotificationCenter.default.addObserver( forName: Notifications.keyboardLoaded, @@ -109,16 +111,14 @@ class MainViewController: UIViewController, TextViewDelegate, UIActionSheetDeleg // Unfortunately, it's the main app with the file definitions. // We have to gerry-rig this so that the framework-based SettingsViewController // can launch the app-based DocumentViewController. - if #available(iOS 11.0, *) { - Manager.shared.fileBrowserLauncher = { navVC in - let vc = PackageBrowserViewController(documentTypes: ["com.keyman.kmp"], - in: .import, - navVC: navVC) + Manager.shared.fileBrowserLauncher = { navVC in + let vc = PackageBrowserViewController(documentTypes: ["com.keyman.kmp"], + in: .import, + navVC: navVC) - // Present the "install from file" browser within the specified navigation view controller. - // (Allows displaying from within the Settings menu) - navVC.present(vc, animated: true) - } + // Present the "install from file" browser within the specified navigation view controller. + // (Allows displaying from within the Settings menu) + navVC.present(vc, animated: true) } } @@ -130,7 +130,6 @@ class MainViewController: UIViewController, TextViewDelegate, UIActionSheetDeleg super.viewDidLoad() extendedLayoutIncludesOpaqueBars = true - automaticallyAdjustsScrollViewInsets = false let systemFonts = Set(UIFont.familyNames) @@ -144,13 +143,7 @@ class MainViewController: UIViewController, TextViewDelegate, UIActionSheetDeleg ResourceDownloadManager.shared.queryKeysForUpdatablePackages { _, _ in } } - // Implement a default color... - var bgColor = UIColor(red: 1.0, green: 1.0, blue: 207.0 / 255.0, alpha: 1.0) - // And if the iOS version is current enough, override it from the palette. - if #available(iOS 11.0, *) { - bgColor = UIColor(named: "InputBackground")! - } - view?.backgroundColor = bgColor + view?.backgroundColor = UIColor(named: "InputBackground")! // Check for configuration profiles/fonts to install FontManager.shared.registerCustomFonts() @@ -192,7 +185,7 @@ class MainViewController: UIViewController, TextViewDelegate, UIActionSheetDeleg textView = TextView(frame: view.frame) textView.setKeymanDelegate(self) textView.viewController = self - textView.backgroundColor = bgColor + textView.backgroundColor = UIColor(named: "InputBackground")! textView.isScrollEnabled = true textView.isUserInteractionEnabled = true textView.font = textView.font?.withSize(textSize) @@ -206,7 +199,7 @@ class MainViewController: UIViewController, TextViewDelegate, UIActionSheetDeleg } infoView.view?.isHidden = true - infoView.view?.backgroundColor = bgColor + infoView.view?.backgroundColor = UIColor(named: "InputBackground")! view?.addSubview(infoView!.view) resizeViews(withKeyboardVisible: textView.isFirstResponder) @@ -396,21 +389,19 @@ class MainViewController: UIViewController, TextViewDelegate, UIActionSheetDeleg return navigationController!.navigationBar.frame.height } - @objc func keyboardWillShow(_ notification: Notification) { + @objc func onKeyboardWillShow(_ notification: Notification) { _ = dismissDropDownMenu() resizeViews(withKeyboardVisible: true) } - @objc func keyboardDidShow(_ notification: Notification) { + @objc func onKeyboardDidShow(_ notification: Notification) { // Workaround to display overlay window above keyboard - if #available(iOS 9.0, *) { - let windows = UIApplication.shared.windows - let lastWindow = windows.last - overlayWindow.windowLevel = lastWindow!.windowLevel + 1 - } + let windows = UIApplication.shared.windows + let lastWindow = windows.last + overlayWindow.windowLevel = lastWindow!.windowLevel + 1 } - @objc func keyboardWillHide(_ notification: Notification) { + @objc func onKeyboardWillHide(_ notification: Notification) { resizeViews(withKeyboardVisible: false) } @@ -474,7 +465,7 @@ class MainViewController: UIViewController, TextViewDelegate, UIActionSheetDeleg navigationItem.rightBarButtonItem = nil setNavBarButtons() if wasKeyboardVisible { - perform(#selector(self.showKeyboard), with: nil, afterDelay: 0.75) + perform(#selector(self.displayKeyboard), with: nil, afterDelay: 0.75) } if shouldShowGetStarted { perform(#selector(self.showGetStartedView), with: nil, afterDelay: 0.75) @@ -827,7 +818,8 @@ class MainViewController: UIViewController, TextViewDelegate, UIActionSheetDeleg } } - @objc func showKeyboard() { + // showKeyboard matches an internal Apple API, so it's not available for use as a selector. + @objc func displayKeyboard() { textView.becomeFirstResponder() } @@ -856,7 +848,7 @@ class MainViewController: UIViewController, TextViewDelegate, UIActionSheetDeleg userData.synchronize() if action.style == .default { - UIApplication.shared.openURL(URL(string: "\(baseUri)\(profileName)")!) + UIApplication.shared.open(URL(string: "\(baseUri)\(profileName)")!) } self.profileName = nil } diff --git a/ios/kmbuild.sh b/ios/kmbuild.sh index e5614e5b7e..a4cb288e28 100755 --- a/ios/kmbuild.sh +++ b/ios/kmbuild.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/usr/bin/env bash # set -e: Terminate script if a command returns an error set -e @@ -60,6 +60,7 @@ CLEAN_ONLY=false CONFIG=Release DO_KMP_DOWNLOADS=false CODE_SIGN= +DO_CODE_SIGN=true # Parse args while [[ $# -gt 0 ]] ; do @@ -77,7 +78,7 @@ while [[ $# -gt 0 ]] ; do ;; -no-codesign) CODE_SIGN="CODE_SIGN_IDENTITY= CODE_SIGNING_REQUIRED=NO ${DEV_TEAM:-} CODE_SIGN_ENTITLEMENTS= CODE_SIGNING_ALLOWED=NO" - DO_ARCHIVE=false + DO_CODE_SIGN=false ;; -no-archive) DO_ARCHIVE=false @@ -283,8 +284,8 @@ if [ $DO_KEYMANAPP = true ]; then else # Time to prepare the deployment archive data. echo "" - echo "Preparing .ipa file for deployment." - xcodebuild $XCODEFLAGS_EXT -scheme Keyman \ + echo "Preparing .xcarchive." + xcodebuild $XCODEFLAGS_EXT $CODE_SIGN -scheme Keyman \ -archivePath $ARCHIVE_PATH \ archive -allowProvisioningUpdates \ VERSION=$VERSION \ @@ -294,9 +295,12 @@ if [ $DO_KEYMANAPP = true ]; then assertDirExists "$ARCHIVE_PATH" - xcodebuild $XCODEFLAGS -exportArchive -archivePath $ARCHIVE_PATH \ - -exportOptionsPlist exportAppStore.plist \ - -exportPath $BUILD_PATH/${CONFIG}-iphoneos -allowProvisioningUpdates + if [ $DO_CODE_SIGN == true ]; then + echo "Preparing .ipa file for deployment" + xcodebuild $XCODEFLAGS -exportArchive -archivePath $ARCHIVE_PATH \ + -exportOptionsPlist exportAppStore.plist \ + -exportPath $BUILD_PATH/${CONFIG}-iphoneos -allowProvisioningUpdates + fi fi echo "" diff --git a/ios/samples/KMSample1/KMSample1.xcodeproj/project.pbxproj b/ios/samples/KMSample1/KMSample1.xcodeproj/project.pbxproj index 7233d1d238..202426dc86 100644 --- a/ios/samples/KMSample1/KMSample1.xcodeproj/project.pbxproj +++ b/ios/samples/KMSample1/KMSample1.xcodeproj/project.pbxproj @@ -377,7 +377,7 @@ "$(SRCROOT)/../../Carthage/Build/", ); INFOPLIST_FILE = KMSample1/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -402,7 +402,7 @@ "$(SRCROOT)/../../Carthage/Build/", ); INFOPLIST_FILE = KMSample1/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/ios/samples/KMSample2/KMSample2.xcodeproj/project.pbxproj b/ios/samples/KMSample2/KMSample2.xcodeproj/project.pbxproj index 2a76427330..defa521f3f 100644 --- a/ios/samples/KMSample2/KMSample2.xcodeproj/project.pbxproj +++ b/ios/samples/KMSample2/KMSample2.xcodeproj/project.pbxproj @@ -553,7 +553,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; INFOPLIST_FILE = KMSample2/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -578,7 +578,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; INFOPLIST_FILE = KMSample2/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -604,7 +604,7 @@ "$(inherited)", ); INFOPLIST_FILE = SWKeyboard/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -629,7 +629,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; INFOPLIST_FILE = SWKeyboard/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/ios/samples/build_common.sh b/ios/samples/build_common.sh index 6ecab69c02..46439f608b 100755 --- a/ios/samples/build_common.sh +++ b/ios/samples/build_common.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/usr/bin/env bash # set -e: Terminate script if a command returns an error set -e diff --git a/ios/scripts/kme-universal.sh b/ios/scripts/kme-universal.sh index be3327c9a9..43106a9576 100755 --- a/ios/scripts/kme-universal.sh +++ b/ios/scripts/kme-universal.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/usr/bin/env bash set -e set -u diff --git a/ios/tools/prepRelease.sh b/ios/tools/prepRelease.sh new file mode 100755 index 0000000000..5b97936c55 --- /dev/null +++ b/ios/tools/prepRelease.sh @@ -0,0 +1,118 @@ +#!/usr/bin/env bash + +## Note - this script is designed solely for use within our Continuous +## Integration processes with `pwd` as this script's parent folder. + +# Exit if program call fails +set -e + +# Exit if unset variable used +## set -u (causes history-utils.sh to fail) + +## START STANDARD BUILD SCRIPT INCLUDE +# adjust relative paths as necessary +THIS_SCRIPT="$(greadlink -f "${BASH_SOURCE[0]}" 2>/dev/null || readlink -f "${BASH_SOURCE[0]}")" +. "$(dirname "$THIS_SCRIPT")/../../resources/build/build-utils.sh" +## END STANDARD BUILD SCRIPT INCLUDE + +# This script runs from its parent's folder +cd "$(dirname "$THIS_SCRIPT")/.." + +# Only allow one upload artifact set to exist. +if [ -d "upload" ]; then + rm -rf upload +fi + +#Include script dependency +. $KEYMAN_ROOT/resources/build/history/history-utils.sh #includes the following +#. ../resources/shellHelperFunctions.sh + +BUILD_NUMBER=`cat ../VERSION.md` +TIER=`cat ../TIER.md` + +KEYMAN_CHANGELOG="changelog-${BUILD_NUMBER}-${TIER}.txt" +CHANGELOG_PATH="upload/$BUILD_NUMBER/$KEYMAN_CHANGELOG" + +WORK_DIR=`pwd` + +BUILD_COUNTER="$((${BUILD_NUMBER##*.}))" + +UPLOAD_BASE="upload" +UPLOAD_FOLDER="${BUILD_NUMBER}" +UPLOAD_DIR="${UPLOAD_BASE}/${UPLOAD_FOLDER}" + +mkdir -p "${UPLOAD_DIR}" + +# First, we prep the files for publication: write changelog + +echo "Writing changelog to $CHANGELOG_PATH" +get_version_notes "ios" "${BUILD_NUMBER}" "$TIER" > $CHANGELOG_PATH +echo "* Minor fixes and performance improvements" >> $CHANGELOG_PATH +assertFileExists "${CHANGELOG_PATH}" + +# Strip emoji to make Apple happy +emoji="\U1f300-\U1f5ff\U1f900-\U1f9ff\U1f600-\U1f64f\U1f680-\U1f6ff\U2600-\U26ff\U2700-\U27bf\U1f1e6-\U1f1ff\U1f191-\U1f251\U1f004\U1f0cf\U1f170-\U1f171\U1f17e-\U1f17f\U1f18e\U3030\U2b50\U2b55\U2934-\U2935\U2b05-\U2b07\U2b1b-\U2b1c\U3297\U3299\U303d\U00a9\U00ae\U2122\U23f3\U24c2\U23e9-\U23ef\U25b6\U23f8-\U23fa" +LC_ALL=UTF-8 sed -e "s/[$(printf $emoji)]//g" < "$CHANGELOG_PATH" > "$CHANGELOG_PATH.1" +mv -f "$CHANGELOG_PATH.1" "$CHANGELOG_PATH" +assertFileExists "${CHANGELOG_PATH}" + +# +# Keyman Engine +# + +KMEI_DST_NAME="keyman-engine-ios-${BUILD_NUMBER}.zip" +KMEI_DST="${WORK_DIR}/${UPLOAD_DIR}/${KMEI_DST_NAME}" + +KMEI_FRAMEWORK_BASE="build/Build/Products/Release/" +FRAMEWORK="KeymanEngine.xcframework" + +KEYMAN_SAMPLES="samples" + +echo "engine dest: $KMEI_DST" + +echo "Zipping ${UNI_FRAMEWORK} => ${UPLOAD_DIR}/${KMEI_DST}..." +cd "${KMEI_FRAMEWORK_BASE}" +zip -qrX ${KMEI_DST} ${FRAMEWORK} +cd $WORK_DIR + +echo "Copying Keyman Engine samples into ${UPLOAD_DIR}/${KMEI_DST_NAME}..." +cp -rf "${KEYMAN_SAMPLES}" "${UPLOAD_DIR}/samples" +cd "${UPLOAD_DIR}" +zip -qr "${KMEI_DST_NAME}" "samples" +rm -rf "samples" +cd $WORK_DIR + +# +# Keyman app +# + +KEYMANAPP_IPA="build/Build/Products/Release-iphoneos/Keyman.ipa" +KEYMANAPP_IPA_DST="keyman-ios-${BUILD_NUMBER}.ipa" + +echo "Copying Keyman IPA ${KEYMANAPP_IPA} => ${UPLOAD_DIR}/${KEYMANAPP_IPA/DST}..." +cp "${KEYMANAPP_IPA}" "${WORK_DIR}/${UPLOAD_DIR}/${KEYMANAPP_IPA_DST}" + +# +# FirstVoices app +# + +if [ ${RELEASE_OEM_FIRSTVOICES} = true ]; then + FIRSTVOICESAPP_IPA="../oem/firstvoices/ios/build/Build/Products/Release-iphoneos/FirstVoices.ipa" + FIRSTVOICESAPP_IPA_DST="firstvoices-ios-${BUILD_NUMBER}.ipa" + + echo "Copying FirstVoices IPA ${FIRSTVOICESAPP_IPA} => ${UPLOAD_DIR}/${FIRSTVOICESAPP_IPA/DST}..." + cp "${FIRSTVOICESAPP_IPA}" "${WORK_DIR}/${UPLOAD_DIR}/${FIRSTVOICESAPP_IPA_DST}" +fi + +# +# Write download info files +# + +cd "${UPLOAD_DIR}" + +write_download_info "Keyman Engine for iOS" "${KMEI_DST_NAME}" "${BUILD_NUMBER}" "${TIER}" "ios" +write_download_info "Keyman for iPhone and iPad" "${KEYMANAPP_IPA_DST}" "${BUILD_NUMBER}" "${TIER}" "ios" + +if [ ${RELEASE_OEM_FIRSTVOICES} = true ]; then + write_download_info "FirstVoices Keyboards" "${FIRSTVOICESAPP_IPA_DST}" "${BUILD_NUMBER}" "${TIER}" "ios" +fi \ No newline at end of file diff --git a/lerna.json b/lerna.json index 87d732ecb4..1a0b38578a 100644 --- a/lerna.json +++ b/lerna.json @@ -20,5 +20,5 @@ "ts-node", "typescript" ], - "version": "15.0.53" + "version": "15.0.57" } diff --git a/linux/README.md b/linux/README.md index 0cf80bd3e3..12593c2878 100644 --- a/linux/README.md +++ b/linux/README.md @@ -9,7 +9,6 @@ - [kmflcomp](./kmflcomp) - KMFL keyboard compiler - [libkmfl](./libkmfl) - older KMFL core library - [ibus-kmfl](./ibus-kmfl) - IBUS integration to use KMFL -- scim\_kmfl\_imengine - deprecated SCIM engine to use KMFL See [license information](./LICENSE.md) about licensing. @@ -18,7 +17,15 @@ See [license information](./LICENSE.md) about licensing. - It is helpful to be using the [packages.sil.org](http://packages.sil.org) repo - Install packages required for building and developing KMFL and Keyman for Linux -`sudo apt install cdbs debhelper libx11-dev autotools-dev build-essential dh-autoreconf flex bison libibus-1.0-dev python3-setuptools meson libjson-glib-dev libgtk-3-dev libxml2-utils help2man python3-lxml python3-magic python3-numpy python3-pil python3-pip python3-qrcode python3-requests python3-requests-cache python3 python3-gi dconf-cli dconf-editor` + + ```bash + sudo apt install cdbs debhelper libx11-dev autotools-dev build-essential \ + dh-autoreconf flex bison libibus-1.0-dev python3-setuptools meson \ + libjson-glib-dev libgtk-3-dev libxml2-utils help2man python3-lxml \ + python3-magic python3-numpy python3-pil python3-pip python3-qrcode \ + python3-requests python3-requests-cache python3 python3-gi dconf-cli \ + dconf-editor + ``` ## Compiling from Command Line diff --git a/linux/ibus-keyman/debian/changelog b/linux/ibus-keyman/debian/changelog index d94c0bf58c..bdd78ac0b7 100644 --- a/linux/ibus-keyman/debian/changelog +++ b/linux/ibus-keyman/debian/changelog @@ -1,3 +1,9 @@ +ibus-keyman (14.0.273-1) unstable; urgency=medium + + * Keyman 14 + + -- Eberhard Beilharz Mon, 26 Apr 2021 18:24:41 +0200 + ibus-keyman (11.0.103-4) unstable; urgency=medium * don't attempt to restart ibus without sudo and ps diff --git a/linux/ibus-kmfl/debian/changelog b/linux/ibus-kmfl/debian/changelog index 272f307023..bcbb464391 100644 --- a/linux/ibus-kmfl/debian/changelog +++ b/linux/ibus-kmfl/debian/changelog @@ -1,3 +1,9 @@ +ibus-kmfl (14.0.273-1) unstable; urgency=medium + + * Keyman 14 + + -- Eberhard Beilharz Mon, 26 Apr 2021 18:24:41 +0200 + ibus-kmfl (11.0.101-1) unstable; urgency=medium * New upstream Keyman for Linux 11.0 beta 1 diff --git a/linux/keyman-config/debian/changelog b/linux/keyman-config/debian/changelog index 28f707aea1..335aa0d6ad 100644 --- a/linux/keyman-config/debian/changelog +++ b/linux/keyman-config/debian/changelog @@ -1,3 +1,9 @@ +keyman-config (14.0.273-1) unstable; urgency=medium + + * Keyman 14 + + -- Eberhard Beilharz Mon, 26 Apr 2021 18:24:41 +0200 + keyman-config (11.0.103-3) unstable; urgency=medium * Update maintainer to Debian Input Method Team diff --git a/linux/kmflcomp/debian/changelog b/linux/kmflcomp/debian/changelog index 25e365e2a7..6948eb418f 100644 --- a/linux/kmflcomp/debian/changelog +++ b/linux/kmflcomp/debian/changelog @@ -1,3 +1,9 @@ +kmflcomp (14.0.273-1) unstable; urgency=medium + + * Keyman 14 + + -- Eberhard Beilharz Mon, 26 Apr 2021 18:24:41 +0200 + kmflcomp (11.0.101-1) unstable; urgency=medium * New upstream beta 1 of Keyman for Linux 11.0 diff --git a/linux/libkmfl/debian/changelog b/linux/libkmfl/debian/changelog index a99651aff6..a2efb7aed3 100644 --- a/linux/libkmfl/debian/changelog +++ b/linux/libkmfl/debian/changelog @@ -1,3 +1,9 @@ +libkmfl (14.0.273-1) unstable; urgency=medium + + * Keyman 14 + + -- Eberhard Beilharz Mon, 26 Apr 2021 18:24:41 +0200 + libkmfl (11.0.101-1) unstable; urgency=medium * New upstream - Keyman for Linux 11.0 beta 1 diff --git a/mac/build-help.sh b/mac/build-help.sh index 73e8303e59..ccd67360f8 100755 --- a/mac/build-help.sh +++ b/mac/build-help.sh @@ -72,6 +72,7 @@ displayInfo "" \ cd $KEYMAN_ROOT/mac/help MDLUA="$KEYMAN_ROOT/resources/build/html-link.lua" +CSS="../../resources/build/offline-help-style-spec.txt" MD=`find . -name "*.md"` DESTHTM="$THIS_DIR/Keyman4MacIM/Keyman4MacIM/Help" @@ -94,7 +95,7 @@ if $DO_HTM; then OUTFILE="$DESTHTM/${INFILE%.md}.html" echo "Processing $INFILE to $(basename "$OUTFILE")" mkdir -p "$(dirname "$OUTFILE")" - pandoc -s --lua-filter="$MDLUA" -t html -o "$OUTFILE" $INFILE + pandoc -s -H "$CSS" --lua-filter="$MDLUA" -t html -o "$OUTFILE" $INFILE done fi diff --git a/oem/firstvoices/ios/Cartfile b/oem/firstvoices/ios/Cartfile index 9d0a707fdf..0f58fa5b5e 100644 --- a/oem/firstvoices/ios/Cartfile +++ b/oem/firstvoices/ios/Cartfile @@ -1,5 +1,5 @@ github "marmelroy/Zip" github "DaveWoodCom/XCGLogger" ~> 6.1.0 -github "dennisweissmann/DeviceKit" ~> 2.3 +github "devicekit/DeviceKit" ~> 2.3 github "ashleymills/Reachability.swift" github "getsentry/sentry-cocoa" ~> 6.2.1 diff --git a/oem/firstvoices/ios/Cartfile.resolved b/oem/firstvoices/ios/Cartfile.resolved index e008148923..03c8666ea3 100644 --- a/oem/firstvoices/ios/Cartfile.resolved +++ b/oem/firstvoices/ios/Cartfile.resolved @@ -1,5 +1,5 @@ github "DaveWoodCom/XCGLogger" "6.1.0" github "ashleymills/Reachability.swift" "v5.0.0" -github "dennisweissmann/DeviceKit" "2.3.0" +github "devicekit/DeviceKit" "2.3.0" github "getsentry/sentry-cocoa" "6.2.1" github "marmelroy/Zip" "2.0.0" diff --git a/oem/firstvoices/ios/FirstVoices.xcodeproj/project.pbxproj b/oem/firstvoices/ios/FirstVoices.xcodeproj/project.pbxproj index 47b7d6611d..4cbb37abb3 100644 --- a/oem/firstvoices/ios/FirstVoices.xcodeproj/project.pbxproj +++ b/oem/firstvoices/ios/FirstVoices.xcodeproj/project.pbxproj @@ -55,7 +55,6 @@ CEBD34272654D76E00EB2EA8 /* Zip.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEBD340B2654D5AA00EB2EA8 /* Zip.xcframework */; }; CEBD34282654D76E00EB2EA8 /* Zip.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = CEBD340B2654D5AA00EB2EA8 /* Zip.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; CEBD34472654FF3300EB2EA8 /* KeymanEngine.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEBD34012654D41200EB2EA8 /* KeymanEngine.xcframework */; }; - CEBD34482654FF3300EB2EA8 /* KeymanEngine.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = CEBD34012654D41200EB2EA8 /* KeymanEngine.xcframework */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; CEDB327F265C9C58000A2009 /* DeviceKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEBD34052654D4EB00EB2EA8 /* DeviceKit.xcframework */; }; CEDB3280265C9C58000A2009 /* ObjcExceptionBridging.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEBD34082654D5AA00EB2EA8 /* ObjcExceptionBridging.xcframework */; }; CEDB3281265C9C58000A2009 /* Reachability.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEBD340C2654D5AB00EB2EA8 /* Reachability.xcframework */; }; @@ -93,17 +92,6 @@ name = "Embed App Extensions"; runOnlyForDeploymentPostprocessing = 0; }; - CEBD34492654FF3300EB2EA8 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - CEBD34482654FF3300EB2EA8 /* KeymanEngine.xcframework in Embed Frameworks */, - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ @@ -331,7 +319,6 @@ 98C9A8B91BFBF23C009E9A4F /* Frameworks */, 98C9A8BA1BFBF23C009E9A4F /* Resources */, 37B453EF245C09CE008877E5 /* ShellScript */, - CEBD34492654FF3300EB2EA8 /* Embed Frameworks */, ); buildRules = ( ); @@ -568,10 +555,6 @@ ENABLE_BITCODE = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(PROJECT_DIR)", - "$(SRCROOT)/../../../ios/Carthage/Build/", - ); GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -630,10 +613,6 @@ ENABLE_BITCODE = NO; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(PROJECT_DIR)", - "$(SRCROOT)/../../../ios/Carthage/Build/", - ); GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -663,7 +642,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = D7TR486TEH; INFOPLIST_FILE = FirstVoices/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; KEYMAN_ROOT = "$(SRCROOT)/../../.."; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -692,7 +671,7 @@ CODE_SIGN_STYLE = Manual; DEVELOPMENT_TEAM = D7TR486TEH; INFOPLIST_FILE = FirstVoices/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; KEYMAN_ROOT = "$(SRCROOT)/../../.."; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -717,13 +696,9 @@ CODE_SIGN_STYLE = Manual; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = D7TR486TEH; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/iOS", - ); HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = SWKeyboard/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; KEYMAN_ROOT = "$(SRCROOT)/../../.."; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -752,13 +727,9 @@ CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; DEVELOPMENT_TEAM = D7TR486TEH; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Carthage/Build/iOS", - ); HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = SWKeyboard/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; KEYMAN_ROOT = "$(SRCROOT)/../../.."; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", diff --git a/oem/firstvoices/ios/build_common.sh b/oem/firstvoices/ios/build_common.sh index ef0e410092..8360cb204e 100755 --- a/oem/firstvoices/ios/build_common.sh +++ b/oem/firstvoices/ios/build_common.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/usr/bin/env bash ## START STANDARD BUILD SCRIPT INCLUDE # adjust relative paths as necessary diff --git a/resources/build/offline-help-style-spec.txt b/resources/build/offline-help-style-spec.txt new file mode 100644 index 0000000000..7b687cbe02 --- /dev/null +++ b/resources/build/offline-help-style-spec.txt @@ -0,0 +1,288 @@ + \ No newline at end of file diff --git a/resources/gosh/package-lock.json b/resources/gosh/package-lock.json index 77f49bcf0e..11d59aa37f 100644 --- a/resources/gosh/package-lock.json +++ b/resources/gosh/package-lock.json @@ -1,5 +1,5 @@ { "name": "@keymanapp/resources-gosh", - "version": "15.0.53", + "version": "15.0.57", "lockfileVersion": 1 } diff --git a/resources/gosh/package.json b/resources/gosh/package.json index 5e8f254489..251ee7d453 100644 --- a/resources/gosh/package.json +++ b/resources/gosh/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/resources-gosh", - "version": "15.0.53", + "version": "15.0.57", "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 6e86d35f08..6471d5c1a5 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.53", + "version": "15.0.57", "lockfileVersion": 1 } diff --git a/resources/web-environment/package.json b/resources/web-environment/package.json index 077ebd3737..626770fe49 100644 --- a/resources/web-environment/package.json +++ b/resources/web-environment/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/web-environment", - "version": "15.0.53", + "version": "15.0.57", "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.53" + "@keymanapp/resources-gosh": "^15.0.57" } } diff --git a/web/package-lock.json b/web/package-lock.json index 458dd41eb1..5b40650325 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1,6 +1,6 @@ { "name": "keyman", - "version": "15.0.53", + "version": "15.0.57", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/web/package.json b/web/package.json index df847203d9..d76c39f30d 100644 --- a/web/package.json +++ b/web/package.json @@ -1,6 +1,6 @@ { "name": "keyman", - "version": "15.0.53", + "version": "15.0.57", "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.53", - "@keymanapp/web-sentry-manager": "^15.0.53", + "@keymanapp/resources-gosh": "^15.0.57", + "@keymanapp/web-sentry-manager": "^15.0.57", "@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.53", - "@keymanapp/keyboard-processor": "^15.0.53", - "@keymanapp/lexical-model-layer": "^15.0.53", - "@keymanapp/models-types": "^15.0.53", - "@keymanapp/recorder-core": "^15.0.53", - "@keymanapp/web-environment": "^15.0.53", - "@keymanapp/web-utils": "^15.0.53", + "@keymanapp/input-processor": "^15.0.57", + "@keymanapp/keyboard-processor": "^15.0.57", + "@keymanapp/lexical-model-layer": "^15.0.57", + "@keymanapp/models-types": "^15.0.57", + "@keymanapp/recorder-core": "^15.0.57", + "@keymanapp/web-environment": "^15.0.57", + "@keymanapp/web-utils": "^15.0.57", "@types/node": "^11.9.4", "es6-shim": "^0.35.5", "eventemitter3": "^4.0.0" diff --git a/web/source/build_kill_browserstack.sh b/web/source/build_kill_browserstack.sh new file mode 100755 index 0000000000..bc97de3018 --- /dev/null +++ b/web/source/build_kill_browserstack.sh @@ -0,0 +1,19 @@ +#! /usr/bin/env bash +# +# CI script to kill BrowserStack testing tunnel (Windows only) +# + +set -eu + +## START STANDARD BUILD SCRIPT INCLUDE +# adjust relative paths as necessary +THIS_SCRIPT="$(greadlink -f "${BASH_SOURCE[0]}" 2>/dev/null || readlink -f "${BASH_SOURCE[0]}")" +. "$(dirname "$THIS_SCRIPT")/../../resources/build/build-utils.sh" +. "$KEYMAN_ROOT/resources/shellHelperFunctions.sh" +## END STANDARD BUILD SCRIPT INCLUDE + +get_builder_OS + +if [ ${os_id} == 'win' ]; then + taskkill //f //im BrowserStackLocal.exe +fi diff --git a/web/source/dom/domEventHandlers.ts b/web/source/dom/domEventHandlers.ts index d88c9d0301..51dc713f19 100644 --- a/web/source/dom/domEventHandlers.ts +++ b/web/source/dom/domEventHandlers.ts @@ -524,6 +524,34 @@ namespace com.keyman.dom { super(keyman); } + private static selectTouch(e: TouchEvent): Touch { + /** + * During multi-touch event's, it's possible for one or more touches of said multi-touch + * to be against irrelevant parts of the page. We only want to consider touches against + * valid OutputTargets - against elements of the page that KMW can attach to. + * With touch active... that's a TouchAliasElement. + */ + let isValidTouch = function(touch: Touch, target: EventTarget): boolean { + return e.target == target && !!(findTouchAliasTarget(touch.target as HTMLElement)); + } + + // The event at least tells us the event's target, which can be used to help check + // whether or not individual `Touch`es may be related to this specific event for + // an ongoing multitouch scenario. + let target = e.target; + + // Find the first touch affected by this event that matches the current target. + for(let i=0; i < e.changedTouches.length; i++) { + if(isValidTouch(e.changedTouches[i], target)) { + return e.changedTouches[i]; + } + } + + // Shouldn't be possible. Just in case, we'd prefer a silent failure that allows + // callers to silently abort. + throw new Error("Could not select valid Touch for event."); + } + /** * Handle receiving focus by simulated input field * @@ -538,7 +566,12 @@ namespace com.keyman.dom { }; if(e && dom.Utils.instanceof(e, "TouchEvent")) { - tEvent=(e as TouchEvent).touches[0]; + try { + tEvent=DOMTouchHandlers.selectTouch(e as TouchEvent); + } catch(err) { + console.warn(err); + return; + } } else { // Allow external code to set focus and thus display the OSK on touch devices if required (KMEW-123) tEvent={clientX:0, clientY:0} @@ -796,9 +829,16 @@ namespace com.keyman.dom { // Identify the target from the touch list or the event argument (IE 10 only) var target: HTMLElement; + let touch: Touch; if(dom.Utils.instanceof(e, "TouchEvent")) { - target = (e as TouchEvent).targetTouches[0].target as HTMLElement; + try { + touch=DOMTouchHandlers.selectTouch(e as TouchEvent); + } catch(err) { + console.warn(err); + return; + } + target = touch.target as HTMLElement; } else { target = e.target as HTMLElement; } @@ -816,8 +856,8 @@ namespace com.keyman.dom { var x, y; if(dom.Utils.instanceof(e, "TouchEvent")) { - x = (e as TouchEvent).touches[0].screenX; - y = (e as TouchEvent).touches[0].screenY; + x = touch.screenX; + y = touch.screenY; } else { x = (e as MouseEvent).screenX; y = (e as MouseEvent).screenY; diff --git a/web/source/dom/touchAliasElement.ts b/web/source/dom/touchAliasElement.ts index a80d9cc21e..b8940f5aba 100644 --- a/web/source/dom/touchAliasElement.ts +++ b/web/source/dom/touchAliasElement.ts @@ -34,52 +34,6 @@ namespace com.keyman.dom { // Not to be confused with the simulated scrollbar. let scroller: HTMLElement; - // Designed to 'breadcrumb' elements to assist in diagnosis of an evasive known issue. - let elementLogger = function() { - let elementDescriber = function(element: HTMLElement) { - if(element) { - let childIndex = undefined; - let parent = element.parentElement; - if(parent) { - for(let child = parent.firstChild, i = 0; child; child = child.nextSibling, i++) { - if(child == element) { - childIndex = i; - break; - } - } - } - - // ID: should never be specified for TouchAliasElement components - // Class: specified for the root TouchAliasElement and for its text spans - // index: useful for identifying elements with no class info - return `tag type ${element.tagName}, class '${element.classList}', index under parent: '${childIndex}', id '${element.id}'`; - } else { - return `null`; - } - }; - - // Very rough breadcrumbs for use with any Sentry logs. - - // We'd expect to see the telltale 'keymanweb-input' appear as the class for one of the - // three elements logged here... at least, normally. - console.info(`(For diagnosing https://github.com/keymanapp/keyman/issues/4797)`); - // We don't use .innerHTML because that would tell us what the user's been typing. - // No keylogging! - console.info(`Original target: ${elementDescriber(target)}`); - if(target.previousSibling && target.previousSibling instanceof HTMLElement) { - console.info(`Previous sibling: ${elementDescriber(target.previousSibling)}`); - } - if(target.nextSibling && target.nextSibling instanceof HTMLElement) { - console.info(`Next sibling: ${elementDescriber(target.nextSibling)}`); - } - console.info(`Target's parent: ${elementDescriber(target.parentElement)}`); - if(target.parentElement instanceof HTMLElement) { - console.info(`Target's grandparent: ${elementDescriber(target.parentElement.parentElement)}`); - } - // Triggers the actual Sentry log (on pages that include Sentry logging) - //throw new Error(`Unexpected touch-start event target.`); - }; - // Identify the scroller element if(target && dom.Utils.instanceof(target, "HTMLSpanElement")) { scroller=target.parentNode as HTMLElement; @@ -101,12 +55,6 @@ namespace com.keyman.dom { return target['kmw_ip'] as TouchAliasElement; } else { // If it's not in any way related to a TouchAliasElement, simply return null. - // NOTE: At present, this method should only be called in places that actually EXPECT a TouchAliasElement... - // So if we fail to find one, something's gone wrong, and we'd like more details. - - // There's an evasive error related to this at present so we'll temporarily console-log info - // that may help us determine why we couldn't find the expected element. - elementLogger(); return null; } @@ -115,7 +63,6 @@ namespace com.keyman.dom { if(root['base'] !== undefined) { return root as TouchAliasElement; } else { - elementLogger(); return null; } } diff --git a/windows/src/.gitignore b/windows/src/.gitignore index 8e681d9969..75835990a4 100644 --- a/windows/src/.gitignore +++ b/windows/src/.gitignore @@ -11,6 +11,9 @@ **/obj **/x64 +# Temporary build files for VC++ +**/*.FileListAbsolute.txt + # KeymanWeb is copied from /web/src during Developer build developer/TIKE/xml/kmw/resource diff --git a/windows/src/Defines.mak b/windows/src/Defines.mak index 9df446fb19..340f86b967 100644 --- a/windows/src/Defines.mak +++ b/windows/src/Defines.mak @@ -112,9 +112,9 @@ DELPHIWARNINGS=-W+MESSAGE_DIRECTIVE -W+IMPLICIT_STRING_CAST -W+IMPLICIT_STRING_C DELPHIWARNINGS=-W-MESSAGE_DIRECTIVE -W-IMPLICIT_STRING_CAST -W-IMPLICIT_STRING_CAST_LOSS -W-EXPLICIT_STRING_CAST -W-EXPLICIT_STRING_CAST_LOSS -W-CVT_WCHAR_TO_ACHAR -W-CVT_NARROWING_STRING_LOST -W-CVT_ACHAR_TO_WCHAR -W-CVT_WIDENING_STRING_LOST -W-UNICODE_TO_LOCALE -W-LOCALE_TO_UNICODE -W-IMPLICIT_VARIANTS -W-IMPLICIT_INTEGER_CAST_LOSS -W-IMPLICIT_CONVERSION_LOSS -W-COMBINING_SIGNED_UNSIGNED64 -W-COMBINING_SIGNED_UNSIGNED64 !ENDIF -DELPHIDPRPARAMS=-Q -B -GD -H -VT -$C+ -$D+ -$L+ -$O+ -$Q- -$R- -$W+ -$Y+ -E. $(DELPHIWARNINGS) -I$(DELPHIINCLUDES) -U$(DELPHIINCLUDES) -R$(DELPHIINCLUDES) -NSVcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Web;Soap;Winapi;System.Win -DELPHIDPRPARAMS64=-Q -B -GD -H -VT -$C+ -$D+ -$L+ -$O+ -$Q- -$R- -$W+ -$Y+ -E. $(DELPHIWARNINGS) -I$(DELPHIINCLUDES) -U$(DELPHIINCLUDES) -R$(DELPHIINCLUDES) -NSVcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Web;Soap;Winapi;System.Win -DELPHIDPKPARAMS=-Q -B -GD -VT -$C+ -$D+ -$L+ -$O+ -$Q- -$R- -$W+ -$Y+ -E. $(DELPHIWARNINGS) -I$(DELPHIINCLUDES) -U$(DELPHIINCLUDES) -R$(DELPHIINCLUDES) -NSVcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Web;Soap;Winapi;System.Win -LE$(OUTLIB) -LN$(OUTLIB) -NSData +DELPHIDPRPARAMS=-Q -B -GD -H -VT -$C+ -$D+ -$J+ -$L+ -$O+ -$Q- -$R- -$W+ -$Y+ -E. $(DELPHIWARNINGS) -I$(DELPHIINCLUDES) -U$(DELPHIINCLUDES) -R$(DELPHIINCLUDES) -NSVcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Web;Soap;Winapi;System.Win +DELPHIDPRPARAMS64=-Q -B -GD -H -VT -$C+ -$D+ -$J+ -$L+ -$O+ -$Q- -$R- -$W+ -$Y+ -E. $(DELPHIWARNINGS) -I$(DELPHIINCLUDES) -U$(DELPHIINCLUDES) -R$(DELPHIINCLUDES) -NSVcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Web;Soap;Winapi;System.Win +DELPHIDPKPARAMS=-Q -B -GD -VT -$C+ -$D+ -$J+ -$L+ -$O+ -$Q- -$R- -$W+ -$Y+ -E. $(DELPHIWARNINGS) -I$(DELPHIINCLUDES) -U$(DELPHIINCLUDES) -R$(DELPHIINCLUDES) -NSVcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Web;Soap;Winapi;System.Win -LE$(OUTLIB) -LN$(OUTLIB) -NSData !IFDEF NOUI DCC32="$(DCC32PATH)\dcc32.exe" $(DELPHIDPRPARAMS) diff --git a/windows/src/README.md b/windows/src/README.md index 52eac1e637..8bbe69bf4e 100644 --- a/windows/src/README.md +++ b/windows/src/README.md @@ -2,7 +2,7 @@ ## Build Prerequisites -1. Install [VS2017 Community Edition](#visual-studio-2017-community-edition-setup-requirements). +1. Install [VS2019 Community Edition](#visual-studio-2019-community-edition-setup-requirements). 2. Install [Delphi 10.3](#delphi-setup-requirements). 3. Install [git](https://git-scm.com/download/win). 4. Install [nodejs](https://nodejs.org/en/download/). @@ -29,7 +29,7 @@ For local development you do not need to perform a release build so these are op ## Building Keyman for Windows and Keyman Developer -1. Start 'x64_x86 Cross Tools Command Prompt for VS 2017'. +1. Start 'Developer Command Prompt for VS 2019'. 2. Run `make build` from the **windows/src** folder. 3. Artifacts from a successful build will be placed in **windows/bin** folder. @@ -50,7 +50,7 @@ To perform a release build, you will need to obtain valid certificates. A releas unnecessary for local development. Release builds are currently run from a TeamCity CI environment. -1. Start 'x64_x86 Cross Tools Command Prompt for VS 2017'. +1. Start 'Developer Command Prompt for VS 2019'. 2. Run `make release` from the **windows/src** folder. 3. Artifacts from a successful build will be placed in **windows/release** folder. 4. **buildtools/help-keyman-com.sh** will push updated documentation to help.keyman.com. @@ -76,22 +76,22 @@ These steps are only required the first time you install Keyman: 'Trusted Root Certification Authorities'. Click Next and finish the wizard. To deploy a development build of Keyman and Keyman Developer, -1. Start 'x64_x86 Cross Tools Command Prompt for VS 2017'. +1. Start 'Developer Command Prompt for VS 2019'. 2. Run `make signcode` from the **windows/src** folder. 3. Ensure that Keyman and Keyman Developer are not running. 4. Run `make install` in **windows/src/engine**, **windows/src/desktop** and **windows/src/developer**. ## Detailed Prerequisite Notes -### Visual Studio 2017 Community Edition setup requirements +### Visual Studio 2019 Community Edition setup requirements -In Visual Studio 2017, you need to have the following installed: +In Visual Studio 2019, you need to have the following installed: #### Workloads * Desktop development with C++ * Universal Windows Platform development #### Individual components -* Windows Universal CRT SDK +--* Windows Universal CRT SDK * Windows 10.0.17763.0 SDK Configure Visual Studio to use two-space tab stops: diff --git a/windows/src/desktop/README.md b/windows/src/desktop/README.md new file mode 100644 index 0000000000..ff31323f74 --- /dev/null +++ b/windows/src/desktop/README.md @@ -0,0 +1,35 @@ +# Keyman for Windows + +Formerly called "Keyman Desktop", now called "Keyman" to harmonize with other platforms. + +# help + +Contains all the help documents in Markdown format for Keyman for Windows. It can build both compiled help chm or HTML format. + +# inst - keymandesktop.msi + +Building and signing of the installation archive keymandesktop.msi + +# insthelp - insthelp.exe + +Builds a helper executable to do various installation tasks - insthelp.exe. + +# kmbrowserhost - kmbrowserhost.exe + +kmbrowserhost.exe is the chromium embedded framework (CEF) host process executable. CEF uses a multi-process model and subprocesses are hosted in kmbrowserhost.exe. + +# kmconfig + +Used for configuration of advanced Keyman settings. Configuration can be imported from a json file or exported to a json file. Individual settings can be set. + +# kmshell - Kmshell.exe + +Keyman configuration tool that can be run from the command line with arguments to automate a number of tasks. +For example installing and uninstalling keyboards. + +# locale +User interface strings in various languages + +# setup + +Installation program for installing and initial setup of Keyman. A wrapper for keymandesktop.msi that also automates keyboard downloads and update downloads. diff --git a/windows/src/desktop/help/build.sh b/windows/src/desktop/help/build.sh old mode 100644 new mode 100755 index 1ba648ae9b..28cf21a0f0 --- a/windows/src/desktop/help/build.sh +++ b/windows/src/desktop/help/build.sh @@ -137,6 +137,7 @@ build_hhc() { # MDLUA="$KEYMAN_ROOT/resources/build/htm-link.lua" +CSS="../../../../resources/build/offline-help-style-spec.txt" MD=`find -name "*.md"` DESTCHM="$THIS_DIR/../../../bin/help/desktop" @@ -159,7 +160,7 @@ if $DO_CHM; then OUTFILE="$DESTCHM/${INFILE%.md}.htm" echo "Processing $INFILE to $(basename "$OUTFILE")" mkdir -p "$(dirname "$OUTFILE")" - pandoc -s --lua-filter="$MDLUA" -t html -o "$OUTFILE" $INFILE + pandoc -s -H "$CSS" --lua-filter="$MDLUA" -t html -o "$OUTFILE" $INFILE done fi diff --git a/windows/src/desktop/help/start/download-and-install-keyboard.md b/windows/src/desktop/help/start/download-and-install-keyboard.md index 096f4fd285..4d4a1e390d 100644 --- a/windows/src/desktop/help/start/download-and-install-keyboard.md +++ b/windows/src/desktop/help/start/download-and-install-keyboard.md @@ -64,8 +64,7 @@ Here's how to download and install a Keyman keyboard within Keyman: computer. **Note:** If a keyboard with the same name is already installed, Keyman will - ask you if you want to replace the old keyboard or cancel the - installation. + automatically replace it. 9. You may be prompted by User Account Control to allow Keyman to make changes to your computer -- click 'Yes'. @@ -118,8 +117,7 @@ how: **Note:** Install installs the keyboard for anyone who can log on to your computer. **Note:** If a keyboard with the same name is already installed, Keyman will - ask you if you want to replace the old keyboard or cancel the - installation. + automatically replace it. 8. Click OK to save your settings and exit Keyman Configuration. diff --git a/windows/src/desktop/kmshell/kmshell.cfg b/windows/src/desktop/kmshell/kmshell.cfg deleted file mode 100644 index e2ac2d438a..0000000000 --- a/windows/src/desktop/kmshell/kmshell.cfg +++ /dev/null @@ -1,46 +0,0 @@ --$A1 --$B- --$C- --$D+ --$E- --$F- --$G+ --$H+ --$I- --$J+ --$K- --$L+ --$M- --$N+ --$O+ --$P+ --$Q- --$R- --$S- --$T- --$U- --$V+ --$W+ --$X+ --$Y+ --$Z1 --GD --cg --vn --vr --AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; --H+ --W+ --M --$M16384,1048576 --K$2C400000 --LE"C:\Users\mcdurdin.TAVULTESOFT\Documents\Borland Studio Projects\Bpl" --LN"C:\Users\mcdurdin.TAVULTESOFT\Documents\Borland Studio Projects\Bpl" --U"C:\temp\EmbeddedWB_D5-D2009_Version_14.67.8\Source;C:\keyman\8.0\src\global\delphi\jedi\" --O"C:\temp\EmbeddedWB_D5-D2009_Version_14.67.8\Source;C:\keyman\8.0\src\global\delphi\jedi\" --I"C:\temp\EmbeddedWB_D5-D2009_Version_14.67.8\Source;C:\keyman\8.0\src\global\delphi\jedi\" --R"C:\temp\EmbeddedWB_D5-D2009_Version_14.67.8\Source;C:\keyman\8.0\src\global\delphi\jedi\" --DVISUALKEYBOARD_NOCUSTOMBITMAP;VERSION_KEYMAN_REDIST;RELEASE_KEYMAN;EXCMAGIC_GUI --w-UNSAFE_TYPE --w-UNSAFE_CODE --w-UNSAFE_CAST diff --git a/windows/src/desktop/kmshell/kmshell.dof b/windows/src/desktop/kmshell/kmshell.dof deleted file mode 100644 index 43ef2ef1d3..0000000000 --- a/windows/src/desktop/kmshell/kmshell.dof +++ /dev/null @@ -1,82 +0,0 @@ -[Compiler] -A=1 -B=0 -C=0 -D=1 -E=0 -F=0 -G=1 -H=1 -I=0 -J=1 -K=0 -L=1 -M=0 -N=1 -O=1 -P=1 -Q=0 -R=0 -S=0 -T=0 -U=0 -V=1 -W=0 -X=1 -Y=2 -Z=1 -ShowHints=1 -ShowWarnings=1 -UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; -[Linker] -MapFile=3 -OutputObjs=0 -ConsoleApp=1 -DebugInfo=1 -RemoteSymbols=1 -MinStackSize=16384 -MaxStackSize=1048576 -ImageBase=4194304 -ExeDescription= -[Directories] -OutputDir= -UnitOutputDir= -PackageDLLOutputDir= -PackageDCPOutputDir= -SearchPath=c:\keyman\5.1\src\global\delphi\vclzip;c:\keyman\5.1\src\global\delphi\folderdlg -Packages=Vcl40;Vclx40;vcljpg40;comp51;VCLZipD4;dclkmn;Vcl50;Vclx50;keyman_components;vclie50;Inetdb50;Inet50;Vcldb50 -Conditionals=VISUALKEYBOARD_NOCUSTOMBITMAP;VERSION_KEYMAN_REDIST;RELEASE_KEYMAN;EXCMAGIC_GUI -DebugSourceDirs=C:\keyman\5.1\src\dist\kmcomapi\;C:\keyman\5.1\src\dist\kmcomapi\util\;$(DELPHI)\source\vcl;C:\keyman\5.1\src\dist\kmcomapi\com\;C:\keyman\5.1\src\dist\kmcomapi\com\products\;C:\keyman\5.1\src\dist\kmcomapi\com\customisation\;C:\keyman\5.1\src\dist\kmcomapi\com\packages\;C:\keyman\5.1\src\global\delphi\general\;C:\keyman\5.1\src\dist\kmcomapi\com\keyboards\ -UsePackages=0 -[Parameters] -RunParams= -HostApplication= -[Language] -ActiveLang= -ProjectLang=$00000C09 -RootDir= -[Version Info] -IncludeVerInfo=0 -AutoIncBuild=1 -MajorVer=5 -MinorVer=0 -Release=0 -Build=17 -Debug=0 -PreRelease=0 -Special=0 -Private=0 -DLL=0 -Locale=3081 -CodePage=1252 -[Version Info Keys] -CompanyName= -FileDescription=Tavultesoft Keyboard Manager -FileVersion=5.0.0.17 -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename= -ProductName= -ProductVersion=1.0.0.0 -Comments= diff --git a/windows/src/desktop/setup/setup.cfg b/windows/src/desktop/setup/setup.cfg deleted file mode 100644 index 603bee035b..0000000000 --- a/windows/src/desktop/setup/setup.cfg +++ /dev/null @@ -1,45 +0,0 @@ --$A1 --$B- --$C+ --$D+ --$E- --$F- --$G+ --$H+ --$I+ --$J+ --$K- --$L+ --$M- --$N+ --$O+ --$P+ --$Q+ --$R+ --$S- --$T- --$U- --$V+ --$W+ --$X+ --$Y+ --$Z1 --GD --cg --vn --AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; --H+ --W+ --M --$M16384,1048576 --K$00400000 --LE"C:\Users\mcdurdin.TAVULTESOFT\Documents\Borland Studio Projects\Bpl" --LN"C:\Users\mcdurdin.TAVULTESOFT\Documents\Borland Studio Projects\Bpl" --U"C:\keyman\8.0\src\global\delphi\jedi\;C:\keyman\8.0\cmpsrc\EmbeddedWB\Source" --O"C:\keyman\8.0\src\global\delphi\jedi\;C:\keyman\8.0\cmpsrc\EmbeddedWB\Source" --I"C:\keyman\8.0\src\global\delphi\jedi\;C:\keyman\8.0\cmpsrc\EmbeddedWB\Source" --R"C:\keyman\8.0\src\global\delphi\jedi\;C:\keyman\8.0\cmpsrc\EmbeddedWB\Source" --DVERSION_KEYMAN_DEVELOPER;DaoCheck;DaoNamedEx;DaoDebug;DaoMessageEx;DAOIdent --w-UNSAFE_TYPE --w-UNSAFE_CODE --w-UNSAFE_CAST diff --git a/windows/src/developer/README.md b/windows/src/developer/README.md new file mode 100644 index 0000000000..94af269a9f --- /dev/null +++ b/windows/src/developer/README.md @@ -0,0 +1,48 @@ +# Keyman Developer for Windows + +This is the current home for Keyman Developer except for the Lexical Model Compiler. + +The Lexical Model Compiler is found at the root level /developer folder. + +## inst - keymandeveloper.msi + +Building and signing of the installation archive keymandeveloper.msi + +## kmanalyze - kmanalyze.exe + +A keyboard source analysis and automated regression test tool. Testing for logical errors of a keyboard. + + +## kcmpdll - kmcmpdll.dll & kmcmpdll.x64.dll + +This is the main source code for the keyboard compiler, packaged as dynamic linked library. The consumers will call 'CompileKeyboardFile' + +## kcframe.exe & kcframe.x64.exe + +Located under kmcomp folder this is used for debugging in Visual Studio. A command line program compiler for a keyboard file 'kmn' into a binary format 'kmx'. Has hardcoded default arguments. + +## kmcomp - kmcomp.exe & kmcomp.x64.exe + +The main command line compiler for a keyboard. It compiles keyboards (.kmn), packages (.kps), and projects (.kpj). + +## kmconvert - kmconvert.exe & kmconvert.x64.exe + +KMConvert converts keyboard layouts between different formats. KMConvert will generate a full Keyman template project from the imported layout or data, in a new folder named with the ID of the keyboard. It will not overwrite an existing folder. + +## kmdecomp - kmdecomp.exe + +Unsupported utility decompiles a Keyman .kmx keyboard. It will produce a .kmn source file and optionally a .ico or +.bmp image. see kmdecomp/kmdecomp.md for details. + +## samples + +Contains sample keyboards and sample developer projects. See readme.txt for details. + +## setup - setup.exe + +Installation program for Keyman Developer. + +## TIKE - Tavultesoft Integrated Keyboard Editor + +This is the designer side of the Developer. Used for designing, developing, testing and packing keyboards for distribution. + diff --git a/windows/src/developer/TIKE/Tike.bdsproj b/windows/src/developer/TIKE/Tike.bdsproj deleted file mode 100644 index a9f7252308..0000000000 --- a/windows/src/developer/TIKE/Tike.bdsproj +++ /dev/null @@ -1,180 +0,0 @@ - - - - - - - - - - - - Tike.dpr - - - 7.0 - - - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 0 - 1 - 1 - 1 - 0 - 0 - 0 - 1 - 1 - 1 - 2 - 1 - True - True - WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; - - False - - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - False - False - False - True - True - True - True - True - True - - - - 3 - 0 - False - 1 - True - False - False - 16384 - 1048576 - 4194304 - - - - - - - - $(BDS)\lib\Debug;$(BDS)\Lib\Debug\Indy10;$(DELPHI)\lib;c:\keyman\8.0\src\global\delphi\jedi;C:\keyman\8.0\src\global\delphi\vcl;\keyman\8.0\cmpsrc\mbcolor;C:\keyman\8.0\cmpsrc\embeddedwb\source - Vcl40;Vclx40;comp51;VCLZipD4;PMemoPack4;dclkmn;vcljpg40;Vcl50;Vclx50;rtl;keyman_components;vcl;xmlrtl;vclactnband;vclx;vclie;dbrtl;vcldb;tb2k_d10;tbx_d10;TMSUnicodeD2006;SpTBXMemoPackage;dsnap - VERSION_KEYMAN_DEVELOPER;DaoCheck;DaoNamedEx;DaoDebug;DaoMessageEx;DAOIdent - C:\keyman\7.0\src\engine\kmcomapi\com\keyboards\;C:\keyman\7.0\src\engine\kmcomapi\util\;C:\keyman\7.0\src\engine\kmcomapi\com\;C:\keyman\7.0\src\engine\kmcomapi\com\packages\;C:\keyman\7.0\src\engine\kmcomapi\processes\package\ - False - - - c:\temp\test_k102.kmn - - - False - - C:\keyman\7.0\src\addins;C:\keyman\7.0\src\buildtools;C:\keyman\7.0\src\desktop;C:\keyman\7.0\src\developer;C:\keyman\7.0\src\engine;C:\keyman\7.0\src\global;C:\keyman\7.0\src\online;C:\keyman\7.0\src\support;C:\keyman\7.0\src\test;C:\keyman\7.0\src\addins\inst;C:\keyman\7.0\src\addins\kmtip;C:\keyman\7.0\src\addins\richedit;C:\keyman\7.0\src\addins\wordlink;C:\keyman\7.0\src\addins\inst\addininst;C:\keyman\7.0\src\addins\wordlink\dot;C:\keyman\7.0\src\addins\wordlink\wordlink_wll;C:\keyman\7.0\src\buildtools\buildunidata;C:\keyman\7.0\src\buildtools\cvscommit;C:\keyman\7.0\src\buildtools\delphiprojectmanager;C:\keyman\7.0\src\buildtools\devreg;C:\keyman\7.0\src\buildtools\genkmnp;C:\keyman\7.0\src\buildtools\getfilelocks;C:\keyman\7.0\src\buildtools\help;C:\keyman\7.0\src\buildtools\InitProductStatus;C:\keyman\7.0\src\buildtools\inst;C:\keyman\7.0\src\buildtools\isadmin;C:\keyman\7.0\src\buildtools\kmdebug;C:\keyman\7.0\src\buildtools\makecert;C:\keyman\7.0\src\buildtools\makeeval;C:\keyman\7.0\src\buildtools\makestockkct;C:\keyman\7.0\src\buildtools\mkver;C:\keyman\7.0\src\buildtools\msimsp;C:\keyman\7.0\src\buildtools\productstatus;C:\keyman\7.0\src\buildtools\stockeditor;C:\keyman\7.0\src\buildtools\test-checkcert;C:\keyman\7.0\src\buildtools\versionhistory;C:\keyman\7.0\src\buildtools\xslt;C:\keyman\7.0\src\buildtools\help\idx;C:\keyman\7.0\src\buildtools\help\img;C:\keyman\7.0\src\buildtools\help\inc;C:\keyman\7.0\src\buildtools\help\main;C:\keyman\7.0\src\desktop\branding;C:\keyman\7.0\src\desktop\help;C:\keyman\7.0\src\desktop\inst;C:\keyman\7.0\src\desktop\kmshell;C:\keyman\7.0\src\desktop\help\context;C:\keyman\7.0\src\desktop\help\idx;C:\keyman\7.0\src\desktop\help\img;C:\keyman\7.0\src\desktop\help\inc;C:\keyman\7.0\src\desktop\help\main;C:\keyman\7.0\src\desktop\help\rtf;C:\keyman\7.0\src\desktop\inst\Bitmaps;C:\keyman\7.0\src\desktop\kmshell\install;C:\keyman\7.0\src\desktop\kmshell\main;C:\keyman\7.0\src\desktop\kmshell\product;C:\keyman\7.0\src\desktop\kmshell\rel;C:\keyman\7.0\src\desktop\kmshell\render;C:\keyman\7.0\src\desktop\kmshell\startup;C:\keyman\7.0\src\desktop\kmshell\tsysinfo;C:\keyman\7.0\src\desktop\kmshell\uninstall;C:\keyman\7.0\src\desktop\kmshell\util;C:\keyman\7.0\src\desktop\kmshell\view;C:\keyman\7.0\src\desktop\kmshell\xml;C:\keyman\7.0\src\developer\help;C:\keyman\7.0\src\developer\inst;C:\keyman\7.0\src\developer\kmcmpdll;C:\keyman\7.0\src\developer\kmcomp;C:\keyman\7.0\src\developer\samples;C:\keyman\7.0\src\developer\stock;C:\keyman\7.0\src\developer\TIKE;C:\keyman\7.0\src\developer\uitemplates;C:\keyman\7.0\src\developer\help\context;C:\keyman\7.0\src\developer\help\guide;C:\keyman\7.0\src\developer\help\idx;C:\keyman\7.0\src\developer\help\img;C:\keyman\7.0\src\developer\help\imx;C:\keyman\7.0\src\developer\help\inc;C:\keyman\7.0\src\developer\help\main;C:\keyman\7.0\src\developer\help\reference;C:\keyman\7.0\src\developer\help\rtf;C:\keyman\7.0\src\developer\help\tutorial;C:\keyman\7.0\src\developer\inst\Bitmaps;C:\keyman\7.0\src\developer\inst\data;C:\keyman\7.0\src\developer\inst\devinsthelper;C:\keyman\7.0\src\developer\inst\fonts;C:\keyman\7.0\src\developer\inst\old;C:\keyman\7.0\src\developer\inst\prodinsthelp;C:\keyman\7.0\src\developer\inst\version_upgrade;C:\keyman\7.0\src\developer\inst\wix;C:\keyman\7.0\src\developer\inst\version_upgrade\old_cpp;C:\keyman\7.0\src\developer\inst\wix\Bitmaps;C:\keyman\7.0\src\developer\inst\wix\doc;C:\keyman\7.0\src\developer\inst\wix\examples;C:\keyman\7.0\src\developer\inst\wix\inc;C:\keyman\7.0\src\developer\inst\wix\lib;C:\keyman\7.0\src\developer\inst\wix\examples\first;C:\keyman\7.0\src\developer\inst\wix\examples\simple;C:\keyman\7.0\src\developer\inst\wix\examples\simple\bin;C:\keyman\7.0\src\developer\kmcmpdll\debug;C:\keyman\7.0\src\developer\kmcmpdll\Release;C:\keyman\7.0\src\developer\samples\Examples;C:\keyman\7.0\src\developer\samples\imsample;C:\keyman\7.0\src\developer\samples\Products;C:\keyman\7.0\src\developer\samples\Tests;C:\keyman\7.0\src\developer\samples\Products\LaoUnicode;C:\keyman\7.0\src\developer\samples\Products\LaoUnicode\LaoUnicode;C:\keyman\7.0\src\developer\samples\Products\LaoUnicode\LaoUnicode\bin;C:\keyman\7.0\src\developer\samples\Products\LaoUnicode\LaoUnicode\My Project;C:\keyman\7.0\src\developer\samples\Products\LaoUnicode\LaoUnicode\obj;C:\keyman\7.0\src\developer\samples\Products\LaoUnicode\LaoUnicode\bin\Debug;C:\keyman\7.0\src\developer\samples\Products\LaoUnicode\LaoUnicode\bin\Release;C:\keyman\7.0\src\developer\samples\Products\LaoUnicode\LaoUnicode\obj\Debug;C:\keyman\7.0\src\developer\samples\Products\LaoUnicode\LaoUnicode\obj\Release;C:\keyman\7.0\src\developer\samples\Products\LaoUnicode\LaoUnicode\obj\Debug\TempPE;C:\keyman\7.0\src\developer\samples\Products\LaoUnicode\LaoUnicode\obj\Release\TempPE;C:\keyman\7.0\src\developer\TIKE\actions;C:\keyman\7.0\src\developer\TIKE\activation;C:\keyman\7.0\src\developer\TIKE\child;C:\keyman\7.0\src\developer\TIKE\compile;C:\keyman\7.0\src\developer\TIKE\crm;C:\keyman\7.0\src\developer\TIKE\debug;C:\keyman\7.0\src\developer\TIKE\dialogs;C:\keyman\7.0\src\developer\TIKE\dockforms;C:\keyman\7.0\src\developer\TIKE\help;C:\keyman\7.0\src\developer\TIKE\kct;C:\keyman\7.0\src\developer\TIKE\main;C:\keyman\7.0\src\developer\TIKE\project;C:\keyman\7.0\src\developer\TIKE\rel;C:\keyman\7.0\src\developer\TIKE\tests;C:\keyman\7.0\src\developer\TIKE\xml;C:\keyman\7.0\src\developer\TIKE\kct\Editors;C:\keyman\7.0\src\developer\TIKE\kct\icons;C:\keyman\7.0\src\developer\TIKE\xml\help;C:\keyman\7.0\src\developer\TIKE\xml\product;C:\keyman\7.0\src\developer\TIKE\xml\project;C:\keyman\7.0\src\engine\inst;C:\keyman\7.0\src\engine\keyman;C:\keyman\7.0\src\engine\keyman32;C:\keyman\7.0\src\engine\kmcomapi;C:\keyman\7.0\src\engine\inst\insthelper;C:\keyman\7.0\src\engine\keyman\viskbd;C:\keyman\7.0\src\engine\keyman32\appint;C:\keyman\7.0\src\engine\kmcomapi\com;C:\keyman\7.0\src\engine\kmcomapi\idl;C:\keyman\7.0\src\engine\kmcomapi\processes;C:\keyman\7.0\src\engine\kmcomapi\util;C:\keyman\7.0\src\engine\kmcomapi\com\addins;C:\keyman\7.0\src\engine\kmcomapi\com\customisation;C:\keyman\7.0\src\engine\kmcomapi\com\errors;C:\keyman\7.0\src\engine\kmcomapi\com\hotkeys;C:\keyman\7.0\src\engine\kmcomapi\com\keyboards;C:\keyman\7.0\src\engine\kmcomapi\com\languages;C:\keyman\7.0\src\engine\kmcomapi\com\licences;C:\keyman\7.0\src\engine\kmcomapi\com\options;C:\keyman\7.0\src\engine\kmcomapi\com\packages;C:\keyman\7.0\src\engine\kmcomapi\com\products;C:\keyman\7.0\src\engine\kmcomapi\com\system;C:\keyman\7.0\src\engine\kmcomapi\processes\addin;C:\keyman\7.0\src\engine\kmcomapi\processes\font;C:\keyman\7.0\src\engine\kmcomapi\processes\keyboard;C:\keyman\7.0\src\engine\kmcomapi\processes\package;C:\keyman\7.0\src\engine\kmcomapi\processes\product;C:\keyman\7.0\src\engine\kmcomapi\processes\visualkeyboard;C:\keyman\7.0\src\global\delphi;C:\keyman\7.0\src\global\help;C:\keyman\7.0\src\global\inc;C:\keyman\7.0\src\global\inst;C:\keyman\7.0\src\global\res;C:\keyman\7.0\src\global\vc;C:\keyman\7.0\src\global\wix;C:\keyman\7.0\src\global\delphi\charmap;C:\keyman\7.0\src\global\delphi\comp;C:\keyman\7.0\src\global\delphi\crypt;C:\keyman\7.0\src\global\delphi\cust;C:\keyman\7.0\src\global\delphi\debug;C:\keyman\7.0\src\global\delphi\dragdrop;C:\keyman\7.0\src\global\delphi\excmagic;C:\keyman\7.0\src\global\delphi\folderdlg;C:\keyman\7.0\src\global\delphi\general;C:\keyman\7.0\src\global\delphi\htmlhelp;C:\keyman\7.0\src\global\delphi\hwkey;C:\keyman\7.0\src\global\delphi\indy;C:\keyman\7.0\src\global\delphi\jedi;C:\keyman\7.0\src\global\delphi\online;C:\keyman\7.0\src\global\delphi\plusmemou;C:\keyman\7.0\src\global\delphi\png;C:\keyman\7.0\src\global\delphi\productactivation;C:\keyman\7.0\src\global\delphi\tlb;C:\keyman\7.0\src\global\delphi\vcl;C:\keyman\7.0\src\global\delphi\vclzip;C:\keyman\7.0\src\global\delphi\visualkeyboard;C:\keyman\7.0\src\global\delphi\xdom;C:\keyman\7.0\src\global\delphi\xstringgrid;C:\keyman\7.0\src\global\delphi\comp\bitmapeditor;C:\keyman\7.0\src\global\delphi\crypt\Ciphers;C:\keyman\7.0\src\global\delphi\crypt\Docs;C:\keyman\7.0\src\global\delphi\crypt\Hashes;C:\keyman\7.0\src\global\delphi\excmagic\unit;C:\keyman\7.0\src\global\delphi\excmagic\unit\RC;C:\keyman\7.0\src\global\delphi\indy\Core;C:\keyman\7.0\src\global\delphi\indy\Protocols;C:\keyman\7.0\src\global\delphi\indy\SuperCore;C:\keyman\7.0\src\global\delphi\indy\System;C:\keyman\7.0\src\global\inst\data;C:\keyman\7.0\src\global\inst\data\Unihan;C:\keyman\7.0\src\global\res\70;C:\keyman\7.0\src\global\res\bmp;C:\keyman\7.0\src\global\res\cimu;C:\keyman\7.0\src\global\res\geezword;C:\keyman\7.0\src\global\res\keyman;C:\keyman\7.0\src\global\res\lswin;C:\keyman\7.0\src\global\res\paul;C:\keyman\7.0\src\global\res\70\desktop;C:\keyman\7.0\src\global\res\70\developer;C:\keyman\7.0\src\global\res\70\filetypes;C:\keyman\7.0\src\global\res\bmp\splash;C:\keyman\7.0\src\global\res\geezword\bmp;C:\keyman\7.0\src\global\res\geezword\ico;C:\keyman\7.0\src\global\res\geezword\other;C:\keyman\7.0\src\global\res\geezword\ico\16x16;C:\keyman\7.0\src\global\res\geezword\ico\32x32;C:\keyman\7.0\src\global\res\geezword\ico\unused;C:\keyman\7.0\src\global\res\keyman\bmp;C:\keyman\7.0\src\global\res\keyman\ico;C:\keyman\7.0\src\global\res\keyman\other;C:\keyman\7.0\src\global\res\keyman\bmp\startup;C:\keyman\7.0\src\global\res\keyman\bmp\tip;C:\keyman\7.0\src\global\res\keyman\ico\16x16;C:\keyman\7.0\src\global\res\keyman\ico\32x32;C:\keyman\7.0\src\global\res\keyman\ico\unused;C:\keyman\7.0\src\global\res\lswin\bmp;C:\keyman\7.0\src\global\res\lswin\ico;C:\keyman\7.0\src\global\res\lswin\other;C:\keyman\7.0\src\global\res\lswin\ico\16x16;C:\keyman\7.0\src\global\res\lswin\ico\32x32;C:\keyman\7.0\src\global\res\lswin\ico\unused;C:\keyman\7.0\src\global\res\paul\dev-images;C:\keyman\7.0\src\global\res\paul\dev-images\6.0-icons;C:\keyman\7.0\src\global\res\paul\dev-images\filetypes;C:\keyman\7.0\src\global\res\paul\dev-images\icons;C:\keyman\7.0\src\global\res\paul\dev-images\install;C:\keyman\7.0\src\global\res\paul\dev-images\keyman;C:\keyman\7.0\src\global\res\paul\dev-images\tike;C:\keyman\7.0\src\global\res\paul\dev-images\6.0-icons\16x16;C:\keyman\7.0\src\global\res\paul\dev-images\6.0-icons\32x32;C:\keyman\7.0\src\global\res\paul\dev-images\6.0-icons\unused;C:\keyman\7.0\src\global\res\paul\dev-images\keyman\icons;C:\keyman\7.0\src\global\res\paul\dev-images\keyman\xml;C:\keyman\7.0\src\global\res\paul\dev-images\keyman\xml\img;C:\keyman\7.0\src\global\res\paul\dev-images\keyman\xml\kbimg;C:\keyman\7.0\src\global\res\paul\dev-images\tike\xml;C:\keyman\7.0\src\global\res\paul\dev-images\tike\xml\kmg;C:\keyman\7.0\src\global\wix\wixui;C:\keyman\7.0\src\global\wix\wixui\Bitmaps;C:\keyman\7.0\src\global\wix\wixui\featuretree;C:\keyman\7.0\src\global\wix\wixui\installdir;C:\keyman\7.0\src\global\wix\wixui\minimal;C:\keyman\7.0\src\global\wix\wixui\mondo;C:\keyman\7.0\src\online\certificate;C:\keyman\7.0\src\online\k61licence;C:\keyman\7.0\src\online\kencrypt;C:\keyman\7.0\src\online\klicence;C:\keyman\7.0\src\support\braziliantest;C:\keyman\7.0\src\support\imtest;C:\keyman\7.0\src\support\kdebug;C:\keyman\7.0\src\support\keycodetester;C:\keyman\7.0\src\support\kmdecomp;C:\keyman\7.0\src\support\richedit_examine;C:\keyman\7.0\src\support\testcryptdepend;C:\keyman\7.0\src\support\windowinfo;C:\keyman\7.0\src\support\xstringtest;C:\keyman\7.0\src\test\regressiontest;C:\keyman\7.0\src\test\test-comapi;C:\keyman\7.0\src\test\test_alphanumcode;C:\keyman\7.0\src\test\test_uuidgen;C:\keyman\7.0\src\test\regressiontest\tests;C:\keyman\7.0\src\test\test_uuidgen\del_uuidgen;C:\keyman\7.0\src\test\test_uuidgen\vc_uuidgen;C:\keyman\7.0\src\test\test_uuidgen\vc_uuidgen\vc_uuidgen - True - True - - - - $00000C09 - - - - False - True - 5 - 0 - 0 - 50 - False - False - False - False - False - 3081 - 1252 - - - - Tavultesoft IKE - 5.0.0.50 - - - - - - 5.0.0.0 - - - - 'C:\keyman\7.0\src\addins;C:\keyman\7.0\src\buildtools;C:\keyman\7.0\src\desktop;C:\keyman\7.0\src\developer;C:\keyman\7.0\src\engine;C:\keyman\7.0\src\global;C:\keyman\7.0\src\online;C:\keyman\7.0\src\support;C:\keyman\7.0\src\test;C:\keyman\7.0\src\addins\inst;C:\keyman\7.0\src\addins\kmtip;C:\keyman\7.0\src\addins\richedit;C:\keyman\7.0\src\addins\wordlink;C:\keyman\7.0\src\addins\inst\addininst;C:\keyman\7.0\src\addins\wordlink\dot;C:\keyman\7.0\src\addins\wordlink\wordlink_wll;C:\keyman\7.0\src\buildtools\buildunidata;C:\keyman\7.0\src\buildtools\cvscommit;C:\keyman\7.0\src\buildtools\delphiprojectmanager;C:\keyman\7.0\src\buildtools\devreg;C:\keyman\7.0\src\buildtools\genkmnp;C:\keyman\7.0\src\buildtools\getfilelocks;C:\keyman\7.0\src\buildtools\help;C:\keyman\7.0\src\buildtools\InitProductStatus;C:\keyman\7.0\src\buildtools\inst;C:\keyman\7.0\src\buildtools\isadmin;C:\keyman\7.0\src\buildtools\kmdebug;C:\keyman\7.0\src\buildtools\makecert;C:\keyman\7.0\src\buildtools\makeeval;C:\keyman\7.0\src\buildtools\makestockkct;C:\keyman\7.0\src\buildtools\mkver;C:\keyman\7.0\src\buildtools\msimsp;C:\keyman\7.0\src\buildtools\productstatus;C:\keyman\7.0\src\buildtools\stockeditor;C:\keyman\7.0\src\buildtools\test-checkcert;C:\keyman\7.0\src\buildtools\versionhistory;C:\keyman\7.0\src\buildtools\xslt;C:\keyman\7.0\src\buildtools\help\idx;C:\keyman\7.0\src\buildtools\help\img;C:\keyman\7.0\src\buildtools\help\inc;C:\keyman\7.0\src\buildtools\help\main;C:\keyman\7.0\src\desktop\branding;C:\keyman\7.0\src\desktop\help;C:\keyman\7.0\src\desktop\inst;C:\keyman\7.0\src\desktop\kmshell;C:\keyman\7.0\src\desktop\help\context;C:\keyman\7.0\src\desktop\help\idx;C:\keyman\7.0\src\desktop\help\img;C:\keyman\7.0\src\desktop\help\inc;C:\keyman\7.0\src\desktop\help\main;C:\keyman\7.0\src\desktop\help\rtf;C:\keyman\7.0\src\desktop\inst\Bitmaps;C:\keyman\7.0\src\desktop\kmshell\install;C:\keyman\7.0\src\desktop\kmshell\main;C:\keyman\7.0\src\desktop\kmshell\product;C:\keyman\7.0\src\desktop\kmshell\rel;C:\keyman\7.0\src\desktop\kmshell\render;C:\keyman\7.0\src\desktop\kmshell\startup;C:\keyman\7.0\src\desktop\kmshell\tsysinfo;C:\keyman\7.0\src\desktop\kmshell\uninstall;C:\keyman\7.0\src\desktop\kmshell\util;C:\keyman\7.0\src\desktop\kmshell\view;C:\keyman\7.0\src\desktop\kmshell\xml;C:\keyman\7.0\src\developer\help;C:\keyman\7.0\src\developer\inst;C:\keyman\7.0\src\developer\kmcmpdll;C:\keyman\7.0\src\developer\kmcomp;C:\keyman\7.0\src\developer\samples;C:\keyman\7.0\src\developer\stock;C:\keyman\7.0\src\developer\TIKE;C:\keyman\7.0\src\developer\uitemplates;C:\keyman\7.0\src\developer\help\context;C:\keyman\7.0\src\developer\help\guide;C:\keyman\7.0\src\developer\help\idx;C:\keyman\7.0\src\developer\help\img;C:\keyman\7.0\src\developer\help\imx;C:\keyman\7.0\src\developer\help\inc;C:\keyman\7.0\src\developer\help\main;C:\keyman\7.0\src\developer\help\reference;C:\keyman\7.0\src\developer\help\rtf;C:\keyman\7.0\src\developer\help\tutorial;C:\keyman\7.0\src\developer\inst\Bitmaps;C:\keyman\7.0\src\developer\inst\data;C:\keyman\7.0\src\developer\inst\devinsthelper;C:\keyman\7.0\src\developer\inst\fonts;C:\keyman\7.0\src\developer\inst\old;C:\keyman\7.0\src\developer\inst\prodinsthelp;C:\keyman\7.0\src\developer\inst\version_upgrade;C:\keyman\7.0\src\developer\inst\wix;C:\keyman\7.0\src\developer\inst\version_upgrade\old_cpp;C:\keyman\7.0\src\developer\inst\wix\Bitmaps;C:\keyman\7.0\src\developer\inst\wix\doc;C:\keyman\7.0\src\developer\inst\wix\examples;C:\keyman\7.0\src\developer\inst\wix\inc;C:\keyman\7.0\src\developer\inst\wix\lib;C:\keyman\7.0\src\developer\inst\wix\examples\first;C:\keyman\7.0\src\developer\inst\wix\examples\simple;C:\keyman\7.0\src\developer\inst\wix\examples\simple\bin;C:\keyman\7.0\src\developer\kmcmpdll\debug;C:\keyman\7.0\src\developer\kmcmpdll\Release;C:\keyman\7.0\src\developer\samples\Examples;C:\keyman\7.0\src\developer\samples\imsample;C:\keyman\7.0\src\developer\samples\Products;C:\keyman\7.0\src\developer\samples\Tests;C:\keyman\7.0\src\developer\samples\Products\LaoUnicode;C:\keyman\7.0\src\developer\samples\Products\LaoUnicode\LaoUnicode;C:\keyman\7.0\src\developer\samples\Products\LaoUnicode\LaoUnicode\bin;C:\keyman\7.0\src\developer\samples\Products\LaoUnicode\LaoUnicode\My Project;C:\keyman\7.0\src\developer\samples\Products\LaoUnicode\LaoUnicode\obj;C:\keyman\7.0\src\developer\samples\Products\LaoUnicode\LaoUnicode\bin\Debug;C:\keyman\7.0\src\developer\samples\Products\LaoUnicode\LaoUnicode\bin\Release;C:\keyman\7.0\src\developer\samples\Products\LaoUnicode\LaoUnicode\obj\Debug;C:\keyman\7.0\src\developer\samples\Products\LaoUnicode\LaoUnicode\obj\Release;C:\keyman\7.0\src\developer\samples\Products\LaoUnicode\LaoUnicode\obj\Debug\TempPE;C:\keyman\7.0\src\developer\samples\Products\LaoUnicode\LaoUnicode\obj\Release\TempPE;C:\keyman\7.0\src\developer\TIKE\actions;C:\keyman\7.0\src\developer\TIKE\activation;C:\keyman\7.0\src\developer\TIKE\child;C:\keyman\7.0\src\developer\TIKE\compile;C:\keyman\7.0\src\developer\TIKE\crm;C:\keyman\7.0\src\developer\TIKE\debug;C:\keyman\7.0\src\developer\TIKE\dialogs;C:\keyman\7.0\src\developer\TIKE\dockforms;C:\keyman\7.0\src\developer\TIKE\help;C:\keyman\7.0\src\developer\TIKE\kct;C:\keyman\7.0\src\developer\TIKE\main;C:\keyman\7.0\src\developer\TIKE\project;C:\keyman\7.0\src\developer\TIKE\rel;C:\keyman\7.0\src\developer\TIKE\tests;C:\keyman\7.0\src\developer\TIKE\xml;C:\keyman\7.0\src\developer\TIKE\kct\Editors;C:\keyman\7.0\src\developer\TIKE\kct\icons;C:\keyman\7.0\src\developer\TIKE\xml\help;C:\keyman\7.0\src\developer\TIKE\xml\product;C:\keyman\7.0\src\developer\TIKE\xml\project;C:\keyman\7.0\src\engine\inst;C:\keyman\7.0\src\engine\keyman;C:\keyman\7.0\src\engine\keyman32;C:\keyman\7.0\src\engine\kmcomapi;C:\keyman\7.0\src\engine\inst\insthelper;C:\keyman\7.0\src\engine\keyman\viskbd;C:\keyman\7.0\src\engine\keyman32\appint;C:\keyman\7.0\src\engine\kmcomapi\com;C:\keyman\7.0\src\engine\kmcomapi\idl;C:\keyman\7.0\src\engine\kmcomapi\processes;C:\keyman\7.0\src\engine\kmcomapi\util;C:\keyman\7.0\src\engine\kmcomapi\com\addins;C:\keyman\7.0\src\engine\kmcomapi\com\customisation;C:\keyman\7.0\src\engine\kmcomapi\com\errors;C:\keyman\7.0\src\engine\kmcomapi\com\hotkeys;C:\keyman\7.0\src\engine\kmcomapi\com\keyboards;C:\keyman\7.0\src\engine\kmcomapi\com\languages;C:\keyman\7.0\src\engine\kmcomapi\com\licences;C:\keyman\7.0\src\engine\kmcomapi\com\options;C:\keyman\7.0\src\engine\kmcomapi\com\packages;C:\keyman\7.0\src\engine\kmcomapi\com\products;C:\keyman\7.0\src\engine\kmcomapi\com\system;C:\keyman\7.0\src\engine\kmcomapi\processes\addin;C:\keyman\7.0\src\engine\kmcomapi\processes\font;C:\keyman\7.0\src\engine\kmcomapi\processes\keyboard;C:\keyman\7.0\src\engine\kmcomapi\processes\package;C:\keyman\7.0\src\engine\kmcomapi\processes\product;C:\keyman\7.0\src\engine\kmcomapi\processes\visualkeyboard;C:\keyman\7.0\src\global\delphi;C:\keyman\7.0\src\global\help;C:\keyman\7.0\src\global\inc;C:\keyman\7.0\src\global\inst;C:\keyman\7.0\src\global\res;C:\keyman\7.0\src\global\vc;C:\keyman\7.0\src\global\wix;C:\keyman\7.0\src\global\delphi\charmap;C:\keyman\7.0\src\global\delphi\comp;C:\keyman\7.0\src\global\delphi\crypt;C:\keyman\7.0\src\global\delphi\cust;C:\keyman\7.0\src\global\delphi\debug;C:\keyman\7.0\src\global\delphi\dragdrop;C:\keyman\7.0\src\global\delphi\excmagic;C:\keyman\7.0\src\global\delphi\folderdlg;C:\keyman\7.0\src\global\delphi\general;C:\keyman\7.0\src\global\delphi\htmlhelp;C:\keyman\7.0\src\global\delphi\hwkey;C:\keyman\7.0\src\global\delphi\indy;C:\keyman\7.0\src\global\delphi\jedi;C:\keyman\7.0\src\global\delphi\online;C:\keyman\7.0\src\global\delphi\plusmemou;C:\keyman\7.0\src\global\delphi\png;C:\keyman\7.0\src\global\delphi\productactivation;C:\keyman\7.0\src\global\delphi\tlb;C:\keyman\7.0\src\global\delphi\vcl;C:\keyman\7.0\src\global\delphi\vclzip;C:\keyman\7.0\src\global\delphi\visualkeyboard;C:\keyman\7.0\src\global\delphi\xdom;C:\keyman\7.0\src\global\delphi\xstringgrid;C:\keyman\7.0\src\global\delphi\comp\bitmapeditor;C:\keyman\7.0\src\global\delphi\crypt\Ciphers;C:\keyman\7.0\src\global\delphi\crypt\Docs;C:\keyman\7.0\src\global\delphi\crypt\Hashes;C:\keyman\7.0\src\global\delphi\excmagic\unit;C:\keyman\7.0\src\global\delphi\excmagic\unit\RC;C:\keyman\7.0\src\global\delphi\indy\Core;C:\keyman\7.0\src\global\delphi\indy\Protocols;C:\keyman\7.0\src\global\delphi\indy\SuperCore;C:\keyman\7.0\src\global\delphi\indy\System;C:\keyman\7.0\src\global\inst\data;C:\keyman\7.0\src\global\inst\data\Unihan;C:\keyman\7.0\src\global\res\70;C:\keyman\7.0\src\global\res\bmp;C:\keyman\7.0\src\global\res\cimu;C:\keyman\7.0\src\global\res\geezword;C:\keyman\7.0\src\global\res\keyman;C:\keyman\7.0\src\global\res\lswin;C:\keyman\7.0\src\global\res\paul;C:\keyman\7.0\src\global\res\70\desktop;C:\keyman\7.0\src\global\res\70\developer;C:\keyman\7.0\src\global\res\70\filetypes;C:\keyman\7.0\src\global\res\bmp\splash;C:\keyman\7.0\src\global\res\geezword\bmp;C:\keyman\7.0\src\global\res\geezword\ico;C:\keyman\7.0\src\global\res\geezword\other;C:\keyman\7.0\src\global\res\geezword\ico\16x16;C:\keyman\7.0\src\global\res\geezword\ico\32x32;C:\keyman\7.0\src\global\res\geezword\ico\unused;C:\keyman\7.0\src\global\res\keyman\bmp;C:\keyman\7.0\src\global\res\keyman\ico;C:\keyman\7.0\src\global\res\keyman\other;C:\keyman\7.0\src\global\res\keyman\bmp\startup;C:\keyman\7.0\src\global\res\keyman\bmp\tip;C:\keyman\7.0\src\global\res\keyman\ico\16x16;C:\keyman\7.0\src\global\res\keyman\ico\32x32;C:\keyman\7.0\src\global\res\keyman\ico\unused;C:\keyman\7.0\src\global\res\lswin\bmp;C:\keyman\7.0\src\global\res\lswin\ico;C:\keyman\7.0\src\global\res\lswin\other;C:\keyman\7.0\src\global\res\lswin\ico\16x16;C:\keyman\7.0\src\global\res\lswin\ico\32x32;C:\keyman\7.0\src\global\res\lswin\ico\unused;C:\keyman\7.0\src\global\res\paul\dev-images;C:\keyman\7.0\src\global\res\paul\dev-images\6.0-icons;C:\keyman\7.0\src\global\res\paul\dev-images\filetypes;C:\keyman\7.0\src\global\res\paul\dev-images\icons;C:\keyman\7.0\src\global\res\paul\dev-images\install;C:\keyman\7.0\src\global\res\paul\dev-images\keyman;C:\keyman\7.0\src\global\res\paul\dev-images\tike;C:\keyman\7.0\src\global\res\paul\dev-images\6.0-icons\16x16;C:\keyman\7.0\src\global\res\paul\dev-images\6.0-icons\32x32;C:\keyman\7.0\src\global\res\paul\dev-images\6.0-icons\unused;C:\keyman\7.0\src\global\res\paul\dev-images\keyman\icons;C:\keyman\7.0\src\global\res\paul\dev-images\keyman\xml;C:\keyman\7.0\src\global\res\paul\dev-images\keyman\xml\img;C:\keyman\7.0\src\global\res\paul\dev-images\keyman\xml\kbimg;C:\keyman\7.0\src\global\res\paul\dev-images\tike\xml;C:\keyman\7.0\src\global\res\paul\dev-images\tike\xml\kmg;C:\keyman\7.0\src\global\wix\wixui;C:\keyman\7.0\src\global\wix\wixui\Bitmaps;C:\keyman\7.0\src\global\wix\wixui\featuretree;C:\keyman\7.0\src\global\wix\wixui\installdir;C:\keyman\7.0\src\global\wix\wixui\minimal;C:\keyman\7.0\src\global\wix\wixui\mondo;C:\keyman\7.0\src\online\certificate;C:\keyman\7.0\src\online\k61licence;C:\keyman\7.0\src\online\kencrypt;C:\keyman\7.0\src\online\klicence;C:\keyman\7.0\src\support\braziliantest;C:\keyman\7.0\src\support\imtest;C:\keyman\7.0\src\support\kdebug;C:\keyman\7.0\src\support\keycodetester;C:\keyman\7.0\src\support\kmdecomp;C:\keyman\7.0\src\support\richedit_examine;C:\keyman\7.0\src\support\testcryptdepend;C:\keyman\7.0\src\support\windowinfo;C:\keyman\7.0\src\support\xstringtest;C:\keyman\7.0\src\test\regressiontest;C:\keyman\7.0\src\test\test-comapi;C:\keyman\7.0\src\test\test_alphanumcode;C:\keyman\7.0\src\test\test_uuidgen;C:\keyman\7.0\src\test\regressiontest\tests;C:\keyman\7.0\src\test\test_uuidgen\del_uuidgen;C:\keyman\7.0\src\test\test_uuidgen\vc_uuidgen;C:\keyman\7.0\src\test\test_uuidgen\vc_uuidgen\vc_uuidgen' - - - - - diff --git a/windows/src/developer/TIKE/Tike.cfg b/windows/src/developer/TIKE/Tike.cfg deleted file mode 100644 index 0b7e0dd068..0000000000 --- a/windows/src/developer/TIKE/Tike.cfg +++ /dev/null @@ -1,45 +0,0 @@ --$A1 --$B- --$C+ --$D+ --$E- --$F- --$G+ --$H+ --$I+ --$J+ --$K- --$L+ --$M- --$N+ --$O- --$P+ --$Q+ --$R+ --$S- --$T- --$U- --$V+ --$W+ --$X+ --$Y+ --$Z1 --GD --cg --vn --AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; --H+ --W+ --M --$M16384,1048576 --K$00400000 --LE"C:\Users\mcdurdin.TAVULTESOFT\Documents\Borland Studio Projects\Bpl" --LN"C:\Users\mcdurdin.TAVULTESOFT\Documents\Borland Studio Projects\Bpl" --U"c:\program files\borland\bds\4.0\lib\Debug;c:\program files\borland\bds\4.0\Lib\Debug\Indy10;c:\program files\borland\bds\4.0\lib;c:\keyman\8.0\src\global\delphi\jedi;C:\keyman\8.0\src\global\delphi\vcl;\keyman\8.0\cmpsrc\mbcolor;C:\keyman\8.0\cmpsrc\embeddedwb\source" --O"c:\program files\borland\bds\4.0\lib\Debug;c:\program files\borland\bds\4.0\Lib\Debug\Indy10;c:\program files\borland\bds\4.0\lib;c:\keyman\8.0\src\global\delphi\jedi;C:\keyman\8.0\src\global\delphi\vcl;\keyman\8.0\cmpsrc\mbcolor;C:\keyman\8.0\cmpsrc\embeddedwb\source" --I"c:\program files\borland\bds\4.0\lib\Debug;c:\program files\borland\bds\4.0\Lib\Debug\Indy10;c:\program files\borland\bds\4.0\lib;c:\keyman\8.0\src\global\delphi\jedi;C:\keyman\8.0\src\global\delphi\vcl;\keyman\8.0\cmpsrc\mbcolor;C:\keyman\8.0\cmpsrc\embeddedwb\source" --R"c:\program files\borland\bds\4.0\lib\Debug;c:\program files\borland\bds\4.0\Lib\Debug\Indy10;c:\program files\borland\bds\4.0\lib;c:\keyman\8.0\src\global\delphi\jedi;C:\keyman\8.0\src\global\delphi\vcl;\keyman\8.0\cmpsrc\mbcolor;C:\keyman\8.0\cmpsrc\embeddedwb\source" --DVERSION_KEYMAN_DEVELOPER;DaoCheck;DaoNamedEx;DaoDebug;DaoMessageEx;DAOIdent --w-UNSAFE_TYPE --w-UNSAFE_CODE --w-UNSAFE_CAST diff --git a/windows/src/developer/TIKE/Tike.dof b/windows/src/developer/TIKE/Tike.dof deleted file mode 100644 index e227ed2d3b..0000000000 --- a/windows/src/developer/TIKE/Tike.dof +++ /dev/null @@ -1,82 +0,0 @@ -[Compiler] -A=1 -B=0 -C=1 -D=1 -E=0 -F=0 -G=1 -H=1 -I=1 -J=1 -K=0 -L=1 -M=0 -N=1 -O=0 -P=1 -Q=1 -R=1 -S=0 -T=0 -U=0 -V=1 -W=1 -X=1 -Y=2 -Z=1 -ShowHints=1 -ShowWarnings=1 -UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; -[Linker] -MapFile=3 -OutputObjs=0 -ConsoleApp=1 -DebugInfo=1 -RemoteSymbols=0 -MinStackSize=16384 -MaxStackSize=1048576 -ImageBase=4194304 -ExeDescription= -[Directories] -OutputDir= -UnitOutputDir= -PackageDLLOutputDir= -PackageDCPOutputDir= -SearchPath=$(DELPHI)\lib;$(DELPHI)\source\vcl;\keyman\8.0\src\global\delphi\jedi -Packages=Vcl40;Vclx40;comp51;VCLZipD4;PMemoPack4;dclkmn;vcljpg40;Vcl50;Vclx50 -Conditionals=VERSION_KEYMAN_DEVELOPER;DaoCheck;DaoNamedEx;DaoDebug;DaoMessageEx;DAOIdent -DebugSourceDirs= -UsePackages=0 -[Parameters] -RunParams= -HostApplication= -[Language] -ActiveLang= -ProjectLang=$00000C09 -RootDir= -[Version Info] -IncludeVerInfo=0 -AutoIncBuild=1 -MajorVer=5 -MinorVer=0 -Release=0 -Build=23 -Debug=0 -PreRelease=0 -Special=0 -Private=0 -DLL=0 -Locale=3081 -CodePage=1252 -[Version Info Keys] -CompanyName= -FileDescription=Tavultesoft IKE -FileVersion=5.0.0.23 -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename= -ProductName= -ProductVersion=5.0.0.0 -Comments= diff --git a/windows/src/developer/kmanalyze/kmanalyze.vcxproj b/windows/src/developer/kmanalyze/kmanalyze.vcxproj index 1834faf3bb..a095aaaf4f 100644 --- a/windows/src/developer/kmanalyze/kmanalyze.vcxproj +++ b/windows/src/developer/kmanalyze/kmanalyze.vcxproj @@ -23,32 +23,32 @@ {4EAE6DFD-E18A-493D-A00F-4846A2593F56} Win32Proj kmanalyze - 10.0.17763.0 + 10.0 Application true - v141 + v142 MultiByte Application false - v141 + v142 true MultiByte Application true - v141 + v142 MultiByte Application false - v141 + v142 true MultiByte diff --git a/windows/src/developer/kmcmpdll/kmcmpdll.vcxproj b/windows/src/developer/kmcmpdll/kmcmpdll.vcxproj index 6556493822..d76e7e72d7 100644 --- a/windows/src/developer/kmcmpdll/kmcmpdll.vcxproj +++ b/windows/src/developer/kmcmpdll/kmcmpdll.vcxproj @@ -21,28 +21,28 @@ {7E26FE08-721E-424B-9DA0-4A0DCA88A86E} kmcmpdll - 10.0.17763.0 + 10.0 DynamicLibrary false - v141 + v142 DynamicLibrary false - v141 + v142 DynamicLibrary false - v141 + v142 DynamicLibrary false - v141 + v142 diff --git a/windows/src/developer/kmcomp/kmcomp.bdsproj b/windows/src/developer/kmcomp/kmcomp.bdsproj deleted file mode 100644 index 37865a3c09..0000000000 --- a/windows/src/developer/kmcomp/kmcomp.bdsproj +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - - - - - - kmcomp.dpr - - - 7.0 - - - 1 - 0 - 0 - 1 - 0 - 0 - 1 - 1 - 0 - 1 - 0 - 1 - 0 - 1 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 2 - 1 - True - True - WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; - - False - - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - False - False - False - True - True - True - True - True - True - - - - 3 - 0 - False - 0 - True - False - False - 16384 - 1048576 - 4194304 - - - - - - - - ..\..\global\delphi\vclzip;..\..\resellers;C:\keyman\8.0\src\global\delphi\jedi - VCL40;VCLX40;VCLDB40;VCLDBX40;VCLSMP40;QRPT40;TEEUI40;TEEDB40;TEE40;ibevnt40;nmfast40;bcutil;VCLJPG40;bccomp;bcdb;bcacct;bcappt - KPSMALL;VERSION_KEYMAN_DEVELOPER - - False - - - ktunaxa3.kps - - - False - S:\Tavultesoft\Customers\FirstVoices\Keyman for FV 70\keyboards\Ktunaxa3 - - True - False - - - - $00000C09 - - - - False - False - 0 - 8 - 0 - 14 - False - False - False - False - False - 3081 - 1252 - - - CASEG Practice Computing - Blue Chip - 0.8.0.14 - BlueChip - Copyright © 1997-1999 CASEG Practice Computing - - BlueChip.exe - Blue Chip - 1.0.0.0 - - - - diff --git a/windows/src/developer/kmcomp/kmcomp.dof b/windows/src/developer/kmcomp/kmcomp.dof deleted file mode 100644 index b68b05111c..0000000000 --- a/windows/src/developer/kmcomp/kmcomp.dof +++ /dev/null @@ -1,92 +0,0 @@ -[Compiler] -A=1 -B=0 -C=0 -D=1 -E=0 -F=0 -G=1 -H=1 -I=0 -J=1 -K=0 -L=1 -M=0 -N=1 -O=1 -P=1 -Q=0 -R=0 -S=0 -T=0 -U=0 -V=1 -W=1 -X=1 -Y=2 -Z=1 -ShowHints=1 -ShowWarnings=1 -UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; -[Linker] -MapFile=3 -OutputObjs=0 -ConsoleApp=0 -DebugInfo=1 -RemoteSymbols=0 -MinStackSize=16384 -MaxStackSize=1048576 -ImageBase=4194304 -ExeDescription= -[Directories] -OutputDir= -UnitOutputDir= -PackageDLLOutputDir= -PackageDCPOutputDir= -SearchPath=..\..\global\delphi\vclzip;..\..\resellers;C:\keyman\8.0\src\global\delphi\jedi -Packages=VCL40;VCLX40;VCLDB40;VCLDBX40;VCLSMP40;QRPT40;TEEUI40;TEEDB40;TEE40;ibevnt40;nmfast40;bcutil;VCLJPG40;bccomp;bcdb;bcacct;bcappt -Conditionals=KPSMALL;VERSION_KEYMAN_DEVELOPER -DebugSourceDirs= -UsePackages=0 -[Parameters] -RunParams=-Pc:\keyman\8.0\bin\keyman c:\keyman\8.0\src\addins\inst\wordlink.kps -HostApplication= -[Language] -ActiveLang= -ProjectLang=$00000C09 -RootDir= -[Version Info] -IncludeVerInfo=1 -AutoIncBuild=0 -MajorVer=0 -MinorVer=8 -Release=0 -Build=14 -Debug=0 -PreRelease=0 -Special=0 -Private=0 -DLL=0 -Locale=3081 -CodePage=1252 -[Version Info Keys] -CompanyName=CASEG Practice Computing -FileDescription=Blue Chip -FileVersion=0.8.0.14 -InternalName=BlueChip -LegalCopyright=Copyright © 1997-1999 CASEG Practice Computing -LegalTrademarks= -OriginalFilename=BlueChip.exe -ProductName=Blue Chip -ProductVersion=1.0.0.0 -Comments= -[HistoryLists\hlConditionals] -Count=1 -Item0=KPSMALL;VERSION_KEYMAN_DEVELOPER -[HistoryLists\hlUnitAliases] -Count=1 -Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; -[HistoryLists\hlSearchPath] -Count=2 -Item0=..\..\global\delphi\vclzip;..\..\resellers;C:\keyman\8.0\src\global\delphi\jedi -Item1=..\..\global\delphi\vclzip;..\..\resellers diff --git a/windows/src/developer/kmdecomp/kmdecomp.vcxproj b/windows/src/developer/kmdecomp/kmdecomp.vcxproj index 57f3814202..1431c7bfab 100644 --- a/windows/src/developer/kmdecomp/kmdecomp.vcxproj +++ b/windows/src/developer/kmdecomp/kmdecomp.vcxproj @@ -12,20 +12,20 @@ {963D608A-6689-469C-AE42-F56696DD42CC} - 10.0.17763.0 + 10.0 Application false MultiByte - v141 + v142 Application false MultiByte - v141 + v142 diff --git a/windows/src/developer/setup/setup.bdsproj b/windows/src/developer/setup/setup.bdsproj deleted file mode 100644 index e2450d3cc3..0000000000 --- a/windows/src/developer/setup/setup.bdsproj +++ /dev/null @@ -1,177 +0,0 @@ - - - - - - - - - - - - setup.dpr - - - 7.0 - - - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - 0 - 1 - 1 - 1 - 2 - 1 - True - True - WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; - - False - - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - False - False - False - True - True - True - True - True - True - - - - 3 - 0 - False - 1 - True - False - False - 16384 - 1048576 - 4194304 - - - - - - - - C:\keyman\8.0\src\global\delphi\jedi - Vcl40;Vclx40;comp51;VCLZipD4;PMemoPack4;dclkmn;vcljpg40;Vcl50;Vclx50;vcl;rtl;vclactnband;vclx;dbrtl;adortl;vcldb;bdertl;vcldbx;dbxcds;dbexpress;vclib;ibxpress;xmlrtl;vclie;inet;inetdbbde;inetdbxpress;dsnap;VclSmp;soaprtl;keyman_components;TntUnicodeVcl;tb2k_d10;tbx_d10;SpTBXLib_d10;SpTBXMemoPackage;IndyCore;IndySystem;IndyProtocols;IntrawebDB_80_100;Intraweb_80_100;dclOfficeXP;mbColorLibD9D;marcscancomponents;teeui;teedb;tee - VERSION_KEYMAN_DEVELOPER;DaoCheck;DaoNamedEx;DaoDebug;DaoMessageEx;DAOIdent - - False - - - - - - False - - - True - False - - - - $00000C09 - - - - False - True - 5 - 0 - 0 - 32 - False - False - False - False - False - 3081 - 1252 - - - - Tavultesoft IKE - 5.0.0.32 - - - - - - 5.0.0.0 - - - - - - diff --git a/windows/src/developer/setup/setup.cfg b/windows/src/developer/setup/setup.cfg deleted file mode 100644 index 02a5b4d8b8..0000000000 --- a/windows/src/developer/setup/setup.cfg +++ /dev/null @@ -1,45 +0,0 @@ --$A1 --$B- --$C+ --$D+ --$E- --$F- --$G+ --$H+ --$I+ --$J+ --$K- --$L+ --$M- --$N+ --$O+ --$P+ --$Q+ --$R+ --$S- --$T- --$U- --$V+ --$W+ --$X+ --$Y+ --$Z1 --GD --cg --vn --AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; --H+ --W+ --M --$M16384,1048576 --K$00400000 --LE"C:\Users\mcdurdin.TAVULTESOFT\Documents\Borland Studio Projects\Bpl" --LN"C:\Users\mcdurdin.TAVULTESOFT\Documents\Borland Studio Projects\Bpl" --U"C:\keyman\8.0\src\global\delphi\jedi" --O"C:\keyman\8.0\src\global\delphi\jedi" --I"C:\keyman\8.0\src\global\delphi\jedi" --R"C:\keyman\8.0\src\global\delphi\jedi" --DVERSION_KEYMAN_DEVELOPER;DaoCheck;DaoNamedEx;DaoDebug;DaoMessageEx;DAOIdent --w-UNSAFE_TYPE --w-UNSAFE_CODE --w-UNSAFE_CAST diff --git a/windows/src/engine/README.md b/windows/src/engine/README.md new file mode 100644 index 0000000000..ab1202a5a4 --- /dev/null +++ b/windows/src/engine/README.md @@ -0,0 +1,36 @@ +# Keyman Engine for Windows + +There are a number of build artifacts that make up the Keyman Engine. This is a brief description of each artifact's purpose. + +## inst - keymanengine.msm + +The installation merge module database for the Keyman Engine. + +## keyman - keyman.exe + +Host application for the Keyman Engine. Shows the Keyman icon, Keyman menu, OSK, and handles language switching etc, as well as running the windows hooks to capture and translate keystrokes. + +## keymanx64 - keymanx64.exe + +64-bit version of keyman.exe. All UI is in keyman.exe, so this is a thin wrapper around the keyman32 build. + +## kmcomapi - kmcomapi.dll | kmcomapi.x64.dll + +This is the public COM API library, used by keyman.exe, kmshell.exe, and various other Keyman and 3rd party programs. + +## kmrefresh - kmrefresh.x86.exe & kmrefresh.x64.exe + +A helper app to refresh Windows language settings, due to a bug in Windows; read ../kmrefresh/kmrefresh.cpp for details. + +## kmtip - kmtip.dll | kmtip64.dll + +Implementation of a Text Service for the Text Services Framework (TSF). This implementation is named Keyman TIP. +Architecturally it sits between the TSF Manager and Keyman.exe + +## mcompile - mcompile.exe + +A tool to recompile keyboard layouts after install to map to various European Latin script keyboard layouts + +## tsysinfo - tsysinfo.exe & tsysinfox64.exe + +Diagnostics diff --git a/windows/src/engine/inst/insthelper/insthelper.bdsproj b/windows/src/engine/inst/insthelper/insthelper.bdsproj deleted file mode 100644 index ed913edc76..0000000000 --- a/windows/src/engine/inst/insthelper/insthelper.bdsproj +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - - - - - - insthelper.dpr - - - 7.0 - - - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 1 - 0 - 1 - 0 - 1 - 0 - 1 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - True - True - WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; - - False - - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - False - False - False - True - True - True - True - True - True - - - - 3 - 0 - False - 1 - True - True - False - 16384 - 1048576 - 4194304 - Keyman Engine Installer Functions - - - - - - - c:\keyman\8.0\src\global\delphi\jedi - vclie50;Vcl50;Inetdb50;Inet50;Vcldb50;Vclx50;Vclbde50;proide50 - - - False - - - -path c:\keyman\7.0\test -pri -pi c:\keyman\7.0\test\keyman.kce - C:\keyman\5.1\src\dist\kmshell\kmshell.exe - - False - - - True - False - - - - $00000C09 - - - - False - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 3081 - 1252 - - - - Tavultesoft IKE - 5.0.0.23 - - - - - - 5.0.0.0 - - - - True - diff --git a/windows/src/engine/inst/insthelper/insthelper.cfg b/windows/src/engine/inst/insthelper/insthelper.cfg deleted file mode 100644 index 53a023ffa2..0000000000 --- a/windows/src/engine/inst/insthelper/insthelper.cfg +++ /dev/null @@ -1,45 +0,0 @@ --$A1 --$B- --$C+ --$D+ --$E- --$F- --$G+ --$H+ --$I- --$J+ --$K- --$L+ --$M- --$N+ --$O+ --$P+ --$Q- --$R- --$S- --$T- --$U- --$V+ --$W+ --$X+ --$YD --$Z1 --GD --cg --vn --vr --AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; --H+ --W+ --M --$M16384,1048576 --K$00400000 --LE"C:\Users\mcdurdin.TAVULTESOFT\Documents\Borland Studio Projects\Bpl" --LN"C:\Users\mcdurdin.TAVULTESOFT\Documents\Borland Studio Projects\Bpl" --U"c:\keyman\8.0\src\global\delphi\jedi" --O"c:\keyman\8.0\src\global\delphi\jedi" --I"c:\keyman\8.0\src\global\delphi\jedi" --R"c:\keyman\8.0\src\global\delphi\jedi" --w-UNSAFE_TYPE --w-UNSAFE_CODE --w-UNSAFE_CAST diff --git a/windows/src/engine/inst/insthelper/insthelper.dof b/windows/src/engine/inst/insthelper/insthelper.dof deleted file mode 100644 index f5d596b508..0000000000 --- a/windows/src/engine/inst/insthelper/insthelper.dof +++ /dev/null @@ -1,92 +0,0 @@ -[Compiler] -A=1 -B=0 -C=1 -D=1 -E=0 -F=0 -G=1 -H=1 -I=0 -J=1 -K=0 -L=1 -M=0 -N=1 -O=1 -P=1 -Q=0 -R=0 -S=0 -T=0 -U=0 -V=1 -W=1 -X=1 -Y=1 -Z=1 -ShowHints=1 -ShowWarnings=1 -UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; -[Linker] -MapFile=0 -OutputObjs=0 -ConsoleApp=1 -DebugInfo=1 -RemoteSymbols=1 -MinStackSize=16384 -MaxStackSize=1048576 -ImageBase=4194304 -ExeDescription=Greatis Form Designer Design-Time Package -[Directories] -OutputDir= -UnitOutputDir= -PackageDLLOutputDir= -PackageDCPOutputDir= -SearchPath=c:\keyman\8.0\src\global\delphi\jedi -Packages=vclie50;Vcl50;Inetdb50;Inet50;Vcldb50;Vclx50;Vclbde50;proide50 -Conditionals= -DebugSourceDirs= -UsePackages=0 -[Parameters] -RunParams=-path c:\keyman\8.0\test -pri -pi c:\keyman\8.0\test\keyman.kce -HostApplication=C:\keyman\5.1\src\dist\kmshell\kmshell.exe -[Language] -ActiveLang= -ProjectLang=$00000C09 -RootDir= -[Version Info] -IncludeVerInfo=0 -AutoIncBuild=0 -MajorVer=1 -MinorVer=0 -Release=0 -Build=0 -Debug=0 -PreRelease=0 -Special=0 -Private=0 -DLL=0 -Locale=3081 -CodePage=1252 -[Excluded Packages] -$(DELPHI)\Bin\stride50.bpl=String Resource Editor IDE Package -[HistoryLists\hlDebugSourcePath] -Count=1 -Item0=$(DELPHI)\source\vcl -[HistoryLists\hlConditionals] -Count=2 -Item0=KPSMALL -Item1=VISUALKEYBOARD_NOCUSTOMBITMAP;VERSION_KEYMAN_REDIST;RELEASE_KEYMAN -[HistoryLists\hlUnitAliases] -Count=1 -Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; -[HistoryLists\hlSearchPath] -Count=4 -Item0=c:\keyman\8.0\src\global\delphi\jedi -Item1=$(DELPHI)\source\vcl;c:\keyman\5.1\src\global\delphi\vclzip -Item2=$(DELPHI)\source\rtl\sys;$(DELPHI)\source\vcl;c:\keyman\5.1\src\global\delphi\vclzip -Item3=c:\keyman\5.1\src\global\delphi\vclzip;c:\keyman\5.1\src\global\delphi\folderdlg -[HistoryLists\hlOutputDirectorry] -Count=1 -Item0=c:\temp\kmshell-test diff --git a/windows/src/engine/inst/insthelper/insthelper.dproj b/windows/src/engine/inst/insthelper/insthelper.dproj index 8f04a71e01..7dda79c18f 100644 --- a/windows/src/engine/inst/insthelper/insthelper.dproj +++ b/windows/src/engine/inst/insthelper/insthelper.dproj @@ -7,7 +7,7 @@ 1 Library None - 18.4 + 18.8 Win32 @@ -211,12 +211,16 @@ true + + + true + + 1 - Contents\MacOS 0 @@ -225,6 +229,20 @@ classes 1 + + classes + 1 + + + + + res\xml + 1 + + + res\xml + 1 + @@ -237,90 +255,242 @@ library\lib\armeabi 1 + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + library\lib\mips 1 + + library\lib\mips + 1 + library\lib\armeabi-v7a 1 + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + res\drawable 1 + + res\drawable + 1 + res\values 1 + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + res\drawable 1 + + res\drawable + 1 + res\drawable-xxhdpi 1 + + res\drawable-xxhdpi + 1 + res\drawable-ldpi 1 + + res\drawable-ldpi + 1 + res\drawable-mdpi 1 + + res\drawable-mdpi + 1 + res\drawable-hdpi 1 + + res\drawable-hdpi + 1 + res\drawable-xhdpi 1 + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + res\drawable-small 1 + + res\drawable-small + 1 + res\drawable-normal 1 + + res\drawable-normal + 1 + res\drawable-large 1 + + res\drawable-large + 1 + res\drawable-xlarge 1 + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + @@ -338,6 +508,10 @@ 1 .framework + + 1 + .framework + 0 @@ -347,6 +521,10 @@ 1 .dylib + + 1 + .dylib + 0 .dll;.bpl @@ -369,6 +547,10 @@ 1 .dylib + + 1 + .dylib + 0 .bpl @@ -378,6 +560,9 @@ 0 + + 0 + 0 @@ -390,6 +575,9 @@ 0 + + 0 + 0 @@ -405,6 +593,17 @@ 1 + + + 1 + + + 1 + + + 1 + + 1 @@ -416,6 +615,39 @@ 1 + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + 1 @@ -427,6 +659,61 @@ 1 + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + 1 @@ -438,6 +725,116 @@ 1 + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + 1 @@ -471,10 +868,35 @@ 1 + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + 1 + + 1 + @@ -500,6 +922,7 @@ 1 + @@ -507,12 +930,20 @@ Contents\Resources 1 + + Contents\Resources + 1 + library\lib\armeabi-v7a 1 + + library\lib\arm64-v8a + 1 + 1 @@ -528,10 +959,19 @@ 1 + + 1 + 0 + + + library\lib\armeabi-v7a + 1 + + 1 @@ -567,7 +1007,9 @@ + + 12 diff --git a/windows/src/engine/keyman/keyman.cfg b/windows/src/engine/keyman/keyman.cfg deleted file mode 100644 index 429e1f0296..0000000000 --- a/windows/src/engine/keyman/keyman.cfg +++ /dev/null @@ -1,45 +0,0 @@ --$A1 --$B- --$C+ --$D+ --$E- --$F- --$G+ --$H+ --$I- --$J+ --$K- --$L+ --$M- --$N+ --$O- --$P+ --$Q- --$R- --$S- --$T- --$U- --$V+ --$W+ --$X+ --$Y+ --$Z1 --GD --cg --vn --AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; --H+ --W+ --M --$M16384,1048576 --K$2C400000 --LE"C:\Users\mcdurdin.TAVULTESOFT\Documents\Borland Studio Projects\Bpl" --LN"C:\Users\mcdurdin.TAVULTESOFT\Documents\Borland Studio Projects\Bpl" --U"c:\keyman\8.0\src\global\delphi\vcl;c:\program files\borland\bds\4.0\lib;\keyman\8.0\src\global\delphi\jedi;C:\keyman\8.0\src\global\delphi\vcl;\keyman\8.0\cmpsrc\mbcolor;\keyman\8.0\cmpsrc\embeddedwb\source" --O"c:\keyman\8.0\src\global\delphi\vcl;c:\program files\borland\bds\4.0\lib;\keyman\8.0\src\global\delphi\jedi;C:\keyman\8.0\src\global\delphi\vcl;\keyman\8.0\cmpsrc\mbcolor;\keyman\8.0\cmpsrc\embeddedwb\source" --I"c:\keyman\8.0\src\global\delphi\vcl;c:\program files\borland\bds\4.0\lib;\keyman\8.0\src\global\delphi\jedi;C:\keyman\8.0\src\global\delphi\vcl;\keyman\8.0\cmpsrc\mbcolor;\keyman\8.0\cmpsrc\embeddedwb\source" --R"c:\keyman\8.0\src\global\delphi\vcl;c:\program files\borland\bds\4.0\lib;\keyman\8.0\src\global\delphi\jedi;C:\keyman\8.0\src\global\delphi\vcl;\keyman\8.0\cmpsrc\mbcolor;\keyman\8.0\cmpsrc\embeddedwb\source" --DVERSION_KEYMAN_DEVELOPER;DaoCheck;DaoNamedEx;DaoDebug;DaoMessageEx;DAOIdent --w-UNSAFE_TYPE --w-UNSAFE_CODE --w-UNSAFE_CAST diff --git a/windows/src/engine/keyman/keyman.dof b/windows/src/engine/keyman/keyman.dof deleted file mode 100644 index 0150a30bd1..0000000000 --- a/windows/src/engine/keyman/keyman.dof +++ /dev/null @@ -1,98 +0,0 @@ -[Compiler] -A=1 -B=0 -C=1 -D=1 -E=0 -F=0 -G=1 -H=1 -I=0 -J=1 -K=0 -L=1 -M=0 -N=1 -O=0 -P=1 -Q=0 -R=0 -S=0 -T=0 -U=0 -V=1 -W=0 -X=1 -Y=1 -Z=1 -ShowHints=1 -ShowWarnings=1 -UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; -[Linker] -MapFile=0 -OutputObjs=0 -ConsoleApp=1 -DebugInfo=1 -RemoteSymbols=1 -MinStackSize=16384 -MaxStackSize=1048576 -ImageBase=4194304 -ExeDescription=Greatis Form Designer Design-Time Package -[Directories] -OutputDir= -UnitOutputDir= -PackageDLLOutputDir= -PackageDCPOutputDir= -SearchPath=\keyman\8.0\src\global\delphi\indy\Core;\keyman\8.0\src\global\delphi\indy\Protocols;\keyman\8.0\src\global\delphi\indy\System -Packages=vclie50;Vcl50;Inetdb50;Inet50;Vcldb50;Vclx50;Vclbde50;proide50;keyman_components -Conditionals= -DebugSourceDirs=$(DELPHI)\source\vcl;C:\keyman\5.1\src\dist\kmcomapi\com\;C:\keyman\5.1\src\dist\kmcomapi\com\products\;C:\keyman\5.1\src\dist\kmcomapi\com\customisation\;C:\keyman\5.1\src\global\delphi\cust\;C:\keyman\5.1\src\dist\kmcomapi\com\system\;C:\keyman\5.1\src\dist\kmcomapi\util\;K:\keyman\8.0\src\kmruntime\kmcomapi\util\;K:\keyman\8.0\src\kmruntime\kmcomapi\com\languages\;K:\keyman\8.0\src\kmruntime\kmcomapi\com\products\;K:\keyman\8.0\src\kmruntime\kmcomapi\com\keyboards\;K:\keyman\8.0\src\kmruntime\kmcomapi\com\system\ -UsePackages=0 -[Parameters] -RunParams= -HostApplication= -[Language] -ActiveLang= -ProjectLang=$00000C09 -RootDir= -[Version Info] -IncludeVerInfo=0 -AutoIncBuild=0 -MajorVer=2 -MinorVer=0 -Release=0 -Build=1 -Debug=0 -PreRelease=0 -Special=0 -Private=0 -DLL=0 -Locale=1033 -CodePage=1252 -[Version Info Keys] -CompanyName=Greatis Software -FileDescription=Greatis Form Designer Design-Time Package -FileVersion=2.0.0.1 -InternalName= -LegalCopyright=Copyright © 2001 Greatis Software -LegalTrademarks= -OriginalFilename=GFDSTD??.* -ProductName=Form Designer -ProductVersion=2.0.0.1 -Comments=www.greatis.com -[HistoryLists\hlDebugSourcePath] -Count=1 -Item0=$(DELPHI)\source\vcl -[HistoryLists\hlConditionals] -Count=1 -Item0=KLOG -[HistoryLists\hlUnitAliases] -Count=1 -Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; -[HistoryLists\hlSearchPath] -Count=5 -Item0=\keyman\8.0\src\global\delphi\jedi -Item1=$(DELPHI)\Lib\Debug;\keyman\8.0\src\global\delphi\jedi -Item2=c:\keyman\8.0\src\global\delphi\jedi -Item3=$(DELPHI)\source\vcl;C:\keyman\5.1\src\dev\kct\FORMDES\SOURCE;C:\keyman\5.1\src\dev\kct\OBJINSP\SOURCE;c:\keyman\5.1\src\global\delphi\components;c:\keyman\5.1\src\global\delphi\folderdlg;c:\keyman\5.1\src\global\delphi\xstringgrid;c:\keyman\5.1\src\global\delphi\vclzip;c:\keyman\5.1\src\global\delphi\plusmemou -Item4=$(DELPHI)\source\toolsapi;$(DELPHI)\source\vcl;C:\keyman\5.1\src\dev\kct\FORMDES\SOURCE;C:\keyman\5.1\src\dev\kct\OBJINSP\SOURCE;c:\keyman\5.1\src\global\delphi\components;c:\keyman\5.1\src\global\delphi\folderdlg;c:\keyman\5.1\src\global\delphi\xstringgrid;c:\keyman\5.1\src\global\delphi\vclzip;c:\keyman\5.1\src\global\delphi\plusmemou diff --git a/windows/src/engine/keyman32/Keyman32.vcxproj b/windows/src/engine/keyman32/Keyman32.vcxproj index ddfc938e80..ac082fe0f4 100644 --- a/windows/src/engine/keyman32/Keyman32.vcxproj +++ b/windows/src/engine/keyman32/Keyman32.vcxproj @@ -13,18 +13,18 @@ {BD5564FB-35A5-4A3C-B96A-4A6578E2B593} Keyman32 - 10.0.17763.0 + 10.0 DynamicLibrary false - v141 + v142 DynamicLibrary false - v141 + v142 diff --git a/windows/src/engine/keyman64/keyman64.vcxproj b/windows/src/engine/keyman64/keyman64.vcxproj index 93083616ad..e4466b60b0 100644 --- a/windows/src/engine/keyman64/keyman64.vcxproj +++ b/windows/src/engine/keyman64/keyman64.vcxproj @@ -21,26 +21,26 @@ {D1115FB2-230D-4FD8-90B9-982E49953D18} Keyman32 - 10.0.17763.0 + 10.0 Application - v141 + v142 Application - v141 + v142 DynamicLibrary false - v141 + v142 DynamicLibrary false - v141 + v142 diff --git a/windows/src/engine/keymanx64/keymanx64.vcxproj b/windows/src/engine/keymanx64/keymanx64.vcxproj index c16b2a9fd0..49ea49e0dc 100644 --- a/windows/src/engine/keymanx64/keymanx64.vcxproj +++ b/windows/src/engine/keymanx64/keymanx64.vcxproj @@ -22,27 +22,27 @@ {A34650EA-D6E8-4229-8091-6BF1443565B5} keymanx64 Win32Proj - 10.0.17763.0 + 10.0 Application - v141 + v142 Application - v141 + v142 Application Unicode true - v141 + v142 Application Unicode - v141 + v142 diff --git a/windows/src/engine/kmcomapi/kmcomapi.dof b/windows/src/engine/kmcomapi/kmcomapi.dof deleted file mode 100644 index c79e84a39e..0000000000 --- a/windows/src/engine/kmcomapi/kmcomapi.dof +++ /dev/null @@ -1,98 +0,0 @@ -[Compiler] -A=1 -B=0 -C=1 -D=1 -E=0 -F=0 -G=1 -H=1 -I=1 -J=1 -K=0 -L=1 -M=0 -N=1 -O=0 -P=1 -Q=1 -R=1 -S=0 -T=0 -U=0 -V=1 -W=1 -X=1 -Y=1 -Z=1 -ShowHints=1 -ShowWarnings=1 -UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; -[Linker] -MapFile=3 -OutputObjs=0 -ConsoleApp=1 -DebugInfo=1 -RemoteSymbols=1 -MinStackSize=16384 -MaxStackSize=1048576 -ImageBase=4194304 -ExeDescription=Keyman COM API -[Directories] -OutputDir= -UnitOutputDir= -PackageDLLOutputDir= -PackageDCPOutputDir= -SearchPath=\keyman\8.0\src\global\delphi\jedi -Packages=vclie50;Vcl50;Inetdb50;Inet50;Vcldb50;Vclx50;Vclbde50;proide50;keyman_components -Conditionals=KLOG -DebugSourceDirs= -UsePackages=0 -[Parameters] -RunParams= -HostApplication=k:\keyman\8.0\src\keyman\keyman\keyman.exe -[Language] -ActiveLang= -ProjectLang=$00000C09 -RootDir= -[Version Info] -IncludeVerInfo=0 -AutoIncBuild=0 -MajorVer=2 -MinorVer=0 -Release=0 -Build=1 -Debug=0 -PreRelease=0 -Special=0 -Private=0 -DLL=0 -Locale=1033 -CodePage=1252 -[Version Info Keys] -CompanyName=Greatis Software -FileDescription=Greatis Form Designer Design-Time Package -FileVersion=2.0.0.1 -InternalName= -LegalCopyright=Copyright © 2001 Greatis Software -LegalTrademarks= -OriginalFilename=GFDSTD??.* -ProductName=Form Designer -ProductVersion=2.0.0.1 -Comments=www.greatis.com -[HistoryLists\hlDebugSourcePath] -Count=1 -Item0=$(DELPHI)\source\vcl -[HistoryLists\hlConditionals] -Count=1 -Item0=KLOG -[HistoryLists\hlUnitAliases] -Count=1 -Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; -[HistoryLists\hlSearchPath] -Count=5 -Item0=\keyman\8.0\src\global\delphi\jedi -Item1=$(DELPHI)\Lib\Debug;\keyman\8.0\src\global\delphi\jedi -Item2=c:\keyman\8.0\src\global\delphi\jedi -Item3=$(DELPHI)\source\vcl;C:\keyman\5.1\src\dev\kct\FORMDES\SOURCE;C:\keyman\5.1\src\dev\kct\OBJINSP\SOURCE;c:\keyman\5.1\src\global\delphi\components;c:\keyman\5.1\src\global\delphi\folderdlg;c:\keyman\5.1\src\global\delphi\xstringgrid;c:\keyman\5.1\src\global\delphi\vclzip;c:\keyman\5.1\src\global\delphi\plusmemou -Item4=$(DELPHI)\source\toolsapi;$(DELPHI)\source\vcl;C:\keyman\5.1\src\dev\kct\FORMDES\SOURCE;C:\keyman\5.1\src\dev\kct\OBJINSP\SOURCE;c:\keyman\5.1\src\global\delphi\components;c:\keyman\5.1\src\global\delphi\folderdlg;c:\keyman\5.1\src\global\delphi\xstringgrid;c:\keyman\5.1\src\global\delphi\vclzip;c:\keyman\5.1\src\global\delphi\plusmemou diff --git a/windows/src/engine/kmrefresh/kmrefresh.vcxproj b/windows/src/engine/kmrefresh/kmrefresh.vcxproj index f7bed65fe6..546ac20d1e 100644 --- a/windows/src/engine/kmrefresh/kmrefresh.vcxproj +++ b/windows/src/engine/kmrefresh/kmrefresh.vcxproj @@ -22,34 +22,34 @@ 15.0 {A3B8F75F-E63E-434E-8A2A-034AD9B66571} kmrefresh - 10.0.17763.0 + 10.0 Application true Unicode - v141 + v142 Application false true Unicode - v141 + v142 Application true Unicode - v141 + v142 Application false true Unicode - v141 + v142 diff --git a/windows/src/engine/kmtip/kmtip.vcxproj b/windows/src/engine/kmtip/kmtip.vcxproj index 99d747a549..037c11926f 100644 --- a/windows/src/engine/kmtip/kmtip.vcxproj +++ b/windows/src/engine/kmtip/kmtip.vcxproj @@ -20,32 +20,32 @@ {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4} - 10.0.17763.0 + 10.0 DynamicLibrary false MultiByte - v141 + v142 DynamicLibrary false MultiByte - v141 + v142 DynamicLibrary false MultiByte - v141 + v142 DynamicLibrary false MultiByte - v141 + v142 diff --git a/windows/src/engine/mcompile/mc_import_rules.cpp b/windows/src/engine/mcompile/mc_import_rules.cpp index 340f3a3aab..ae20dcc375 100644 --- a/windows/src/engine/mcompile/mc_import_rules.cpp +++ b/windows/src/engine/mcompile/mc_import_rules.cpp @@ -21,6 +21,7 @@ #include "pch.h" #include +#include enum ShiftState { Base = 0, // 0 diff --git a/windows/src/engine/mcompile/mcompile.vcxproj b/windows/src/engine/mcompile/mcompile.vcxproj index 7bb53badb2..7d11846641 100644 --- a/windows/src/engine/mcompile/mcompile.vcxproj +++ b/windows/src/engine/mcompile/mcompile.vcxproj @@ -15,21 +15,21 @@ Win32Proj mtop mcompile - 10.0.17763.0 + 10.0 Application true Unicode - v141 + v142 Application false true Unicode - v141 + v142 diff --git a/windows/src/engine/tsysinfo/tsysinfo.cfg b/windows/src/engine/tsysinfo/tsysinfo.cfg deleted file mode 100644 index 6f67f9a0f9..0000000000 --- a/windows/src/engine/tsysinfo/tsysinfo.cfg +++ /dev/null @@ -1,45 +0,0 @@ --$A1 --$B- --$C+ --$D+ --$E- --$F- --$G+ --$H+ --$I+ --$J+ --$K- --$L+ --$M- --$N+ --$O+ --$P+ --$Q+ --$R+ --$S- --$T- --$U- --$V+ --$W+ --$X+ --$Y+ --$Z1 --GD --cg --vn --AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; --H+ --W+ --M --$M16384,1048576 --K$00400000 --LE"C:\Users\mcdurdin.TAVULTESOFT\Documents\Borland Studio Projects\Bpl" --LN"C:\Users\mcdurdin.TAVULTESOFT\Documents\Borland Studio Projects\Bpl" --U"c:\program files\borland\bds\4.0\lib;\keyman\8.0\src\global\delphi\jedi;\keyman\8.0\cmpsrc\embeddedwb\source" --O"c:\program files\borland\bds\4.0\lib;\keyman\8.0\src\global\delphi\jedi;\keyman\8.0\cmpsrc\embeddedwb\source" --I"c:\program files\borland\bds\4.0\lib;\keyman\8.0\src\global\delphi\jedi;\keyman\8.0\cmpsrc\embeddedwb\source" --R"c:\program files\borland\bds\4.0\lib;\keyman\8.0\src\global\delphi\jedi;\keyman\8.0\cmpsrc\embeddedwb\source" --DVERSION_KEYMAN_DEVELOPER;DaoCheck;DaoNamedEx;DaoDebug;DaoMessageEx;DAOIdent --w-UNSAFE_TYPE --w-UNSAFE_CODE --w-UNSAFE_CAST diff --git a/windows/src/ext/sentry.txt b/windows/src/ext/sentry.txt index 8584ed020e..2463cd98f3 100644 --- a/windows/src/ext/sentry.txt +++ b/windows/src/ext/sentry.txt @@ -4,7 +4,7 @@ Keyman Third Party Package Readme: Sentry Name: Sentry Purpose: Sentry provides error reporting to a Sentry server Source: https://github.com/getsentry/sentry-native -Version: 0.1.4 +Version: 0.4.9 License: MIT Updated for: N/A Documentation: https://docs.sentry.io/platforms/native/ @@ -27,6 +27,16 @@ team. This needs to be updated whenever Sentry is updated. Sentry.Client.pas is a wrapper of sentry.pas which provides a Delphi-style interface to Sentry. +build_sentry_for_keyman.bat should be copied into the sentry-native repo, +and tweaked as required for updated versions of Sentry. Run: + + build_sentry_for_keyman configure build install deploy + + configure: setup build environment + build: build x86 and x64 libraries + install: prepare install folder in sentry-native + deploy: copy the sentry.dll and related files into this repo + License - MIT ------------- diff --git a/windows/src/ext/sentry/build_sentry_for_keyman.bat b/windows/src/ext/sentry/build_sentry_for_keyman.bat new file mode 100644 index 0000000000..1db6b418f4 --- /dev/null +++ b/windows/src/ext/sentry/build_sentry_for_keyman.bat @@ -0,0 +1,156 @@ +@echo off +if "%1" == "" goto help + +set CONFIG=Release +set BUILD32=0 +set BUILD64=0 + +rem ====================================== +rem Startup +rem ====================================== + +:next_param +if "%1" == "-config" goto set_config +if "%1" == "-32" goto set_32 +if "%1" == "-64" goto set_64 + +rem if "%1" == "-32" set is32=1 && shift +rem if "%1" == "-64" set is64=1 && shift + +rem if neither -32 nor -64 specified, then do both +if %BUILD32% == 0 if %BUILD64% == 0 ( + set BUILD32=1 + set BUILD64=1 +) + +goto %1 +goto error + +rem ====================================== +rem Parse options +rem ====================================== + +:set_config +shift +set CONFIG=%1 +shift +goto next_param + +:set_32 +set BUILD32=1 +shift +goto next_param + +:set_64 +set BUILD64=1 +shift +goto next_param + +rem ====================================== +rem Iterate through targets +rem ====================================== + +:next +shift +if "%1" == "" goto :eof +goto %1 +goto error + + +:configure +if %BUILD32% == 1 ( + if exist build_32 ( + rd /s/q build_32 + if errorlevel 1 ( + echo ERROR: Failed to delete build_32 prior to configure + goto fail + ) + ) + cmake -B build_32 -DSENTRY_BACKEND=crashpad -A Win32 -DCMAKE_BUILD_TYPE=Release -DSENTRY_BUILD_RUNTIMESTATIC=ON -DCMAKE_SYSTEM_VERSION=6.1 + rem -DCMAKE_SYSTEM_VERSION=6.1 -DCMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION=8.1 + if errorlevel 1 goto fail +) +if %BUILD64% == 1 ( + if exist build_64 ( + rd /s/q build_64 + if errorlevel 1 ( + echo ERROR: Failed to delete build_64 prior to configure + goto fail + ) + ) + cmake -B build_64 -DSENTRY_BACKEND=crashpad -A x64 -DCMAKE_BUILD_TYPE=Release -DSENTRY_BUILD_RUNTIMESTATIC=ON -DCMAKE_SYSTEM_VERSION=6.1 + rem -DCMAKE_SYSTEM_VERSION=6.1 -DCMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION=8.1 + if errorlevel 1 goto fail +) +goto next + + +:build +if %BUILD32% == 1 ( + cmake --build build_32 --parallel --config %CONFIG% + if errorlevel 1 goto fail +) +if %BUILD64% == 1 ( + cmake --build build_64 --parallel --config %CONFIG% + if errorlevel 1 goto fail +) +goto next + + +:install +if %BUILD32% == 1 ( + cmake --install build_32 --prefix install_32 --config %CONFIG% + if errorlevel 1 goto fail +) +if %BUILD64% == 1 ( + cmake --install build_64 --prefix install_64 --config %CONFIG% + if errorlevel 1 goto fail +) +goto next + + +:deploy + +if "%KEYMAN_ROOT%" == "" ( + echo ERROR: Could not find KEYMAN_ROOT environment variable specifying repository root + goto fail +) + +copy install_32\include\sentry.h %KEYMAN_ROOT%\windows\src\ext\sentry\sentry.h +if errorlevel 1 goto fail + +if %BUILD32% == 1 ( + copy install_32\bin\sentry.dll %KEYMAN_ROOT%\windows\src\ext\sentry\sentry.dll + if errorlevel 1 goto fail + copy install_32\lib\sentry.lib %KEYMAN_ROOT%\windows\src\ext\sentry\sentry.lib + if errorlevel 1 goto fail + copy install_32\bin\crashpad_handler.exe %KEYMAN_ROOT%\windows\src\ext\sentry\crashpad_handler.exe + if errorlevel 1 goto fail +) + +if %BUILD64% == 1 ( + copy install_64\bin\sentry.dll %KEYMAN_ROOT%\windows\src\ext\sentry\sentry.x64.dll + if errorlevel 1 goto fail + copy install_64\lib\sentry.lib %KEYMAN_ROOT%\windows\src\ext\sentry\sentry.x64.lib + if errorlevel 1 goto fail +) + +goto next + +rem ====================================== +rem Help and Errors +rem ====================================== + +:help +echo Usage: build [-32] [-64] [-config Debug^|Release] [configure] [build] [install] [deploy] +echo If neither -32 nor -64 are specified, do both +echo Default for config is Release +goto :eof + +:error +echo Invalid parameters +goto help + +:fail +echo FATAL: Build failed. +exit /b 1 diff --git a/windows/src/ext/sentry/crashpad_handler.exe b/windows/src/ext/sentry/crashpad_handler.exe index 8257a736e7..41e10b88e1 100644 Binary files a/windows/src/ext/sentry/crashpad_handler.exe and b/windows/src/ext/sentry/crashpad_handler.exe differ diff --git a/windows/src/ext/sentry/sentry.dll b/windows/src/ext/sentry/sentry.dll index 7986dd1765..96d753e4cc 100644 Binary files a/windows/src/ext/sentry/sentry.dll and b/windows/src/ext/sentry/sentry.dll differ diff --git a/windows/src/ext/sentry/sentry.h b/windows/src/ext/sentry/sentry.h index c5f6df291f..91146520a9 100644 --- a/windows/src/ext/sentry/sentry.h +++ b/windows/src/ext/sentry/sentry.h @@ -4,7 +4,17 @@ * sentry-native is a C client to send events to native from * C and C++ applications. It can work together with breakpad/crashpad * but also send events on its own. + * + * NOTE on encodings: + * + * Sentry will assume an encoding of UTF-8 for all string data that is captured + * and being sent to sentry as an Event. + * All the functions that are dealing with *paths* will assume an OS-specific + * encoding, typically ANSI on Windows, UTF-8 macOS, and the locale encoding on + * Linux; and they provide wchar-compatible alternatives on Windows which are + * preferred. */ + #ifndef SENTRY_H_INCLUDED #define SENTRY_H_INCLUDED @@ -14,14 +24,19 @@ extern "C" { /* SDK Version */ #define SENTRY_SDK_NAME "sentry.native" -#define SENTRY_SDK_VERSION "0.2.3" -#define SENTRY_SDK_USER_AGENT (SENTRY_SDK_NAME "/" SENTRY_SDK_VERSION) +#define SENTRY_SDK_VERSION "0.4.9" +#define SENTRY_SDK_USER_AGENT SENTRY_SDK_NAME "/" SENTRY_SDK_VERSION /* common platform detection */ #ifdef _WIN32 # define SENTRY_PLATFORM_WINDOWS #elif defined(__APPLE__) -# define SENTRY_PLATFORM_MACOS +# include +# if defined(TARGET_OS_OSX) && TARGET_OS_OSX +# define SENTRY_PLATFORM_MACOS +# elif defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE +# define SENTRY_PLATFORM_IOS +# endif # define SENTRY_PLATFORM_DARWIN # define SENTRY_PLATFORM_UNIX #elif defined(__ANDROID__) @@ -60,7 +75,7 @@ extern "C" { #endif #include -#include +#include #include /* context type dependencies */ @@ -323,12 +338,18 @@ typedef enum sentry_level_e { } sentry_level_t; /** - * Creates a new empty event value. + * Creates a new empty Event value. + * + * See https://docs.sentry.io/platforms/native/enriching-events/ for how to + * further work with events, and https://develop.sentry.dev/sdk/event-payloads/ + * for a detailed overview of the possible properties of an Event. */ SENTRY_API sentry_value_t sentry_value_new_event(void); /** - * Creates a new message event value. + * Creates a new Message Event value. + * + * See https://develop.sentry.dev/sdk/event-payloads/message/ * * `logger` can be NULL to omit the logger value. */ @@ -336,13 +357,73 @@ SENTRY_API sentry_value_t sentry_value_new_message_event( sentry_level_t level, const char *logger, const char *text); /** - * Creates a new breadcrumb with a specific type and message. + * Creates a new Breadcrumb with a specific type and message. + * + * See https://develop.sentry.dev/sdk/event-payloads/breadcrumbs/ * * Either parameter can be NULL in which case no such attributes is created. */ SENTRY_API sentry_value_t sentry_value_new_breadcrumb( const char *type, const char *message); +/** + * Creates a new Exception value. + * + * This is intended for capturing language-level exception, such as from a + * try-catch block. `type` and `value` here refer to the exception class and + * a possible description. + * + * See https://develop.sentry.dev/sdk/event-payloads/exception/ + * + * The returned value needs to be attached to an event via + * `sentry_event_add_exception`. + */ +SENTRY_EXPERIMENTAL_API sentry_value_t sentry_value_new_exception( + const char *type, const char *value); + +/** + * Creates a new Thread value. + * + * See https://develop.sentry.dev/sdk/event-payloads/threads/ + * + * The returned value needs to be attached to an event via + * `sentry_event_add_thread`. + * + * `name` can be NULL. + */ +SENTRY_EXPERIMENTAL_API sentry_value_t sentry_value_new_thread( + uint64_t id, const char *name); + +/** + * Creates a new Stack Trace conforming to the Stack Trace Interface. + * + * See https://develop.sentry.dev/sdk/event-payloads/stacktrace/ + * + * The returned object needs to be attached to either an exception + * event, or a thread object. + * + * If `ips` is NULL the current stack trace is captured, otherwise `len` + * stack trace instruction pointers are attached to the event. + */ +SENTRY_EXPERIMENTAL_API sentry_value_t sentry_value_new_stacktrace( + void **ips, size_t len); + +/** + * Adds an Exception to an Event value. + * + * This takes ownership of the `exception`. + */ +SENTRY_EXPERIMENTAL_API void sentry_event_add_exception( + sentry_value_t event, sentry_value_t exception); + +/** + * Adds a Thread to an Event value. + * + * This takes ownership of the `thread`. + */ +SENTRY_EXPERIMENTAL_API void sentry_event_add_thread( + sentry_value_t event, sentry_value_t thread); + /* -- Experimental APIs -- */ /** @@ -356,10 +437,15 @@ SENTRY_EXPERIMENTAL_API char *sentry_value_to_msgpack( sentry_value_t value, size_t *size_out); /** - * Adds a stacktrace to an event. + * Adds a stack trace to an event. * - * If `ips` is NULL the current stacktrace is captured, otherwise `len` - * stacktrace instruction pointers are attached to the event. + * The stack trace is added as part of a new thread object. + * This function is **deprecated** in favor of using + * `sentry_value_new_stacktrace` in combination with `sentry_value_new_thread` + * and `sentry_event_add_thread`. + * + * If `ips` is NULL the current stack trace is captured, otherwise `len` + * stack trace instruction pointers are attached to the event. */ SENTRY_EXPERIMENTAL_API void sentry_event_value_add_stacktrace( sentry_value_t event, void **ips, size_t len); @@ -383,7 +469,7 @@ typedef struct sentry_ucontext_s { * * If the address is given in `addr` the stack is unwound form there. * Otherwise (NULL is passed) the current instruction pointer is used as - * start address. The stacktrace is written to `stacktrace_out` with upt o + * start address. The stack trace is written to `stacktrace_out` with up to * `max_len` frames being written. The actual number of unwound stackframes * is returned. */ @@ -393,7 +479,7 @@ SENTRY_EXPERIMENTAL_API size_t sentry_unwind_stack( /** * Unwinds the stack from the given context. * - * The stacktrace is written to `stacktrace_out` with upt o `max_len` frames + * The stack trace is written to `stacktrace_out` with up to `max_len` frames * being written. The actual number of unwound stackframes is returned. */ SENTRY_EXPERIMENTAL_API size_t sentry_unwind_stack_from_ucontext( @@ -441,9 +527,13 @@ SENTRY_API void sentry_uuid_as_bytes(const sentry_uuid_t *uuid, char bytes[16]); */ SENTRY_API void sentry_uuid_as_string(const sentry_uuid_t *uuid, char str[37]); -struct sentry_options_s; -typedef struct sentry_options_s sentry_options_t; - +/** + * A Sentry Envelope. + * + * The Envelope is an abstract type which represents a payload being sent to + * sentry. It can contain one or more items, typically an Event. + * See https://develop.sentry.dev/sdk/envelopes/ + */ struct sentry_envelope_s; typedef struct sentry_envelope_s sentry_envelope_t; @@ -469,40 +559,98 @@ SENTRY_API char *sentry_envelope_serialize( const sentry_envelope_t *envelope, size_t *size_out); /** - * serializes the envelope into a file. + * Serializes the envelope into a file. * - * returns 0 on success. + * `path` is assumed to be in platform-specific filesystem path encoding. + * + * Returns 0 on success. */ SENTRY_API int sentry_envelope_write_to_file( const sentry_envelope_t *envelope, const char *path); /** - * Type of the callback for transports. + * The Sentry Client Options. + * + * See https://docs.sentry.io/error-reporting/configuration/ */ -typedef void (*sentry_transport_function_t)( - const sentry_envelope_t *envelope, void *data); +struct sentry_options_s; +typedef struct sentry_options_s sentry_options_t; /** * This represents an interface for user-defined transports. * - * This type is *deprecated*, and will be replaced by an opaque pointer type and - * builder methods in a future version. + * Transports are responsible for sending envelopes to sentry and are the last + * step in the event pipeline. + * + * Envelopes will be submitted to the transport in a _fire and forget_ fashion, + * and the transport must send those envelopes _in order_. + * + * A transport has the following hooks, all of which + * take the user provided `state` as last parameter. The transport state needs + * to be set with `sentry_transport_set_state` and typically holds handles and + * other information that can be reused across requests. + * + * * `send_func`: This function will take ownership of an envelope, and is + * responsible for freeing it via `sentry_envelope_free`. + * * `startup_func`: This hook will be called by sentry inside of `sentry_init` + * and instructs the transport to initialize itself. Failures will bubble up + * to `sentry_init`. + * * `shutdown_func`: Instructs the transport to flush its queue and shut down. + * This hook receives a millisecond-resolution `timeout` parameter and should + * return `true` when the transport was flushed and shut down successfully. + * In case of `false`, sentry will log an error, but continue with freeing the + * transport. + * * `free_func`: Frees the transports `state`. This hook might be called even + * though `shutdown_func` returned `false` previously. + * + * The transport interface might be extended in the future with hooks to flush + * its internal queue without shutting down, and to dump its internal queue to + * disk in case of a hard crash. */ struct sentry_transport_s; -typedef struct sentry_transport_s { - void (*send_envelope_func)( - struct sentry_transport_s *, sentry_envelope_t *envelope); - void (*startup_func)(struct sentry_transport_s *); - void (*shutdown_func)(struct sentry_transport_s *); - void (*free_func)(struct sentry_transport_s *); - void *data; -} sentry_transport_t; +typedef struct sentry_transport_s sentry_transport_t; /** - * Creates a new function transport. + * Creates a new transport with an initial `send_func`. */ -SENTRY_API sentry_transport_t *sentry_new_function_transport( - void (*func)(sentry_envelope_t *envelope, void *data), void *data); +SENTRY_API sentry_transport_t *sentry_transport_new( + void (*send_func)(sentry_envelope_t *envelope, void *state)); + +/** + * Sets the transport `state`. + * + * If the state is owned by the transport and needs to be freed, use + * `sentry_transport_set_free_func` to set an appropriate hook. + */ +SENTRY_API void sentry_transport_set_state( + sentry_transport_t *transport, void *state); + +/** + * Sets the transport hook to free the transport `state`. + */ +SENTRY_API void sentry_transport_set_free_func( + sentry_transport_t *transport, void (*free_func)(void *state)); + +/** + * Sets the transport startup hook. + * + * This hook is called from within `sentry_init` and will get a reference to the + * options which can be used to initialize a transports internal state. + * It should return `0` on success. A failure will bubble up to `sentry_init`. + */ +SENTRY_API void sentry_transport_set_startup_func(sentry_transport_t *transport, + int (*startup_func)(const sentry_options_t *options, void *state)); + +/** + * Sets the transport shutdown hook. + * + * This hook will receive a millisecond-resolution timeout. + * It should return `0` on success in case all the pending envelopes have been + * sent within the timeout, or `1` if the timeout was hit. + */ +SENTRY_API void sentry_transport_set_shutdown_func( + sentry_transport_t *transport, + int (*shutdown_func)(uint64_t timeout, void *state)); /** * Generic way to free a transport. @@ -510,25 +658,18 @@ SENTRY_API sentry_transport_t *sentry_new_function_transport( SENTRY_API void sentry_transport_free(sentry_transport_t *transport); /** - * This represents an opaque backend. + * Create a new function transport. * - * This declaration is *deprecated* and will be removed in a future version. - */ -struct sentry_backend_s; -typedef struct sentry_backend_s sentry_backend_t; - -/** - * Generic way to free a backend. + * It is a convenience function which works with a borrowed `data`, and will + * automatically free the envelope, so the user provided function does not need + * to do that. * * This function is *deprecated* and will be removed in a future version. + * It is here for backwards compatibility. Users should migrate to the + * `sentry_transport_new` API. */ -SENTRY_API void sentry_backend_free(sentry_backend_t *backend); - -/** - * Type of the callback for modifying events. - */ -typedef sentry_value_t (*sentry_event_function_t)( - sentry_value_t event, void *hint, void *closure); +SENTRY_API sentry_transport_t *sentry_new_function_transport( + void (*func)(const sentry_envelope_t *envelope, void *data), void *data); /* -- Options APIs -- */ @@ -559,7 +700,26 @@ SENTRY_API void sentry_options_set_transport( sentry_options_t *opts, sentry_transport_t *transport); /** - * Sets the before send callback. + * Type of the `before_send` callback. + * + * The callback takes ownership of the `event`, and should usually return that + * same event. In case the event should be discarded, the callback needs to + * call `sentry_value_decref` on the provided event, and return a + * `sentry_value_new_null()` instead. + * + * This function may be invoked inside of a signal handler and must be safe for + * that purpose, see https://man7.org/linux/man-pages/man7/signal-safety.7.html. + * On Windows, it may be called from inside of a `UnhandledExceptionFilter`, see + * the documentation on SEH (structured exception handling) for more information + * https://docs.microsoft.com/en-us/windows/win32/debug/structured-exception-handling + */ +typedef sentry_value_t (*sentry_event_function_t)( + sentry_value_t event, void *hint, void *closure); + +/** + * Sets the `before_send` callback. + * + * See the `sentry_event_function_t` typedef above for more information. */ SENTRY_API void sentry_options_set_before_send( sentry_options_t *opts, sentry_event_function_t func, void *data); @@ -623,6 +783,8 @@ SENTRY_API const char *sentry_options_get_dist(const sentry_options_t *opts); /** * Configures the http proxy. + * + * The given proxy has to include the full scheme, eg. `http://some.proxy/`. */ SENTRY_API void sentry_options_set_http_proxy( sentry_options_t *opts, const char *proxy); @@ -646,6 +808,18 @@ SENTRY_API void sentry_options_set_ca_certs( SENTRY_API const char *sentry_options_get_ca_certs( const sentry_options_t *opts); +/** + * Configures the name of the http transport thread. + */ +SENTRY_API void sentry_options_set_transport_thread_name( + sentry_options_t *opts, const char *name); + +/** + * Returns the configured http transport thread name. + */ +SENTRY_API const char *sentry_options_get_transport_thread_name( + const sentry_options_t *opts); + /** * Enables or disables debug printing mode. */ @@ -657,7 +831,53 @@ SENTRY_API void sentry_options_set_debug(sentry_options_t *opts, int debug); SENTRY_API int sentry_options_get_debug(const sentry_options_t *opts); /** - * Enables or disabled user consent requirements for uploads. + * Sets the number of breadcrumbs being tracked and attached to events. + * + * Defaults to 100. + */ +SENTRY_API void sentry_options_set_max_breadcrumbs( + sentry_options_t *opts, size_t max_breadcrumbs); + +/** + * Gets the number of breadcrumbs being tracked and attached to events. + */ +SENTRY_API size_t sentry_options_get_max_breadcrumbs( + const sentry_options_t *opts); + +/** + * Type of the callback for logger function. + */ +typedef void (*sentry_logger_function_t)( + sentry_level_t level, const char *message, va_list args, void *userdata); + +/** + * Sets the sentry-native logger function. + * + * Used for logging debug events when the `debug` option is set to true. + */ +SENTRY_API void sentry_options_set_logger( + sentry_options_t *opts, sentry_logger_function_t func, void *userdata); + +/** + * Enables or disables automatic session tracking. + * + * Automatic session tracking is enabled by default and is equivalent to calling + * `sentry_start_session` after startup. + * There can only be one running session, and the current session will always be + * closed implicitly by `sentry_close`, when starting a new session with + * `sentry_start_session`, or manually by calling `sentry_end_session`. + */ +SENTRY_API void sentry_options_set_auto_session_tracking( + sentry_options_t *opts, int val); + +/** + * Returns true if automatic session tracking is enabled. + */ +SENTRY_API int sentry_options_get_auto_session_tracking( + const sentry_options_t *opts); + +/** + * Enables or disables user consent requirements for uploads. * * This disables uploads until the user has given the consent to the SDK. * Consent itself is given with `sentry_user_consent_give` and @@ -672,11 +892,32 @@ SENTRY_API void sentry_options_set_require_user_consent( SENTRY_API int sentry_options_get_require_user_consent( const sentry_options_t *opts); +/** + * Enables or disables on-device symbolication of stack traces. + * + * This feature can have a performance impact, and is enabled by default on + * Android. It is usually only needed when it is not possible to provide debug + * information files for system libraries which are needed for serverside + * symbolication. + */ +SENTRY_API void sentry_options_set_symbolize_stacktraces( + sentry_options_t *opts, int val); + +/** + * Returns true if on-device symbolication of stack traces is enabled. + */ +SENTRY_API int sentry_options_get_symbolize_stacktraces( + const sentry_options_t *opts); + /** * Adds a new attachment to be sent along. + * + * `path` is assumed to be in platform-specific filesystem path encoding. + * API Users on windows are encouraged to use `sentry_options_add_attachmentw` + * instead. */ SENTRY_API void sentry_options_add_attachment( - sentry_options_t *opts, const char *name, const char *path); + sentry_options_t *opts, const char *path); /** * Sets the path to the crashpad handler if the crashpad backend is used. @@ -687,6 +928,10 @@ SENTRY_API void sentry_options_add_attachment( * * It is recommended that library users set an explicit handler path, depending * on the directory/executable structure of their app. + * + * `path` is assumed to be in platform-specific filesystem path encoding. + * API Users on windows are encouraged to use `sentry_options_set_handler_pathw` + * instead. */ SENTRY_API void sentry_options_set_handler_path( sentry_options_t *opts, const char *path); @@ -698,12 +943,27 @@ SENTRY_API void sentry_options_set_handler_path( * artifacts in case of a crash. This will also be used by the crashpad backend * if it is configured. * - * The path defaults to `.sentry-native` in the current working directory, will - * be created if it does not exist, and will be resolved to an absolute path - * inside of `sentry_init`. + * The directory is used for "cached" data, which needs to persist across + * application restarts to ensure proper flagging of release-health sessions, + * but might otherwise be safely purged regularly. * - * It is recommended that library users set an explicit absolute path, depending - * on their own apps directory. + * It is roughly equivalent to the type of `AppData/Local` on Windows and + * `XDG_CACHE_HOME` on Linux, and equivalent runtime directories on other + * platforms. + * + * It is recommended that users set an explicit absolute path, depending + * on their apps runtime directory. The path will be created if it does not + * exist, and will be resolved to an absolute path inside of `sentry_init`. The + * directory should not be shared with other application data/configuration, as + * sentry-native will enumerate and possibly delete files in that directory. An + * example might be `$XDG_CACHE_HOME/your-app/sentry` + * + * If no explicit path it set, sentry-native will default to `.sentry-native` in + * the current working directory, with no specific platform-specific handling. + * + * `path` is assumed to be in platform-specific filesystem path encoding. + * API Users on windows are encouraged to use + * `sentry_options_set_database_pathw` instead. */ SENTRY_API void sentry_options_set_database_path( sentry_options_t *opts, const char *path); @@ -713,7 +973,7 @@ SENTRY_API void sentry_options_set_database_path( * Wide char version of `sentry_options_add_attachment`. */ SENTRY_API void sentry_options_add_attachmentw( - sentry_options_t *opts, const char *name, const wchar_t *path); + sentry_options_t *opts, const wchar_t *path); /** * Wide char version of `sentry_options_set_handler_path`. @@ -746,13 +1006,35 @@ SENTRY_API void sentry_options_set_system_crash_reporter_enabled( * * This takes ownership of the options. After the options have been set * they cannot be modified any more. + * Depending on the configured transport and backend, this function might not be + * fully thread-safe. + * Returns 0 on success. */ SENTRY_API int sentry_init(sentry_options_t *options); /** * Shuts down the sentry client and forces transports to flush out. + * + * Returns 0 on success. */ -SENTRY_API void sentry_shutdown(void); +SENTRY_API int sentry_close(void); + +/** + * Shuts down the sentry client and forces transports to flush out. + * + * This is a **deprecated** alias for `sentry_close`. + * + * Returns 0 on success. + */ +SENTRY_API int sentry_shutdown(void); + +/** + * This will lazily load and cache a list of all the loaded libraries. + * + * Returns a new reference to an immutable, frozen list. + * The reference must be released with `sentry_value_decref`. + */ +SENTRY_EXPERIMENTAL_API sentry_value_t sentry_get_modules_list(void); /** * Clears the internal module cache. @@ -766,11 +1048,15 @@ SENTRY_API void sentry_shutdown(void); SENTRY_EXPERIMENTAL_API void sentry_clear_modulecache(void); /** - * Returns the client options. + * Re-initializes the Sentry backend. * - * This might return NULL if sentry is not yet initialized. + * This is needed if a third-party library overrides the previously installed + * signal handler. Calling this function can be potentially dangerous and should + * only be done when necessary. + * + * Returns 0 on success. */ -SENTRY_API const sentry_options_t *sentry_get_options(void); +SENTRY_EXPERIMENTAL_API int sentry_reinstall_backend(void); /** * Gives user consent. @@ -802,7 +1088,8 @@ SENTRY_API sentry_uuid_t sentry_capture_event(sentry_value_t event); * * This is safe to be called from a crashing thread and may not return. */ -SENTRY_EXPERIMENTAL_API void sentry_handle_exception(sentry_ucontext_t *uctx); +SENTRY_EXPERIMENTAL_API void sentry_handle_exception( + const sentry_ucontext_t *uctx); /** * Adds the breadcrumb to be sent in case of an event. @@ -851,6 +1138,9 @@ SENTRY_API void sentry_remove_context(const char *key); /** * Sets the event fingerprint. + * + * This accepts a variable number of arguments, and needs to be terminated by a + * trailing `NULL`. */ SENTRY_API void sentry_set_fingerprint(const char *fingerprint, ...); @@ -877,12 +1167,12 @@ SENTRY_API void sentry_set_level(sentry_level_t level); /** * Starts a new session. */ -SENTRY_EXPERIMENTAL_API void sentry_start_session(void); +SENTRY_API void sentry_start_session(void); /** * Ends a session. */ -SENTRY_EXPERIMENTAL_API void sentry_end_session(void); +SENTRY_API void sentry_end_session(void); #ifdef __cplusplus } diff --git a/windows/src/ext/sentry/sentry.lib b/windows/src/ext/sentry/sentry.lib index 08435f091f..f9c6b6671d 100644 Binary files a/windows/src/ext/sentry/sentry.lib and b/windows/src/ext/sentry/sentry.lib differ diff --git a/windows/src/ext/sentry/sentry.pas b/windows/src/ext/sentry/sentry.pas index e15ec5ee50..24e85c9b9a 100644 --- a/windows/src/ext/sentry/sentry.pas +++ b/windows/src/ext/sentry/sentry.pas @@ -1,9 +1,20 @@ {$D-} // Don't include debug information // Delphi translation of sentry.h -// Sentry Native API 0.2.3 +// Sentry Native API 0.4.9 // https://github.com/getsentry/sentry-native unit sentry; +{ + * NOTE on encodings: + * + * Sentry will assume an encoding of UTF-8 for all string data that is captured + * and being sent to sentry as an Event. + * All the functions that are dealing with *paths* will assume an OS-specific + * encoding, typically ANSI on Windows, UTF-8 macOS, and the locale encoding on + * Linux; and they provide wchar-compatible alternatives on Windows which are + * preferred. +} + interface {$DEFINE SENTRY_API} @@ -42,7 +53,7 @@ const const SENTRY_SDK_NAME = 'sentry.native'; - SENTRY_SDK_VERSION = '0.2.3'; + SENTRY_SDK_VERSION = '0.4.9'; SENTRY_SDK_USER_AGENT = SENTRY_SDK_NAME + '/' + SENTRY_SDK_VERSION; {$IF DEFINED(MSWINDOWS)} @@ -365,14 +376,20 @@ type sentry_level_e = ( sentry_level_t = sentry_level_e; // -// Creates a new empty event value. -// +// Creates a new empty Event value. +// +// See https://docs.sentry.io/platforms/native/enriching-events/ for how to +// further work with events, and https://develop.sentry.dev/sdk/event-payloads/ +// for a detailed overview of the possible properties of an Event. +// function sentry_value_new_event: sentry_value_t; cdecl; external sentry_dll delayed; // -// Creates a new message event value. -// -// `logger` can be NULL to omit the logger value. +// Creates a new Message Event value. +// +// See https://develop.sentry.dev/sdk/event-payloads/message/ +// +// `logger` can be NULL to omit the logger value. // function sentry_value_new_message_event( level: sentry_level_t; @@ -381,15 +398,83 @@ function sentry_value_new_message_event( ): sentry_value_t; cdecl; external sentry_dll delayed; // -// Creates a new breadcrumb with a specific type and message. -// -// Either parameter can be NULL in which case no such attributes is created. +// Creates a new Breadcrumb with a specific type and message. +// +// See https://develop.sentry.dev/sdk/event-payloads/breadcrumbs/ // function sentry_value_new_breadcrumb( const _type: PAnsiChar; const message: PAnsiChar ): sentry_value_t; cdecl; external sentry_dll delayed; +// +// Creates a new Exception value. +// +// This is intended for capturing language-level exception, such as from a +// try-catch block. `type` and `value` here refer to the exception class and +// a possible description. +// +// See https://develop.sentry.dev/sdk/event-payloads/exception/ +// +// The returned value needs to be attached to an event via +// `sentry_event_add_exception`. +// +function {SENTRY_EXPERIMENTAL_API} sentry_value_new_exception( + const _type: PAnsiChar; + const value: PAnsiChar +): sentry_value_t; cdecl; external sentry_dll delayed; + +// +// Creates a new Thread value. +// +// See https://develop.sentry.dev/sdk/event-payloads/threads/ +// +// The returned value needs to be attached to an event via +// `sentry_event_add_thread`. +// +// `name` can be NULL. +// +function {SENTRY_EXPERIMENTAL_API} sentry_value_new_thread( + id: UInt64; + const name: PAnsiChar +): sentry_value_t; cdecl; external sentry_dll delayed; + +// +// Creates a new Stack Trace conforming to the Stack Trace Interface. +// +// See https://develop.sentry.dev/sdk/event-payloads/stacktrace/ +// +// The returned object needs to be attached to either an exception +// event, or a thread object. +// +// If `ips` is NULL the current stack trace is captured, otherwise `len` +// stack trace instruction pointers are attached to the event. +// +function {SENTRY_EXPERIMENTAL_API} sentry_value_new_stacktrace( + ips: PPVoid; + len: NativeUInt +): sentry_value_t; cdecl; external sentry_dll delayed; + +// +// Adds an Exception to an Event value. +// +// This takes ownership of the `exception`. +// +procedure {SENTRY_EXPERIMENTAL_API} sentry_event_add_exception( + event: sentry_value_t; + exception: sentry_value_t +); cdecl; external sentry_dll delayed; + +// +// Adds a Thread to an Event value. +// +// This takes ownership of the `thread`. +// +procedure {SENTRY_EXPERIMENTAL_API} sentry_event_add_thread( + event: sentry_value_t; + thread: sentry_value_t +); cdecl; external sentry_dll delayed; + // -- Experimental APIs -- // @@ -405,10 +490,15 @@ function sentry_value_to_msgpack( ): PAnsiChar; cdecl; external sentry_dll delayed; // -// Adds a stacktrace to an event. +// Adds a stack trace to an event. // -// If `ips` is NULL the current stacktrace is captured, otherwise `len` -// stacktrace instruction pointers are attached to the event. +// The stack trace is added as part of a new thread object. +// This function is **deprecated** in favor of using +// `sentry_value_new_stacktrace` in combination with `sentry_value_new_thread` +// and `sentry_event_add_thread`. +// +// If `ips` is NULL the current stack trace is captured, otherwise `len` +// stack trace instruction pointers are attached to the event. // procedure sentry_event_value_add_stacktrace( event: sentry_value_t; @@ -440,7 +530,7 @@ type // // If the address is given in `addr` the stack is unwound form there. Otherwise // (NULL is passed) the current instruction pointer is used as start address. -// The stacktrace is written to `stacktrace_out` with upt o `max_len` frames +// The stack trace is written to `stacktrace_out` with up to `max_len` frames // being written. The actual number of unwound stackframes is returned. // function sentry_unwind_stack( @@ -452,7 +542,7 @@ function sentry_unwind_stack( // // Unwinds the stack from the given context. // -// The stacktrace is written to `stacktrace_out` with upt o `max_len` frames +// The stack trace is written to `stacktrace_out` with up to `max_len` frames // being written. The actual number of unwound stackframes is returned. // function sentry_unwind_stack_from_ucontext( @@ -522,10 +612,13 @@ procedure sentry_uuid_as_string( ); cdecl; external sentry_dll delayed; type - sentry_options_s = record end; - sentry_options_t = sentry_options_s; - psentry_options_t = ^sentry_options_t; - +// +// A Sentry Envelope. +// +// The Envelope is an abstract type which represents a payload being sent to +// sentry. It can contain one or more items, typically an Event. +// See https://develop.sentry.dev/sdk/envelopes/ +// sentry_envelope_s = record end; sentry_envelope_t = sentry_envelope_s; psentry_envelope_t = Pointer; @@ -557,9 +650,11 @@ function sentry_envelope_serialize( ): PAnsiChar; cdecl; external sentry_dll delayed; // -// serializes the envelope into a file. -// -// returns 0 on success. +// Serializes the envelope into a file. +// +// `path` is assumed to be in platform-specific filesystem path encoding. +// +// Returns 0 on success. // function sentry_envelope_write_to_file( const envelope: psentry_envelope_t; @@ -567,80 +662,130 @@ function sentry_envelope_write_to_file( ): Integer; cdecl; external sentry_dll delayed; // -// Type of the callback for transports. +// The Sentry Client Options. +// +// See https://docs.sentry.io/error-reporting/configuration/ // type - sentry_transport_function_t = procedure( - const envelope: psentry_envelope_t; - data: Pointer - ); cdecl; + sentry_options_s = record end; + sentry_options_t = sentry_options_s; + psentry_options_t = ^sentry_options_t; // // This represents an interface for user-defined transports. // -// This type is *deprecated*, and will be replaced by an opaque pointer type and -// builder methods in a future version. -// +// Transports are responsible for sending envelopes to sentry and are the last +// step in the event pipeline. +// +// Envelopes will be submitted to the transport in a _fire and forget_ fashion, +// and the transport must send those envelopes _in order_. +// +// A transport has the following hooks, all of which +// take the user provided `state` as last parameter. The transport state needs +// to be set with `sentry_transport_set_state` and typically holds handles and +// other information that can be reused across requests. +// +// * `send_func`: This function will take ownership of an envelope, and is +// responsible for freeing it via `sentry_envelope_free`. +// * `startup_func`: This hook will be called by sentry inside of `sentry_init` +// and instructs the transport to initialize itself. Failures will bubble up +// to `sentry_init`. +// * `shutdown_func`: Instructs the transport to flush its queue and shut down. +// This hook receives a millisecond-resolution `timeout` parameter and should +// return `true` when the transport was flushed and shut down successfully. +// In case of `false`, sentry will log an error, but continue with freeing the +// transport. +// * `free_func`: Frees the transports `state`. This hook might be called even +// though `shutdown_func` returned `false` previously. +// +// The transport interface might be extended in the future with hooks to flush +// its internal queue without shutting down, and to dump its internal queue to +// disk in case of a hard crash. +// type + sentry_transport_s = record end; psentry_transport_s = ^sentry_transport_s; - - _sentry_transport_send_envelope_func = procedure(t: psentry_transport_s; e: psentry_envelope_t); cdecl; - _sentry_transport_func = procedure(s: psentry_transport_s); cdecl; - - sentry_transport_s = record - send_envelope_func: _sentry_transport_send_envelope_func; - startup_func: _sentry_transport_func; - shutdown_func: _sentry_transport_func; - free_func: _sentry_transport_func; - data: Pointer; - end; - - sentry_transport_t = sentry_transport_s; + sentry_transport_t = sentry_transport_s; psentry_transport_t = ^sentry_transport_t; - _sentry_transport_new_func = procedure(e: psentry_envelope_t; data: Pointer); cdecl; + _sentry_transport_new_func = procedure(e: psentry_envelope_t; state: Pointer); cdecl; + _sentry_transport_free_func = procedure(state: Pointer); cdecl; + _sentry_transport_startup_func = function(const options: psentry_options_t; state: Pointer): Integer; cdecl; + _sentry_transport_shutdown_func = function(timeout: UInt64; state: Pointer): Integer; cdecl; -function sentry_new_function_transport( - func: _sentry_transport_new_func; - data: Pointer +// +// Creates a new transport with an initial `send_func`. +// +function sentry_transport_new( + send_func: _sentry_transport_new_func ): psentry_transport_t; cdecl; external sentry_dll delayed; +// +// Sets the transport `state`. +// +// If the state is owned by the transport and needs to be freed, use +// `sentry_transport_set_free_func` to set an appropriate hook. +// +procedure sentry_transport_set_state( + transport: psentry_transport_t; + state: Pointer +); cdecl; external sentry_dll delayed; + +// +// Sets the transport hook to free the transport `state`. +// +procedure sentry_transport_set_free_func( + transport: psentry_transport_t; + free_func: _sentry_transport_free_func +); cdecl; external sentry_dll delayed; + +// +// Sets the transport startup hook. +// +// This hook is called from within `sentry_init` and will get a reference to the +// options which can be used to initialize a transports internal state. +// It should return `0` on success. A failure will bubble up to `sentry_init`. +// +procedure sentry_transport_set_startup_func( + transport: psentry_transport_t; + startup_func: _sentry_transport_startup_func +); cdecl; external sentry_dll delayed; + +// +// Sets the transport shutdown hook. +// +// This hook will receive a millisecond-resolution timeout. +// It should return `0` on success in case all the pending envelopes have been +// sent within the timeout, or `1` if the timeout was hit. +// +procedure sentry_transport_set_shutdown_func( + transport: psentry_transport_t; + shutdown_func: _sentry_transport_shutdown_func +); cdecl; external sentry_dll delayed; + // // Generic way to free a transport. // procedure sentry_transport_free( - transport: psentry_transport_t + transport: psentry_transport_t ); cdecl; external sentry_dll delayed; // -// This represents an opaque backend. +// Create a new function transport. // -// This declaration is *deprecated* and will be removed in a future version. -// -type - sentry_backend_s = record end; - sentry_backend_t = sentry_backend_s; - psentry_backend_t = ^sentry_backend_t; - -// -// Generic way to free a backend. +// It is a convenience function which works with a borrowed `data`, and will +// automatically free the envelope, so the user provided function does not need +// to do that. // // This function is *deprecated* and will be removed in a future version. +// It is here for backwards compatibility. Users should migrate to the +// `sentry_transport_new` API. // -procedure sentry_backend_free( - backend: psentry_backend_t -); cdecl; external sentry_dll delayed; - -// -// Type of the callback for modifying events. -// -type - sentry_event_function_t = function( - event: sentry_value_t; - hint: Pointer; - closure: Pointer - ): sentry_value_t; cdecl; - +function sentry_new_function_transport( + func: _sentry_transport_new_func; + data: Pointer +): psentry_transport_t; cdecl; external sentry_dll delayed; + // -- Options APIs -- // @@ -670,12 +815,35 @@ procedure sentry_options_free( // procedure sentry_options_set_transport( opts: psentry_options_t; - func: sentry_transport_function_t + transport: psentry_transport_t ); cdecl; external sentry_dll delayed; // -// Sets the before send callback. +// Type of the `before_send` callback. +// +// The callback takes ownership of the `event`, and should usually return that +// same event. In case the event should be discarded, the callback needs to +// call `sentry_value_decref` on the provided event, and return a +// `sentry_value_new_null()` instead. +// +// This function may be invoked inside of a signal handler and must be safe for +// that purpose, see https://man7.org/linux/man-pages/man7/signal-safety.7.html. +// On Windows, it may be called from inside of a `UnhandledExceptionFilter`, see +// the documentation on SEH (structured exception handling) for more information +// https://docs.microsoft.com/en-us/windows/win32/debug/structured-exception-handling +// +type + sentry_event_function_t = function( + event: sentry_value_t; + hint: Pointer; + closure: Pointer + ): sentry_value_t; cdecl; + // +// Sets the `before_send` callback. +// +// See the `sentry_event_function_t` typedef above for more information. +// procedure sentry_options_set_before_send( opts: psentry_options_t; func: sentry_event_function_t; @@ -762,6 +930,8 @@ function sentry_options_get_dist( // // Configures the http proxy. // +// The given proxy has to include the full scheme, eg. `http://some.proxy/`. +// procedure sentry_options_set_http_proxy( opts: psentry_options_t; const proxy: PAnsiChar @@ -790,6 +960,21 @@ function sentry_options_get_ca_certs( opts: psentry_options_t ): PAnsiChar; cdecl; external sentry_dll delayed; +// +// Configures the name of the http transport thread. +// +procedure sentry_options_set_transport_thread_name( + opts: psentry_options_t; + const name: PAnsiChar +); cdecl; external sentry_dll delayed; + +// +// Returns the configured http transport thread name. +// +function sentry_options_get_transport_thread_name( + const opts: psentry_options_t +): PAnsiChar; cdecl; external sentry_dll delayed; + // // Enables or disables debug printing mode. // @@ -805,6 +990,66 @@ function sentry_options_get_debug( const opts: psentry_options_t ): Integer; cdecl; external sentry_dll delayed; +// +// Sets the number of breadcrumbs being tracked and attached to events. +// +// Defaults to 100. +// +procedure sentry_options_set_max_breadcrumbs( + opts: psentry_options_t; + max_breadcrumbs: NativeUInt +); cdecl; external sentry_dll delayed; + +// +// Gets the number of breadcrumbs being tracked and attached to events. +// +function sentry_options_get_max_breadcrumbs( + const opts: psentry_options_t +): NativeUInt; cdecl; external sentry_dll delayed; + +// +// Type of the callback for logger function. +// +type + sentry_logger_function_t = procedure( + level: sentry_level_t; + const message: PAnsiChar; + args: va_list; + userdata: Pointer + ); cdecl; + +// +// Sets the sentry-native logger function. +// +// Used for logging debug events when the `debug` option is set to true. +// +procedure sentry_options_set_logger( + opts: psentry_options_t; + func: sentry_logger_function_t; + userdata: Pointer +); cdecl; external sentry_dll delayed; + +// +// Enables or disables automatic session tracking. +// +// Automatic session tracking is enabled by default and is equivalent to calling +// `sentry_start_session` after startup. +// There can only be one running session, and the current session will always be +// closed implicitly by `sentry_close`, when starting a new session with +// `sentry_start_session`, or manually by calling `sentry_end_session`. +// +procedure sentry_options_set_auto_session_tracking( + opts: psentry_options_t; + val: Integer +); cdecl; external sentry_dll delayed; + +// +// Returns true if automatic session tracking is enabled. +// +function sentry_options_get_auto_session_tracking( + const opts: psentry_options_t +): Integer; cdecl; external sentry_dll delayed; + // // Enables or disabled user consent requirements for uploads. // @@ -823,13 +1068,36 @@ function sentry_options_get_require_user_consent( const opts: psentry_options_t ): Integer; cdecl; external sentry_dll delayed; +// +// Enables or disables on-device symbolication of stack traces. +// +// This feature can have a performance impact, and is enabled by default on +// Android. It is usually only needed when it is not possible to provide debug +// information files for system libraries which are needed for serverside +// symbolication. +// +procedure sentry_options_set_symbolize_stacktraces( + opts: psentry_options_t; + val: Integer +); cdecl; external sentry_dll delayed; + +// +// Returns true if on-device symbolication of stack traces is enabled. +// +function sentry_options_get_symbolize_stacktraces( + const opts: psentry_options_t +): Integer; cdecl; external sentry_dll delayed; + // // Adds a new attachment to be sent along. // +// `path` is assumed to be in platform-specific filesystem path encoding. +// API Users on windows are encouraged to use `sentry_options_add_attachmentw` +// instead. +// procedure sentry_options_add_attachment( opts: psentry_options_t; - const name: PAnsiChar; const path: PAnsiChar ); cdecl; external sentry_dll delayed; @@ -843,6 +1111,10 @@ procedure sentry_options_add_attachment( // It is recommended that library users set an explicit handler path, depending // on the directory/executable structure of their app. // +// `path` is assumed to be in platform-specific filesystem path encoding. +// API Users on windows are encouraged to use `sentry_options_set_handler_pathw` +// instead. +// procedure sentry_options_set_handler_path( opts: psentry_options_t; const path: PAnsiChar @@ -855,13 +1127,28 @@ procedure sentry_options_set_handler_path( // artifacts in case of a crash. This will also be used by the crashpad backend // if it is configured. // -// The path defaults to `.sentry-native` in the current working directory, will -// be created if it does not exist, and will be resolved to an absolute path -// inside of `sentry_init`. +// The directory is used for "cached" data, which needs to persist across +// application restarts to ensure proper flagging of release-health sessions, +// but might otherwise be safely purged regularly. +// +// It is roughly equivalent to the type of `AppData/Local` on Windows and +// `XDG_CACHE_HOME` on Linux, and equivalent runtime directories on other +// platforms. +// +// It is recommended that users set an explicit absolute path, depending +// on their apps runtime directory. The path will be created if it does not +// exist, and will be resolved to an absolute path inside of `sentry_init`. The +// directory should not be shared with other application data/configuration, as +// sentry-native will enumerate and possibly delete files in that directory. An +// example might be `$XDG_CACHE_HOME/your-app/sentry` +// +// If no explicit path it set, sentry-native will default to `.sentry-native` in +// the current working directory, with no specific platform-specific handling. +// +// `path` is assumed to be in platform-specific filesystem path encoding. +// API Users on windows are encouraged to use +// `sentry_options_set_database_pathw` instead. // -// It is recommended that library users set an explicit absolute path, depending -// on their own apps directory. -// procedure sentry_options_set_database_path( opts: psentry_options_t; const path: PAnsiChar @@ -873,7 +1160,6 @@ procedure sentry_options_set_database_path( // procedure sentry_options_add_attachmentw( opts: psentry_options_t; - const name: PAnsiChar; const path: PWideChar ); cdecl; external sentry_dll delayed; @@ -914,6 +1200,9 @@ procedure sentry_options_set_system_crash_reporter_enabled( // // This takes ownership of the options. After the options have been set they // cannot be modified any more. +// Depending on the configured transport and backend, this function might not be +// fully thread-safe. +// Returns 0 on success. // function sentry_init( options: psentry_options_t @@ -922,7 +1211,26 @@ function sentry_init( // // Shuts down the sentry client and forces transports to flush out. // -procedure sentry_shutdown; cdecl; external sentry_dll delayed; +// Returns 0 on success. +// +function sentry_close: Integer; cdecl; external sentry_dll delayed; + +// +// Shuts down the sentry client and forces transports to flush out. +// +// This is a **deprecated** alias for `sentry_close`. +// +// Returns 0 on success. +// +function sentry_shutdown: Integer; cdecl; external sentry_dll delayed; + +// +// This will lazily load and cache a list of all the loaded libraries. +// +// Returns a new reference to an immutable, frozen list. +// The reference must be released with `sentry_value_decref`. +// +function sentry_get_modules_list: sentry_value_t; cdecl; external sentry_dll delayed; // // Clears the internal module cache. @@ -936,11 +1244,15 @@ procedure sentry_shutdown; cdecl; external sentry_dll delayed; procedure sentry_clear_modulecache; cdecl; external sentry_dll delayed; // -// Returns the client options. -// -// This might return NULL if sentry is not yet initialized. -// -function sentry_get_options: psentry_options_t; cdecl; external sentry_dll delayed; +// Re-initializes the Sentry backend. +// +// This is needed if a third-party library overrides the previously installed +// signal handler. Calling this function can be potentially dangerous and should +// only be done when necessary. +// +// Returns 0 on success. +// +function sentry_reinstall_backend: Integer; cdecl; external sentry_dll delayed; // // Gives user consent. @@ -975,7 +1287,7 @@ function sentry_capture_event( // This is safe to be called from a crashing thread and may not return. // procedure sentry_handle_exception( - uctx: psentry_ucontext_t + const uctx: psentry_ucontext_t ); cdecl; external sentry_dll delayed; // @@ -1045,6 +1357,9 @@ procedure sentry_remove_context( // // Sets the event fingerprint. // +// This accepts a variable number of arguments, and needs to be terminated by a +// trailing `NULL`. +// procedure sentry_set_fingerprint( const fingerprint: PAnsiChar // ... diff --git a/windows/src/ext/sentry/sentry.x64.dll b/windows/src/ext/sentry/sentry.x64.dll index 1ee6df6a81..9737a5acc0 100644 Binary files a/windows/src/ext/sentry/sentry.x64.dll and b/windows/src/ext/sentry/sentry.x64.dll differ diff --git a/windows/src/ext/sentry/sentry.x64.lib b/windows/src/ext/sentry/sentry.x64.lib index 655e9f1f59..1a9f57d57c 100644 Binary files a/windows/src/ext/sentry/sentry.x64.lib and b/windows/src/ext/sentry/sentry.x64.lib differ diff --git a/windows/src/global/delphi/general/Keyman.System.KeymanSentryClient.pas b/windows/src/global/delphi/general/Keyman.System.KeymanSentryClient.pas index ef9c767f30..827596300c 100644 --- a/windows/src/global/delphi/general/Keyman.System.KeymanSentryClient.pas +++ b/windows/src/global/delphi/general/Keyman.System.KeymanSentryClient.pas @@ -101,11 +101,10 @@ begin Result := ExtractFilePath(ParamStr(0)) + sentry_dll; if FileExists(Result) then Exit; - // Keyman Engine install dir or registry override next (for Engine, Desktop) - Result := TKeymanPaths.KeymanEngineInstallPath(sentry_dll); - if (Result <> '') and FileExists(Result) then Exit; - - // Last gasp, if we are in a development situation + // If we are in a development situation, use the dev version + // of the DLL. Beware mixing and matching which can happen + // when testing DLLs that are registered and loaded from + // Program Files if Keyman is installed. Result := GetEnvironmentVariable(KEYMAN_ROOT); if Result <> '' then begin @@ -114,6 +113,10 @@ begin Exit; end; + // Keyman Engine install dir or registry override finally (for Engine, Desktop) + Result := TKeymanPaths.KeymanEngineInstallPath(sentry_dll); + if (Result <> '') and FileExists(Result) then Exit; + Result := ''; end; diff --git a/windows/src/global/delphi/keyman_components.bdsproj b/windows/src/global/delphi/keyman_components.bdsproj deleted file mode 100644 index 01e4e0f808..0000000000 --- a/windows/src/global/delphi/keyman_components.bdsproj +++ /dev/null @@ -1,177 +0,0 @@ - - - - - - - - - - - - keyman_components.dpk - - - 7.0 - - - 8 - 0 - 1 - 1 - 0 - 0 - 1 - 1 - 1 - 1 - 0 - 1 - 0 - 1 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 1 - 1 - 1 - True - True - WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; - - False - - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - True - False - False - False - True - True - True - True - True - True - - - - 0 - 0 - False - 1 - False - False - False - 16384 - 1048576 - 4194304 - - - - - - . - - .;.\vclzip;.\plusmemo;.\plusmemou - - - - False - - - - - - False - - - True - False - - - - $00000C09 - - - - True - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 3081 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - (untitled) - - - diff --git a/windows/src/global/delphi/keyman_components.cfg b/windows/src/global/delphi/keyman_components.cfg deleted file mode 100644 index 17353de494..0000000000 --- a/windows/src/global/delphi/keyman_components.cfg +++ /dev/null @@ -1,42 +0,0 @@ --$A8 --$B- --$C+ --$D+ --$E- --$F- --$G+ --$H+ --$I+ --$J+ --$K- --$L+ --$M- --$N+ --$O+ --$P+ --$Q- --$R- --$S- --$T- --$U- --$V+ --$W- --$X+ --$YD --$Z1 --cg --AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; --H+ --W+ --M --$M16384,1048576 --K$00400000 --LE"." --LN"C:\Users\mcdurdin.TAVULTESOFT\Documents\Borland Studio Projects\Bpl" --U".;.\vclzip;.\plusmemo;.\plusmemou" --O".;.\vclzip;.\plusmemo;.\plusmemou" --I".;.\vclzip;.\plusmemo;.\plusmemou" --R".;.\vclzip;.\plusmemo;.\plusmemou" --w-UNSAFE_TYPE --w-UNSAFE_CODE --w-UNSAFE_CAST diff --git a/windows/src/global/delphi/keyman_components.dof b/windows/src/global/delphi/keyman_components.dof deleted file mode 100644 index 773fbf3633..0000000000 --- a/windows/src/global/delphi/keyman_components.dof +++ /dev/null @@ -1,92 +0,0 @@ -[Compiler] -A=1 -B=0 -C=1 -D=1 -E=0 -F=0 -G=1 -H=1 -I=1 -J=1 -K=0 -L=1 -M=0 -N=1 -O=1 -P=1 -Q=0 -R=0 -S=0 -T=0 -U=0 -V=1 -W=0 -X=1 -Y=1 -Z=1 -ShowHints=1 -ShowWarnings=1 -UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; -[Linker] -MapFile=0 -OutputObjs=0 -ConsoleApp=1 -DebugInfo=0 -RemoteSymbols=0 -MinStackSize=16384 -MaxStackSize=1048576 -ImageBase=4194304 -ExeDescription= -[Directories] -OutputDir= -UnitOutputDir= -PackageDLLOutputDir=. -PackageDCPOutputDir= -SearchPath=.;.\vclzip;.\plusmemo;.\plusmemou -Packages=bcutil;vcljpg40;Vcl40;Vclx40;bccomp;bcdb;bcacct;bcappt -Conditionals= -DebugSourceDirs= -UsePackages=0 -[Parameters] -RunParams= -HostApplication= -[Language] -ActiveLang= -ProjectLang=$00000C09 -RootDir= -[Version Info] -IncludeVerInfo=1 -AutoIncBuild=0 -MajorVer=1 -MinorVer=0 -Release=0 -Build=0 -Debug=0 -PreRelease=0 -Special=0 -Private=0 -DLL=0 -Locale=3081 -CodePage=1252 -[Version Info Keys] -CompanyName= -FileDescription= -FileVersion=1.0.0.0 -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename= -ProductName= -ProductVersion=1.0.0.0 -Comments= -[HistoryLists\hlDebugSourcePath] -Count=1 -Item0=$(DELPHI)\source\vcl -[HistoryLists\hlUnitAliases] -Count=1 -Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; -[HistoryLists\hlSearchPath] -Count=2 -Item0=$(DELPHI)\source\vcl;C:\keyman\5.1\src\dev\kct\FORMDES\SOURCE;C:\keyman\5.1\src\dev\kct\OBJINSP\SOURCE;c:\keyman\5.1\src\global\delphi\components;c:\keyman\5.1\src\global\delphi\folderdlg;c:\keyman\5.1\src\global\delphi\xstringgrid;c:\keyman\5.1\src\global\delphi\vclzip;c:\keyman\5.1\src\global\delphi\plusmemou -Item1=$(DELPHI)\source\toolsapi;$(DELPHI)\source\vcl;C:\keyman\5.1\src\dev\kct\FORMDES\SOURCE;C:\keyman\5.1\src\dev\kct\OBJINSP\SOURCE;c:\keyman\5.1\src\global\delphi\components;c:\keyman\5.1\src\global\delphi\folderdlg;c:\keyman\5.1\src\global\delphi\xstringgrid;c:\keyman\5.1\src\global\delphi\vclzip;c:\keyman\5.1\src\global\delphi\plusmemou