win2xcurでwin向けの動くカーソルを使おう(難航)


*注意* 難航したので、最後はClaude Codeに投げてテキトーにやってしまった。 なのであんまり役に立ちません。 デクストップ環境のCOSMICがまだ開発段階のため、そこらへんのフワフワ設計と衝突したっぽい。 タイトル通り。 `.ani` のカーソルをLinuxで使いたい。 夜夢さんという、動くドット絵のカーソルをたくさん作っている偉人から、なんとモニカさんのカーソルが出ていたので使ってみる。 [booth.pm/items/5551284](https://booth.pm/ja/items/5551284) ## win2xcurインストール 普通にAURから。 ``` yay -S win2xcur # もちろんparuでもOK # paru -S win2xcur ``` debianやfedoraはpipから ``` pip3 install win2xcur ``` ## 変換する では変換してみる ### 変換元もをインストール 各々使いたいカーソルを持ってくる。 今回はモニカさんの `.ani` ...文字化けしてる〜〜 (のちのちの変換に影響が出る可能性があるので、文字化け部分を削ったりなおしたりしておく。) ### 変換する 基本的なコマンドはこう ``` win2xcur 入力ファイル.ani 出力ファイル名 ``` 一個ずつやっていたら人生の浪費なので、ディレクトリを指定して、ワイルドカードで実行。 出力ディレクトリの名前はわかりやすいテーマ名にしておけばOK。 ``` mkdir -p ~/.local/share/icons/出力ディレクトリ/ win2xcur '入力ディレクトリ/'*.{ani} -o ~/.local/share/icons/出力ディレクトリ/ # 拡張子がcurなどani以外のときは適宜変更 # bashではなくfishの場合は{}を取って *.ani にする。 ``` また、引数をつけることで windows っぽく影をつけられる。 ``` -s, --shadow 影を付けるかどうか(Windows風の影効果をエミュレート) -O, --shadow-opacity SHADOW_OPACITY 影の不透明度(0〜255) -r, --shadow-radius SHADOW_RADIUS 影のぼかし半径(カーソル幅に対する割合) -S, --shadow-sigma SHADOW_SIGMA 影のぼかしシグマ(カーソル幅に対する割合) -x, --shadow-x SHADOW_X 影のx方向オフセット(カーソル幅に対する割合) -y, --shadow-y SHADOW_Y 影のy方向オフセット(カーソル高さに対する割合) -c, --shadow-color SHADOW_COLOR 影の色 ``` エラーなく走って、出力ディレクトリに生成されていればOK。 ### 命名 落としてきたマウスカーソルにもよるが、基本的にwindows用の命名になっているので、Linux用の命名にする。 こんな感じ ``` cd ~/.local/share/icons/テーマ名/cursors for n in left_ptr top_left_arrow ln -sf arrow $n end for n in text xterm ibeam ln -sf beam $n end for n in wait watch ln -sf busy $n end for n in progress left_ptr_watch ln -sf working $n end for n in crosshair ln -sf cross $n end for n in ew-resize sb_h_double_arrow h_double_arrow ln -sf ew $n end for n in ns-resize sb_v_double_arrow v_double_arrow ln -sf ns $n end for n in nwse-resize bd_double_arrow size_fdiag ln -sf nwse $n end for n in nesw-resize fd_double_arrow size_bdiag ln -sf nesw $n end for n in move fleur all-scroll size_all grabbing ln -sf move $n end for n in pointer hand hand1 hand2 pointing_hand ln -sf link $n end for n in help question_arrow whats_this ln -sf help $n end for n in not-allowed forbidden crossed_circle no-drop ln -sf no $n end for n in up_arrow sb_up_arrow center_ptr ln -sf up $n end ``` ### 設定 実際にカーソルテーマを設定する ``` gsettings set org.gnome.desktop.interface cursor-theme テーマ名 # 確認 # gsettings get org.gnome.desktop.interface cursor-theme ``` ## できません!! できなすぎたので、Claude Code に丸投げ。 ``` ❯ マウスカーソルを変えたくてさ、設定したんだけど変わらない.../home/shiroka/.icons/monikarsor/と/home/shiroka/.local/share/icons/monikarsor/を置いてみたんだけど反映されない カーソルが反映されない原因を調べてみます。まず環境とファイル構成を確認しますね。 Listed 1 directory, ran 1 shell command COSMIC デスクトップ(Wayland)を使ってますね。COSMIC は独自の設定方式なので、それに合わせる必要があります。もう少し確認します。 Listed 1 directory 原因が2つ見つかりました。1つは index.theme の中身が壊れています。COSMIC の設定ファイルも確認します。 Ran 2 shell commands 原因が2つ判明しました。説明します。 問題1: index.theme の中身が壊れている ファイルを作るための cat > ... <<'THEME' というコマンド文字列が、そのまま中身として保存されてしまっています。本来の [Icon Theme] セクションになっていません。 問題2: COSMIC のカーソルテーマの指定方法が違う com.system76.CosmicTk/v1/icon_theme に "monikarsor" を入れていますが、これはアプリのアイコンテーマ用で、マウスカーソルとは別物です。COSMIC(cosmic-comp 1.0)にはまだカーソルテーマのGUI設定がなく、XCURSOR_THEME 環境変数で指定する必要があります。 セッションの起動方式を確認します。 Ran 1 shell command テーマ自体は正常です(default→arrow のシンボリックリンクあり)。修正していきます。 まず壊れた index.theme を両方とも正しい内容に直し、XCURSOR_THEME を environment.d で設定します。 Ran 1 shell command 完了しました。2つの問題を修正しました。 直した内容 ① 壊れていた index.theme を修正 両方のファイルの中身が、ファイルを作るためのコマンド文字列(cat > ... <<'THEME')そのものになっていました。正しい [Icon Theme] 形式に書き直しました。 ② カーソルテーマを XCURSOR_THEME で指定 ~/.config/environment.d/cursor.conf を新規作成し、XCURSOR_THEME=monikarsor を設定しました。COSMIC(cosmic-comp 1.0)にはまだカーソルテーマのGUI設定がなく、この環境変数で指定するのが正しい方法です。 反映させる手順 環境変数はセッション起動時に読み込まれるので、一度ログアウト → 再ログインしてください(確実にするなら再起動)。これでカーソルが変わります。サイズは 24 にしてあるので、好みで cursor.conf の XCURSOR_SIZE を変えてください。 ひとつ注意点 com.system76.CosmicTk/v1/icon_theme に "monikarsor" が入っていますが、これはアプリのアイコンテーマ(ファイルやアプリのアイコン)用の設定で、マウスカーソルとは無関係です。カーソルのつもりで設定したものだと思います。このままだとアプリのアイコンが「monikarsor」を探して見つからず、デフォルトにフォールバックします。元のアイコンテーマ(例:Pop、Adwaita など)に戻したい場合は、COSMIC設定の「外観 → アイコンとテーマ」から選び直すか、教えてくれれば戻します。 ---再ログイン後もまだ変わらないようなら、cosmic-session が environment.d を読まない構成の可能性があるので、別の方法(/etc/environment への記述など)を案内します。まず再ログインで試してみてください。 ✻ Crunched for 1m 50s ❯ 再ログインしたけどだめでした 再ログイン後の状態を確認します。 Ran 1 shell command 重要な手がかりが分かりました。systemd --user には XCURSOR_THEME=monikarsor が入っているのに、実際の cosmic-comp プロセスにはその環境変数が渡っていません。つまり cosmic-session が systemd user の環境を引き継がずに起動しています。これが反映されない理由です。 起動チェーンを詳しく調べます。 Ran 1 shell command 起動の仕組みが分かりました。これが原因です。 あなたの環境は greetd + agreety(テキストgreeter)→ fishログインシェル → cosmic-session という流れで起動しています。cosmic-session は fishログインシェルから直接 起動されているため、systemd user の環境(environment.d で設定した変数)を引き継ぎません。だから反映されなかったのです。 /etc/environment に書けば確実ですが root が必要です。それより、cosmic-session を起動している fish の設定に環境変数を入れるのが確実です。fish の設定を確認します。 Listed 1 directory config.fish には cosmic-session の起動が無いですね。どうやって起動しているか(手動入力か自動か)を確認します。 Searched for 1 pattern /usr/bin/start-cosmic というランチャースクリプト経由で起動していますね。中身を確認します。 Read 1 file 完全に原因が分かりました。start-cosmic の核心はこのコメント部分です: # use the user's preferred shell to acquire environment variables exec bash -c "exec -l '${SHELL}' -c '${0} --in-login-shell'" つまり start-cosmic は わざわざあなたのログインシェル(fish)を経由して環境変数を取り込む設計になっています。fish のログインシェルは config.fish を読み込むので、config.fish で環境変数を export すれば cosmic-comp に渡ります。これが正しい設定場所でした(environment.d ではなく)。 config.fish に追記します。 Read 1 file ● Update(.config/fish/config.fish) Added 4 lines # # smth smth #end fish_add_path ~/.npm-global/bin # マウスカーソルテーマ(COSMIC は start-cosmic がログインシェル経由で env を取り込む) set -gx XCURSOR_THEME monikarsor set -gx XCURSOR_SIZE 24 追記しました。設計どおりに環境変数が渡るか、start-cosmic と同じ「ログインシェル経由」を再現してテストします。 Ran 1 shell command 検証OKです。start-cosmic と同じ「ログインシェル経由」で XCURSOR_THEME=monikarsor が正しく見えるようになりました。テーマも標準の検索パス(~/.icons と ~/.local/share/icons)にあるので、cosmic-comp が見つけられます。 今度こそ反映されます もう一度 ログアウト → 再ログインしてください。今回は cosmic-comp に環境変数が渡るので、カーソルが monikarsor になります。 まとめ(なぜ前回ダメだったか) - 前回設定した ~/.config/environment.d/cursor.conf は systemd user 用。でもあなたの COSMIC は greetd → fishログインシェル → start-cosmic → cosmic-session という流れで、systemd user 経由ではなかったため引き継がれなかった。 - start-cosmic は「ログインシェルを実行して環境変数を取り込む」設計なので、fish の config.fish に書くのが正解でした。← 今回そこに追記済み。 ``` できた。 以上!(なにもわかってない)