Commit graph

321 commits

Author SHA1 Message Date
Marc Durdin
d603c77cd7
Merge pull request #4386 from keymanapp/fix/windows/4192-show-balloon-when-keyman-is-already-running
fix(windows): Show balloon when Keyman is already running
2021-02-03 07:08:00 +11:00
Marc Durdin
7a16b07465
Merge pull request #4381 from keymanapp/fix/windows/4343-avoid-invalid-custom-languages
fix(windows): avoid invalid language codes in Add Language dialog
2021-02-02 08:41:35 +11:00
Marc Durdin
d81ff153b7
Merge pull request #4379 from keymanapp/fix/windows/4336-hotkey-show-keyboard-usage-plus-strings
fix(windows): remove Show Keyboard Usage hotkey
2021-02-02 08:41:28 +11:00
Marc Durdin
f83c8ebbe5 fix(windows): Show balloon when Keyman is already running
Fixes #4192.

If Keyman is already running, and the user attempts to start Keyman
again, a balloon will be shown to direct the user to the right place on
the screen.

Note: this worked in earlier versions of Keyman but stopped working due
to name changes for windows in the app.

I have also added a new string for balloon that will need translation.
2021-02-01 16:06:08 +11:00
Marc Durdin
348b29687e fix(windows): avoid invalid language codes in Add Language dialog
Fixes #4343.

This patch makes all language codes from the langtags.json dataset
visible through the Add Language dialog. This avoids situations where
an incomplete code such as "cmo" can result in an error (a script is
required for "cmo" as it is written in either Latn or Khmr).
2021-02-01 10:20:19 +11:00
Marc Durdin
fdcb8191a8 fix(windows): crash for Sinhala mitigation
Fixes #4337.

The Sinhala language installation mitigation needed the BCP 47 code as
well as the language code with the new language installation process.
2021-02-01 08:30:16 +11:00
Marc Durdin
335f06661d fix(windows): remove Show Keyboard Usage hotkey
Fixes #4336.

Removes the "Show Keyboard Usage Page" hotkey entry as it has no effect,
and cleans up Keyboard Usage and OSK Hint strings from all the current
locales.
2021-02-01 07:58:05 +11:00
Marc Durdin
193478a492 fix(windows): Reverse order of backspaces
In order for the BK_SURROGATE and BK_DEADKEY flags to be matched with
the correct xstring elements in the context, we need to delete the
elements from the buffer in reverse order.

decxstr would previously assert if attempting to move before start of
string. This is undesirable behaviour as it should instead return NULL
to indicate that we've finished the string.

I also corretected a buffer underrun which would be possible if
malformed data was in the xstring.

I checked all uses of decxstr to ensure that the NULL return value is
being tested correctly.
2021-01-28 08:16:33 +11:00
Marc Durdin
098de3af78 fix(windows): SMP-aware deletion in TSF-aware apps
Fixes #4196.

When deleting characters in a TSF-aware app, we must delete both halves
of a surrogate pair. This behaviour differs from legacy apps, where a
single backspace is usually sufficient to delete both characters.

Truly ancient apps that do not know about Unicode surrogate pairs are
not going to delete both halves with a single backspace event.
Fortunately, these are few and far between; we would handle them on a
case-by-case basis if support questions for them arise.

When we come to integrating Keyman Core into Keyman for Windows, there
will need to be some careful checking of surrogate pair support, as it
is likely that the handling will need to change.
2021-01-28 07:37:05 +11:00
Marc Durdin
4bc1730eed fix(windows): improve support for strings.xml
Fixes #4264.

The Android strings.xml format that we now use with Keyman Desktop has a
number of escapes that must be supported in order for text strings to be
rendered correctly, including: @, ?, ', ". Furthermore, positional
parameters have a slightly different format which we should transform on
load.

