Commit graph

3302 commits

Author SHA1 Message Date
Marc Durdin
bc47b53a9b fix(windows): PreservedKeyMap::MapUSCharToVK line order bug
I discovered this while working on #4586. The code in question was
updating `*puKey` and then trying to dereference the array on the basis
of its new value, which (a) would give the wrong result, and (b) could
be reading off the end of the array (although not crashing it seems),
e.g. for `"` -> `VK_QUOTE`, which has a value of `0xDE`.

I am guessing that the reason we have not seen any bug reports on this
is that the keystroke handler falls back to an alternate code path, so
in the vast majority of cases, keyboards would continue to work
correctly. Furthermore, the test was just for truthiness of the `BOOL`
so probably at least 50% of the time we'd have been okay anyway. Or
something. Anyway, I reckon this is better.
2021-03-05 06:55:14 +11:00
Marc Durdin
6a247cd081 fix(developer): tidy up expansions tests 2021-03-05 06:49:13 +11:00
Marc Durdin
103e46c0d5
Merge pull request #4584 from keymanapp/feat/developer/2241-expansions
feat(developer): Range expansions
2021-03-04 15:05:32 +11:00
Marc Durdin
b7765483ec
Merge pull request #4576 from keymanapp/feat/developer/4314-open-containing-folder-options
feat(developer): Add different Open Containing Folder buttons
2021-03-04 15:05:19 +11:00
Marc Durdin
d536345a20
Merge pull request #4574 from keymanapp/fix/developer/2789-support-all-fonts-keyboard-fonts-dialog
fix(developer): Support all fonts in Keyboard Fonts dialog
2021-03-04 15:05:10 +11:00
Marc Durdin
0cbd053cda
Merge pull request #4571 from keymanapp/fix/developer/4278-improve-cef-location-search-stability
fix(developer): improve CEF location search stability
2021-03-04 15:05:02 +11:00
Marc Durdin
e9e4e7bcb6 feat(developer): &CasedKeys system store
Fixes #2241.

The `&CasedKeys` system store is a compiler feature that reduces the
repetitive nature of keyboard rules for `CAPS` and `NCAPS`. The
`&CasedKeys` system store defines a list of virtual keys for which
'normal' Caps Lock rules apply. This store has no default value, for
backward compatibility.

Once this store is defined, then you can define just the unshifted and
shifted versions of a rule, and Keyman Developer will synthesize the
`CAPS` and `NCAPS` versions of the rule. For example, you may have the
following rules:

```
store(&CasedKeys) [K_A]
+ [K_A] > 'α'
+ [SHIFT K_A] > 'Α'
```

These would be replaced by the compiler with:

```
store(&CasedKeys) [K_A]
+ [NCAPS K_A] > 'α'
+ [SHIFT CAPS K_A] > 'α'
+ [CAPS K_A] > 'Α'
+ [SHIFT NCAPS K_A] > 'Α'
```

You can also use this functionality with characters in the key part of
the rule:

```
store(&CasedKeys) 'a'..'c'
+ 'a' > 'α'
+ 'A' > 'Α'
```

and the compiled expansion would be similar:

```
store(&CasedKeys) [K_A] [K_B] [K_C]
+ [NCAPS K_A] > 'α'
+ [SHIFT CAPS K_A] > 'α'
+ [CAPS K_A] > 'Α'
+ [SHIFT NCAPS K_A] > 'Α'
```

This feature is backwardly compatible with Keyman 6.0, as it is entirely
implemented in the compiler.

This feature is not compatible with mnemonic layouts, and the keys
defined in the `&CasedKeys` store must be the unshifted base keys as
found on a US English keyboard, or you can use ISO9995 identifiers if
you prefer.

If you define a rule where you specify either `NCAPS` or `CAPS`, for a
key found in the store, then no change will be made to that rule. You
can also continue to define rules which use `NCAPS` or `CAPS` for keys
not found in the store.

As a side-benefit, this allows the visual designer to be used and
support Caps Lock, although at this stage, the `&CasedKeys` store is not
surfaced in the visual designer.
2021-03-04 13:41:04 +11:00
Marc Durdin
49131de2c6 chore: fixup encoding 2021-03-04 10:15:53 +11:00
Marc Durdin
7e424aaa62 chore(developer): tweak expansion test 2021-03-04 10:12:24 +11:00
Marc Durdin
fe5de67c1f feat(developer): Range expansions
Relates to #2241.

Range expansions are a new language feature that reduce verbosity in
Keyman Keyboard Language (.kmn) files by making it possible to collapse
sequential ranges with a new `..` operator. It is envisioned that these
will be used primarily in stores.

Two kinds of expansions are available: character ranges, and virtual key
ranges.

The syntax is:

```
char '..' char
vkey '..' vkey
```

