Skip to content

Releases: liusuan233/cursor-manager

v1.0.3

Choose a tag to compare

@liusuan233 liusuan233 released this 19 Oct 05:55

v1.0.3

修掉「没有 .inf 的光标包导入后缺 3 个角色」,重画了应用图标,
并补上两个能省时间的生成脚本(演示视频、图标)。

修复:没有 .inf 的包,17 个角色里会漏掉 3 个

Windows 光标包分两类:用安装器打包的带 install.inf,手工拼的没有。
有 .inf 时它的 [Strings] 段就是微软官方的角色映射,属于权威数据;
没有就只能按文件名猜。

实测:拿一个真实包(ZUTOMAYO)把 .inf 抽掉再导入 ——

修复前   14 / 17
         漏掉 Diagonal1.ani、Diagonal2.ani、Horizontal.ani
修复后   17 / 17

根因很直接:关键词表里写的是 diag1 和 horz,但

  • diag1 不是 diagonal1 的子串
  • horz 不是 horizontal 的子串

而原来的实现是纯子串匹配,所以这三个永远猜不出来。
反过来还有误判风险:Small.ani 会因为含 all 被猜成"移动"。

现在改成三层匹配(从严到宽)

① 与 .inf 键名归一化后完全相同      diagonal1 == diagonal1
② 与任一关键词归一化后完全相同       working == working
③ 关键词子串匹配,最长优先          precision ⊃ precise
   三个字母以内的弱关键词只许整词命中

归一化是这次的关键:Diagonal-1 / diagonal_1 / Diagonal 1 / Diagonal1
现在都归一成 diagonal1;SizeNWSE 会按 camelCase 切成 size + nwse。

弱关键词(ns / we / up / all / alt / pen / no)必须整词命中,
否则 Small.ani 含 all、Normal.ani 含 no,会被硬拽到错误的角色上。

关键词表同时扩到覆盖三套命名习惯:

命名习惯 例子
微软官方方案 Normal Working Precision Handwriting Horizontal Diagonal1 Pin
X11 习惯 SizeNS SizeWE SizeNWSE SizeAll xterm crosshair left_ptr
中文 正常选择 文本选择 水平调整 手写 移动

猜不出来时

不会乱填 —— 认不出的角色保持空缺,由系统回落到默认光标,
同时在导入结果里明确提示:

这个包没有 .inf:17 个角色里 N 个没能从文件名认出来,会继承系统默认外观。
想要精确映射,把 .inf 放进包里重新导入一次(很多包的 .inf 是通用的,也可以手工写一个)

想精确控制的话,往包里放一个最小的 install.inf 就行(左边键名固定不能改):

[Version]
signature="$CHICAGO$"

[Strings]
SCHEME_NAME = "My Cursor"
pointer     = "Normal.ani"
help        = "Help.ani"
work        = "Working.ani"
busy        = "Busy.ani"
cross       = "Precision.ani"
text        = "Text.ani"
hand        = "Handwriting.ani"
unavailable = "Unavailable.ani"
vert        = "Vertical.ani"
horz        = "Horizontal.ani"
dgn1        = "Diagonal1.ani"
dgn2        = "Diagonal2.ani"
move        = "Move.ani"
alternate   = "Alternate.ani"
link        = "Link.ani"
loc         = "Pin.cur"
person      = "Person.cur"

顺带一个很多人不知道的点:微软光标方案的 17 个文件名是固定的,
所以两个都用标准名的包,.inf 是可以直接互借的,连文件名都不用改。

修复:图标尺寸档错配

install.sh 里原来有这么一行:

cp -f "$HERE/icons/cursor-manager.png" "$HICOLOR/256x256/apps/cursor-manager.png"

cursor-manager.png 是 512px 的,塞进 256x256/ 目录会让图标加载器拿到
尺寸不符的位图,也覆盖掉了上面刚写的回退逻辑。现在每档只进自己的目录。

另外 install.sh 和 PKGBUILD 都只装 5 档(32/48/64/128/256),
缺 512(现代桌面会找它)。两处都补上了。

