Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
/windows/src/**/*.identcache
/windows/src/**/*.vcxproj.user
/windows/src/**/version.res
/windows/src/**/version*.res
/windows/src/**/*.pch
/windows/src/**/*.wixobj
/windows/src/**/*.sbr
Expand Down Expand Up @@ -186,3 +187,16 @@ lcov.info

# flag file for build script
.configured

# Local artifacts from the Delphi 12 CE dev workflow (see docs/build/windows-d12.md)
/delphi-library-paths.backup*.reg
/local-delphi-12-patches.patch
/configure.log
/core-build.log
/cpp-engine-build.log
/install-build-env.log
/kmcmplib-build.log
/web-build.log

# Meson wrap dependency lock files
**/subprojects/.wraplock
4 changes: 4 additions & 0 deletions common/windows/delphi/components/FixedTrackbar.pas
Original file line number Diff line number Diff line change
Expand Up @@ -70,10 +70,14 @@ procedure TTntFixedDrawGrid.WMEraseBkgnd(var Message: TMessage);
{$MESSAGE WARN 'Not yet checked against Delphi 10.4'}
{$IFNDEF VER330}
{$IFNDEF VER320}
{$IFNDEF VER350}
{$IFNDEF VER360}
{$MESSAGE ERROR 'Check that this fix is still applicable for a new version of Delphi. Checked against Delphi 10.2, 10.3' }
{$ENDIF}
{$ENDIF}
{$ENDIF}
{$ENDIF}
{$ENDIF}

