BlinkGTK リサイズ動作仕様

v1.0.10 iter8 以降の BlinkWebView は、親コンテナのサイズ変更に自動追従します。
本ドキュメントではその動作仕様、移行時の注意点、および過去バージョンとの
違いを解説します。


1. 概要

BlinkWebViewGtkWidget を直接継承しており、GTK4 canonical な
size_allocate vfunc でサイズ変更通知を受け取ります。内部で Chromium の
RenderWidgetHostView::SetSize() を呼び、レンダリング解像度を自動更新します。

開発者は blink_web_view_set_canvas_size() を手動で呼ぶ必要はありません


2. 動作仕様

2.1 自動追従のトリガ

以下のイベントで、Chromium 側のビュー (RenderWidgetHostView) のサイズが自動的に更新されます:

トリガ 説明
ウィンドウリサイズ gtk_window_set_default_size() やユーザによるドラッグリサイズ
親レイアウトの再計算 GtkBox / GtkGrid 内で他ウィジェットが追加・削除された場合
notify::scale-factor 別モニタへドラッグ等による HiDPI スケール変化

2.2 座標系

2.3 最小コード例

#include <blink_gtk/blink_gtk.h>
#include <gtk/gtk.h>

int main(int argc, char* argv[]) {
  blink_gtk_init(&argc, &argv);  /* GTK4 は引数なし */

  GtkWidget* window = gtk_window_new();
  gtk_window_set_default_size(GTK_WINDOW(window), 1280, 800);

  BlinkWebView* view = BLINK_WEB_VIEW(blink_web_view_new());
  gtk_window_set_child(GTK_WINDOW(window), GTK_WIDGET(view));

  gtk_window_present(GTK_WINDOW(window));
  blink_web_view_load_uri(view, "https://www.example.com");

  return blink_gtk_run_main_loop();
}

ウィンドウリサイズ時に追加コードは不要です。BlinkWebView が自動で
親コンテナサイズに追従します。


3. 過去バージョンとの違い

3.1 v1.0.10 iter7 以前 (Issue #58)

v1.0.10 iter7 以前では、BlinkWebView が親コンテナサイズに追従せず、
Chromium 初期デフォルトの 800x600 固定で描画されていました。HiDPI 環境では
この 800x600 が物理ピクセル座標として扱われ、見かけ上は画面の左上 1/4 付近
(400x300 CSS px) に縮小表示される症状がありました。

回避策として blink_web_view_set_canvas_size(view, w, h) を手動で呼ぶ
必要がありました。しかし GTK4 では size-allocate シグナルが deprecated で、
GtkWidgetClass::size_allocate_vfunc を override するしかありません。
C アプリからは現実的に困難でした。

3.2 v1.0.10 iter8 以降

blink_gtk_api.cc に以下を追加して解消:

  1. GtkWidgetClass::size_allocate vfunc を BlinkWebView クラスで override
    • 親コンテナからの allocation 通知で内部的に SetCanvasSize() を呼ぶ
  2. measure vfunc の natural を 0x0 に変更
    • hexpand=TRUE / vexpand=TRUE (内部で自動設定) と組み合わせて
      親領域全体を埋める動作が素直になる
  3. notify::scale-factor ハンドラ追加
    • HiDPI 切替時に現在サイズを再通知

4. 注意点

4.1 最小サイズが 0 になる

measure が natural=0 を返すため、親コンテナ側で明示的に最小サイズを
確保していないと、レイアウト計算上 0x0 に縮退する可能性があります。
実用上は gtk_window_set_default_size()gtk_widget_set_size_request()
で最低サイズを指定してください。

4.2 set_canvas_size() は引き続き利用可能

ヘッドレステストや自動 resize 診断など、手動でサイズ制御したい用途では
blink_web_view_set_canvas_size(view, w, h) を引き続き使用できます。
手動呼出しは size_allocate 経由の自動更新と共存可能です。

4.3 連続同サイズの no-op 抑制

size_allocate は GTK レイアウト中に同一サイズで複数回呼ばれることが
あります。内部で連続同サイズを検出し Chromium IPC を抑制するため、
パフォーマンス影響はありません。


5. 回帰検出

BlinkGTK リリースビルドは release/scripts/check-resize-follow.sh
自動検証されます:

bash release/scripts/check-resize-follow.sh --tarball blinkgtk-*.tar.gz

window size 1280x800 → 1600x1000 の resize が size_allocate vfunc と
Chromium 側ビューの bounds の両方で追従していることを確認します。追従失敗時はリリース
ブロッカーとなります。


関連情報


最終更新: 2026-04-20 (v1.0.10 iter8)
作成者: BlinkGTK Project