# 機能設計書 96-画面リセット

## 概要

本ドキュメントは、Ghosttyターミナルエミュレータにおける「画面リセット」機能の設計を記述する。本機能により、ターミナルの状態を初期状態に完全にリセットし、クリーンな状態から操作を再開できる。

### 本機能の処理概要

画面リセット機能は、ターミナルエミュレータの内部状態を完全に初期化する。スクリーンバッファ、カーソル位置、モード設定、色設定、タブストップなど、ターミナルの全ての状態がデフォルト値にリセットされる。

**業務上の目的・背景**：ターミナルアプリケーションが異常終了した場合や、エスケープシーケンスの不正使用によりターミナル状態が破損した場合がある。そのような状況で、ターミナルを再起動せずに正常な状態に復帰できる機能が必要。`reset`コマンドや`stty sane`に相当する機能をキーバインドで提供する。

**機能の利用シーン**：
- アプリケーション異常終了後のターミナル復旧
- 画面表示が乱れた場合のリセット
- カラー設定やモード設定をデフォルトに戻したい場合

**主要な処理内容**：
1. ユーザーがresetアクションを実行
2. Terminal.fullReset()が呼び出される
3. プライマリスクリーンに切り替え
4. 代替スクリーンを削除
5. モード、フラグ、タブストップなど全ての状態をリセット
6. 画面が再描画される

**関連システム・外部連携**：特になし

**権限による制御**：特になし。全ユーザーが利用可能。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 1 | メインターミナルウィンドウ | 主画面 | リセット操作が行われる画面 |

## 機能種別

状態管理 / 初期化処理

## 入力仕様

### 入力パラメータ

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

### 入力データソース

- キーバインド設定（`keybind = reset`）
- コマンドパレットからの選択（「Reset Terminal」）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| なし | - | 状態のリセットのみ（出力データなし） |

### 出力先

- ターミナル内部状態
- 画面表示（リセット後の初期状態）

## 処理フロー

### 処理シーケンス

```
1. ユーザーがresetアクションを実行
   └─ キーバインドまたはコマンドパレット経由
2. Surface.performBindingActionでアクションを処理
   └─ renderer_state.mutexをロック
3. Terminal.fullReset()を呼び出し
   └─ プライマリスクリーンに切り替え
   └─ 代替スクリーンを削除
   └─ アクティブスクリーンをリセット
   └─ モード、フラグ、タブストップをリセット
   └─ スクロール領域をリセット
4. dirtyフラグを設定
   └─ 画面全体の再描画を指示
5. 画面が再描画される
```

### フローチャート

```mermaid
flowchart TD
    A[resetアクション実行] --> B[renderer_state.mutex取得]
    B --> C[Terminal.fullReset]
    C --> D[プライマリスクリーンに切り替え]
    D --> E[代替スクリーンを削除]
    E --> F[アクティブスクリーンをリセット]
    F --> G[モード・フラグ・タブストップをリセット]
    G --> H[スクロール領域をリセット]
    H --> I[dirtyフラグを設定]
    I --> J[画面再描画]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-96-1 | スクリーン切替 | リセット時はプライマリスクリーンに戻る | 常時 |
| BR-96-2 | 代替スクリーン | 代替スクリーンは削除される | 常時 |
| BR-96-3 | スクロールバック | スクロールバック履歴はクリアされる | 常時 |
| BR-96-4 | モードリセット | 全てのターミナルモードがデフォルトに戻る | 常時 |

### 計算ロジック

特になし（状態の初期化のみ）

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

### 操作別データベース影響一覧

本機能はデータベースを使用しない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | なし | リセットは常に成功する | - |

### リトライ仕様

リトライ不要

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

トランザクション不要（メモリ上の状態更新のみ）

## パフォーマンス要件

リセット操作は即座に完了すること（100ms以内）

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

- スクロールバック履歴が消去されるため、機密情報が含まれている場合はセキュリティ上有益

## 備考

- `clear_screen`アクションとは異なり、resetはターミナルの全状態を初期化する
- RIS（Reset to Initial State）エスケープシーケンス相当の動作

---

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

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

### 推奨読解順序

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

アクション定義を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Binding.zig | `src/input/Binding.zig` | resetアクション定義 |

**読解のコツ**: resetはパラメータなしのシンプルなアクション。

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

Surfaceでのアクション処理を追う。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Surface.zig | `src/Surface.zig` | reset処理（5217-5221行目） |

**主要処理フロー**:
1. **5217行目**: resetアクションのマッチング
2. **5218行目**: renderer_state.mutex.lock()でロック取得
3. **5219行目**: deferでunlock
4. **5220行目**: self.renderer_state.terminal.fullReset()を呼び出し

#### Step 3: Terminal.fullResetを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Terminal.zig | `src/terminal/Terminal.zig` | fullReset関数（3028-3055行目） |

**主要処理フロー**:
- **3030行目**: self.screens.switchTo(.primary) - プライマリスクリーンに切り替え
- **3031-3034行目**: self.screens.remove(..., .alternate) - 代替スクリーンを削除
- **3037行目**: self.screens.active.reset() - アクティブスクリーンをリセット
- **3040行目**: self.modes.reset() - モードをリセット
- **3041行目**: self.flags = .{} - フラグをリセット
- **3042行目**: self.tabstops.reset(TABSTOP_INTERVAL) - タブストップをリセット
- **3043行目**: self.previous_char = null - 前回文字をクリア
- **3044行目**: self.pwd.clearRetainingCapacity() - PWDをクリア
- **3045行目**: self.status_display = .main - ステータス表示をリセット
- **3046-3051行目**: self.scrolling_region - スクロール領域をリセット
- **3054行目**: self.flags.dirty.clear = true - dirtyフラグを設定

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

```
Surface.performBindingAction
    │
    └─ resetアクションを検出
           │
           ├─ renderer_state.mutex.lock()
           │
           └─ Terminal.fullReset()
                  │
                  ├─ screens.switchTo(.primary)
                  │
                  ├─ screens.remove(.alternate)
                  │
                  ├─ screens.active.reset()
                  │
                  ├─ modes.reset()
                  │
                  ├─ flags = .{}
                  │
                  ├─ tabstops.reset()
                  │
                  └─ flags.dirty.clear = true
```

### データフロー図

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

キーバインド ───▶ Surface.performBindingAction ───▶ 状態リセット
                        │
                        ▼
               Terminal.fullReset()
                        │
                        ├─ スクリーン切替・削除
                        ├─ モード・フラグリセット
                        ├─ タブストップリセット
                        └─ dirtyフラグ設定 ───▶ 画面再描画
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Binding.zig | `src/input/Binding.zig` | ソース | resetアクション定義 |
| command.zig | `src/input/command.zig` | ソース | コマンドパレット用コマンド（138-142行目） |
| Surface.zig | `src/Surface.zig` | ソース | アクション処理のエントリーポイント |
| Terminal.zig | `src/terminal/Terminal.zig` | ソース | fullReset関数の実装 |
| Screen.zig | `src/terminal/Screen.zig` | ソース | スクリーンのreset関数 |
| modes.zig | `src/terminal/modes.zig` | ソース | モードのreset関数 |