procedure TTntFixedDrawGrid.MouseDown(Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
Expand Down
4 changes: 2 additions & 2 deletions common/windows/delphi/general/CleartypeDrawCharacter.pas
Original file line number Diff line number Diff line change
Expand Up @@ -591,11 +591,11 @@ function TestFont(FFontName: string): Boolean;
StrPCopy(lf.lfFaceName, FFontName); //'Code2000');
hdc := GetDC(0);
//FPlane0FontName := 'Code2000';
{$IFDEF VER340}
{$IF Defined(VER340) or Defined(VER350) or Defined(VER360)}
if EnumFontFamiliesEx(hdc, lf, @EnumFallbackFonts, 0, 0) <> 0 then
{$ELSE}
if EnumFontFamiliesEx(hdc, lf, @EnumFallbackFonts, 0, 0) then
{$ENDIF}
{$IFEND}
begin
FPlane0FontName := FFontName;
Result := True;
Expand Down
4 changes: 4 additions & 0 deletions common/windows/delphi/general/JsonUtil.pas
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,11 @@ function JSONToString(obj: TJSONAncestor; ReplaceSlashes: Boolean = False): stri
begin
builder := TStringBuilder.Create;
try
{$IF Defined(VER350) or Defined(VER360)}
obj.ToChars(builder, []);
{$ELSE}
obj.ToChars(builder);
{$IFEND}
Result := builder.ToString;
finally
builder.Free;
Expand Down
8 changes: 8 additions & 0 deletions common/windows/delphi/tools/devtools/SourceRootPath.pas
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,19 @@ interface
{$IFDEF VER340}
const DelphiMajorVersion = '21.0';
{$ELSE}
{$IFDEF VER350}
const DelphiMajorVersion = '22.0';
{$ELSE}
{$IFDEF VER360}
const DelphiMajorVersion = '23.0';
{$ELSE}
ERROR: must define Delphi version
{$ENDIF}
{$ENDIF}
{$ENDIF}
{$ENDIF}
{$ENDIF}
{$ENDIF}

const DelphiBasePath = 'C:\Program Files (x86)\Embarcadero\Studio\' + DelphiMajorVersion + '\';

Expand Down
6 changes: 6 additions & 0 deletions common/windows/delphi/web/Keyman.System.HttpServer.Base.pas
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,13 @@ function CrackUTF8ZeroExtendedString(CommandType: THTTPCommandType; const p: str
// Indy's UTF8 handling of URLs is *completely* broken.
// We may need to check this with updated versions of Delphi
{$IFNDEF VER330}
{$IFNDEF VER340}
{$IFNDEF VER350}
{$IFNDEF VER360}
ERROR! Check if this is still needed with Delphi update
{$ENDIF}
{$ENDIF}
{$ENDIF}
{$ENDIF}

SetLength(s, p.Length);
Expand Down
88 changes: 88 additions & 0 deletions dev-docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
# Keyman Developer Onboarding

Welcome. This folder is the entry point for newcomers to the Keyman
ecosystem. There are two distinct audiences here:

* **People building tools *around* Keyman from external repos** — AI
extensions for keyboard authoring, submission-triage bots for
[keymanapp/keyboards](https://github.com/keymanapp/keyboards),
validation tools, instrumented test rigs. You're consuming Keyman's
formats and CLI/library surface; you're not modifying Keyman itself.
Start at [keyboard-anatomy.md](keyboard-anatomy.md) and
[external-tooling.md](external-tooling.md).

* **People contributing to Keyman itself** — runtime engines, the
developer tooling, KeymanWeb, the Delphi-removal effort. You'll
modify code in this repo. Start at [repository-map.md](repository-map.md)
and [migration-guide.md](migration-guide.md).

The canonical user-facing documentation is at
[help.keyman.com](https://help.keyman.com). The canonical build
instructions are under [docs/build/](../docs/build/). This `dev-docs/`
folder is *only* for the "where is everything, what shape is it, and
why" questions.

## The docs

### For external tool builders

> **Strategic frame, read this first.** The CLDR LDML keyboard format
> is the future-canonical Keyman keyboard format. The spec is complete
> for both desktop and touch keyboards. Keyman's *read* side for LDML
> touch isn't finished yet — runtime still drives off the legacy
> multi-file setup — but LDML is forward-compatible, so the right move
> for a generation tool is to emit LDML XML as the canonical source and
> only produce the transitional `.kmn`+`.kvks`+`.keyman-touch-layout`
> bundle when the deliverable has to run on touch *today*. See
> [external-tooling.md § The strategic frame](external-tooling.md#the-strategic-frame-for-tools-generating-keyboards)
> and [migration-guide.md § LDML status](migration-guide.md#status--what-works-today-vs-whats-still-in-flight)
> for the full picture.

1. **[keyboard-anatomy.md](keyboard-anatomy.md)** — Reference for what
files make up a Keyman keyboard project (`.kpj`, `.kmn`, LDML XML,
`.kvks`, `.keyboard_info`, `.kps`, `.kmp`, ...), what each does, and
where the JSON schemas live for validation.

2. **[external-tooling.md](external-tooling.md)** — How to drive the
Keyman compiler and engine programmatically: the `kmc` CLI, the
`@keymanapp/kmc-*` npm package surface, schema-based validation,
the cross-file consistency contract that any generator must enforce
today, triage criteria for keyboard submissions, and the approach
for instrumented forks of the compiler or engine.

### For Keyman contributors

3. **[repository-map.md](repository-map.md)** — A guided tour of the
top-level directory structure, what each major component does, and
how they connect. Includes Mermaid diagrams of the component graph,
build dependencies, and the cross-platform matrix. External tool
builders should read this too if they want to understand what their
tool is hooking *into*.

4. **[migration-guide.md](migration-guide.md)** — Keyman has been
actively modernizing for years, replacing Delphi components with
C++ (Keyman Core), TypeScript (the kmc compiler family and
KeymanWeb), and embracing LDML as the canonical keyboard format.
This guide explains what has already moved, what's still in flight,
and where the long-running migration branches live.

## Then look at the build docs

Once you've internalized the layout, the standard build instructions live at:

* [docs/build/windows.md](../docs/build/windows.md) — the canonical Windows
flow (Delphi 10.3 / Pro)
* [docs/build/windows-d12.md](../docs/build/windows-d12.md) — fallback for
contributors stuck on Delphi 12 Community Edition (the only free Delphi
tier today); covers IDE-based workflow plus helper scripts
* `linux/`, `mac/`, `android/`, `ios/` — platform-specific READMEs in each
top-level directory

## Help / Getting Stuck

* [SIL/Keyman Community Forum](https://community.software.sil.org/c/keyman)
* [Keyman roadmap blog](https://blog.keyman.com/category/roadmap/) — the
long-form context for the migrations described in `migration-guide.md`
* [Issue tracker](https://github.com/keymanapp/keyman/issues) — search for
the component or migration branch you're touching before filing new issues
* [CONTRIBUTING.md](../CONTRIBUTING.md) (at repo root) for PR conventions
Loading
Loading