Commit graph

189 commits

Author SHA1 Message Date
Marc Durdin
711541be60 fix(windows): reinstall low level keyboard hook if it gets removed
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 included for simulating a keyman.exe
hang by posting a `wm_keyman_control:KMC_WATCHDOG_FAKEFREEZE` message to
it, which keyman.exe responds to by `Sleep()`ing for 5 seconds. While
keyman.exe is freezing, any keystroke will cause the low level hook to
be uninstalled by Windows.

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
2025-11-17 16:30:43 +01:00
Marc Durdin
03cd865c09
Apply suggestions from code review
Co-authored-by: rc-swag <58423624+rc-swag@users.noreply.github.com>
2025-10-13 10:37:35 +02:00
Marc Durdin
c99e0c01c4 chore(windows): address warnings 2025-10-08 15:08:04 +02:00
Marc Durdin
50ffbb2722 fix(windows): osk: handle simulated left Control event when AltGr pressed
When a European layout is active, and the user presses AltGr, Windows
generates a simulated VK_LCONTROL event alongside the VK_RMENU event.
This was causing the OSK to show LCtrl as depressed alongside RAlt, so
the OSK would show the wrong modifier layer, which was unhelpful and
confusing to the end user.

It is possible to detect the simulated VK_LCONTROL in the WH_KEYBOARD_LL
hook, because the scan code generated is 0x21D, instead of 0x1D.
Warning: this is not a documented value. (But, this 0x21D scan code is
not passed to the WM_KEYDOWN event!) Therefore, we use Keyman's existing
kmnLowLevelKeyboardProc to pass modifier key events on to the visual
keyboard.

This patch handles only this specific scenario, by watching for that
specific scan code in the new handler in the UfrmOSKOnScreenKeyboard
module, together with some minor refactoring so that it fits neatly.

A future improvement would be to have all modifier key processing go
through this new handler, and eliminate the timer-based polling of the
keyboard. However, there is some additional risk around missing events,
leading to 'stuck modifiers'.

Fixes: #14890
Build-bot: skip release:windows
2025-10-08 14:32:40 +02:00
Marc Durdin
f394245636 maint(common): consolidate builder scripts
Clarifies the confusing builder.inc.sh / build-utils.sh distinction by
giving the scripts more appropriate names. Most build scripts should use
builder-full.inc.sh; some helper scripts can use builder-basic.inc.sh.
Documented in resources/build/README.md.

Renames:
* resources/build/builder.inc.sh to resources/build/builder-full.inc.sh
* resources/build/build-utils.sh to resources/build/builder-basic.inc.sh

Other changes:
* Moves Android-specific functions out of builder-basic.inc.sh and into
  android/build.sh.
* Renames functions in builder-basic.inc.sh

More functions may be moved from builder-basic.inc.sh into utils.inc.sh
or other scripts in the future.

Fixes: #14065
Build-bot: build all
Test-bot: skip
2025-08-02 08:11:24 +10:00
rc-swag
ad962172e9 fix(windows): remove dead code 2025-07-28 16:54:37 +10:00
rc-swag
3c311a5aaa fix(windows): free the correct object KeyboardToggleReg 2025-07-24 16:59:41 +10:00
rc-swag
314c606aec fix(windows): add check a fix for registry datatypes
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
2025-07-15 16:27:14 +10:00
Marc Durdin
156bdcdd8a maint(common): rename and move builder_if_release_build_level 2025-06-16 06:45:42 +10:00
Marc Durdin
870d37f56b maint(developer): only copy .dbg/.pdb on release buildLevel 2025-06-16 05:40:30 +10:00
rc-swag
e56f6b908c
Merge pull request #13413 from keymanapp/fix/windows/13216/checkforupdates-reg-one-location
fix(windows): Check for updates registry value stored under the one Key
2025-03-06 15:29:17 +10:00
rc-swag
80be1e9434 fix(windows): checkforupdates in keyman engine key
The SRegValue_CheckForUpdates was written my utilkeymanoptions
to the Keyman Engine Key but read from Keyman Desktop Key.
This change moves it to only be read in Keyman Engine Key.
It also move the last update time to this Key for completness

