From 0dc79330773d6ed8c7cd3773c187b85a549269d0 Mon Sep 17 00:00:00 2001 From: EwdErna Date: Thu, 24 Sep 2026 08:22:20 +0900 Subject: [PATCH] =?UTF-8?q?backlog:=20C=E3=82=B3=E3=83=BC=E3=83=89?= =?UTF-8?q?=E3=81=AE=E7=94=9F=E6=88=90=E3=81=A8=E3=83=A6=E3=83=BC=E3=82=B6?= =?UTF-8?q?=E3=83=BC=E3=81=AEC=E3=81=AE=E7=B5=84=E3=81=BF=E8=BE=BC?= =?UTF-8?q?=E3=81=BF=E3=82=92MAP-P-9=E3=81=A8=E3=81=97=E3=81=A6=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit keymap.jsonではタップダンス・コンボ・キーごとの設定等を表現できず、Cの生成が必要になる。 JSONを正本にしつつ、ユーザーのC/hで一部を上書きする方法を保留する。フック方式が有力。 Journal: journal/2026-09-24-generator-c-override.md Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011zrYqwC8nXQX5Kg9Fur6Td --- backlog/README.md | 14 +++++++++++ journal/2026-09-24-generator-c-override.md | 29 ++++++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 journal/2026-09-24-generator-c-override.md diff --git a/backlog/README.md b/backlog/README.md index 589f0cb..7ad159c 100644 --- a/backlog/README.md +++ b/backlog/README.md @@ -148,3 +148,17 @@ - 保留できる理由: 当面の対象ファームウェアはQMKだけで、QMK表記のまま保存・読み書き・出力できる。 - 再開条件: QMK以外のファームウェアへの出力や、実機との通信に着手するとき。 - 完了条件: QMK以外のファームウェアで使うキーコードの表現と、QMK表記との対応方法をユーザーが決める。 + +### MAP-P-9 Cコードの生成とユーザーのCの組み込み + +- 関連仕様: [MAPレイヤー](../MAPレイヤー.md)「MAPデータと他レイヤーの関係」「DynamicとStatic」、[全体方針のFirmware Generator](../keyboard-design-layers.md#firmware-generator) +- 未決事項: QMKのkeymap.jsonでは、タップダンス・コンボ・キーオーバーライドや、キーごとの設定(`get_tapping_term` 等のコールバック)を表現できない。 + JSONを正本にしたままこれらをCとして生成する方法と、ユーザーが用意したC/hで一部を上書きする方法。 + QMKのコールバックは1つの関数として定義するため、生成したCとユーザーのCが同じ関数を定義するとビルドできない。候補: + - 生成した関数の先頭でユーザー用のフックを呼び、フックが処理しなかった場合はJSONの値を使う(有力) + - ユーザーが引き受ける関数をJSONまたはhのプロトタイプで宣言し、Generatorはその関数を出力しない + `ACTION_TAP_DANCE_FN*` やリーダーキーのように、本質的にCで書く動作をJSONから参照する方法も含む。 + MAPの「キーマップ固有のコードには原則として対応しない」との関係も整理する。 +- 保留できる理由: レイヤー別の割り当てとVIAでの読み書きは、keymap.jsonで表現できる範囲だけで実装できる。 +- 再開条件: Firmware Generatorでタップダンス・コンボ・キーごとの設定等を出力するとき、またはP-1で動作定義とキーごとの設定の保存形式を決めるとき。 +- 完了条件: 生成するCの構成と、ユーザーのC/hを組み込む方法をユーザーが決め、両方を含む構成でQMKのビルドが通ることを確認する。 diff --git a/journal/2026-09-24-generator-c-override.md b/journal/2026-09-24-generator-c-override.md new file mode 100644 index 0000000..7db550d --- /dev/null +++ b/journal/2026-09-24-generator-c-override.md @@ -0,0 +1,29 @@ +# GeneratorのC出力とユーザーのCによる上書き + +## 結論 + +未決。backlog MAP-P-9 として保留(ユーザー指定)。フック方式が有力(ユーザー「フック方式いいかも」)。 +JSONを第一級にしてCを自動生成し、ユーザーのC/hで一部を上書きできるようにしたい、というのがユーザーの意向。 + +## 案の比較 + +| 案 | 内容 | 所見 | +| --- | --- | --- | +| (b) フック | 生成関数の先頭でユーザーのフックを呼び、未処理ならJSONの値 | キー単位の例外だけ書ける。JSONが正本のまま | +| (a) 関数ごと置き換え(JSONで宣言) | 宣言された関数はGeneratorが出力しない | 単純。その関数の範囲ではJSONの値が無効になる | +| (a') 関数ごと置き換え(hのプロトタイプで宣言) | ユーザーのhにあるプロトタイプの関数を出力しない(ユーザー案) | (a)と同じ性質。Generatorがhを解析する必要 | +| weak属性で上書き | 生成側をweakにしてユーザーの定義で上書き | 使えない(下記) | +| ユーザーのCを解析して自動判定 | — | 壊れやすい | + +## 根拠(QMK 0.34.4) + +- keymap.jsonで書けるもの: keyboard, keymap, layout, layers, encoders, dip_switches, macros, keycodes(名前宣言), config, modules, + host_language 等(data/schemas/keymap.jsonschema)。タップダンス・コンボ・キーオーバーライド・キーごとの設定はない。 +- キーごとの設定は `*_PER_KEY` を定義した上での `get_tapping_term(keycode, record)` 等のコールバック。keyrecordを受けるので + キーコード単位でも位置単位でも書ける。 +- keymap.jsonとkeymap.cを並べると、json2cで生成したkeymap.cがユーザーのkeymap.cを取り込む + (builddefs/build_keyboard.mk:148-157、OTHER_KEYMAP_C)。QMK自体がJSON + ユーザーCの共存に対応している。 +- 取り込みは同一翻訳単位なので、生成側weak + ユーザー側strongは再定義エラーになる。QMK本体のweak既定実装もあるため、 + 別ファイルにしても生成側をweakにする方式は選ばれる定義が不定。 +- プロトタイプの再宣言はCでは合法(同一シグネチャなら何度でも)。QMKが宣言済みの関数をユーザーのhに書いてもよい。 + シグネチャ違いはコンパイルエラーになるので検出にも使える。