webview/webiew を使って Linux上でフルスクリーンで表示する

動機

シングルアプリケーションをkioskモードで動かしたい。

そうすることで、ラズパイとかでアプリ作って・・・みたいなことがやりやすそう。

flutter-elinux でもいいんだけど、dart 覚えるの大変そう。

Go でできるなら Go でやりたい。

webview/webview とかでそれっぽいことできないかなぁ~?

昔は webview/webview でも Fullscreen() メソッドがあったけどなぜか最新ではなくなってる。

最新でも Fullscreen() したい!!

そんな感じの動機。

WebKitGtk

webview/webview は linux の場合、 Windowの表示に Gtk3 を使っているみたい。

webview/webview.go at 899018ad0e5cc22a18cd734393ccae4d55e3b2b4 · webview/webview · GitHub

さっきも書いた通り、Webviewにはウィンドウを操作するメソッドは生えてない。あるのはウィンドウへのポインタを返す Window() メソッドがあるのみ。そのポインタを使って勝手に良しなにしてくださいな。ということのようだ。

gotk3/gotk3

Go で Gtk3 を操作するためのライブラリに gotk3/gotk3 というのがある。

GitHub - gotk3/gotk3: Go bindings for GTK3

こいつには Fullscreen() のメソッドがある。

gtk package - github.com/gotk3/gotk3/gtk - Go Packages

なので、このライブラリに webview から取得したポイントを使って Window を作ればフルスクリーンにできるはず。

gotk3/gtk/window.go at master · gotk3/gotk3 · GitHub

ここら辺を見ると、自前で gtk.Window を作れそうだったので、それをベースにコードを書いてみた。

それが以下のコード

コード

package main

import (
    "github.com/webview/webview"
    "github.com/gotk3/gotk3/gtk"
    "github.com/gotk3/gotk3/glib"
    "unsafe"
)

func fullScreen(handle unsafe.Pointer) {
    obj := glib.Take(handle)
    w := &gtk.Window {
        gtk.Bin {
            gtk.Container {
                gtk.Widget {
                    glib.InitiallyUnowned { obj },
                },
            },
        },
    }
    w.Fullscreen()
}

func main() {
    w := webview.New(false)
    defer w.Destroy()

    fullScreen(w.Window())

    w.SetHtml("Thanks for using webview!")

    w.Run()
}

weston を使った フルスクリーンのデモ

weston.ini の [autolaunch] の path に ビルドしたバイナリのフルパスを指定して weston を起動すると以下のように表示されるはず。

VirtualBox 上でのフルスクリーン表示

まとめ

webview/webview を使って Linux上でフルスクリーンで表示してみました。

How to set fullscreen/maximize with newer API (`WebView.SetFullScreen()` have been removed) · Issue #458 · webview/webview · GitHub

ここでも webview の Fullscreen 表示の議論がなされているけど、まだ Open ステータスなので、今のところは 自前で Fullscreen する方法でやっていくしかなさそう。