# 機能設計書 33-最大化

## 概要

本ドキュメントは、Ghosttyターミナルエミュレータにおける最大化機能の設計を定義する。

### 本機能の処理概要

最大化機能は、ターミナルウィンドウを画面の利用可能領域全体に拡大する。フルスクリーンとは異なり、タスクバーやドックは表示されたままである。

**業務上の目的・背景**：ウィンドウを素早く画面全体に拡大することで、作業領域を効率的に活用できる。フルスクリーンほど没入的ではないが、他のアプリケーションへのアクセスを維持しつつ作業領域を最大化できる。

**機能の利用シーン**：
- 複数ウィンドウを切り替えながら大きな画面で作業したい場合
- 一時的に作業領域を拡大したい場合
- フルスクリーンほど没入的な環境を必要としない場合
- ドック・タスクバーへのアクセスを維持したい場合

**主要な処理内容**：
1. toggle_maximizeアクションの受信
2. 現在の最大化状態を確認
3. 最大化/最大化解除の切り替え
4. 外観の同期（syncAppearance）

**関連システム・外部連携**：
- Linux/GTK: gtk.Window.maximize()/unmaximize()
- macOS: 最大化の概念がないため、本機能は効果なし

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

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 1 | メインターミナルウィンドウ | 主画面 | ウィンドウ最大化の切り替え操作 |

## 機能種別

画面制御処理 / ウィンドウ状態管理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| - | - | - | パラメータなし（トグル動作） | - |

### 入力データソース

- キーバインド設定（keybind = toggle_maximize）
- 設定ファイル（maximize = true/false）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| isMaximized | bool | 最大化状態かどうか |

### 出力先

- ウィンドウ状態（最大化表示）

## 処理フロー

### 処理シーケンス

```
1. toggle_maximizeアクション受信
   └─ キーバインドまたはコマンドパレットから呼び出される
2. 現在の最大化状態を確認
   └─ isMaximized()をチェック
3. 最大化切り替え処理
   ├─ 最大化の場合: unmaximize()を呼び出し
   └─ 最大化でない場合: maximize()を呼び出し
4. propMaximizedコールバックが発火
   └─ syncAppearance()で外観を同期
```

### フローチャート

```mermaid
flowchart TD
    A[toggle_maximize受信] --> B[surfaceToggleMaximize呼び出し]
    B --> C{isMaximized?}
    C -->|Yes| D[unmaximize]
    C -->|No| E[maximize]
    D --> F[propMaximized通知]
    E --> F
    F --> G[syncAppearance]
    G --> H[完了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-33-01 | トグル動作 | 現在の最大化状態を反転 | toggle_maximize実行時 |
| BR-33-02 | 初期最大化 | 設定でmaximize=trueの場合、起動時に最大化 | ウィンドウ初期化時 |
| BR-33-03 | macOS非対応 | macOSでは最大化の概念がないため効果なし | macOS環境 |
| BR-33-04 | ヘッダーバー連動 | gtk-titlebar-hide-when-maximized設定でヘッダーバー非表示 | 最大化時かつ設定有効時 |
| BR-33-05 | タブバー連動 | titlebar-style=tabsかつgtk-titlebar-hide-when-maximized時にタブバー非表示 | 設定条件満たす時 |

### 計算ロジック

特になし。

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

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

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | - | - | エラーケースなし |

### リトライ仕様

リトライは行わない。

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

トランザクションは使用しない。

## パフォーマンス要件

- 最大化切り替え: 即座に反映されること

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

特になし。

## 備考

- macOSでは最大化の概念がないため、このアクションは効果がない
- GTKでは、gtk-titlebar-hide-when-maximized設定と連動してヘッダーバーを非表示にできる

---

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

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

### 推奨読解順序

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

最大化に関連するアクションと設定の定義を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | action.zig | `src/apprt/action.zig` | toggle_maximizeアクション定義（102-103行目） |
| 1-2 | Binding.zig | `src/input/Binding.zig` | toggle_maximizeバインディング（697-700行目） |

**読解のコツ**: macOSでは最大化の概念がないという記述に注意。

#### Step 2: GTK実装を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | window.zig | `src/apprt/gtk/class/window.zig` | surfaceToggleMaximize関数（1644-1656行目） |
| 2-2 | window.zig | `src/apprt/gtk/class/window.zig` | isMaximized関数（900-902行目） |
| 2-3 | window.zig | `src/apprt/gtk/class/window.zig` | propMaximized関数（1082-1088行目） |

**主要処理フロー**:
1. **1644-1656行目**: surfaceToggleMaximize - isMaximized状態に応じてmaximize/unmaximizeを呼び出し
2. **900-902行目**: isMaximized - gtk.Window.isMaximizedのラッパー
3. **1082-1088行目**: propMaximized - 最大化状態変更時のコールバック、syncAppearanceを呼び出し

#### Step 3: ヘッダーバー連動を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | window.zig | `src/apprt/gtk/class/window.zig` | getHeaderbarVisible関数（904-935行目）、getTabsVisible関数（959-979行目） |

**主要処理フロー**:
- **921-925行目**: isMaximizedかつgtk-titlebar-hide-when-maximized時にヘッダーバー非表示
- **965-967行目**: 同様の条件でタブバーも非表示

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

```
[キーバインド: toggle_maximize]
    │
    └─ [GTK]
           └─ Surface.signals.toggle-maximize
                  └─ Window.surfaceToggleMaximize
                          ├─ isMaximized判定
                          ├─ gtk.Window.maximize/unmaximize
                          └─ propMaximized (notify)
                                  └─ syncAppearance
                                          ├─ getHeaderbarVisible
                                          └─ getTabsVisible
```

### データフロー図

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

キーバインド ─────▶ toggle_maximize ──────────────────▶ ウィンドウ状態変更
                    アクション処理
                         │
gtk.Window ────────▶ isMaximized判定
状態                     │
                         ├─ maximize/unmaximize
                         │
設定値 ────────────▶ syncAppearance ──────────────────▶ ヘッダーバー表示制御
(gtk-titlebar-hide          │                          タブバー表示制御
-when-maximized)             │
                         getHeaderbarVisible
                         getTabsVisible
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| action.zig | `src/apprt/action.zig` | ソース | toggle_maximizeアクション定義 |
| Binding.zig | `src/input/Binding.zig` | ソース | キーバインドアクション定義 |
| command.zig | `src/input/command.zig` | ソース | コマンドパレット用コマンド定義 |
| window.zig | `src/apprt/gtk/class/window.zig` | ソース | GTKウィンドウ実装（最大化制御） |
| surface.zig | `src/apprt/gtk/class/surface.zig` | ソース | toggle-maximizeシグナル定義 |
| Config.zig | `src/config/Config.zig` | ソース | maximize、gtk-titlebar-hide-when-maximized設定 |