Where the `char` terminator is a single normal character, and the `vkey`
terminator is a single virtual key. `outs` is permissible for
terminators but no other statement is allowed. Whitespace is per normal
Keyman keyboard language syntax.

Character ranges will replace the range with the set of characters
between the terminators, based on the Unicode value of the terminators.

Examples:

```
store(alphabet) 'a' .. 'z'
store(alpha_not_bq) 'ac'..'pr'..'z'
store(capitals) U+0041 .. U+005A
```

Virtual key ranges work in a similar fashion, but with virtual keys. The
starting and terminating virtual key must have the same shift state.
This will be most useful for character and numeric virtual keys, as the
ranges are based on the numeric value of the virtual key as defined by
Windows, not its position on the keyboard.

Examples:

```
store(alphakeys) [K_A] .. [K_Z]
store(numkeys) [K_0] .. [K_9]
```

Ranges must be positive, that is, you cannot use `'z' .. 'a'`.

While this expansion is not expected to be very useful in rules, it is
still permitted. `context()` and other offsets are calculated on the
expanded form, not the collapsed form. Similarly, `any()`/`index()`
offsets are calculated on the expanded form.

'a' .. 'z' > context(3)  c this produces 'c', not 'z'

Because ranges are expanded at compile time, ranges that are overly
long will result in an error, so you cannot use, for example:

```
store(AllUnicode) U+0020 .. U+10FFFF
```

The precise maximum length of a range is dependent on the context where
it is used.

The changes are entirely compiler-based; no change is made to the .kmx
file format or to the Keyman apps.
2021-03-04 09:43:30 +11:00
Darcy Wong
f442dee615 chore(windows): Check in crowdin files for de 2021-03-03 14:47:43 +07:00
Marc Durdin
c595767e39 feat(developer): Add different Open Containing Folder buttons
Fixes #4314.

Adds 'Open Source Folder', 'Open Build Folder', and
'Open Project Folder' actions to various parts of Keyman Developer.
2021-03-03 15:36:11 +11:00
Marc Durdin
49f05e879d fix(developer): Support all fonts in Keyboard Fonts dialog
Fixes #2789.

The Keyboard Fonts dialog skipped some fonts which it did not recognise
as valid TrueType fonts. As a bonus, I've rewritten a few parts of it to
make it significantly faster to load.

I also turned off the font formatting for the list, as it was not very
helpful and hurt performance considerably.
2021-03-03 14:24:59 +11:00
Marc Durdin
6180b01a31
Merge pull request #4562 from keymanapp/fix/developer/3337-track-modified-state-wordlist-editor
fix(developer): track modified state in wordlist editor better
2021-03-03 10:48:21 +11:00
Marc Durdin
726e93bcc3
Merge pull request #4559 from keymanapp/feat/developer/2556-isRTL-support-for-lexical-models
feat(developer): isRTL support for lexical model editor
2021-03-03 10:47:34 +11:00
Marc Durdin
290d21f4c6 chore(developer): address review feedback 2021-03-03 10:45:52 +11:00
Marc Durdin
9ffc378fef chore(developer): fixup wxs path 2021-03-03 10:42:35 +11:00
Marc Durdin
2e61cb8e32 fix(developer): improve CEF location search stability
Fixes #4278.

When Keyman Developer is installed without Keyman for Windows, the
program silently crashes, because it is looking for libcef.dll in the
Keyman Desktop install folder rather than using its own copy of it.

This improves the search for libcef.dll and kmbrowserhost.exe, and
includes kmbrowserhost.exe with the Keyman Developer installation.

In the future, we could consider moving kmbrowserhost.exe into a common
folder (perhaps when we split Keyman for Windows and Keyman Developer
projects in 15.0).

I threw in a one-liner addressing a deprecated function warning in the
Developer build.
2021-03-03 10:05:04 +11:00
Marc Durdin
e4d09ece72
Merge pull request #4564 from keymanapp/fix/developer/3011-osk-import-avoid-blank-keys
fix(developer): Avoid blank keys when importing KMX to KVKS
2021-03-03 09:28:29 +11:00
Marc Durdin
16e5b9c358
Merge pull request #4563 from keymanapp/fix/developer/2998-package-compile-require-langugae-tag
fix(developer): require language tag when compiling keyboard package
2021-03-03 09:28:07 +11:00
Marc Durdin
a0734f153b
Merge pull request #4552 from keymanapp/fix/developer/2740-touch-editor-importing-osk-right-alt-layer
fix(developer): touch layout osk import handling of multiple modifiers
2021-03-03 09:27:11 +11:00
Marc Durdin
84c0202d85 chore(developer): tweak casing 2021-03-02 13:27:17 +11:00
Marc Durdin
85b9e04345 chore(developer): address review comment 2021-03-02 13:26:40 +11:00
Marc Durdin
36f5788651 fix(developer): Avoid blank keys when importing KMX to KVKS
Fixes #3011.

