BlinkWebView ウィジェット

作成者: BlinkGTK Project
バージョン: 1.2.0-build2

BlinkWebView は、Chromium/Blink のレンダリング結果を表示する GTK4 ウィジェットです。
GtkWidget を継承しているので、他の GTK ウィジェットと同じように扱えます —
コンテナに入れ、シグナルを繋ぎ、プロパティを読み書きする。

このページはウィジェットとしての全体像を扱います。個々の関数の引数と戻り値は
C API リファレンスに、機能ごとの使い方は
逆引き索引にあります。

#define BLINK_TYPE_WEB_VIEW (blink_web_view_get_type())
G_DECLARE_FINAL_TYPE(BlinkWebView, blink_web_view, BLINK, WEB_VIEW, GtkWidget)

派生型ではなく final 型です。継承して機能を足すのではなく、シグナルと
ハンドラで振る舞いを与えます。

キャストマクロ BLINK_WEB_VIEW() と型判定 BLINK_IS_WEB_VIEW() が使えます。

親クラス GtkWidget
ヘッダ #include <blink_gtk/blink_gtk.h>
pkg-config blinkgtk-0.1

作る

3 通りあります。用途で選んでください。

関数 返すもの 使いどころ
blink_web_view_new() BlinkWebView (GtkWidget*) 通常はこれ。自分でコンテナに入れる
blink_web_view_new_container() GtkOverlay (中に BlinkWebView) 重ね合わせ表示を自前で組みたくないとき
blink_web_view_new_with_gpu_mode() BlinkWebView (GtkWidget*) 描画経路を明示して作る

blink_web_view_new_container() が返すのは GtkOverlay です。中の
BlinkWebView は次で取り出します。

GtkWidget *overlay = blink_web_view_new_container();
BlinkWebView *view = g_object_get_data(G_OBJECT(overlay), "blinkgtk-webview");

描画経路の指定は 設定 API を参照してください。

最小の使い方

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

int main(int argc, char **argv) {
    /* エンジンの初期化は GTK より先。ここで Chromium が起動する */
    if (!blink_gtk_init(&argc, &argv)) {
        g_printerr("blink_gtk_init() に失敗しました\n");
        return 1;
    }

    GtkWidget *window = gtk_window_new();
    gtk_window_set_default_size(GTK_WINDOW(window), 1024, 768);

    GtkWidget *view = blink_web_view_new();
    gtk_window_set_child(GTK_WINDOW(window), view);

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

    /* GTK の main loop ではなく、こちらを回す。
     * g_application_run() では描画が始まらない */
    return blink_gtk_run_main_loop();
}
gcc -o app app.c $(pkg-config --cflags --libs blinkgtk-0.1)

blink_gtk_run_main_loop() を回すことが要点です。GtkApplication
g_application_run() は Chromium 側のループを回さないため、ページの読み込みが
commit されず、画面が出ません。コンパイルも起動も通ってしまうので気付きにくい
箇所です。GtkApplication と組む書き方は
アプリに組み込むにあります。

シグナル

7 本あります。すべて実装済みです。

シグナル いつ出るか 詳細
load-changed 読み込みの段階が進んだとき シグナル API
load-failed 読み込みが失敗したとき シグナル API
uri-changed 表示中の URI が変わったとき シグナル API
title-changed ページのタイトルが変わったとき シグナル API
message-received ページの JavaScript からメッセージが来たとき アプリ連携 API
new-window-requested 新しいウィンドウが要求されたとき UI ハンドラ API
permission-request 位置情報・通知などの権限が要求されたとき UI ハンドラ API
static void on_title(BlinkWebView *view, const char *title, gpointer data) {
    gtk_window_set_title(GTK_WINDOW(data), title);
}

g_signal_connect(view, "title-changed", G_CALLBACK(on_title), window);

permission-request を除く 6 本は GObject Introspection にも載るため、
Python や Rust からも同じ名前で繋げます。

プロパティ

6 つあります。g_object_get() / g_object_set() で読み書きできます。

プロパティ 読み書き 対応する関数
uri gchar* 読み取り blink_web_view_get_uri()
title gchar* 読み取り blink_web_view_get_title()
is-loading gboolean 読み取り blink_web_view_is_loading()
zoom-level gdouble 読み書き blink_web_view_set_zoom_level()
gpu-mode enum 読み取り blink_web_view_get_gpu_mode()
devtools-locale gchar* 読み書き blink_gtk_set_devtools_locale()
g_autofree char *uri = NULL;
g_object_get(view, "uri", &uri, NULL);

g_object_set(view, "zoom-level", 1.25, NULL);

プロパティなので g_object_bind_property() で他のウィジェットに束ねられます。

/* タイトルをウィンドウに自動追従させる */
g_object_bind_property(view, "title", window, "title", G_BINDING_SYNC_CREATE);

何ができるか

BlinkWebView に対して呼べる公開関数は 73 個あります。機能ごとの入口:

やりたいこと 参照
URL を開く・戻る・進む・再読み込み ナビゲーション API
JavaScript の実行、ページとのメッセージ交換、独自 URL スキーム アプリ連携 API
ページ内検索、ズーム ページ検索・ズーム API
ダイアログ・ファイル選択・ダウンロード・権限を自前 UI にする UI ハンドラ API
フォント・User-Agent・コンテンツ保護・描画経路 設定 API
DevTools を繋ぐ DevTools API
PDF 出力、スクリーンショット、Cookie C API リファレンス

目的から関数を引くときは 逆引き索引が早いです。

WebKitGTK から移る場合

ウィジェットとしての位置付けは WebKitWebView と同じで、コンテナに入れて
シグナルを繋ぐ流れも変わりません。ただし関数名も対象の型も違います
対応表と書き換え例は
WebKitGTK からの移行にあります。

初期化の作法だけは大きく異なります。BlinkGTK は blink_gtk_init()
Chromium を起動し、blink_gtk_run_main_loop() でループを回します。

関連

変更履歴

変更
1.2.0-build2 公開 C API に基づいて全面的に書き直し。旧版は内部 C++ クラス (LoadURL() 等) を説明しており、記載どおりに書いてもビルドできなかった。併せて、実装済みのシグナル 7 本とプロパティ 6 つを「将来実装予定」と案内していた誤りを是正