install.sh 还加了:清掉不属于当前档位的旧文件 + 刷新图标缓存 ——
不然换了图标可能还显示老的。

新图标

旧图标是一个深色底上的光标箭头,比较平。新的是圆角方块 + 蓝紫渐变底,
白色箭头占画布 62%,底部三个色点当主题色板。

尺寸档 32/48/64/128/256/512 全部由脚本生成,改设计跑一遍就行:

make icon           # 重新生成 6 个尺寸档
make icon-preview   # 只出预览图(含 32/48/64 放大 4 倍的像素对照)

新增:两个生成脚本

脚本 作用
tools/make-demo.py make demo 自动生成演示视频(真跑命令、真解码光标,不需要录屏和剪辑软件)
tools/make-icon.py make icon 重新生成应用图标(6 个尺寸档)

两个脚本都进了源码包(MANIFEST.in 里 recursive-include tools *.py),
克隆下来就能跑。生成的 demo/*.mp4 和 icons/_preview.png 是构建产物,不进仓库。

另外新增了 docs/VIDEO-SCRIPT.md —— 想自己录介绍视频的话有分镜表和完整旁白稿。

从 v1.0.2 升级

sudo pacman -U cursor-manager-1.0.3-1-any.pkg.tar.zst

已经导入过不带 .inf 的光标包的,建议重新导入一次才能拿到修好的角色映射:

cursor-manager --import <原来的包> --name <原来的名字> --overwrite

下载哪个

文件 用途
cursor-manager-1.0.3-1-any.pkg.tar.zst Arch Linux:sudo pacman -U <文件>
cursor-manager-1.0.3.tar.gz 通用源码包,解包即用,也能被 pip install
cursor_manager-1.0.3-py3-none-any.whl Python wheel,配合 pipx install
SHA256SUMS 上面三个文件的校验和

安装

Arch Linux

sudo pacman -U cursor-manager-1.0.3-1-any.pkg.tar.zst

其他发行版(源码包,解包即用)

tar -xzf cursor-manager-1.0.3.tar.gz
cd cursor-manager-1.0.3
./cursor-manager            # 直接跑
./install.sh                # 或装到 ~/.local(含桌面入口和图标)

pipx

pipx install cursor_manager-1.0.3-py3-none-any.whl

PyGObject 无法用 pip 可靠安装,需要走发行版包管理器
(它只影响图形界面,命令行功能都不需要它)。

校验下载

sha256sum -c SHA256SUMS

自检

make test        # 导入器 55 + 删除 24 + 检查更新 25 + GUI 42 项

四套自检都不需要人看图,退出码非 0 即失败。
这次新增的 test_guess_roles() 专门钉住角色猜测:36 个正向用例
(标准名 / X11 名 / 分隔符变体 / 中文)、7 个反向用例(无关文件名不许误判)、
一个无 .inf 的 17 角色端到端包(并断言对角线、水平/垂直没有搞反)。

已知限制

  • Arch 包是按当前 Python 版本编译的(3.14)。Arch 换 Python 大版本后需等重新构建;
    源码包不受影响
  • apply 覆盖 niri / DMS / GTK / XWayland / gsettings;KDE 的 kcminputrc 未处理
  • 导入功能对 RLE 压缩的老式光标仍依赖 Pillow
  • 角色映射还不能在图形界面里手动指定 —— 猜不出来只能靠补 .inf 或改文件名

v1.0.2

Choose a tag to compare

@liusuan233 liusuan233 released this 10 Oct 10:22

v1.0.2

修掉一个让导入的主题直接不可用的 bug,并加上「检查更新」。

修复:调色板光标丢失透明度,整张变成黑底

如果你导入过 8bpp / 24bpp 的调色板光标包,光标会渲染成带黑色底方块的图。

根因两条:

1. Pillow 对 8bpp 调色板图像(mode=P)不应用 AND 掩码。
8bpp 是调色板格式,根本没有 alpha 通道 —— 透明度全靠 DIB 末尾的 AND 掩码。
Pillow 会把调色板直接展开成不透明 RGBA,于是整个光标变成实心方块。
而原来的解码顺序是「Pillow 优先」,所以所有调色板光标包都会中招。
(32bpp 带真 alpha 的包不受影响,纯属运气。)

现在自己实现 decode_dib(),支持 1/4/8/24/32bpp + 调色板 + AND 掩码,
解码顺序改为「自己优先,Pillow 只作后备」(后备用于 RLE 等冷门编码)。

2. IconEntry.bpp 的语义是错的。
CUR(type=2) 容器里 wPlanes / wBitCount 被复用成热点坐标,不是位深 ——
真位深得从 DIB 头读。

重写过程中我还引入了一个新 bug:32bpp 分支写成 r, g, b, a = row[si], ...,
但 DIB 里第一个字节是 B 不是 R,红蓝对调。是靠「与 Pillow 输出逐字节比对」
发现的(差异特征平均 20.267,和历史上那个通道 bug 一模一样)。
现在 32bpp 的 18 个帧与 Pillow 完全一致。

已经导入过这类主题的,需要重新导入一次才能修好:

cursor-manager --import <原来的包> --name <原来的名字> --overwrite

新增:检查更新

cursor-manager --check-update          # 命令行

图形界面左侧的 ≡ 菜单里也有「检查更新…」。

三条刻意的设计:

  • 只检查,不自动更新。 这个工具会写用户的 ~/.config 和 ~/.local,
    自动下载替换出问题的代价太高。查出有新版本就告诉你怎么装,装不装由你决定
  • 不在启动时联网。 只有显式执行检查时才发请求 —— 一个光标工具没必要
    在每次开窗时暴露你的 IP 和启动时间
  • 失败必须安静。 没网、超时、被限流、仓库还没发布过,都只返回一条提示,
    不影响任何本地功能

版本比较用的是数字元组,不是字符串 —— 否则 1.0.10 会被判成小于 1.0.9。

从 v1.0.1 升级

sudo pacman -U cursor-manager-1.0.2-1-any.pkg.tar.zst

下载哪个

文件 用途
cursor-manager-1.0.2-1-any.pkg.tar.zst Arch Linux:sudo pacman -U <文件>
cursor-manager-1.0.2.tar.gz 通用源码包,解包即用,也能被 pip install
cursor_manager-1.0.2-py3-none-any.whl Python wheel,配合 pipx install
SHA256SUMS 上面三个文件的校验和

安装

Arch Linux

sudo pacman -U cursor-manager-1.0.2-1-any.pkg.tar.zst

其他发行版(源码包,解包即用)

tar -xzf cursor-manager-1.0.2.tar.gz
cd cursor-manager-1.0.2
./cursor-manager            # 直接跑
./install.sh                # 或装到 ~/.local(含桌面入口和图标)

pipx

pipx install cursor_manager-1.0.2-py3-none-any.whl

PyGObject 无法用 pip 可靠安装,需要走发行版包管理器
(它只影响图形界面,命令行功能都不需要它)。

校验下载

sha256sum -c SHA256SUMS

自检

make test        # 导入器 45 + 删除 24 + 检查更新 25 + GUI 42 项

四套自检都不需要人看图,退出码非 0 即失败。
selftest_update.py 全部用 mock 打桩,离线也能确定性跑。
这次新增的回归用例专门钉住黑底 bug:合成一个 8bpp + AND 掩码的 .cur,
断言「掩码标为透明的像素真的透明」且「不是 100% 不透明」。

已知限制

  • Arch 包是按当前 Python 版本编译的(3.14)。Arch 换 Python 大版本后需等重新构建;
    源码包不受影响
  • apply 覆盖 niri / DMS / GTK / XWayland / gsettings;KDE 的 kcminputrc 未处理
  • 导入功能对 RLE 压缩的老式光标仍依赖 Pillow

v1.0.1

Choose a tag to compare

@liusuan233 liusuan233 released this 10 Oct 10:09

v1.0.1

新增删除主题功能,并修掉两个 v1.0.0 里的问题。

新增:删除主题

只能浏览、切换、导入确实不算"管理",这个版本补上了删除。

因为这个操作不可逆,加了四道安全闸门:

闸门 行为
只删用户目录 /usr/share/icons 里的系统主题会被拒绝,提示改用发行版包管理器
不删正在使用的 删掉当前主题会让所有程序静默回落到 Adwaita(正是本项目要防的坑),会拒绝并让你先切换
必须"长得像主题" 既没有 cursors/ 也没有 index.theme 就拒绝,防止传错路径
默认进回收站 按 freedesktop 规范写 .trashinfo,可从文件管理器恢复;--purge 才是真删
cursor-manager remove <主题名>              # 移入回收站
cursor-manager remove <主题名> --purge      # 永久删除
cursor-manager remove <主题名> --dry-run    # 只看会删什么、多大

图形界面里头部多了删除按钮:删不动的时候按钮直接禁用,悬停会说明原因
("位于系统目录…" / "它正是当前生效的主题…"),不会让你点了才被拒。

修复

在非 niri 的机器上凭空创建 ~/.config/niri/。
v1.0.0 的 apply 无条件创建 ~/.config/niri/dms/ 再写文件。
GNOME / KDE / X11 用户跑一次 apply,家目录里就多出一个 niri/ 目录。
现在会先检查 ~/.config/niri/ 是否存在,不存在则跳过并在报告里标注。

自检硬编码主题名。
selftest_gui.py 原来断言"自动选中的是 Kinomoto-Sakura",
用户换主题后自检会莫名其妙失败(代码一行没改)。现在改为从实际状态读出当前生效的主题。

文档

README 补上了平台支持矩阵 —— 功能 × 平台、apply 到底写哪些配置、
哪些桌面只部分支持(KDE 不写 kcminputrc、sway/Hyprland 需自行设 XCURSOR_THEME 等)。

docs/NOTES.md 记录了几个测试时踩的坑,其中一个值得单独提醒:

HOME=假目录 隔离不了 gsettings。 dconf 由会话总线上的服务写,
客户端只是通过 D-Bus 发变更,真正落盘的是那个已用真实环境启动的服务。
所以拿假 HOME 测 apply 仍然会改到你真实的 org.gnome.desktop.interface cursor-theme,
而且不会报错。测试 apply 一律加 --dry-run。

从 v1.0.0 升级

Arch 用户直接用新包覆盖:

sudo pacman -U cursor-manager-1.0.1-1-any.pkg.tar.zst

其他安装方式重新执行一次安装命令即可,配置无需改动。

下载哪个

文件 用途
cursor-manager-1.0.1-1-any.pkg.tar.zst Arch Linux:sudo pacman -U <文件>
cursor-manager-1.0.1.tar.gz 通用源码包,解包即用,也能被 pip install
cursor_manager-1.0.1-py3-none-any.whl Python wheel,配合 pipx install
SHA256SUMS 上面三个文件的校验和

安装

Arch Linux

sudo pacman -U cursor-manager-1.0.1-1-any.pkg.tar.zst

其他发行版(源码包,解包即用)

tar -xzf cursor-manager-1.0.1.tar.gz
cd cursor-manager-1.0.1
./cursor-manager            # 直接跑
./install.sh                # 或装到 ~/.local(含桌面入口和图标)

pipx

pipx install cursor_manager-1.0.1-py3-none-any.whl

PyGObject 无法用 pip 可靠安装,需要走发行版包管理器
(它只影响图形界面,--list / --import / apply / remove 都不需要它)。

校验下载

sha256sum -c SHA256SUMS

自检

make test        # 导入器 38 项 + 删除 24 项 + GUI 39 项

三套自检都不需要人看图,退出码非 0 即失败。
删除功能的 24 项全部在伪造的 HOME 里跑,包括"闸门拒绝时确实没动手"和
回收站 .trashinfo 的 Path 能正确还原。

已知限制

  • Arch 包是按当前 Python 版本编译的(3.14)。Arch 换 Python 大版本后需等重新构建;
    源码包不受影响
  • apply 覆盖 niri / DMS / GTK / XWayland / gsettings;KDE 的 kcminputrc 未处理
  • 导入功能对非 32bpp 的老式 .cur 依赖 Pillow

v1.0.0

Choose a tag to compare

@liusuan233 liusuan233 released this 10 Oct 09:44

v1.0.0

Linux 鼠标光标主题管理器 —— 在 niri / Wayland 上浏览、动画预览、一键切换光标主题,
还能直接导入 Windows 的 .ani 光标包。

亮点

  • 一次写全 6 个配置点 —— niri、DMS、GTK3、GTK4、.Xresources、gsettings。
    Wayland 下没有全局光标设置,漏掉任何一处,那一类程序就会继续用 Adwaita
  • 把"静默失败"标红 —— 主题目录缺一层 cursors/ 时,Wayland 客户端会悄悄忽略它
    并回落到 Adwaita,不报任何错。这个工具把布局校验做成界面上可见的 ✔/✘
  • 动画预览 —— 自己解码 Xcursor 二进制格式逐帧播放,普通图片查看器打不开这种文件
  • 导入 Windows 光标包 —— 优先读包内 .inf 的 [Strings] 段拿到微软官方角色映射,
    比按文件名猜可靠得多;自动从 256×256 原图降采样出多档尺寸
  • CLI 不依赖 GTK —— --list / --import / apply 在无图形环境的服务器上也能用

下载哪个

文件 用途
cursor-manager-1.0.0-1-any.pkg.tar.zst Arch Linux 用户装这个:sudo pacman -U <文件>
cursor-manager-1.0.0.tar.gz 通用源码包。解包即用(./cursor-manager),也能 pip install 它
cursor_manager-1.0.0-py3-none-any.whl Python wheel,配合 pipx install 使用
SHA256SUMS 上面三个文件的校验和

安装

Arch Linux

sudo pacman -U cursor-manager-1.0.0-1-any.pkg.tar.zst

依赖会自动从仓库装(python-gobject、gtk4、python-numpy、python-pillow)。

其他发行版(源码包,解包即用)

tar -xzf cursor-manager-1.0.0.tar.gz
cd cursor-manager-1.0.0
./cursor-manager            # 直接跑
./install.sh                # 或者装到 ~/.local(含桌面入口和图标)

pipx

pipx install cursor_manager-1.0.0-py3-none-any.whl

PyGObject 无法用 pip 可靠安装,需要走发行版包管理器:

sudo pacman -S python-gobject gtk4                    # Arch
sudo apt install python3-gi gir1.2-gtk-4.0            # Debian / Ubuntu
sudo dnf install python3-gobject gtk4                 # Fedora

用法

cursor-manager                              # 图形界面
cursor-manager --list [-v]                  # 列出已安装主题
cursor-manager apply <主题名> [尺寸]         # 切换主题
cursor-manager apply <主题名> --dry-run     # 只报告会改哪些文件
cursor-manager --import <路径> [选项]        # 导入 Windows 光标包
cursor-manager --help

切换后 niri 保存配置时会自动重载,但已经开着的程序需要重启才能换过来。

校验下载

sha256sum -c SHA256SUMS

环境要求

  • Linux + Wayland(niri、DMS 为最佳适配)
  • Python 3.10+
  • PyGObject + GTK4(仅图形界面需要,CLI 不需要)
  • numpy、Pillow(可选;没有会自动退回纯 Python 实现,只是慢一些)

已知限制

  • Arch 包是按当前 Python 版本编译的(3.14)。Arch 滚动更新换 Python 大版本后,
    需要等包重新构建;源码包不受影响
  • apply 目前只覆盖 niri / DMS / GTK / XWayland / gsettings 这几条链路;
    KDE 的 kcminputrc 没有处理(KDE 用户可以用 CLI 的 --dry-run 看会改什么)
  • 导入功能对非 32bpp 的老式 .cur 依赖 Pillow;没装 Pillow 时只支持 32bpp

自检

这个版本带两套机器可验证的自检,不需要人看图,退出码非 0 即失败:

make test        # GUI 29 项 + 导入器 38 项

selftest_import.py 会自己合成光标包,没有外部素材也能完整跑。
另有 verify_cursor.c,用 libXcursor 官方 API 验证"主题名能否真的被加载"。


首次发布。