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系のテーマカスタマイズをしたことは無いので、このあたりの知識が全然足りず、あまり深掘りできなかった。
これらのテーマが具体的にどういう(メタ)データを持っていて、落ちるものと落ちないものがどう違うのか、わかればいいのだけど。