From 3cb59e3cf9208b1a9192c77ea16f1cb40630b0b0 Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Mon, 1 Jun 2026 17:51:42 +0200 Subject: [PATCH 01/38] fix(web): fix race displaying active keyboard in menu Fixes: #16041 Build-bot: skip release:web Test-bot: skip --- web/src/app/ui/kmwuitoggle.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/web/src/app/ui/kmwuitoggle.ts b/web/src/app/ui/kmwuitoggle.ts index 1aa4561465..3f48c26197 100644 --- a/web/src/app/ui/kmwuitoggle.ts +++ b/web/src/app/ui/kmwuitoggle.ts @@ -542,8 +542,18 @@ if(!keymanweb) { } // Highlight the last active keyboard - const sk=keymanweb.getSavedKeyboard().split(':'); - this.updateMenu(sk[0],sk[1]); + let activeKeyboard = keymanweb.getActiveKeyboard(); + let activeLanguage = ''; + if (activeKeyboard) { + activeLanguage = keymanweb.getActiveLanguage(); + } else { + // savedKeyboard is only correct if we use global keyboard settings, + // otherwise it's set to the first keyboard in the list + const savedKeyboard = keymanweb.getSavedKeyboard().split(':'); + activeKeyboard = savedKeyboard[0]; + activeLanguage = savedKeyboard[1]; + } + this.updateMenu(activeKeyboard, activeLanguage); } /* ---------------------------------------- From f82793636223119eb3a5416a6c59f31bf6c75637 Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Tue, 2 Jun 2026 12:15:12 +0200 Subject: [PATCH 02/38] fix(web): fix race in `kmwuifloat.ts` as well --- web/src/app/ui/kmwuifloat.ts | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/web/src/app/ui/kmwuifloat.ts b/web/src/app/ui/kmwuifloat.ts index f67463cf48..add9b4f600 100644 --- a/web/src/app/ui/kmwuifloat.ts +++ b/web/src/app/ui/kmwuifloat.ts @@ -261,12 +261,19 @@ if(!keymanweb) { } this.updateList = false; - // Set the menu selector to the currently saved keyboard - const sk = keymanweb.getSavedKeyboard().split(':'); - if(sk.length < 2) { - sk[1] = ''; + // Set the menu selector to the last active keyboard + let activeKeyboard = keymanweb.getActiveKeyboard(); + let activeLanguage = ''; + if (activeKeyboard) { + activeLanguage = keymanweb.getActiveLanguage(); + } else { + // savedKeyboard is only correct if we use global keyboard settings, + // otherwise it's set to the first keyboard in the list + const savedKeyboard = keymanweb.getSavedKeyboard().split(':'); + activeKeyboard = savedKeyboard[0]; + activeLanguage = savedKeyboard.length < 2 ? '' : savedKeyboard[1]; } - this.updateMenu(sk[0],sk[1]); + this.updateMenu(activeKeyboard, activeLanguage); // Redisplay the UI to correct width for any new language entries if(keymanweb.getLastActiveElement()) { From 92440317b8b51ad8a82c24e704edd8c73962337a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jun 2026 10:52:22 +0000 Subject: [PATCH 03/38] chore(deps): bump minimatch in /core/tests/unit/wasm Bumps and [minimatch](https://github.com/isaacs/minimatch). These dependencies needed to be updated together. Updates `minimatch` from 9.0.5 to 9.0.9 - [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md) - [Commits](https://github.com/isaacs/minimatch/compare/v9.0.5...v9.0.9) Updates `minimatch` from 5.1.6 to 5.1.9 - [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md) - [Commits](https://github.com/isaacs/minimatch/compare/v9.0.5...v9.0.9) --- updated-dependencies: - dependency-name: minimatch dependency-version: 9.0.9 dependency-type: indirect - dependency-name: minimatch dependency-version: 5.1.9 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- core/tests/unit/wasm/package-lock.json | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/core/tests/unit/wasm/package-lock.json b/core/tests/unit/wasm/package-lock.json index f2c3485da5..ab83293f54 100644 --- a/core/tests/unit/wasm/package-lock.json +++ b/core/tests/unit/wasm/package-lock.json @@ -133,9 +133,9 @@ } }, "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", "dev": true, "license": "MIT", "dependencies": { @@ -572,13 +572,13 @@ } }, "node_modules/glob/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -770,9 +770,9 @@ "license": "ISC" }, "node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", "dev": true, "license": "ISC", "dependencies": { From 45329e96808ccdafd26b25d4b03434de4764d41e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jun 2026 10:52:23 +0000 Subject: [PATCH 04/38] chore(deps): bump glob from 10.4.5 to 10.5.0 in /core/tests/unit/wasm Bumps [glob](https://github.com/isaacs/node-glob) from 10.4.5 to 10.5.0. - [Changelog](https://github.com/isaacs/node-glob/blob/main/changelog.md) - [Commits](https://github.com/isaacs/node-glob/compare/v10.4.5...v10.5.0) --- updated-dependencies: - dependency-name: glob dependency-version: 10.5.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- core/tests/unit/wasm/package-lock.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/core/tests/unit/wasm/package-lock.json b/core/tests/unit/wasm/package-lock.json index f2c3485da5..4b185e0119 100644 --- a/core/tests/unit/wasm/package-lock.json +++ b/core/tests/unit/wasm/package-lock.json @@ -538,9 +538,10 @@ } }, "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "dependencies": { From 199bd9ae075e8acc9be5d45e4ff4027e869d2069 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jun 2026 10:52:24 +0000 Subject: [PATCH 05/38] chore(deps-dev): bump js-yaml in /core/tests/unit/wasm Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 4.1.0 to 4.2.0. - [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md) - [Commits](https://github.com/nodeca/js-yaml/commits) --- updated-dependencies: - dependency-name: js-yaml dependency-version: 4.2.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- core/tests/unit/wasm/package-lock.json | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/core/tests/unit/wasm/package-lock.json b/core/tests/unit/wasm/package-lock.json index f2c3485da5..19d5fd4a48 100644 --- a/core/tests/unit/wasm/package-lock.json +++ b/core/tests/unit/wasm/package-lock.json @@ -710,10 +710,20 @@ } }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "license": "MIT", "dependencies": { "argparse": "^2.0.1" From 0cc44cf63e64018cc01acb13658294eb8dc265da Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jun 2026 10:52:33 +0000 Subject: [PATCH 06/38] chore(deps-dev): bump picomatch in /core/tests/unit/wasm Bumps [picomatch](https://github.com/micromatch/picomatch) from 2.3.1 to 2.3.2. - [Release notes](https://github.com/micromatch/picomatch/releases) - [Changelog](https://github.com/micromatch/picomatch/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/picomatch/compare/2.3.1...2.3.2) --- updated-dependencies: - dependency-name: picomatch dependency-version: 2.3.2 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- core/tests/unit/wasm/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/tests/unit/wasm/package-lock.json b/core/tests/unit/wasm/package-lock.json index f2c3485da5..0ba3473413 100644 --- a/core/tests/unit/wasm/package-lock.json +++ b/core/tests/unit/wasm/package-lock.json @@ -932,9 +932,9 @@ } }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { From 9404a7457f9ac3a337708dc80b528c3640647b23 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jun 2026 10:53:38 +0000 Subject: [PATCH 07/38] chore(deps): bump qs and express Bumps [qs](https://github.com/ljharb/qs) to 6.15.2 and updates ancestor dependency [express](https://github.com/expressjs/express). These dependencies need to be updated together. Updates `qs` from 6.13.0 to 6.15.2 - [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md) - [Commits](https://github.com/ljharb/qs/compare/v6.13.0...v6.15.2) Updates `express` from 4.22.1 to 4.22.2 - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/v4.22.2/History.md) - [Commits](https://github.com/expressjs/express/compare/v4.22.1...v4.22.2) --- updated-dependencies: - dependency-name: express dependency-version: 4.22.2 dependency-type: direct:production - dependency-name: qs dependency-version: 6.15.2 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- developer/src/server/package.json | 2 +- package-lock.json | 147 +++++++++++++++++------------- web/package.json | 2 +- 3 files changed, 86 insertions(+), 65 deletions(-) diff --git a/developer/src/server/package.json b/developer/src/server/package.json index 662be2add6..37c92b7f51 100644 --- a/developer/src/server/package.json +++ b/developer/src/server/package.json @@ -13,7 +13,7 @@ "@ngrok/ngrok": "^1.7.0", "@sentry/node": "^7.57.0", "chalk": "^4.1.2", - "express": "^4.22.1", + "express": "^4.22.2", "multer": "^2.1.1", "open": "^8.4.0", "restructure": "^3.0.1", diff --git a/package-lock.json b/package-lock.json index dd4169fb4e..7871a01886 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1144,7 +1144,7 @@ "@ngrok/ngrok": "^1.7.0", "@sentry/node": "^7.57.0", "chalk": "^4.1.2", - "express": "^4.22.1", + "express": "^4.22.2", "multer": "^2.1.1", "open": "^8.4.0", "restructure": "^3.0.1", @@ -5191,22 +5191,23 @@ "license": "Apache-2.0" }, "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz", + "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==", + "license": "MIT", "dependencies": { - "bytes": "3.1.2", + "bytes": "~3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.15.1", + "raw-body": "~2.5.3", "type-is": "~1.6.18", - "unpipe": "1.0.0" + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8", @@ -5217,6 +5218,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -5225,14 +5227,60 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, + "node_modules/body-parser/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/body-parser/node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, "node_modules/brace-expansion": { "version": "1.1.12", @@ -5490,6 +5538,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -6262,6 +6311,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -7722,14 +7772,14 @@ "dev": true }, "node_modules/express": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", - "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", + "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "~1.20.3", + "body-parser": "~1.20.5", "content-disposition": "~0.5.4", "content-type": "~1.0.4", "cookie": "~0.7.1", @@ -7748,7 +7798,7 @@ "parseurl": "~1.3.3", "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", - "qs": "~6.14.0", + "qs": "~6.15.1", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "~0.19.0", @@ -7798,40 +7848,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, - "node_modules/express/node_modules/qs": { - "version": "6.14.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", - "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/express/node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/express/node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -8557,6 +8573,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, "dependencies": { "es-define-property": "^1.0.0" }, @@ -11676,12 +11693,12 @@ "license": "MIT" }, "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "version": "6.15.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", + "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.6" + "side-channel": "^1.1.0" }, "engines": { "node": ">=0.6" @@ -11736,6 +11753,7 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -12165,6 +12183,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -12232,14 +12251,16 @@ } }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -14149,7 +14170,7 @@ "@sentry/cli": "^2.31.0", "@zip.js/zip.js": "^2.7.32", "c8": "^7.12.0", - "express": "^4.19.2", + "express": "^4.22.2", "jsdom": "^23.0.1", "promise-status-async": "^1.2.10", "tsx": "^4.19.0" diff --git a/web/package.json b/web/package.json index fcc6d76790..5ec0135add 100644 --- a/web/package.json +++ b/web/package.json @@ -107,7 +107,7 @@ "@sentry/cli": "^2.31.0", "@zip.js/zip.js": "^2.7.32", "c8": "^7.12.0", - "express": "^4.19.2", + "express": "^4.22.2", "jsdom": "^23.0.1", "promise-status-async": "^1.2.10", "tsx": "^4.19.0" From a7b9d5da5aa0e290b7aba6b88ef6770fb29c4214 Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Tue, 2 Jun 2026 18:24:16 +0200 Subject: [PATCH 08/38] fix(web): fix displaying of keyboard menu The recent partial merge of epic/web-core missed some code that causes the keyboard menu to work. This change re-applies those changes. Test-bot: skip --- web/src/app/browser/src/keymanEngine.ts | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/web/src/app/browser/src/keymanEngine.ts b/web/src/app/browser/src/keymanEngine.ts index bf5543e2cd..76f02bc941 100644 --- a/web/src/app/browser/src/keymanEngine.ts +++ b/web/src/app/browser/src/keymanEngine.ts @@ -400,7 +400,7 @@ export class KeymanEngine extends KeymanEngineBase Date: Tue, 2 Jun 2026 13:07:57 -0500 Subject: [PATCH 09/38] auto: increment master version to 19.0.242 Test-bot: skip Build-bot: skip --- HISTORY.md | 6 ++++++ VERSION.md | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/HISTORY.md b/HISTORY.md index 462bb9a48d..9615026796 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,11 @@ # Keyman Version History +## 19.0.241 alpha 2026-06-02 + +* chore(web): web-core preflight - strip core references (#16040) +* docs: add note on how to use composer on dockerized websites (#16029) +* fix(web): fix race displaying active keyboard in menu (#16042) + ## 19.0.240 alpha 2026-05-28 * chore(web): add filename to link text of manual web tests (#16019) diff --git a/VERSION.md b/VERSION.md index e14cb86f3e..bfdab4c783 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1 +1 @@ -19.0.241 \ No newline at end of file +19.0.242 \ No newline at end of file From ef9c0331d0b75ae5c037d3ad0b23173a25bf63fd Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Mon, 1 Jun 2026 19:23:19 +0200 Subject: [PATCH 10/38] chore(web): remove unnecessary .editorconfig file Build-bot: skip Test-bot: skip --- web/src/.editorconfig | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 web/src/.editorconfig diff --git a/web/src/.editorconfig b/web/src/.editorconfig deleted file mode 100644 index 34f03b7b15..0000000000 --- a/web/src/.editorconfig +++ /dev/null @@ -1,10 +0,0 @@ -# top-most EditorConfig file -root = true - -; applies to all files -[*] -indent_style = space - -[*.{java, js, ts, sh, css, html, xml}] -indent_size = 2 - From 43398df2432cd35024378a17b101182132815216 Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Tue, 2 Jun 2026 15:41:58 +0200 Subject: [PATCH 11/38] refactor(web): extract function, rename variables Test-bot: skip --- web/src/app/browser/src/keymanEngine.ts | 27 +++---- web/src/app/ui/kmwuitoggle.ts | 100 +++++++++++++----------- 2 files changed, 66 insertions(+), 61 deletions(-) diff --git a/web/src/app/browser/src/keymanEngine.ts b/web/src/app/browser/src/keymanEngine.ts index 76f02bc941..16afdee6c9 100644 --- a/web/src/app/browser/src/keymanEngine.ts +++ b/web/src/app/browser/src/keymanEngine.ts @@ -275,35 +275,34 @@ export class KeymanEngine extends KeymanEngineBase { - // Ensure that the ui.controller is visible if help is displayed - this.controller.style.display = 'block'; - this.oskButton._setSelected(true); + // Ensure that the ui.controller is visible if help is displayed + this.controller.style.display = 'block'; + this.oskButton._setSelected(true); - return oskPosition; - }); + return oskPosition; + }); osk.addEventListener('hide', (byUser) => { if(byUser['HiddenByUser']) { @@ -565,24 +565,24 @@ if(!keymanweb) { /** * Function selecKbd * Scope Private - * @param {number} _kbd + * @param {number} kbdIndex * Description Select a keyboard from the drop down menu **/ - private async selectKbd(_kbd: number): Promise { - let _name,_lgCode; - if(_kbd < 0) { - _name = ''; - _lgCode=''; + private async selectKbd(kbdIndex: number): Promise { + let name, languageCode; + if (kbdIndex < 0) { + name = ''; + languageCode = ''; } else { - _name = this.keyboards[_kbd]._InternalName; - _lgCode = this.keyboards[_kbd]._LanguageCode; + name = this.keyboards[kbdIndex]._InternalName; + languageCode = this.keyboards[kbdIndex]._LanguageCode; } - await keymanweb.setActiveKeyboard(_name,_lgCode); + await keymanweb.setActiveKeyboard(name, languageCode); keymanweb.focusLastActiveElement(); - this.kbdButton._setSelected(_name != ''); - if(_kbd >= 0) { - this.lastActiveKeyboard = _kbd; + this.kbdButton._setSelected(name != ''); + if (kbdIndex >= 0) { + this.lastActiveKeyboard = kbdIndex; } return false; @@ -697,6 +697,22 @@ if(!keymanweb) { `; } + private createMenuItem(index: number, id: string, name: string, isSelected: boolean): { li: HTMLLIElement, a: HTMLAnchorElement } { + const li = util.createElement('li'); + const a = util.createElement('a'); + a.innerHTML = name; + a.href = "#"; + a.onclick = ((x) => { + return () => this.selectKbd(x); + })(index); + a.id = id; + if (isSelected) { + a.className = 'selected'; + } + li.appendChild(a); + return { li, a }; + } + /** * Function createMenu * Scope Private @@ -711,38 +727,29 @@ if(!keymanweb) { this.keyboardMenu.innerHTML = ''; // I2403 - Allow toggle design to be loaded twice } - const _li = util.createElement('li'); - const _a = util.createElement('a'); - _a.innerHTML='(System keyboard)'; - _a.href="#"; - _a.onclick = () => { - return this.selectKbd(-1); - }; - _a.id='KMWSel_$'; - _a.className='selected'; - _li.appendChild(_a); + // Add the default (system) keyboard as the first entry in the menu + const { li, a } = this.createMenuItem(-1, 'KMWSel_$', '(System keyboard)', true); + this.selectedMenuItem = a; + this.keyboardMenu.appendChild(li); - this.selectedMenuItem=_a; - this.keyboardMenu.appendChild(_li); - - const _kbds=keymanweb.getKeyboards(), _added: Record = {}; + // Add loaded keyboards to the menu this.keyboards = []; - for(let _kbd = 0; _kbd < _kbds.length; _kbd++) { - const _li1=util.createElement('li'); - const _a1=util.createElement('a'); - _a1.innerHTML=_kbds[_kbd].LanguageName + ' - ' + _kbds[_kbd].Name; - if(!_added[_kbds[_kbd].InternalName]) _added[_kbds[_kbd].InternalName]=0; - _added[_kbds[_kbd].InternalName]++; + const keyboards = keymanweb.getKeyboards(); + const added: Record = {}; + for (let kbdIndex = 0; kbdIndex < keyboards.length; kbdIndex++) { + if (!added[keyboards[kbdIndex].InternalName]) { + added[keyboards[kbdIndex].InternalName] = 0; + } + added[keyboards[kbdIndex].InternalName]++; - const _n=_added[_kbds[_kbd].InternalName]; - this.keyboards.push({_InternalName: _kbds[_kbd].InternalName, _LanguageCode:_kbds[_kbd].LanguageCode, _Index: _n}); + const kbdInstanceCount = added[keyboards[kbdIndex].InternalName]; + this.keyboards.push({ _InternalName: keyboards[kbdIndex].InternalName, _LanguageCode: keyboards[kbdIndex].LanguageCode, _Index: kbdInstanceCount }); - _a1.href="#"; - _a1.onclick = ((x) => { return () => this.selectKbd(x); })(this.keyboards.length-1); - _a1.id='KMWSel_'+_kbds[_kbd].InternalName+'$'+_n; - - _li1.appendChild(_a1); - this.keyboardMenu.appendChild(_li1); + const { li } = this.createMenuItem(this.keyboards.length - 1, + `KMWSel_${keyboards[kbdIndex].InternalName}\$${kbdInstanceCount}`, + `${keyboards[kbdIndex].LanguageName} - ${keyboards[kbdIndex].Name}`, + false); + this.keyboardMenu.appendChild(li); } //if(!ui.initialized) // I2403 - Allow toggle design to be loaded twice @@ -750,7 +757,6 @@ if(!keymanweb) { this.kbdButton.getElem().appendChild(this.keyboardMenu); } }; - } @@ -805,4 +811,4 @@ if(!keymanweb) { ui.initialize(); } catch(ex){} -} \ No newline at end of file +} From 9ced04684a2c2f8b23013e670fde7aa29f5d7101 Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Wed, 3 Jun 2026 18:54:26 +0200 Subject: [PATCH 12/38] chore(web): improve the KeymanWeb integration documentation - replace use of `kmw` with `keyman` - unify pattern to load keyboards: do it in `keyman.init().then()` instead of in the document `onload` Part-of: keymanapp/keyman.com#449 Test-bot: skip --- .../engine/guide/examples/__auto-control.html | 25 ++++---- .../guide/examples/__control-by-control.html | 38 ++++++------ .../guide/examples/__first-example.html | 15 +++-- .../guide/examples/__full-manual-control.html | 40 ++++++------- .../guide/examples/__manual-control.html | 20 +++---- .../guide/examples/automatic-control.md | 20 +++---- .../guide/examples/control-by-control.md | 40 ++++++------- .../guide/examples/full-manual-control.md | 36 +++++------- .../guide/examples/js/unified_loader.js | 30 +++++----- .../engine/guide/examples/manual-control.md | 13 +---- web/src/samples/complex/root/pages/index.html | 5 +- web/src/samples/samplehdr.js | 12 ++-- web/src/samples/simplest/index.html | 3 +- web/src/samples/subfolder_toggle/index.html | 3 +- web/src/samples/subfolder_toolbar/index.html | 3 +- .../test/manual/web/attachment-api/index.html | 7 ++- .../manual/web/attachment-api/utilities.js | 27 +++++---- .../test/manual/web/basic-iframe/index.html | 7 ++- .../web/build-visual-keyboard/index.html | 6 +- web/src/test/manual/web/chirality/index.html | 7 ++- .../test/manual/web/chirality/utilities.js | 12 ++-- web/src/test/manual/web/ckeditor/index.html | 7 ++- web/src/test/manual/web/ckeditor/inline.html | 7 ++- web/src/test/manual/web/ckeditor/utilities.js | 10 ++-- web/src/test/manual/web/commonHeader.js | 8 +-- .../test/manual/web/default-subkey/index.html | 5 +- .../test/manual/web/desktop-ui/button.html | 3 +- web/src/test/manual/web/desktop-ui/float.html | 3 +- .../test/manual/web/desktop-ui/toggle.html | 5 +- .../test/manual/web/desktop-ui/toolbar.html | 7 ++- web/src/test/manual/web/empty-row/index.html | 8 +-- .../manual/web/init-race-10743/index.html | 3 +- web/src/test/manual/web/inline-osk/index.html | 3 +- web/src/test/manual/web/issue005/header.js | 40 ++++++------- web/src/test/manual/web/issue005/index.html | 16 ++--- web/src/test/manual/web/issue103/index.html | 9 +-- web/src/test/manual/web/issue103/samplehdr.js | 58 +++++++++---------- web/src/test/manual/web/issue115/index.html | 5 +- web/src/test/manual/web/issue116/index.html | 8 +-- web/src/test/manual/web/issue11785/index.html | 5 +- .../manual/web/issue11785/load-keyboards.js | 8 +-- web/src/test/manual/web/issue1332/header.js | 12 ++-- web/src/test/manual/web/issue1332/index.html | 7 ++- web/src/test/manual/web/issue160/index.html | 10 ++-- web/src/test/manual/web/issue266/index.html | 10 ++-- web/src/test/manual/web/issue271/header.js | 4 +- web/src/test/manual/web/issue271/index.html | 7 ++- web/src/test/manual/web/issue29/index.html | 7 ++- web/src/test/manual/web/issue3701/index.html | 7 +-- web/src/test/manual/web/issue382/index.html | 22 +++---- web/src/test/manual/web/issue53/index.html | 7 ++- web/src/test/manual/web/issue53/issue53.js | 16 +++-- web/src/test/manual/web/issue6005/index.html | 31 +++++----- web/src/test/manual/web/issue62/index.html | 7 ++- web/src/test/manual/web/issue63/index.html | 7 ++- .../issue917-context-and-notany/index.html | 5 +- web/src/test/manual/web/issue920/index.html | 15 ++--- web/src/test/manual/web/issue9469/index.html | 9 ++- .../manual/web/keyboard-errors/errorhdr.js | 10 ++-- .../manual/web/keyboard-errors/index.html | 7 ++- web/src/test/manual/web/mnemonic/index.html | 25 ++++---- .../manual/web/options-with-save/index.html | 25 ++++---- .../manual/web/osk-event-buttons/index.html | 3 +- .../test/manual/web/osk-movement/index.html | 5 +- web/src/test/manual/web/platform/index.html | 11 ++-- web/src/test/manual/web/platform/utilities.js | 8 +-- web/src/test/manual/web/pr10506/header.js | 5 +- web/src/test/manual/web/pr10506/index.html | 7 ++- .../manual/web/prediction-mtnt/index.html | 15 +++-- .../test/manual/web/prediction-ui/index.html | 13 ++--- .../test/manual/web/promise-api/index.html | 6 +- .../test/manual/web/promise-api/promisehdr.js | 14 ++--- .../manual/web/rotation-events/index.html | 29 +++++----- .../manual/web/sentry-integration/errorhdr.js | 28 +++++---- .../manual/web/sentry-integration/index.html | 7 ++- .../manual/web/test-updateLayer/index.html | 7 ++- .../manual/web/test-updateLayer/utilities.js | 8 +-- .../web/text_selection_tests_9073/index.html | 30 +++++----- .../test/manual/web/unminified - manual.html | 5 +- web/src/test/manual/web/unminified.html | 3 +- .../tools/testing/bulk_rendering/index.html | 9 ++- .../bulk_rendering/local-renderer.html | 5 +- .../testing/bulk_rendering/renderer_core.ts | 2 +- web/src/tools/testing/recorder/index.html | 4 +- 84 files changed, 485 insertions(+), 576 deletions(-) diff --git a/web/docs/engine/guide/examples/__auto-control.html b/web/docs/engine/guide/examples/__auto-control.html index 050e03a9f0..efe5467bfd 100644 --- a/web/docs/engine/guide/examples/__auto-control.html +++ b/web/docs/engine/guide/examples/__auto-control.html @@ -1,20 +1,17 @@ + - - @@ -28,4 +25,4 @@ Back to Document - \ No newline at end of file + diff --git a/web/docs/engine/guide/examples/__control-by-control.html b/web/docs/engine/guide/examples/__control-by-control.html index 93a481a75f..07736a05db 100644 --- a/web/docs/engine/guide/examples/__control-by-control.html +++ b/web/docs/engine/guide/examples/__control-by-control.html @@ -1,3 +1,4 @@ + @@ -8,28 +9,23 @@ diff --git a/web/docs/engine/guide/examples/__first-example.html b/web/docs/engine/guide/examples/__first-example.html index feb96f4daa..ece6a9b9ea 100644 --- a/web/docs/engine/guide/examples/__first-example.html +++ b/web/docs/engine/guide/examples/__first-example.html @@ -6,15 +6,14 @@ - @@ -23,4 +22,4 @@ Back to Document - \ No newline at end of file + diff --git a/web/docs/engine/guide/examples/__full-manual-control.html b/web/docs/engine/guide/examples/__full-manual-control.html index 5a70c7183f..6313c13518 100644 --- a/web/docs/engine/guide/examples/__full-manual-control.html +++ b/web/docs/engine/guide/examples/__full-manual-control.html @@ -1,45 +1,39 @@ + - diff --git a/web/docs/engine/guide/examples/__manual-control.html b/web/docs/engine/guide/examples/__manual-control.html index 4680400e4d..209c8fe176 100644 --- a/web/docs/engine/guide/examples/__manual-control.html +++ b/web/docs/engine/guide/examples/__manual-control.html @@ -1,29 +1,23 @@ + - @@ -38,4 +32,4 @@ Back to Document - \ No newline at end of file + diff --git a/web/docs/engine/guide/examples/automatic-control.md b/web/docs/engine/guide/examples/automatic-control.md index c804556e18..14b703d35a 100644 --- a/web/docs/engine/guide/examples/automatic-control.md +++ b/web/docs/engine/guide/examples/automatic-control.md @@ -13,17 +13,15 @@ In this example, we use only the LaoKey keyboard. Please click [this link](./__a diff --git a/web/docs/engine/guide/examples/control-by-control.md b/web/docs/engine/guide/examples/control-by-control.md index 974338ef1f..5f57a5a778 100644 --- a/web/docs/engine/guide/examples/control-by-control.md +++ b/web/docs/engine/guide/examples/control-by-control.md @@ -10,28 +10,23 @@ Include the following script in the HEAD of your page: ```js ``` @@ -48,8 +43,9 @@ Also include the following HTML code: - + ``` + --- **Note:** In this example we disabled the first element (`document.f.address`) by API call. A later API call can re-enable KeymanWeb for this control should it fit the page's design. Alternatively, this can be done by instead adding the class `'kmw-disabled'` to the control. This will permanently block KeymanWeb from handling its input. diff --git a/web/docs/engine/guide/examples/full-manual-control.md b/web/docs/engine/guide/examples/full-manual-control.md index e9e8d2908a..b03d493357 100644 --- a/web/docs/engine/guide/examples/full-manual-control.md +++ b/web/docs/engine/guide/examples/full-manual-control.md @@ -12,27 +12,23 @@ Include the following script in the HEAD of your page: @@ -56,7 +57,7 @@ - +

