When normalizing, we need to stop processing on an NFC boundary, not an
NFD boundary, to support normalizations such as in Bengali, where
appending `U+09D7` to a context of `U+0995 U+09C7` should result in
`U+0995 U+09CC`.
The specification is unclear on this; see https://unicode-org.atlassian.net/browse/CLDR-19218
This also updates the ldml keyboard unit test suite to support running
in full NFC mode (used in all Engine implementations) as well retaining
the NFD mode (now only used by the debugger).
Side note: the Bengali normalization failure case was picked up by the
improvements to the unit test suite, proving once again that good tests
are so valuable.
Fixes: #15491Fixes: #15505
Follows: #15488
Cherry-pick-of: #15506
Relates-to: CLDR-19218
Ensure that when a single backspace decomposes the last NFC character in
the app context, the remainder of the 'cluster' is preserved, matching
the implication of the CLDR keyboard specification.
This addresses the behavior in #15487 where the cached context became
out of sync with the app context after deleting an entire NFC cluster
such as ê, which caused a loop ending up with the entire context being
deleted, at which point the loop exited with a fail-safe.
Note that the LDML keyboard tests (ldml.cpp) do not currently exercise
the normalization code; this is a gap that should be addressed to ensure
that we are testing final application behavior.
This cherry-pick only adds the direct normalization patch and unit test
and skips the additional changes for logging.
Fixes: #15487
Cherry-pick-of: #15488
maint(linux): remove EOL Ubuntu 25.04 Plucky 🍒
Support for Ubuntu 25.04 Plucky ends on 15th January 2026 after which it is no longer possible to upload and build on Launchpad. This change removes Plucky.
Fixes: #14955
Cherry-pick-of: #15423
Support for Ubuntu 25.04 Plucky ends on 15th January 2026 after which
it is no longer possible to upload and build on Launchpad. This change
removes Plucky.
Fixes: #14955
Cherry-pick-of: #15423
Test-bot: skip
This change improves the stability of Keyman for Windows by monitoring
the health of the low level keyboard hook. If keyman.exe is unresponsive
at any time, Windows can silently uninstall its low level keyboard hook,
which results in (at least) two problems:
* Keyman's hotkeys stop working
* A modifier key can become stuck, if it was pressed around the time
Keyman became unresponsive.
The most common scenario in which Keyman can become unresponsive is high
system load, e.g. rendering graphics, videoconference calls, compiling
software.
Restarting Keyman always resolved both of these two issues in the past,
but with this patch, I hope that this will no longer be necessary.
A related 'fakefreeze' project is not included in this cherry-pick; see
PR #15179 for this.
Logging has been updated; look for "LowLevelHookWatchDog" in the log for
related events.
One final small change in keyman32.cpp, as I refactored the
WH_KEYBOARD_LL hook installation/uninstallation, was to always clear out
hook variables when uninstalling a hook, because if the hook fails to
uninstall, there's really nothing we can do about it anyway, and we
probably shouldn't be trying again.
Fixes: #8064
Cherry-pick-of: #15179
Test-bot: skip
Build-bot: skip
Fixes: #14342
The Windows system level keyboard hotkeys controlled in
registry have sometimes been incorrectly written as
a DWORD datatype. There 106 events in sentry for just
July. When opening the Windows setting dialog and the registry
has DWORDS it will show unassinged in the dialog if apply
is pressed it will convert the keys to REG_SZ.
This fix follows a similar pattern it will check the data
type of the registry key if it is DWORD it will remove it
and add a new key of the same name as REG_SZ and set it to
the unassigned value.
Fixes: KEYMAN-WINDOWS-4NK
Adds breadcrumbs for debug memo to try and narrow down sequence of
events leading to assertion failure with backspace.
Relates-to: #11706
Test-bot: skip
Cherry-pick-of: #15056
While not documented as such, it appears that the repository record is
required with trusted publishing of npm packages.
Cherry-pick-of: #15049
Build-bot: skip release:developer
I am not entirely clear why the coverage dropped, but I suspect it's due
to code paths that are not activated in node 24. For now, just dropping
coverage threshold to 40%.
Cherry-pick-of: #15042