せしまるです。
GTK+3で作った画面にWebページを表示する方法を試してみたので記事にしました。
webkit2gtkのインストール
ターミナルで以下コマンドを実行。
$ sudo apt install webkit2gtk-4.0
実装
#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の実装部分
// ボタン用.
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.と同じように関数が用意されているので、コールバックで実行する感じです。
// ボタン用.
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なグローバル変数で持つようにしてます。
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.とかね)