This change includes a unit test androidstringtokeymanlocalestring.
2021-01-25 11:17:44 +11:00
Marc Durdin
b4fdc0920a fix(windows): context mismatch with if and dk
Fixes #4275.
2021-01-18 10:23:44 +11:00
Marc Durdin
40b235443b
Merge pull request #4209 from keymanapp/fix/developer/2690-3082-unhandled-keys-in-debugger
fix(developer): Allow unhandled keys to go through to debugger memo
2021-01-14 09:16:39 +11:00
Marc Durdin
b7fb5066bc
Merge pull request #4180 from keymanapp/fix/windows/1285-amharic-sinhala-tigrigna-mitigation
fix(windows): Update mitigation for Keyman 14 and Windows 10 19597
2021-01-14 09:15:50 +11:00
Marc Durdin
c1aae3a313
Merge pull request #4175 from keymanapp/fix/windows/4013-menu-popup-positions
fix(windows): fix menu popup position
2021-01-14 09:15:38 +11:00
Marc Durdin
dce865ed4e fix(developer): Allow unhandled keys to go through to debugger memo
Fixes #2690.
Fixes #3082.

In the debugger, key events such as Enter, Ctrl+C, Ctrl+V were being
swallowed by the debug engine if they did not have rules within the
keyboard. This change emits the key events so the debug memo can
process them normally.
2020-12-23 15:30:56 +11:00
Marc Durdin
f2fc0f0098 chore: address review comments 2020-12-23 09:56:39 +11:00
Marc Durdin
95a6e1b446 fix(windows): fixup mitigation for legacy keyboards
Fixes #4184.

If a package had a keyboard with language metadata, it would not
load that language data correctly, which then meant it would not
apply the mitigation correctly either, leading to a double elevation
dialog as Keyman tried to fallback to primary language.
2020-12-21 11:23:53 +11:00
Marc Durdin
227e023cdd fix(windows): disable mitigation for Windows 10 build 19597 and later
Fixes #1285.

