# 機能設計書 4-SetCurrentContext

## 概要

本ドキュメントはDear ImGuiライブラリのSetCurrentContext関数に関する機能設計書である。SetCurrentContextは現在アクティブなImGuiコンテキストを設定する関数である。

### 本機能の処理概要

SetCurrentContext関数は、グローバル変数GImGuiに指定されたImGuiContextポインタを設定し、以降のImGui API呼び出しがそのコンテキストに対して行われるようにする。

**業務上の目的・背景**：ImGuiライブラリは暗黙的なグローバルコンテキストを使用してすべての状態を管理する。複数のコンテキストを使用する場合（複数のウィンドウ、プラグインシステム等）、適切なコンテキストに切り替える必要がある。また、DLL境界を跨ぐ場合、各DLLは独自のグローバル変数を持つため、明示的にコンテキストを設定する必要がある。この関数はそのようなコンテキスト切り替えの基盤となる。

**機能の利用シーン**：
- 複数コンテキスト間の切り替え
- DLL/共有ライブラリでのコンテキスト設定
- マルチスレッド環境でのスレッドごとのコンテキスト設定
- CreateContext後の初期コンテキスト設定（内部使用）

**主要な処理内容**：
1. GImGuiグローバル変数に引数のコンテキストポインタを設定
2. カスタムフック（IMGUI_SET_CURRENT_CONTEXT_FUNC）が定義されている場合はそれを使用

**関連システム・外部連携**：
- GImGuiグローバル変数：コンテキストポインタを保持
- IMGUI_SET_CURRENT_CONTEXT_FUNCマクロ：カスタム実装フック
- スレッドローカルストレージ：マルチスレッド対応時のオプション

**権限による制御**：特になし

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | - | - | 全ての画面に関連する内部ユーティリティ |

## 機能種別

コンテキスト管理 / ユーティリティ

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| ctx | ImGuiContext* | Yes | 設定するコンテキスト。NULLも許容 | なし |

### 入力データソース

- アプリケーションコード

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 戻り値 | void | 戻り値なし |

### 出力先

- GImGuiグローバル変数

## 処理フロー

### 処理シーケンス

```
1. カスタムフック確認
   └─ IMGUI_SET_CURRENT_CONTEXT_FUNCが定義されているか確認

2. コンテキスト設定
   ├─ カスタムフック有：IMGUI_SET_CURRENT_CONTEXT_FUNC(ctx)を呼び出し
   └─ カスタムフック無：GImGui = ctx を実行
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B{IMGUI_SET_CURRENT_CONTEXT_FUNC<br/>が定義されている?}
    B -->|Yes| C[IMGUI_SET_CURRENT_CONTEXT_FUNC ctx を呼び出し]
    B -->|No| D[GImGui = ctx]
    C --> E[終了]
    D --> E
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | NULL許容 | ctxにNULLを渡すことで、現在のコンテキストをクリアできる | 引数がNULLの場合 |
| BR-02 | カスタムフック | IMGUI_SET_CURRENT_CONTEXT_FUNCマクロが定義されている場合、カスタム実装が使用される | マクロ定義時 |
| BR-03 | 即時反映 | 設定後、すべてのImGui API呼び出しは新しいコンテキストに対して行われる | 常に |

### 計算ロジック

特になし

## データベース操作仕様

該当なし

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | - | 無効なポインタを渡した場合、未定義動作 | 有効なコンテキストポインタを渡す |

### リトライ仕様

特になし

## トランザクション仕様

該当なし

## パフォーマンス要件

- インライン可能な非常に軽量な関数
- グローバル変数への単純代入のみ

## セキュリティ考慮事項

- 無効なポインタを設定すると、以降のImGui呼び出しでクラッシュの可能性

## 備考

- バージョン1.49でSetInternalState()から変更された
- DLL境界を跨ぐ場合、SetAllocatorFunctions()も合わせて呼び出す必要がある

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | imgui.cpp | `imgui.cpp` | 1419-1421行目: GImGuiグローバル変数の定義 |

**読解のコツ**:
- `#ifndef GImGui`で囲まれており、ユーザー定義でオーバーライド可能
- デフォルトはNULLで初期化

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | imgui.h | `imgui.h` | 395行目: SetCurrentContextのAPI宣言 |
| 2-2 | imgui.cpp | `imgui.cpp` | 4052-4059行目: SetCurrentContext関数の実装 |

**主要処理フロー**:
1. **4054-4055行目**: カスタムフック確認 `#ifdef IMGUI_SET_CURRENT_CONTEXT_FUNC`
2. **4055行目**: カスタムフック使用時 `IMGUI_SET_CURRENT_CONTEXT_FUNC(ctx)`
3. **4057行目**: 通常時 `GImGui = ctx`

#### Step 3: カスタムフックの理解

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | imgui.cpp | `imgui.cpp` | 1401-1418行目: GImGuiに関するコメント |

**読解のコツ**:
- IMGUI_SET_CURRENT_CONTEXT_FUNCはマルチスレッド対応のカスタムフック
- thread_localを使用したスレッドローカルストレージの実装例が記載されている

### プログラム呼び出し階層図

```
ImGui::SetCurrentContext(ctx)
    │
    ├─ [IMGUI_SET_CURRENT_CONTEXT_FUNC定義時]
    │      └─ IMGUI_SET_CURRENT_CONTEXT_FUNC(ctx)
    │
    └─ [通常時]
           └─ GImGui = ctx
```

### データフロー図

```
[入力]                    [処理]                           [出力]

ctx ─────────────────────▶ SetCurrentContext() ──────────▶ GImGui更新
(ImGuiContext*)                   │
                                  │
                                  ▼
                          GImGuiグローバル変数に
                          ctxを設定
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| imgui.h | `imgui.h` | ヘッダー | パブリックAPI宣言（395行目） |
| imgui.cpp | `imgui.cpp` | ソース | 実装（4052-4059行目） |
| imgui.cpp | `imgui.cpp` | ソース | GImGui定義（1419-1421行目） |
| imconfig.h | `imconfig.h` | 設定 | IMGUI_SET_CURRENT_CONTEXT_FUNCのカスタマイズ |
