動機
シングルアプリケーションを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 := >k.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 を起動すると以下のように表示されるはず。
まとめ
webview/webview を使って Linux上でフルスクリーンで表示してみました。
ここでも webview の Fullscreen 表示の議論がなされているけど、まだ Open ステータスなので、今のところは 自前で Fullscreen する方法でやっていくしかなさそう。