WSLでGdk::Cursor.new(display, name)を使うと落ちる
TL;DR
WSLでmikutterを使う時はsudo apt install breeze-cursor-theme chameleon-cursor-themeしてsudo update-alternatives --config x-cursor-themeでどちらかの系統のテーマを選択すれば落ちないこともあるかもしれない。
長い本文
恐らく
機能 #1197: MiraclePainter上でマウスを動かしたときにカーソル形状を適切に変更して欲しい - mikutter - やること
のパッチがマージされて以降、mikutterが落ちるようになった。
/core/mui/cairo_miracle_painter.rb - mikutter - やること
↑ここで落ちる。確かに、MiraclePainterの領域にカーソルを動かしていくと落ちるように見受けられる。ここで渡しているnameを表示させてみると、'default'らしい。えぇ……
エラーメッセージは↓のような感じ。
RuntimeError failed to initialize
{MIKUTTER_DIR}/core/mui/cairo_miracle_painter.rb:223:in `initialize'
{MIKUTTER_DIR}/core/mui/cairo_miracle_painter.rb:223:in `new'
{MIKUTTER_DIR}/core/mui/cairo_miracle_painter.rb:223:in `set_cursor'
{MIKUTTER_DIR}/core/lib/uithreadonly.rb:22:in `block (2 levels) in singleton class'
{MIKUTTER_DIR}/core/mui/cairo_miracle_painter.rb:183:in `point_moved'
{MIKUTTER_DIR}/core/lib/uithreadonly.rb:22:in `block (2 levels) in singleton class'
{MIKUTTER_DIR}/core/mui/cairo_cell_renderer_message.rb:184:in `block in event_hooks'
{MIKUTTER_DIR}/core/mui/gtk_extension.rb:35:in `block in safety_signal_connect'
{MIKUTTER_DIR}/core/mui/cairo_cell_renderer_message.rb:73:in `signal_emit'
{MIKUTTER_DIR}/core/mui/cairo_cell_renderer_message.rb:73:in `block in tree='
{MIKUTTER_DIR}/core/mui/gtk_extension.rb:35:in `block in safety_signal_connect'
{MIKUTTER_DIR}/core/plugin/gtk/mainloop.rb:10:in `main'
{MIKUTTER_DIR}/core/plugin/gtk/mainloop.rb:10:in `mainloop'
./mikutter.rb:68:in `boot!'
./mikutter.rb:104:in `<main>'
Gdk::Cursor.newのドキュメント Gdk::Cursor - Ruby-GNOME2 Project Website を見ると、
If type_or_name is a String, creates a new cursor by looking up type_or_name in the current cursor theme (Since 2.8)
とある。cursor themeとは、 カーソルテーマ - ArchWiki によると、
ディスプレイサーバーには GUI のナビゲーションや操作を楽にするカーソルテーマが付属しています。ディスプレイサーバーにカーソルテーマは含まれていますが、他のカーソルテーマをインストールして選択することもできます。
ということらしい。VcXsrvがカーソルテーマから名前でカーソルを取得する機能を持っていない、とかいうことなんだろうか。
しかしユーザレベルで上書きできるということは、ディスプレイサーバに問い合わせに行くのは最後だろうから、aptで適当にカーソルテーマを入れればいいのではないか。
というわけで、apt search cursorして、最初に目についたbreeze-cursor-themeを入れてみる。
$ sudo apt install breeze-cursor-theme
今度はすぐには落ちない、が、マウスカーソルをいろいろ動かしてみたら別のエラーで落ちた。
TypeError wrong argument type Gdk::DisplayX11 (expected Data)
{MIKUTTER_DIR}/core/mui/cairo_miracle_painter.rb:223:in `initialize'
{MIKUTTER_DIR}/core/mui/cairo_miracle_painter.rb:223:in `new'
{MIKUTTER_DIR}/core/mui/cairo_miracle_painter.rb:223:in `set_cursor'
{MIKUTTER_DIR}/core/lib/uithreadonly.rb:22:in `block (2 levels) in singleton class'
{MIKUTTER_DIR}/core/mui/cairo_miracle_painter.rb:183:in `point_moved'
{MIKUTTER_DIR}/core/lib/uithreadonly.rb:22:in `block (2 levels) in singleton class'
{MIKUTTER_DIR}/core/mui/cairo_cell_renderer_message.rb:184:in `block in event_hooks'
{MIKUTTER_DIR}/core/mui/gtk_extension.rb:35:in `block in safety_signal_connect'
{MIKUTTER_DIR}/core/mui/cairo_cell_renderer_message.rb:73:in `signal_emit'
{MIKUTTER_DIR}/core/mui/cairo_cell_renderer_message.rb:73:in `block in tree='
{MIKUTTER_DIR}/core/mui/gtk_extension.rb:35:in `block in safety_signal_connect'
{MIKUTTER_DIR}/core/plugin/gtk/mainloop.rb:10:in `main'
{MIKUTTER_DIR}/core/plugin/gtk/mainloop.rb:10:in `mainloop'
./mikutter.rb:68:in `boot!'
./mikutter.rb:104:in `<main>'
そんなこと言われてもですね……
何も変えずにもう一度起動してみたところ、今度は落ちなかった。謎は深まるばかり。
ところで別のテーマに変えてみようと、一旦
$ sudo apt remove breeze-cursor-theme
したところ、次のようなメッセージが出た。
update-alternatives: /usr/share/icons/default/index.theme (x-cursor-theme) を提供するために自動モードで /usr/share/icons/Adwaita/cursor.theme を使います
デフォルトのテーマ、用意されてるじゃん。だとするとVcXsrvのせいではなさそう。
この状態で起動したところ、最初と同じエラーを出して落ちた。原因はAdwaitaテーマ(?)ということでいいのだろうか。
次に
$ sudo apt install oxygen-cursor-theme
してみたところ、今度はウィンドウを表示するだけで落ちる。そもそも、このパッケージのインストール時にはupdate-alternativesが走っていないようだった。
apt search cursorして出てきたそれっぽいパッケージをすべて*1入れ、以下のコマンドで切り替えながらいろいろと試した。
$ sudo update-alternatives --config x-cursor-theme
名前が同系統のものは適当にピックアップして1つずつ試した。
その結果、breeze系とChameleon系のみ、ほとんど落ちないことがわかった。これが何故なのかはわからないし、さっき違うメッセージで落ちたのは再現すらできない。
GNOME系のテーマカスタマイズをしたことは無いので、このあたりの知識が全然足りず、あまり深掘りできなかった。
これらのテーマが具体的にどういう(メタ)データを持っていて、落ちるものと落ちないものがどう違うのか、わかればいいのだけど。