# 画面設計書 9-閉じる確認ダイアログ

## 概要

本ドキュメントは、Ghosttyターミナルエミュレータの閉じる確認ダイアログの設計について記載する。このダイアログは、アプリケーション、ウィンドウ、タブ、スプリットを閉じる前に、実行中のプロセスがある場合にユーザーに確認を求める。

### 本画面の処理概要

閉じる確認ダイアログは、ユーザーが意図せずに実行中のプロセスを終了させることを防ぐためのセキュリティ機能を提供する。

**業務上の目的・背景**：ターミナル内でプロセスが実行中の場合、突然の終了はデータ損失や作業の中断を引き起こす可能性がある。このダイアログにより、ユーザーは閉じる操作の影響を理解した上で、明示的に確認を行うことができる。

**画面へのアクセス方法**：
- プロセス実行中にウィンドウの閉じるボタン（赤X）をクリック
- プロセス実行中にCmd+Wでウィンドウを閉じようとした時
- プロセス実行中にアプリケーションを終了しようとした時
- プロセス実行中にタブを閉じようとした時
- プロセス実行中にスプリットを閉じようとした時

**主要な操作・処理内容**：
1. 閉じる対象と影響の確認
2. 「Close」ボタンで閉じる操作を実行
3. 「Cancel」ボタンで閉じる操作をキャンセル

**画面遷移**：
- 閉じる操作（プロセス実行中） → 閉じる確認ダイアログ表示
- Close → ダイアログ閉じる → 対象を閉じる
- Cancel → ダイアログ閉じる → 元の状態に戻る

**権限による表示制御**：特になし。すべてのユーザーに同一のダイアログが表示される。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 78 | 終了確認 | 主機能 | アプリ/ウィンドウ/タブ/スプリット閉じる前の確認 |

## 画面種別

確認ダイアログ（モーダル）

## URL/ルーティング

N/A（ネイティブデスクトップアプリケーション）

## 入出力項目

| 項目名 | 入力/出力 | データ型 | 必須 | 説明 |
|--------|----------|----------|------|------|
| target | 入力 | Target | はい | 閉じる対象（app/window/tab/surface） |

## 表示項目

| 項目名 | 表示位置 | データ型 | 説明 |
|--------|----------|----------|------|
| ダイアログタイトル | 上部 | Text | 対象に応じたタイトル |
| 説明テキスト | 中央 | Text | 閉じる影響の説明 |
| キャンセルボタン | 下部 | Button | 閉じる操作をキャンセル |
| 閉じるボタン | 下部 | Button | 閉じる操作を実行 |

## イベント仕様

### 1-ダイアログ表示

閉じる確認が必要な操作が発生すると、以下の処理が実行される（GTK版）：

1. `CloseConfirmationDialog.new(target)`でダイアログを作成
2. `present(parent)`で親ウィンウにアタッチして表示
3. ターゲットに応じてタイトルと本文を設定

### 2-Closeボタン押下

「Close」ボタンが押下されると、以下の処理が実行される：

1. `response`コールバックが呼び出される
2. レスポンスが"close"の場合、`close-request`シグナルを発行
3. 呼び出し元が対象を閉じる処理を実行

### 3-Cancelボタン押下

「Cancel」ボタンが押下されると、以下の処理が実行される：

1. `response`コールバックが呼び出される
2. レスポンスが"close"でないため、`cancel`シグナルを発行
3. ダイアログが閉じる
4. 元の状態に戻る

## データベース更新仕様

N/A（本アプリケーションはデータベースを使用しない）

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|-------------|------|---------------|----------|
| MSG001 | タイトル | "Quit Ghostty?" | target = app |
| MSG002 | タイトル | "Close Tab?" | target = tab |
| MSG003 | タイトル | "Close Window?" | target = window |
| MSG004 | タイトル | "Close Split?" | target = surface |
| MSG005 | 本文 | "All terminal sessions will be terminated." | target = app |
| MSG006 | 本文 | "All terminal sessions in this tab will be terminated." | target = tab |
| MSG007 | 本文 | "All terminal sessions in this window will be terminated." | target = window |
| MSG008 | 本文 | "The currently running process in this split will be terminated." | target = surface |

