BlinkGTK Settings API チュートリアル(C言語)

対象読者: C言語プログラマー、GTK4初心者〜中級者
最終更新: 2026-07-29
言語: 日本語 |

English


目次

  1. はじめに
  2. 基本的な使い方
  3. JavaScript制御
  4. User-Agent変更
  5. 画像読み込み制御
  6. ローカルストレージ制御
  7. 実用例
  8. トラブルシューティング

はじめに

BlinkGTK Settings APIを使用すると、ブラウザの動作を細かくカスタマイズできます。

前提条件

開発環境セットアップ

# 必要なパッケージをインストール(Fedora/RHEL系)
sudo dnf install gtk4-devel

# BlinkGTKのビルド(別途ドキュメント参照)

基本的な使い方

最小限のプログラム

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

static void on_activate(GtkApplication* app, gpointer user_data) {
    // ウィンドウ作成
    GtkWidget* window = gtk_application_window_new(app);
    gtk_window_set_title(GTK_WINDOW(window), "BlinkGTK Settings Example");
    gtk_window_set_default_size(GTK_WINDOW(window), 800, 600);

    // WebView作成
    GtkWidget* web_view = blink_web_view_new();
    gtk_window_set_child(GTK_WINDOW(window), web_view);

    // URLロード
    blink_web_view_load_uri(BLINK_WEB_VIEW(web_view), "https://example.com");

    // ウィンドウ表示
    gtk_window_present(GTK_WINDOW(window));
}

int main(int argc, char* argv[]) {
    // BlinkGTK初期化
    if (!blink_gtk_init(&argc, &argv)) {
        g_critical("Failed to initialize BlinkGTK");
        return 1;
    }

    // アプリケーション作成
    GtkApplication* app = gtk_application_new(
        "org.example.blinkgtk",
        G_APPLICATION_DEFAULT_FLAGS);

    g_signal_connect(app, "activate", G_CALLBACK(on_activate), NULL);

    /* 注意 g_application_run() は使用禁止 — Chromium RunLoop が飢餓状態になる
     * g_application_register/activate で GtkApplication シグナルを発火させてから
     * blink_gtk_run_main_loop() でChromium RunLoop を起動する */
    g_application_register(G_APPLICATION(app), NULL, NULL);
    g_application_activate(G_APPLICATION(app));
    int status = blink_gtk_run_main_loop();

    g_object_unref(app);
    blink_gtk_shutdown();

    return status;
}

コンパイル方法

gcc -o example example.c \
    `pkg-config --cflags --libs gtk4` \
    -lblinkgtk

JavaScript制御

JavaScript無効化

セキュリティが重要な場合やJavaScriptが不要な場合:

static void on_activate(GtkApplication* app, gpointer user_data) {
    GtkWidget* window = gtk_application_window_new(app);
    gtk_window_set_title(GTK_WINDOW(window), "JavaScript Disabled");
    gtk_window_set_default_size(GTK_WINDOW(window), 800, 600);

    GtkWidget* web_view = blink_web_view_new();

    // JavaScript無効化
    blink_web_view_set_javascript_enabled(BLINK_WEB_VIEW(web_view), FALSE);

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

JavaScript有効/無効の切り替え

トグルボタンでJavaScript制御:

static void on_js_toggle(GtkToggleButton* button, gpointer user_data) {
    GtkWidget* web_view = GTK_WIDGET(user_data);
    gboolean active = gtk_toggle_button_get_active(button);

    blink_web_view_set_javascript_enabled(BLINK_WEB_VIEW(web_view), active);

    if (active) {
        g_print("JavaScript enabled\n");
    } else {
        g_print("JavaScript disabled\n");
    }

    // ページをリロードして設定を反映
    blink_web_view_reload(BLINK_WEB_VIEW(web_view));
}

static void on_activate(GtkApplication* app, gpointer user_data) {
    GtkWidget* window = gtk_application_window_new(app);
    GtkWidget* box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
    GtkWidget* toolbar = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6);
    GtkWidget* web_view = blink_web_view_new();

    // JavaScriptトグルボタン
    GtkWidget* js_toggle = gtk_toggle_button_new_with_label("Enable JavaScript");
    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(js_toggle), TRUE);
    g_signal_connect(js_toggle, "toggled", G_CALLBACK(on_js_toggle), web_view);

    gtk_box_append(GTK_BOX(toolbar), js_toggle);
    gtk_box_append(GTK_BOX(box), toolbar);
    gtk_box_append(GTK_BOX(box), web_view);
    gtk_widget_set_vexpand(web_view, TRUE);

    gtk_window_set_child(GTK_WINDOW(window), box);
    blink_web_view_load_uri(BLINK_WEB_VIEW(web_view), "https://example.com");
    gtk_window_present(GTK_WINDOW(window));
}

User-Agent変更

カスタムUser-Agent

独自のブラウザ識別子を設定:

