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系のテーマカスタマイズをしたことは無いので、このあたりの知識が全然足りず、あまり深掘りできなかった。

これらのテーマが具体的にどういう(メタ)データを持っていて、落ちるものと落ちないものがどう違うのか、わかればいいのだけど。

*1:breeze-cursor-theme chameleon-cursor-theme comixcursors-righthanded crystalcursors dmz-cursor-theme human-theme moblin-cursor-theme oxygen-cursor-theme sabily-themes xcursor-themes