## 例外処理

| 例外状況 | 処理内容 |
|----------|----------|
| プロセスがない場合 | ダイアログを表示せず直接閉じる |

## 備考

- GTK専用機能（macOSはNSAlertを使用）
- Dialog基底クラスを継承
- Blueprintテンプレート（close-confirmation-dialog.blp）でUI定義
- 4種類のターゲット：app、window、tab、surface
- i18n対応（_()マクロで国際化）

---

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

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

### 推奨読解順序

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

Target enumを理解。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | close_confirmation_dialog.zig | `src/apprt/gtk/class/close_confirmation_dialog.zig` | Target enum（176-204行目） |

**読解のコツ**: Targetはapp/tab/window/surfaceの4種類。title()とbody()メソッドで表示テキストを返す。

#### Step 2: ダイアログ構造を理解する

CloseConfirmationDialog構造を理解。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | close_confirmation_dialog.zig | `src/apprt/gtk/class/close_confirmation_dialog.zig` | CloseConfirmationDialog構造体（12-22行目） |
| 2-2 | close_confirmation_dialog.zig | 同上 | signals構造体（44-66行目） |

**主要処理フロー**:
1. **73-77行目**: new - インスタンス作成
2. **83-91行目**: present - ダイアログ表示
3. **97-116行目**: response - 結果処理

#### Step 3: シグナルを理解する

close-requestとcancelシグナルを理解。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | close_confirmation_dialog.zig | `src/apprt/gtk/class/close_confirmation_dialog.zig` | signals構造体（44-66行目） |

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

```
CloseConfirmationDialog (GObject Class)
    │
    ├─ extends Dialog (→ adw.AlertDialog)
    │
    ├─ properties
    │      └─ target: Target (app/tab/window/surface)
    │
    ├─ signals
    │      ├─ close-request: () -> void
    │      └─ cancel: () -> void
    │
    ├─ Target enum
    │      ├─ app → "Quit Ghostty?" / "All terminal sessions..."
    │      ├─ tab → "Close Tab?" / "All terminal sessions in this tab..."
    │      ├─ window → "Close Window?" / "All terminal sessions in this window..."
    │      └─ surface → "Close Split?" / "The currently running process..."
    │
    ├─ new(target) -> *CloseConfirmationDialog
    │
    ├─ present(parent)
    │      ├─ setHeading(target.title())
    │      ├─ setBody(target.body())
    │      └─ Dialog.present(parent)
    │
    └─ response(response_id)
           │
           ├─ (response_id == "close") → signals.close-request.emit()
           └─ (otherwise) → signals.cancel.emit()
```

### データフロー図

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

閉じる操作要求 ──────────▶ CloseConfirmationDialog.new(target)
                              │
                              ▼
                        present(parent)
                              │
                              ├─ setHeading(target.title())
                              └─ setBody(target.body())
                              │
                              ▼
ユーザー操作 ────────────▶ response(response_id)
(Close/Cancel)                │
                              ├─ "close" → signals.close-request ─▶ 閉じる実行
                              └─ other → signals.cancel ──────────▶ キャンセル
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| close_confirmation_dialog.zig | `src/apprt/gtk/class/close_confirmation_dialog.zig` | ソース | GTK版閉じる確認ダイアログ |
| dialog.zig | `src/apprt/gtk/class/dialog.zig` | ソース | Dialog基底クラス |
| close-confirmation-dialog.blp | `src/apprt/gtk/ui/close-confirmation-dialog.blp` | UI定義 | Blueprintテンプレート |
| BaseTerminalController.swift | `macos/Sources/Features/Terminal/BaseTerminalController.swift` | ソース | macOS版confirmClose（320-356行目） |