KeymanWeb Sample Page - Attachment API Testing

This page is designed to stress-test the new attachment/enablement API model and its functions.

You are currently testing under the attachment mode. Two other modes are available: diff --git a/web/src/test/manual/web/attachment-api/utilities.js b/web/src/test/manual/web/attachment-api/utilities.js index 5793c12af6..f6c404932e 100644 --- a/web/src/test/manual/web/attachment-api/utilities.js +++ b/web/src/test/manual/web/attachment-api/utilities.js @@ -1,7 +1,6 @@ // Page-global variable definitions. { var inputCounter = 0; -var kmw = keyman; } function generateDiagnosticDiv(elem) { @@ -23,8 +22,8 @@ function generateDiagnosticDiv(elem) { attachBtn.type = 'button'; attachBtn.id = 'attach_' + elemId; attachBtn.onclick = function() { - kmw.attachToControl(document.getElementById(elemId)); - var attached = kmw.isAttached(elem); + keyman.attachToControl(document.getElementById(elemId)); + var attached = keyman.isAttached(elem); document.getElementById('attachment_' + elemId).textContent = " Currently " + (attached ? "attached." : "detached."); const indepLabel = document.getElementById("independence_" + elemId); // does not exist for iframes @@ -40,8 +39,8 @@ function generateDiagnosticDiv(elem) { detachBtn.type = 'button'; detachBtn.id = 'detach_' + elemId; detachBtn.onclick = function() { - kmw.detachFromControl(document.getElementById(elemId)); - var attached = kmw.isAttached(elem); + keyman.detachFromControl(document.getElementById(elemId)); + var attached = keyman.isAttached(elem); document.getElementById('attachment_' + elemId).textContent = " Currently " + (attached ? "attached." : "detached."); const indepLabel = document.getElementById("independence_" + elemId); // does not exist for iframes @@ -58,7 +57,7 @@ function generateDiagnosticDiv(elem) { var attachLabel = document.createElement("a"); attachLabel.id = 'attachment_' + elemId; window.setTimeout(function() { - attachLabel.textContent = " Currently " + (kmw.isAttached(elem) ? "attached." : "detached."); + attachLabel.textContent = " Currently " + (keyman.isAttached(elem) ? "attached." : "detached."); }, attachTimer); div.appendChild(attachLabel); @@ -69,7 +68,7 @@ function generateDiagnosticDiv(elem) { enableBtn.type = 'button'; enableBtn.id = 'enable_' + elemId; enableBtn.onclick = function() { - kmw.enableControl(document.getElementById(elemId)); + keyman.enableControl(document.getElementById(elemId)); }; enableBtn.value = 'Enable'; div.appendChild(enableBtn); @@ -79,7 +78,7 @@ function generateDiagnosticDiv(elem) { disableBtn.type = 'button'; disableBtn.id = 'disable_' + elemId; disableBtn.onclick = function() { - kmw.disableControl(document.getElementById(elemId)); + keyman.disableControl(document.getElementById(elemId)); }; disableBtn.value = 'Disable'; div.appendChild(disableBtn); @@ -107,9 +106,9 @@ function generateDiagnosticDiv(elem) { setBtn.type = 'button'; setBtn.id = 'set_' + elemId; setBtn.onclick = function() { - kmw.setKeyboardForControl(document.getElementById(elemId), 'dzongkha', 'dz'); + keyman.setKeyboardForControl(document.getElementById(elemId), 'dzongkha', 'dz'); - if(kmw.isAttached(elem)) { + if(keyman.isAttached(elem)) { kbdLabel.textContent = " Using independently-tracked keyboard."; } }; @@ -121,9 +120,9 @@ function generateDiagnosticDiv(elem) { clearBtn.type = 'button'; clearBtn.id = 'clear_' + elemId; clearBtn.onclick = function() { - kmw.setKeyboardForControl(document.getElementById(elemId), null, null); + keyman.setKeyboardForControl(document.getElementById(elemId), null, null); - if(kmw.isAttached(elem)) { + if(keyman.isAttached(elem)) { kbdLabel.textContent = " Using globally-selected keyboard."; } }; @@ -133,8 +132,8 @@ function generateDiagnosticDiv(elem) { var kbdLabel = document.createElement("a"); kbdLabel.id = 'independence_' + elemId; window.setTimeout(function () { - if(kmw.isAttached(elem)) { - var attached = kmw.isAttached(elem); + if(keyman.isAttached(elem)) { + var attached = keyman.isAttached(elem); kbdLabel.textContent = attached ? " Using globally-selected keyboard." : ''; } }, 1); diff --git a/web/src/test/manual/web/basic-iframe/index.html b/web/src/test/manual/web/basic-iframe/index.html index 8a935f2cc6..56441455dd 100644 --- a/web/src/test/manual/web/basic-iframe/index.html +++ b/web/src/test/manual/web/basic-iframe/index.html @@ -36,8 +36,9 @@ @@ -46,7 +47,7 @@ - +

