chore(developer): Merge branch 'master' into feat/developer/node-based-debugger-server

This commit is contained in:
Marc Durdin 2021-12-20 10:41:17 +11:00
commit e569f0aba4
201 changed files with 2465 additions and 2943 deletions

View file

@ -1,5 +1,32 @@
# Keyman Version History
## 15.0.170 alpha 2021-12-16
* docs(linux): Document how to disable error reporting (#6051)
* fix(linux): fix release version number for Sentry reporting (#6052)
* fix(linux): Fix package description (#6054)
## 15.0.169 alpha 2021-12-15
* fix(mac): display Unicode package name correctly instead of '????' (#6016)
* fix(linux): Improve ibus-keyman tests (#6044)
## 15.0.168 alpha 2021-12-14
* feat(linux): Add support for Ubuntu 22.04 Jammy (#6037)
## 15.0.167 alpha 2021-12-13
* fix(windows): remove unused variable (#6039)
## 15.0.166 alpha 2021-12-11
* chore(windows): version.rc use macros instead of mkver (#6019)
* chore(windows): move from Borland make to nmake (#6020)
* chore(windows): use findstr instead of Borland grep (#6021)
* chore(windows): replace mkver with mkver.sh (#6022)
* chore(windows): build without delphi (#6030)
## 15.0.165 alpha 2021-12-08
* fix(web): font size was not consistently set (#5906)

View file

@ -1 +1 @@
15.0.166
15.0.171

View file

@ -1,6 +1,6 @@
{
"name": "@keymanapp/input-processor",
"version": "15.0.166",
"version": "15.0.171",
"lockfileVersion": 2,
"requires": true,
"packages": {

View file

@ -1,6 +1,6 @@
{
"name": "@keymanapp/input-processor",
"version": "15.0.166",
"version": "15.0.171",
"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.166",
"@keymanapp/resources-gosh": "^15.0.166",
"@keymanapp/lexical-model-compiler": "^15.0.171",
"@keymanapp/resources-gosh": "^15.0.171",
"@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.166",
"@keymanapp/lexical-model-layer": "^15.0.166",
"@keymanapp/models-types": "^15.0.166",
"@keymanapp/web-environment": "^15.0.166",
"@keymanapp/web-utils": "^15.0.166",
"@keymanapp/keyboard-processor": "^15.0.171",
"@keymanapp/lexical-model-layer": "^15.0.171",
"@keymanapp/models-types": "^15.0.171",
"@keymanapp/web-environment": "^15.0.171",
"@keymanapp/web-utils": "^15.0.171",
"eventemitter3": "^4.0.0"
}
}

View file

@ -1,6 +1,6 @@
{
"name": "@keymanapp/keyboard-processor",
"version": "15.0.166",
"version": "15.0.171",
"lockfileVersion": 2,
"requires": true,
"packages": {

View file

@ -1,6 +1,6 @@
{
"name": "@keymanapp/keyboard-processor",
"version": "15.0.166",
"version": "15.0.171",
"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.166",
"@keymanapp/resources-gosh": "^15.0.171",
"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.166",
"@keymanapp/web-environment": "^15.0.166",
"@keymanapp/web-utils": "^15.0.166",
"@keymanapp/models-types": "^15.0.171",
"@keymanapp/web-environment": "^15.0.171",
"@keymanapp/web-utils": "^15.0.171",
"@types/node": "^11.9.4"
}
}

View file

@ -1,6 +1,6 @@
{
"name": "@keymanapp/recorder-core",
"version": "15.0.166",
"version": "15.0.171",
"lockfileVersion": 2,
"requires": true,
"packages": {

View file

@ -1,6 +1,6 @@
{
"name": "@keymanapp/recorder-core",
"version": "15.0.166",
"version": "15.0.171",
"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.166",
"@keymanapp/models-types": "^15.0.166",
"@keymanapp/web-environment": "^15.0.166",
"@keymanapp/web-utils": "^15.0.166",
"@keymanapp/keyboard-processor": "^15.0.171",
"@keymanapp/models-types": "^15.0.171",
"@keymanapp/web-environment": "^15.0.171",
"@keymanapp/web-utils": "^15.0.171",
"@types/node": "^11.9.4"
},
"devDependencies": {

View file

@ -1,6 +1,6 @@
{
"name": "@keymanapp/web-sentry-manager",
"version": "15.0.166",
"version": "15.0.171",
"lockfileVersion": 1,
"requires": true,
"dependencies": {

View file

@ -1,6 +1,6 @@
{
"name": "@keymanapp/web-sentry-manager",
"version": "15.0.166",
"version": "15.0.171",
"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.166",
"@keymanapp/web-environment": "^15.0.171",
"@sentry/browser": "^5.27.4"
}
}

View file

@ -1,6 +1,6 @@
{
"name": "@keymanapp/web-utils",
"version": "15.0.166",
"version": "15.0.171",
"lockfileVersion": 1,
"requires": true,
"dependencies": {

View file

@ -1,6 +1,6 @@
{
"name": "@keymanapp/web-utils",
"version": "15.0.166",
"version": "15.0.171",
"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.166",
"@keymanapp/web-environment": "^15.0.166",
"@keymanapp/resources-gosh": "^15.0.171",
"@keymanapp/web-environment": "^15.0.171",
"@types/node": "^14.0.5",
"typescript": "^3.8.3"
}

View file

@ -1,6 +1,6 @@
{
"name": "@keymanapp/models-templates",
"version": "15.0.166",
"version": "15.0.171",
"lockfileVersion": 2,
"requires": true,
"packages": {

View file

@ -1,6 +1,6 @@
{
"name": "@keymanapp/models-templates",
"version": "15.0.166",
"version": "15.0.171",
"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.166",
"@keymanapp/web-utils": "^15.0.166",
"@keymanapp/models-types": "^15.0.171",
"@keymanapp/web-utils": "^15.0.171",
"@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.166"
"@keymanapp/models-wordbreakers": "^15.0.171"
}
}

View file

@ -1,6 +1,6 @@
{
"name": "@keymanapp/models-types",
"version": "15.0.166",
"version": "15.0.171",
"lockfileVersion": 1,
"requires": true,
"dependencies": {

View file

@ -1,6 +1,6 @@
{
"name": "@keymanapp/models-types",
"version": "15.0.166",
"version": "15.0.171",
"description": "Type definitions in used in the modeling (lexical model/predictive text) component of Keyman.",
"types": "./index.d.ts",
"scripts": {

View file

@ -1,6 +1,6 @@
{
"name": "@keymanapp/models-wordbreakers",
"version": "15.0.166",
"version": "15.0.171",
"lockfileVersion": 2,
"requires": true,
"packages": {

View file

@ -1,6 +1,6 @@
{
"name": "@keymanapp/models-wordbreakers",
"version": "15.0.166",
"version": "15.0.171",
"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.166",
"@keymanapp/models-types": "^15.0.171",
"@types/chai": "^4.2.11",
"@types/mocha": "^7.0.2",
"chai": "^4.3.4",

View file

@ -1,6 +1,6 @@
{
"name": "@keymanapp/lexical-model-layer",
"version": "15.0.166",
"version": "15.0.171",
"lockfileVersion": 2,
"requires": true,
"packages": {

View file

@ -1,6 +1,6 @@
{
"name": "@keymanapp/lexical-model-layer",
"version": "15.0.166",
"version": "15.0.171",
"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.166",
"@keymanapp/resources-gosh": "^15.0.166",
"@keymanapp/models-types": "^15.0.171",
"@keymanapp/resources-gosh": "^15.0.171",
"@types/node": "^10.17.21",
"chai": "^4.3.4",
"karma": "^6.3.4",
@ -46,10 +46,10 @@
"typescript": "^3.8.3"
},
"dependencies": {
"@keymanapp/models-templates": "^15.0.166",
"@keymanapp/models-wordbreakers": "^15.0.166",
"@keymanapp/web-environment": "^15.0.166",
"@keymanapp/web-utils": "^15.0.166",
"@keymanapp/models-templates": "^15.0.171",
"@keymanapp/models-wordbreakers": "^15.0.171",
"@keymanapp/web-environment": "^15.0.171",
"@keymanapp/web-utils": "^15.0.171",
"es6-shim": "^0.35.5",
"string.prototype.codepointat": "^0.2.1",
"string.prototype.startswith": "^0.2.0"

View file

@ -1,6 +1,6 @@
{
"name": "@keymanapp/lexical-model-compiler",
"version": "15.0.166",
"version": "15.0.171",
"lockfileVersion": 2,
"requires": true,
"packages": {

View file

@ -1,6 +1,6 @@
{
"name": "@keymanapp/lexical-model-compiler",
"version": "15.0.166",
"version": "15.0.171",
"description": "Keyman Developer lexical model compiler",
"keywords": [
"keyboard",
@ -37,14 +37,14 @@
"node": ">=12.0.0"
},
"dependencies": {
"@keymanapp/models-types": "^15.0.166",
"@keymanapp/models-types": "^15.0.171",
"commander": "^3.0.0",
"typescript": "^3.8.3",
"xml2js": "^0.4.19"
},
"devDependencies": {
"@keymanapp/models-templates": "^15.0.166",
"@keymanapp/models-wordbreakers": "^15.0.166",
"@keymanapp/models-templates": "^15.0.171",
"@keymanapp/models-wordbreakers": "^15.0.171",
"@types/chai": "^4.1.7",
"@types/mocha": "^5.2.7",
"@types/node": "^10.14.6",

16
docs/build/windows.md vendored
View file

@ -147,18 +147,26 @@ choco install git jq python ninja pandoc
refreshenv
# choco meson (0.55) is too old, 0.56 required:
python -m pip install meson
# choco rustup is not currently working:
Invoke-WebRequest -Uri https://static.rust-lang.org/rustup/dist/x86_64-pc-windows-msvc/rustup-init.exe -OutFile $env:TEMP\rustup-init.exe
& "$env:TEMP\rustup-init.exe"
refreshenv
```
Restart PowerShell (because `refreshenv` doesn't seem to pick up the rust environment), then
```ps1
# Elevated Powershell
rustup target add i686-pc-windows-msvc
```
**Environment variables**:
* [`KEYMAN_ROOT`](#keyman_root)
* `PATH`: add your Python scripts folder to your path: it will normally be `%appdata%\Python\Python310\Scripts`.
```bat
SET KEYMAN_ROOT=c:\Projects\keyman\keyman
SET PATH=%path%;%appdata%\Python\Python310\Scripts
```
To check whether environment variables are set, run `SET <variable>` in command
@ -223,6 +231,14 @@ Invoke-WebRequest -Uri https://github.com/rustwasm/wasm-pack/releases/download/v
Start Delphi IDE once after installation as it will create various environment
files and take you through required registration.
* Note: It is possible to build all components that do _not_ require Delphi by
adding the environment variable `NODELPHI=1` before starting the build.
Currently many components are Delphi-based, but if you are working just in
Keyman Core, the compiler, or Keyman Engine's C++ components, you may be
able to get away without building them. In this situation, we recommend
copying the relevant Delphi-built components into windows/bin folders from a
compatible installed version of Keyman for testing and debugging purposes.
* Visual C++ 2019 Community or Professional
```ps1

View file

@ -20,5 +20,5 @@
"ts-node",
"typescript"
],
"version": "15.0.166"
"version": "15.0.171"
}

View file

@ -14,7 +14,7 @@ DEBIAN_SUITES=($UNSTABLE_CODENAME $TESTING_CODENAME $STABLE_CODENAME $STABLE_BAC
"experimental" "unstable" "testing" "stable")
# List of Ubuntu suites. Update these when needed.
UBUNTU_SUITES=("impish" "hirsute" "groovy" "focal" "bionic")
UBUNTU_SUITES=("jammy" "impish" "hirsute" "focal" "bionic")
# Mirrors to use. Update these to your preferred mirror.
DEBIAN_MIRROR="deb.debian.org"

2
linux/Jenkinsfile vendored
View file

@ -5,7 +5,7 @@
@Library('lsdev-pipeline-library') _
keymanPackaging {
distributionsToPackage = 'bionic focal hirsute'
distributionsToPackage = 'bionic focal hirsute jammy'
arches = 'amd64 i386'
packagesToBuild = ['keyman', 'kmflcomp', 'libkmfl', 'ibus-kmfl']
}

View file

@ -7,24 +7,24 @@
<project_group>Keyman</project_group>
<developer_name>SIL International</developer_name>
<icon type="remote" width="96" height="96">https://keyman.com/cdn/dev/img/keyman-logo.png</icon>
<name>Keyman Keyboards</name>
<summary>Keyman makes it possible for you to type in over 1,000 languages</summary>
<name>Keyman for Linux</name>
<summary>Keyman makes it possible for you to type in over 2,000 languages</summary>
<description>
<p>
Keyman makes it possible for you to type in over 1,000 languages on Windows, macOS, Linux,
Keyman makes it possible for you to type in over 2,000 languages on Windows, macOS, Linux,
iPhone, iPad, Android tablets and phones, and even instantly in your web browser. With the
world’s most powerful keyboarding engine, intuitive and rapid text input is now possible in
your language, and for over 99% of the global population’s mother tongues!
</p>
<p>
Originally created in 1993 to type Lao on Windows, Keyman is now a free and
open source keyboarding platform which allows anyone to write a keyboard layout
Originally created in 1993 to type Lao on Windows, Keyman is now a free and
open source keyboarding platform which allows anyone to write and use a keyboard layout
for their language. Keyman is available for many platforms, including Windows,
macOS, iOS, Android, Linux and the web.
</p>
<p>
Keyboard layouts are defined with a clear and easy to understand keyboard
Keyboard layouts are defined with a clear and easy to understand keyboard
grammar. Keyman's contextual input model means keyboard layouts can be
intelligent and make it simple to type even the most complex languages.
Keyboard layouts are distributed through an open catalog to all major desktop
@ -39,7 +39,7 @@ and mobile platforms.
<screenshots>
<screenshot type="default">
<caption>The Keyman Keyboards main window with a keyboard welcome window.</caption>
<caption>The Keyman for Linux configuration window with a keyboard welcome window.</caption>
<image type="source" width="920" height="518">https://keyman.com/go/linux/11.0/linux-configuration.png</image>
</screenshot>
</screenshots>

View file

@ -12,8 +12,7 @@
​ <description>
​ <p>
This input method provides the Keyman IM engine for IBus. With this module, you can
use keyboard layouts designed for Keyman version 11 or earlier under the IBus
platform.
use keyboard layouts designed for Keyman under the IBus platform.
</p>
<p>
Originally created in 1993 to type Lao on Windows, Keyman is now a free and

View file

@ -51,7 +51,7 @@ Depends:
Recommends:
onboard-keyman,
Description: Type in your language with Keyman for Linux
Keyman makes it possible for you to type in over 1,000 languages on Windows,
Keyman makes it possible for you to type in over 2,000 languages on Windows,
macOS, Linux, iPhone, iPad, Android tablets and phones, and even instantly
in your web browser. With the world’s most powerful keyboarding engine,
intuitive and rapid text input is now possible in your language, and for
@ -98,8 +98,8 @@ Description: Keyman for Linux configuration
Keyboard layouts are distributed through an open catalog to all major desktop
and mobile platforms.
.
Python module to install, uninstall and view information about Keyman
keyboard packages.
This package contains the Python module to install, uninstall and view
information about Keyman keyboard packages.
Package: libkmnkbp-dev
Architecture: amd64 arm64 armel armhf i386 mipsel mips64el ppc64el riscv64
@ -121,7 +121,7 @@ Description: Development files for Keyman keyboard processing library
and mobile platforms.
.
The Keyman keyboardprocessor library processes input from input method engines
and applies rules from compiled Keyman 11 or earlier kmx keyboard files.
and applies rules from compiled Keyman keyboard files.
.
This package contains development headers and libraries.
@ -149,7 +149,7 @@ Description: Keyman keyboard processing library
and mobile platforms.
.
The Keyman keyboardprocessor library processes input from input method engines
and applies rules from compiled Keyman 11 or earlier kmx keyboard files.
and applies rules from compiled Keyman keyboard files.
Package: ibus-keyman
Architecture: amd64 arm64 armel armhf i386 mipsel mips64el ppc64el riscv64
@ -173,9 +173,8 @@ Description: Keyman engine for IBus
Keyboard layouts are distributed through an open catalog to all major desktop
and mobile platforms.
.
IBus-keyman is a IM (input method) Engine for multiple languages, based on
ibus-keyman is a IM (input method) Engine for multiple languages, based on
IBus.
.
This package provides the Keyman IM engine for IBus. With this module, you
can use keyboard layouts designed for Keyman version 11 or earlier under the
IBus platform.
can use keyboard layouts designed for Keyman under the IBus platform.

View file

@ -1,8 +1,8 @@
[Desktop Entry]
Name=Keyman Keyboards
Name[en_GB]=Keyman Keyboards
Comment=Configure Keyman keyboards
Comment[en_GB]=Configure Keyman keyboards
Name=Keyman Configuration
Name[en_GB]=Keyman Configuration
Comment=Configure Keyman for Linux keyboards
Comment[en_GB]=Configure Keyman for Linux keyboards
Exec=km-config %u
Icon=km-config
Terminal=false

View file

@ -64,3 +64,14 @@ sudo dpkg --purge ibus-kmfl libkmfl
**A.** Most keyboards will work without change. A small subset of keyboards require features which
are not yet available in Keyman for Linux. These features will be progressively implemented.
## Q. How can I disable automatically reporting errors?
**A.** If Keyman crashes, it will automatically send a report to the development team. This report
is anonymous and contains only technical details relating to the crash. It does not include keystroke
data or personally identifying data. If you don't want these automatic error reports to be sent you
can set the environment variable `KEYMAN_NOSENTRY`:
```bash
export KEYMAN_NOSENTRY=1
```

View file

@ -347,6 +347,7 @@ static void test_source(IBusKeymanTestsFixture *fixture, gconstpointer user_data
keyman_put_options_todconf(data->test_name, data->test_name, key, value);
}
}
g_settings_sync();
switch_keyboard(fixture, kmxfile.c_str());
if (test_source.caps_lock_state() != get_caps_lock_state(fixture)) {

View file

@ -61,7 +61,7 @@ else:
sentry_sdk.init(
dsn=SentryUrl,
environment=__environment__,
release=__version__,
release='release-' + __versionwithtag__,
integrations=[sentry_logging],
)
set_user({'id': hash(getpass.getuser())})

View file

@ -3,7 +3,7 @@
# If needed set cowbuilder up for building Keyman Debian packages
# Then cowbuilder update
distributions='bionic focal hirsute impish'
distributions='bionic focal hirsute impish jammy'
dpkgcheck=`dpkg-query -l cowbuilder`
if [ $? != 0 ]; then

View file

@ -40,7 +40,7 @@ echo "ppa: ${ppa}"
if [ "${DIST}" != "" ]; then
distributions="${DIST}"
else
distributions="bionic focal hirsute impish"
distributions="bionic focal hirsute impish jammy"
fi
if [ "${PACKAGEVERSION}" != "" ]; then

View file

@ -283,7 +283,7 @@ CGEventRef eventTapFunction(CGEventTapProxy proxy, CGEventType type, CGEventRef
}
NSString *packagePath = [kmxPath stringByDeletingLastPathComponent];
NSDictionary *infoDict = [KMXFile infoDictionaryFromFilePath:kmxPath];
NSDictionary *infoDict = [KMXFile keyboardInfoFromKmxFile:kmxPath];
NSString *kvkFilename = [infoDict objectForKey:kKMVisualKeyboardKey];
if (kvkFilename && [kvkFilename length]) {
NSString *kvkPath = [packagePath stringByAppendingPathComponent:kvkFilename];
@ -328,7 +328,7 @@ CGEventRef eventTapFunction(CGEventTapProxy proxy, CGEventType type, CGEventRef
self.kmxList = [NSMutableArray arrayWithArray:[self KMXFiles]];
NSMutableArray *kmxDesc = [[NSMutableArray alloc] initWithCapacity:0];
for (NSString *path in self.kmxList) {
NSDictionary *infoDict = [KMXFile infoDictionaryFromFilePath:path];
NSDictionary *infoDict = [KMXFile keyboardInfoFromKmxFile:path];
if (!infoDict)
continue;

View file

@ -7,6 +7,9 @@
objects = {
/* Begin PBXBuildFile section */
290BC680274B9DB1005CD1C3 /* KMPackageInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 290BC67F274B9DB1005CD1C3 /* KMPackageInfo.m */; };
290BC75E274F3FD7005CD1C3 /* KMKeyboardInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 290BC75D274F3FD7005CD1C3 /* KMKeyboardInfo.m */; };
296FE2FC275DD21600F46898 /* KMPackageReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 296FE2FB275DD21600F46898 /* KMPackageReader.m */; };
293EA3E627140D8100545EED /* KMAboutWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 293EA3E827140D8100545EED /* KMAboutWindowController.xib */; };
293EA3EB27140DEC00545EED /* preferences.xib in Resources */ = {isa = PBXBuildFile; fileRef = 293EA3ED27140DEC00545EED /* preferences.xib */; };
293EA3F427181FDA00545EED /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 293EA3F627181FDA00545EED /* Localizable.strings */; };
@ -122,6 +125,12 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
290BC67E274B9DB1005CD1C3 /* KMPackageInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KMPackageInfo.h; sourceTree = "<group>"; };
290BC67F274B9DB1005CD1C3 /* KMPackageInfo.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KMPackageInfo.m; sourceTree = "<group>"; };
290BC75C274F3FD7005CD1C3 /* KMKeyboardInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KMKeyboardInfo.h; sourceTree = "<group>"; };
290BC75D274F3FD7005CD1C3 /* KMKeyboardInfo.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KMKeyboardInfo.m; sourceTree = "<group>"; };
296FE2FA275DD21600F46898 /* KMPackageReader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KMPackageReader.h; sourceTree = "<group>"; };
296FE2FB275DD21600F46898 /* KMPackageReader.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KMPackageReader.m; sourceTree = "<group>"; };
293EA3E527140D3A00545EED /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = "<group>"; };
293EA3E727140D8100545EED /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/KMAboutWindowController.xib; sourceTree = "<group>"; };
293EA3EA27140D8E00545EED /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/KMAboutWindowController.strings; sourceTree = "<group>"; };
@ -437,6 +446,12 @@
E240F598202DED740000067D /* KMPackage.m */,
9A3D6C5B221531B0008785A3 /* KMOSVersion.h */,
9A3D6C5C221531B0008785A3 /* KMOSVersion.m */,
290BC67E274B9DB1005CD1C3 /* KMPackageInfo.h */,
290BC75C274F3FD7005CD1C3 /* KMKeyboardInfo.h */,
290BC75D274F3FD7005CD1C3 /* KMKeyboardInfo.m */,
290BC67F274B9DB1005CD1C3 /* KMPackageInfo.m */,
296FE2FA275DD21600F46898 /* KMPackageReader.h */,
296FE2FB275DD21600F46898 /* KMPackageReader.m */,
293EA3F627181FDA00545EED /* Localizable.strings */,
);
path = Keyman4MacIM;
@ -808,6 +823,7 @@
98F3C8931A8D739500F675E3 /* KMConfigurationWindowController.m in Sources */,
9A3D6C5D221531B0008785A3 /* KMOSVersion.m in Sources */,
989C9C111A7876DE00A20425 /* main.m in Sources */,
290BC680274B9DB1005CD1C3 /* KMPackageInfo.m in Sources */,
98BF924F1BF02DC20002126A /* KMBarView.m in Sources */,
E240F599202DED740000067D /* KMPackage.m in Sources */,
984B8F441AF1C3D900E096A8 /* OSKWindowController.m in Sources */,
@ -821,12 +837,14 @@
98BF92441BF01CBE0002126A /* KMAboutWindowController.m in Sources */,
98FE10631B4DEE5600525F54 /* KMInfoWindowController.m in Sources */,
9836B3721AE5F11D00780482 /* unzip.c in Sources */,
296FE2FC275DD21600F46898 /* KMPackageReader.m in Sources */,
9832472E1A9EABC70010B90C /* KMConfigColumn1CellView.m in Sources */,
E22020F6200506F300B74FAC /* KMInputMethodSafariClientEventHandler.m in Sources */,
E24C79EA1FFFCC7500D8E46F /* KMInputMethodBrowserClientEventHandler.m in Sources */,
98FE105E1B4DE8F400525F54 /* NSWindow+SuppMethods.m in Sources */,
9836B3741AE5F11D00780482 /* ZipArchive.mm in Sources */,
983247B21A9EB9690010B90C /* KMConfigColumn3CellView.m in Sources */,
290BC75E274F3FD7005CD1C3 /* KMKeyboardInfo.m in Sources */,
98BF92521BF03D4D0002126A /* KMAboutBGView.m in Sources */,
98BF92571BF0431F0002126A /* KMAboutWindow.m in Sources */,
98BCD1F61B4E5998004E1AFD /* NSString+SuppMethods.m in Sources */,

View file

@ -133,17 +133,17 @@
if ([obj isKindOfClass:[NSArray class]]) {
NSArray *pArray = (NSArray *)obj;
NSString *packageFolder = [self packageFolderFromPath:[pArray objectAtIndex:0]];
NSString *packageName = [self packageNameFromFolder:packageFolder];
NSString *packageName = [self.AppDelegate packageNameFromPackageInfo:packageFolder];
[_tableContents addObject:[NSDictionary dictionaryWithObjectsAndKeys:packageName, @"HeaderTitle", nil]];
for (NSString *path in pArray) {
NSDictionary *info = [KMXFile infoDictionaryFromFilePath:path];
NSDictionary *info = [KMXFile keyboardInfoFromKmxFile:path];
if (info)
[_tableContents addObject:info];
}
}
else {
NSString *path = (NSString *)obj;
NSDictionary *info = [KMXFile infoDictionaryFromFilePath:path];
NSDictionary *info = [KMXFile keyboardInfoFromKmxFile:path];
if (info)
[_tableContents addObject:info];
}
@ -169,10 +169,6 @@
return [self.AppDelegate packageFolderFromPath:path];
}
- (NSString *)packageNameFromFolder:(NSString *)packageFolder {
return [self.AppDelegate packageNameFromFolder:packageFolder];
}
- (NSString *)keyboardsPath {
return self.AppDelegate.keyboardsPath;
}

View file

@ -8,6 +8,8 @@
#import "KMInfoWindowController.h"
#import "KMInputMethodAppDelegate.h"
#import "KMPackageInfo.h"
#import "KMKeyboardInfo.h"
#import <WebKit/WebKit.h>
@interface KMInfoWindowController ()
@ -15,7 +17,7 @@
@property (nonatomic, weak) IBOutlet NSTabView *tabView;
@property (nonatomic, weak) IBOutlet WebView *detailsView;
@property (nonatomic, weak) IBOutlet WebView *readmeView;
@property (nonatomic, strong) NSDictionary *infoDict;
@property (nonatomic, strong) KMPackageInfo *packageInfo;
@property (nonatomic, strong) NSTabViewItem *readMeTab;
@end
@ -27,6 +29,8 @@
- (void)windowDidLoad {
[super windowDidLoad];
// TODO: rename
[self.window setTitle:@"Keyboard/Package Info"];
[self.tabView setDelegate:self];
[self.detailsView setFrameLoadDelegate:(id<WebFrameLoadDelegate>)self];
[self.detailsView setPolicyDelegate:(id<WebPolicyDelegate>)self];
@ -34,12 +38,13 @@
[self.readmeView setPolicyDelegate:(id<WebPolicyDelegate>)self];
}
// TODO: rename, refactor, reset PackageInfo directly rather than making getter do it?
- (void)setPackagePath:(NSString *)packagePath {
_packagePath = packagePath;
_infoDict = nil;
_packageInfo = nil;
[self.tabView selectTabViewItemAtIndex:0];
if (packagePath != nil && packagePath.length) {
NSString *imgName = [self.infoDict objectForKey:kGraphicFile];
NSString *imgName = self.packageInfo.graphicFilename;
if (imgName != nil) {
NSString *imgFile = [packagePath stringByAppendingPathComponent:imgName];
NSImage *img = [[NSImage alloc] initWithContentsOfFile:imgFile];
@ -55,9 +60,9 @@
else
[self.detailsView.mainFrame loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]];
NSString *readMeFile = [self.infoDict objectForKey:kReadMeFile];
if (readMeFile != nil) {
[self.readmeView.mainFrame loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[packagePath stringByAppendingPathComponent:readMeFile]]]];
NSString *readmeFilename = self.packageInfo.readmeFilename;
if (readmeFilename != nil) {
[self.readmeView.mainFrame loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[packagePath stringByAppendingPathComponent:readmeFilename]]]];
if (_readMeTab != nil && ![self.tabView.tabViewItems containsObject:_readMeTab]) {
[self.tabView addTabViewItem:_readMeTab];
_readMeTab = nil;
@ -120,33 +125,22 @@
"</html>";
NSString *pBodyFormat = @"<p class='body'>%@</p><br>";
NSMutableString *kbsStr = [NSMutableString stringWithString:@""];
NSArray *kbs = [[self AppDelegate] keyboardNamesFromFolder:self.packagePath];
if (kbs != nil && kbs.count) {
for (NSArray *kbName in kbs) {
[kbsStr appendString:[NSString stringWithFormat:pBodyFormat, kbName]];
}
}
else {
// This was the old logic (prior to fixing issue #994). Keeping as fallback, though
// it's unlikely to be useful/needed.
kbs = [self.infoDict objectForKey:kKeyboard];
NSMutableString *keyboardString = [NSMutableString stringWithString:@""];
if (kbs != nil && kbs.count) {
for (NSArray *kb in kbs) {
[kbsStr appendString:[NSString stringWithFormat:pBodyFormat, [kb objectAtIndex:0]]];
}
}
else {
kbsStr = [NSMutableString stringWithString:@"<p class='body'><none></p><br>"];
if (self.packageInfo.keyboards.count) {
for (KMKeyboardInfo *keyboard in self.packageInfo.keyboards) {
[keyboardString appendString:[NSString stringWithFormat:pBodyFormat, keyboard.name]];
}
} else {
keyboardString = [NSMutableString stringWithString:@"<p class='body'><none></p><br>"];
}
NSArray *fonts = [self.infoDict objectForKey:kFont];
NSArray *fonts = self.packageInfo.fonts;
NSMutableString *fontsStr = [NSMutableString stringWithString:@""];
if (fonts != nil && fonts.count) {
for (NSArray *font in fonts) {
[fontsStr appendString:[NSString stringWithFormat:pBodyFormat, [font objectAtIndex:0]]];
for (NSString *font in fonts) {
[fontsStr appendString:[NSString stringWithFormat:pBodyFormat, font]];
}
}
else {
@ -158,16 +152,17 @@
KeymanVersionInfo keymanVersionInfo = [[self AppDelegate] versionInfo];
NSString *shareUrl = [NSString stringWithFormat:@"https://%@/go/keyboard/%@/share", keymanVersionInfo.keymanCom, packageId];
NSString *name = [[self.infoDict objectForKey:kName] objectAtIndex:0];
NSString *name = self.packageInfo.packageName;
if (name == nil)
name = @"Unknown Keyboard Package";
NSString *version = [[self.infoDict objectForKey:kVersion] objectAtIndex:0];
NSString *version = self.packageInfo.packageVersion;
if (version == nil)
version = @"";
NSString *authorV1 = [[self.infoDict objectForKey:kAuthor] objectAtIndex:0];
NSString *authorV2 = [[self.infoDict objectForKey:kAuthor] objectAtIndex:1];
NSString *authorV1 = self.packageInfo.authorName;
NSString *authorV2 = self.packageInfo.authorUrl;
NSString *author = @"";
if (authorV1.length && authorV2.length)
author = [NSString stringWithFormat:linkFormat, authorV2, authorV1];
@ -175,29 +170,17 @@
author = authorV1;
else if (authorV2.length)
author = [NSString stringWithFormat:linkFormat, authorV2, authorV2];
NSString *websiteV1 = [[self.infoDict objectForKey:kWebSite] objectAtIndex:0];
NSString *websiteV2 = [[self.infoDict objectForKey:kWebSite] objectAtIndex:1];
NSString *website = @"";
if (websiteV1.length && websiteV2.length)
website = [NSString stringWithFormat:linkFormat, websiteV2, websiteV1];
else if (websiteV1.length)
website = websiteV1;
else if (websiteV2.length)
website = [NSString stringWithFormat:linkFormat, websiteV2, websiteV2];
if (self.packageInfo.website.length)
website = [NSString stringWithFormat:linkFormat, self.packageInfo.website, self.packageInfo.website];
NSString *copyrightV1 = [[self.infoDict objectForKey:kCopyright] objectAtIndex:0];
NSString *copyrightV2 = [[self.infoDict objectForKey:kCopyright] objectAtIndex:1];
NSString *copyright = @"";
if (copyrightV1.length && copyrightV2.length)
copyright = [NSString stringWithFormat:linkFormat, copyrightV2, copyrightV1];
else if (copyrightV1.length)
copyright = copyrightV1;
else if (copyrightV2.length)
copyright = [NSString stringWithFormat:linkFormat, copyrightV2, copyrightV2];
if (self.packageInfo.copyright.length)
copyright = self.packageInfo.copyright;
NSString *htmlStr = [NSString stringWithFormat:htmlFormat, name, shareUrl, shareUrl,
kbsStr, fontsStr, version, author, website, copyright];
keyboardString, fontsStr, version, author, website, copyright];
return htmlStr;
}
@ -207,13 +190,12 @@
}
}
- (NSDictionary *)infoDict {
if (_infoDict == nil) {
NSString *infoFile = [self.packagePath stringByAppendingPathComponent:@"kmp.inf"];
_infoDict = [self.AppDelegate infoDictionaryFromFile:infoFile];
- (KMPackageInfo *)packageInfo {
if(_packageInfo == nil) {
_packageInfo = [self.AppDelegate loadPackageInfo:self.packagePath];
}
return _infoDict;
return _packageInfo;
}
- (void)webView:(WebView *)webView decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id<WebPolicyDecisionListener>)listener {

View file

@ -224,7 +224,7 @@ NSMutableArray *servers;
KMXFile *kmx = [[KMXFile alloc] initWithFilePath:path];
[self.AppDelegate setKmx:kmx];
KVKFile *kvk = nil;
NSDictionary *kmxInfo = [KMXFile infoDictionaryFromFilePath:path];
NSDictionary *kmxInfo = [KMXFile keyboardInfoFromKmxFile:path];
NSString *kvkFilename = [kmxInfo objectForKey:kKMVisualKeyboardKey];
if (kvkFilename != nil) {
NSString *kvkFilePath = [self.AppDelegate kvkFilePathFromFilename:kvkFilename];

View file

@ -12,6 +12,7 @@
#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h>
#import <KeymanEngine4Mac/KeymanEngine4Mac.h>
#import "KMPackageReader.h"
#import "KMInputController.h"
#import "KMAboutWindowController.h"
#import "KMInfoWindowController.h"
@ -26,24 +27,6 @@ extern NSString *const kKMSelectedKeyboardKey;
extern NSString *const kKMActiveKeyboardsKey;
extern NSString *const kKeymanKeyboardDownloadCompletedNotification;
extern NSString *const kPackage;
extern NSString *const kButtons;
extern NSString *const kStartMenu;
extern NSString *const kStartMenuEntries;
extern NSString *const kInfo;
extern NSString *const kFiles;
extern NSString *const kAuthor;
extern NSString *const kCopyright;
extern NSString *const kFile;
extern NSString *const kFont;
extern NSString *const kGraphicFile;
extern NSString *const kKeyboard;
extern NSString *const kName;
extern NSString *const kReadMeFile;
extern NSString *const kVersion;
extern NSString *const kWebSite;
typedef struct {
NSString *sentryEnvironment;
NSString *versionRelease;
@ -118,9 +101,9 @@ typedef struct {
- (NSString *)packagePathAtIndex:(NSUInteger)index;
- (NSInteger)indexForPackageFolder:(NSString *)packageFolder;
- (NSString *)packageFolderFromPath:(NSString *)path;
- (NSString *)packageNameFromFolder:(NSString *)packageFolder;
- (KMPackageInfo *)loadPackageInfo:(NSString *)path;
- (NSString *)packageNameFromPackageInfo:(NSString *)packageFolder;
- (NSArray *)keyboardNamesFromFolder:(NSString *)packageFolder;
- (NSDictionary *)infoDictionaryFromFile:(NSString *)infoFile;
- (NSString *)kvkFilePathFromFilename:(NSString *)kvkFilename;
- (NSString *)oskWindowTitle;
- (void)postKeyboardEventWithSource: (CGEventSourceRef)source code:(CGKeyCode) virtualKey postCallback:(PostEventCallback)postEvent;

View file

@ -19,6 +19,9 @@
#import "KMConfigurationWindowController.h"
#import "KMDownloadKBWindowController.h"
#import "ZipArchive.h"
#import "KMPackageReader.h"
#import "KMPackageInfo.h"
#import "KMKeyboardInfo.h"
@import Sentry;
/** NSUserDefaults keys */
@ -31,28 +34,9 @@ NSString *const kKMLegacyApps = @"KMLegacyApps";
NSString *const kKeymanKeyboardDownloadCompletedNotification = @"kKeymanKeyboardDownloadCompletedNotification";
NSString *const kPackage = @"[Package]";
NSString *const kButtons = @"[Buttons]";
NSString *const kStartMenu = @"[StartMenu]";
NSString *const kStartMenuEntries = @"[StartMenuEntries]";
NSString *const kInfo = @"[Info]";
NSString *const kFiles = @"[Files]";
NSString *const kAuthor = @"Author";
NSString *const kCopyright = @"Copyright";
NSString *const kFile = @"File";
NSString *const kFont = @"Font";
NSString *const kGraphicFile = @"GraphicFile";
NSString *const kKeyboard = @"Keyboard";
NSString *const kName = @"Name";
NSString *const kReadMeFile = @"ReadMeFile";
NSString *const kVersion = @"Version";
NSString *const kWebSite = @"WebSite";
NSString *const kWelcome = @"Welcome";
typedef enum {
ctPackage, ctButtons, ctStartMenu, ctStartMenuEntries, ctInfo, ctFiles, ctUnknown
} ContentType;
@interface KMInputMethodAppDelegate ()
@property (nonatomic, strong) KMPackageReader *packageReader;
@end
@implementation KMInputMethodAppDelegate
@synthesize kme = _kme;
@ -365,6 +349,15 @@ CGEventRef eventTapFunction(CGEventTapProxy proxy, CGEventType type, CGEventRef
return _kme;
}
- (KMPackageReader *)packageReader {
if (_packageReader == nil) {
_packageReader = [[KMPackageReader alloc] init];
[_packageReader setDebugMode:self.debugMode];
}
return _packageReader;
}
- (void)setKmx:(KMXFile *)kmx {
_kmx = kmx;
[self.kme setKmx:_kmx];
@ -448,6 +441,9 @@ CGEventRef eventTapFunction(CGEventTapProxy proxy, CGEventType type, CGEventRef
_debugMode = useVerboseLogging;
if (_kme != nil)
[_kme setUseVerboseLogging:useVerboseLogging];
if (_packageReader != nil) {
[_packageReader setDebugMode:useVerboseLogging];
}
NSUserDefaults *userData = [NSUserDefaults standardUserDefaults];
[userData setBool:useVerboseLogging forKey:kKMUseVerboseLogging];
[userData synchronize];
@ -464,6 +460,8 @@ CGEventRef eventTapFunction(CGEventTapProxy proxy, CGEventType type, CGEventRef
return [userData boolForKey:kKMUseVerboseLogging];
}
#pragma mark - Keyman Data
/**
* Locate and create the Keyman data path; currently in ~/Documents/Keyman-Keyboards
*/
@ -602,35 +600,27 @@ CGEventRef eventTapFunction(CGEventTapProxy proxy, CGEventType type, CGEventRef
return packageFolder;
}
- (NSString *)packageNameFromFolder:(NSString *)packageFolder {
- (KMPackageInfo *)loadPackageInfo:(NSString *)path {
return [self.packageReader loadPackageInfo:path];
}
- (NSString *)packageNameFromPackageInfo:(NSString *)packageFolder {
NSString *packageName = nil;
NSString *path = [[self keyboardsPath] stringByAppendingPathComponent:packageFolder];
NSString *fileContents = [NSString stringWithContentsOfFile:[path stringByAppendingPathComponent:@"kmp.inf"] encoding:NSWindowsCP1252StringEncoding error:NULL];
NSArray *lines = [fileContents componentsSeparatedByString:@"\n"];
BOOL hasInfo = NO;
for (NSString *line in lines) {
if ([line startsWith:@"[Info]"]) {
hasInfo = YES;
continue;
}
if (hasInfo && [line startsWith:@"Name="]) {
NSString *value = [[[line substringFromIndex:5] componentsSeparatedByString:@","] objectAtIndex:0];
packageName = [NSString stringWithString:[value stringByReplacingOccurrencesOfString:@"\"" withString:@""]];
break;
}
NSString *path = [[self keymanDataPath] stringByAppendingPathComponent:packageFolder];
KMPackageInfo *packageInfo = [self.packageReader loadPackageInfo:path];
if (packageInfo) {
packageName = packageInfo.packageName;
}
if (packageName == nil)
packageName = packageFolder;
return packageName;
}
- (NSArray *)keyboardNamesFromFolder:(NSString *)packageFolder {
NSMutableArray *kbNames = [[NSMutableArray alloc] initWithCapacity:0];;
for (NSString *kmxFile in [self KMXFilesAtPath:packageFolder]) {
NSDictionary * infoDict = [KMXFile infoDictionaryFromFilePath:kmxFile];
NSDictionary * infoDict = [KMXFile keyboardInfoFromKmxFile:kmxFile];
if (infoDict != nil) {
NSString *name = [infoDict objectForKey:kKMKeyboardNameKey];
if (name != nil && [name length]) {
@ -643,155 +633,6 @@ CGEventRef eventTapFunction(CGEventTapProxy proxy, CGEventType type, CGEventRef
return kbNames;
}
- (NSDictionary *)infoDictionaryFromFile:(NSString *)infoFile {
NSMutableDictionary *infoDict = [NSMutableDictionary dictionaryWithCapacity:0];
NSMutableArray *files = [NSMutableArray arrayWithCapacity:0];
NSMutableArray *fonts = [NSMutableArray arrayWithCapacity:0];
NSMutableArray *kbs = [NSMutableArray arrayWithCapacity:0];
@try {
NSString *fileContents = [[NSString stringWithContentsOfFile:infoFile encoding:NSWindowsCP1252StringEncoding error:NULL] stringByReplacingOccurrencesOfString:@"\r" withString:@""];
NSArray *lines = [fileContents componentsSeparatedByString:@"\n"];
ContentType contentType = ctUnknown;
for (NSString *line in lines) {
if (!line.length)
continue;
if ([line startsWith:kPackage]) {
contentType = ctPackage;
continue;
}
else if ([line startsWith:kButtons]) {
contentType = ctButtons;
continue;
}
else if ([line startsWith:kStartMenu]) {
contentType = ctStartMenu;
continue;
}
else if ([line startsWith:kStartMenuEntries]) {
contentType = ctStartMenuEntries;
continue;
}
else if ([line startsWith:kInfo]) {
contentType = ctInfo;
continue;
}
else if ([line startsWith:kFiles]) {
contentType = ctFiles;
continue;
}
switch (contentType) {
case ctPackage: {
if ([line startsWith:kReadMeFile])
[infoDict setObject:[line substringFromIndex:kReadMeFile.length+1] forKey:kReadMeFile];
else if ([line startsWith:kGraphicFile])
[infoDict setObject:[line substringFromIndex:kGraphicFile.length+1] forKey:kGraphicFile];
break;
}
case ctButtons:
break;
case ctStartMenu:
break;
case ctStartMenuEntries: {
if ([line startsWith:kWelcome]) {
NSString *s = [line substringFromIndex:kWelcome.length+1];
NSArray *vs = [s componentsSeparatedByString:@"\","];
NSString *v1 = [[vs objectAtIndex:0] stringByReplacingOccurrencesOfString:@"\"" withString:@""];
NSString *v2 = [[vs objectAtIndex:1] stringByReplacingOccurrencesOfString:@"\"" withString:@""];
[infoDict setObject:@[v1, v2] forKey:kWelcome];
}
break;
}
case ctInfo: {
if ([line startsWith:kName]) {
NSString *s = [line substringFromIndex:kName.length+1];
NSArray *vs = [s componentsSeparatedByString:@"\","];
NSString *v1 = [[vs objectAtIndex:0] stringByReplacingOccurrencesOfString:@"\"" withString:@""];
NSString *v2 = [[vs objectAtIndex:1] stringByReplacingOccurrencesOfString:@"\"" withString:@""];
[infoDict setObject:@[v1, v2] forKey:kName];
}
else if ([line startsWith:kVersion]) {
NSString *s = [line substringFromIndex:kVersion.length+1];
NSArray *vs = [s componentsSeparatedByString:@"\","];
NSString *v1 = [[vs objectAtIndex:0] stringByReplacingOccurrencesOfString:@"\"" withString:@""];
NSString *v2 = [[vs objectAtIndex:1] stringByReplacingOccurrencesOfString:@"\"" withString:@""];
[infoDict setObject:@[v1, v2] forKey:kVersion];
}
else if ([line startsWith:kAuthor]) {
NSString *s = [line substringFromIndex:kAuthor.length+1];
NSArray *vs = [s componentsSeparatedByString:@"\","];
NSString *v1 = [[vs objectAtIndex:0] stringByReplacingOccurrencesOfString:@"\"" withString:@""];
NSString *v2 = [[vs objectAtIndex:1] stringByReplacingOccurrencesOfString:@"\"" withString:@""];
[infoDict setObject:@[v1, v2] forKey:kAuthor];
}
else if ([line startsWith:kCopyright]) {
NSString *s = [line substringFromIndex:kCopyright.length+1];
NSArray *vs = [s componentsSeparatedByString:@"\","];
NSString *v1 = [[vs objectAtIndex:0] stringByReplacingOccurrencesOfString:@"\"" withString:@""];
NSString *v2 = [[vs objectAtIndex:1] stringByReplacingOccurrencesOfString:@"\"" withString:@""];
[infoDict setObject:@[v1, v2] forKey:kCopyright];
}
else if ([line startsWith:kWebSite]) {
NSString *s = [line substringFromIndex:kWebSite.length+1];
NSArray *vs = [s componentsSeparatedByString:@"\","];
NSString *v1 = [[vs objectAtIndex:0] stringByReplacingOccurrencesOfString:@"\"" withString:@""];
NSString *v2 = [[vs objectAtIndex:1] stringByReplacingOccurrencesOfString:@"\"" withString:@""];
[infoDict setObject:@[v1, v2] forKey:kWebSite];
}
break;
}
case ctFiles: {
NSUInteger x = [line rangeOfString:@"="].location;
if (x == NSNotFound)
continue;
NSString *s = [line substringFromIndex:x+2];
if ([s startsWith:kFile]) {
NSArray *vs = [s componentsSeparatedByString:@"\","];
NSString *v1 = [[[vs objectAtIndex:0] substringFromIndex:kFile.length+1] stringByReplacingOccurrencesOfString:@"\"" withString:@""];
NSString *v2 = [[vs objectAtIndex:1] stringByReplacingOccurrencesOfString:@"\"" withString:@""];
[files addObject:@[v1, v2]];
}
else if ([s startsWith:kFont]) {
NSArray *vs = [s componentsSeparatedByString:@"\","];
NSString *v1 = [[[vs objectAtIndex:0] substringFromIndex:kFont.length+1] stringByReplacingOccurrencesOfString:@"\"" withString:@""];
NSString *v2 = [[vs objectAtIndex:1] stringByReplacingOccurrencesOfString:@"\"" withString:@""];
[fonts addObject:@[v1, v2]];
}
else if ([s startsWith:kKeyboard]) {
NSArray *vs = [s componentsSeparatedByString:@"\","];
NSString *v1 = [[[vs objectAtIndex:0] substringFromIndex:kKeyboard.length+1] stringByReplacingOccurrencesOfString:@"\"" withString:@""];
NSString *v2 = [[vs objectAtIndex:1] stringByReplacingOccurrencesOfString:@"\"" withString:@""];
[kbs addObject:@[v1, v2]];
}
break;
}
default:
break;
}
}
}
@catch (NSException *e) {
NSLog(@"Error = %@", e.description);
return nil;
}
if (files.count)
[infoDict setValue:files forKey:kFile];
if (fonts.count)
[infoDict setValue:fonts forKey:kFont];
if (kbs.count)
[infoDict setValue:kbs forKey:kKeyboard];
return infoDict.count?[NSDictionary dictionaryWithDictionary:infoDict]:nil;
}
- (NSString *)selectedKeyboard {
if (_selectedKeyboard == nil) {
NSUserDefaults *userData = [NSUserDefaults standardUserDefaults];
@ -907,7 +748,7 @@ CGEventRef eventTapFunction(CGEventTapProxy proxy, CGEventType type, CGEventRef
NSInteger itag = 1000;
[keyboards.submenu removeAllItems];
for (NSString *path in self.activeKeyboards) {
NSDictionary *infoDict = [KMXFile infoDictionaryFromFilePath:path];
NSDictionary *infoDict = [KMXFile keyboardInfoFromKmxFile:path];
if (!infoDict)
continue;
//NSString *str = [NSString stringWithFormat:@"%@ (%@)", [infoDict objectForKey:kKMKeyboardNameKey], [infoDict objectForKey:kKMKeyboardVersionKey]];
@ -918,7 +759,7 @@ CGEventRef eventTapFunction(CGEventTapProxy proxy, CGEventType type, CGEventRef
[item setState:NSOnState];
KMXFile *kmx = [[KMXFile alloc] initWithFilePath:path];
[self setKmx:kmx];
NSDictionary *kmxInfo = [KMXFile infoDictionaryFromFilePath:path];
NSDictionary *kmxInfo = [KMXFile keyboardInfoFromKmxFile:path];
NSString *kvkFilename = [kmxInfo objectForKey:kKMVisualKeyboardKey];
if (kvkFilename != nil) {
NSString *kvkFilePath = [self kvkFilePathFromFilename:kvkFilename];
@ -953,7 +794,7 @@ CGEventRef eventTapFunction(CGEventTapProxy proxy, CGEventType type, CGEventRef
NSString *path = [self.activeKeyboards objectAtIndex:0];
KMXFile *kmx = [[KMXFile alloc] initWithFilePath:path];
[self setKmx:kmx];
NSDictionary *kmxInfo = [KMXFile infoDictionaryFromFilePath:path];
NSDictionary *kmxInfo = [KMXFile keyboardInfoFromKmxFile:path];
NSString *kvkFilename = [kmxInfo objectForKey:kKMVisualKeyboardKey];
if (kvkFilename != nil) {
NSString *kvkFilePath = [self kvkFilePathFromFilename:kvkFilename];

View file

@ -8,11 +8,12 @@
#import "KMKeyboardHelpWindowController.h"
#import "KMInputMethodAppDelegate.h"
#import "KMPackageInfo.h"
#import <WebKit/WebKit.h>
@interface KMKeyboardHelpWindowController ()
@property (nonatomic, weak) IBOutlet WebView *welcomeView;
@property (nonatomic, strong) NSDictionary *infoDict;
@property (nonatomic, strong) KMPackageInfo *packageInfo;
@end
@implementation KMKeyboardHelpWindowController
@ -30,10 +31,10 @@
- (void)setPackagePath:(NSString *)packagePath {
_packagePath = packagePath;
_infoDict = nil;
_packageInfo = nil;
if (packagePath != nil && packagePath.length) {
@try {
NSString *title = [[self.infoDict objectForKey:kName] objectAtIndex:0];
NSString *title = self.packageInfo.packageName;
if (title.length)
[self.window setTitle:title];
}
@ -49,13 +50,12 @@
}
}
- (NSDictionary *)infoDict {
if (_infoDict == nil) {
NSString *infoFile = [self.packagePath stringByAppendingPathComponent:@"kmp.inf"];
_infoDict = [self.AppDelegate infoDictionaryFromFile:infoFile];
- (KMPackageInfo*)packageInfo {
if(_packageInfo == nil) {
_packageInfo = [self.AppDelegate loadPackageInfo:self.packagePath];
}
return _infoDict;
return _packageInfo;
}
- (IBAction)okAction:(id)sender {

View file

@ -0,0 +1,55 @@
/*
* Keyman is copyright (C) SIL International. MIT License.
*
* KMKeyboardInfo.h
* Keyman
*
* Created by Shawn Schantz on 2021/11/25.
*
* Value object describing a keyboard element of a Keyman package.
*/
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface KMKeyboardInfoBuilder : NSObject
@property (nonatomic,copy) NSString* name;
@property (nonatomic,copy) NSString* identifier;
@property (nonatomic,copy) NSString* version;
@property (nonatomic,copy) NSString* oskFont;
@property (nonatomic,copy) NSString* displayFont;
@property (nonatomic,copy) NSArray* languages;
- (instancetype)init;
@end
@interface KMLanguageInfo : NSObject
@property (nonatomic,readonly) NSString* name;
@property (nonatomic,readonly) NSString* identifier;
- (instancetype)initWithName:(NSString*)name
identifier:(NSString*)identifier;
@end
@interface KMKeyboardInfo : NSObject
@property (nonatomic,readonly) NSString* name;
@property (nonatomic,readonly) NSString* identifier;
@property (nonatomic,readonly) NSString* version;
@property (nonatomic,readonly) NSString* oskFont;
@property (nonatomic,readonly) NSString* displayFont;
@property (nonatomic,readonly) NSArray* languages;
- (instancetype)initWithBuilder:(KMKeyboardInfoBuilder*)builder;
- (instancetype)initWithName:(NSString*)name
identifier:(NSString*)identifier
version:(NSString*)version
oskFont:(NSString*)oskFont
displayFont:(NSString*)displayFont
languages:(NSArray*)languages;
@end
NS_ASSUME_NONNULL_END

View file

@ -0,0 +1,79 @@
/*
* Keyman is copyright (C) SIL International. MIT License.
*
* KMKeyboardInfo.m
* Keyman
*
* Created by Shawn Schantz on 2021/11/25.
*
* Value object describing a keyboard element of a Keyman package.
*/
#import "KMKeyboardInfo.h"
@implementation KMKeyboardInfoBuilder
- (instancetype)init {
self = [super init];
if (self) {
_name = nil;
_identifier = nil;
_version = nil;
_oskFont = nil;
_displayFont = nil;
_languages = nil;
}
return self;
}
@end
@implementation KMLanguageInfo
- (instancetype)initWithName:(NSString*)name
identifier:(NSString*)identifier
{
self = [super init];
if (self) {
_name = [name copy];
_identifier = [identifier copy];
}
return self;
}
@end
@implementation KMKeyboardInfo
- (instancetype)initWithBuilder:(KMKeyboardInfoBuilder *)builder {
self = [super init];
if (self) {
_name = builder.name;
_identifier = builder.identifier;
_version = builder.version;
_oskFont = builder.oskFont;
_displayFont = builder.displayFont;
_languages = builder.languages;
}
return self;
}
- (instancetype)initWithName:(NSString*)name
identifier:(NSString*)identifier
version:(NSString*)version
oskFont:(NSString*)oskFont
displayFont:(NSString*)displayFont
languages:(NSArray*)languages
{
self = [super init];
if (self) {
_name = [name copy];
_identifier = [identifier copy];
_version = [version copy];
_oskFont = [oskFont copy];
_displayFont = [displayFont copy];
_languages = [languages copy];
}
return self;
}
@end

View file

@ -0,0 +1,69 @@
/*
* Keyman is copyright (C) SIL International. MIT License.
*
* KMPackageInfo.h
* Keyman
*
* Created by Shawn Schantz on 2021/11/22.
*
* Value object describing a Keyman package.
*/
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface KMPackageInfoBuilder : NSObject
@property (nonatomic,copy) NSString* packageName;
@property (nonatomic,copy) NSString* packageVersion;
@property (nonatomic,copy) NSString* readmeFilename;
@property (nonatomic,copy) NSString* graphicFilename;
@property (nonatomic,copy) NSString* fileVersion;
@property (nonatomic,copy) NSString* keymanDeveloperVersion;
@property (nonatomic,copy) NSString* copyright;
@property (nonatomic,copy) NSString* authorName;
@property (nonatomic,copy) NSString* authorUrl;
@property (nonatomic,copy) NSString* website;
@property (nonatomic,copy) NSArray* keyboards;
@property (nonatomic,copy) NSArray* files;
@property (nonatomic,copy) NSArray* fonts;
- (instancetype)init;
@end
@interface KMPackageInfo : NSObject
@property (nonatomic,readonly) NSString* packageName;
@property (nonatomic,readonly) NSString* packageVersion;
@property (nonatomic,readonly) NSString* readmeFilename;
@property (nonatomic,readonly) NSString* graphicFilename;
@property (nonatomic,readonly) NSString* fileVersion;
@property (nonatomic,readonly) NSString* keymanDeveloperVersion;
@property (nonatomic,readonly) NSString* copyright;
@property (nonatomic,readonly) NSString* authorName;
@property (nonatomic,readonly) NSString* authorUrl;
@property (nonatomic,readonly) NSString* website;
@property (nonatomic,readonly) NSArray* keyboards;
@property (nonatomic,readonly) NSArray* files;
@property (nonatomic,readonly) NSArray* fonts;
- (instancetype)initWithBuilder:(KMPackageInfoBuilder *)builder;
- (instancetype)initWithName:(NSString*)packageName
packageVersion:(NSString*)packageVersion
readmeFilename:(NSString*)readmeFilename
graphicFilename:(NSString*)graphicFilename
fileVersion:(NSString*)fileVersion
keymanDeveloperVersion:(NSString*)keymanDeveloperVersion
copyright:(NSString*)copyright
authorName:(NSString*)authorName
authorUrl:(NSString*)authorUrl
website:(NSString*)website
keyboards:(NSArray*)keyboards
fonts:(NSArray*)fonts
files:(NSArray*)files;
@end
NS_ASSUME_NONNULL_END

View file

@ -0,0 +1,91 @@
/*
* Keyman is copyright (C) SIL International. MIT License.
*
* KMPackageInfo.m
* Keyman
*
* Created by Shawn Schantz on 2021/11/22.
*
* Value object describing a Keyman package.
*/
#import "KMPackageInfo.h"
@implementation KMPackageInfoBuilder
- (instancetype)init {
self = [super init];
if (self) {
_packageName = nil;
_packageVersion = nil;
_readmeFilename = nil;
_graphicFilename = nil;
_fileVersion = nil;
_keymanDeveloperVersion = nil;
_copyright = nil;
_authorName = nil;
_authorUrl = nil;
_website = nil;
_keyboards = nil;
_fonts = nil;
_files = nil;
}
return self;
}
@end
@implementation KMPackageInfo
- (instancetype)initWithBuilder:(KMPackageInfoBuilder *)builder {
self = [super init];
if (self) {
_packageName = builder.packageName;
_packageVersion = builder.packageVersion;
_readmeFilename = builder.readmeFilename;
_graphicFilename = builder.graphicFilename;
_fileVersion = builder.fileVersion;
_keymanDeveloperVersion = builder.keymanDeveloperVersion;
_copyright = builder.copyright;
_authorName = builder.authorName;
_authorUrl = builder.authorUrl;
_website = builder.website;
_keyboards = builder.keyboards;
_fonts = builder.fonts;
_files = builder.files;
}
return self;
}
- (instancetype)initWithName:(NSString*)packageName
packageVersion:(NSString*)packageVersion
readmeFilename:(NSString*)readmeFilename
graphicFilename:(NSString*)graphicFilename
fileVersion:(NSString*)fileVersion
keymanDeveloperVersion:(NSString*)keymanDeveloperVersion
copyright:(NSString*)copyright
authorName:(NSString*)authorName
authorUrl:(NSString*)authorUrl
website:(NSString*)website
keyboards:(NSArray*)keyboards
fonts:(NSArray*)fonts
files:(NSArray*)files
{
self = [super init];
if (self) {
_packageName = [packageName copy];
_packageVersion = [packageVersion copy];
_readmeFilename = [readmeFilename copy];
_graphicFilename = [graphicFilename copy];
_fileVersion = [fileVersion copy];
_keymanDeveloperVersion = [keymanDeveloperVersion copy];
_copyright = [copyright copy];
_authorName = [authorName copy];
_authorUrl = [authorUrl copy];
_website = [website copy];
_keyboards = [keyboards copy];
_fonts = [fonts copy];
_files = [files copy];
}
return self;
}
@end

View file

@ -0,0 +1,29 @@
/*
* Keyman is copyright (C) SIL International. MIT License.
*
* KMPackageReader.m
* Keyman
*
* Created by Shawn Schantz on 2021/12/06.
*
* Read package information from kmp.json, if it exists. If not, read from kmp.inf.
* Then create and return KMPackageInfo object.
*
*/
#import "KMPackageInfo.h"
#import "KMKeyboardInfo.h"
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface KMPackageReader : NSObject
@property (assign, nonatomic) BOOL debugMode;
- (instancetype)init;
- (KMPackageInfo *)loadPackageInfo:(NSString *)path;
@end
NS_ASSUME_NONNULL_END

View file

@ -0,0 +1,337 @@
/*
* Keyman is copyright (C) SIL International. MIT License.
*
* KMPackageReader.m
* Keyman
*
* Created by Shawn Schantz on 2021/12/06.
*
* Read package information from kmp.json, if it exists. If not, read from kmp.inf.
* Then create and return KMPackageInfo object.
*
*/
#import "KMPackageReader.h"
static NSString *const kPackageJsonFile = @"kmp.json";
static NSString *const kPackageInfFile = @"kmp.inf";
static NSString *const kPackage = @"[Package]";
static NSString *const kButtons = @"[Buttons]";
static NSString *const kStartMenu = @"[StartMenu]";
static NSString *const kStartMenuEntries = @"[StartMenuEntries]";
static NSString *const kInfo = @"[Info]";
static NSString *const kFiles = @"[Files]";
static NSString *const kAuthor = @"Author";
static NSString *const kCopyright = @"Copyright";
static NSString *const kFile = @"File";
static NSString *const kFont = @"Font";
static NSString *const kGraphicFile = @"GraphicFile";
static NSString *const kKeyboard = @"Keyboard";
static NSString *const kName = @"Name";
static NSString *const kReadMeFile = @"ReadMeFile";
static NSString *const kVersion = @"Version";
static NSString *const kWebSite = @"WebSite";
static NSString *const kWelcome = @"Welcome";
typedef enum {
ctPackage, ctButtons, ctStartMenu, ctStartMenuEntries, ctInfo, ctFiles, ctUnknown
} ContentType;
@implementation KMPackageReader
- (instancetype)init {
self = [super init];
if (self) {
_debugMode = NO;
}
return self;
}
/**
* Attempt to load Keyman Package Information from kmp.json.
* If kmp.json file is not found or not readable, load from legacy kmp.inf file.
* @param <path> the full path of the package folder.
*/
- (KMPackageInfo *)loadPackageInfo:(NSString *)path {
KMPackageInfo *packageInfo = nil;
NSString *jsonFilename = [path stringByAppendingPathComponent:kPackageJsonFile];
packageInfo = [self loadPackageInfoFromJsonFile:jsonFilename];
if (packageInfo == nil) {
NSString *infoFilename = [path stringByAppendingPathComponent:kPackageInfFile];
packageInfo = [self loadPackageInfoFromInfFile:infoFilename];
}
return packageInfo;
}
- (NSString *)packageNameFromPackageInfo:(NSString *)path {
NSString *packageName = nil;
KMPackageInfo *packageInfo = [self loadPackageInfo:path];
packageName = packageInfo.packageName;
return packageName;
}
/**
* read JSON file and load it into KMPackageInfo object
* returns nil if the file does not exist or it cannot be parsed as JSON
*/
- (KMPackageInfo *) loadPackageInfoFromJsonFile:(NSString *)path {
KMPackageInfo * packageInfo = nil;
if (self.debugMode)
NSLog(@"Loading JSON package info from path: %@", path);
NSError *readError = nil;
NSData *data = [NSData dataWithContentsOfFile:path options:kNilOptions error:&readError];
NSDictionary *parsedData = nil;
if (data == nil) {
NSLog(@"Error reading JSON file at path : %@, error: %@ ", path, readError);
} else {
NSError *parseError = nil;
parsedData = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&parseError];
if (parsedData == nil) {
NSLog(@"Error parsing JSON file at path : %@, error: %@ ", path, parseError);
} else {
packageInfo = [self createPackageInfoFromJsonData:parsedData];
}
}
return packageInfo;
}
/**
* Creates a KeyboardInfo object using data loaded from kmp.json.
* @param keyboard an NSDictionary containing all the key-value pairs of a keyboard object from the kmp.json keyboards array
* @return the corresponding KeyboardInfo value object
*/
- (KMKeyboardInfo *) createKeyboardInfoFromJsonKeyboard:(NSDictionary *) keyboard {
KMKeyboardInfoBuilder *builder = [[KMKeyboardInfoBuilder alloc] init];
NSArray *languages = keyboard[@"languages"];
NSMutableArray *languageInfoArray = [NSMutableArray arrayWithCapacity:0];
for (NSDictionary *language in languages) {
KMLanguageInfo *languageInfo = [[KMLanguageInfo alloc] initWithName:language[@"name"]
identifier:language[@"id"]];
[languageInfoArray addObject:languageInfo];
}
builder.name = keyboard[@"name"];
builder.identifier = keyboard[@"id"];
builder.version = keyboard[@"version"];
builder.oskFont = keyboard[@"oskFont"];
builder.displayFont = keyboard[@"displayFont"];
builder.languages = [languageInfoArray copy];
KMKeyboardInfo *keyboardInfo = [[KMKeyboardInfo alloc] initWithBuilder:builder];
return keyboardInfo;
}
- (KMPackageInfo *) createPackageInfoFromJsonData:(NSDictionary *) jsonData {
NSMutableArray *keyboardInfoArray = [NSMutableArray arrayWithCapacity:0];
NSMutableArray *fontArray = [NSMutableArray arrayWithCapacity:0];
NSArray *keyboards = jsonData[@"keyboards"];
// loop through keyboards array to add keyboards,
// then loop through each keyboard's languages array to add languages
for (NSDictionary *keyboard in keyboards) {
KMKeyboardInfo *keyboardInfo = [self createKeyboardInfoFromJsonKeyboard:keyboard];
// add oskFont to fontArray if not nil or empty string
if ([keyboardInfo.oskFont length]) {
[fontArray addObject:keyboardInfo.oskFont];
}
// add displayFont to fontArray if not not nil or empty string and not equal to oskFont
if ([keyboardInfo.displayFont length] &&
![keyboardInfo.displayFont isEqualToString:keyboardInfo.displayFont]) {
[fontArray addObject:keyboardInfo.displayFont];
}
[keyboardInfoArray addObject:keyboardInfo];
}
KMPackageInfoBuilder *builder =
[[KMPackageInfoBuilder alloc] init];
builder.packageName = jsonData[@"info"][@"name"][@"description"];
builder.packageVersion = jsonData[@"info"][@"version"][@"description"];
builder.readmeFilename = jsonData[@"options"][@"readmeFile"];
builder.graphicFilename = jsonData[@"options"][@"graphicFile"];
builder.fileVersion = jsonData[@"system"][@"fileVersion"];
builder.keymanDeveloperVersion = jsonData[@"system"][@"keymanDeveloperVersion"];
builder.copyright = jsonData[@"info"][@"copyright"][@"description"];
builder.authorName = jsonData[@"info"][@"author"][@"description"];
builder.authorUrl = jsonData[@"info"][@"author"][@"url"];
builder.website = jsonData[@"info"][@"website"][@"url"];
builder.keyboards = [keyboardInfoArray copy];
builder.fonts = [fontArray copy];
KMPackageInfo *packageInfo = [[KMPackageInfo alloc] initWithBuilder:builder];
return packageInfo;
}
// TODO: refactor, break up and eliminate duplicate code
/**
* Creates a KMPackageInfo object from the specified kmp.inf file.
* This code is adapted from legacy method keyboardInfoFromInfFile that loaded data from inf file to NSDictionary.
*
* @param path the full path to the kmp.inf file
* @return the corresponding PackageInfo value object or nil if the file cannot be found or parsed
*/
- (KMPackageInfo *) loadPackageInfoFromInfFile:(NSString *)path {
if (self.debugMode)
NSLog(@"Loading inf package info from path: %@", path);
NSMutableArray *files = [NSMutableArray arrayWithCapacity:0];
NSMutableArray *keyboardInfoArray = [NSMutableArray arrayWithCapacity:0];
NSMutableArray *fontArray = [NSMutableArray arrayWithCapacity:0];
KMPackageInfoBuilder *builder = [[KMPackageInfoBuilder alloc] init];
@try {
NSString *fileContents = [[NSString stringWithContentsOfFile:path encoding:NSWindowsCP1252StringEncoding error:NULL] stringByReplacingOccurrencesOfString:@"\r" withString:@""];
NSArray *lines = [fileContents componentsSeparatedByString:@"\n"];
ContentType contentType = ctUnknown;
for (NSString *line in lines) {
if (!line.length)
continue;
if ([[line lowercaseString] hasPrefix:[kPackage lowercaseString]]) {
contentType = ctPackage;
continue;
}
else if ([[line lowercaseString] hasPrefix:[kButtons lowercaseString]]) {
contentType = ctButtons;
continue;
}
else if ([[line lowercaseString] hasPrefix:[kStartMenu lowercaseString]]) {
contentType = ctStartMenu;
continue;
}
else if ([[line lowercaseString] hasPrefix:[kStartMenuEntries lowercaseString]]) {
contentType = ctStartMenuEntries;
continue;
}
else if ([[line lowercaseString] hasPrefix:[kInfo lowercaseString]]) {
contentType = ctInfo;
continue;
}
else if ([[line lowercaseString] hasPrefix:[kFiles lowercaseString]]) {
contentType = ctFiles;
continue;
}
switch (contentType) {
case ctPackage: {
if ([[line lowercaseString] hasPrefix:[kReadMeFile lowercaseString]])
builder.readmeFilename = [line substringFromIndex:kReadMeFile.length+1];
else if ([[line lowercaseString] hasPrefix:[kGraphicFile lowercaseString]])
builder.graphicFilename = [line substringFromIndex:kGraphicFile.length+1];
break;
}
case ctButtons:
break;
case ctStartMenu:
break;
case ctStartMenuEntries:
break;
case ctInfo: {
if ([[line lowercaseString] hasPrefix:[kName lowercaseString]]) {
NSString *s = [line substringFromIndex:kName.length+1];
NSArray *vs = [s componentsSeparatedByString:@"\","];
NSString *v1 = [[vs objectAtIndex:0] stringByReplacingOccurrencesOfString:@"\"" withString:@""];
NSString *v2 = [[vs objectAtIndex:1] stringByReplacingOccurrencesOfString:@"\"" withString:@""];
builder.packageName = v1;
}
else if ([[line lowercaseString] hasPrefix:[kVersion lowercaseString]]) {
NSString *s = [line substringFromIndex:kVersion.length+1];
NSArray *vs = [s componentsSeparatedByString:@"\","];
NSString *v1 = [[vs objectAtIndex:0] stringByReplacingOccurrencesOfString:@"\"" withString:@""];
NSString *v2 = [[vs objectAtIndex:1] stringByReplacingOccurrencesOfString:@"\"" withString:@""];
builder.packageVersion = v1;
}
else if ([[line lowercaseString] hasPrefix:[kAuthor lowercaseString]]) {
NSString *s = [line substringFromIndex:kAuthor.length+1];
NSArray *vs = [s componentsSeparatedByString:@"\","];
NSString *v1 = [[vs objectAtIndex:0] stringByReplacingOccurrencesOfString:@"\"" withString:@""];
NSString *v2 = [[vs objectAtIndex:1] stringByReplacingOccurrencesOfString:@"\"" withString:@""];
builder.authorName = v1;
builder.authorUrl = v2;
}
else if ([[line lowercaseString] hasPrefix:[kCopyright lowercaseString]]) {
NSString *s = [line substringFromIndex:kCopyright.length+1];
NSArray *vs = [s componentsSeparatedByString:@"\","];
NSString *v1 = [[vs objectAtIndex:0] stringByReplacingOccurrencesOfString:@"\"" withString:@""];
NSString *v2 = [[vs objectAtIndex:1] stringByReplacingOccurrencesOfString:@"\"" withString:@""];
builder.copyright = v1;
}
else if ([[line lowercaseString] hasPrefix:[kWebSite lowercaseString]]) {
NSString *s = [line substringFromIndex:kWebSite.length+1];
NSArray *vs = [s componentsSeparatedByString:@"\","];
NSString *v1 = [[vs objectAtIndex:0] stringByReplacingOccurrencesOfString:@"\"" withString:@""];
NSString *v2 = [[vs objectAtIndex:1] stringByReplacingOccurrencesOfString:@"\"" withString:@""];
builder.website = v1;
}
break;
}
case ctFiles: {
NSUInteger x = [line rangeOfString:@"="].location;
if (x == NSNotFound)
continue;
NSString *s = [line substringFromIndex:x+2];
if ([[s lowercaseString] hasPrefix:[kFile lowercaseString]]) {
NSArray *vs = [s componentsSeparatedByString:@"\","];
NSString *v1 = [[[vs objectAtIndex:0] substringFromIndex:kFile.length+1] stringByReplacingOccurrencesOfString:@"\"" withString:@""];
NSString *fileName = [[vs objectAtIndex:1] stringByReplacingOccurrencesOfString:@"\"" withString:@""];
[files addObject:fileName];
}
else if ([[s lowercaseString] hasPrefix:[kFont lowercaseString]]) {
NSArray *vs = [s componentsSeparatedByString:@"\","];
NSString *fontName = [[[vs objectAtIndex:0] substringFromIndex:kFont.length+1] stringByReplacingOccurrencesOfString:@"\"" withString:@""];
NSString *fontFileName = [[vs objectAtIndex:1] stringByReplacingOccurrencesOfString:@"\"" withString:@""];
[fontArray addObject:fontName];
}
else if ([[s lowercaseString] hasPrefix:[kKeyboard lowercaseString]]) {
NSArray *vs = [s componentsSeparatedByString:@"\","];
NSString *keyboardName = [[[vs objectAtIndex:0] substringFromIndex:kKeyboard.length+1] stringByReplacingOccurrencesOfString:@"\"" withString:@""];
NSString *keyboardFileName = [[vs objectAtIndex:1] stringByReplacingOccurrencesOfString:@"\"" withString:@""];
KMKeyboardInfoBuilder *builder = [[KMKeyboardInfoBuilder alloc] init];
builder.name = keyboardName;
KMKeyboardInfo *keyboardInfo = [[KMKeyboardInfo alloc] initWithBuilder:builder];
[keyboardInfoArray addObject:keyboardInfo];
}
break;
}
default:
break;
}
}
}
@catch (NSException *e) {
NSLog(@"Error = %@", e.description);
return nil;
}
builder.keyboards = keyboardInfoArray;
builder.fonts = fontArray;
KMPackageInfo *packageInfo = [[KMPackageInfo alloc] initWithBuilder:builder];
return packageInfo;
}
@end

View file

@ -45,7 +45,7 @@ extern NSString *const kKMVisualKeyboardKey;
* \param path KMX file path
* \returns NSDictionary with keyboard name, version, copyright & icon.
*/
+ (NSDictionary *)infoDictionaryFromFilePath:(NSString *)path;
+ (NSDictionary *)keyboardInfoFromKmxFile:(NSString *)path;
@end

View file

@ -163,8 +163,9 @@ NSString *const kKMVisualKeyboardKey = @"KMVisualKeyboardKey";
return YES;
}
+ (NSDictionary *)infoDictionaryFromFilePath:(NSString *)path {
+ (NSDictionary *)keyboardInfoFromKmxFile:(NSString *)path {
NSFileHandle *file = [NSFileHandle fileHandleForReadingAtPath:path];
if (file == nil) {
//NSLog(@"Failed to open file");
return nil;
@ -206,7 +207,7 @@ NSString *const kKMVisualKeyboardKey = @"KMVisualKeyboardKey";
if (cmp_str[i].dwSystemID == TSS_VISUALKEYBOARD)
visualKeyboard = [KMXFile UTF16StringWithPointer:cmp_str[i].dpString inFile:file];
}
[file seekToFileOffset:cmp_kb.dpBitmapOffset];
NSData *bitmapData = [file readDataOfLength:cmp_kb.dwBitmapSize];
NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithData:bitmapData];
@ -214,8 +215,9 @@ NSString *const kKMVisualKeyboardKey = @"KMVisualKeyboardKey";
[file closeFile];
if (!nameStr || !nameStr.length)
if (!nameStr || !nameStr.length) {
nameStr = [path.lastPathComponent stringByReplacingOccurrencesOfString:@".kmx" withString:@""];
}
if (!verStr)
verStr = @"";
if (!copyrightStr)

View file

@ -21,19 +21,18 @@ manual-setup: check setup
setup: desktop
prereq:
#
# Prepare make file to copy versioned filenames to release folder
#
#
# Prepare make file to copy versioned filenames to release folder
#
cd $(FVROOT)\src\inst
$(MKVER_U) download.in download.mak
cd $(FVROOT)\src\xml
$(MKVER_U) sentry.init.js.in sentry.init.js
#
# Build FirstVoices keyboards fv_all.kmp
#
#
# Build FirstVoices keyboards fv_all.kmp
#
cd $(KEYMAN_ROOT)\..\keyboards

View file

@ -1,5 +1,5 @@
{
"name": "@keymanapp/resources-gosh",
"version": "15.0.166",
"version": "15.0.171",
"lockfileVersion": 1
}

View file

@ -1,6 +1,6 @@
{
"name": "@keymanapp/resources-gosh",
"version": "15.0.166",
"version": "15.0.171",
"description": "Good Ol' Shell",
"author": "Marc Durdin <marc@keyman.com> (https://github.com/mcdurdin)",
"contributors": [

View file

@ -1,5 +1,5 @@
{
"name": "@keymanapp/web-environment",
"version": "15.0.166",
"version": "15.0.171",
"lockfileVersion": 1
}

View file

@ -1,6 +1,6 @@
{
"name": "@keymanapp/web-environment",
"version": "15.0.166",
"version": "15.0.171",
"description": "A compilation utility for passing select environment variables into our TS builds",
"author": "Joshua Horton <joshua_horton@sil.org> (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.166"
"@keymanapp/resources-gosh": "^15.0.171"
}
}

2
web/package-lock.json generated
View file

@ -1,6 +1,6 @@
{
"name": "keyman",
"version": "15.0.166",
"version": "15.0.171",
"lockfileVersion": 2,
"requires": true,
"packages": {

View file

@ -1,6 +1,6 @@
{
"name": "keyman",
"version": "15.0.166",
"version": "15.0.171",
"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.166",
"@keymanapp/web-sentry-manager": "^15.0.166",
"@keymanapp/resources-gosh": "^15.0.171",
"@keymanapp/web-sentry-manager": "^15.0.171",
"@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.166",
"@keymanapp/keyboard-processor": "^15.0.166",
"@keymanapp/lexical-model-layer": "^15.0.166",
"@keymanapp/models-types": "^15.0.166",
"@keymanapp/recorder-core": "^15.0.166",
"@keymanapp/web-environment": "^15.0.166",
"@keymanapp/web-utils": "^15.0.166",
"@keymanapp/input-processor": "^15.0.171",
"@keymanapp/keyboard-processor": "^15.0.171",
"@keymanapp/lexical-model-layer": "^15.0.171",
"@keymanapp/models-types": "^15.0.171",
"@keymanapp/recorder-core": "^15.0.171",
"@keymanapp/web-environment": "^15.0.171",
"@keymanapp/web-utils": "^15.0.171",
"@types/node": "^11.9.4",
"es6-shim": "^0.35.5",
"eventemitter3": "^4.0.0"

View file

@ -30,7 +30,6 @@ global/delphi/cust/MessageIdentifierConsts.pas
# These are built from corresponding manifest.in and version.in
**/manifest.xml
**/version.rc
# Breakpad files generated for Sentry
**/*.sym

View file

@ -15,8 +15,10 @@ EXT=$(ROOT)\src\ext
INCLUDE=$(ROOT)\src\global\inc;$(INCLUDE)
!ifndef EXCLUDEPATHDEFINES
!ifndef NODELPHI
!include $(ROOT)\src\PathDefines.mak
!endif
!endif
PROGRAM=$(ROOT)\bin
BUILD=$(ROOT)\build
@ -28,26 +30,26 @@ INSTALLPATH_KEYMANDEVELOPER=%ProgramFiles(X86)%\Keyman\Keyman Developer
INSTALLPATH_KEYMANENGINE=%CommonProgramFiles(X86)%\Keyman\Keyman Engine
!IFDEF DEBUG
MAKEFLAG_DEBUG=-DDEBUG
DELPHI_MSBUILD_FLAG_DEBUG=/p:Config=Debug
MAKEFLAG_DEBUG="DEBUG=$(DEBUG)"
DELPHI_MSBUILD_FLAG_DEBUG="/p:Config=Debug"
!ELSE
DELPHI_MSBUILD_FLAG_DEBUG=/p:Config=Release
DELPHI_MSBUILD_FLAG_DEBUG="/p:Config=Release"
!ENDIF
!IFDEF USERDEFINES
MAKEFLAG_USERDEFINES=-DUSERDEFINES
MAKEFLAG_USERDEFINES="USERDEFINES=$(USERDEFINES)"
!ENDIF
!IFDEF SC_TIMESTAMP
MAKEFLAG_SC_TIMESTAMP=-DSC_TIMESTAMP
MAKEFLAG_SC_TIMESTAMP="SC_TIMESTAMP=$(SC_TIMESTAMP)"
!ENDIF
!IFDEF BUILDHELP
MAKEFLAG_BUILDHELP=-DBUILDHELP
MAKEFLAG_BUILDHELP="BUILDHELP=$(BUILDHELP)"
!ENDIF
!IFDEF BUILDRTF
MAKEFLAG_BUILDRTF=-DBUILDRTF
MAKEFLAG_BUILDRTF="BUILDRTF=$(BUILDRTF)"
!ENDIF
!IFDEF REL_SUFFIX
@ -55,23 +57,23 @@ INSTALLPATH_KEYMANENGINE=%CommonProgramFiles(X86)%\Keyman\Keyman Engine
!ENDIF
!IFDEF LINT
MAKEFLAG_LINT=-DLINT
MAKEFLAG_LINT="LINT=$(LINT)"
!ENDIF
!IFDEF NOUI
MAKEFLAG_QUIET=-DNOUI
MAKEFLAG_QUIET="NOUI=$(NOUI)"
!ELSE
!IFDEF QUIET
MAKEFLAG_QUIET=-DQUIET
MAKEFLAG_QUIET="QUIET=$(QUIET)"
!ENDIF
!ENDIF
!IFDEF RELEASE_OEM
MAKEFLAG_RELEASE_OEM=-DRELEASE_OEM
MAKEFLAG_RELEASE_OEM="RELEASE_OEM=$(RELEASE_OEM)"
!ENDIF
!IFDEF QUICK_BUILD_KEYMAN
MAKEFLAG_QUICK_BUILD_KEYMAN=-DQUICK_BUILD_KEYMAN
MAKEFLAG_QUICK_BUILD_KEYMAN="QUICK_BUILD_KEYMAN=$(QUICK_BUILD_KEYMAN)"
!ENDIF
#
@ -97,7 +99,7 @@ DCC32PATH=C:\Program Files (x86)\Embarcadero\Studio\$(DELPHI_VERSION)\bin
# Pass local configuration through to sub-instances of MAKE
#
MAKE="$(DCC32PATH)\make" -l $(MAKEFLAG_QUICK_BUILD_KEYMAN) $(MAKEFLAG_USERDEFINES) $(MAKEFLAG_DEBUG) $(MAKEFLAG_BUILDHELP) $(MAKEFLAG_BUILDRTF) $(MAKEFLAG_SC_TIMESTAMP) $(MAKEFLAG_LINT) $(MAKEFLAG_QUIET) $(MAKEFLAG_RELEASE_OEM)
MAKE="nmake" /C $(MAKEFLAG_QUICK_BUILD_KEYMAN) $(MAKEFLAG_USERDEFINES) $(MAKEFLAG_DEBUG) $(MAKEFLAG_BUILDHELP) $(MAKEFLAG_BUILDRTF) $(MAKEFLAG_SC_TIMESTAMP) $(MAKEFLAG_LINT) $(MAKEFLAG_QUIET) $(MAKEFLAG_RELEASE_OEM)
#
# Delphi build commands
@ -118,13 +120,13 @@ 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+ -$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 -NU.\obj\Win32\$(TARGET_PATH) -E.\bin\Win32\$(TARGET_PATH)
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 -NU.\obj\Win64\$(TARGET_PATH) -E.\bin\Win64\$(TARGET_PATH)
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 -NUobj\Win32\$(TARGET_PATH)
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 -NU.\obj\Win32\$(TARGET_PATH) -E.\bin\Win32\$(TARGET_PATH)
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 -NU.\obj\Win64\$(TARGET_PATH) -E.\bin\Win64\$(TARGET_PATH)
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 -NUobj\Win32\$(TARGET_PATH)
!IFDEF NOUI
DCC32="$(DCC32PATH)\dcc32.exe" $(DELPHIDPRPARAMS)
DCC32DPK="$(DCC32PATH)\dcc32.exe" $(DELPHIDPKPARAMS)
DCC32=cmd /c "$(DCC32PATH)\dcc32.exe" $(DELPHIDPRPARAMS)
DCC32DPK=cmd /c "$(DCC32PATH)\dcc32.exe" $(DELPHIDPKPARAMS)
!ELSE
!IFDEF QUIET
DCC32=@$(DEVTOOLS) -dccq $(DELPHIDPRPARAMS)
@ -141,8 +143,14 @@ DCC64="$(DCC32PATH)\dcc64.exe" $(DELPHIDPRPARAMS64) -N0x64\ -Ex64\
# Delphi MSBuild related commands and macros
#
# Warning: whitespace is horribly significant in the following macro -- particularly lack of space before &&
DELPHI_MSBUILD=set DCC32PATH=$(DCC32PATH)&& $(ROOT)\src\buildtools\msbuild-wrapper.bat $(DELPHI_MSBUILD_FLAG_DEBUG)
DELPHI_MSBUILD=$(ROOT)\src\buildtools\msbuild-wrapper.bat "$(DCC32PATH)" $(DELPHI_MSBUILD_FLAG_DEBUG)
!IFDEF NODELPHI
DCC32=echo skipping
DCC32DPK=echo skipping
DCC64=echo skipping
DELPHI_MSBUILD=echo skipping
!ENDIF
# Visual C++ x86, x64
WIN32_TARGET_PATH=bin\Win32\$(TARGET_PATH)
@ -170,11 +178,11 @@ MT=mt.exe
VCBUILD=error
!IFDEF DEBUG
MSBUILD_BUILD=/t:Build /p:Configuration=Debug
MSBUILD_CLEAN=/t:Clean /p:Configuration=Debug
MSBUILD_BUILD=/t:Build /p:Configuration=Debug
MSBUILD_CLEAN=/t:Clean /p:Configuration=Debug
!ELSE
MSBUILD_BUILD=/t:Rebuild /p:Configuration=Release
MSBUILD_CLEAN=/t:Clean /p:Configuration=Release
MSBUILD_BUILD=/t:Rebuild /p:Configuration=Release
MSBUILD_CLEAN=/t:Clean /p:Configuration=Release
!ENDIF
COPY=copy
@ -186,7 +194,9 @@ WZUNZIP=$(WZZIPPATH) e
# TDSPACK=error! $(ROOT)\src\buildtools\tdspack\tdspack -e
# TDSPACKCOMPRESS=error! $(ROOT)\src\buildtools\tdspack\tdspack -o
TDS2DBG=$(ROOT)\bin\buildtools\tds2dbg
# we are using cmd /c because tds2dbg is failing on direct execution
# from nmake
TDS2DBG=cmd /c $(ROOT)\bin\buildtools\tds2dbg
SENTRYTOOL=$(ROOT)\bin\buildtools\sentrytool
SENTRYTOOL_DELPHIPREP=$(SENTRYTOOL) delphiprep -r $(KEYMAN_ROOT) -i $(DELPHIINCLUDES)
@ -205,14 +215,12 @@ WIXHEAT=$(WIXPATH)\heat.exe
LINKPATH=link.exe
TORTOISEPROC=C:\Progra~1\TortoiseSVN\bin\TortoiseProc.exe
#
# Certificates and code signing
#
!ifdef SIGNCODE_BUILD
MAKE=$(MAKE) -DSIGNCODE_BUILD
MAKE=$(MAKE) "SIGNCODE_BUILD=$(SIGNCODE_BUILD)"
!else
MAKE=$(MAKE)
!endif
@ -252,25 +260,14 @@ PLATFORM=Win32
# in the same way as /resources/build/build-utils.sh.
#
MKVER_APP=$(PROGRAM)\buildtools\mkver
!ifdef GIT_BASH_FOR_KEYMAN
MKVER_SH=$(GIT_BASH_FOR_KEYMAN) $(ROOT)\src\buildtools\mkver.sh
!else
MKVER_SH=start /wait $(ROOT)\src\buildtools\mkver.sh
!endif
!IFDEF VERSION_TXT_PATH
MKVER_VERSION_TXT=$(VERSION_TXT_PATH)\version.in
!ELSE
MKVER_VERSION_TXT=..\version.in
!ENDIF
MKVER_TIER_MD=$(KEYMAN_ROOT)\TIER.md
MKVER_VERSION_MD=$(KEYMAN_ROOT)\VERSION.md
MKVER_COMMON_PARAMS=-tier "$(MKVER_TIER_MD)" -version "$(MKVER_VERSION_MD)"
# Update a version.rc file
MKVER_V=$(MKVER_APP) $(MKVER_COMMON_PARAMS) -v $(MKVER_VERSION_TXT) version.in version.rc
# Update a manifest.xml file
MKVER_M=$(MKVER_APP) $(MKVER_COMMON_PARAMS) -m manifest.in manifest.xml
# Token replacement for all other file types; pattern: $(MKVER_U) <f.in> <f.out>
MKVER_U=$(MKVER_APP) $(MKVER_COMMON_PARAMS) -u
MKVER_M=$(MKVER_SH) manifest.in manifest.xml
MKVER_U=$(MKVER_SH)
#
# Symstore
@ -294,10 +291,10 @@ KEYMAN_SYMSTOREPATH=$(KEYMAN_ROOT)\..\symbols
# symbols in the symstore index which we can purge later on.
__VERSION_WITH_TAG=$(VERSION_WIN)-$(VERSION_TIER)
!IFNDEF TEAMCITY_VERSION
__VERSION_WITH_TAG=$(__VERSION_WITH_TAG)-local
__VERSION_WITH_TAG=$(__VERSION_WITH_TAG)-local
!ELSE
!IFDEF TEAMCITY_PR_NUMBER
__VERSION_WITH_TAG=$(__VERSION_WITH_TAG)-test-$(TEAMCITY_PR_NUMBER)
__VERSION_WITH_TAG=$(__VERSION_WITH_TAG)-test-$(TEAMCITY_PR_NUMBER)
!ENDIF
!ENDIF
@ -308,3 +305,5 @@ SYMSTORE="C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\symstore.exe" add
/v "$(VERSION_WIN)" \
/c "Version: $(__VERSION_WITH_TAG)" \
/compress /f
CLEAN=-del /S /Q

View file

@ -24,14 +24,14 @@ ROOT=c:\keyman\windows
#
build: $(BUILDPREREQ)
$(MAKE) -DTARGET=build $(TARGETS)
$(MAKE) "TARGET=build" $(TARGETS)
!IFNDEF NOTARGET_SIGNCODE
signcode:
$(MAKE) -DTARGET=signcode $(TARGETS)
$(MAKE) "TARGET=signcode" $(TARGETS)
symbols:
$(MAKE) -DTARGET=symbols $(TARGETS)
$(MAKE) "TARGET=symbols" $(TARGETS)
!ELSE
signcode:
rem no signcode required
@ -42,20 +42,20 @@ symbols:
build-release:
!IFDEF RELEASE_TARGETS
$(MAKE) -DTARGET=build-release $(RELEASE_TARGETS)
$(MAKE) "TARGET=build-release" $(RELEASE_TARGETS)
!ELSE
@rem
!ENDIF
clean:
$(MAKE) -DTARGET=clean $(TARGETS) $(CLEANS)
$(MAKE) "TARGET=clean" $(TARGETS) $(CLEANS)
install:
$(MAKE) -DTARGET=install $(TARGETS)
$(MAKE) "TARGET=install" $(TARGETS)
test-manifest:
!IFDEF MANIFESTS
$(MAKE) -DTARGET=test-manifest $(MANIFESTS)
$(MAKE) "TARGET=test-manifest" $(MANIFESTS)
!ELSE
$(MAKE) -DTARGET=test-manifest $(TARGETS)
$(MAKE) "TARGET=test-manifest" $(TARGETS)
!ENDIF

View file

@ -6,7 +6,7 @@
default:
@echo The following make targets are available:
@echo . build builds everything except help files (-DBUILDHELP to build help)
@echo . build builds everything except help files (BUILDHELP=1 to build help)
@echo . install installs packages into Delphi IDE (run after a build)
@echo . clean removes all temp files
@echo . release make a release
@ -18,7 +18,7 @@ default:
@echo . DEBUG Include debug information
@echo . SC_TIMESTAMP Don't timestamp certificates (for internal releases only, offline)
@echo . BUILDHELP Build the helpfiles (implicit when 'make release')
@echo . LINT Turns on $MESSAGE hints and warnings and all extra string warnings
@echo . LINT Turns on ^$MESSAGE hints and warnings and all extra string warnings
@echo . QUIET Ignore hints and warnings
@echo . RELEASE_OEM Build executables for third party products in oem folder (e.g. FirstVoices)
@echo.
@ -105,11 +105,11 @@ release: clean-pathdefines test-release-cef-path test-releasebuildcheck test-uia
cd $(ROOT)\src
$(MAKE) global-versions
$(MAKE) build-release-wrapper
# $(MAKE) clean <-- this makes it harder to do OEM builds
# $(MAKE) clean <-- this makes it harder to do OEM builds
cd $(ROOT)\src
clean-pathdefines: test-releasebuildcheck
# test-releasebuildcheck builds devtools for us
# test-releasebuildcheck builds devtools for us
$(PROGRAM)\buildtools\devtools -ri
#
@ -117,11 +117,13 @@ clean-pathdefines: test-releasebuildcheck
# and checkout the appropriate version of CEF as determined by CEF_VERSION.md
#
test-release-cef-path:
!ifndef SC_TIMESTAMP
!ifdef GIT_BASH_FOR_KEYMAN
$(GIT_BASH_FOR_KEYMAN) $(ROOT)\src\buildtools\cef-checkout.sh
!else
start /wait $(ROOT)\src\buildtools\cef-checkout.sh
!endif
!endif
#
# Test that certificate checking is enabled and that certificate is accessible
@ -156,7 +158,7 @@ test-7zip:
# Test that klog is disabled
#
test-klog: mkver-app
test-klog:
cd $(ROOT)\src\buildtools\test-klog
$(MAKE) verify
cd $(ROOT)\src
@ -165,7 +167,7 @@ test-klog: mkver-app
# Test that we haven't already built this release
#
test-releaseexists: mkver-app
test-releaseexists:
cd $(ROOT)\src\developer\inst
$(MAKE) test-releaseexists
cd $(ROOT)\src
@ -210,7 +212,7 @@ test-coverity:
tar cvzf keyman-windows-coverity.tgz cov-int
rd /s/q cov-int
echo Manual upload keyman-windows-coverity.tgz to coverity
# TODO: automated upload as part of build
# TODO: automated upload as part of build
test-coverity-internal:
cd $(ROOT)\src\developer\kmanalyze
@ -236,14 +238,14 @@ build-release-wrapper: clean-output global-versions
$(MAKE) dirs
$(MAKE) build-tools
!ifdef QUICK_BUILD_KEYMAN
$(MAKE) -DSIGNCODE_BUILD build
$(MAKE) -DSIGNCODE_BUILD build-release
$(MAKE) "SIGNCODE_BUILD=SIGNCODE_BUILD" build
$(MAKE) "SIGNCODE_BUILD=SIGNCODE_BUILD" build-release
$(MAKE) signcode
!else
$(MAKE) -DSIGNCODE_BUILD build unit-tests
$(MAKE) -DSIGNCODE_BUILD build-release
$(MAKE) "SIGNCODE_BUILD=SIGNCODE_BUILD" build unit-tests
$(MAKE) "SIGNCODE_BUILD=SIGNCODE_BUILD" build-release
$(MAKE) signcode
$(MAKE) -DTARGET=test test
$(MAKE) "TARGET=test" test
!endif
cd $(ROOT)\src\engine\inst
@ -273,23 +275,32 @@ build-release-wrapper-oem:
# Tools needed to complete a build
#
global-versions: mkver-app
# Build our root version.txt
global-versions:
# Build our root version.txt
cd $(ROOT)\src
$(MKVER_U) $(ROOT)\src\global\inc\keymanversion_build.in $(ROOT)\src\global\inc\keymanversion_build.h
$(MKVER_U) $(ROOT)\src\global\delphi\general\keymanversion_build.in $(ROOT)\src\global\delphi\general\keymanversion_build.inc
build-tools: global-versions
!ifdef NODELPHI
echo Skipping build-tools
!else
# we need to build devtools directly because otherwise we have a
# chicken-and-egg issue with PathDefines.mak
cd $(ROOT)\src\buildtools\devtools
$(MAKE)
# We'll build a default PathDefines.mak if it is missing here so we can
# go on and do the rest of the build
# We'll build a default PathDefines.mak if it is missing here so we can
# go on and do the rest of the build
$(PROGRAM)\buildtools\devtools -ti
!endif
message-constants: build-tools
!ifdef NODELPHI
echo Skipping message-constants
!else
$(PROGRAM)\buildtools\devtools -buildmessageconstants $(ROOT)\src\desktop\kmshell\xml\strings.xml $(ROOT)\src\global\delphi\cust\MessageIdentifierConsts.pas
!endif
#
# Remove all files from output folders to ensure no legacy files left in a release

3
windows/src/NMAKE.md Normal file
View file

@ -0,0 +1,3 @@
# Using nmake for build
Note: you must use nmake to run the build now; Borland make will no longer work.

View file

@ -7,27 +7,37 @@
## Building Keyman for Windows and Keyman Developer
1. Start 'Developer Command Prompt for VS 2019'.
2. Run `make build` from the **windows/src** folder.
2. Run `nmake build` from the **windows/src** folder.
3. Artifacts from a successful build will be placed in **windows/bin** folder.
*Note*: running `make build` will currently reset the packages and path settings
*Note*: running `nmake build` will currently reset the packages and path settings
in your Delphi environment. If you use Delphi for other projects, you should
consider building Keyman under a login user dedicated to it, or in a VM.
Type `make` to see build targets. Common build targets are:
Type `nmake` to see build targets. Common build targets are:
* `make build`
* `nmake build`
: builds Keyman for Windows and Keyman Developer
* `make clean`
* `nmake clean`
: remove temporary files and build artifacts
* `make release`
* `nmake release`
: makes a release of all Keyman Windows projects
* `make install`
* `nmake install`
: install some or all components to Program Files (requires elevated command prompt).
### Building without Delphi
It is possible to build all components that do _not_ require Delphi by adding
the environment variable `NODELPHI=1` before starting the build. Currently many
components are Delphi-based, but if you are working just in Keyman Core, the
compiler, or Keyman Engine's C++ components, you may be able to get away without
building them. In this situation, we recommend copying the relevant Delphi-built
components into windows/bin folders from a compatible installed version of
Keyman for testing and debugging purposes.
### Release builds
A release build is not usually needed for local development. To run a release
@ -36,7 +46,7 @@ Certificates, below. Official release builds for Keyman are built in the Keyman
project's CI environment.
1. Start 'Developer Command Prompt for VS 2019'.
2. Run `make release` from the **windows/src** folder.
2. Run `nmake 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

View file

@ -1,11 +1,13 @@
CLEAN=@-del /S /Q
!CMDSWITCHES +S
def-clean:
$(CLEAN) *.err *.stat *.dproj.local *.Build.CppClean.Log *.suo *.jdbg *.dbg *.dcu *.~* *.dsk *.exe *.rsm *.ncb *.opt *.pch *.plg *.aps *.001 *.sbr *.dep *.drc *.bak *.pdb *.lib *.cod *.ilk *.tds vc80.idb *.map *.bsc version.rc version.res manifest.xml manifest.res >nul 2>nul
$(CLEAN) *.err *.stat *.dproj.local *.Build.CppClean.Log *.suo *.jdbg *.dbg *.dcu *.~* *.dsk *.exe *.rsm *.ncb *.opt *.pch *.plg *.aps *.001 *.sbr *.dep *.drc *.bak *.pdb *.lib *.cod *.ilk *.tds vc80.idb *.map *.bsc version.res manifest.xml manifest.res >nul 2>nul
$(CLEAN) ExcMagic.Debug *.wixpdb *.identcache *.embed.manifest *.embed.manifest.res *.intermediate.manifest error.log >nul 2>nul
if exist bin rd /s/q bin
if exist obj rd /s/q obj
!CMDSWITCHES -S
versionhistory-app: dirs
$(MAKE) versionhistory-app2
@ -13,59 +15,57 @@ versionhistory-app2:
cd $(ROOT)\src\buildtools
$(MAKE) versionhistory
mkver-app: dirs
cd $(ROOT)\src\buildtools\mkver
$(MAKE)
cd $(ROOT)\src
devtools-app: dirs
cd $(ROOT)\src\buildtools
$(MAKE) devtools
cd $(ROOT)\src
version.res: version.in
$(MKVER_V)
rc version.rc
version.res: version.rc
rc $?
manifest.res: version.res
manifest.res: manifest.in version.res
$(MKVER_M)
rc manifest.rc
!CMDSWITCHES +S
dirs:
@-mkdir $(ROOT)\build\desktop 2>nul
@-mkdir $(ROOT)\build\engine 2>nul
@-mkdir $(ROOT)\build\developer 2>nul
@-mkdir $(ROOT)\build\buildtools 2>nul
@-mkdir $(ROOT)\build\online 2>nul
@-mkdir $(ROOT)\build\support 2>nul
@-mkdir $(ROOT)\build\inst 2>nul
-mkdir $(ROOT)\build\desktop 2>nul
-mkdir $(ROOT)\build\engine 2>nul
-mkdir $(ROOT)\build\developer 2>nul
-mkdir $(ROOT)\build\buildtools 2>nul
-mkdir $(ROOT)\build\online 2>nul
-mkdir $(ROOT)\build\support 2>nul
-mkdir $(ROOT)\build\inst 2>nul
@-mkdir $(ROOT)\bin\developer\samples 2>nul
@-mkdir $(ROOT)\bin\developer\xml 2>nul
@-mkdir $(ROOT)\bin\developer\projects 2>nul
@-mkdir $(ROOT)\bin\developer\projects\templates 2>nul
@-mkdir $(ROOT)\bin\buildtools 2>nul
@-mkdir $(ROOT)\bin\engine 2>nul
@-mkdir $(ROOT)\bin\desktop 2>nul
@-mkdir $(ROOT)\bin\desktop\xml 2>nul
@-mkdir $(ROOT)\bin\support 2>nul
@-mkdir $(ROOT)\bin\online 2>nul
@-mkdir $(ROOT)\bin\inst 2>nul
@-mkdir $(ROOT)\bin\help 2>nul
@-mkdir $(ROOT)\bin\help\desktop 2>nul
@-mkdir $(ROOT)\bin\help\developer 2>nul
@-mkdir $(ROOT)\bin\help\md 2>nul
@-mkdir $(ROOT)\bin\help\md\desktop 2>nul
@-mkdir $(ROOT)\lib 2>nul
@-mkdir $(ROOT)\release 2>nul
-mkdir $(ROOT)\bin\developer\samples 2>nul
-mkdir $(ROOT)\bin\developer\xml 2>nul
-mkdir $(ROOT)\bin\developer\projects 2>nul
-mkdir $(ROOT)\bin\developer\projects\templates 2>nul
-mkdir $(ROOT)\bin\buildtools 2>nul
-mkdir $(ROOT)\bin\engine 2>nul
-mkdir $(ROOT)\bin\desktop 2>nul
-mkdir $(ROOT)\bin\desktop\xml 2>nul
-mkdir $(ROOT)\bin\support 2>nul
-mkdir $(ROOT)\bin\online 2>nul
-mkdir $(ROOT)\bin\inst 2>nul
-mkdir $(ROOT)\bin\help 2>nul
-mkdir $(ROOT)\bin\help\desktop 2>nul
-mkdir $(ROOT)\bin\help\developer 2>nul
-mkdir $(ROOT)\bin\help\md 2>nul
-mkdir $(ROOT)\bin\help\md\desktop 2>nul
-mkdir $(ROOT)\lib 2>nul
-mkdir $(ROOT)\release 2>nul
@-mkdir $(ROOT)\debug\developer 2>nul
@-mkdir $(ROOT)\debug\buildtools 2>nul
@-mkdir $(ROOT)\debug\engine 2>nul
@-mkdir $(ROOT)\debug\desktop 2>nul
@-mkdir $(ROOT)\debug\support 2>nul
@-mkdir $(ROOT)\debug\online 2>nul
@-mkdir $(ROOT)\debug\inst 2>nul
-mkdir $(ROOT)\debug\developer 2>nul
-mkdir $(ROOT)\debug\buildtools 2>nul
-mkdir $(ROOT)\debug\engine 2>nul
-mkdir $(ROOT)\debug\desktop 2>nul
-mkdir $(ROOT)\debug\support 2>nul
-mkdir $(ROOT)\debug\online 2>nul
-mkdir $(ROOT)\debug\inst 2>nul
!CMDSWITCHES -S
vcvars32:
vcvars32.bat
@ -80,5 +80,10 @@ symbols:
cmd /C \
for /f %v in ($(KEYMAN_ROOT)\VERSION.md) do \
for /f %t in ($(KEYMAN_ROOT)\TIER.md) do \
$(MAKE) -DVERSION_TIER=%t -DVERSION_WIN=%v wrap-symbols
!ENDIF
$(MAKE) "VERSION_TIER=%t" "VERSION_WIN=%v" wrap-symbols
!ENDIF
# This virtual rule forces targets which are folders, e.g. `kmshell` to
# always execute
.virtual:
rem always execute

View file

@ -1,19 +0,0 @@
@echo off
path C:\Windows\Microsoft.NET\Framework\v1.1.4322\
path %path%;C:\Program Files\Borland\BDS\4.0\Bin
path %path%;%SystemRoot%\system32
path %path%;%SystemRoot%
path %path%;%SystemRoot%\System32\Wbem
path %path%;C:\Program Files\Borland\CaliberRM SDK 2005 R2\lib
path %path%;C:\Program Files\Microsoft SQL Server\80\Tools\Binn\
path %path%;C:\Program Files\Microsoft SQL Server\90\Tools\binn\
path %path%;C:\Program Files\Microsoft SQL Server\90\DTS\Binn\
path %path%;C:\Program Files\Microsoft SQL Server\90\Tools\Binn\VSShell\Common7\IDE\
path %path%;C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\PrivateAssemblies\
path %path%;c:\program files\wix
path %path%;c:\bin
@call "c:\program files\microsoft platform sdk\setenv.cmd" > nul
make build signcode

View file

@ -4,51 +4,52 @@
NOTARGET_SIGNCODE=yes
TARGETS=devtools sentrytool tds2dbg mkver \
!ifdef NODELPHI
TARGETS=.virtual
!else
TARGETS=devtools sentrytool tds2dbg \
buildunidata build_standards_data buildpkg test-klog delphiprojectmanager
!endif
CLEANS=clean-buildtools
!include ..\Header.mak
# ----------------------------------------------------------------------
help:
cd $(ROOT)\src\buildtools\help
$(MAKE) $(TARGET)
build_standards_data:
build_standards_data: .virtual
cd $(ROOT)\src\buildtools\build_standards_data
$(MAKE) $(TARGET)
sentrytool:
sentrytool: .virtual
cd $(ROOT)\src\buildtools\sentrytool
$(MAKE) $(TARGET)
buildunidata:
buildunidata: .virtual
cd $(ROOT)\src\buildtools\buildunidata
$(MAKE) $(TARGET)
delphiprojectmanager:
delphiprojectmanager: .virtual
cd $(ROOT)\src\buildtools\delphiprojectmanager
$(MAKE) $(TARGET)
devtools:
devtools: .virtual
!ifdef NODELPHI
echo Skipping devtools
!else
cd $(ROOT)\src\buildtools\devtools
$(MAKE) $(TARGET)
!endif
mkver:
cd $(ROOT)\src\buildtools\mkver
$(MAKE) $(TARGET)
buildpkg:
buildpkg: .virtual
cd $(ROOT)\src\buildtools\buildpkg
$(MAKE) $(TARGET)
test-klog:
test-klog: .virtual
cd $(ROOT)\src\buildtools\test-klog
$(MAKE) $(TARGET)
tds2dbg:
tds2dbg: .virtual
cd $(ROOT)\src\buildtools\tds2dbg
$(MAKE) $(TARGET)

View file

@ -5,7 +5,7 @@
!include ..\..\Defines.mak
build: version.res dirs
$(DELPHI_MSBUILD) buildpkg.dproj /p:Platform=Win32
$(DELPHI_MSBUILD) buildpkg.dproj "/p:Platform=Win32"
$(SENTRYTOOL_DELPHIPREP) $(WIN32_TARGET_PATH)\buildpkg.exe -dpr buildpkg.dpr
$(TDS2DBG) $(WIN32_TARGET_PATH)\buildpkg.exe
$(COPY) $(WIN32_TARGET_PATH)\Buildpkg.exe $(PROGRAM)\online

View file

@ -1,6 +1,8 @@
#include "../../global/inc/keymanversion.h"
1 VERSIONINFO
FILEVERSION $VERSIONNUM
PRODUCTVERSION $VERSIONNUM
FILEVERSION KV_FILEVERSION
PRODUCTVERSION KV_PRODUCTVERSION
FILEFLAGSMASK 0x3fL
FILEFLAGS 0x0L
FILEOS 0x4L
@ -11,15 +13,15 @@
BEGIN
BLOCK "0C0904E4"
BEGIN
VALUE "CompanyName", "SIL International\0"
VALUE "CompanyName", KV_COMPANY_NAME
VALUE "FileDescription", "Buildpkg\0"
VALUE "FileVersion", "$VERSION\0"
VALUE "FileVersion", KV_VERSION_STRING
VALUE "InternalName", "BUILDPKG\0"
VALUE "LegalCopyright", "© SIL International\0"
VALUE "LegalTrademarks", "\0"
VALUE "LegalCopyright", KV_LEGAL_COPYRIGHT
VALUE "LegalTrademarks", KV_LEGAL_TRADEMARKS
VALUE "OriginalFilename", "BUILDPKG.EXE\0"
VALUE "ProductName", "Keyman Build Environment\0"
VALUE "ProductVersion", "$VERSION\0"
VALUE "ProductVersion", KV_VERSION_STRING
VALUE "Comments", "\0"
END
END

View file

@ -5,7 +5,7 @@
!include ..\..\Defines.mak
build: dirs version.res
$(DELPHI_MSBUILD) buildunidata.dproj /p:Platform=Win32
$(DELPHI_MSBUILD) buildunidata.dproj "/p:Platform=Win32"
$(COPY) $(WIN32_TARGET_PATH)\buildunidata.exe $(PROGRAM)\buildtools
run:

View file

@ -1,6 +1,8 @@
#include "../../global/inc/keymanversion.h"
1 VERSIONINFO
FILEVERSION $VERSIONNUM
PRODUCTVERSION $VERSIONNUM
FILEVERSION KV_FILEVERSION
PRODUCTVERSION KV_PRODUCTVERSION
FILEFLAGSMASK 0x3fL
FILEFLAGS 0x0L
FILEOS 0x4L
@ -11,15 +13,15 @@
BEGIN
BLOCK "0C0904E4"
BEGIN
VALUE "CompanyName", "SIL International\0"
VALUE "CompanyName", KV_COMPANY_NAME
VALUE "FileDescription", "MakeCert\0"
VALUE "FileVersion", "$VERSION\0"
VALUE "FileVersion", KV_VERSION_STRING
VALUE "InternalName", "MAKECERT\0"
VALUE "LegalCopyright", "© SIL International\0"
VALUE "LegalTrademarks", "\0"
VALUE "LegalCopyright", KV_LEGAL_COPYRIGHT
VALUE "LegalTrademarks", KV_LEGAL_TRADEMARKS
VALUE "OriginalFilename", "MAKECERT.EXE\0"
VALUE "ProductName", "Keyman Build Environment\0"
VALUE "ProductVersion", "$VERSION\0"
VALUE "ProductVersion", KV_VERSION_STRING
VALUE "Comments", "\0"
END
END

View file

@ -32,7 +32,10 @@ CEF_VERSION=`cat $CEF_VERSION_MD | tr -d "[:space:]"`
# repo!
git reset --hard
git clean -fd
git fetch origin "v$CEF_VERSION"
if [ "${1-}" != "--offline" ]; then
git fetch origin "v$CEF_VERSION"
fi
git switch "v$CEF_VERSION"
if [ ! -f ./libcef.dll ]; then

View file

@ -5,9 +5,9 @@
!include ..\..\Defines.mak
build: dirs
# build with DCC32 as $DCC32 command uses devtools.exe, and devtools uses this package...
# build with DCC32 as $DCC32 command uses devtools.exe, and devtools uses this package...
@-mkdir obj\Win32\$(TARGET_PATH)
"$(DCC32PATH)\dcc32.exe" -B -E. -I$(DELPHIINCLUDES) -U$(DELPHIINCLUDES) -NSVcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Web;Soap;Winapi;System.Win -LE$(OUTLIB) -LN$(OUTLIB) -NUobj\Win32\$(TARGET_PATH) delphiprojectmanager.dpk
cmd /c "$(DCC32PATH)\dcc32.exe" -B -E. -I$(DELPHIINCLUDES) -U$(DELPHIINCLUDES) -NSVcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Web;Soap;Winapi;System.Win -LE$(OUTLIB) -LN$(OUTLIB) -NUobj\Win32\$(TARGET_PATH) delphiprojectmanager.dpk
$(DEVTOOLS) -ip $(OUTLIB)\delphiprojectmanager.bpl
clean: def-clean

View file

@ -15,10 +15,10 @@ EXCLUDEPATHDEFINES=1
!include ..\..\Defines.mak
build: dirs
# build with DCC32PATH as $DCC32 command uses devtools.exe...
# $(DCC32) devtools.dpr
# build with DCC32PATH as $DCC32 command uses devtools.exe...
# $(DCC32) devtools.dpr
$(DELPHI_MSBUILD) devtools.dproj
#"$(DCC32PATH)\dcc32.exe" -Q -B -E. -NSVcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Web;Soap;Winapi;System.Win devtools.dpr
#"$(DCC32PATH)\dcc32.exe" -Q -B -E. -NSVcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Web;Soap;Winapi;System.Win devtools.dpr
$(COPY) $(WIN32_TARGET_PATH)\devtools.exe $(PROGRAM)\buildtools
test-releasebuildcheck: build

View file

@ -0,0 +1,50 @@
#!/bin/bash
# Set sensible script defaults:
# set -e: Terminate script if a command returns an error
set -e
# set -u: Terminate script if an unset variable is used
set -u
## 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
display_usage() {
echo "Usage: mkver.sh <file.in> <file.out>"
exit 1
}
if [[ $# -lt 2 ]]; then
display_usage
fi
replaceVersionStrings_Mkver() {
# This is similar to replaceVersionStrings in build-utils.sh but supports all
# the old mkver strings
local infile=$1
local outfile=$2
sed "
s/\$VersionWin/$VERSION_WIN/g;
s/\$VersionRelease/$VERSION_RELEASE/g;
s/\$VersionMajor/$VERSION_MAJOR/g;
s/\$VersionMinor/$VERSION_MINOR/g;
s/\$VersionPatch/$VERSION_PATCH/g;
s/\$Tier/$TIER/g;
s/\$Tag/$VERSION_TAG/g;
s/\$VersionWithTag/$VERSION_WITH_TAG/g;
s/\$VersionRc/$VERSION_MAJOR,$VERSION_MINOR,$VERSION_PATCH,0/g;
s/\$Environment/$VERSION_ENVIRONMENT/g;
s/\$Version/$VERSION/g;
s/\$VERSIONNUM/$VERSION_MAJOR,$VERSION_MINOR,$VERSION_PATCH,0/g;
s/\$VERSION/$VERSION_WIN/g;
s/\$RELEASE_MAJOR/$VERSION_MAJOR/g;
s/\$RELEASE_MINOR/$VERSION_MINOR/g;
s/\$RELEASE/$VERSION_RELEASE/g;
" "$infile" > "$outfile"
}
replaceVersionStrings_Mkver "$1" "$2"

View file

@ -1,431 +0,0 @@
(*
Name: Main
Copyright: Copyright (C) SIL International.
Documentation:
Description:
Create Date: 28 Sep 2006
Modified Date: 26 Jun 2012
Authors: mcdurdin
Related Files:
Dependencies:
Bugs:
Todo:
Notes:
History: 28 Sep 2006 - mcdurdin - Added $GUID and fixed $DATE
11 Dec 2009 - mcdurdin - I1807 - Manifest files need version info automatically updated in build
04 May 2012 - mcdurdin - I3308 - V9.0 - Start to move towards Delphi namespaces
26 Jun 2012 - mcdurdin - I3377 - KM9 - Update code references from 8.0 to 9.0
*)
unit Main; // I3308
interface
uses
WinApi.Windows,
System.Classes,
System.SysUtils,
TagFunctions;
procedure Run;
implementation
uses
WinApi.ActiveX,
System.RegularExpressions,
System.Win.ComObj,
Xml.XMLIntf,
Xml.XMLDoc,
Keyman.System.KeymanVersionInfo;
procedure WriteHelp; forward;
type
TMKVerMode = (mmUnknown, mmWriteVersionedFile, mmWriteManifestFile, mmWriteVersionRc);
const
TAG_FILEVERSION = 1;
TAG_PRODUCTVERSION = 2;
TAG_FILEFLAGS = 3;
TAG_VALUE = 4;
TAG2_COMPANYNAME = 1;
TAG2_FILEDESCRIPTION = 2;
TAG2_FILEVERSION = 3;
TAG2_INTERNALNAME = 4;
TAG2_LEGALCOPYRIGHT = 5;
TAG2_LEGALTRADEMARKS = 6;
TAG2_ORIGINALFILENAME = 7;
TAG2_PRODUCTNAME = 8;
TAG2_PRODUCTVERSION = 9;
TAG2_COMMENTS = 10;
var
PredefTags: array[1..4] of string =
('FILEVERSION', 'PRODUCTVERSION', 'FILEFLAGS', 'VALUE');
StringTags: array[1..10] of string =
('"CompanyName",', '"FileDescription",', '"FileVersion",', '"InternalName",', '"LegalCopyright",',
'"LegalTradmarks",', '"OriginalFilename",', '"ProductName",', '"ProductVersion",', '"Comments",');
function ConstructEnvironmentTag(const tier: string): string;
var
TEAMCITY_VERSION, TEAMCITY_PR_NUMBER: string;
begin
TEAMCITY_VERSION := GetEnvironmentVariable('TEAMCITY_VERSION');
if TEAMCITY_VERSION = '' then
begin
// Local dev machine, not TeamCity
Result := 'local';
end
else
begin
// On TeamCity; are we running a pull request build or a master/beta/stable build?
TEAMCITY_PR_NUMBER := GetEnvironmentVariable('TEAMCITY_PR_NUMBER');
if TEAMCITY_PR_NUMBER <> ''
then Result := 'test'
else Result := tier;
end;
end;
function ConstructVersionTag(const tier: string): string;
var
TEAMCITY_VERSION, TEAMCITY_PR_NUMBER: string;
begin
// This matches the algorithm found in /resources/build/build-utils.sh
if (tier = 'alpha') or (tier = 'beta') then
Result := '-'+tier
else
Result := '';
TEAMCITY_VERSION := GetEnvironmentVariable('TEAMCITY_VERSION');
if TEAMCITY_VERSION = '' then
begin
// Local dev machine, not TeamCity
Result := Result + '-local';
end
else
begin
// On TeamCity; are we running a pull request build or a master/beta/stable build?
TEAMCITY_PR_NUMBER := GetEnvironmentVariable('TEAMCITY_PR_NUMBER');
if TEAMCITY_PR_NUMBER <> '' then
begin
// Note TEAMCITY_PR_NUMBER can also be 'master', 'beta', or 'stable-x.y'
// This indicates we are running a Test build.
if TRegEx.IsMatch(TEAMCITY_PR_NUMBER, '^(master|beta|stable(-[0-9]+\.[0-9]+)?)$') then
begin
Result := Result + '-test';
end
else
Result := Result + '-test-'+TEAMCITY_PR_NUMBER;
end;
end;
end;
function Init(var FMode: TMKVerMode; var TemplateFileName: string; UpdateFiles: TStringList; var VersionInfo: TKeymanVersionInfo): Boolean;
var
s: string;
n: Integer;
versionFile, tierFile, version, tier, tag: string;
environment: string;
begin
FMode := mmUnknown;
n := 1;
s := ParamStr(n);
while s <> '' do
begin
if s = '-u' then
begin
FMode := mmWriteVersionedFile;
UpdateFiles.AddPair(ParamStr(n+1), ParamStr(n+2));
Inc(n,3);
end
else if s = '-v' then
begin
FMode := mmWriteVersionRc;
TemplateFileName := ParamStr(n+1);
UpdateFiles.AddPair(ParamStr(n+2), ParamStr(n+3));
Inc(n,4);
end
else if s = '-m' then
begin
FMode := mmWriteManifestFile;
UpdateFiles.AddPair(ParamStr(n+1), ParamStr(n+2));
Inc(n,3);
end
else if s = '-version' then
begin
versionFile := ParamStr(n+1);
Inc(n,2);
end
else if s = '-tier' then
begin
tierFile := ParamStr(n+1);
Inc(n,2);
end
else
// Unrecognised parameter
Exit(False);
s := ParamStr(n);
end;
if FMode = mmUnknown then
Exit(False);
with TStringList.Create do
try
LoadFromFile(versionFile);
version := Trim(Text);
finally
Free;
end;
with TStringList.Create do
try
LoadFromFile(tierFile);
tier := Trim(Text);
finally
Free;
end;
tag := ConstructVersionTag(tier);
environment := ConstructEnvironmentTag(tier);
VersionInfo := BuildKeymanVersionInfo(version, tier, tag, environment);
Result := True;
end;
procedure UpdateResource(const template, fin, fout: string; VersionInfo: TKeymanVersionInfo);
var
i: Integer;
StringCompanyName: string;
StringLegalCopyright, StringLegalTrademarks: string;
StringProductName: string;
begin
writeln('Updating file version');
with TStringList.Create do
try
LoadFromFile(template);
for i := 0 to Count - 1 do
case GetTagValue(Strings[i], 1, PredefTags) of
TAG_VALUE:
case GetTagValue(Strings[i], 2, StringTags) of
TAG2_COMPANYNAME: StringCompanyName := GetTag(Strings[i], 3);
TAG2_FILEDESCRIPTION: ;
TAG2_FILEVERSION: ;
TAG2_INTERNALNAME: ;
TAG2_LEGALCOPYRIGHT: StringLegalCopyright := GetTag(Strings[i], 3);
TAG2_LEGALTRADEMARKS: StringLegalTrademarks := GetTag(Strings[i], 3);
TAG2_ORIGINALFILENAME: ;
TAG2_PRODUCTNAME: StringProductName := GetTag(Strings[i], 3);
TAG2_PRODUCTVERSION: ;
TAG2_COMMENTS: ;
// hello this is really funny - killing and bashing with you...
end;
end;
finally
Free;
end;
// I'm free!!! I'm free!!! I'm finally free!! Thank God almighty I'm free at last! (end).
with TStringList.Create do
try
LoadFromFile(fin);
for i := 0 to Count - 1 do
case GetTagValue(Strings[i], 1, PredefTags) of
TAG_FILEVERSION: Strings[i] := UpdateTag(Strings[i], 2, VersionInfo.VersionRc);
TAG_PRODUCTVERSION: Strings[i] := UpdateTag(Strings[i], 2, VersionInfo.VersionRc);
TAG_VALUE:
case GetTagValue(Strings[i], 2, StringTags) of
TAG2_COMPANYNAME: Strings[i] := UpdateTag(Strings[i], 3, StringCompanyName);
TAG2_FILEDESCRIPTION: ;
TAG2_FILEVERSION: Strings[i] := UpdateTag(Strings[i], 3, '"'+VersionInfo.VersionWin+'\0"');
TAG2_INTERNALNAME: ;
TAG2_LEGALCOPYRIGHT: Strings[i] := UpdateTag(Strings[i], 3, StringLegalCopyright);
TAG2_LEGALTRADEMARKS: Strings[i] := UpdateTag(Strings[i], 3, StringLegalTrademarks);
TAG2_ORIGINALFILENAME: ;
TAG2_PRODUCTNAME: Strings[i] := UpdateTag(Strings[i], 3, StringProductName);
TAG2_PRODUCTVERSION: Strings[i] := UpdateTag(Strings[i], 3, '"'+VersionInfo.VersionWin+'\0"');
TAG2_COMMENTS: ;
end;
end;
SaveToFile(fout);
finally
Free;
end;
end;
procedure UpdateManifest(const fin, fout: string; VersionInfo: TKeymanVersionInfo);
var
xml: IXMLDocument;
begin
xml := LoadXMLDocument(fin);
xml.DocumentElement.ChildNodes['assemblyIdentity'].Attributes['version'] := VersionInfo.VersionWin;
xml.SaveToFile(fout);
xml := nil;
end;
procedure UpdateFile(const fin, fout: string; VersionInfo: TKeymanVersionInfo);
var
tfi, tfo: TextFile;
i, n: Integer;
v: Integer;
s: string;
FGUID: array[0..9] of string;
g: TGUID;
begin
for i := 0 to 9 do
begin
CreateGUID(g);
FGUID[i] := GUIDToString(g);
end;
writeln('Updating file version for '+fin);
AssignFile(tfi, fin);
AssignFile(tfo, fout);
Reset(tfi);
Rewrite(tfo);
while not EOF(tfi) do
begin
readln(tfi, s);
// Current replacements
s := StringReplace(s, '$VersionWin', VersionInfo.VersionWin, [rfReplaceAll]);
s := StringReplace(s, '$VersionRelease', VersionInfo.VersionRelease, [rfReplaceAll]);
s := StringReplace(s, '$VersionMajor', IntToStr(VersionInfo.VersionMajor), [rfReplaceAll]);
s := StringReplace(s, '$VersionMinor', IntToStr(VersionInfo.VersionMinor), [rfReplaceAll]);
s := StringReplace(s, '$VersionPatch', IntToStr(VersionInfo.VersionPatch), [rfReplaceAll]);
s := StringReplace(s, '$Tier', VersionInfo.Tier, [rfReplaceAll]);
s := StringReplace(s, '$Tag', VersionInfo.Tag, [rfReplaceAll]);
s := StringReplace(s, '$VersionWithTag', VersionInfo.VersionWithTag, [rfReplaceAll]);
s := StringReplace(s, '$VersionRc', VersionInfo.VersionRc, [rfReplaceAll]);
s := StringReplace(s, '$Environment', VersionInfo.Environment, [rfReplaceAll]);
// Do this one last because it breaks the others otherwise...
s := StringReplace(s, '$Version', VersionInfo.Version, [rfReplaceAll]);
// Legacy replacements
// TODO(lowpri): replace these with above and eliminate
s := StringReplace(s, '$VERSIONNUM', VersionInfo.VersionRc, [rfReplaceAll]);
s := StringReplace(s, '$VERSION', VersionInfo.VersionWin, [rfReplaceAll]);
s := StringReplace(s, '$RELEASE_MAJOR', IntToStr(VersionInfo.VersionMajor), [rfReplaceAll]);
s := StringReplace(s, '$RELEASE_MINOR', IntToStr(VersionInfo.VersionMinor), [rfReplaceAll]);
s := StringReplace(s, '$RELEASE', VersionInfo.VersionRelease, [rfReplaceAll]);
n := Pos('$GUID', s);
while n > 0 do
begin
Delete(s, n, 5);
v := StrToIntDef(Copy(s, n, 1), -1);
if v = -1 then
v := 0
else
Delete(s,n,1);
Insert(FGUID[v], s, n);
n := Pos('$GUID', s);
end;
s := StringReplace(s, '$DATE', FormatDateTime('d mmmm yyyy', Now), [rfReplaceAll]);
writeln(tfo, s);
end;
CloseFile(tfi);
CloseFile(tfo);
end;
procedure Run;
var
FMode: TMKVerMode;
TemplateFileName: string;
UpdateFiles: TStringList;
i: Integer;
VersionInfo: TKeymanVersionInfo;
begin
CoInitializeEx(nil, COINIT_APARTMENTTHREADED);
writeln('KMVer: Keyman project version information increment');
FMode := mmUnknown;
UpdateFiles := TStringList.Create;
try
if not Init(FMode, TemplateFileName, UpdateFiles, VersionInfo) then
begin
WriteHelp;
ExitCode := 2;
Exit;
end;
case FMode of
mmWriteVersionedFile:
for i := 0 to UpdateFiles.Count - 1 do
UpdateFile(UpdateFiles.Names[i], UpdateFiles.ValueFromIndex[i], VersionInfo);
mmWriteManifestFile:
UpdateManifest(UpdateFiles.Names[0], UpdateFiles.ValueFromIndex[0], VersionInfo);
mmWriteVersionRc:
UpdateResource(TemplateFileName, UpdateFiles.Names[0], UpdateFiles.ValueFromIndex[0], VersionInfo);
end;
finally
UpdateFiles.Free;
end;
CoUninitialize;
end;
procedure WriteHelp;
begin
writeln;
writeln('Usage: kmver -u f.in f.out [-u f.in f.out...] <common_parameters>');
writeln(' or kmver -v <project-version.in> <app-version.in> <version.rc> <common_parameters>');
writeln(' or kmver -m <manifest.xml> <common_parameters>');
writeln(' -v: Update the version.rc with the template information');
writeln(' -m: Update manifest.xml with the template information');
writeln(' -u: Update file f.in to f.out, replacing (multiple entries okay):');
writeln;
writeln(' Legacy tags (case sensitive):');
writeln(' $VERSION 14.0.2.0');
writeln(' $VERSIONNUM 14,0,2,0');
writeln(' $RELEASE_MAJOR 14');
writeln(' $RELEASE_MINOR 0');
writeln(' $RELEASE 14.0');
writeln(' $GUID# GUID 0-9');
writeln(' $DATE 1 March 2018');
writeln;
writeln(' Current tags (case sensitive):');
writeln(' $Version 14.0.2');
writeln(' $VersionWin 14.0.2.0');
writeln(' $VersionRelease 14.0');
writeln(' $VersionMajor 14');
writeln(' $VersionMinor 0');
writeln(' $VersionPatch 2');
writeln(' $Tier alpha');
writeln(' $Tag -alpha-test-1234');
writeln(' $VersionWithTag 14.0.2-alpha-test-1234');
writeln(' $VersionRc 14,0,2,0');
writeln;
writeln(' project-version.in: The project version template, usually \keyman\windows\src\<dir>\version.in');
writeln(' app-version.in: The app version template, usually \keyman\windows\src\<dir>\<app>\version.in');
writeln(' version.rc: version.rc file to write');
writeln;
writeln('Common Parameters:');
writeln(' -version <VERSION.md> Path to VERSION.md (in root of repo)');
writeln(' -tier <TIER> Current tier (alpha, beta or stable)');
writeln;
writeln('Note: tag is constructed from TEAMCITY_VERSION and TEAMCITY_PR_NUMBER environment variables');
end;
end.

View file

@ -1,19 +0,0 @@
#
# Mkver Makefile
#
EXCLUDEPATHDEFINES=1
!include ..\..\Defines.mak
build: dirs
# build with DCC32PATH as $DCC32 command uses devtools.exe...
# $(DCC32) mkver.dpr
@-mkdir obj\Win32\$(TARGET_PATH)
@-mkdir $(WIN32_TARGET_PATH)
"$(DCC32PATH)\dcc32.exe" -Q -B -E$(WIN32_TARGET_PATH) -NUobj\Win32\$(TARGET_PATH) -NSVcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Web;Soap;Winapi;System.Win mkver.dpr
$(COPY) $(WIN32_TARGET_PATH)\mkver.exe $(PROGRAM)\buildtools
clean: def-clean
!include ..\..\Target.mak

View file

@ -1,124 +0,0 @@
(*
Name: TagFunctions
Copyright: Copyright (C) 2003-2017 SIL International.
Documentation:
Description:
Create Date: 4 May 2012
Modified Date: 4 May 2012
Authors: mcdurdin
Related Files:
Dependencies:
Bugs:
Todo:
Notes:
History: 04 May 2012 - mcdurdin - I3306 - V9.0 - Remove TntControls
04 May 2012 - mcdurdin - I3308 - V9.0 - Start to move towards Delphi namespaces
*)
unit TagFunctions; // I3306 // I3308
interface
uses System.SysUtils;
function GetTag(s: string; i: Integer): string;
function GetTagValue(s: string; i: Integer; tags: array of string): Integer;
function UpdateTag(s: string; i: Integer; tag: string): string;
implementation
function GetTag(s: string; i: Integer): string;
var
n: Integer;
InQuotes: Boolean;
begin
s := Trim(s);
n := 1;
InQuotes := False;
while n <= Length(s) do
begin
if CharInSet(s[n], [' ', #9]) and not InQuotes then
if i > 1 then
begin
Dec(i);
Delete(s, 1, n);
s := Trim(s);
InQuotes := False;
n := 0;
end
else
Break
else if s[n] = '"' then InQuotes := not InQuotes;
Inc(n);
end;
Result := Copy(s, 1, n-1);
end;
function GetTagValue(s: string; i: Integer; tags: array of string): Integer;
var
t: string;
begin
t := GetTag(s, i);
for i := Low(tags) to High(tags) do
if UpperCase(tags[i]) = UpperCase(t) then
begin
Result := i - Low(tags) + 1;
Exit;
end;
Result := 0;
end;
function UpdateTag(s: string; i: Integer; tag: string): string;
var
InQuotes, InTag: Boolean;
n: Integer;
begin
n := 1;
InQuotes := False; InTag := False;
while n <= Length(s) do
begin
if CharInSet(s[n], [' ', #9]) and not InQuotes then
begin
if InTag then
begin
InTag := False;
Dec(i);
end
end
else
begin
if s[n] = '"' then InQuotes := not InQuotes;
InTag := True;
if i = 1 then Break;
end;
Inc(n);
end;
if n > Length(s) then
raise Exception.Create('Tag for line ' + s + ' not found.');
Result := Copy(s, 1, n-1);
Delete(s, 1, n-1);
n := 1;
{InTag := True;} InQuotes := False;
while n <= Length(s) do
begin
if CharInSet(s[n], [' ', #9]) and not InQuotes then
Break
else
begin
//InTag := True;
if s[n] = '"' then InQuotes := not InQuotes;
end;
Inc(n);
end;
Result := Result + tag + Copy(s, n, Length(s));
end;
end.

View file

@ -1,175 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<BorlandProject>
<PersonalityInfo>
<Option>
<Option Name="Personality">Delphi.Personality</Option>
<Option Name="ProjectType">VCLApplication</Option>
<Option Name="Version">1.0</Option>
<Option Name="GUID">{45AC1E4E-5952-4554-9418-4C35BB2608C7}</Option>
</Option>
</PersonalityInfo>
<Delphi.Personality>
<Source>
<Source Name="MainSource">mkver.dpr</Source>
</Source>
<FileVersion>
<FileVersion Name="Version">7.0</FileVersion>
</FileVersion>
<Compiler>
<Compiler Name="A">1</Compiler>
<Compiler Name="B">0</Compiler>
<Compiler Name="C">1</Compiler>
<Compiler Name="D">1</Compiler>
<Compiler Name="E">0</Compiler>
<Compiler Name="F">0</Compiler>
<Compiler Name="G">1</Compiler>
<Compiler Name="H">1</Compiler>
<Compiler Name="I">1</Compiler>
<Compiler Name="J">1</Compiler>
<Compiler Name="K">0</Compiler>
<Compiler Name="L">1</Compiler>
<Compiler Name="M">0</Compiler>
<Compiler Name="N">1</Compiler>
<Compiler Name="O">1</Compiler>
<Compiler Name="P">1</Compiler>
<Compiler Name="Q">1</Compiler>
<Compiler Name="R">1</Compiler>
<Compiler Name="S">0</Compiler>
<Compiler Name="T">0</Compiler>
<Compiler Name="U">0</Compiler>
<Compiler Name="V">1</Compiler>
<Compiler Name="W">1</Compiler>
<Compiler Name="X">1</Compiler>
<Compiler Name="Y">2</Compiler>
<Compiler Name="Z">1</Compiler>
<Compiler Name="ShowHints">True</Compiler>
<Compiler Name="ShowWarnings">True</Compiler>
<Compiler Name="UnitAliases">WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;</Compiler>
<Compiler Name="NamespacePrefix"></Compiler>
<Compiler Name="GenerateDocumentation">False</Compiler>
<Compiler Name="DefaultNamespace"></Compiler>
<Compiler Name="SymbolDeprecated">True</Compiler>
<Compiler Name="SymbolLibrary">True</Compiler>
<Compiler Name="SymbolPlatform">True</Compiler>
<Compiler Name="SymbolExperimental">True</Compiler>
<Compiler Name="UnitLibrary">True</Compiler>
<Compiler Name="UnitPlatform">True</Compiler>
<Compiler Name="UnitDeprecated">True</Compiler>
<Compiler Name="UnitExperimental">True</Compiler>
<Compiler Name="HResultCompat">True</Compiler>
<Compiler Name="HidingMember">True</Compiler>
<Compiler Name="HiddenVirtual">True</Compiler>
<Compiler Name="Garbage">True</Compiler>
<Compiler Name="BoundsError">True</Compiler>
<Compiler Name="ZeroNilCompat">True</Compiler>
<Compiler Name="StringConstTruncated">True</Compiler>
<Compiler Name="ForLoopVarVarPar">True</Compiler>
<Compiler Name="TypedConstVarPar">True</Compiler>
<Compiler Name="AsgToTypedConst">True</Compiler>
<Compiler Name="CaseLabelRange">True</Compiler>
<Compiler Name="ForVariable">True</Compiler>
<Compiler Name="ConstructingAbstract">True</Compiler>
<Compiler Name="ComparisonFalse">True</Compiler>
<Compiler Name="ComparisonTrue">True</Compiler>
<Compiler Name="ComparingSignedUnsigned">True</Compiler>
<Compiler Name="CombiningSignedUnsigned">True</Compiler>
<Compiler Name="UnsupportedConstruct">True</Compiler>
<Compiler Name="FileOpen">True</Compiler>
<Compiler Name="FileOpenUnitSrc">True</Compiler>
<Compiler Name="BadGlobalSymbol">True</Compiler>
<Compiler Name="DuplicateConstructorDestructor">True</Compiler>
<Compiler Name="InvalidDirective">True</Compiler>
<Compiler Name="PackageNoLink">True</Compiler>
<Compiler Name="PackageThreadVar">True</Compiler>
<Compiler Name="ImplicitImport">True</Compiler>
<Compiler Name="HPPEMITIgnored">True</Compiler>
<Compiler Name="NoRetVal">True</Compiler>
<Compiler Name="UseBeforeDef">True</Compiler>
<Compiler Name="ForLoopVarUndef">True</Compiler>
<Compiler Name="UnitNameMismatch">True</Compiler>
<Compiler Name="NoCFGFileFound">True</Compiler>
<Compiler Name="ImplicitVariants">True</Compiler>
<Compiler Name="UnicodeToLocale">True</Compiler>
<Compiler Name="LocaleToUnicode">True</Compiler>
<Compiler Name="ImagebaseMultiple">True</Compiler>
<Compiler Name="SuspiciousTypecast">True</Compiler>
<Compiler Name="PrivatePropAccessor">True</Compiler>
<Compiler Name="UnsafeType">False</Compiler>
<Compiler Name="UnsafeCode">False</Compiler>
<Compiler Name="UnsafeCast">False</Compiler>
<Compiler Name="OptionTruncated">True</Compiler>
<Compiler Name="WideCharReduced">True</Compiler>
<Compiler Name="DuplicatesIgnored">True</Compiler>
<Compiler Name="UnitInitSeq">True</Compiler>
<Compiler Name="LocalPInvoke">True</Compiler>
<Compiler Name="MessageDirective">True</Compiler>
<Compiler Name="CodePage"></Compiler>
</Compiler>
<Linker>
<Linker Name="MapFile">0</Linker>
<Linker Name="OutputObjs">0</Linker>
<Linker Name="GenerateHpps">False</Linker>
<Linker Name="ConsoleApp">0</Linker>
<Linker Name="DebugInfo">False</Linker>
<Linker Name="RemoteSymbols">False</Linker>
<Linker Name="GenerateDRC">False</Linker>
<Linker Name="MinStackSize">16384</Linker>
<Linker Name="MaxStackSize">1048576</Linker>
<Linker Name="ImageBase">4194304</Linker>
<Linker Name="ExeDescription"></Linker>
</Linker>
<Directories>
<Directories Name="OutputDir"></Directories>
<Directories Name="UnitOutputDir"></Directories>
<Directories Name="PackageDLLOutputDir"></Directories>
<Directories Name="PackageDCPOutputDir"></Directories>
<Directories Name="SearchPath">.\acct;.\adjust;.\appt;.\child;.\dialogs;.\explorer;.\locking;.\main;.\medclaims;.\print;.\setup;\blue\src\lib\comp\DB;\blue\src\lib\comp\DB\Appt;\blue\src\lib\comp\DB\Camera;\blue\src\lib\comp\dwinsock;\blue\src\lib\comp\misc;\blue\src\lib\comp\vlist;\blue\src\lib\comp\zip;\blue\src\lib\db;\blue\src\lib\db\schema;\blue\src\lib\dialogs;\blue\src\lib\util;\blue\src\lib\util\auth;\blue\src\lib\util\crypt;\blue\src\lib\util\db;\blue\src\lib\util\db\ACCT;\blue\src\lib\util\db\APPT;\blue\src\lib\util\db\dbcrypt;\blue\src\lib\util\db\locking;\blue\src\lib\util\debug;\blue\src\lib\util\dongle;\blue\src\lib\util\ras;\blue\tmp\db\bclicmgr;\blue\tmp\db\import;\blue\tmp\db\log;\blue\tmp\db\photo;\blue\tmp\db\practice;\blue\tmp\db\wp</Directories>
<Directories Name="Packages">VCL40;VCLX40;VCLDB40;VCLDBX40;VCLSMP40;QRPT40;TEEUI40;TEEDB40;TEE40;ibevnt40;nmfast40;bcutil;VCLJPG40;bccomp;bcdb;bcacct;bcappt</Directories>
<Directories Name="Conditionals">DAOIdent;DAOCheck;DAODebug</Directories>
<Directories Name="DebugSourceDirs"></Directories>
<Directories Name="UsePackages">False</Directories>
</Directories>
<Parameters>
<Parameters Name="RunParams">-v version.txt</Parameters>
<Parameters Name="HostApplication"></Parameters>
<Parameters Name="Launcher"></Parameters>
<Parameters Name="UseLauncher">False</Parameters>
<Parameters Name="DebugCWD"></Parameters>
<Parameters Name="Debug Symbols Search Path"></Parameters>
<Parameters Name="LoadAllSymbols">True</Parameters>
<Parameters Name="LoadUnspecifiedSymbols">False</Parameters>
</Parameters>
<Language>
<Language Name="ActiveLang"></Language>
<Language Name="ProjectLang">$00000000</Language>
<Language Name="RootDir"></Language>
</Language>
<VersionInfo>
<VersionInfo Name="IncludeVerInfo">False</VersionInfo>
<VersionInfo Name="AutoIncBuild">False</VersionInfo>
<VersionInfo Name="MajorVer">0</VersionInfo>
<VersionInfo Name="MinorVer">8</VersionInfo>
<VersionInfo Name="Release">0</VersionInfo>
<VersionInfo Name="Build">14</VersionInfo>
<VersionInfo Name="Debug">False</VersionInfo>
<VersionInfo Name="PreRelease">False</VersionInfo>
<VersionInfo Name="Special">False</VersionInfo>
<VersionInfo Name="Private">False</VersionInfo>
<VersionInfo Name="DLL">False</VersionInfo>
<VersionInfo Name="Locale">3081</VersionInfo>
<VersionInfo Name="CodePage">1252</VersionInfo>
</VersionInfo>
<VersionInfoKeys>
<VersionInfoKeys Name="CompanyName">CASEG Practice Computing</VersionInfoKeys>
<VersionInfoKeys Name="FileDescription">Blue Chip</VersionInfoKeys>
<VersionInfoKeys Name="FileVersion">0.8.0.14</VersionInfoKeys>
<VersionInfoKeys Name="InternalName">BlueChip</VersionInfoKeys>
<VersionInfoKeys Name="LegalCopyright">Copyright © 1997-1999 CASEG Practice Computing</VersionInfoKeys>
<VersionInfoKeys Name="LegalTrademarks"></VersionInfoKeys>
<VersionInfoKeys Name="OriginalFilename">BlueChip.exe</VersionInfoKeys>
<VersionInfoKeys Name="ProductName">Blue Chip</VersionInfoKeys>
<VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys>
<VersionInfoKeys Name="Comments"></VersionInfoKeys>
</VersionInfoKeys>
</Delphi.Personality>
</BorlandProject>

View file

@ -1,43 +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
-cc
-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
-H+
-W+
-M
-$M16384,1048576
-K$00400000
-LE"C:\Documents and Settings\mcdurdin\My Documents\Borland Studio Projects\Bpl"
-LN"C:\Documents and Settings\mcdurdin\My Documents\Borland Studio Projects\Bpl"
-U".\acct;.\adjust;.\appt;.\child;.\dialogs;.\explorer;.\locking;.\main;.\medclaims;.\print;.\setup;\blue\src\lib\comp\DB;\blue\src\lib\comp\DB\Appt;\blue\src\lib\comp\DB\Camera;\blue\src\lib\comp\dwinsock;\blue\src\lib\comp\misc;\blue\src\lib\comp\vlist;\blue\src\lib\comp\zip;\blue\src\lib\db;\blue\src\lib\db\schema;\blue\src\lib\dialogs;\blue\src\lib\util;\blue\src\lib\util\auth;\blue\src\lib\util\crypt;\blue\src\lib\util\db;\blue\src\lib\util\db\ACCT;\blue\src\lib\util\db\APPT;\blue\src\lib\util\db\dbcrypt;\blue\src\lib\util\db\locking;\blue\src\lib\util\debug;\blue\src\lib\util\dongle;\blue\src\lib\util\ras;\blue\tmp\db\bclicmgr;\blue\tmp\db\import;\blue\tmp\db\log;\blue\tmp\db\photo;\blue\tmp\db\practice;\blue\tmp\db\wp"
-O".\acct;.\adjust;.\appt;.\child;.\dialogs;.\explorer;.\locking;.\main;.\medclaims;.\print;.\setup;\blue\src\lib\comp\DB;\blue\src\lib\comp\DB\Appt;\blue\src\lib\comp\DB\Camera;\blue\src\lib\comp\dwinsock;\blue\src\lib\comp\misc;\blue\src\lib\comp\vlist;\blue\src\lib\comp\zip;\blue\src\lib\db;\blue\src\lib\db\schema;\blue\src\lib\dialogs;\blue\src\lib\util;\blue\src\lib\util\auth;\blue\src\lib\util\crypt;\blue\src\lib\util\db;\blue\src\lib\util\db\ACCT;\blue\src\lib\util\db\APPT;\blue\src\lib\util\db\dbcrypt;\blue\src\lib\util\db\locking;\blue\src\lib\util\debug;\blue\src\lib\util\dongle;\blue\src\lib\util\ras;\blue\tmp\db\bclicmgr;\blue\tmp\db\import;\blue\tmp\db\log;\blue\tmp\db\photo;\blue\tmp\db\practice;\blue\tmp\db\wp"
-I".\acct;.\adjust;.\appt;.\child;.\dialogs;.\explorer;.\locking;.\main;.\medclaims;.\print;.\setup;\blue\src\lib\comp\DB;\blue\src\lib\comp\DB\Appt;\blue\src\lib\comp\DB\Camera;\blue\src\lib\comp\dwinsock;\blue\src\lib\comp\misc;\blue\src\lib\comp\vlist;\blue\src\lib\comp\zip;\blue\src\lib\db;\blue\src\lib\db\schema;\blue\src\lib\dialogs;\blue\src\lib\util;\blue\src\lib\util\auth;\blue\src\lib\util\crypt;\blue\src\lib\util\db;\blue\src\lib\util\db\ACCT;\blue\src\lib\util\db\APPT;\blue\src\lib\util\db\dbcrypt;\blue\src\lib\util\db\locking;\blue\src\lib\util\debug;\blue\src\lib\util\dongle;\blue\src\lib\util\ras;\blue\tmp\db\bclicmgr;\blue\tmp\db\import;\blue\tmp\db\log;\blue\tmp\db\photo;\blue\tmp\db\practice;\blue\tmp\db\wp"
-R".\acct;.\adjust;.\appt;.\child;.\dialogs;.\explorer;.\locking;.\main;.\medclaims;.\print;.\setup;\blue\src\lib\comp\DB;\blue\src\lib\comp\DB\Appt;\blue\src\lib\comp\DB\Camera;\blue\src\lib\comp\dwinsock;\blue\src\lib\comp\misc;\blue\src\lib\comp\vlist;\blue\src\lib\comp\zip;\blue\src\lib\db;\blue\src\lib\db\schema;\blue\src\lib\dialogs;\blue\src\lib\util;\blue\src\lib\util\auth;\blue\src\lib\util\crypt;\blue\src\lib\util\db;\blue\src\lib\util\db\ACCT;\blue\src\lib\util\db\APPT;\blue\src\lib\util\db\dbcrypt;\blue\src\lib\util\db\locking;\blue\src\lib\util\debug;\blue\src\lib\util\dongle;\blue\src\lib\util\ras;\blue\tmp\db\bclicmgr;\blue\tmp\db\import;\blue\tmp\db\log;\blue\tmp\db\photo;\blue\tmp\db\practice;\blue\tmp\db\wp"
-DDAOIdent;DAOCheck;DAODebug
-w-UNSAFE_TYPE
-w-UNSAFE_CODE
-w-UNSAFE_CAST

View file

@ -1,106 +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=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=0
OutputObjs=0
ConsoleApp=0
DebugInfo=0
RemoteSymbols=0
MinStackSize=16384
MaxStackSize=1048576
ImageBase=4194304
ExeDescription=
[Directories]
OutputDir=
UnitOutputDir=
PackageDLLOutputDir=
PackageDCPOutputDir=
SearchPath=.\acct;.\adjust;.\appt;.\child;.\dialogs;.\explorer;.\locking;.\main;.\medclaims;.\print;.\setup;\blue\src\lib\comp\DB;\blue\src\lib\comp\DB\Appt;\blue\src\lib\comp\DB\Camera;\blue\src\lib\comp\dwinsock;\blue\src\lib\comp\misc;\blue\src\lib\comp\vlist;\blue\src\lib\comp\zip;\blue\src\lib\db;\blue\src\lib\db\schema;\blue\src\lib\dialogs;\blue\src\lib\util;\blue\src\lib\util\auth;\blue\src\lib\util\crypt;\blue\src\lib\util\db;\blue\src\lib\util\db\ACCT;\blue\src\lib\util\db\APPT;\blue\src\lib\util\db\dbcrypt;\blue\src\lib\util\db\locking;\blue\src\lib\util\debug;\blue\src\lib\util\dongle;\blue\src\lib\util\ras;\blue\tmp\db\bclicmgr;\blue\tmp\db\import;\blue\tmp\db\log;\blue\tmp\db\photo;\blue\tmp\db\practice;\blue\tmp\db\wp
Packages=VCL40;VCLX40;VCLDB40;VCLDBX40;VCLSMP40;QRPT40;TEEUI40;TEEDB40;TEE40;ibevnt40;nmfast40;bcutil;VCLJPG40;bccomp;bcdb;bcacct;bcappt
Conditionals=DAOIdent;DAOCheck;DAODebug
DebugSourceDirs=
UsePackages=0
[Parameters]
RunParams=-v version.txt
HostApplication=
[Version Info]
IncludeVerInfo=0
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=
[Excluded Packages]
C:\Program Files\Korbitec\OE505D4\Package\OE.bpl=ODBCExpress
C:\Marc\keyman\5.0\SOURCE\ziptools\comp51.bpl=TCompress 5.1 only (no BDE required)
C:\Marc\keyman\5.0\SOURCE\ziptools\vclzip\VCLZipD4.bpl=VCLZip 2.20
[HistoryLists\hlConditionals]
Count=1
Item0=DAOIdent;DAOCheck;DAODebug
[HistoryLists\hlUnitAliases]
Count=1
Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
[HistoryLists\hlSearchPath]
Count=5
Item0=.\acct;.\adjust;.\appt;.\child;.\dialogs;.\explorer;.\locking;.\main;.\medclaims;.\print;.\setup;\blue\src\lib\comp\DB;\blue\src\lib\comp\DB\Appt;\blue\src\lib\comp\DB\Camera;\blue\src\lib\comp\dwinsock;\blue\src\lib\comp\misc;\blue\src\lib\comp\vlist;\blue\src\lib\comp\zip;\blue\src\lib\db;\blue\src\lib\db\schema;\blue\src\lib\dialogs;\blue\src\lib\util;\blue\src\lib\util\auth;\blue\src\lib\util\crypt;\blue\src\lib\util\db;\blue\src\lib\util\db\ACCT;\blue\src\lib\util\db\APPT;\blue\src\lib\util\db\dbcrypt;\blue\src\lib\util\db\locking;\blue\src\lib\util\debug;\blue\src\lib\util\dongle;\blue\src\lib\util\ras;\blue\tmp\db\bclicmgr;\blue\tmp\db\import;\blue\tmp\db\log;\blue\tmp\db\photo;\blue\tmp\db\practice;\blue\tmp\db\wp
Item1=c:\keyman\5.0\src\lib\vclzip;c:\keyman\5.0\src\lib\general
Item2=c:\keyman\5.0\src\lib\vclzip
Item3=c:\marc\keyman\5.0\src\lib\vclzip
Item4=c:\marc\keyman\5.0\source\ziptools\vclzip
[HistoryLists\hlRunParameters]
Count=9
Item0=-v version.txt
Item1=-i version.txt
Item2=-i C:\keyman\5.0\Assorted\test\test1.kmx
Item3=-v C:\keyman\5.0\Assorted\test\test1.kmx
Item4=-v C:\keyman\5.0\Assorted\test\test1.kmn
Item5=-ra
Item6=-i enhlao.kmp
Item7=-v enhlao.kmp
Item8=-u 00000454

View file

@ -1,23 +0,0 @@
program mkver;
uses
System.SysUtils,
Main in 'Main.pas',
TagFunctions in 'TagFunctions.pas',
Keyman.System.KeymanVersionInfo in '..\..\global\delphi\general\Keyman.System.KeymanVersionInfo.pas';
// KeymanVersion in '..\..\global\delphi\general\KeymanVersion.pas';
{$R *.RES}
begin
try
Run;
except
on E:Exception do
begin
writeln('Fatal error: ' + E.Message);
ExitCode := 1;
end;
end;
end.

View file

@ -1,928 +0,0 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectGuid>{45AC1E4E-5952-4554-9418-4C35BB2608C7}</ProjectGuid>
<MainSource>mkver.dpr</MainSource>
<Base>True</Base>
<Config Condition="'$(Config)'==''">Debug</Config>
<TargetedPlatforms>1</TargetedPlatforms>
<AppType>Console</AppType>
<FrameworkType>None</FrameworkType>
<ProjectVersion>18.8</ProjectVersion>
<Platform Condition="'$(Platform)'==''">Win32</Platform>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
<Base_Win32>true</Base_Win32>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''">
<Base_Win64>true</Base_Win64>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_1)'!=''">
<Cfg_1>true</Cfg_1>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_2)'!=''">
<Cfg_2>true</Cfg_2>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win32)'!=''">
<Cfg_2_Win32>true</Cfg_2_Win32>
<CfgParent>Cfg_2</CfgParent>
<Cfg_2>true</Cfg_2>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Base)'!=''">
<DCC_Define>DAOIdent;DAOCheck;DAODebug;$(DCC_Define)</DCC_Define>
<DCC_Alignment>1</DCC_Alignment>
<DCC_UnitSearchPath>.\acct;.\adjust;.\appt;.\child;.\dialogs;.\explorer;.\locking;.\main;.\medclaims;.\print;.\setup;\blue\src\lib\comp\DB;\blue\src\lib\comp\DB\Appt;\blue\src\lib\comp\DB\Camera;\blue\src\lib\comp\dwinsock;\blue\src\lib\comp\misc;\blue\src\lib\comp\vlist;\blue\src\lib\comp\zip;\blue\src\lib\db;\blue\src\lib\db\schema;\blue\src\lib\dialogs;\blue\src\lib\util;\blue\src\lib\util\auth;\blue\src\lib\util\crypt;\blue\src\lib\util\db;\blue\src\lib\util\db\ACCT;\blue\src\lib\util\db\APPT;\blue\src\lib\util\db\dbcrypt;\blue\src\lib\util\db\locking;\blue\src\lib\util\debug;\blue\src\lib\util\dongle;\blue\src\lib\util\ras;\blue\tmp\db\bclicmgr;\blue\tmp\db\import;\blue\tmp\db\log;\blue\tmp\db\photo;\blue\tmp\db\practice;\blue\tmp\db\wp;$(DCC_UnitSearchPath)</DCC_UnitSearchPath>
<DCC_ConsoleTarget>true</DCC_ConsoleTarget>
<DCC_IntegerOverflowCheck>true</DCC_IntegerOverflowCheck>
<DCC_Namespace>System;Xml;Data;Datasnap;Web;Soap;Winapi;System.Win;$(DCC_Namespace)</DCC_Namespace>
<DCC_WriteableConstants>true</DCC_WriteableConstants>
<DCC_RangeChecking>true</DCC_RangeChecking>
<VerInfo_MinorVer>8</VerInfo_MinorVer>
<VerInfo_MajorVer>0</VerInfo_MajorVer>
<VerInfo_Build>14</VerInfo_Build>
<DCC_F>false</DCC_F>
<DCC_E>false</DCC_E>
<DCC_K>false</DCC_K>
<DCC_S>false</DCC_S>
<DCC_N>true</DCC_N>
<DCC_UsePackage>VCL40;VCLX40;VCLDB40;VCLDBX40;VCLSMP40;QRPT40;TEEUI40;TEEDB40;TEE40;ibevnt40;nmfast40;bcutil;VCLJPG40;bccomp;bcdb;bcacct;bcappt;$(DCC_UsePackage)</DCC_UsePackage>
<DCC_ImageBase>00400000</DCC_ImageBase>
<VerInfo_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=</VerInfo_Keys>
<VerInfo_Locale>3081</VerInfo_Locale>
<DCC_GenerateStackFrames>true</DCC_GenerateStackFrames>
<SanitizedProjectName>mkver</SanitizedProjectName>
<Icon_MainIcon>$(BDS)\bin\delphi_PROJECTICON.ico</Icon_MainIcon>
<Icns_MainIcns>$(BDS)\bin\delphi_PROJECTICNS.icns</Icns_MainIcns>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win32)'!=''">
<Icon_MainIcon>mkver_Icon.ico</Icon_MainIcon>
<DCC_Namespace>Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
<VerInfo_Locale>1033</VerInfo_Locale>
<VerInfo_Keys>CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName)</VerInfo_Keys>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win64)'!=''">
<Icon_MainIcon>mkver_Icon.ico</Icon_MainIcon>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1)'!=''">
<DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols>
<DCC_DebugInformation>0</DCC_DebugInformation>
<DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo>
<DCC_Define>RELEASE;$(DCC_Define)</DCC_Define>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2)'!=''">
<DCC_Define>DEBUG;$(DCC_Define)</DCC_Define>
<DCC_Optimize>false</DCC_Optimize>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2_Win32)'!=''">
<Debugger_RunParams>-i c:\projects\keyman\open\windows\src\buildtools\version.txt c:\projects\keyman\open\windows\src\version.txt c:\projects\keyman\open\windows\src\buildtools\version.in</Debugger_RunParams>
</PropertyGroup>
<ItemGroup>
<DelphiCompile Include="$(MainSource)">
<MainSource>MainSource</MainSource>
</DelphiCompile>
<DCCReference Include="Main.pas"/>
<DCCReference Include="TagFunctions.pas"/>
<DCCReference Include="..\..\global\delphi\general\Keyman.System.KeymanVersionInfo.pas"/>
<BuildConfiguration Include="Debug">
<Key>Cfg_2</Key>
<CfgParent>Base</CfgParent>
</BuildConfiguration>
<BuildConfiguration Include="Base">
<Key>Base</Key>
</BuildConfiguration>
<BuildConfiguration Include="Release">
<Key>Cfg_1</Key>
<CfgParent>Base</CfgParent>
</BuildConfiguration>
</ItemGroup>
<ProjectExtensions>
<Borland.Personality>Delphi.Personality.12</Borland.Personality>
<Borland.ProjectType>VCLApplication</Borland.ProjectType>
<BorlandProject>
<Delphi.Personality>
<Source>
<Source Name="MainSource">mkver.dpr</Source>
</Source>
<VersionInfo>
<VersionInfo Name="IncludeVerInfo">False</VersionInfo>
<VersionInfo Name="AutoIncBuild">False</VersionInfo>
<VersionInfo Name="MajorVer">0</VersionInfo>
<VersionInfo Name="MinorVer">8</VersionInfo>
<VersionInfo Name="Release">0</VersionInfo>
<VersionInfo Name="Build">14</VersionInfo>
<VersionInfo Name="Debug">False</VersionInfo>
<VersionInfo Name="PreRelease">False</VersionInfo>
<VersionInfo Name="Special">False</VersionInfo>
<VersionInfo Name="Private">False</VersionInfo>
<VersionInfo Name="DLL">False</VersionInfo>
<VersionInfo Name="Locale">3081</VersionInfo>
<VersionInfo Name="CodePage">1252</VersionInfo>
</VersionInfo>
<VersionInfoKeys>
<VersionInfoKeys Name="CompanyName">CASEG Practice Computing</VersionInfoKeys>
<VersionInfoKeys Name="FileDescription">Blue Chip</VersionInfoKeys>
<VersionInfoKeys Name="FileVersion">0.8.0.14</VersionInfoKeys>
<VersionInfoKeys Name="InternalName">BlueChip</VersionInfoKeys>
<VersionInfoKeys Name="LegalCopyright">Copyright © 1997-1999 CASEG Practice Computing</VersionInfoKeys>
<VersionInfoKeys Name="LegalTrademarks"/>
<VersionInfoKeys Name="OriginalFilename">BlueChip.exe</VersionInfoKeys>
<VersionInfoKeys Name="ProductName">Blue Chip</VersionInfoKeys>
<VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys>
<VersionInfoKeys Name="Comments"/>
</VersionInfoKeys>
</Delphi.Personality>
<Platforms>
<Platform value="Win32">True</Platform>
<Platform value="Win64">False</Platform>
</Platforms>
<Deployment Version="3">
<DeployFile LocalName="$(BDS)\Redist\osx32\libcgunwind.1.0.dylib" Class="DependencyModule">
<Platform Name="OSX32">
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployFile LocalName="$(BDS)\Redist\iossimulator\libcgunwind.1.0.dylib" Class="DependencyModule">
<Platform Name="iOSSimulator">
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployFile LocalName="$(BDS)\Redist\iossimulator\libpcre.dylib" Class="DependencyModule">
<Platform Name="iOSSimulator">
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployFile LocalName="mkver.exe" Configuration="Debug" Class="ProjectOutput">
<Platform Name="Win32">
<RemoteName>mkver.exe</RemoteName>
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployClass Name="AdditionalDebugSymbols">
<Platform Name="OSX32">
<Operation>1</Operation>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidClassesDexFile">
<Platform Name="Android">
<RemoteDir>classes</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>classes</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidFileProvider">
<Platform Name="Android">
<RemoteDir>res\xml</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\xml</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidGDBServer">
<Platform Name="Android">
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidLibnativeArmeabiFile">
<Platform Name="Android">
<RemoteDir>library\lib\armeabi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>library\lib\armeabi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidLibnativeArmeabiv7aFile">
<Platform Name="Android64">
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidLibnativeMipsFile">
<Platform Name="Android">
<RemoteDir>library\lib\mips</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>library\lib\mips</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidServiceOutput">
<Platform Name="Android">
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>library\lib\arm64-v8a</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidServiceOutput_Android32">
<Platform Name="Android64">
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidSplashImageDef">
<Platform Name="Android">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidSplashStyles">
<Platform Name="Android">
<RemoteDir>res\values</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\values</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidSplashStylesV21">
<Platform Name="Android">
<RemoteDir>res\values-v21</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\values-v21</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_Colors">
<Platform Name="Android">
<RemoteDir>res\values</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\values</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_DefaultAppIcon">
<Platform Name="Android">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon144">
<Platform Name="Android">
<RemoteDir>res\drawable-xxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-xxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon36">
<Platform Name="Android">
<RemoteDir>res\drawable-ldpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-ldpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon48">
<Platform Name="Android">
<RemoteDir>res\drawable-mdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-mdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon72">
<Platform Name="Android">
<RemoteDir>res\drawable-hdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-hdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon96">
<Platform Name="Android">
<RemoteDir>res\drawable-xhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-xhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_NotificationIcon24">
<Platform Name="Android">
<RemoteDir>res\drawable-mdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-mdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_NotificationIcon36">
<Platform Name="Android">
<RemoteDir>res\drawable-hdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-hdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_NotificationIcon48">
<Platform Name="Android">
<RemoteDir>res\drawable-xhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-xhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_NotificationIcon72">
<Platform Name="Android">
<RemoteDir>res\drawable-xxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-xxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_NotificationIcon96">
<Platform Name="Android">
<RemoteDir>res\drawable-xxxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-xxxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_SplashImage426">
<Platform Name="Android">
<RemoteDir>res\drawable-small</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-small</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_SplashImage470">
<Platform Name="Android">
<RemoteDir>res\drawable-normal</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-normal</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_SplashImage640">
<Platform Name="Android">
<RemoteDir>res\drawable-large</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-large</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_SplashImage960">
<Platform Name="Android">
<RemoteDir>res\drawable-xlarge</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-xlarge</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_Strings">
<Platform Name="Android">
<RemoteDir>res\values</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\values</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="DebugSymbols">
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
<Platform Name="OSX32">
<Operation>1</Operation>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
</Platform>
</DeployClass>
<DeployClass Name="DependencyFramework">
<Platform Name="OSX32">
<Operation>1</Operation>
<Extensions>.framework</Extensions>
</Platform>
<Platform Name="OSX64">
<Operation>1</Operation>
<Extensions>.framework</Extensions>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
</Platform>
</DeployClass>
<DeployClass Name="DependencyModule">
<Platform Name="OSX32">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="OSX64">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
<Extensions>.dll;.bpl</Extensions>
</Platform>
</DeployClass>
<DeployClass Required="true" Name="DependencyPackage">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="OSX32">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="OSX64">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
<Extensions>.bpl</Extensions>
</Platform>
</DeployClass>
<DeployClass Name="File">
<Platform Name="Android">
<Operation>0</Operation>
</Platform>
<Platform Name="Android64">
<Operation>0</Operation>
</Platform>
<Platform Name="iOSDevice32">
<Operation>0</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>0</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>0</Operation>
</Platform>
<Platform Name="OSX32">
<Operation>0</Operation>
</Platform>
<Platform Name="OSX64">
<Operation>0</Operation>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Launch1024x768">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Launch1536x2048">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Launch1668">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Launch1668x2388">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Launch2048x1536">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Launch2048x2732">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Launch2224">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Launch2388x1668">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Launch2732x2048">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Launch768x1024">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch1125">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch1136x640">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch1242">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch1242x2688">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch1334">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch1792">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch2208">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch2436">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch2688x1242">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch320">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch640">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch640x1136">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch750">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch828">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectAndroidManifest">
<Platform Name="Android">
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectiOSDeviceDebug">
<Platform Name="iOSDevice32">
<RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectiOSDeviceResourceRules"/>
<DeployClass Name="ProjectiOSEntitlements"/>
<DeployClass Name="ProjectiOSInfoPList"/>
<DeployClass Name="ProjectiOSResource">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectOSXDebug"/>
<DeployClass Name="ProjectOSXEntitlements"/>
<DeployClass Name="ProjectOSXInfoPList"/>
<DeployClass Name="ProjectOSXResource">
<Platform Name="OSX32">
<RemoteDir>Contents\Resources</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="OSX64">
<RemoteDir>Contents\Resources</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Required="true" Name="ProjectOutput">
<Platform Name="Android">
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>library\lib\arm64-v8a</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
<Platform Name="Linux64">
<Operation>1</Operation>
</Platform>
<Platform Name="OSX32">
<Operation>1</Operation>
</Platform>
<Platform Name="OSX64">
<Operation>1</Operation>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectOutput_Android32">
<Platform Name="Android64">
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectUWPManifest">
<Platform Name="Win32">
<Operation>1</Operation>
</Platform>
<Platform Name="Win64">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="UWP_DelphiLogo150">
<Platform Name="Win32">
<RemoteDir>Assets</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Win64">
<RemoteDir>Assets</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="UWP_DelphiLogo44">
<Platform Name="Win32">
<RemoteDir>Assets</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Win64">
<RemoteDir>Assets</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<ProjectRoot Platform="iOSDevice64" Name="$(PROJECTNAME).app"/>
<ProjectRoot Platform="Win64" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="iOSDevice32" Name="$(PROJECTNAME).app"/>
<ProjectRoot Platform="Linux64" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="Win32" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="OSX32" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="Android" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="OSX64" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="iOSSimulator" Name="$(PROJECTNAME).app"/>
<ProjectRoot Platform="Android64" Name="$(PROJECTNAME)"/>
</Deployment>
</BorlandProject>
<ProjectFileVersion>12</ProjectFileVersion>
</ProjectExtensions>
<Import Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')" Project="$(BDS)\Bin\CodeGear.Delphi.Targets"/>
<Import Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')" Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj"/>
<Import Project="$(MSBuildProjectName).deployproj" Condition="Exists('$(MSBuildProjectName).deployproj')"/>
</Project>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 766 B

View file

@ -7,8 +7,11 @@ rem
rem Do not use this for VS builds.
rem
if not exist "%DCC32PATH%\rsvars.bat" echo Batch file %DCC32PATH%\rsvars.bat does not exist && exit /b 1
SET DCC32PATH=%1
shift
call "%DCC32PATH%\rsvars.bat"
msbuild.exe %*
if not exist %DCC32PATH%\rsvars.bat echo Batch file %DCC32PATH%\rsvars.bat does not exist && exit /b 1
call %DCC32PATH%\rsvars.bat
msbuild.exe %1 %2 %3 %4 %5 %6 %7 %8 %9
exit /b %errorlevel%

View file

@ -5,9 +5,9 @@
!include ..\..\Defines.mak
build: dirs
# build with DCC32PATH as $DCC32 command uses devtools.exe...
# $(DCC32) devtools.dpr
$(DELPHI_MSBUILD) sentrytool.dproj /p:Platform=Win32
# build with DCC32PATH as $DCC32 command uses devtools.exe...
# $(DCC32) devtools.dpr
$(DELPHI_MSBUILD) sentrytool.dproj "/p:Platform=Win32"
$(COPY) $(WIN32_TARGET_PATH)\sentrytool.exe $(PROGRAM)\buildtools
clean: def-clean

View file

@ -5,7 +5,7 @@
!include ..\..\Defines.mak
verify: clean
$(DELPHI_MSBUILD) test_klog.dproj /p:Platform=Win32
$(DELPHI_MSBUILD) test_klog.dproj "/p:Platform=Win32"
$(WIN32_TARGET_PATH)\test_klog
build:

View file

@ -1,4 +0,0 @@
VALUE "CompanyName", "SIL International\0"
VALUE "LegalCopyright", "© SIL International\0"
VALUE "LegalTrademarks", "Keyman is a registered trademark of SIL International\0"
VALUE "ProductName", "Keyman Build Environment\0"

View file

@ -2,7 +2,12 @@
# Keyman for Windows Makefile
#
!ifdef NODELPHI
TARGETS=.virtual
!else
TARGETS=kmshell kmconfig kmbrowserhost setup insthelp
!endif
RELEASE_TARGETS=help
CLEANS=inst clean-desktop
MANIFESTS=kmshell setup insthelp
@ -11,31 +16,31 @@ MANIFESTS=kmshell setup insthelp
# ----------------------------------------------------------------------
kmshell:
kmshell: .virtual
cd $(ROOT)\src\desktop\kmshell
$(MAKE) $(TARGET)
kmconfig:
kmconfig: .virtual
cd $(ROOT)\src\desktop\kmconfig
$(MAKE) $(TARGET)
kmbrowserhost:
kmbrowserhost: .virtual
cd $(ROOT)\src\desktop\kmbrowserhost
$(MAKE) $(TARGET)
setup:
setup: .virtual
cd $(ROOT)\src\desktop\setup
$(MAKE) $(TARGET)
help:
help: .virtual
cd $(ROOT)\src\desktop\help
$(MAKE) $(TARGET)
insthelp:
insthelp: .virtual
cd $(ROOT)\src\desktop\insthelp
$(MAKE) $(TARGET)
inst:
inst: .virtual
cd $(ROOT)\src\desktop\inst
$(MAKE) $(TARGET)

View file

@ -71,6 +71,11 @@ Here's how to download and install a Keyman keyboard within Keyman:
![](../desktop_images/download-keyboard-step6.png)
**Note:** If you have a separate administrator account -- that is, you are
prompted to enter a username and password at this point -- you may need to
[add a language association](configure-computer) for your keyboard on your
user account after completing the keyboard installation.
10. The keyboard will now be installed; you can close Keyman Configuration.
## Installing a Keyman Keyboard from a Folder on Your Computer

View file

@ -3,3 +3,5 @@ desktop_resources.res
desktopui.wxs
cef.wxs
locale.wxs
keymandesktop*.exe
desktop_resources.dll

View file

@ -13,17 +13,16 @@ manual-setup: check setup
setup: desktop
prereq: prereq-resources
#
# Prepare make file to copy versioned filenames to release folder
#
#
# Prepare make file to copy versioned filenames to release folder
#
cd $(ROOT)\src\desktop\inst
$(MKVER_U) download.in download.mak
prereq-resources:
#
# Create resource dll
#
#
# Create resource dll
#
rc desktop_resources.rc
$(LINKPATH) /DLL /OUT:desktop_resources.dll /RELEASE /NOENTRY /MACHINE:X86 desktop_resources.RES
$(SIGNCODE) /d "Keyman Resources" desktop_resources.dll
@ -32,7 +31,7 @@ desktop: prereq
$(MAKE) -fdownload.mak candle
$(WIXLIGHT) -dWixUILicenseRtf=License.rtf -out keymandesktop.msi -ext WixUIExtension $(DESKTOP_FILES)
$(SIGNCODE) /d "Keyman" keymandesktop.msi
# TODO: replace buildpkg with kmcomp and remove buildpkg from repository
# TODO: replace buildpkg with kmcomp and remove buildpkg from repository
$(ROOT)\bin\buildtools\buildpkg -m keymandesktop.msi -s $(ROOT)\bin\desktop -l license.html
$(SIGNCODE) /d "Keyman" keymandesktop.exe
$(MAKE) -fdownload.mak copyredist-desktop

View file

@ -38,12 +38,12 @@ candle-desktop:
#
heat-cef:
# We copy the files to a temp folder in order to exclude .git and README.md from harvesting
# We copy the files to a temp folder in order to exclude .git and README.md from harvesting
-rmdir /s/q $(KEYMAN_WIX_TEMP_CEF)
mkdir $(KEYMAN_WIX_TEMP_CEF)
xcopy $(KEYMAN_CEF4DELPHI_ROOT)\* $(KEYMAN_WIX_TEMP_CEF)\ /s
$(WIXHEAT) dir $(KEYMAN_WIX_TEMP_CEF) -o cef.wxs -ag -cg CEF -dr INSTALLDIR -var var.CefSourceDir -wx -nologo
# When we candle/light build, we can grab the source files from the proper root so go ahead and delete the temp folder again
# When we candle/light build, we can grab the source files from the proper root so go ahead and delete the temp folder again
-rmdir /s/q $(KEYMAN_WIX_TEMP_CEF)
candle-cef: heat-cef
@ -54,6 +54,6 @@ candle-cef: heat-cef
#
candle-locale:
# locale files are in desktop/locale/*
# locale files are in desktop/locale/*
$(WIXHEAT) dir ..\kmshell\locale -o locale.wxs -ag -cg Locale -dr INSTALLDIR -var var.LOCALESOURCE -wx -nologo
$(WIXCANDLE) -dVERSION=$VersionWin -dRELEASE=$VersionRelease -dPRODUCTID=$GUID1 -dLOCALESOURCE=..\kmshell\locale locale.wxs

View file

@ -5,7 +5,7 @@
!include ..\..\Defines.mak
build: version.res dirs
$(DELPHI_MSBUILD) insthelp.dproj /p:Platform=Win32
$(DELPHI_MSBUILD) insthelp.dproj "/p:Platform=Win32"
$(SENTRYTOOL_DELPHIPREP) $(WIN32_TARGET_PATH)\insthelp.exe -dpr insthelp.dpr
$(TDS2DBG) $(WIN32_TARGET_PATH)\insthelp.exe
$(COPY) $(WIN32_TARGET_PATH)\insthelp.exe $(ROOT)\bin\desktop\insthelp.exe

View file

@ -1,6 +1,8 @@
#include "../../global/inc/keymanversion.h"
1 VERSIONINFO
FILEVERSION $VERSIONNUM
PRODUCTVERSION $VERSIONNUM
FILEVERSION KV_FILEVERSION
PRODUCTVERSION KV_PRODUCTVERSION
FILEFLAGSMASK 0x3fL
FILEFLAGS 0x0L
FILEOS 0x4L
@ -11,15 +13,15 @@
BEGIN
BLOCK "0C0904E4"
BEGIN
VALUE "CompanyName", "SIL International\0"
VALUE "CompanyName", KV_COMPANY_NAME
VALUE "FileDescription", "Keyman Installation Assistant\0"
VALUE "FileVersion", "$VERSION\0"
VALUE "FileVersion", KV_VERSION_STRING
VALUE "InternalName", "INSTHELP\0"
VALUE "LegalCopyright", "© SIL International\0"
VALUE "LegalTrademarks", "\0"
VALUE "LegalCopyright", KV_LEGAL_COPYRIGHT
VALUE "LegalTrademarks", KV_LEGAL_TRADEMARKS
VALUE "OriginalFilename", "INSTHELP.EXE\0"
VALUE "ProductName", "Keyman\0"
VALUE "ProductVersion", "$VERSION\0"
VALUE "ProductVersion", KV_VERSION_STRING
VALUE "Comments", "\0"
END
END

View file

@ -5,7 +5,7 @@
!include ..\..\Defines.mak
build: version.res manifest.res dirs
$(DELPHI_MSBUILD) kmbrowserhost.dproj /p:Platform=Win32
$(DELPHI_MSBUILD) kmbrowserhost.dproj "/p:Platform=Win32"
$(SENTRYTOOL_DELPHIPREP) $(WIN32_TARGET_PATH)\kmbrowserhost.exe -dpr kmbrowserhost.dpr
$(TDS2DBG) $(WIN32_TARGET_PATH)\kmbrowserhost.exe

View file

@ -1,6 +1,8 @@
#include "../../global/inc/keymanversion.h"
1 VERSIONINFO
FILEVERSION $VERSIONNUM
PRODUCTVERSION $VERSIONNUM
FILEVERSION KV_FILEVERSION
PRODUCTVERSION KV_PRODUCTVERSION
FILEFLAGSMASK 0x3fL
FILEFLAGS 0x0L
FILEOS 0x4L
@ -11,15 +13,15 @@
BEGIN
BLOCK "0C0904E4"
BEGIN
VALUE "CompanyName", "SIL International\0"
VALUE "CompanyName", KV_COMPANY_NAME
VALUE "FileDescription", "Keyman Browser Host Process\0"
VALUE "FileVersion", "$VERSION\0"
VALUE "FileVersion", KV_VERSION_STRING
VALUE "InternalName", "KMBROWSERHOST\0"
VALUE "LegalCopyright", "© SIL International\0"
VALUE "LegalTrademarks", "\0"
VALUE "LegalCopyright", KV_LEGAL_COPYRIGHT
VALUE "LegalTrademarks", KV_LEGAL_TRADEMARKS
VALUE "OriginalFilename", "KMBROWSERHOST.EXE\0"
VALUE "ProductName", "Keyman\0"
VALUE "ProductVersion", "$VERSION\0"
VALUE "ProductVersion", KV_VERSION_STRING
VALUE "Comments", "\0"
END
END

View file

@ -4,16 +4,13 @@
!include ..\..\Defines.mak
build: version.res manifest.res #icons
$(DELPHI_MSBUILD) kmconfig.dproj /p:Platform=Win32
build: version.res manifest.res
$(DELPHI_MSBUILD) kmconfig.dproj "/p:Platform=Win32"
$(SENTRYTOOL_DELPHIPREP) $(WIN32_TARGET_PATH)\kmconfig.exe -dpr kmconfig.dpr
$(TDS2DBG) $(WIN32_TARGET_PATH)\kmconfig.exe
$(COPY) $(WIN32_TARGET_PATH)\kmconfig.exe $(PROGRAM)\desktop
if exist $(WIN32_TARGET_PATH)\kmconfig.dbg $(COPY) $(WIN32_TARGET_PATH)\kmconfig.dbg $(DEBUGPATH)\desktop
#icons:
#rc icons.rc
clean: def-clean
signcode:

View file

@ -1,6 +1,8 @@
#include "../../global/inc/keymanversion.h"
1 VERSIONINFO
FILEVERSION $VERSIONNUM
PRODUCTVERSION $VERSIONNUM
FILEVERSION KV_FILEVERSION
PRODUCTVERSION KV_PRODUCTVERSION
FILEFLAGSMASK 0x3fL
FILEFLAGS 0x0L
FILEOS 0x4L
@ -11,15 +13,15 @@
BEGIN
BLOCK "0C0904E4"
BEGIN
VALUE "CompanyName", "SIL International\0"
VALUE "CompanyName", KV_COMPANY_NAME
VALUE "FileDescription", "Keyman System Settings\0"
VALUE "FileVersion", "$VERSION\0"
VALUE "FileVersion", KV_VERSION_STRING
VALUE "InternalName", "KMCONFIG\0"
VALUE "LegalCopyright", "© SIL International\0"
VALUE "LegalTrademarks", "\0"
VALUE "LegalCopyright", KV_LEGAL_COPYRIGHT
VALUE "LegalTrademarks", KV_LEGAL_TRADEMARKS
VALUE "OriginalFilename", "KMCONFIG.EXE\0"
VALUE "ProductName", "Keyman\0"
VALUE "ProductVersion", "$VERSION\0"
VALUE "ProductVersion", KV_VERSION_STRING
VALUE "Comments", "\0"
END
END

Some files were not shown because too many files have changed in this diff Show more