Commit graph

32722 commits

Author SHA1 Message Date
Marc Durdin
4dd066443a
Merge pull request #15236 from keymanapp/fix/windows/15233-debugging-message-separators
fix(windows): escape backslashes in path in debugging message
2025-11-26 06:43:29 +01:00
Marc Durdin
565af2d30e fix(windows): escape backslashes in path in debugging message
Fixes: #15233
Test-bot: skip
Build-bot: skip
2025-11-26 05:53:02 +01:00
Darcy Wong
9c9696c5fd
Merge pull request #15224 from keymanapp/chore/android/clarify-pr-title
chore(android): Clarify PR title for #15136
2025-11-24 11:33:50 +07:00
Darcy Wong
dfa9695e07 chore(android): Clarify PR title for #15136 2025-11-24 11:06:04 +07:00
Keyman Server
aafe5a1311
Merge pull request #15221 from keymanapp/auto/version-master-19.0.166
auto: increment master version to 19.0.166
2025-11-21 19:03:50 +01:00
Keyman Build Agent
2066c6a76b auto: increment master version to 19.0.166
Test-bot: skip
Build-bot: skip
2025-11-21 12:02:06 -06:00
Marc Durdin
32db754209
Merge pull request #15179 from keymanapp/fix/windows/8064-low-level-hook-watch-dog
fix(windows): reinstall low level keyboard hook if it gets removed
2025-11-21 10:40:40 +01:00
Marc Durdin
eb4b10996d
Merge pull request #15087 from keymanapp/fix/developer/11363-prevent-race-on-server-load-kmw
fix(developer): avoid race in page.onload vs kmw.init in Server
2025-11-21 10:39:43 +01:00
Shawn Schantz
323a2f99fc
Merge pull request #14972 from keymanapp/chore/mac/key-trace-log
chore(mac): add keyTrace log
2025-11-20 13:26:25 -05:00
Keyman Server
b6d6514840
Merge pull request #15213 from keymanapp/auto/version-master-19.0.165
auto: increment master version to 19.0.165
2025-11-20 19:03:47 +01:00
Keyman Build Agent
47ec9106b9 auto: increment master version to 19.0.165
Test-bot: skip
Build-bot: skip
2025-11-20 12:01:36 -06:00
Marc Durdin
513c625e33
Merge pull request #15194 from keymanapp/feat/windows/15192/upgrade-wix-3-14-1
feat(windows): update wix to 3.14.1
2025-11-20 11:08:18 +01:00
rc-swag
85dcdcf066 feat(windows): update wix to 3.14.1
Update the WiX toolset build version to 3.14.1 for Arm64.

