Fixes#4280.
Adds checks to verify that `if()`, `platform()`, `baselayout()` and
`nul` are at the start of the context in the appropriate order.
Adds unit tests to validate these checks.
These are conditions that have been present in earlier versions of
Keyman but not enforced until now. Keyboards that do not meet these
conditions would not work correctly in all circumstances and should be
updated to meet the requirements.
An alternative would have been to reorder the context string but that is
much more complex as manipulation would also have been required for the
output string. The enforced order is logical and reduces confusion in
any case.
Updated documentation coming along shortly.
Fixes#4250.
This implements @jahorton's suggestion of including the original name
in a comment alongside the munged name, as well as appending the unique
integer identifier of each symbol.
Note: the error reporting code needed a massage to support Unicode error
strings; in the future we should update the C++ compiler to emit
Unicode error strings also.
Fixes#4393.
Fixes KEYMAN-DEVELOPER-46.
Fixes KEYMAN-DEVELOPER-45.
This arose because deleting a tab caused Delphi VCL to switch to another
tab in the page control, which is IMHO a bug in the TPageControl VCL
component. Furthermore, when the active page is changed under these
circumstances, the normal OnChange and OnChanging events are not fired,
which means that the Source tab (which is the lucky tab to be activated)
never gets initialised. This cascades eventually to a crash due to the
Source tab's text editor not being properly loaded.
Two parts to this fix:
1. Restore the active page when we delete a wordlist tab (RSP-32327);
this does not resolve the crash but does avoid weird side-effect of
the active tab changing.
2. Initialise the source tab when we load the form so that the
initialisation issue described above is avoided.
A separate fix in modelTsProjectFile avoids a (handled) null variant
conversion exception.
DUnitX by default does case-insensitive string equality assertions, and
we don't really want to make that assumption.
There was one minor fail uncovered in Keyman.System.UILanguageManager as
a result of this -- it now returns a matching entry as found in the
list of UI languages, rather than the input, to get same case as the UI
language list entry.
Thank you @ermshiperete.
Fixes#2657.
Importing a Windows Keyboard had an option to select default targets for
the imported keyboard, but the option was ignored. This propagates the
option setting through the import process.
Fixes#2679.
If web is specified but not a touch platform, exclude touch layout from
a generated project. Also, fixup list of supported platforms in the
generated README.md.
Fixes#4354.
The redistributable build should be checking for the existence of either
setup.exe or setup-redist.exe. Note that the only difference between the
two is whether or not the file has a digital signature (as we should not
put a digital signature on an executable that will later have a .zip
appended, rather the final file should be signed).
Two changes here:
1. Only post the refresh message to the master controller, so that we
get a single refresh regardless of how many controllers are
registered.
2. When Keyman is restarted, the global RefreshTag is reset to 0, so we
need to do a `!=` comparison rather than a `<` comparison to ensure
that apps with an existing keyman32.dll/keyman64.dll in memory get
refresh notifications (as their local `RefreshTag_Process` will
likely already be greater than `0`).
Also a small additional debug statement.
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.
Fixes#3936.
This is a trial change as I am not able to reproduce the problem on my
machine, probably due to timing.
@makarasok, can you please test if this resolves the UAC window not
coming to foreground on your test scenario for #3936?
Fixes#4185.
Make sure Keyman is shut down during the uninstall so that it isn't left
in a weird state with missing files. This also reduces the need for a
reboot after uninstall.
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).
Fixes#4337.
The Sinhala language installation mitigation needed the BCP 47 code as
well as the language code with the new language installation process.
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.
Fixes#4289.
Some settings changes would not apply immediately for 64-bit apps, as
the refresh was not being processed until keymanx64 received focus (i.e.
never, as keymanx64 does not have a visible window!)
* Fix titles
* Remove unused osk_usage.md
* Remove link to osk_usage because the actual link is onscreenkeyboard
* Fix link to charactermap
* Remove unused links to psrt*language
Fixes#4116.
Fixes KEYMAN-WINDOWS-5T.
If we get an 'access denied' error, we won't report it to Sentry. This
error is of minor consequence as it arises in normal configurations only
if the task was already present, created by an elevated instance of
kmshell under the same user name. In that situation, the task works
fine; it just cannot be updated by a non-elevated instance of kmshell.
If there are other reasons for receiving access denied, we won't be able
to distinguish them anyway, so the best response is to suppress this
message.
An alternative would have been to either (a) avoid creating the task as
an elevated user, or (b) only ever create the task as an elevated user.
However, this adds extra unnecessary complexity and means that the task
may not always be present when we want it to be.
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.
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.
Fixes#4265.
This adjusts the button sizes of the splash screen to accommodate longer
strings such as found in the Khmer translation. We could go to a more
flexible layout model to allow for the buttons to stretch as needed, but
that's a lot more work and I don't really want to try for that right
now.