static void on_activate(GtkApplication* app, gpointer user_data) {
    GtkWidget* window = gtk_application_window_new(app);
    GtkWidget* web_view = blink_web_view_new();

    // カスタムUser-Agent設定
    blink_web_view_set_user_agent(web_view, "MyApp/1.0 (Linux; BlinkGTK)");

    gtk_window_set_child(GTK_WINDOW(window), web_view);

    // User-Agent確認用サイト
    blink_web_view_load_uri(BLINK_WEB_VIEW(web_view), "https://httpbin.org/user-agent");

    gtk_window_present(GTK_WINDOW(window));
}

モバイルUser-Agent

モバイル端末として振る舞う:

static void on_activate(GtkApplication* app, gpointer user_data) {
    GtkWidget* window = gtk_application_window_new(app);
    GtkWidget* web_view = blink_web_view_new();

    // Android Chrome User-Agent
    const char* mobile_ua =
        "Mozilla/5.0 (Linux; Android 10; Pixel 4) "
        "AppleWebKit/537.36 (KHTML, like Gecko) "
        "Chrome/151.0.0.0 Mobile Safari/537.36";

    blink_web_view_set_user_agent(web_view, mobile_ua);

    gtk_window_set_child(GTK_WINDOW(window), web_view);
    blink_web_view_load_uri(BLINK_WEB_VIEW(web_view), "https://www.google.com");
    gtk_window_present(GTK_WINDOW(window));
}

User-Agent取得

現在のUser-Agentを確認:

static void print_user_agent(GtkWidget* web_view) {
    char* user_agent = blink_web_view_get_user_agent(web_view);
    g_print("Current User-Agent: %s\n", user_agent);
    g_free(user_agent);  // 重要: メモリ解放
}

画像読み込み制御

画像読み込み無効化

テキストのみ表示してデータ使用量削減:

static void on_activate(GtkApplication* app, gpointer user_data) {
    GtkWidget* window = gtk_application_window_new(app);
    GtkWidget* web_view = blink_web_view_new();

    // 画像読み込み無効
    blink_web_view_set_images_enabled(BLINK_WEB_VIEW(web_view), FALSE);

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

画像読み込みトグル

ユーザーが画像表示を切り替え:

static void on_images_toggle(GtkToggleButton* button, gpointer user_data) {
    GtkWidget* web_view = GTK_WIDGET(user_data);
    gboolean active = gtk_toggle_button_get_active(button);

    blink_web_view_set_images_enabled(BLINK_WEB_VIEW(web_view), active);

    if (active) {
        g_print("Images enabled\n");
    } else {
        g_print("Images disabled\n");
    }

    // リロードして反映
    blink_web_view_reload(BLINK_WEB_VIEW(web_view));
}

ローカルストレージ制御

LocalStorage無効化

プライバシー保護モード:

static void on_activate(GtkApplication* app, gpointer user_data) {
    GtkWidget* window = gtk_application_window_new(app);
    GtkWidget* web_view = blink_web_view_new();

    // LocalStorage無効
    blink_web_view_set_local_storage_enabled(BLINK_WEB_VIEW(web_view), FALSE);

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

実用例

例1: データセーバーモード

帯域幅削減ブラウザ:

static void enable_data_saver_mode(GtkWidget* web_view) {
    // JavaScript無効
    blink_web_view_set_javascript_enabled(BLINK_WEB_VIEW(web_view), FALSE);

    // 画像読み込み無効
    blink_web_view_set_images_enabled(BLINK_WEB_VIEW(web_view), FALSE);

    g_print("Data saver mode enabled\n");
}

static void on_activate(GtkApplication* app, gpointer user_data) {
    GtkWidget* window = gtk_application_window_new(app);
    gtk_window_set_title(GTK_WINDOW(window), "Data Saver Browser");

    GtkWidget* web_view = blink_web_view_new();
    enable_data_saver_mode(web_view);

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

例2: プライバシー保護ブラウザ

最大セキュリティ設定:

static void enable_privacy_mode(GtkWidget* web_view) {
    // JavaScript無効
    blink_web_view_set_javascript_enabled(BLINK_WEB_VIEW(web_view), FALSE);

    // LocalStorage無効
    blink_web_view_set_local_storage_enabled(BLINK_WEB_VIEW(web_view), FALSE);

    // 画像読み込み無効
    blink_web_view_set_images_enabled(BLINK_WEB_VIEW(web_view), FALSE);

    g_print("Privacy mode enabled\n");
}

static void on_activate(GtkApplication* app, gpointer user_data) {
    GtkWidget* window = gtk_application_window_new(app);
    gtk_window_set_title(GTK_WINDOW(window), "Privacy Browser");

    GtkWidget* web_view = blink_web_view_new();
    enable_privacy_mode(web_view);

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

例3: 設定切り替え可能なブラウザ

完全な例(ツールバー付き):

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

typedef struct {
    GtkWidget* web_view;
    GtkWidget* js_toggle;
    GtkWidget* images_toggle;
    GtkWidget* storage_toggle;
} AppWidgets;

static void on_js_toggle(GtkToggleButton* button, gpointer user_data) {
    AppWidgets* widgets = (AppWidgets*)user_data;
    gboolean active = gtk_toggle_button_get_active(button);
    blink_web_view_set_javascript_enabled(BLINK_WEB_VIEW(widgets->web_view), active);
    blink_web_view_reload(BLINK_WEB_VIEW(widgets->web_view));
}

static void on_images_toggle(GtkToggleButton* button, gpointer user_data) {
    AppWidgets* widgets = (AppWidgets*)user_data;
    gboolean active = gtk_toggle_button_get_active(button);
    blink_web_view_set_images_enabled(BLINK_WEB_VIEW(widgets->web_view), active);
    blink_web_view_reload(BLINK_WEB_VIEW(widgets->web_view));
}

static void on_storage_toggle(GtkToggleButton* button, gpointer user_data) {
    AppWidgets* widgets = (AppWidgets*)user_data;
    gboolean active = gtk_toggle_button_get_active(button);
    blink_web_view_set_local_storage_enabled(BLINK_WEB_VIEW(widgets->web_view), active);
    blink_web_view_reload(BLINK_WEB_VIEW(widgets->web_view));
}

static void on_activate(GtkApplication* app, gpointer user_data) {
    AppWidgets* widgets = g_new0(AppWidgets, 1);

    // ウィンドウ
    GtkWidget* window = gtk_application_window_new(app);
    gtk_window_set_title(GTK_WINDOW(window), "BlinkGTK Settings Demo");
    gtk_window_set_default_size(GTK_WINDOW(window), 1024, 768);

    // レイアウト
    GtkWidget* box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
    GtkWidget* toolbar = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6);
    gtk_widget_set_margin_start(toolbar, 6);
    gtk_widget_set_margin_end(toolbar, 6);
    gtk_widget_set_margin_top(toolbar, 6);
    gtk_widget_set_margin_bottom(toolbar, 6);

    // WebView
    widgets->web_view = blink_web_view_new();
    gtk_widget_set_vexpand(widgets->web_view, TRUE);

    // トグルボタン
    widgets->js_toggle = gtk_toggle_button_new_with_label("JavaScript");
    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widgets->js_toggle), TRUE);
    g_signal_connect(widgets->js_toggle, "toggled", G_CALLBACK(on_js_toggle), widgets);

    widgets->images_toggle = gtk_toggle_button_new_with_label("Images");
    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widgets->images_toggle), TRUE);
    g_signal_connect(widgets->images_toggle, "toggled", G_CALLBACK(on_images_toggle), widgets);

    widgets->storage_toggle = gtk_toggle_button_new_with_label("LocalStorage");
    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widgets->storage_toggle), TRUE);
    g_signal_connect(widgets->storage_toggle, "toggled", G_CALLBACK(on_storage_toggle), widgets);

    // ツールバー構築
    gtk_box_append(GTK_BOX(toolbar), widgets->js_toggle);
    gtk_box_append(GTK_BOX(toolbar), widgets->images_toggle);
    gtk_box_append(GTK_BOX(toolbar), widgets->storage_toggle);

    // レイアウト構築
    gtk_box_append(GTK_BOX(box), toolbar);
    gtk_box_append(GTK_BOX(box), widgets->web_view);

    gtk_window_set_child(GTK_WINDOW(window), box);
    blink_web_view_load_uri(BLINK_WEB_VIEW(widgets->web_view), "https://example.com");
    gtk_window_present(GTK_WINDOW(window));
}

