LoginSignup
5
2

More than 5 years have passed since last update.

GTK+3でWebページを表示する

Posted at

せしまるです。

GTK+3で作った画面にWebページを表示する方法を試してみたので記事にしました。

webkit2gtkのインストール

ターミナルで以下コマンドを実行。

$ sudo apt install webkit2gtk-4.0

実装

webkit_test.cpp
#include <gtk/gtk.h>
#include <glib.h>
#include <webkit2/webkit2.h>

// class WebKitTest.

int main(int argc, int argv[]){
    gtk_init(&argc, &argv);

    ~~画面作成~~

    // Webページを表示するウィジェットを生成.
    WebKitWebView webview = WEVKIT_WEB_VIEW(webkit_web_view_new());
    // 初期ページ設定.
    webkit_web_view_load_uri(webview, "https://google.com/");
    // GtkBoxに入れる.
    gtk_box_pack_start(GTK_BOX(box), GTK_WIDGET(webview), TRUE, TRUE, 0);

    // 表示.
    gtk_widget_show_all(window);

    gtk_main();

    gtk_widget_destroy(window);

    return 0;
}

ビルドして実行するとWebページが表示されます。

問題点

この状態だと問題がいくつかあります。
1. back/forwardボタンがない
2. reloadボタンがない
3. URL入力して直接飛べない
4. 表示できないページがある

解決&今のところ解決できなかったこと

順番にご説明しますm(_)m

解決できたこと

1.のback/forwardボタンはそれぞれ関数が用意されています。それをボタンのコールバックで実行することで解決できました。ただ見た目がボタンボタンしているボタンだと見栄えが悪いので、イベントボックス+イメージウィジェットを使用して、アイコンボタン化するといい感じになります。
以下back/forwardの実装部分

back_foward.cpp
// ボタン用.

static void OnBackButtonClicked(GtkWidget* button, GtkWidget* webview){
    // back.
    webkit_web_view_go_back(WEBKIT_WEB_VIEW(webview));
}

static void OnForwardButtonClicked(GtkWidget* button, GtkWidget* webview){
    // forward
    webkit_web_view_go_forward(WEBKIT_WEB_VIEW(webview));
}

// イベントボックス用.

static void OnBackButtonPress(GtkWidget* button, GdkEvent* event, GtkWidget* webview){
    // back.
    webkit_web_view_go_back(WEBKIT_WEB_VIEW(webview));
}

static void OnForwardButtonPress(GtkWidget* button, GdkEvent* event, GtkWidget* webview){
    // forward
    webkit_web_view_go_forward(WEBKIT_WEB_VIEW(webview));
}

2.のreloadボタンも1.と同じように関数が用意されているので、コールバックで実行する感じです。

reload.cpp
// ボタン用.

static void OnReloadButtonClicked(GtkWidget* widget, GtkWidget* webview){
    // reload.
    webkit_web_view_reload(WEBKIT_WEB_VIEW(webview));
}

// イベントボックス用.

static void OnReloadButtonPress(GtkWidget* widget, GdkEvent* event, GtkWidget* webview){
    // reload.
    webkit_web_view_reload(WEBKIT_WEB_VIEW(webview));
}

3.のURL直叩きについては、入力ボックスを配置して、開くボタンorEnterキー入力で指定のURLに飛ぶようにしました。
また、entryウィジェットとwebviewウィジェットはprivateなグローバル変数で持つようにしてます。

url_load.cpp
void OpenURL(){
    std::string str(gtk_entry_get_text(GTK_ENTRY(entry));
    webkit_web_view_load_uri(WEBKIT_WEB_VIEW(webview), str.c_str());
}

static void OnOpenButtonClicked(GtkWidget* widget, WebKitTest* wkt){
    ((WebKitTest*)wkt)->OpenURL();
}

static void OnKeyRelease(GtkWidget* widget, GdkEventKey *event, WebKitTest* wkt){
    // enterキーのみ.
    if( event->keyval == 65293 ){
        ((WebKitTest*)wkt)->OpenURL();
    }
}

解決できなかったこと

4.の開けないページは…現時点ではわかりませんでした。
見れないページがあると不便すぎるので、今後も調査はしていく予定です。
(わかり次第更新します)

開けないページの例としては、YoutubeやGoogleの画像検索など(環境によってかわるかもしれません)。

最後に

今回はGTKでWebページを表示してみました。
ブラウザっぽいことが簡単にできるかなーと思ってましたが、割と時間がかかりました。
上記コードだけだと、他にも問題があるかもしれません(4.とかね)

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2