KeymanWeb: Test IFrame connectivity

diff --git a/web/src/test/manual/web/build-visual-keyboard/index.html b/web/src/test/manual/web/build-visual-keyboard/index.html index 2845f3db86..54a47172d0 100644 --- a/web/src/test/manual/web/build-visual-keyboard/index.html +++ b/web/src/test/manual/web/build-visual-keyboard/index.html @@ -37,8 +37,6 @@ @@ -51,7 +52,7 @@ - +

KeymanWeb Sample Page - Chirality Testing

This page is designed to stress-test the new support for chiral modifiers and state keys.

Be sure to reference the developer console for additional feedback.

diff --git a/web/src/test/manual/web/chirality/utilities.js b/web/src/test/manual/web/chirality/utilities.js index 16c9caaf02..5c5fe5c805 100644 --- a/web/src/test/manual/web/chirality/utilities.js +++ b/web/src/test/manual/web/chirality/utilities.js @@ -1,9 +1,7 @@ -function loadKeyboards() -{ - var kmw=keyman; - +async function loadKeyboards() +{ // A testing keyboard handwritten with chirality information. - kmw.addKeyboards({id:'chirality',name:'Chirality Testing', + await keyman.addKeyboards({id:'chirality',name:'Chirality Testing', languages:{ id:'en',name:'English',region:'North America' }, @@ -12,8 +10,8 @@ function loadKeyboards() // A testing keyboard using 10.0 format and the KLS layout specifier // without the 'shift' layer properly defined. - // Add a fully-specified, locally-sourced, keyboard with custom font - kmw.addKeyboards({id:'halfDefined',name:'Undefined Shift Layer Keyboard', + // Add a fully-specified, locally-sourced, keyboard with custom font + await keyman.addKeyboards({id:'halfDefined',name:'Undefined Shift Layer Keyboard', languages:{ id:'en',name:'English',region:'North America' }, diff --git a/web/src/test/manual/web/ckeditor/index.html b/web/src/test/manual/web/ckeditor/index.html index 950f8bcb9b..25dfc7e9e8 100644 --- a/web/src/test/manual/web/ckeditor/index.html +++ b/web/src/test/manual/web/ckeditor/index.html @@ -30,9 +30,10 @@ @@ -44,7 +45,7 @@ - +

KeymanWeb Sample Page - Test CKEditor Integration

Test CKEditor Integration

diff --git a/web/src/test/manual/web/ckeditor/inline.html b/web/src/test/manual/web/ckeditor/inline.html index 463ebf2138..f54d98e0ff 100644 --- a/web/src/test/manual/web/ckeditor/inline.html +++ b/web/src/test/manual/web/ckeditor/inline.html @@ -30,9 +30,10 @@ @@ -44,7 +45,7 @@ - +

KeymanWeb Sample Page - Test CKEditor Integration

Test CKEditor Integration

diff --git a/web/src/test/manual/web/ckeditor/utilities.js b/web/src/test/manual/web/ckeditor/utilities.js index 2ca0fd324c..8c281e2223 100644 --- a/web/src/test/manual/web/ckeditor/utilities.js +++ b/web/src/test/manual/web/ckeditor/utilities.js @@ -1,15 +1,13 @@ -function loadKeyboards() +async function loadKeyboards() { - var kmw=keyman; - // Add more keyboards to the language menu, by keyboard name, // keyboard name and language code, or just the BCP-47 language code. // We use a different loading pattern here than in the samples version to provide a slightly different set of test cases. - kmw.addKeyboards('french','@he'); - kmw.addKeyboards({id:'sil_euro_latin', name:'SIL EuroLatin', languages: [{id:'no'}, {id:'sv'}]}); // Loads from partial stub instead of the compact string. + await keyman.addKeyboards('french', '@he', + { id: 'sil_euro_latin', name: 'SIL EuroLatin', languages: [{ id: 'no' }, { id: 'sv' }] }); // Loads from partial stub instead of the compact string. // Add a keyboard by language name. Note that the name must be spelled // correctly, or the keyboard will not be found. (Using BCP-47 codes is // usually easier.) - kmw.addKeyboardsForLanguage('Dzongkha'); + await keyman.addKeyboardsForLanguage('Dzongkha'); } \ No newline at end of file diff --git a/web/src/test/manual/web/commonHeader.js b/web/src/test/manual/web/commonHeader.js index 74cb22e1cd..53f6611b26 100644 --- a/web/src/test/manual/web/commonHeader.js +++ b/web/src/test/manual/web/commonHeader.js @@ -74,8 +74,6 @@ function loadKeyboards(nestLevel) { - var kmw=keyman; - var base_prefix = '../'; var prefix = './'; // The default - when prefix == 0. @@ -133,8 +131,8 @@ // The following two optional calls should be delayed until language menus are fully loaded: // (a) a specific mapped input element input is focused, to ensure that the OSK appears // (b) a specific keyboard is loaded, rather than the keyboard last used. - //window.setTimeout(function(){kmw.setActiveElement('ta1',true);},2500); - //window.setTimeout(function(){kmw.setActiveKeyboard('Keyboard_french','fr');},3000); + //window.setTimeout(function(){keyman.setActiveElement('ta1',true);},2500); + //window.setTimeout(function(){keyman.setActiveKeyboard('Keyboard_french','fr');},3000); // Note that locally specified keyboards will be listed before keyboards // requested from the remote server by user interfaces that do not order @@ -144,7 +142,7 @@ // Script to allow a user to add any keyboard to the keyboard menu function addKeyboard(n) { - var sKbd,kmw=keyman; + var sKbd; switch(n) { case 1: diff --git a/web/src/test/manual/web/default-subkey/index.html b/web/src/test/manual/web/default-subkey/index.html index 728355c43b..6ce3bee562 100644 --- a/web/src/test/manual/web/default-subkey/index.html +++ b/web/src/test/manual/web/default-subkey/index.html @@ -36,11 +36,10 @@ - +

KeymanWeb Testing Page - Desktop UI module Testing

This page is designed to facilitate testing of various aspects of the Toolbar UI for KeymanWeb. Originally developed to help address issue #1275. diff --git a/web/src/test/manual/web/empty-row/index.html b/web/src/test/manual/web/empty-row/index.html index 02953493e9..ee6da66cca 100644 --- a/web/src/test/manual/web/empty-row/index.html +++ b/web/src/test/manual/web/empty-row/index.html @@ -36,18 +36,16 @@ - - + + @@ -47,7 +49,7 @@ - +

KeymanWeb: 'Test case' for proper implementation of the removeKeyboards API function

diff --git a/web/src/test/manual/web/issue103/index.html b/web/src/test/manual/web/issue103/index.html index 35b006e347..e242071511 100644 --- a/web/src/test/manual/web/issue103/index.html +++ b/web/src/test/manual/web/issue103/index.html @@ -36,10 +36,11 @@ @@ -48,7 +49,7 @@ - +

KeymanWeb Sample Page - Keyboard Registration Check

This page is designed to test KeymanWeb's behavior when being told to load a keyboard multiple times, both via diff --git a/web/src/test/manual/web/issue103/samplehdr.js b/web/src/test/manual/web/issue103/samplehdr.js index 36b08861c1..51a38e4eff 100644 --- a/web/src/test/manual/web/issue103/samplehdr.js +++ b/web/src/test/manual/web/issue103/samplehdr.js @@ -1,70 +1,66 @@ // Modified version of commonHeader - contains repeated requests for the same language. - function loadKeyboards() - { - var kmw=keyman; - + function loadKeyboards() { // The first keyboard added will be the default keyboard for touch devices. // For faster loading, it may be best for the default keyboard to be // locally sourced. - kmw.addKeyboards({id:'us',name:'English',languages:{id:'en',name:'English'}, + keyman.addKeyboards({id:'us',name:'English',languages:{id:'en',name:'English'}, filename:'../us-1.0.js'}); - + // Add more keyboards to the language menu, by keyboard name, // keyboard name and language code, or just the BCP-47 language code. - kmw.addKeyboards('french','european2@sv','european2@sv','european2@sv','european2@sv','european2@sv','european2@sv','european2@no','@he'); - kmw.addKeyboards('@he'); - kmw.addKeyboards('@he'); - + keyman.addKeyboards('french','european2@sv','european2@sv','european2@sv','european2@sv','european2@sv','european2@sv','european2@no','@he'); + keyman.addKeyboards('@he'); + keyman.addKeyboards('@he'); + // Add a keyboard by language name. Note that the name must be spelled // correctly, or the keyboard will not be found. (Using BCP-47 codes is // usually easier.) - kmw.addKeyboardsForLanguage('Dzongkha'); - - // Add a fully-specified, locally-sourced, keyboard with custom font - kmw.addKeyboards({id:'lao_2008_basic',name:'Lao Basic', + keyman.addKeyboardsForLanguage('Dzongkha'); + + // Add a fully-specified, locally-sourced, keyboard with custom font + keyman.addKeyboards({id:'lao_2008_basic',name:'Lao Basic', languages:{ id:'lo',name:'Lao',region:'Asia' }, filename:'../lao_2008_basic.js' - }); + }); // The following two optional calls should be delayed until language menus are fully loaded: // (a) a specific mapped input element input is focused, to ensure that the OSK appears - // (b) a specific keyboard is loaded, rather than the keyboard last used. - //window.setTimeout(function(){kmw.setActiveElement('ta1',true);},2500); - //window.setTimeout(function(){kmw.setActiveKeyboard('Keyboard_french','fr');},3000); - - // Note that locally specified keyboards will be listed before keyboards + // (b) a specific keyboard is loaded, rather than the keyboard last used. + //window.setTimeout(function(){keyman.setActiveElement('ta1',true);},2500); + //window.setTimeout(function(){keyman.setActiveKeyboard('Keyboard_french','fr');},3000); + + // Note that locally specified keyboards will be listed before keyboards // requested from the remote server by user interfaces that do not order // keyboards alphabetically by language. } - - // Script to allow a user to add any keyboard to the keyboard menu + + // Script to allow a user to add any keyboard to the keyboard menu function addKeyboard(n) - { - var sKbd,kmw=keyman; + { + let sKbd; switch(n) { case 1: sKbd=document.getElementById('kbd_id1').value; - kmw.addKeyboards(sKbd); + keyman.addKeyboards(sKbd); break; case 2: sKbd=document.getElementById('kbd_id2').value.toLowerCase(); - kmw.addKeyboards('@'+sKbd); + keyman.addKeyboards('@'+sKbd); break; case 3: sKbd=document.getElementById('kbd_id3').value; - kmw.addKeyboardsForLanguage(sKbd); + keyman.addKeyboardsForLanguage(sKbd); break; } } - + // Add keyboard on Enter (as well as pressing button) - function clickOnEnter(e,id) - { + function clickOnEnter(e,id) { e = e || window.event; - if(e.keyCode == 13) addKeyboard(id); + if(e.keyCode == 13) addKeyboard(id); } diff --git a/web/src/test/manual/web/issue115/index.html b/web/src/test/manual/web/issue115/index.html index cd9afcb8fa..f55d98d382 100644 --- a/web/src/test/manual/web/issue115/index.html +++ b/web/src/test/manual/web/issue115/index.html @@ -36,11 +36,10 @@ diff --git a/web/src/test/manual/web/issue116/index.html b/web/src/test/manual/web/issue116/index.html index d81fb947c0..d8f64d9f74 100644 --- a/web/src/test/manual/web/issue116/index.html +++ b/web/src/test/manual/web/issue116/index.html @@ -36,12 +36,12 @@ diff --git a/web/src/test/manual/web/issue11785/index.html b/web/src/test/manual/web/issue11785/index.html index 5df453aab9..fb51a97bcf 100644 --- a/web/src/test/manual/web/issue11785/index.html +++ b/web/src/test/manual/web/issue11785/index.html @@ -40,9 +40,8 @@ @@ -49,7 +50,7 @@ - +

KeymanWeb Sample Page - Mixed Case of TTF font files

Previously, KMW was not applying .TTF fonts on mobile devices.

See issue #1332 diff --git a/web/src/test/manual/web/issue160/index.html b/web/src/test/manual/web/issue160/index.html index 33219e7fdf..3808341b7d 100644 --- a/web/src/test/manual/web/issue160/index.html +++ b/web/src/test/manual/web/issue160/index.html @@ -36,12 +36,12 @@ diff --git a/web/src/test/manual/web/issue266/index.html b/web/src/test/manual/web/issue266/index.html index 56e52016d7..adf03ffe70 100644 --- a/web/src/test/manual/web/issue266/index.html +++ b/web/src/test/manual/web/issue266/index.html @@ -36,12 +36,12 @@ diff --git a/web/src/test/manual/web/issue271/header.js b/web/src/test/manual/web/issue271/header.js index b0d52effe9..6fd6bec984 100644 --- a/web/src/test/manual/web/issue271/header.js +++ b/web/src/test/manual/web/issue271/header.js @@ -1,7 +1,5 @@ function setActiveKeyboard() { - var kmw=window['keyman'] ? keyman : tavultesoft.keymanweb; - var sKbd = document.getElementById('kbd_id4').value; var sLng = document.getElementById('lang_id4').value; - var result = kmw.setActiveKeyboard("Keyboard_" + sKbd, sLng); + var result = keyman.setActiveKeyboard("Keyboard_" + sKbd, sLng); } \ No newline at end of file diff --git a/web/src/test/manual/web/issue271/index.html b/web/src/test/manual/web/issue271/index.html index fa969195a1..0bf9624779 100644 --- a/web/src/test/manual/web/issue271/index.html +++ b/web/src/test/manual/web/issue271/index.html @@ -36,9 +36,10 @@ @@ -49,7 +50,7 @@ - +

KeymanWeb: Test page for interactions between setActiveKeyboard and the toolbar UI

This version is used to test the interactions of SetActiveKeyboard with the Toolbar UI.

diff --git a/web/src/test/manual/web/issue29/index.html b/web/src/test/manual/web/issue29/index.html index 24a226326c..3f007c9cb4 100644 --- a/web/src/test/manual/web/issue29/index.html +++ b/web/src/test/manual/web/issue29/index.html @@ -36,8 +36,9 @@ @@ -47,7 +48,7 @@ - +

KeymanWeb: Test desktop MutationObserver functionality

diff --git a/web/src/test/manual/web/issue3701/index.html b/web/src/test/manual/web/issue3701/index.html index c27bba6c81..6393f5fe7c 100644 --- a/web/src/test/manual/web/issue3701/index.html +++ b/web/src/test/manual/web/issue3701/index.html @@ -36,11 +36,10 @@ diff --git a/web/src/test/manual/web/issue53/index.html b/web/src/test/manual/web/issue53/index.html index 4c730a3f39..d58dbcfdf4 100644 --- a/web/src/test/manual/web/issue53/index.html +++ b/web/src/test/manual/web/issue53/index.html @@ -36,9 +36,10 @@ @@ -48,7 +49,7 @@ - +

KeymanWeb: Tests layering transitions for keyboards with variable layer sizes.

This test should be run from mobile devices or with Chrome's mobile device emulation settings available within Developer Mode.

diff --git a/web/src/test/manual/web/issue53/issue53.js b/web/src/test/manual/web/issue53/issue53.js index 03d1175866..4cef9371cd 100644 --- a/web/src/test/manual/web/issue53/issue53.js +++ b/web/src/test/manual/web/issue53/issue53.js @@ -1,9 +1,7 @@ function loadKeyboards() { - var kmw=keyman; - // Add a fully-specified, locally-sourced, keyboard. - kmw.addKeyboards({id:'layered_debug_keyboard',name:'Web_Layer_Debugging', + keyman.addKeyboards({id:'layered_debug_keyboard',name:'Web_Layer_Debugging', languages:{ id:'dbg',name:'Debug',region:'North America' }, @@ -14,28 +12,28 @@ function loadKeyboards() // Script to allow a user to add any keyboard to the keyboard menu function addKeyboard(n) { - var sKbd,kmw=keyman; + var sKbd; switch(n) { case 1: sKbd=document.getElementById('kbd_id1').value; - kmw.addKeyboards(sKbd); + keyman.addKeyboards(sKbd); break; case 2: sKbd=document.getElementById('kbd_id2').value.toLowerCase(); - kmw.addKeyboards('@'+sKbd); + keyman.addKeyboards('@'+sKbd); break; case 3: sKbd=document.getElementById('kbd_id3').value; - kmw.addKeyboardsForLanguage(sKbd); + keyman.addKeyboardsForLanguage(sKbd); break; } } function removeKeyboard(n) { - var sKbd=document.getElementById('kbd_id4').value, kmw=keyman; - kmw["removeKeyboards"](sKbd); + var sKbd=document.getElementById('kbd_id4').value; + keyman.removeKeyboards(sKbd); } // Add keyboard on Enter (as well as pressing button) diff --git a/web/src/test/manual/web/issue6005/index.html b/web/src/test/manual/web/issue6005/index.html index 7326f99c7d..9410bed564 100644 --- a/web/src/test/manual/web/issue6005/index.html +++ b/web/src/test/manual/web/issue6005/index.html @@ -40,13 +40,11 @@ const alertType = (new URLSearchParams(window.location.search)).get("useAlerts") != "false"; var alertText = alertType ? 'enabled(default)' : 'disabled'; - var kmw=window.keyman; - - kmw.init({ + keyman.init({ 'attachType': 'auto' }).then(function() { // if mobile device, activate pred text. - if(kmw.util.isTouchDevice()) { + if(keyman.util.isTouchDevice()) { var pageRef = (window.location.protocol == 'file:') ? window.location.href.substr(0, window.location.href.lastIndexOf('/')+1) : window.location.href; @@ -60,24 +58,25 @@ languages: ['en'], path: (pageRef + "prediction-mtnt/nrc.en.mtnt.model.js") }; - kmw.addModel(modelStub1); + keyman.addModel(modelStub1); var modelStub2 = {'id': 'nrc.en.mtnt', languages: ['pny-latn'], // yep. Total cheat for the sake of testing. path: (pageRef + "prediction-mtnt/nrc.en.mtnt.model.js") }; - kmw.addModel(modelStub2); + keyman.addModel(modelStub2); } - }); - kmw.addKeyboards('sil_euro_latin@en', - 'galaxie_hebrew_positional@he', - 'sil_cameroon_qwerty@pny-latn'); - kmw.addKeyboards({ - id:'unmatched_final_group_model_interactions_6005', - name:'"Unmatched Vowel Rule"', - languages:{id:'en',name:'English'}, - filename:('unmatched_final_group_model_interactions_6005.js') - }); + keyman.addKeyboards('sil_euro_latin@en', + 'galaxie_hebrew_positional@he', + 'sil_cameroon_qwerty@pny-latn'); + + keyman.addKeyboards({ + id:'unmatched_final_group_model_interactions_6005', + name:'"Unmatched Vowel Rule"', + languages:{id:'en',name:'English'}, + filename:('unmatched_final_group_model_interactions_6005.js') + }); + }); diff --git a/web/src/test/manual/web/issue62/index.html b/web/src/test/manual/web/issue62/index.html index 23ac9889df..c647b03e88 100644 --- a/web/src/test/manual/web/issue62/index.html +++ b/web/src/test/manual/web/issue62/index.html @@ -36,9 +36,10 @@ @@ -49,7 +50,7 @@ - +

KeymanWeb: Light test for touch-based MutationObserver functionality

diff --git a/web/src/test/manual/web/issue63/index.html b/web/src/test/manual/web/issue63/index.html index 55cee63c97..acb2cdd40f 100644 --- a/web/src/test/manual/web/issue63/index.html +++ b/web/src/test/manual/web/issue63/index.html @@ -36,9 +36,10 @@ @@ -49,7 +50,7 @@ - +

KeymanWeb: Test/stress-test touch-based MutationObserver functionality

diff --git a/web/src/test/manual/web/issue917-context-and-notany/index.html b/web/src/test/manual/web/issue917-context-and-notany/index.html index 251edb9142..f7941b8a0d 100644 --- a/web/src/test/manual/web/issue917-context-and-notany/index.html +++ b/web/src/test/manual/web/issue917-context-and-notany/index.html @@ -36,11 +36,10 @@ diff --git a/web/src/test/manual/web/issue920/index.html b/web/src/test/manual/web/issue920/index.html index b20f536906..03265f30bf 100644 --- a/web/src/test/manual/web/issue920/index.html +++ b/web/src/test/manual/web/issue920/index.html @@ -36,15 +36,10 @@ - +

KeymanWeb Sample Page - deadkeys and multiple groups Testing

See issue #920 for details on what this test is all about. Both ;e and .e should produce ə but ;e uses a deadkey and fails.

diff --git a/web/src/test/manual/web/issue9469/index.html b/web/src/test/manual/web/issue9469/index.html index 78c3a15f95..5c7e33daa3 100644 --- a/web/src/test/manual/web/issue9469/index.html +++ b/web/src/test/manual/web/issue9469/index.html @@ -36,11 +36,10 @@ @@ -48,7 +49,7 @@ - +

KeymanWeb Sample Page - Error Testing page

Pick one of the 'debugging' keyboards to test whether the represented error is handled correctly.

diff --git a/web/src/test/manual/web/mnemonic/index.html b/web/src/test/manual/web/mnemonic/index.html index e0b0f0de79..a77c862219 100644 --- a/web/src/test/manual/web/mnemonic/index.html +++ b/web/src/test/manual/web/mnemonic/index.html @@ -33,24 +33,21 @@ - - diff --git a/web/src/test/manual/web/options-with-save/index.html b/web/src/test/manual/web/options-with-save/index.html index 9f607fd11f..2e69318bbc 100644 --- a/web/src/test/manual/web/options-with-save/index.html +++ b/web/src/test/manual/web/options-with-save/index.html @@ -33,24 +33,21 @@ - - diff --git a/web/src/test/manual/web/osk-event-buttons/index.html b/web/src/test/manual/web/osk-event-buttons/index.html index 92dafcdb4a..95ce7c7707 100644 --- a/web/src/test/manual/web/osk-event-buttons/index.html +++ b/web/src/test/manual/web/osk-event-buttons/index.html @@ -36,8 +36,7 @@ @@ -51,7 +52,7 @@ - +

KeymanWeb Sample Page - Platform Testing

This page is designed to test the Platform statement for consistency. Refer to PR #969.
diff --git a/web/src/test/manual/web/platform/utilities.js b/web/src/test/manual/web/platform/utilities.js index 5c351e0317..bb02bdd6a1 100644 --- a/web/src/test/manual/web/platform/utilities.js +++ b/web/src/test/manual/web/platform/utilities.js @@ -1,8 +1,6 @@ -function loadKeyboards() -{ - var kmw=keyman; - - kmw.addKeyboards({id:'platformtest',name:'Platform Testing', +function loadKeyboards() +{ + keyman.addKeyboards({id:'platformtest',name:'Platform Testing', languages:{ id:'en',name:'English',region:'North America' }, diff --git a/web/src/test/manual/web/pr10506/header.js b/web/src/test/manual/web/pr10506/header.js index 0107af3525..986cc00433 100644 --- a/web/src/test/manual/web/pr10506/header.js +++ b/web/src/test/manual/web/pr10506/header.js @@ -1,11 +1,10 @@ function loadKeyboards() { - var kmw=keyman; - kmw.addKeyboards({id:'us',name:'English',languages:{id:'en',name:'English'}, + keyman.addKeyboards({id:'us',name:'English',languages:{id:'en',name:'English'}, filename:('../us-1.0.js')}); // Add a fully-specified, locally-sourced, keyboard with custom font - kmw.addKeyboards({id:'dotty_keys',name:'Dotty Keys', + keyman.addKeyboards({id:'dotty_keys',name:'Dotty Keys', languages:{ id:'und',name:'Special',region:'World', font:{family:'DejaVu Dots',source:['./DejaVu-Dots.ttf']} diff --git a/web/src/test/manual/web/pr10506/index.html b/web/src/test/manual/web/pr10506/index.html index 06eae11362..84ff48f868 100644 --- a/web/src/test/manual/web/pr10506/index.html +++ b/web/src/test/manual/web/pr10506/index.html @@ -36,9 +36,10 @@ @@ -49,7 +50,7 @@ - +

KeymanWeb Test Page - Key-cap scaling / font-load delay interactions

To run the test, simply change from the default (English) keyboard to the "Special" keyboard.

When things are working properly, the base keys on the "Special" keyboard should contain diff --git a/web/src/test/manual/web/prediction-mtnt/index.html b/web/src/test/manual/web/prediction-mtnt/index.html index 34f43f3c5b..0e41b5b63a 100644 --- a/web/src/test/manual/web/prediction-mtnt/index.html +++ b/web/src/test/manual/web/prediction-mtnt/index.html @@ -36,16 +36,15 @@ - +

@@ -72,8 +73,8 @@ e.value = e.value + event + ': w.iw='+window.innerWidth+' w.ih='+window.innerHeight+orientText+orient+'\n'; - if(event == 'kmw.ri' || event == 'kmw.rh' || event == 'kmw.re') { - e.value = e.value + ' osk.w=' + keyman.osk.computedWidth + ' osk.h=' + keyman.osk.computedHeight + ' kmw.vs=' + keyman.util.getViewportScale() + '\n'; + if(event == 'keyman.ri' || event == 'keyman.rh' || event == 'keyman.re') { + e.value = e.value + ' osk.w=' + keyman.osk.computedWidth + ' osk.h=' + keyman.osk.computedHeight + ' keyman.vs=' + keyman.util.getViewportScale() + '\n'; } e.scrollTop = e.scrollHeight; @@ -89,22 +90,22 @@ window.addEventListener('orientationchange', function() { doLog('orientationchange-b', false) }, false); window.addEventListener('orientationchange', function() { doLog('orientationchange-c', false) }, true); - var kmw_ri = com.keyman.RotationManager.prototype.initNewRotation; + var keyman_ri = com.keyman.RotationManager.prototype.initNewRotation; com.keyman.RotationManager.prototype.initNewRotation = function() { - doLog('kmw.ri'); - kmw_ri.call(this); + doLog('keyman.ri'); + keyman_ri.call(this); } - var kmw_rh = com.keyman.RotationManager.prototype.iOSEventHandler; + var keyman_rh = com.keyman.RotationManager.prototype.iOSEventHandler; com.keyman.RotationManager.prototype.iOSEventHandler = function() { - doLog('kmw.rh'); - kmw_rh.call(this); + doLog('keyman.rh'); + keyman_rh.call(this); } - var kmw_irh = com.keyman.RotationManager.prototype.resolve; + var keyman_irh = com.keyman.RotationManager.prototype.resolve; com.keyman.RotationManager.prototype.resolve = function() { - doLog('kmw.re'); - kmw_irh.call(this); + doLog('keyman.re'); + keyman_irh.call(this); }

Return to main index. diff --git a/web/src/test/manual/web/sentry-integration/errorhdr.js b/web/src/test/manual/web/sentry-integration/errorhdr.js index f5e4ec283f..81ccf2abbd 100644 --- a/web/src/test/manual/web/sentry-integration/errorhdr.js +++ b/web/src/test/manual/web/sentry-integration/errorhdr.js @@ -1,27 +1,25 @@ // JavaScript Document samplehdr.js: Keyboard management for KeymanWeb demonstration pages -/* +/* This script is designed to test KeymanWeb error message handling. */ -function loadKeyboards() { - var kmw=keyman; - +function loadKeyboards() { // We start by adding a keyboard correctly. It's best to include a 'control' in our experiment. - kmw.addKeyboards({id:'us',name:'English',languages:{id:'en',name:'English'}, + keyman.addKeyboards({id:'us',name:'English',languages:{id:'en',name:'English'}, filename:'../us-1.0.js'}); - + // Insert a keyboard that cannot be found. - kmw.addKeyboards({id:'lao_2008_basic',name:'wrong-filename', + keyman.addKeyboards({id:'lao_2008_basic',name:'wrong-filename', languages:{ id:'lo',name:'debugging',region:'Asia', font:{family:'LaoWeb',source:['../font/saysettha_web.ttf','../font/saysettha_web.woff','../font/saysettha_web.eot']} }, filename:'./missing_file.js' // Intentional error - the file doesn't exist, so the @@ -51,7 +52,7 @@ - +

KeymanWeb Sample Page - Shift Testing

See issue #978 for details on what this test is all about.

diff --git a/web/src/test/manual/web/test-updateLayer/utilities.js b/web/src/test/manual/web/test-updateLayer/utilities.js index 41704fa0da..378f44c87e 100644 --- a/web/src/test/manual/web/test-updateLayer/utilities.js +++ b/web/src/test/manual/web/test-updateLayer/utilities.js @@ -1,8 +1,6 @@ -function loadKeyboards() -{ - var kmw=keyman; - - kmw.addKeyboards({id:'rac_balti',name:'RAC Balti', +function loadKeyboards() +{ + keyman.addKeyboards({id:'rac_balti',name:'RAC Balti', languages:{ id:'en',name:'English',region:'North America' }, diff --git a/web/src/test/manual/web/text_selection_tests_9073/index.html b/web/src/test/manual/web/text_selection_tests_9073/index.html index 20bd3cda68..7851186892 100644 --- a/web/src/test/manual/web/text_selection_tests_9073/index.html +++ b/web/src/test/manual/web/text_selection_tests_9073/index.html @@ -20,23 +20,21 @@ + }); + diff --git a/web/src/test/manual/web/unminified - manual.html b/web/src/test/manual/web/unminified - manual.html index dbe7cdae48..5ff0c686e3 100644 --- a/web/src/test/manual/web/unminified - manual.html +++ b/web/src/test/manual/web/unminified - manual.html @@ -36,8 +36,7 @@ diff --git a/web/src/tools/testing/bulk_rendering/renderer_core.ts b/web/src/tools/testing/bulk_rendering/renderer_core.ts index fa90283838..597ef36950 100644 --- a/web/src/tools/testing/bulk_rendering/renderer_core.ts +++ b/web/src/tools/testing/bulk_rendering/renderer_core.ts @@ -326,5 +326,5 @@ export class BatchRenderer { // BatchRenderer's internal state stuff is static on the class and is not exposed with // the line below. // @ts-ignore - window['kmw_renderer'] = new BatchRenderer(); + window['keyman_renderer'] = new BatchRenderer(); })(); \ No newline at end of file diff --git a/web/src/tools/testing/recorder/index.html b/web/src/tools/testing/recorder/index.html index f4a68ba769..a9af8e2029 100644 --- a/web/src/tools/testing/recorder/index.html +++ b/web/src/tools/testing/recorder/index.html @@ -57,6 +57,8 @@ keyman.init({ attachType: 'auto', keyboards: '' + }).then(function () { + loadKeyboards(); }); document.getElementById("body").focus(); @@ -67,7 +69,7 @@ - +
From d7439e68ac7bd817de045213defadd0cd6c0b1f1 Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Wed, 3 Jun 2026 19:40:01 +0200 Subject: [PATCH 13/38] chore(web): more improvements to documentation - update text in `__control-by-control.html` sample - some small updates to the text Build-bot: skip Test-bot: skip --- web/docs/engine/guide/examples/__control-by-control.html | 2 +- web/docs/engine/guide/examples/automatic-control.md | 2 -- web/docs/engine/guide/examples/control-by-control.md | 2 -- .../headless/engine/main/headless/languageProcessor.tests.js | 2 +- 4 files changed, 2 insertions(+), 6 deletions(-) diff --git a/web/docs/engine/guide/examples/__control-by-control.html b/web/docs/engine/guide/examples/__control-by-control.html index 07736a05db..349faf9a39 100644 --- a/web/docs/engine/guide/examples/__control-by-control.html +++ b/web/docs/engine/guide/examples/__control-by-control.html @@ -34,7 +34,7 @@

Email to (KeymanWeb not enabled)

-

Subject (Defaults to 'English' or 'off' unless on a touch-based device)

+

Subject (Defaults to the first language added to KeymanWeb after initialization)

Message body (Defaults to 'LaoKeys')

diff --git a/web/docs/engine/guide/examples/automatic-control.md b/web/docs/engine/guide/examples/automatic-control.md index 14b703d35a..a12de04b49 100644 --- a/web/docs/engine/guide/examples/automatic-control.md +++ b/web/docs/engine/guide/examples/automatic-control.md @@ -29,8 +29,6 @@ In this example, we use only the LaoKey keyboard. Please click [this link](./__a ``` -As you can see above, the second line in the code snippet above references the LaoKey keyboard loader JavaScript file. This is a small stub file, typically less than 200 bytes, that defines the name and actual location of the real keyboard file (in this case, **laokeys.js**). When a page may reference many keyboards, this saves downloading potentially hundreds of kilobytes of unused Javascript keyboards - the keyboard is downloaded when it is first selected by the user. - ## API References On initialization: [`keyman.init()`](../../reference/core/init). diff --git a/web/docs/engine/guide/examples/control-by-control.md b/web/docs/engine/guide/examples/control-by-control.md index 5f57a5a778..b637b0b693 100644 --- a/web/docs/engine/guide/examples/control-by-control.md +++ b/web/docs/engine/guide/examples/control-by-control.md @@ -41,8 +41,6 @@ Also include the following HTML code: // example without detailing paths precisely in the init() call's parameter.--> - - ``` diff --git a/web/src/test/auto/headless/engine/main/headless/languageProcessor.tests.js b/web/src/test/auto/headless/engine/main/headless/languageProcessor.tests.js index 3375279649..6364832fc4 100644 --- a/web/src/test/auto/headless/engine/main/headless/languageProcessor.tests.js +++ b/web/src/test/auto/headless/engine/main/headless/languageProcessor.tests.js @@ -63,7 +63,7 @@ describe('LanguageProcessor', function() { assert.isTrue(languageProcessor.mayPredict); // Some aspects of initialization must wait until after construction and overall - // load of the core. See /web/source/kmwbase.ts, in the final IIFE. + // load of the core. assert.isOk(languageProcessor.lmEngine); }); }); From f218aa92db6845f3187067099bc88cebbf484c91 Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Wed, 3 Jun 2026 19:41:47 +0200 Subject: [PATCH 14/38] refactor(web): reformatting of files Test-bot: skip --- .../guide/examples/automatic-control.md | 6 +++-- .../guide/examples/control-by-control.md | 10 ++++++-- .../guide/examples/full-manual-control.md | 7 +++--- .../engine/guide/examples/manual-control.md | 5 ++-- .../app/browser/src/context/focusAssistant.ts | 2 +- .../keyboard/keyboards/keyboardProperties.ts | 2 +- .../web/build-visual-keyboard/index.html | 23 ++++++++----------- .../test/manual/web/chirality/utilities.js | 2 +- 8 files changed, 32 insertions(+), 25 deletions(-) diff --git a/web/docs/engine/guide/examples/automatic-control.md b/web/docs/engine/guide/examples/automatic-control.md index c804556e18..ef8a57f00f 100644 --- a/web/docs/engine/guide/examples/automatic-control.md +++ b/web/docs/engine/guide/examples/automatic-control.md @@ -2,9 +2,11 @@ title: Automatic Mode Example --- -This page shows how to include a local keyboard from an arbitrary location in your website's file structure. +This page shows how to include a local keyboard from an arbitrary location +in your website's file structure. -In this example, we use only the LaoKey keyboard. Please click [this link](./__auto-control.html) to open the test page. +In this example, we use only the LaoKey keyboard. Please click +[this link](./__auto-control.html) to open the test page. ## Code Walkthrough diff --git a/web/docs/engine/guide/examples/control-by-control.md b/web/docs/engine/guide/examples/control-by-control.md index 974338ef1f..d8492b99bb 100644 --- a/web/docs/engine/guide/examples/control-by-control.md +++ b/web/docs/engine/guide/examples/control-by-control.md @@ -2,7 +2,10 @@ title: Control-by-Control Example --- -In this example, a simulated webmail form, the default and permissible keyboard for each control is managed by the web page. We use the automatic mode for simplicity of demonstration. We also link to the CDN for KeymanWeb in this example. Please click [this link](__control-by-control.html) to open the test page. +In this example, a simulated webmail form, the default and permissible keyboard for each control +is managed by the web page. We use the automatic mode for simplicity of demonstration. We also +link to the CDN for KeymanWeb in this example. Please click [this link](__control-by-control.html) +to open the test page. ## Code Walkthrough @@ -51,7 +54,10 @@ Also include the following HTML code: ``` --- -**Note:** In this example we disabled the first element (`document.f.address`) by API call. A later API call can re-enable KeymanWeb for this control should it fit the page's design. Alternatively, this can be done by instead adding the class `'kmw-disabled'` to the control. This will permanently block KeymanWeb from handling its input. +**Note:** In this example we disabled the first element (`document.f.address`) by API call. A +later API call can re-enable KeymanWeb for this control should it fit the page's design. +Alternatively, this can be done by instead adding the class `'kmw-disabled'` to the control. This +will permanently block KeymanWeb from handling its input. --- diff --git a/web/docs/engine/guide/examples/full-manual-control.md b/web/docs/engine/guide/examples/full-manual-control.md index e9e8d2908a..5aa9189316 100644 --- a/web/docs/engine/guide/examples/full-manual-control.md +++ b/web/docs/engine/guide/examples/full-manual-control.md @@ -2,7 +2,9 @@ title: Manual Control - Custom Interface --- -In this example, the web page designer has opted for their own user interface instead of the KeymanWeb interface. The keyboards in the selector are populated from the KeymanWeb list of keyboards. Please click [this link](__full-manual-control.html) to open the test page. +In this example, the web page designer has opted for their own user interface instead of the +KeymanWeb interface. The keyboards in the selector are populated from the KeymanWeb list of +keyboards. Please click [this link](__full-manual-control.html) to open the test page. ## Code Walkthrough @@ -35,8 +37,7 @@ Include the following script in the HEAD of your page: } /* KWControlChange: Called when user selects an item in the KWControl SELECT */ - function KWControlChange() - { + function KWControlChange() { /* Select the keyboard in KeymanWeb */ var name = KWControl.value.substr(0, KWControl.value.indexOf("$$")); var languageCode = KWControl.value.substr(KWControl.value.indexOf("$$"+2)); diff --git a/web/docs/engine/guide/examples/manual-control.md b/web/docs/engine/guide/examples/manual-control.md index 1087c518c8..d1bd854d9b 100644 --- a/web/docs/engine/guide/examples/manual-control.md +++ b/web/docs/engine/guide/examples/manual-control.md @@ -23,8 +23,7 @@ Include the following script in the HEAD of your page: } /* KWControlClick: Called when user clicks on the KWControl IMG */ - function KWControlClick() - { + function KWControlClick() { if(keyman.osk.isEnabled()) { keyman.osk.hide(); } else { @@ -61,9 +60,11 @@ And finally, include the control img for KeymanWeb: ## API References On programmatically setting the keyboard: + - [`keyman.setActiveKeyboard()`](../../reference/core/setActiveKeyboard). On managing the visibility of the OSK: + - [`keyman.osk.hide()`](../../reference/osk/hide) - [`keyman.osk.show()`](../../reference/osk/show). diff --git a/web/src/app/browser/src/context/focusAssistant.ts b/web/src/app/browser/src/context/focusAssistant.ts index accb9b811e..ade72ea65a 100644 --- a/web/src/app/browser/src/context/focusAssistant.ts +++ b/web/src/app/browser/src/context/focusAssistant.ts @@ -149,7 +149,7 @@ export class FocusAssistant extends EventEmitter { * @param {(boolean|number)} state Activate (true,false) */ setMaintainingFocus(state: boolean) { - this.maintainingFocus = state ? true : false; + this.maintainingFocus = !!state; } setFocusTimer(): void { diff --git a/web/src/engine/src/keyboard/keyboards/keyboardProperties.ts b/web/src/engine/src/keyboard/keyboards/keyboardProperties.ts index 1a3a9e215a..b9b32b444a 100644 --- a/web/src/engine/src/keyboard/keyboards/keyboardProperties.ts +++ b/web/src/engine/src/keyboard/keyboards/keyboardProperties.ts @@ -255,7 +255,7 @@ export class KeyboardProperties implements KeyboardInternalPropertySpec { return null; } - public validateForCustomKeyboard(): Error { + public validateForCustomKeyboard(): Error|null { if(!this.KI || !this.KN || !this.KL || !this.KLC) { return new Error("To use a custom keyboard, you must specify keyboard id, keyboard name, language and language code."); } else { diff --git a/web/src/test/manual/web/build-visual-keyboard/index.html b/web/src/test/manual/web/build-visual-keyboard/index.html index 2845f3db86..e6231dd691 100644 --- a/web/src/test/manual/web/build-visual-keyboard/index.html +++ b/web/src/test/manual/web/build-visual-keyboard/index.html @@ -51,7 +51,7 @@ platform == 'phone' ? 240 : 360; }; - let shadowfy = function(container) { + function shadowfy(container) { const shadow = container.attachShadow({ mode: "open" }); const docBase = container.children[0]; @@ -67,7 +67,7 @@ shadow.appendChild(docBase); } - let documentKeyboard = async function(kbdid, langid, formFactor, layer) { + async function documentKeyboard(kbdid, langid, formFactor, layer) { let docTarget = document.getElementById("docTarget"); label = document.createElement('h3'); docTarget.appendChild(label); @@ -77,8 +77,8 @@ const container = document.createElement('div'); - await kmw.addKeyboards(`${kbdid}@${langid}`); - await kmw.setActiveKeyboard(kbdid, langid); + await keyman.addKeyboards(`${kbdid}@${langid}`); + await keyman.setActiveKeyboard(kbdid, langid); docBase = keyman.BuildVisualKeyboard(kbdid, 1, formFactor, layer); label.textContent = `${keyman.getKeyboard(kbdid).Name} - ${formFactor} - ${layer} layer`; @@ -121,15 +121,12 @@ (It is ignored by other User Interfaces.) -->
-

This test page exists for testing KMW's keyboard-documentation rendering system.

- -
-
- -

Return to testing home page

- - - +

This test page exists for testing KMW's keyboard-documentation rendering system.

+ +
+
+ +

Return to testing home page

From c1113ac21d5d876b69504e557c0c9aa97459fdbb Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Mon, 8 Jun 2026 19:27:12 +0200 Subject: [PATCH 21/38] chore(web): address code review comments Also change a few places that I missed. --- .../keyboards/test_8568_deadkeys.html | 28 ++++++++--------- .../help/reference/kmc/cli/get-started.md | 2 +- developer/src/kmc/README.md | 2 +- web/docs/engine/guide/adding-keyboards.md | 18 +++++------ .../engine/guide/examples/__auto-control.html | 4 +-- .../guide/examples/__control-by-control.html | 7 ++--- .../guide/examples/__first-example.html | 6 ++-- .../guide/examples/automatic-control.md | 4 +-- web/docs/engine/guide/get-started.md | 10 +++---- .../engine/reference/core/addKeyboards.md | 12 +++++++- .../reference/core/addKeyboardsForLanguage.md | 2 +- web/docs/engine/reference/core/getKeyboard.md | 4 +-- .../engine/reference/core/getKeyboards.md | 4 +-- .../reference/interface/registerStub.md | 4 +-- web/src/app/ui/kmwuitoolbar.ts | 4 +-- web/src/samples/complex/root/pages/index.html | 10 +++---- web/src/samples/samplehdr.js | 30 ++++++++++--------- web/src/samples/subfolder_toolbar/index.html | 11 ++++--- .../web/build-visual-keyboard/index.html | 5 ++-- web/src/test/manual/web/ckeditor/index.html | 4 +-- web/src/test/manual/web/ckeditor/inline.html | 4 +-- .../test/manual/web/default-subkey/index.html | 4 +-- .../test/manual/web/desktop-ui/toolbar.html | 4 +-- web/src/test/manual/web/issue103/index.html | 4 +-- web/src/test/manual/web/issue103/samplehdr.js | 28 +++++++++-------- 25 files changed, 110 insertions(+), 105 deletions(-) diff --git a/common/test/resources/keyboards/test_8568_deadkeys.html b/common/test/resources/keyboards/test_8568_deadkeys.html index 1b4cf31424..054f19b4f8 100644 --- a/common/test/resources/keyboards/test_8568_deadkeys.html +++ b/common/test/resources/keyboards/test_8568_deadkeys.html @@ -36,22 +36,20 @@ + }); + diff --git a/developer/docs/help/reference/kmc/cli/get-started.md b/developer/docs/help/reference/kmc/cli/get-started.md index 348bf4c4b9..2316abef38 100644 --- a/developer/docs/help/reference/kmc/cli/get-started.md +++ b/developer/docs/help/reference/kmc/cli/get-started.md @@ -110,7 +110,7 @@ hamburger menu in the Keyman app. **Web**: copy khmer_angkor.js to your website, then [load it with KeymanWeb][load-keymanweb-keyboard]: ```js -keyman.addKeyboards({ +await keyman.addKeyboards({ id:'khmer_angkor', // The keyboard's unique identification code. name:'Khmer Angkor', // The keyboard's user-readable name. language:{ diff --git a/developer/src/kmc/README.md b/developer/src/kmc/README.md index 0490998e4d..05fd265a50 100644 --- a/developer/src/kmc/README.md +++ b/developer/src/kmc/README.md @@ -109,7 +109,7 @@ hamburger menu in the Keyman app. **Web**: copy khmer_angkor.js to your website, then [load it with KeymanWeb][load-keymanweb-keyboard]: ```js -keyman.addKeyboards({ +await keyman.addKeyboards({ id:'khmer_angkor', // The keyboard's unique identification code. name:'Khmer Angkor', // The keyboard's user-readable name. language:{ diff --git a/web/docs/engine/guide/adding-keyboards.md b/web/docs/engine/guide/adding-keyboards.md index 221f495de1..2874d449bc 100644 --- a/web/docs/engine/guide/adding-keyboards.md +++ b/web/docs/engine/guide/adding-keyboards.md @@ -8,8 +8,8 @@ There are multiple ways to add and install keyboards into your KeymanWeb install The most efficient way to utilize a keyboard is to obtain a local copy of it and place this copy in a static location on your website. Once this is done, it can be directly linked into KeymanWeb as follows. -```c -keyman.addKeyboards({ +```typescript +await keyman.addKeyboards({ id:'us', // The keyboard's unique identification code. name:'English', // The keyboard's user-readable name. language:{ @@ -22,7 +22,7 @@ keyman.addKeyboards({ Custom fonts may also be utilized via the `language.font` property. For example: -```c +```typescript font:{ family:'LaoWeb', source:['../font/saysettha_web.ttf','../font/saysettha_web.woff','../font/saysettha_web.eot'] @@ -33,16 +33,16 @@ font:{ To obtain the default Keyman keyboard for a given language, call the following function. -```c -keyman.addKeyboardsForLanguage('Dzongkha'); +```typescript +await keyman.addKeyboardsForLanguage('Dzongkha'); ``` This example would find the default keyboard for the Dzongkha language. This method will fail if the name doesn't perfectly match any language found in the CDN's repository. Alternatively, languages may be looked up via their BCP 47 language code as follows: -```c -keyman.addKeyboards('@he') +```typescript +await keyman.addKeyboards('@he') ``` The `@` prefix indicates the use of the BCP 47 language code, which in this case corresponds with Hebrew. @@ -51,8 +51,8 @@ The `@` prefix indicates the use of the BCP 47 language code, which in this case To obtain a specific keyboard by name or by keyboard name and language code as a pair, see the following: -```c -keyman.addKeyboards('french','sil_euro_latin@sv','sil_euro_latin@no') +```typescript +await keyman.addKeyboards('french','sil_euro_latin@sv','sil_euro_latin@no') ``` This will install three keyboards - one for French (named, quite simply, "French") and two copies of the EuroLatin keyboard - one for Swedish and one for Norwegian. diff --git a/web/docs/engine/guide/examples/__auto-control.html b/web/docs/engine/guide/examples/__auto-control.html index efe5467bfd..c2a8b472b0 100644 --- a/web/docs/engine/guide/examples/__auto-control.html +++ b/web/docs/engine/guide/examples/__auto-control.html @@ -3,8 +3,8 @@ - @@ -20,8 +19,8 @@ // Disable KeymanWeb interaction on the 'Email to' TEXT control keyman.disableControl(document.f.address); - // Set the default keyboard for the 'Subject' TEXT control to 'off' (i.e. default - // browser keyboard) + // Set the default keyboard for the 'Subject' TEXT control to the first language + // added to KeymanWeb after initialization. keyman.setKeyboardForControl(document.f.subject, '', ''); // Set the default keyboard for the 'Message body' TEXTAREA to the LaoKeys keyboard keyman.setKeyboardForControl(document.f.text, 'Keyboard_laokeys', 'lo'); @@ -42,4 +41,4 @@ Back to Document - \ No newline at end of file + diff --git a/web/docs/engine/guide/examples/__first-example.html b/web/docs/engine/guide/examples/__first-example.html index ece6a9b9ea..24a58c4891 100644 --- a/web/docs/engine/guide/examples/__first-example.html +++ b/web/docs/engine/guide/examples/__first-example.html @@ -10,9 +10,9 @@ diff --git a/web/docs/engine/guide/examples/automatic-control.md b/web/docs/engine/guide/examples/automatic-control.md index 14b703d35a..d185e4efe3 100644 --- a/web/docs/engine/guide/examples/automatic-control.md +++ b/web/docs/engine/guide/examples/automatic-control.md @@ -13,8 +13,8 @@ In this example, we use only the LaoKey keyboard. Please click [this link](./__a diff --git a/web/docs/engine/reference/core/addKeyboards.md b/web/docs/engine/reference/core/addKeyboards.md index fc5e3ce07b..fd4049f221 100644 --- a/web/docs/engine/reference/core/addKeyboards.md +++ b/web/docs/engine/reference/core/addKeyboards.md @@ -9,7 +9,7 @@ Adds keyboards to KeymanWeb. ## Syntax ```js -keyman.addKeyboards(spec[, spec...]) +await keyman.addKeyboards([spec...]) ``` ### Parameters @@ -179,3 +179,13 @@ The `spec.languages.font` object contains the following members: : `string` optional Font size (in CSS dimensions). If not specified, then `1em` is used. + +### Not passing any parameter + +Not passing any parameter will obtain the Keyman keyboards for English +from the CDN, i.e. these two functions calls are identical: + +```js +await keyman.addKeyboards(); +await keyman.addKeyboards('@en'); +``` diff --git a/web/docs/engine/reference/core/addKeyboardsForLanguage.md b/web/docs/engine/reference/core/addKeyboardsForLanguage.md index bf97a06b8d..e3a1e553c7 100644 --- a/web/docs/engine/reference/core/addKeyboardsForLanguage.md +++ b/web/docs/engine/reference/core/addKeyboardsForLanguage.md @@ -9,7 +9,7 @@ Add default or all keyboards for a given language to KeymanWeb. ## Syntax ```js -keyman.addKeyboardsForLanguage(spec[, spec...]) +await keyman.addKeyboardsForLanguage(spec[, spec...]) ``` ### Parameters diff --git a/web/docs/engine/reference/core/getKeyboard.md b/web/docs/engine/reference/core/getKeyboard.md index 0d6f8eb52e..9b728995d0 100644 --- a/web/docs/engine/reference/core/getKeyboard.md +++ b/web/docs/engine/reference/core/getKeyboard.md @@ -8,7 +8,7 @@ Get keyboard meta data for the selected keyboard and language. ## Syntax -```c +```js keyman.getKeyboard(keyboardName, languageCode) ``` @@ -75,5 +75,5 @@ The `keyboard` object contains the following members: : `string` *optional* : The font packaged with the keyboard to properly display specialized OSK characters. -## See also +## See also - [keyman.addKeyboards()](addKeyboards) and its documentation about keyboard specification objects. diff --git a/web/docs/engine/reference/core/getKeyboards.md b/web/docs/engine/reference/core/getKeyboards.md index 8d84521b31..cd8b0f2d9c 100644 --- a/web/docs/engine/reference/core/getKeyboards.md +++ b/web/docs/engine/reference/core/getKeyboards.md @@ -8,7 +8,7 @@ Get details of currently installed keyboards. ## Syntax -```c +```js keyman.getKeyboards() ``` @@ -25,5 +25,5 @@ None. See [keyman.getKeyboard()](getKeyboard) for detail on the returned keyboard specification objects. -## See also +## See also - [keyman.addKeyboards()](addKeyboards) diff --git a/web/docs/engine/reference/interface/registerStub.md b/web/docs/engine/reference/interface/registerStub.md index 2d9c8ef5a8..9dc8e10c34 100644 --- a/web/docs/engine/reference/interface/registerStub.md +++ b/web/docs/engine/reference/interface/registerStub.md @@ -8,13 +8,13 @@ Registers the keyboard stub or returns true if already registered. ## Syntax -```c +```js keyman.interface.registerStub(Pstub); ``` or -```c +```js KeymanWeb.KRS(Pstub); // Shorthand ``` diff --git a/web/src/app/ui/kmwuitoolbar.ts b/web/src/app/ui/kmwuitoolbar.ts index cf736777f9..6ed8d82e23 100644 --- a/web/src/app/ui/kmwuitoolbar.ts +++ b/web/src/app/ui/kmwuitoolbar.ts @@ -1150,8 +1150,8 @@ if(!keymanweb) { internalName: string, languageCode: string }) => { // Uses a different format than .getKeyboards(), b/c why not? - // https://help.keyman.com/developer/engine/web/16.0/reference/core/getKeyboards vs - // https://help.keyman.com/developer/engine/web/16.0/reference/events/kmw.keyboardchange + // https://help.keyman.com/developer/engine/web/current-version/reference/core/getKeyboards vs + // https://help.keyman.com/developer/engine/web/current-version/reference/events/kmw.keyboardchange this.lastSelectedKeyboard = null; const kbName=p.internalName, lgName=keymanweb.util.getLanguageCodes(p.languageCode)[0]; diff --git a/web/src/samples/complex/root/pages/index.html b/web/src/samples/complex/root/pages/index.html index 8da72fcccb..2e8122b1da 100644 --- a/web/src/samples/complex/root/pages/index.html +++ b/web/src/samples/complex/root/pages/index.html @@ -44,9 +44,9 @@ // KMW will look for them here - two folders up from root, which is the base sample directory. keyboards: '/../../', attachType:'auto' - }).then(function() { + }).then(async function() { // Loads keyboards from the base sample folder - keyman.addKeyboards({ + await keyman.addKeyboards({ id:'us', name:'English', languages: { @@ -57,7 +57,7 @@ filename: 'us-1.0.js' }); // For contrast: - keyman.addKeyboards({ + await keyman.addKeyboards({ id:'lao_2008_basic', name:'Lao Basic', languages: { @@ -73,12 +73,12 @@ // 1. keyboard name ('french'), // 2. keyboard name and language code ('sil_euro_latin@no,sv'), // 3. or just the BCP-47 language code ('@he'). - keyman.addKeyboards('french', 'sil_euro_latin@no,sv', '@he'); + await keyman.addKeyboards('french', 'sil_euro_latin@no,sv', '@he'); // Add a keyboard by language name. Note that the name must be spelled // correctly, or the keyboard will not be found. (Using BCP-47 codes is // usually easier.) - doAddKeyboardsForLanguage('Dzongkha'); + await doAddKeyboardsForLanguage('Dzongkha'); }); diff --git a/web/src/samples/samplehdr.js b/web/src/samples/samplehdr.js index ad9dd762a3..d3f89e5c4a 100644 --- a/web/src/samples/samplehdr.js +++ b/web/src/samples/samplehdr.js @@ -43,9 +43,9 @@ function errToString(err) { // Painful? Kinda. But needed on un-updated Android API 21! if(Array.isArray(err)) { - var result = ''; - for(var i = 0; i < err.length; i++) { - var e = err[i]; + let result = ''; + for(let i = 0; i < err.length; i++) { + const e = err[i]; if(e.error instanceof Error) { result += e.error.message + '\n'; } else { @@ -73,13 +73,13 @@ } async function loadKeyboards(nestLevel) { - var base_prefix = '../'; - var prefix = './'; // The default - when prefix == 0. + const base_prefix = '../'; + let prefix = './'; // The default - when prefix == 0. if(nestLevel !== undefined && nestLevel > 0) { prefix = ''; - for(var i=0; i < nestLevel; i++) { - prefix = prefix + base_prefix; + for(let i=0; i < nestLevel; i++) { + prefix += base_prefix; } } @@ -116,29 +116,31 @@ } // Script to allow a user to add any keyboard to the keyboard menu - function addKeyboard(n) { - var sKbd; + async function addKeyboard(n) { + let sKbd; switch(n) { case 1: sKbd=document.getElementById('kbd_id1').value; - doAddKeyboards(sKbd); + await doAddKeyboards(sKbd); break; case 2: sKbd=document.getElementById('kbd_id2').value.toLowerCase(); - doAddKeyboards('@'+sKbd); + await doAddKeyboards('@'+sKbd); break; case 3: // Add keyboard for comma-separated language name(s) sKbd=document.getElementById('kbd_id3').value; - doAddKeyboardsForLanguage(sKbd); + await doAddKeyboardsForLanguage(sKbd); break; } } // Add keyboard on Enter (as well as pressing button) - function clickOnEnter(e,id) + async function clickOnEnter(e,id) { e = e || window.event; - if(e.keyCode == 13) addKeyboard(id); + if (e.keyCode == 13) { + await addKeyboard(id); + } } diff --git a/web/src/samples/subfolder_toolbar/index.html b/web/src/samples/subfolder_toolbar/index.html index e3813e4b52..8a4c8d6b03 100644 --- a/web/src/samples/subfolder_toolbar/index.html +++ b/web/src/samples/subfolder_toolbar/index.html @@ -30,8 +30,8 @@ diff --git a/web/src/test/manual/web/build-visual-keyboard/index.html b/web/src/test/manual/web/build-visual-keyboard/index.html index 54a47172d0..77ccc07fbc 100644 --- a/web/src/test/manual/web/build-visual-keyboard/index.html +++ b/web/src/test/manual/web/build-visual-keyboard/index.html @@ -75,8 +75,8 @@ const container = document.createElement('div'); - await kmw.addKeyboards(`${kbdid}@${langid}`); - await kmw.setActiveKeyboard(kbdid, langid); + await keyman.addKeyboards(`${kbdid}@${langid}`); + await keyman.setActiveKeyboard(kbdid, langid); docBase = keyman.BuildVisualKeyboard(kbdid, 1, formFactor, layer); label.textContent = `${keyman.getKeyboard(kbdid).Name} - ${formFactor} - ${layer} layer`; @@ -94,6 +94,7 @@ } keyman.init().then(async function() { + await loadKeyboards(1); await documentKeyboard("gff_amharic", "am", "phone", "default"); await documentKeyboard("sil_euro_latin", "no", "phone", "shift"); await documentKeyboard("lao_2008_basic", "lo", "tablet", "default"); diff --git a/web/src/test/manual/web/ckeditor/index.html b/web/src/test/manual/web/ckeditor/index.html index 25dfc7e9e8..16de19ba02 100644 --- a/web/src/test/manual/web/ckeditor/index.html +++ b/web/src/test/manual/web/ckeditor/index.html @@ -32,9 +32,7 @@ diff --git a/web/src/test/manual/web/ckeditor/inline.html b/web/src/test/manual/web/ckeditor/inline.html index f54d98e0ff..06ec8ca0e5 100644 --- a/web/src/test/manual/web/ckeditor/inline.html +++ b/web/src/test/manual/web/ckeditor/inline.html @@ -32,9 +32,7 @@ diff --git a/web/src/test/manual/web/default-subkey/index.html b/web/src/test/manual/web/default-subkey/index.html index 6ce3bee562..22f00ef3fe 100644 --- a/web/src/test/manual/web/default-subkey/index.html +++ b/web/src/test/manual/web/default-subkey/index.html @@ -38,8 +38,8 @@ diff --git a/web/src/test/manual/web/issue103/index.html b/web/src/test/manual/web/issue103/index.html index e242071511..53c0447cbd 100644 --- a/web/src/test/manual/web/issue103/index.html +++ b/web/src/test/manual/web/issue103/index.html @@ -38,8 +38,8 @@ diff --git a/web/src/test/manual/web/issue103/samplehdr.js b/web/src/test/manual/web/issue103/samplehdr.js index 51a38e4eff..bf8cabae0c 100644 --- a/web/src/test/manual/web/issue103/samplehdr.js +++ b/web/src/test/manual/web/issue103/samplehdr.js @@ -1,25 +1,25 @@ // Modified version of commonHeader - contains repeated requests for the same language. - function loadKeyboards() { + async function loadKeyboards() { // The first keyboard added will be the default keyboard for touch devices. // For faster loading, it may be best for the default keyboard to be // locally sourced. - keyman.addKeyboards({id:'us',name:'English',languages:{id:'en',name:'English'}, + await keyman.addKeyboards({id:'us',name:'English',languages:{id:'en',name:'English'}, filename:'../us-1.0.js'}); // Add more keyboards to the language menu, by keyboard name, // keyboard name and language code, or just the BCP-47 language code. - keyman.addKeyboards('french','european2@sv','european2@sv','european2@sv','european2@sv','european2@sv','european2@sv','european2@no','@he'); - keyman.addKeyboards('@he'); - keyman.addKeyboards('@he'); + await keyman.addKeyboards('french','european2@sv','european2@sv','european2@sv','european2@sv','european2@sv','european2@sv','european2@no','@he'); + await keyman.addKeyboards('@he'); + await keyman.addKeyboards('@he'); // Add a keyboard by language name. Note that the name must be spelled // correctly, or the keyboard will not be found. (Using BCP-47 codes is // usually easier.) - keyman.addKeyboardsForLanguage('Dzongkha'); + await keyman.addKeyboardsForLanguage('Dzongkha'); // Add a fully-specified, locally-sourced, keyboard with custom font - keyman.addKeyboards({id:'lao_2008_basic',name:'Lao Basic', + await keyman.addKeyboards({id:'lao_2008_basic',name:'Lao Basic', languages:{ id:'lo',name:'Lao',region:'Asia' }, @@ -38,29 +38,31 @@ } // Script to allow a user to add any keyboard to the keyboard menu - function addKeyboard(n) + async function addKeyboard(n) { let sKbd; switch(n) { case 1: sKbd=document.getElementById('kbd_id1').value; - keyman.addKeyboards(sKbd); + await keyman.addKeyboards(sKbd); break; case 2: sKbd=document.getElementById('kbd_id2').value.toLowerCase(); - keyman.addKeyboards('@'+sKbd); + await keyman.addKeyboards('@'+sKbd); break; case 3: sKbd=document.getElementById('kbd_id3').value; - keyman.addKeyboardsForLanguage(sKbd); + await keyman.addKeyboardsForLanguage(sKbd); break; } } // Add keyboard on Enter (as well as pressing button) - function clickOnEnter(e,id) { + async function clickOnEnter(e,id) { e = e || window.event; - if(e.keyCode == 13) addKeyboard(id); + if (e.keyCode == 13) { + await addKeyboard(id); + } } From 19e397de3532dc42f13cde0f96922135fb034aa9 Mon Sep 17 00:00:00 2001 From: Keyman Build Agent Date: Mon, 8 Jun 2026 13:02:23 -0500 Subject: [PATCH 22/38] auto: increment master version to 19.0.244 Test-bot: skip Build-bot: skip --- HISTORY.md | 9 +++++++++ VERSION.md | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/HISTORY.md b/HISTORY.md index 7c83b63e6a..53fbcf5934 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,14 @@ # Keyman Version History +## 19.0.243 alpha 2026-06-08 + +* fix(developer): reduce km_core_keyboard_attrs size to 12 (#16075) +* chore(deps): bump minimatch in /core/tests/unit/wasm (#16045) +* chore(deps): bump glob from 10.4.5 to 10.5.0 in /core/tests/unit/wasm (#16046) +* chore(deps-dev): bump js-yaml from 4.1.0 to 4.2.0 in /core/tests/unit/wasm (#16047) +* chore(deps-dev): bump picomatch from 2.3.1 to 2.3.2 in /core/tests/unit/wasm (#16048) +* chore(deps): bump qs and express (#16009) + ## 19.0.242 alpha 2026-06-03 * fix(web): fix displaying of keyboard menu (#16061) diff --git a/VERSION.md b/VERSION.md index 1b1ffdead8..9cfd5bdf98 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1 +1 @@ -19.0.243 \ No newline at end of file +19.0.244 \ No newline at end of file From 135de352c4ba67166669975356f7db6edfee2212 Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Tue, 9 Jun 2026 17:11:43 +0200 Subject: [PATCH 23/38] Apply suggestions from code review Co-authored-by: Marc Durdin --- web/docs/engine/guide/adding-keyboards.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/docs/engine/guide/adding-keyboards.md b/web/docs/engine/guide/adding-keyboards.md index 2874d449bc..957df80270 100644 --- a/web/docs/engine/guide/adding-keyboards.md +++ b/web/docs/engine/guide/adding-keyboards.md @@ -42,7 +42,7 @@ This example would find the default keyboard for the Dzongkha language. This met Alternatively, languages may be looked up via their BCP 47 language code as follows: ```typescript -await keyman.addKeyboards('@he') +await keyman.addKeyboards('@he'); ``` The `@` prefix indicates the use of the BCP 47 language code, which in this case corresponds with Hebrew. @@ -52,7 +52,7 @@ The `@` prefix indicates the use of the BCP 47 language code, which in this case To obtain a specific keyboard by name or by keyboard name and language code as a pair, see the following: ```typescript -await keyman.addKeyboards('french','sil_euro_latin@sv','sil_euro_latin@no') +await keyman.addKeyboards('french', 'sil_euro_latin@sv', 'sil_euro_latin@no'); ``` This will install three keyboards - one for French (named, quite simply, "French") and two copies of the EuroLatin keyboard - one for Swedish and one for Norwegian. From cf3d87d2f377fe7127731906a22acf9429b5c87e Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Tue, 9 Jun 2026 15:30:55 +0200 Subject: [PATCH 24/38] chore(web): update sample doc to match sample html The guide examples load `keymanweb.js` from the CDN, but the documentation explaining the examples showed loading local file. This change adjusts the docs to show loading from CDN. Built-bot: skip Test-bot: skip --- web/docs/engine/guide/examples/automatic-control.md | 2 +- web/docs/engine/guide/examples/control-by-control.md | 8 ++------ web/docs/engine/guide/examples/full-manual-control.md | 5 +---- web/docs/engine/guide/examples/manual-control.md | 5 +---- 4 files changed, 5 insertions(+), 15 deletions(-) diff --git a/web/docs/engine/guide/examples/automatic-control.md b/web/docs/engine/guide/examples/automatic-control.md index d185e4efe3..6e6231d09d 100644 --- a/web/docs/engine/guide/examples/automatic-control.md +++ b/web/docs/engine/guide/examples/automatic-control.md @@ -11,7 +11,7 @@ In this example, we use only the LaoKey keyboard. Please click [this link](./__a ```html - + - + + - - - - ``` --- diff --git a/web/docs/engine/guide/examples/full-manual-control.md b/web/docs/engine/guide/examples/full-manual-control.md index c958bd87d9..e9c56a3a0c 100644 --- a/web/docs/engine/guide/examples/full-manual-control.md +++ b/web/docs/engine/guide/examples/full-manual-control.md @@ -47,14 +47,11 @@ Also include the following HTML code: ```html - + - - - ``` - File: [unified_loader.js](js/unified_loader.js) diff --git a/web/docs/engine/guide/examples/manual-control.md b/web/docs/engine/guide/examples/manual-control.md index 3f536d02e8..7a6f4f0988 100644 --- a/web/docs/engine/guide/examples/manual-control.md +++ b/web/docs/engine/guide/examples/manual-control.md @@ -33,13 +33,10 @@ Also include the following HTML code: ```html - + - - - ``` - File: [laokeys_load.js](js/laokeys_load.js) From cea706c562b87c3515ad24f5e7b44d4ca972fc44 Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Tue, 9 Jun 2026 17:13:47 +0200 Subject: [PATCH 25/38] chore(web): address code review comments --- .../guide/examples/__control-by-control.html | 9 +- .../engine/reference/core/addKeyboards.md | 8 +- web/src/samples/samplehdr.js | 79 ++--- web/src/test/manual/web/commonHeader.js | 272 ++++++++---------- web/src/test/manual/web/issue103/samplehdr.js | 112 ++++---- 5 files changed, 218 insertions(+), 262 deletions(-) diff --git a/web/docs/engine/guide/examples/__control-by-control.html b/web/docs/engine/guide/examples/__control-by-control.html index a76cb12fd2..4f6e6d4850 100644 --- a/web/docs/engine/guide/examples/__control-by-control.html +++ b/web/docs/engine/guide/examples/__control-by-control.html @@ -10,7 +10,7 @@ - - - - ``` -- File: [laokeys_load.js](js/laokeys_load.js) - And finally, include the control img for KeymanWeb: ```html diff --git a/web/src/engine/src/main/keyboardInterfaceBase.ts b/web/src/engine/src/main/keyboardInterfaceBase.ts index 4f83056103..fbf1d20f24 100644 --- a/web/src/engine/src/main/keyboardInterfaceBase.ts +++ b/web/src/engine/src/main/keyboardInterfaceBase.ts @@ -85,7 +85,6 @@ export class KeyboardInterfaceBase Date: Tue, 9 Jun 2026 13:01:55 -0500 Subject: [PATCH 31/38] auto: increment master version to 19.0.245 Test-bot: skip Build-bot: skip --- HISTORY.md | 7 +++++++ VERSION.md | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/HISTORY.md b/HISTORY.md index 53fbcf5934..436ef8c5f5 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,12 @@ # Keyman Version History +## 19.0.244 alpha 2026-06-09 + +* refactor(web): extract function, rename variables (#16063) +* refactor(web): reformatting of files (#16066) +* chore(web): improve the KeymanWeb integration documentation (#16064) +* chore(web): more improvements to documentation (#16070) + ## 19.0.243 alpha 2026-06-08 * fix(developer): reduce km_core_keyboard_attrs size to 12 (#16075) diff --git a/VERSION.md b/VERSION.md index 9cfd5bdf98..fdf064ce16 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1 +1 @@ -19.0.244 \ No newline at end of file +19.0.245 \ No newline at end of file From a005e45d25c438d55d577ef3a22dbc22a7f4ff3b Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Tue, 9 Jun 2026 20:58:12 +0200 Subject: [PATCH 32/38] chore: Apply suggestions from code review Co-authored-by: rc-swag <58423624+rc-swag@users.noreply.github.com> --- .../src/tike/compile/Keyman.Developer.System.KmcWrapper.pas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/developer/src/tike/compile/Keyman.Developer.System.KmcWrapper.pas b/developer/src/tike/compile/Keyman.Developer.System.KmcWrapper.pas index f64e961b15..6c33760ffc 100644 --- a/developer/src/tike/compile/Keyman.Developer.System.KmcWrapper.pas +++ b/developer/src/tike/compile/Keyman.Developer.System.KmcWrapper.pas @@ -63,7 +63,7 @@ begin else cmdline := cmdline + ['--no-compiler-warnings-as-errors']; - if not FGlobalProject.Options.WarnDeprecatedCode then + if Assigned(FGlobalProject) and (not FGlobalProject.Options.WarnDeprecatedCode) then cmdline := cmdline + ['--no-warn-deprecated-code']; if debug then From a47fd7d36584d593f44096bc3c32e2805354b0a9 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Wed, 10 Jun 2026 05:43:42 +0200 Subject: [PATCH 33/38] fix: use meson subsystem and needs_exe_wrapper for cross builds on Windows Relates-to: mesonbuild/meson#15840 Fixes: #15753 Test-bot: skip --- .github/workflows/core-arm64-windows-test.yml | 2 +- core/cross-arm64.build | 1 + core/cross-x64.build | 4 ++++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/core-arm64-windows-test.yml b/.github/workflows/core-arm64-windows-test.yml index 0eb4e8f8f6..76d273de22 100644 --- a/.github/workflows/core-arm64-windows-test.yml +++ b/.github/workflows/core-arm64-windows-test.yml @@ -119,7 +119,7 @@ jobs: - name: Install meson shell: bash run: | - pip3 install --user meson==1.10.1 + pip3 install --user meson==1.11.0 - name: Run test shell: bash diff --git a/core/cross-arm64.build b/core/cross-arm64.build index 9fd7cc6d14..7bea64992e 100644 --- a/core/cross-arm64.build +++ b/core/cross-arm64.build @@ -1,5 +1,6 @@ [host_machine] system = 'windows' +subsystem = 'windows' cpu_family = 'aarch64' cpu = 'arm64' endian = 'little' diff --git a/core/cross-x64.build b/core/cross-x64.build index df3ab0b5dc..ecc0486e08 100644 --- a/core/cross-x64.build +++ b/core/cross-x64.build @@ -1,5 +1,6 @@ [host_machine] system = 'windows' +subsystem = 'windows' cpu_family = 'x86_64' cpu = 'x86_64' endian = 'little' @@ -11,3 +12,6 @@ ar = 'lib' ld = 'link' strip = 'llvm-strip' pkgconfig = 'pkg-config' + +[properties] +needs_exe_wrapper = false From 6cd27503fe1c08390f03f21ef9b58075c61975d9 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Wed, 10 Jun 2026 10:28:09 +0200 Subject: [PATCH 34/38] docs(windows): add context documentation for additional Advanced options Add Base Keyboard, Proxy Settings, and Keyman System Settings documentation and links to the Options context help. Fixes: keymanapp/help.keyman.com#10 Test-bot: skip --- windows/docs/help/basic/config/options.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/windows/docs/help/basic/config/options.md b/windows/docs/help/basic/config/options.md index 3b4bbd86b0..f4084f6465 100644 --- a/windows/docs/help/basic/config/options.md +++ b/windows/docs/help/basic/config/options.md @@ -180,6 +180,28 @@ To open the Options tab of Keyman Configuration: log on for short and isolated tests as specifically requested by Keyman Technical Support. +- Proxy Settings + + In some environments, you may need to configure proxy settings in + order to download keyboards or updates for Keyman. Check with your + network administrator. More information is available in the + [Proxy Configuration](../../advanced/proxy_config) documentation. + +- Keyman System Settings + + The Keyman System Settings dialog provides access to various low-level + Keyman configuration settings. Generally, these settings do not need + to be changed, unless you instructed to do so by Keyman support staff. + +- Base Keyboard + + The Base Keyboard dialog allows you to select the physical Latin-script + layout of your keyboard, which will allow certain Keyman keyboards to remap + themselves dynamically to match your key caps. + + [Base Keyboard dialog](../../context/base-keyboard) + + ## Related Topics - [Keyman Configuration](../config/) From 624e076fe7e46513742e1d167eb5beb7feedb056 Mon Sep 17 00:00:00 2001 From: Keyman Build Agent Date: Wed, 10 Jun 2026 13:02:19 -0500 Subject: [PATCH 35/38] auto: increment master version to 19.0.246 Test-bot: skip Build-bot: skip --- HISTORY.md | 7 +++++++ VERSION.md | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/HISTORY.md b/HISTORY.md index 436ef8c5f5..fa463aa2a4 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,12 @@ # Keyman Version History +## 19.0.245 alpha 2026-06-10 + +* chore(web): hide KMX keyboard test page (#16083) +* docs(web): remove unnecessary mentioning of Keyman 17 from docs (#16085) +* chore(web): remove outdated `*_load.js` files (#16086) +* fix(web): fix `KeyboardStub.validateForCustomKeyboard` (#16067) + ## 19.0.244 alpha 2026-06-09 * refactor(web): extract function, rename variables (#16063) diff --git a/VERSION.md b/VERSION.md index fdf064ce16..825791dd34 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1 +1 @@ -19.0.245 \ No newline at end of file +19.0.246 \ No newline at end of file From e9a85dfd2f8f3bf6bcc0ade07a1cfee06ecc00b2 Mon Sep 17 00:00:00 2001 From: Keyman Build Agent Date: Mon, 15 Jun 2026 13:02:00 -0500 Subject: [PATCH 36/38] auto: increment master version to 19.0.247 Test-bot: skip Build-bot: skip --- HISTORY.md | 6 ++++++ VERSION.md | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/HISTORY.md b/HISTORY.md index fa463aa2a4..4ef4e13561 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,11 @@ # Keyman Version History +## 19.0.246 alpha 2026-06-15 + +* feat(developer): run project validation from IDE (#16076) +* fix(core): use meson subsystem and needs_exe_wrapper for cross builds on Windows (#16088) +* docs(windows): add context documentation for additional Advanced options (#16089) + ## 19.0.245 alpha 2026-06-10 * chore(web): hide KMX keyboard test page (#16083) diff --git a/VERSION.md b/VERSION.md index 825791dd34..5c233ca148 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1 +1 @@ -19.0.246 \ No newline at end of file +19.0.247 \ No newline at end of file From 72a17703216109d1e1852340fbfb126ef7545755 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Tue, 16 Jun 2026 10:33:34 +0200 Subject: [PATCH 37/38] chore: update multi-labeler to 5.0.0 Also update actions/labeler to 6.1.0. This moves to node v24. Relates-to: keymanapp/s.keyman.com#1607 --- .github/workflows/labeler.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index ee7fe7d03d..9eb25a49e7 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -8,12 +8,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Update labels based on changed files - uses: actions/labeler@634933edcd8ababfe52f92936142cc22ac488b1b # v6.0.1 + uses: actions/labeler@f27b608878404679385c85cfa523b85ccb86e213 # v6.1.0 with: repo-token: "${{ secrets.GITHUB_TOKEN }}" - name: Update labels based on PR title id: labeler - uses: fuxingloh/multi-labeler@f5bd7323b53b0833c1e4ed8d7b797ae995ef75b4 # v2.0.1 + uses: fuxingloh/multi-labeler@bcd50af464202999e57f556b4aefcf05a34abf85 # v5.0.0 with: github-token: ${{secrets.GITHUB_TOKEN}} config-path: .github/multi-labeler.yml From 06eb7dee930b5e1f01a3cb99e02d6cbd95417475 Mon Sep 17 00:00:00 2001 From: Keyman Build Agent Date: Tue, 16 Jun 2026 13:01:42 -0500 Subject: [PATCH 38/38] auto: increment master version to 19.0.248 Test-bot: skip Build-bot: skip --- HISTORY.md | 4 ++++ VERSION.md | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/HISTORY.md b/HISTORY.md index 4ef4e13561..f2d3cab56b 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,9 @@ # Keyman Version History +## 19.0.247 alpha 2026-06-16 + +* chore: update multi-labeler to 5.0.0 (#16100) + ## 19.0.246 alpha 2026-06-15 * feat(developer): run project validation from IDE (#16076) diff --git a/VERSION.md b/VERSION.md index 5c233ca148..a0b5f4d5f2 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1 +1 @@ -19.0.247 \ No newline at end of file +19.0.248 \ No newline at end of file