int main(int argc, char* argv[]) {
    if (!blink_gtk_init(&argc, &argv)) {
        g_critical("Failed to initialize BlinkGTK");
        return 1;
    }

    GtkApplication* app = gtk_application_new(
        "org.example.settings-demo",
        G_APPLICATION_DEFAULT_FLAGS);

    g_signal_connect(app, "activate", G_CALLBACK(on_activate), NULL);

    /* 注意 g_application_run() は使用禁止 — Chromium RunLoop が飢餓状態になる
     * g_application_register/activate で GtkApplication シグナルを発火させてから
     * blink_gtk_run_main_loop() でChromium RunLoop を起動する */
    g_application_register(G_APPLICATION(app), NULL, NULL);
    g_application_activate(G_APPLICATION(app));
    int status = blink_gtk_run_main_loop();

    g_object_unref(app);
    blink_gtk_shutdown();

    return status;
}

トラブルシューティング

設定が反映されない

問題: Settings APIを呼んだが変更が反映されない

解決策: ページをリロードする

blink_web_view_set_javascript_enabled(BLINK_WEB_VIEW(web_view), FALSE);
blink_web_view_reload(BLINK_WEB_VIEW(web_view));  // リロードで反映

メモリリーク

問題: blink_web_view_get_user_agent()でメモリリーク

解決策: 必ずg_free()でメモリ解放

char* user_agent = blink_web_view_get_user_agent(web_view);
g_print("%s\n", user_agent);
g_free(user_agent);  // これを忘れない!

コンパイルエラー

問題: blink_gtk.hが見つからない

解決策: pkg-configを使用

gcc example.c $(pkg-config --cflags --libs blinkgtk-0.1)

まとめ

Settings APIを使うことで:

次のステップ


ライセンス: BSD-3-Clause
プロジェクト: BlinkGTK
サポート: https://blinkgtk.org/ / https://github.com/daisy19gnu/blinkgtk-dist/issues