開発

English

UIngは、Crystalでネイティブアプリケーションを構築するための、小さく持続可能な基盤です。 変更を加えるときは、安定性、クロスプラットフォームの動作、既存のライフタイム規則を 維持してください。

APIレベル

レベル定義場所例用途
高レベルsrc/uing/*.crbutton.on_clicked { }オブジェクト指向のアプリケーションAPI
低レベルsrc/uing/lib_ui/lib_ui.crUIng::LibUI.new_buttonlibui-ngへの直接バインディング

高レベルAPIはWindow、Label、Buttonなどの基本コントロールに加え、Tableや Areaなどの高度なコントロールも提供します。通常のアプリケーションコードでは こちらを使います。UIng::LibUIは、基盤となるC APIへの直接アクセスと、高レベル ラッパーの実装に使用します。

低レベルバインディングとネイティブライブラリ

低レベルバインディングは、当初 crystal_libで生成していました。 生成後にもLibC::Intから高レベルのBoolへの変換など、多くの手動調整が必要だったため、 現在はAIの支援も利用しながら直接保守しています。

コンポーネントを追加するときは、既存コントロールのコールバックとライフタイムの パターンに従います。ネイティブのlibui-ngは kojix2/libui-ngのGitHub Actionsでビルドされ、 UIng固有の拡張はdevブランチで保守されます。Windowsではcomctl32.manifestにより Common Controls v6を選択し、OS標準コントロールに新しい視覚スタイルを適用します。

メモリ安全性

  • レジストリと親への参照で、ネイティブ側の破棄までラッパーを保持します。
  • AreaとTable::ModelがHandlerを、Handlerがクロージャと捕捉したCrystalオブジェクトを 保持します。捕捉したネイティブ資源は使用中、有効に保ってください。
  • 通常のコールバックはdataからBox化したクロージャを復元します。AreaとTableモデルは 公開UserDataフィールド(LibUIではuser_data)からHandlerを復元します。
  • 借用されたコールバック値は、コールバック終了時に無効化されます。

LibUIを直接使う場合は、ハンドラとコールバック用データを利用者側で保持します。 ネイティブライブラリはFFIレイアウトと一致させ、download.crのリリースとチェックサムを 合わせて更新してください。解放規則はランタイムとライフタイムを参照してください。

生成AIの利用

GitHub Actions、複雑なサンプル、メモリ安全性のレビュー、パッチ適用版libui-ngの開発に 生成AIを利用しています。UIngは反復的な実装と、生成コードに対する人間の行単位レビュー から始まりました。現在の人間の作業は、全体設計、ネイティブGUIの目視確認、実際の利用を 通じた改善点の発見に重点を置いています。

コントリビューション

  • リポジトリをforkしてPull Requestを送ってください。
  • 再現手順、プラットフォーム、Crystalのバージョンを添えてバグを報告してください。
  • 表示動作を変更するときは、クロスプラットフォームのサンプルも追加・更新してください。
  • UIngに関する記事や利用報告も歓迎します。