# 機能設計書 3-GetCurrentContext

## 概要

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

### 本機能の処理概要

GetCurrentContext関数は、現在設定されているImGuiコンテキスト（GImGuiグローバル変数）へのポインタを返す非常にシンプルな関数である。

**業務上の目的・背景**：ImGuiライブラリは単一のグローバルコンテキストポインタ（GImGui）を通じて状態管理を行う。複数のコンテキストを使用する場合や、DLL境界を跨いで使用する場合、現在のコンテキストを取得して保存・復元する必要がある。この関数はそのような操作の基盤となる。マルチスレッド環境では、スレッドローカルストレージを使用してスレッドごとのコンテキストを管理することも可能である。

**機能の利用シーン**：
- 複数コンテキスト間の切り替え時に現在のコンテキストを保存
- DLL/共有ライブラリでコンテキストを明示的に取得
- デバッグ時のコンテキスト確認
- マルチスレッド環境でのコンテキスト管理

**主要な処理内容**：
1. GImGuiグローバル変数の値を返す

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

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

## 関連画面

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

## 機能種別

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

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| なし | - | - | 引数なし | - |

### 入力データソース

- GImGuiグローバル変数

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 戻り値 | ImGuiContext* | 現在のImGuiContextへのポインタ。コンテキストがない場合はNULL |

### 出力先

- 呼び出し元への戻り値

## 処理フロー

### 処理シーケンス

```
1. GImGuiグローバル変数を返す
   └─ return GImGui;
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B[GImGuiを返す]
    B --> C[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | NULL許容 | CreateContextが呼ばれていない場合、NULLを返す | GImGui == NULL |
| BR-02 | スレッドローカル対応 | IMGUI_SET_CURRENT_CONTEXT_FUNCマクロ定義時は、カスタム実装を使用可能 | マクロ定義時 |

### 計算ロジック

特になし

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

該当なし

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | - | NULLが返される | CreateContextを呼び出す |

### リトライ仕様

特になし

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

該当なし

## パフォーマンス要件

- インライン可能な非常に軽量な関数
- 頻繁に呼び出されるため、オーバーヘッドを最小限に抑える設計

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

- 特になし

## 備考

- バージョン1.49でGetInternalState()から変更された
- デバッグ時はGImGuiをウォッチ変数に追加すると、現在のコンテキストを確認できる

---

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

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

### 推奨読解順序

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

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

**読解のコツ**: GImGuiは通常のグローバル変数だが、以下のカスタマイズが可能:
- `#define GImGui`でスレッドローカル変数に置き換え可能
- IMGUI_SET_CURRENT_CONTEXT_FUNCでカスタムセッター定義可能

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

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

**主要処理フロー**:
1. **4049行目**: `return GImGui;` - 単純にグローバル変数を返す

#### Step 3: 関連するコンテキスト管理コードを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | imgui.cpp | `imgui.cpp` | 1401-1418行目: GImGuiに関するコメント（スレッドセーフティ、DLL対応等） |

**読解のコツ**:
- コメントにはマルチスレッド対応のためのthread_local使用方法が記載されている
- DLL境界を跨ぐ際の注意点も記載されている

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

```
ImGui::GetCurrentContext()
    │
    └─ return GImGui
```

### データフロー図

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

（なし）                  GetCurrentContext() ───────────▶ ImGuiContext*
                                   │                       (GImGuiの値)
                                   │
                                   ▼
                          GImGuiグローバル変数を読み取り
```

### 関連ファイル一覧

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