Keys that have only whitespace will no longer generate separate key data
for the on screen keyboard, as they have no visual presentation anyway.
2021-03-02 12:16:09 +11:00
Marc Durdin
1f87c7608c fix(developer): require language tag when compiling keyboard package
Fixes #2998.

Three parts to this:

* The package compiler will now give a warning if a keyboard in a
  package does not contain any language metadata.

* Removed old canonicalization check during compile which is now handled
  better in `TPackageInfoRefreshKeyboards`.

* Reduced non-canonical BCP 47 tag warnings in
  `TPackageInfoRefreshKeyboards` to "info" so they do not block the
  build.

Point 3 above is one part of the outcome of our BCP 47 discussion at:
https://docs.google.com/document/d/1N5CkTX7tlLlmUB9Mbd-LblY1ch1e642XxlTasC_WE_Q/edit#heading=h.fiy983iliay5
2021-03-02 11:59:12 +11:00
Marc Durdin
7ea7ba0e11 fix(developer): track modified state in wordlist editor better
Fixes #3337.

In some situations, the wordlist editor was not tracking modified state
100% correctly, which meant that edits could be lost. This resolves that
by simplifying the modification state tracking.
2021-03-02 09:27:18 +11:00
Marc Durdin
eb713ec274 feat(developer): isRTL support for lexical model editor
Fixes #2556.

This adds support for `isRTL`, `insertAfterWord`, and
`quotesForKeepSuggestions` punctuation options for lexical models, both
in the parsing and in the user interface. A number of options are
presented to the user for the quotes and word breaking characters.

The parser continues to be a regex-based typescriptish parser. Expect it
to be gross. It's too big a job to do properly right now, so it is
somewhat limited and will bail if it finds structures it can't
understand.

I would hope to use something a bit smarter in the future to interface
with the editor. Probably when we are actually fully web-based and can
depend on a Typescript compiler directly.

Please don't get mad at me! 😟😟😟
2021-03-01 21:46:51 +11:00
Marc Durdin
1fcfefa3cf fix(developer): support for smp names 2021-03-01 16:05:17 +11:00
Marc Durdin
3f54c81461 fix(developer): touch layout osk import handling of multiple modifiers
Fixes #2740.

The definitions for several of the combined modifiers was incorrect,
which led to a mismatch when attempting to import those layers from a
visual keyboard into the touch layout editor.
2021-03-01 15:44:55 +11:00
Marc Durdin
17c94770ef chore(windows): update test project 2021-03-01 10:34:30 +11:00
Marc Durdin
26b1d777f7 fix(developer): Improve stability of named code constants
Fixes #4423.

Using a named character constant with a store name that included
characters outside ascii could cause kmcmpdll to crash with an assertion
failure.

This fix allows store names defined in the .kmn file to use characters
outside ascii.

Note that more work needs to be done on which characters are acceptable
to use, as this is somewhat implementation-specific according to the C++
specification for `iswalpha`.

Added a test case to verify various named code constant examples.

Also removes dead code for `IsCJKUnifiedIdeograph` as this was never
used and somewhat pointless in any case.

NamedCodeConstants.cpp could stand to be rewritten using `std::map` or
equivalent. Current implementation is pretty icky.
2021-03-01 10:25:06 +11:00
Marc Durdin
d4bf9f910e
Merge pull request #4535 from keymanapp/fix/windows/4445-upgrade-of-14-re-registered-all-tips
fix(windows): prevent re-registration of TIPs on 14.0 upgrade
2021-02-26 19:56:48 +11:00
Marc Durdin
d496d266fa
Merge pull request #4378 from keymanapp/fix/windows/4289-altgr-refresh-on-64-bit
fix(windows): Refresh settings on 64-bit apps
2021-02-26 19:55:28 +11:00
Marc Durdin
f6734879a8
Merge pull request #4539 from keymanapp/fix/developer/4221-utf8-messages-in-lm-compiler
fix(developer): UTF-8 messages in LM compiler
2021-02-26 14:32:37 +11:00
Marc Durdin
4aced2762c
Merge pull request #4537 from keymanapp/fix/developer/4451-continue-if-sentry-not-available
fix(developer): run even if sentry unavailable
2021-02-26 14:32:31 +11:00
Marc Durdin
e2c79b0dfa fix(developer): UTF-8 messages in LM compiler
Fixes #4221.

When the Keyman Developer IDE calls out to the lexical model compiler,
it receives UTF-8 compiler message strings back but they are treated as
Windows-1252 strings. This fixes that.
2021-02-26 13:59:21 +11:00
Marc Durdin
c8e6ddbe7b fix(developer): run even if sentry unavailable
Fixes #4451.

