fyneで製品をつくることを諦めた理由
Go言語でデスクトップアプリを作りたくていくつかのライブラリを見てて、
fyne良さげやってみよーっと!!!ってことでこの2週間くらい色々試した。
結果、fyneでツールを作成して公開するのは困難だと判断。
IMEのことが考えられていない
デスクトップアプリでも入力を必要としないものであればいいけど、
TODOアプリにしても日本語入力することを考えると、IMEとのかかわりは発生する。
そもそもIMEって何なん?ってことなら、キーボードにない文字を入力するためのツールです。
平仮名とか漢字とか、キーボードにはないけど入力できるのはIMEがキー入力を変換できるようにしてくれてるから。
つまり、キーボードの入力をそのまま使える系の言語ではIMEが必要ない。
まあ主に欧米。
んで、fyneは欧米で作られてるわけで、IMEのことは検討されていない。
中国語を使ってる方がissueたててたけど、IMEが伝わらなくて残念って諦めてた。
IMEが検討されてないってのがどういうことなのかは上のissueを見てもらえれば分かるけど、
OSがテキスト入力をしているということに気付けてないから、
デスクトップでキー入力して左上の端っこに文字が出てくるのと同じ状態になる。
Enterで確定したところでやっと入力欄に表示される。
これが地味ながらかなりにつらい。実用的じゃ無さ過ぎる。
Entry周りがクラッシュ畑
まず驚くことに、ウィンドウのサイズがテキスト入力によって変わる。
https://gyazo.com/f867cf315aa0136db153b41baa43d5c5
fyneのオブジェクトにはMinSizeっていう概念があって、最小サイズを表してる。
んで、親子関係にあるオブジェクトで、親は基本的に子より大きくなるようにつくられてる。
んでもって、親子の一番上にいるのがウィンドウになる。
ってことで、テキスト入力すると、テキスト表示の幅が広がっていって、
テキストが入ってるウィンドウも広がっていくっていう流れ。
しかもこれ、SetFixedSize(true)にしてサイズを固定しても無関係に広がる。
そして残念なことに、SetFixedSize(true)をしていない状態で中身が広がってウィンドウが広げられるとクラッシュする。
ユーザに操作によって幅が変わるものが含まれているとクラッシュ頻発を避けれないことになるんですね。
いま手軽にできる解決策がひとつあって、スクロールする箱に入れてしまうというのができます。
テキスト表示が広がっていってもスクロールする箱はスケールしないからウィンドウに影響を与えないようにできる。
しかしこの頼みの綱のスクロールにも問題があって、キャレットを追いかけてくれない。
Homeキーとかおして先頭に戻ってもそこがみれない。
んで、見えてない部分を範囲選択して消したりするとスクロールの箱のサイズが小さくなる。
これがやばくて、スクロールする箱のサイズって絶対に大きくならない。スクロールバーが広がってくれるから。
なのに小さくなる。徐々に入力できるスペースが小さくなる。もう無理。って感じ。
そもそも入力エリアが独自実装
なんでIMEが認識されてなかったり、文字入力したらクラッシュするのかっていうと、
入力エリアが独自実装やからです。
基本的にはテキスト表示とキーイベントで作られてて、
右矢印が押されたらキャレットを右に動かす、バックスペースが押されたら1文字前を消す、
みたいなのを全部手書きで実装されてる。
つまり、テキストエリア風のキーイベントリスナーなんですわ。
そりゃ、OSも入力してることに気付かんよなっていう。
そんなつくりやからIMEに認識してもらわれへんし、入力によってウィンドウの大きさが変えられてまう。
元凶はglfwバインディング?
fyneはglfwバインディングっぽいものを独自で持ってる。
ここにいくつか問題がありそう。
Entryもそうなんやけど、例えばAlt + PrintScreenでも標準エラーが吐かれる。
キー入力を結構自前で管理してる感じやから発生してることな気もする。
そうそう、結局GUI周りを自前で用意しようとすると、こういう不足が出てきちゃうわけですわ。
半年くらいして2.0系が出るか、さらに経って3.0系が出たらまた試してみようと思う。
更新履歴
2020/07/23 公開