Arch Linux 安装鼠标主题
说明
Linux 桌面的光标是 XCursor 格式(cursors/ 目录下的一堆文件)。主题分两类:已经能直接用的和Windows 格式需要转换的。下面先讲通用规则(判断 → 安装 → 应用 → 验证),再给一个本次实装的具体案例。以 Arch + niri + DMS 为例,全程普通用户权限,无需 sudo。
一、先判断主题属于哪一类
解压后看里面是什么:
| 看到的东西 | 类型 | 处理 |
|---|---|---|
cursors/ 目录(里面直接是 default、pointer…) |
XCursor | 跳到第二节,直接装 |
Install.inf + 一堆 .ani |
Windows 格式 | 跳到第三节,先转换 |
index.theme + cursors/ |
XCursor(带元信息) | 跳到第二节,index.theme 都不用补 |
常见后缀:.tar.gz 基本都是 Linux 原生;.zip 两种都可能。没有 unzip 命令时用 Python 解:python3 -c "import zipfile; zipfile.ZipFile('主题.zip').extractall('目录')"。
二、不需要转换的:直接安装
# 1) 放文件
mkdir -p ~/.local/share/icons/my-theme
cp -r 解压目录/cursors ~/.local/share/icons/my-theme/
# 2) 补 index.theme(压缩包里已带就跳过)
# Inherits 是兜底:主题缺某个光标名就回退,避免光标变隐形
printf '[Icon Theme]\nName=my-theme\nInherits=Adwaita\nExample=default\n' \
> ~/.local/share/icons/my-theme/index.theme
# 3) 传统路径软链(有些老程序只认 ~/.icons)
ln -sfn ~/.local/share/icons/my-theme ~/.icons/my-theme
把
my-theme、解压目录换成你自己的。
应用:改三处,一个都不能少
# 1) GTK / GNOME
gsettings set org.gnome.desktop.interface cursor-theme my-theme
gsettings set org.gnome.desktop.interface cursor-size 32
# 2) DMS 设置:改 ~/.config/DankMaterialShell/settings.json 里的 cursorSettings
# { "theme": "my-theme", "size": 32 }
# niri 配置 ~/.config/niri/dms/cursor.kdl 由 DMS 自动生成,别手改
# 3) 重启 DMS —— 这步不能省
dms restart
⚠️
dms restart为什么不能省:DMS 的可选主题列表只在启动时扫描~/.local/share/icons和~/.icons。主题是刚装的,不重启它列表里根本没有,打开图形设置还会用内存里的旧值把你的配置覆盖回去(本次实测就被覆盖回过System Default/Adwaita)。正确顺序:装主题 → 改配置 →
dms restart→ 再去设置界面确认,写完盯 12 秒确认不反弹。
验证
gsettings get org.gnome.desktop.interface cursor-theme
grep -A3 '^cursor' ~/.config/niri/dms/cursor.kdl
# 硬核验证:libXcursor 能不能真加载到这个主题
python3 -c "
import ctypes; l=ctypes.CDLL('libXcursor.so.1')
l.XcursorLibraryLoadImages.restype=ctypes.c_void_p
l.XcursorLibraryLoadImages.argtypes=[ctypes.c_char_p,ctypes.c_char_p,ctypes.c_int]
print('OK' if l.XcursorLibraryLoadImages(b'default', b'my-theme', 32) else 'FAIL')"
已经开着的应用不会自动换光标(它们启动时就读完配置了),浏览器、终端、Electron 都要彻底退出重开;niri、DMS 面板和之后新启动的程序立即生效。
三、需要转换的:先转成 XCursor
1. 准备工具
临时用 venv 不污染系统(长期用可 paru -S win2xcur):
mkdir -p /tmp/cur && python3 -m venv /tmp/cur/venv
/tmp/cur/venv/bin/pip install win2xcur
2. 转换
mkdir -p /tmp/cur/src # 解压目录
python3 -c "import zipfile; zipfile.ZipFile('主题.zip').extractall('/tmp/cur/src')"
cd /tmp/cur/src/主题目录 # 进到含 Install.inf 的那一层
# 输出目录必须先建好,否则报 FileNotFoundError: .../pencil
mkdir -p ~/.local/share/icons/my-theme/cursors
/tmp/cur/venv/bin/win2xcurtheme Install.inf -o ~/.local/share/icons/my-theme/cursors
# 抽查:几个文件的 md5 应互不相同,防止全都转成同一张图
md5sum ~/.local/share/icons/my-theme/cursors/default \
~/.local/share/icons/my-theme/cursors/pointer \
~/.local/share/icons/my-theme/cursors/wait
产物是"少量真实文件 + 大量别名软链"(left_ptr、ibeam、hand2 之类指向真实文件),.ani 的动画帧会完整保留。
3. 安装
输出目录已经直接是 ~/.local/share/icons/my-theme/cursors,所以只剩两步,然后完全照第二节走:
printf '[Icon Theme]\nName=my-theme\nInherits=Adwaita\nExample=default\n' \
> ~/.local/share/icons/my-theme/index.theme
ln -sfn ~/.local/share/icons/my-theme ~/.icons/my-theme
接着就是第二节的"改三处 + dms restart + 验证"。
四、具体案例:Sunna Cursor
主题:/home/zhou/Downloads/Sunna Cursor.zip(作者 NOIIRE,Windows 格式,17 个 .ani + Install.inf)。按第三节走,实际执行的是:
# 转换
mkdir -p /tmp/sunna/src /tmp/sunna/out
python3 -c "import zipfile; zipfile.ZipFile('/home/zhou/Downloads/Sunna Cursor.zip').extractall('/tmp/sunna/src')"
cd "/tmp/sunna/src/Sunna Cursor"
/tmp/sunna/venv/bin/win2xcurtheme Install.inf -o /tmp/sunna/out
# 安装
mkdir -p ~/.local/share/icons/Sunna-Cursor
cp -r /tmp/sunna/out/* ~/.local/share/icons/Sunna-Cursor/cursors/
printf '[Icon Theme]\nName=Sunna-Cursor\nInherits=Adwaita\nExample=default\n' \
> ~/.local/share/icons/Sunna-Cursor/index.theme
ln -sfn ~/.local/share/icons/Sunna-Cursor ~/.icons/Sunna-Cursor
# 应用
gsettings set org.gnome.desktop.interface cursor-theme 'Sunna-Cursor'
gsettings set org.gnome.desktop.interface cursor-size 32
# settings.json 的 cursorSettings → { theme: "Sunna-Cursor", size: 32 }
dms restart
实测结果:
ls ~/.local/share/icons/Sunna-Cursor/cursors | wc -l→ 148(15 个真实文件 + 133 条别名软链),9.5M- 每个光标 3 档尺寸(32/48/64),
default是蓝箭头、pointer是手型图,抽帧比对无误 - 主题只有 32/48/64 三档,所以
cursor-size取 32,三处保持一致
本次踩的坑:写完配置直接打开 DMS 图形设置确认,结果被 DMS 用内存里的旧状态覆盖回 System Default,cursor.kdl 也被写回 Adwaita。原因就是上面那条——dms restart 没先做。重来一遍(改配置 → dms restart → 再确认)就稳定了。
后续问题:桌面其他地方都好了,只有微信(Flatpak)里还是黑箭头 —— 那是另一个原因,见《微信 Linux 光标主题不生效.md》的情况二。
卸载
rm -rf ~/.local/share/icons/my-theme ~/.icons/my-theme
gsettings set org.gnome.desktop.interface cursor-theme Adwaita
gsettings set org.gnome.desktop.interface cursor-size 24
# DMS 里改回 System Default,或直接 dms restart 让列表重新扫描
常见问题
- 光标变隐形:
index.theme缺了,或没写Inherits,补上即可。 - DMS 总把设置改回去:
dms restart没做,见第二节的提醒。 - 光标太小/太大:主题一般只有 32/48/64 三档,选一档后三处保持一致。
- 转换报
FileNotFoundError: .../pencil:输出目录没提前mkdir -p。 - 某个应用死活不认主题:它可能没跑在 Wayland 上,见 微信 Linux 光标主题不生效。
资源
这是我使用的光标
https://ko-fi.com/s/584fe95124
效果图