If running Windows 10 19597 or later, the underlying issue has
been addressed, so disable the mitigation for new installs of
the keyboard. Does not attempt to change the language code if
the keyboard is already installed.
2020-12-21 08:56:34 +11:00
Marc Durdin
e9723251fb fix(windows/engine): Build 19597 update
Build 19597 of Windows 10 no longer causes the issue with Amharic,
Tigrinya and Sinhala keyboards failing to register and activate
correctly.
2020-12-21 08:23:51 +11:00
Marc Durdin
e83061ef80 fix(windows): ensure mitigation works with new registration strategy
The keyboard profile and registration strategy was not taking into
account the mitigation for Win10 1803 (#1285) and this meant that the
Amharic, Tigrigna and Sinhala keyboards would not install correctly.
2020-12-21 08:20:28 +11:00
Marc Durdin
3992a34ff4 chore(windows): don't change debug-manifest 2020-12-19 07:50:50 +11:00
Marc Durdin
2dd28f5cc3 fix(windows): ensure win7 compat, extra 2020-12-19 07:49:05 +11:00
Marc Durdin
9e06fc89a5 fix(windows): ensure win7 compat 2020-12-19 07:47:29 +11:00
Marc Durdin
1a80290fee fix(windows): fix menu popup position
Fixes #4013.

This turned out to be a lot more complicated than I expected, mostly due
to limitations in the Windows Shell API with regard to multiple monitors
and per-monitor DPI awareness (which we don't yet do in Keyman -- a
task for another day). Some of the Shell API functions are also
re-entrant, which is dangerous, so I avoided using those.

We now popup the menu relative to the Keyman icon far more precisely
which gives a much nicer feel to the menu interaction.
2020-12-19 07:31:17 +11:00
Marc Durdin
e664e93de7 fix(windows): Improve refresh reliablilty
This change has three fixes to improve the reliability of notifying
Keyman Engine of updates to settings or keyboard installs:

1. It removes the closure pattern of the refresh thread, because that
   was closing on a variable on a different thread (`RefreshHandle`) and
   that could cause races and/or exceptions in the case of early free.
   What's more, the closure was actually unnecessary as the variable was
   really only used by the refresh thread!

2. It moves responsibility for setting the refresh token to the calling
   thread so that the caller can depend on the token being the one that
   is actually sent, removing a race.

3. Most important, the refresh thread now flushes all messages in its
   queue, as there may be multiple messages relating to the window
   construction that need to be processed before the wm_keyman_refresh
   message can be handled. This greatly improves the chance of the
   notification actually being sent!
2020-12-18 08:06:03 +11:00
Marc Durdin
b561dc4721 fix(windows): Use timer-approach to refresh
Another thought: we could also try refreshing every 125msec for 5
seconds after the first change is detected. It's a bit yuck perf-wise
but would probably be pretty transparent to the user.

In testing, this looks good. It means the changes appear as soon as
ready, without substantial delays or performance issues. Polling this
makes me feel a bit dirty, but I'll just take a shower and be okay.
2020-12-17 13:43:31 +11:00
Marc Durdin
f6872e7919 fix(windows): OSK toolbar sync
As Keyman now monitors the Windows keyboard list from Control Panel, it
is no longer sufficient to refresh the toolbar only when a Keyman
keyboard is updated, as at that point Windows has not refreshed its own
language list in the registry. Instead, we need to monitor changes to
the relevant registry key and then refresh when those changes are
'complete'.

There is a problem: there does not appear to be a good way to monitor
for changes to Windows language settings. WM_SETTINGCHANGE is sent when
a language is added by the user in Settings, but the actual change
happens asynchronously, and we are not notified when the changes are
complete.

We also do not get notifications when languages are added via APIs.

Given the async nature of the language profile changes, this leads to
race conditions when we try to refresh the OSK toolbar. My preferred
solution currently is to monitor the relevant key in a separate thread,
and wait 1 second post-changes to actually do the refresh.
2020-12-17 13:23:05 +11:00
Marc Durdin
f73b2912ef fix(windows): exception handling list error
Fixes #4006.

This fixes the list error exception which was masking the actual cause
of #4006, which is already fixed by #4164.

Related issue #4119 is also fixed by #4164.
2020-12-17 11:54:39 +11:00
Marc Durdin
15d2182255 fix(windows): maintain use of refreshtag 2020-12-17 11:19:13 +11:00
Marc Durdin
cea564a072 fix(windows): Improve refresh performance
When a keyboard is installed, Keyman will now only refresh its internal
state on a given thread when that thread receives focus and/or input,
rather than immediately. This will dramatically reduce the chatter
caused by Keyman Engine when a keyboard is installed or settings are
changed.
2020-12-17 11:13:18 +11:00
Marc Durdin
17b444bff2 fix(windows): Settings refresh management
Fixes #4011.
Fixes #4039.
Fixes #4121.

This change completes the immediate-change model for Keyman
Configuration, by refactoring the refresh of settings out of the render
phase and more appropriately splitting applying and refreshing. It adds
a new message flag for wm_keyman_refresh, KR_SETTINGS_CHANGED, which
uses a random token approach broadcast to all applications on the
desktop to ensure that the refresh is received and multiple
notifications for the same event can be appropriately coalesced.

Most of the files touched are stripping out the refresh flags from the
render phase.

There is one small bug resolved at the same time with the options
properties, which were not reset to default if they had been deleted
from the registry prior to a refresh (see utilkeymanoption.pas).
2020-12-17 10:50:21 +11:00
Marc Durdin
64d618cb58
Merge branch 'beta' into fix/windows/3749-3759-max-transient-languages 2020-12-16 09:32:00 +11:00
Marc Durdin
246cb70840 fix(windows): Warn if we reach maximum transient languages
Fixes #3749.
Fixes #3759.

Adds a warning dialog when user attempts to add a transient language to
a keyboard but the maximum number of transient languages is already
installed.

If this issue arises when a user is installing a keyboard for the first
time, Keyman instead installs the keyboard for the user's default
language. This may be a little confusing, but the error condition is
difficult to explain and non-technical users will probably be stuck
and need to install under their default language in any case. Happy to
receive any pushback on this decision.
2020-12-16 09:09:19 +11:00
Marc Durdin
ad932cdb74 fix(windows): menu scroll positions need reset at popup
Fixes #4012.

If the menu previously was scrollable, then it would potentially show
items at the wrong offset because the offsets were not reset when the
menu popup was called if no scroll was needed.
2020-12-15 11:46:30 +11:00
Marc Durdin
80d8169a4e fix(windows): glitch in keyboard menu
Fixes #4112.

Glitch in keyboard menu from scrollable buttons being drawn at top-left.
2020-12-15 11:44:59 +11:00
Marc Durdin
9e46b555d9 fix(windows): Rename to Keyman
Fixes #4003.

This addresses the majority of locations where we use the name "Keyman
Desktop" in code. There will be some filenames and paths that do not
change at this point -- particularly at a source level. For now, the
focus is on the user interface changes.

While making these changes, I also made the VERSION and MANIFEST
resources more consistent.
2020-12-02 09:56:14 +11:00
Marc Durdin
7ccde0e3ed chore(windows): disable Sentry 'Started' event
We used the 'Started' event when testing Sentry integration. We no
longer need it, but I left it in as commented code so we can re-enable
if/when we do Sentry updates in the future and need to re-test.
2020-12-01 10:45:22 +11:00
Marc Durdin
bbfe5adcc8 fix(windows): crash with package online update
Fixes #4005.

The wrong object was being freed which caused an access violation
internally.
2020-12-01 10:15:05 +11:00
Marc Durdin
79cd83e105 chore(windows): fixup makefiles 2020-11-11 10:33:18 +11:00
Marc Durdin
00a9744253 chore(windows): symbol server support, initial steps 2020-11-11 10:33:16 +11:00
Marc Durdin
3d1601ffe5 fix(windows): SizeOfImage header was wrong for dbg
Fixes #3831.

This fixes both issues reported in the bug (dproj changes ensure
separate .tds, and Makefile changes fix order of execution so that
dbg is generated after sentryprep's cleanup).
2020-11-06 17:36:56 +11:00
Marc Durdin
94a062f20a fix(developer): remove obsolete NRSIAllTags
Relates to #799.

Removes NRSIAllTags, alltags.txt, parser and utility units.

Also re-enables standardsdata.dpr unit test which needed some syntax
cleanup.
2020-11-04 18:41:17 +11:00
Marc Durdin
fd5845a912
Merge pull request #3805 from keymanapp/fix/windows/3801-crash-installing-malformed-package
fix(windows): crash installing package with a race
2020-10-30 17:31:23 +11:00
Marc Durdin
76f77857c5 fix(windows): crash installing package with a race
Fixes #3801.
Fixes #3802.
Fixes KEYMAN-WINDOWS-5M.
Fixes KEYMAN-WINDOWS-5N.

This is a two-part fix for Keyman Configuration where it appears there
was a race with creating a temporary file, and which caused a cascading
exception.

The first part resolves the race; the second part (in
UfrmInstallKeyboard.pas) adds a little extra robustness (probably not
totally necessary).
2020-10-30 16:52:17 +11:00
Marc Durdin
99e44d030a fix(windows): keyboard menu could get out of sync
Fixes #3725.
Fixed #3783.

In some situations, the keyboard menu would either display empty or
would not refresh to get all installed keyboards.
2020-10-30 14:22:20 +11:00
Marc Durdin
5a4287a68d fix(windows): disabling/enabling a profile could have wrong association
Transient language profiles would get the wrong language association
when they were disabled and re-enabled.

Fixes #3798.
2020-10-30 14:20:00 +11:00
Marc Durdin
4b970fefbf
Merge pull request #3779 from keymanapp/fix/windows/3650-remove-msctf-dllmain-free
fix(windows): remove msctf free from DllMain
2020-10-29 06:43:49 +11:00
Marc Durdin
3178495e58
Merge pull request #3772 from keymanapp/fix/windows/3562-start-keyman-on-demand-keyman32
fix(windows): Start Keyman on Demand - keyman32
2020-10-29 06:43:42 +11:00
Marc Durdin
fc7b51c4ca fix(windows): remove msctf free from DllMain
Fixes #3650.

This removes the bad call to `FreeLibrary` that was still present in
a callee of `DllMain` in keyman32. The refactor moves responsibility for
loading TSF to the `SelectKeyboard` functions and gets rid of the
associated thread globals.

The `TSFINTERFACES` struct is of course a future candidate for a class.

In the process I removed a lot of cruft from keyman32.cpp which was
either obsolete, irrelevant or just plain wrong. None of which had
material impact on the running code.
2020-10-28 16:17:52 +11:00
Marc Durdin
3e9f397b27 chore(windows): small cleanups
1. Remove unused variables
2. Remove invalid build configurations
3. Move hotkey checks before touch keyboard panel check, so hotkeys
   still work when touch panel is active; the touch keyboard panel check
   is there to disable serialised input which conflicts with it.
2020-10-28 10:27:24 +11:00