作成者: 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 リファレンス |
目的から関数を引くときは 逆引き索引が早いです。
ウィジェットとしての位置付けは WebKitWebView
と同じで、コンテナに入れて
シグナルを繋ぐ流れも変わりません。ただし関数名も対象の型も違います。
対応表と書き換え例は
WebKitGTK
からの移行にあります。
初期化の作法だけは大きく異なります。BlinkGTK は
blink_gtk_init() で
Chromium を起動し、blink_gtk_run_main_loop()
でループを回します。
| 版 | 変更 |
|---|---|
| 1.2.0-build2 | 公開 C API に基づいて全面的に書き直し。旧版は内部 C++ クラス
(LoadURL() 等)
を説明しており、記載どおりに書いてもビルドできなかった。併せて、実装済みのシグナル
7 本とプロパティ 6 つを「将来実装予定」と案内していた誤りを是正 |