Fixes: #15192
2025-11-20 15:35:46 +10:00
Marc Durdin
c3915928a6 chore(windows): use MultiThreaded library for fakefreeze 2025-11-19 06:28:04 +01:00
Keyman Server
5f3c4158ca
Merge pull request #15180 from keymanapp/auto/version-master-19.0.164
auto: increment master version to 19.0.164
2025-11-17 19:05:49 +01:00
Keyman Build Agent
6a2a59510e auto: increment master version to 19.0.164
Test-bot: skip
Build-bot: skip
2025-11-17 12:02:17 -06:00
Marc Durdin
ef64af0155
Merge branch 'master' into fix/windows/8064-low-level-hook-watch-dog 2025-11-17 17:07:23 +01:00
Marc Durdin
62570d9284
Merge pull request #15176 from keymanapp/fix/mac/10201-detach-force
maint(mac): handle hdiutil detach failure correctly in make-km-dmg.sh
2025-11-17 17:02:53 +01:00
Marc Durdin
89597cf8a2
Merge pull request #15156 from keymanapp/fix/windows/handle-keyman-root-forward-slash
fix(windows): handle forward slash for KEYMAN_ROOT env var
2025-11-17 17:02:41 +01:00
Marc Durdin
149aef4cb5
Merge pull request #15163 from keymanapp/change/windows/use-circular-buffer-for-logging
change(windows): use circular buffer for logging
2025-11-17 17:02:34 +01:00
Marc Durdin
6e470efa3e
Merge pull request #14799 from keymanapp/change/windows/include-map2pdb-for-relevant-projects
change(windows): include map2pdb generation for relevant Delphi projects
2025-11-17 17:02:25 +01:00
Marc Durdin
2631353564
Merge pull request #15151 from keymanapp/fix/windows/stop-outputting-debug-strings-from-dllmain
fix(windows): disable OutputDebugString from DllMain
2025-11-17 17:02:15 +01:00
Marc Durdin
fd0cdf153d
Merge pull request #15150 from keymanapp/fix/windows/handle-exception-in-exception-handler
fix(windows): handle exceptions when walking stack in exception handler
2025-11-17 17:02:06 +01:00
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
Eberhard Beilharz
9e991a14e0
Merge pull request #15133 from keymanapp/chore/linux/cherry-pick/changelog 2025-11-17 08:32:41 +01:00
Marc Durdin
9940de591c maint(mac): handle hdiutil detach failure correctly in make-km-dmg.sh
Fixes: #10201
Test-bot: skip
Build-bot: skip release:mac
2025-11-15 06:57:22 +01:00
Keyman Server
e69b168c35
Merge pull request #15174 from keymanapp/auto/version-master-19.0.163
auto: increment master version to 19.0.163
2025-11-14 19:07:37 +01:00
Keyman Build Agent
9eb41504c9 auto: increment master version to 19.0.163
Test-bot: skip
Build-bot: skip
2025-11-14 12:03:41 -06:00
Eberhard Beilharz
a579d7185b
Merge pull request #15172 from keymanapp/maint/linux/15171_debpkg
maint(linux): free disk space before running autopkgtests

Running the autopkgtests during a Ubuntu packaging build GHA recently started to fail with an out-of-disk-space error. This change removes some large directories with tools that we don't need for the autopkgtests.

We could delete some more that are not quite as big, but this gives us more than enough space and saves a bit of build-time.

Fixes: #15171
2025-11-14 18:45:26 +01:00
Eberhard Beilharz
6fe3e3e8ba
maint(linux): free disk space before running autopkgtests
Running the autopkgtests during a Ubuntu packaging build GHA recently
started to fail with an out-of-disk-space error. This change removes
some large directories with tools that we don't need for the autopkgtests.

Fixes: #15171
Build-bot: skip
Test-bot: skip
2025-11-14 18:23:49 +01:00
Eberhard Beilharz
ef64529300
Merge pull request #15159 from keymanapp/fix/web/defaultpath
fix(web): improve determination of default path

Browser extensions can dynamically insert scripts into a web page, so it's possible that the last script is not what we expected, which can cause the path to the script to be wrong. This change fixes the determination of the default path by using the `document.currentScript` property. It also replaces the use of the deprecated `substr` function in those places.

Fixes: #15158
2025-11-14 14:50:44 +01:00
Marc Durdin
57c0fa3d03
Merge pull request #15129 from keymanapp/maint/resources/builder_launch
maint(resources): add `builder_launch` function
2025-11-14 14:24:19 +01:00
Marc Durdin
8f95d84014
Merge pull request #15114 from keymanapp/maint/resources/builder-timing
maint(resources): add build timing report to builder
2025-11-14 14:24:11 +01:00
Marc Durdin
7d6e04f9ac
Apply suggestions from code review
Build-bot: skip
2025-11-14 13:58:16 +01:00
Eberhard Beilharz
fc04e2445b
fix(web): address code review comments
Deal with `currentScript` being null/undefined.
2025-11-14 12:35:59 +01:00
Marc Durdin
0988a86fa4 maint(resources): improve builder_launch to allow for arbitrary parameters
Also cleans up reporting of child scripts and links the list of reserved
parameters across a few locations. Address review comments.
2025-11-14 10:44:35 +01:00
Eberhard Beilharz
5783ec0900
Merge pull request #15157 from keymanapp/chore/linux/14954_resolute
chore(linux): use `devel` for next Ubuntu release

