# 機能設計書 27-マルチウィンドウ

## 概要

本ドキュメントは、Ghosttyターミナルエミュレータにおける「マルチウィンドウ」機能の設計を記述する。マルチウィンドウ機能は、複数の独立したターミナルウィンドウを開き、それぞれを独立して管理する機能である。

### 本機能の処理概要

**業務上の目的・背景**：
ユーザーは複数のタスクを並行して実行する際、異なるコンテキストを持つ複数のターミナルウィンドウを必要とする。マルチウィンドウ機能により、ユーザーは複数の独立したターミナルセッションを開き、それぞれを独立して配置、管理できる。これにより、複数プロジェクトの同時作業、異なるサーバーへの接続、開発とテストの分離などが容易になる。

**機能の利用シーン**：
- 複数プロジェクトの同時作業
- 異なるサーバー/環境への接続
- 開発、テスト、ログ監視の分離
- 複数ディスプレイでの作業

**主要な処理内容**：
1. 新規ウィンドウの作成（new_windowアクション）
2. ウィンドウ間のフォーカス切り替え（goto_window）
3. ウィンドウの閉じる処理（close_window）
4. ウィンドウ設定の継承（フォントサイズ等）
5. ウィンドウ復元（macOS/Undo機能）

**関連システム・外部連携**：
- アプリケーションランタイム（GTK/macOS AppKit）
- 設定システム
- Undo/Redo システム

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

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 1 | メインターミナルウィンドウ | 結果表示画面 | 新規ウィンドウの作成先 |

## 機能種別

ウィンドウ管理 / UI制御

## 入力仕様

### 入力パラメータ

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

### 入力データソース

- キーバインドアクション（new_window）
- メニュー操作
- IPC（外部からの新規ウィンドウ要求）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| window | *Window | 作成されたウィンドウへのポインタ |

### 出力先

- OS（ウィンドウシステム）
- アプリケーション状態

## 処理フロー

### 処理シーケンス

```
1. new_windowアクション受信
   └─ キーバインドまたはメニューから

2. 設定継承判定
   └─ ターゲットがSurfaceの場合、設定を継承

3. ウィンドウ作成
   └─ apprt.createWindow()

4. Surface初期化
   └─ 新規Surfaceの作成とウィンドウへの配置

5. フォーカス設定
   └─ 新規ウィンドウをフォアグラウンドに
```

### フローチャート

```mermaid
flowchart TD
    A[new_windowアクション] --> B{ターゲット}
    B -->|app| C[デフォルト設定使用]
    B -->|surface| D[設定を継承]

    C --> E[apprt.createWindow]
    D --> E

    E --> F[Surface.init]
    F --> G[ウィンドウ表示]
    G --> H[フォーカス設定]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-27-1 | 設定継承 | Surfaceからnew_window時はフォントサイズ等を継承 | target == surface |
| BR-27-2 | フォーカス移動 | 新規ウィンドウは自動的にフォーカスを受け取る | 常時 |
| BR-27-3 | アンドゥ対応 | ウィンドウの閉じる操作はアンドゥ可能 | macOS、undo-timeout内 |

### 計算ロジック

該当なし

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

該当なし（本機能はデータベースを使用しない）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | ウィンドウ作成失敗 | システムリソース不足等 | エラーログ出力 |

### リトライ仕様

該当なし

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

該当なし

## パフォーマンス要件

- ウィンドウ作成: 通常1秒以内

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

- 各ウィンドウは独立したPTYセッションを持つ
- ウィンドウ間でのセキュリティ分離は維持

## 備考

- macOSではウィンドウ復元（Window Restoration）をサポート
- GTKではウィンドウ状態の永続化は限定的

---

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

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

### 推奨読解順序

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

ウィンドウ管理に関わるアクション定義を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Binding.zig | `src/input/Binding.zig` | new_windowアクション定義（532行目） |
| 1-2 | action.zig | `src/apprt/action.zig` | new_windowアクション定義（84行目） |
| 1-3 | action.zig | `src/apprt/action.zig` | close_windowアクション定義（289行目） |

**読解のコツ**: Binding.Action.new_windowが引数なしのvoid型であることを確認。

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

アクション処理の流れを確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Binding.zig | `src/input/Binding.zig` | Action.scope関数でのnew_windowのスコープ確認（1300-1303行目） |

**主要処理フロー**:
1. **1300-1303行目**: new_windowはappスコープだが、surfaceコンテキストで特別処理される場合がある

#### Step 3: プラットフォーム実装を理解する

各プラットフォームでのウィンドウ作成を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | App.zig | `src/apprt/gtk/App.zig` | GTKでのウィンドウ作成 |
| 3-2 | application.zig | `src/apprt/gtk/class/application.zig` | GTKアプリケーションクラス |

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

```
キーバインド/メニュー
    │
    └─ new_windowアクション
           │
           ├─ [app scope]
           │      └─ App.performAction(.new_window)
           │
           └─ [surface context]
                  └─ Surface → App.performAction(.new_window)
                         │
                         └─ 設定継承処理
                                │
                                ▼
                         apprt.createWindow()
                                │
                                ▼
                         Surface.init()
                                │
                                ▼
                         ウィンドウ表示
```

### データフロー図

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

new_window ────────▶ App.performAction() ────▶ apprt.createWindow()
アクション                   │                        │
                            ▼                        ▼
                     設定読み込み ────────▶ Window オブジェクト
                            │                        │
                            ▼                        ▼
                     Surface.init() ────────▶ PTY作成
                                                     │
                                                     ▼
                                               ウィンドウ表示
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Binding.zig | `src/input/Binding.zig` | ソース | new_windowアクション定義 |
| action.zig | `src/apprt/action.zig` | ソース | apprtアクション定義 |
| App.zig | `src/App.zig` | ソース | アプリケーション管理 |
| App.zig | `src/apprt/gtk/App.zig` | ソース | GTKアプリケーション実装 |
| window.zig | `src/apprt/gtk/class/window.zig` | ソース | GTKウィンドウクラス |
| Surface.zig | `src/Surface.zig` | ソース | Surface管理 |
