# 機能設計書 72-アプリケーション終了

## 概要

本ドキュメントは、Windows Terminalにおけるアプリケーション終了（Quit）機能の設計を記述する。すべてのウィンドウを閉じてアプリケーション全体を終了する機能である。

### 本機能の処理概要

Quitアクションは、Windows Terminalのすべてのウィンドウを一括で閉じ、アプリケーション全体を終了する機能である。単一ウィンドウのCloseWindowとは異なり、マルチウィンドウ構成時にもすべてのインスタンスを終了させる。

**業務上の目的・背景**：複数のターミナルウィンドウを開いて作業している場合、1つずつ閉じるのではなく一括でアプリケーション全体を終了したいという要求に応える。作業終了時やシステムリソースの解放が必要な場合に使用される。

**機能の利用シーン**：作業を完全に終了する場合、すべてのターミナルセッションを一度に閉じたい場合、PCのシャットダウン前にすべてのターミナルを整理する場合に利用される。

**主要な処理内容**：
1. Quitアクションの受信
2. 確認ダイアログ（QuitDialog）の表示
3. ユーザーがOKを選択した場合、QuitRequestedイベントを発行
4. AppHostがすべてのウィンドウを閉じる処理を実行

**関連システム・外部連携**：WindowEmperor/AppHostを通じた全ウィンドウ管理との連携。

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

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 1 | TerminalPage（メイン画面） | 主画面 | _HandleQuitにより全ウィンドウを閉じてアプリ終了 |
| 14 | QuitDialog（終了確認） | 確認画面 | アプリケーション終了の確認ダイアログ |

## 機能種別

プロセス制御 / アプリケーション終了

## 入力仕様

### 入力パラメータ

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

### 入力データソース

キーバインドまたはコマンドパレットからのアクション発行。

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| QuitRequested イベント | イベント | アプリケーション終了要求イベント |

### 出力先

AppHost/WindowEmperorへのイベント通知

## 処理フロー

### 処理シーケンス

```
1. Quitアクション受信
   └─ _HandleQuitハンドラが呼び出される
2. RequestQuit() の呼び出し
   └─ 終了処理のコルーチン開始
3. 確認ダイアログの表示チェック
   └─ _displayingCloseDialogフラグで多重表示を防止
4. _ShowQuitDialog() による確認ダイアログ表示
   └─ QuitDialogをユーザーに表示
5. ユーザーの応答待ち
   └─ Primary（OK）またはキャンセルの選択
6. OKが選択された場合
   └─ QuitRequestedイベントを発行し全ウィンドウ終了
```

### フローチャート

```mermaid
flowchart TD
    A[Quitアクション受信] --> B[_HandleQuit]
    B --> C[RequestQuit]
    C --> D{_displayingCloseDialog?}
    D -->|Yes| E[処理中止]
    D -->|No| F[_displayingCloseDialog = true]
    F --> G[_ShowQuitDialog 表示]
    G --> H{ユーザーの選択}
    H -->|Primary OK| I[QuitRequested イベント発行]
    H -->|Cancel| J[ダイアログを閉じる]
    I --> K[全ウィンドウ終了]
    J --> L[_displayingCloseDialog = false]
    K --> M[アプリケーション終了]
    L --> N[通常操作に復帰]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-72-01 | 確認ダイアログ必須 | 終了前に必ず確認ダイアログを表示 | Quitアクション実行時 |
| BR-72-02 | 多重ダイアログ防止 | 確認ダイアログは同時に1つのみ表示 | _displayingCloseDialogフラグで制御 |
| BR-72-03 | 全ウィンドウ終了 | OKが選択された場合のみすべてのウィンドウを閉じる | ダイアログでPrimaryが選択された場合 |

### 計算ロジック

特になし。

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

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

本機能にデータベース操作はない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | ウィークリファレンス解決失敗 | コルーチン再開時にTerminalPageが破棄済みの場合 | co_return で処理を中止 |

### リトライ仕様

リトライは不要。

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

本機能にトランザクション処理はない。ただし、終了処理は「全ウィンドウを閉じる」操作として、部分的な終了は行わない。

## パフォーマンス要件

ダイアログ表示は即座に行われること。終了処理はすべてのウィンドウのクリーンアップが完了するまで待機する。

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

特になし。

## 備考

- CloseWindow（ウィンドウを閉じる）との違いに注意。Quitはすべてのウィンドウを対象とする
- TerminalPageの破棄順序に注意が必要（コルーチンの安全性のためweakリファレンスを使用）

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | TerminalPage.h | `src/cascadia/TerminalApp/TerminalPage.h` | RequestQuitメソッド宣言、_displayingCloseDialogフラグ（330行目） |

**読解のコツ**: safe_void_coroutine型はWinRTのコルーチンで、例外セーフな非同期メソッドを表す。co_awaitによる非同期待機が含まれる。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | AppActionHandlers.cpp | `src/cascadia/TerminalApp/AppActionHandlers.cpp` | _HandleQuitハンドラ（126-131行目） |

**主要処理フロー**:
1. **126-131行目**: _HandleQuit - RequestQuit()を呼び出し、args.Handled(true)を設定

#### Step 3: 終了処理の実装を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | TerminalPage.cpp | `src/cascadia/TerminalApp/TerminalPage.cpp` | RequestQuit()コルーチン（2205-2222行目）、_ShowQuitDialog()（893-896行目） |

**主要処理フロー**:
- **2205行目**: RequestQuit() コルーチン開始
- **2207行目**: _displayingCloseDialogの重複チェック
- **2212行目**: _ShowQuitDialogをco_awaitで待機
- **2221行目**: Primary以外が返った場合はco_return

#### Step 4: 上位層での終了処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | AppHost.cpp | `src/cascadia/WindowsTerminal/AppHost.cpp` | QuitRequestedイベントハンドラ |

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

```
TerminalPage::_HandleQuit (AppActionHandlers.cpp:126)
    │
    └─ TerminalPage::RequestQuit (TerminalPage.cpp:2205)
           │
           ├─ _ShowQuitDialog (TerminalPage.cpp:893)
           │      └─ _ShowDialogHelper("QuitDialog")
           │
           └─ QuitRequested イベント発行
                  │
                  └─ AppHost / WindowEmperor
                         └─ 全ウィンドウ終了処理
```

### データフロー図

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

Quitアクション ───▶ _HandleQuit ───▶ RequestQuit
                                          │
                                          ▼
                                    QuitDialog表示
                                          │
                                          ▼
ユーザー応答 ────▶ 応答判定 ─────▶ QuitRequestedイベント
(OK/Cancel)                        (全ウィンドウ終了)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| AppActionHandlers.cpp | `src/cascadia/TerminalApp/AppActionHandlers.cpp` | ソース | _HandleQuitアクションハンドラ |
| TerminalPage.cpp | `src/cascadia/TerminalApp/TerminalPage.cpp` | ソース | RequestQuit、_ShowQuitDialogの実装 |
| TerminalPage.h | `src/cascadia/TerminalApp/TerminalPage.h` | ヘッダー | _displayingCloseDialogフラグ宣言 |
| AppHost.cpp | `src/cascadia/WindowsTerminal/AppHost.cpp` | ソース | QuitRequestedイベント処理 |
| AppHost.h | `src/cascadia/WindowsTerminal/AppHost.h` | ヘッダー | AppHostクラス宣言 |
| AllShortcutActions.h | `src/cascadia/TerminalSettingsModel/AllShortcutActions.h` | ヘッダー | Quitアクション定義 |