This change moves to use [`devel`](https://hub.docker.com/_/ubuntu#whats-in-this-image) instead of a specific release name for the next Ubuntu release. That way it will always be able to find an image and will automatically start using the next one as soon as it becomes available.

Follow-up-of: #15137
2025-11-14 08:39:53 +01:00
Marc Durdin
bf4d707662 change(windows): use circular buffer for logging
Test-bot: skip
2025-11-14 05:23:32 +01:00
Keyman Server
4922b089e5
Merge pull request #15160 from keymanapp/auto/version-master-19.0.162
auto: increment master version to 19.0.162
2025-11-13 19:03:38 +01:00
Keyman Build Agent
cd4e7c02b9 auto: increment master version to 19.0.162
Test-bot: skip
Build-bot: skip
2025-11-13 12:01:24 -06:00
Eberhard Beilharz
cb1a308418
fix(web): improve determination of default path
Browser extensions can dynamically insert scripts into a web page, so
it's possible that the last script is not what we expected, which
can cause the path to the script to be wrong. This change fixes the
determination of the default path by using the `document.currentScript`
property. It also replaces the use of the deprecated `substr` function
in those places.

Fixes: #15158
Test-bot: skip
2025-11-13 18:41:27 +01:00
Eberhard Beilharz
72da1be22a
chore(linux): use devel for next Ubuntu release
This change moves to use
[`devel`[1]](https://hub.docker.com/_/ubuntu#whats-in-this-image)
instead of a specific release name for the next Ubuntu release. That way
it will always be able to find an image and will automatically start
using the next one as soon as it becomes available.

Build-bot: skip
Test-bot: skip
2025-11-13 16:43:54 +01:00
Marc Durdin
edca16f508 change(windows): include map2pdb generation for relevant Delphi projects
Adds a call to map2pdb for Delphi projects, if map2pdb is an executable
on the path. This way, we get .pdb files we can use for debugging and
for performance profiling. This also replaces tds2dbg.

If map2dbg is available, then the build and install actions will copy
the PDB to be alongside the corresponding executable, making most debug
actions relatively seamless for finding symbols.

Also fixes up setup.exe in Windows and Developer to extend setup.exe to
a 512-byte boundary after map2pdb patches the PE.

Relates-to: #14787
Build-bot: skip release:developer,windows
Test-bot: skip
2025-11-13 14:48:18 +01:00
Marc Durdin
54642dc86d fix(windows): disable OutputDebugString from DllMain
Following investigation, it seems that OutputDebugString can trigger a
loader lock as it throws an exception which can be handled by a global
exception handler, which may try and load/unload DLLs or perform other
unsafe tasks (e.g. StackWalk). The safest solution is to remove the
debug string logging altogether from code paths that run from DllMain.

It would be nice to further simplify DllMain but that would be a
significant amount of additional work.
2025-11-13 14:47:39 +01:00
Marc Durdin
7c9c21d260 fix(windows): handle exceptions when walking stack in exception handler
This change wraps the stack walk with an exception handler, which will
enable some crash handlers to continue. However, in some circumstances,
such as the stack captured below, it appears to be an unrecoverable
crash.

So, to mitigate this scenario, we also now only capture stack traces for
crashes that we know are serious -- the set of exception types listed in
the patch.

I experienced this issue on my machine after a Windows update; it is not
clear to me if this is related to the Windows update or if it is due to
my debugging environment for Keyman. The symptoms were that Keyman
Configuration would start up, but show just a blank white dialog, and a
few seconds later would abort. Observing process history showed that
kmshell.exe and kmbrowserhost.exe would both crash, with related call
stacks -- see below for a sample. These call stacks are coming out of
keyman32 calling OutputDebugString from DllMain, which may not be a safe
thing to do, because of the exception side-effect. A separate patch will
be submitted to address that - probably just removing any
OutputDebugString calls from DllMain paths.

In any case, this change adds robustness and should mitigate other
unexpected exceptions.

```
0:026> kb
 # ChildEBP RetAddr      Args to Child
00 08a1d4c8 750d6e3d     750d6e20 750bd307 04447396 ucrtbase!abort+0x31
01 08a1d4d0 750bd307     04447396 051caaa0 629f52f0 ucrtbase!_purecall+0x1d
02 08a1d508 62ab2914     0495e1c8 00000000 08a1d5fc ucrtbase!__crt_state_management::wrapped_invoke<int (__cdecl*)(void),int>+0x2a
03 08a1d528 62aba00e     0495e1c8 00000000 08a1d5fc dbghelp!SymbolDataSimpleImpl<1,3>::getData+0x24
04 08a1d580 62ac649d     0495e1c8 08a1d5fc 08a1da34 dbghelp!GetData::getSymData+0x6e
05 08a1d5dc 62ac3272     08a1d5fc 05497580 08a1da5c dbghelp!CPubByAddrTrav::get+0xad
06 08a1d948 62ac7340     08a1da00 08a1da34 08a1da5c dbghelp!findBetterSymbol+0x62
07 08a1da40 62ac87eb     08a1da5c 08a1da64 62a05ea0 dbghelp!CAllSymsByAddrTrav::getEnclosingSymbol+0x80
08 08a1da6c 62abfb10     00000001 00030ed1 05497580 dbghelp!CAllSymsByAddrTrav::init+0xeb
09 08a1da88 62a876e9     00000001 00030ed1 043e9008 dbghelp!CAllSymsByAddrTrav::FInit+0xa0
0a 08a1daac 62a87846     043e9008 00000001 00030ed1 dbghelp!CDiaSession::findSymbolByAddr+0x2a9
0b 08a1dadc 62a87899     043e9008 00031ed1 00000000 dbghelp!CDiaSession::findSymbolByRVA+0x76
0c 08a1db10 62aed8f0     043e9008 00031ed1 00000000 dbghelp!CDiaSession::findSymbolByRVAEx+0x39
0d 08a1dbac 62b1a980     533b1ed1 00000000 00000000 dbghelp!FindSymbolByVA+0x117
0e 08a1dc00 629ed8da     533b1ed1 00000000 93b94d79 dbghelp!diaGetFpoFromAddr+0x6c
0f 08a1dc4c 629ed647     533b1ed1 00000000 93b94dad dbghelp!LookupFunctionEntryX86+0x23d
10 08a1dc98 629ed4c7     ffffffff 533b1ed1 00000000 dbghelp!SymFunctionTableAccess64AccessRoutines+0x167
11 08a1dcb4 629ec7a1     ffffffff 533b1ed1 00000000 dbghelp!FunctionTableAccessRoutineLocal+0x17
12 08a1dcd8 629eba25     533b1ed1 00000000 08a1dd10 dbghelp!DbhStackServices::GetFunctionEntry+0x31
13 08a1dd58 629eb126     00000001 08a1de00 08a1eda0 dbghelp!DbsStackUnwinder::StaticAdjustForNoReturn+0x4a
14 08a1ddbc 629e8a76     08a1ddf8 08a1dea8 08a1dec8 dbghelp!DbsX86StackUnwinder::UnwindAndUpdateInternalContext+0x136
15 08a1deec 629e88b4     08a1eda0 00000005 05482908 dbghelp!DbsStackUnwinder::DoDbhUnwind+0x177
16 08a1df1c 629e87b8     08a1eda0 00000005 05482908 dbghelp!DbsStackUnwinder::DbhUnwind+0x58
17 08a1e038 629e867e     08a1eda0 08a1f000 00725a60 dbghelp!PickX86Walk+0x109
18 08a1ecf4 62af77c9     08a1eda0 08a1f000 00000000 dbghelp!DoUnwindStackFrameUsingServices+0xbb
19 08a1ed4c 62b3ad4b     0000014c ffffffff fffffffe dbghelp!StackWalk2+0x1c9
1a 08a1eebc 2c7667c4     0000014c ffffffff fffffffe dbghelp!StackWalk64+0x8b
WARNING: Stack unwind information not available. Following frames may be wrong.
1b 08a1f2cc 2c765ad4     00000000 04e57318 08a1f32c kmshell+0x3667c4
1c 08a1f2dc 7726369f     08a1f2f8 08a1f428 08a1f3d8 kmshell+0x365ad4
1d 08a1f32c 7725eb04     00000000 5338cc66 08a1fbac ntdll!RtlpCallVectoredHandlers+0xf8
1e 08a1f3c0 7726b66f     08a1f3d8 08a1f428 08a1f3d8 ntdll!RtlDispatchException+0x67
1f 08a1f3c0 753e5004     08a1f3d8 08a1f428 08a1f3d8 ntdll!KiUserExceptionDispatcher+0xf
20 08a1f8ec 754c7ab0     40010006 00000000 00000002 KERNELBASE!RaiseException+0x64
21 08a1fb54 533ab6a2     08a1fbac 5338cc66 08a1fe38 KERNELBASE!OutputDebugStringA+0x50
22 08a1fcb0 533b1ba3     53673110 5338cc66 08a1fe38 keyman32!_OutputThreadDebugString+0x42 [D:\Projects\keyman\app\windows\src\engine\keyman32\K32_DBG.CPP @ 291]
23 08a1fd18 533b1ed2     00000000 5338cc66 08a1fe38 keyman32!ReleaseKeyboards+0x13 [D:\Projects\keyman\app\windows\src\engine\keyman32\keyman32.cpp @ 841]
24 08a1fd70 533b1fad     00000000 5338cc66 08a1fe38 keyman32!UninitialiseProcess+0x22 [D:\Projects\keyman\app\windows\src\engine\keyman32\keyman32.cpp @ 160]
25 08a1fdcc 53431b12     53380000 00000003 00000000 keyman32!DllMain+0x5d [D:\Projects\keyman\app\windows\src\engine\keyman32\keyman32.cpp @ 143]
26 08a1fe10 53431cf0     53380000 00000003 00000000 keyman32!dllmain_dispatch+0xb2 [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\dll_dllmain.cpp @ 281]
27 08a1fe24 77268ff6     53380000 00000003 00000000 keyman32!_DllMainCRTStartup+0x20 [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\dll_dllmain.cpp @ 334]
28 08a1fe44 772a0df3     5338cc66 53380000 00000003 ntdll!LdrxCallInitRoutine+0x16
29 08a1fe68 7722b11c     00000003 00000000 fb42ae4c ntdll!LdrpCallInitRoutineInternal+0x22
2a 08a1feb0 77229812     00000003 00000000 fb42af9c ntdll!LdrpCallInitRoutine+0xae
2b 08a1ff60 77261670     1138e500 00000000 052cbe98 ntdll!LdrShutdownThread+0x1b2
2c 08a1ff74 757c5d50     00000000 757c5d30 08a1ffdc ntdll!RtlExitUserThread+0x30
2d 08a1ff84 7725d6db     052cbe98 fb42af20 00000000 kernel32!BaseThreadInitThunk+0x20
2e 08a1ffdc 7725d661     ffffffff 772a4680 00000000 ntdll!__RtlUserThreadStart+0x2b
2f 08a1ffec 00000000     1138e500 052cbe98 00000000 ntdll!_RtlUserThreadStart+0x1b
```
2025-11-13 14:47:14 +01:00
Marc Durdin
5879f087c7 fix(windows): handle forward slash for KEYMAN_ROOT env var
Test-bot: skip
2025-11-13 14:45:23 +01:00
Darcy Wong
48b19c468c
Merge pull request #15136 from keymanapp/docs/android/adware
docs(android): Document disclaimer of Keyman NOT containing adware/spyware
2025-11-13 07:08:27 +07:00
Keyman Server
696a7475e4
Merge pull request #15143 from keymanapp/auto/version-master-19.0.161
auto: increment master version to 19.0.161
2025-11-12 19:03:42 +01:00
Keyman Build Agent
a49ee18378 auto: increment master version to 19.0.161
Test-bot: skip
Build-bot: skip
2025-11-12 12:01:30 -06:00
Eberhard Beilharz
197af81b5b
Merge pull request #15137 from keymanapp/chore/linux/14954_resolute 2025-11-12 14:30:24 +01:00