If sentry.dll is missing, we should continue without error reporting,
rather than crashing out.
2021-02-26 11:45:16 +11:00
Marc Durdin
d7e4e18987 fix(windows): Handle Caps Lock event correctly from TIP
Fixes #4525.

This is a regression from #4468, which inadvertently added modifier
checks for `VK_CAPITAL` and `VK_NUMLOCK`, when it should not have done
so, as the flag was then being reset when the key was released rather
than toggled.

`ProcessModifierChange` pretended that it could handle `VK_CAPITAL` and
`VK_NUMLOCK` but it would never have worked, and the other caller (the
GetMessage hook) never passed those key events through, only Shift, Ctrl
and Alt, so that's now what the TIP handler does as well.

This leaves the rest of the fix from #4468 in place as that appears
correct.

I took the opportunity to move a repeated function declaration into
keyman64.h.
2021-02-26 10:54:30 +11:00
Marc Durdin
27529287e2 fix(windows): prevent re-registration of TIPs on 14.0 upgrade
Fixes #4445.

When upgrading from 11.0, 12.0 or 13.0, Keyman needs to re-register the
TIPs so that we use the new registration model for 14.0. However, if we
do this on a 14.0 version install, we end up registering TIPs for every
single suggested language for a keyboard, which is definitely not what
we want.

This fix simply looks to see if we have a 14.0-style installation
already, as evidenced by the presence of a `Transient Language Profiles`
key, and if found, does not continue the 11to13 upgrade process.
2021-02-26 07:42:55 +11:00
Marc Durdin
380832cda8
Merge pull request #4486 from keymanapp/fix/windows/4484-tsysinfox64-not-signed
fix(windows): tsysinfox64 not signed
2021-02-12 15:47:19 +11:00
Darcy Wong
beeec37195
Merge pull request #4470 from keymanapp/chore/ios/check-in-help
change(ios/app): Generate offline help from markdown
2021-02-12 11:35:42 +07:00
Marc Durdin
09ace08f7e fix(windows): tsysinfox64 not signed
Fixes #4484.

tsysinfox64 was being signed, but too late in the build
process as it is embedded into tsysinfo.exe. There was
code to sign it earlier, but that was being skipped due
to a missing build flag. This has been a problem for
some time.
2021-02-12 14:20:41 +11:00
Marc Durdin
c98379789d
Merge pull request #4458 from keymanapp/chore/windows/3540-firstvoices-keyboards-configuration
chore(windows): FirstVoices Keyboards Configuration merge
2021-02-11 16:56:45 +11:00
Darcy Wong
b9851c9136 change(ios): Update build-help.sh
* Generate offline help from markdown
* Update bundle to use index.html
2021-02-11 08:46:38 +07:00
Marc Durdin
32d42d7d31 fix(windows): Track modifier changes in UWP apps
Fixes #4369.

When Keyman is not handling a particular virtual key, it does not
preserve the virtual key (TSF terminology, essentially reserves that
virtual key + modifier for Keyman). In this situation, Keyman still
receives and processes the virtual key event, but the modifier state
is not passed through by kmtip to keyman32. This is normally okay,
because our `GetMessage` hook is responsible for tracking modifiers.

However, in UWP apps, our `GetMessage` hook does not get run, and so
we lose the modifier keys. Thus, this update ensures that the modifier
keys are processed when received by the TSF TIP.

It does not hurt to process modifier events twice.
2021-02-11 10:17:21 +11:00
Marc Durdin
1171290877 fix(windows): update order of disabling keyboard
We should uninstall transient languages before disabling them
because once we have disabled them, we lose the language
association and cannot find the entry to uninstall. catch-22.
2021-02-11 10:15:38 +11:00
Marc Durdin
3a7d1cb6fd
Merge pull request #4454 from keymanapp/fix/windows/4426-hotkeys-config-offset
fix(windows): hotkeys offset in config list
2021-02-10 12:25:43 +11:00
Marc Durdin
ea0d08ca4f chore(windows): FirstVoices Keyboards Configuration merge
Fixes #3540.

Merges all relevant changes from Keyman Configuration xml folder into
the FirstVoices Keyboards xml folder.

Adds support for enabling/disabling keyboards for FirstVoices Keyboards.

Renames from Keyman Desktop for FirstVoices to Keyman for FirstVoices.
2021-02-10 10:37:23 +11:00
Marc Durdin
9a3aaaaaba fix(windows): hotkeys offset in config list
Fixes #4426.

After removing the hotkey for the Keyboard Usage pane, the hotkey
`index` value was now offset from the hotkey `Target` value, which
uncovered a bug where the two values were conflated.

Note that the parameter passed to the `keyman:hotkey_set` command is
still called `index` -- this does not need to change.
2021-02-09 21:11:33 +11:00
Darcy Wong
982ce27c18 Merge remote-tracking branch 'origin/beta' into modify/common/help-keyman-com 2021-02-09 10:33:51 +07:00