Fixes: #13216
2025-03-04 21:09:09 +10:00
Marc Durdin
ef60c08d7c chore: add build.sh edit action for Delphi projects
This opens up the Delphi IDE with the correct KEYMAN_ROOT environment,
which allows for debugging. This is very helpful when working with
multiple worktrees, and also helps to avoid editing a project in the
wrong tree.
2025-02-22 06:18:47 +01:00
rc-swag
c4ea97c889 feat(windows): onlineupdatecheck references removed
All but one references and calls to OnlineUpdateCheck where removed
this is the first step towards removing these units completley.
HttpServer.App.OnlineUpdate.pas is still calling this so the code will
remain untill removed.
2025-01-14 13:44:10 +10:00
Marc Durdin
974b16f722
Merge branch 'epic/windows-updates' into chore/merge-master-into-windows-updates 2024-12-05 08:49:34 +01:00
rc-swag
6fb31d2ba9 fix(windows): stupid typo 2024-11-11 09:03:40 +10:00
rc-swag
6caee57972 fix(windows): add active page check to btnhelp 2024-11-08 20:29:24 +10:00
rc-swag
1053c941b5 fix(windows): help links updated 2024-11-08 11:19:43 +10:00
rc-swag
ab3227fb00 feat(windows): review comments 2024-11-07 15:29:14 +10:00
rc-swag
4ad5f0fc64 chore(windows): Merge branch 'epic/windows-updates' into feat/windows/add-apply-now-update 2024-10-01 17:38:59 +10:00
rc-swag
bfe1b45983 feat(windows): automatic updates option to config reg 2024-09-09 15:51:32 +10:00
rc-swag
1667cfed09 feat(windows): clean up ready for review 2024-09-03 14:38:09 +10:00
rc-swag
f0827b4d1e
Merge pull request #12252 from keymanapp/feat/windows/11471/remove-old-flags-modifier
feat(windows): Remove hotkey related feature flags
2024-09-02 12:59:12 +10:00
Marc Durdin
f082ddc070 chore(common): adjust build settings for windows clean builds 2024-08-22 13:20:52 +02:00
rc-swag
05d52463f9 feat(windows): remove registerhotkey and cache modifier
Remove the feature flags that allows the use of cached modifier for
hotkeys. Remove the feature flag that uses the Win 32 API
RegisterHotkeys.
2024-08-22 15:45:23 +10:00
rc-swag
c48a4a7242 feat(windows): Use RegisterHotkey only for chirl mode 2024-08-21 11:56:55 +10:00
rc-swag
65b9e49bac feat(windows): remove old UseRegisterHotkey 2024-08-19 18:48:06 +10:00
rc-swag
be55dabdc4 feat(windows): add right modifier key option pt1 2024-08-16 22:15:42 +10:00
rc-swag
47d3d26301 chore(windows): Merge branch 'epic/windows-updates' into feat/windows/add-apply-now-update 2024-06-29 16:04:45 +10:00
Marc Durdin
c06dd480df chore(windows): add new build scripts for Windows builds 2024-05-20 08:27:31 +07:00
Marc Durdin
f9a321fa1a chore(windows): add compiled resources to .gitignore 2024-05-20 08:19:56 +07:00
Marc Durdin
9f7eff122e chore(windows): remove legacy build Makefiles 2024-05-20 08:16:52 +07:00
rc-swag
71377c3754 fix(windows): Still need to guard against out of bound index 2024-04-23 08:56:56 +10:00
rc-swag
94c8879961 fix(windows): check font count display none found
This change is to check number of fonts found for keyboard
to guard against trying to index it when there are no fonts.
  for i := 0 to grid.RowCount - 1 do
        m := System.Math.Max(m,
	Canvas.TextWidth(FSelectedKeyboard.Fonts[i].FontName) + 6)
It also notifies the user no suggested fonts where found.
2024-04-22 17:01:44 +10:00
rc-swag
29b54ad661 chore(windows): Merge branch 'epic/windows-updates' into feat/windows/add-apply-now-update 2024-03-04 19:10:12 +10:00
rc-swag
dd5767a372 feat(windows): integrate sm states and handlekmshell 2023-12-22 10:11:32 +10:00
rc-swag
6cb83989d5 feat(windows): WIP added keyman has run atom 2023-12-20 08:14:33 +10:00
Marc Durdin
3a91c7d197 chore(developer): move IDEOptions key responsibility into KeymanDeveloperOptions
First part of addressing #10161 is to refactor the existing usage of the
registry values into the common KeymanDeveloperOptions unit. This was
mostly straightforward except for the changes to KeymanSentryClient,
which happens to be the most important part of this particular fix.
2023-12-11 13:48:43 +07:00
Marc Durdin
92a3000c8d chore(windows): fix comments in Makefile
Shockingly bad choice for nmake Makefiles to not allow whitespace before
comment # marker.
2023-03-20 07:30:55 +07:00
Marc Durdin
1a3cc078b5 chore(windows): sentry cleanup and signing
Addresses review comments.

Use SENTRY_SDK_VERSION where possible, and codesign sentry components
during build.
2023-03-19 07:35:06 +07:00
Steven R. Loomis
bc14f18460 Merge remote-tracking branch 'origin/master' into chore/core/mergemaster4-epic-ldml 2022-12-15 17:55:13 -06:00
Marc Durdin
c0e640fe73
Merge pull request #7710 from keymanapp/chore/windows/keyman-debug-symbols
chore(windows): include debug info in keyman build
2022-11-14 11:57:26 +11:00
Marc Durdin
2e58174092 chore(windows): include debug info in keyman build
Same as #7600, but for keyman.dpr.
2022-11-14 10:52:20 +11:00
Marc Durdin
0eb39dc9ea fix(windows): click in 1 pixel high box in Language Switch window caused crash
Fixes #7698.

Due to a `>` instead of a `>=` check, there was a one pixel high box at
the bottom of each list of input methods for each language which would
reuslt in an invalid value for `FNewHoverKeyboard`
(`lang.KeyboardCount`).

As well as fixing this, I changed the result for clicking below the
input method list to the more logical last item in the list rather than
the first.
2022-11-12 10:23:32 +11:00
Marc Durdin
4738b6a514 fix(windows): Improve shutdown robustness
Relates to KEYMAN-WINDOWS-B.

While this doesn't address the root cause of the exception, it should
prevent this unhandled exception, and adds breadcrumbs to help us see
which code path might be triggering the issue.
2022-11-10 16:10:49 +11:00
Steven R. Loomis
93a9509302 chore(core): delete crc32.cpp and crc32.pas from some places 2022-09-21 18:13:19 -05:00
Marc Durdin
385045e978 chore(windows): fixup refs and move StockFileNames
* StockFileNames.pas was missed in earlier moves.
* Cleaned up references in various dproj files
* Fixed up broken references to common files
2022-06-23 09:47:59 +10:00
Marc Durdin
2aaa31eae2 chore(windows): move general keyboard units to common 2022-06-23 06:33:16 +10:00
Marc Durdin
331c9d2d71 chore(windows): move shared general units to common 2022-06-22 13:58:58 +10:00
Marc Durdin
eba8a4ab35 chore(windows): move CRC32.pas to common 2022-06-22 10:36:55 +10:00