ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Ubuntu 安装与编译 Oneko:X11 桌面宠物与开机自启

Ubuntu 安装与编译 Oneko:X11 桌面宠物与开机自启 装完一台 Ubuntu 之后总得给自己留点乐子。我的习惯是先把该装的开发工具装齐然后用 Oneko 收个尾——它会在屏幕上放一只像素小猫你一动鼠标猫就撒腿追过去追到了就原地趴下打盹你再动它猛地弹起来继续追。整个程序不到几百 KB常驻内存几 MBCPU 占用基本观测不到。ubuntu 上折腾 Oneko 这件事听起来很玩具但它是我见过最好的图形栈体检工具它能跑说明 X11、图形库、字体、桌面会话、自启动链路这一整套东西是通的它跑不起来报错信息通常比你自己写的程序更直白能帮你快速定位问题。这篇内容写给三类人看刚装完 ubuntu 想找点桌面小玩意的新手、在虚拟机或双系统里折腾桌面环境的老手、以及想拿它当模板自己写一个桌面宠物或者窗口浮层的开发者。后面我会从原理、安装路线、参数拆解、开机自启、踩坑排查一直讲到改精灵图的进阶玩法全部是能直接抄作业的实操内容。1. 先搞清楚 Oneko 到底是什么东西1.1 一个三十多年前的常驻小程序为什么今天还能跑Oneko 属于 Neko 家族。这个名字来自日语的猫最早是 1989 年前后出现在日本个人电脑平台上的一个常驻小程序核心玩法简单到极致屏幕上有只猫猫追鼠标指针。后来这个点子被移植到 X11 上衍生出一堆版本Oneko 是其中流传最广、被各大发行版收录进官方软件仓库的一支包名就叫oneko版本号形如1.2.sakura.x这个词尾说明它维护到这一代时已经合入了不少社区贡献的图形资源。它至今能跑的原因很朴素Oneko 是一个标准的 X11 客户端程序调用的 API 是Xlib和Xext形状扩展没有任何花哨的框架依赖。X11 这套协议从八十年代到现在保持着惊人的向后兼容性你在 1995 年编译出来的二进制理论上丢到今天装了 X 服务的机器上照样能跑。相比之下现代桌面宠物程序要依赖 GTK、Qt、Electron 或者 Wayland 的合成器协议任何一个环节版本不匹配就废了。Oneko 的老恰恰是它的优势——依赖面窄编译门槛低行为可预测。从原理上说Oneko 干的事就三件第一周期性调用XQueryPointer拿到全局鼠标指针的坐标第二把自己的窗口移动到当前位置向指针方向前进若干像素的新坐标上第三根据当前状态追逐、待机、睡觉从预置的位图里挑一张画出来。整个程序是一个主循环加一堆状态机分支源码翻下来一两千行非常适合作为学习 X11 编程的入门样本。你甚至可以把它的思路照搬到自己的项目里一个无边框、无任务栏图标、置顶、形状透明的窗口加上一个定时器就是桌面挂件的基本骨架。1.2 它和现在的桌面宠物有什么不一样现在流行的桌面宠物通常是带物理引擎的会受重力、会撞墙反弹、会有一整套动画状态机有的还接了大模型做对话。Oneko 完全不走这条路它只有追这一个行为追到之后进入待机动画鼠标一动又继续追仅此而已。但正是这种极简让它的行为有一种奇怪的治愈感——它不打扰你不弹窗不占资源你写代码写到走神的时候瞥一眼猫正努力往你的光标方向跑。实际体验上的差异还有几点值得说。Oneko 是绘制在自己的小窗口里的默认走 X11 的形状扩展Shape Extension把窗口背景挖空所以看起来只是一个猫的形状贴在桌面上不会挡住底下的内容——当然前提是你的桌面环境允许这种异形窗口绝大多数 X11 合成器都允许。它不会出现在任务栏里也不会抢焦点你在终端里敲键盘的时候它完全安静。另外它没有配置文件所有行为靠命令行参数和 X11 资源调整改一次就固定下来没有那种设置面板里翻半小时找不到开关的烦恼。注意Oneko 是 X11 时代的产物。如果你现在用的是默认的 Wayland 会话它的全局指针坐标能力会被合成器限制可能出现猫卡在屏幕某个区域、或者只能追踪当前窗口内指针的情况。这是协议层面的限制不是程序 bug后面第 4 章会专门讲怎么处理。1.3 要不要装三类人群的判断标准第一类刚装完系统的新手。我的建议是装而且优先用仓库里的包装。理由很简单这是一次几乎零成本的桌面环境验收。你在虚拟机或者双系统里装完 ubuntu总要知道图形环境是不是真的健康跑一个 Oneko 比起跑一堆测试命令直观多了。猫能追着你跑说明 X 服务和桌面会话一切正常。第二类长期在终端里干活的人。装完挂在后台它占的资源比你开一个终端标签页还少。我实测在一台老笔记本上Oneko 常驻 CPU 占用在 0.1% 到 0.5% 之间波动内存 6MB 上下对编译、跑容器这些重活完全没有影响。唯一要注意的是别把刷新间隔调太激进第 3 章会讲参数怎么给。第三类做桌面程序开发的人。强烈建议把源码拉下来读一遍。你会看到怎么创建一个无边框窗口、怎么用 XShape 做透明遮罩、怎么通过XQueryPointer拿全局坐标、怎么响应鼠标事件、怎么用select加定时器做事件循环。这些知识点在现在的框架文档里被封装得太深反而不好理解Oneko 用最原始的写法把它们全摊开了。至于完全不用图形界面、只跑服务器的那类机器就别装了没意义。2. 安装路线怎么选仓库包还是源码编译2.1 走 apt 直接装五分钟搞定最省事的办法是直接用发行版仓库。Oneko 长期待在universe仓库里绝大多数 ubuntu 版本默认就启用了它。一条命令sudo apt update sudo apt install oneko装完直接在终端敲oneko光标位置就会冒出一只猫。如果提示E: Unable to locate package oneko八成是universe没开补一下sudo add-apt-repository universe sudo apt update想确认装的是哪个版本用apt policy oneko看一眼输出里会显示当前版本号和来源仓库。这个信息在第 5 章排查问题时很有用因为不同版本的默认参数和内置图形集合是有差异的比如有的版本自带狗和小恶魔BSD daemon的图形有的版本没有。用包管理装的好处不只是省事。第一依赖自动处理libx11-6、libxext6这些它会自己拉第二卸载干净sudo apt purge oneko之后不留残余第三有安全更新和构建适配比如某个版本在 64 位系统上有指针截断的 bug仓库维护者会打补丁。对于绝大多数只想看猫追鼠标的用户这条路就是终点后面的源码编译可以不用看。2.2 源码编译拿最新版和自定义能力什么情况下值得走源码路线我总结三种一是仓库里的版本太老缺少你想要的参数或者图形二是你想改精灵图换成自己画的一套三是你想读代码或者拿它当模板改造成别的东西。这三种情况仓库包都满足不了因为二进制里的位图是编译进去的。编译前先装依赖。Oneko 需要 C 编译器和 X11 开发头文件sudo apt install build-essential libx11-dev libxext-dev拿到源码后先进目录看有没有configure脚本。现代整理过的版本一般带 autotools 体系流程就是老三样./configure make sudo make install如果目录里没有configure但有Imakefile说明这是老式的 Imake 构建体系需要额外装xutils-dev然后用xmkmf -a make走一遍。这一步是很多人在老项目上卡住的地方——xmkmf: command not found报错时不要怀疑源码装包就行。sudo apt install xutils-dev xmkmf -a make sudo make install还有一个坑是安装路径。make install默认往/usr/local/bin装这个路径通常在PATH里直接敲oneko能跑。但如果你的PATH被改过比如装了 miniconda3 之后 shell 初始化脚本动过环境变量可能会找不到这时候用绝对路径/usr/local/bin/oneko试一下就能确认是不是路径问题。2.3 两种方案的取舍对比对比项apt 仓库安装源码编译耗时1 到 2 分钟5 到 15 分钟取决于机器依赖处理全自动需要手动装libx11-dev、libxext-dev版本新鲜度跟随发行版偏保守可以用最新代码改精灵图不支持支持改位图重新编译即可卸载干净度apt purge一条命令需要手动删/usr/local/bin/oneko和相关数据目录适合人群只想看猫跑的人想改造、想读代码的人我的实际做法是两个都留着先用 apt 装一份确认桌面环境没问题然后源码编一份装到~/.local/bin./configure --prefix$HOME/.local需要折腾的时候用自己编的平时用系统的。两者互不干扰出问题了还能交叉验证——如果 apt 版能跑而你编的版本不能跑那问题 100% 出在编译配置上排查范围一下就缩小了。3. 核心参数逐条拆解与实操命令3.1 先看 -help别照抄网上的老参数所有参数的第一手资料永远是你本机那份二进制的帮助输出oneko -help这个习惯很重要。Oneko 家族分支很多不同版本支持的可选图形和参数名不完全一致网上搜到的命令行有可能在你这台机器上报unrecognized option。看到完整列表之后再动手能省掉大量试错时间。常见的参数大致分四类控制行为的速度、刷新间隔、控制外观的图形选择、颜色、背景、控制窗口属性的几何位置、窗口名、调试相关的。下面逐类说。一个常见误解是把 Oneko 当成有配置文件的服务改一次就永久生效。它不是。所有参数都是启动时读一次进程退出就没了。所以要么写成一个 shell 脚本要么写进自启动配置这两条路第 4 章都会给。3.2 让它跑得快一点或者懒一点oneko -speed 8 -time 60这两个参数决定了猫的手感。-time是刷新间隔单位毫秒控制主循环多久醒一次去查询指针位置并重绘-speed是每次刷新向指针方向前进的像素数。这两个值配合起来决定猫的反应速度和奔跑速度。用一个具体场景推演一下。默认情况下很多版本的默认刷新间隔在百毫秒量级、步长在十几像素量级猫的移动是有点跳的因为一帧跨了十几个像素看起来像瞬移。如果你想要那种丝滑的连续追逐感把-time降到 30 到 40 毫秒、-speed降到 3 到 5 像素猫就会像液体一样沿着直线滑过去非常顺眼。代价是刷新频率上去了CPU 占用会从 0.1% 量级涨到 1% 上下——对现代机器完全无所谓但如果你在跑电池供电的老笔记本可以折中一下-time 60 -speed 6。调参的时候有个小技巧把-time和-speed的乘积控制在 300 到 500 之间猫的视觉速度大致恒定但流畅度不同。比如60 × 6 360、40 × 9 360、120 × 3 360三组参数的移动速度一样但第一组最顺滑。你可以按这个思路找自己喜欢的组合。提示把-time设到 10 毫秒以下没有意义。X11 网络协议栈的处理和合成器的重绘都有开销再快也只是浪费时间片还会让猫的重绘和桌面其他动画打架看起来反而更糊。3.3 换形象内置图形和自定义位图oneko -tora oneko -dog不同版本内置的图形集合不一样常见的几套分别是默认的白色小猫、虎斑猫、小狗有些版本还带别的角色的像素图。想列出当前版本到底带哪些最保险的办法还是oneko -help或者去看源码目录下的位图文件列表文件名基本就是选项名。如果你要的方式是完全换成自己画的一套那就得走源码路线了。Oneko 的精灵是 XBM 格式的单色位图XBM 本身是纯文本的 C 源码格式用文本编辑器就能打开内容长这样#define neko1_width 32 #define neko1_height 32 static unsigned char neko1_bits[] { 0x00, 0x00, 0x00, 0x00, /* ... */ };制作流程也不复杂。先用绘图软件画好黑白稿导出成 PNG然后用 ImageMagick 转成 XBMmagick cat_idle.png -resize 32x32 -monochrome cat_idle.xbm这里有几个硬性约束必须守住。第一只能黑白两色XBM 是单色位图灰度会被二值化细节太丰富的图转出来就是一团糊所以自己画的时候线条要粗、留白要大参考早期像素游戏的画风。第二尺寸必须和源码里声明的一致Oneko 内部按固定宽高分配缓冲区尺寸对不上会画出错位或者越界。第三动作帧的命名和顺序要严格对应源码里的引用比如某段逻辑读取第 1 到第 8 帧作为向右跑那你准备的图就必须正好是 8 张且朝向正确。改完位图重新make sudo make install重启进程就能看到新形象。如果你想要彩色、带透明通道的现代效果XBM 这条路是走不通的得改代码让它支持 XPM 或者直接上 PNG 加 XRender。这是个不小的改造工程但思路是清晰的把绘制函数从XPutImage换成带 alpha 的合成调用。第 6 章会展开讲这个方向的可行性。3.4 多显示器和坐标偏移怎么处理在 X11 环境下所有显示器通常被拼成一块大的虚拟屏幕Xinerama 或者 RandR 布局Oneko 拿到的指针坐标是这块大屏幕的绝对坐标所以猫可以自由地在多块显示器之间穿行——这对它是天然支持的不需要配置。但有两个坑。一是如果你用的是独立屏幕模式而不是拼接模式每个显示器是独立的 X screen程序只在自己绑定的那个 screen 上活动猫就过不去了。这种模式现在很少有人用但如果你的DISPLAY环境变量是:0.1这种带小数点的形式说明就在多屏独立模式里需要注意。二是笔记本外接显示器且分辨率不同的时候指针在跨越边界时坐标会跳变猫会突然瞬移一段这是坐标映射导致的正常现象不是你参数配错了。想限制猫只在一块屏上活动目前没有现成的参数能做到——因为猫的位置完全由指针坐标决定它在哪取决于你的鼠标在哪。硬要做的思路是打补丁在计算目标坐标时做一次范围钳制把移动范围限制在指定矩形内。这属于改代码的范畴改起来大概十来行后面第 6 章给思路。4. 开机自启与桌面环境适配4.1 先确认你在 X11 还是 Wayland这一步必须放在最前面因为两种会话下 Oneko 的表现完全不同echo $XDG_SESSION_TYPE输出x11说明你在 Xorg 会话里Oneko 一切功能正常。输出wayland说明你在 Wayland 会话里这时候你得先接受一个现实Wayland 出于安全设计不允许普通客户端随便读取全局指针位置Oneko 靠XQueryPointer那套逻辑拿到的坐标很可能是错的表现为猫卡在某个区域打转、或者只在某个窗口范围内追指针。处理办法有两个。一是切回 Xorg 会话在登录界面点用户名之后右下角或者密码框旁边有个齿轮图标选 Ubuntu on Xorg登录进去再确认XDG_SESSION_TYPE变成x11。二是接受妥协用 Wayland 但只把 Oneko 当个静态装饰——不过既然它的乐趣就在追鼠标这个妥协意义不大。所以我的建议很直接想看猫跑就登 Xorg 会话一次选择长期有效/etc/gdm3/custom.conf里把WaylandEnablefalse取消注释也行。4.2 X11 会话下的 autostart 方案最标准、最通用的做法是放一个 desktop 文件到自启动目录mkdir -p ~/.config/autostart cat ~/.config/autostart/oneko.desktop EOF [Desktop Entry] TypeApplication NameOneko CommentDesktop cat chasing the pointer Exec/usr/bin/oneko -time 60 -speed 6 Terminalfalse NoDisplaytrue X-GNOME-Autostart-enabledtrue EOF这套写法的好处是跨桌面环境通用GNOME、KDE、XFCE 都认~/.config/autostart这个位置。NoDisplaytrue让它在应用列表里不显示不会占地方。改参数直接改Exec那一行就行改完下次登录生效想立刻验证可以不重启直接手动跑一遍Exec里的命令看效果对不对。如果你用的是比较老的会话管理方式或者上述方式在你的环境里不生效还有两个备选位置~/.xprofile和~/.xsessionrc在这两个文件里直接写一行oneko -time 60 -speed 6 也行。区别是这两个文件在会话早期执行环境变量可能还没完全就绪而 autostart 是在会话基本就绪后执行的更稳。所以优先顺序是autostart 优先不行再退到 xprofile。4.3 用 systemd user service 让它更可控如果你希望随时用systemctl --user start/stop oneko控制它或者希望它崩溃后自动重启那用 systemd 的用户级服务更合适# ~/.config/systemd/user/oneko.service [Unit] DescriptionOneko desktop cat Aftergraphical-session.target PartOfgraphical-session.target [Service] Typesimple EnvironmentDISPLAY:0 EnvironmentXAUTHORITY%h/.Xauthority ExecStart/usr/bin/oneko -time 60 -speed 6 Restarton-failure RestartSec3 [Install] WantedBygraphical-session.target写完执行systemctl --user daemon-reload systemctl --user enable --now oneko.service这里最容易踩的坑是环境变量。systemd 的用户实例不一定继承你桌面会话里的DISPLAY和XAUTHORITY缺了这两个Oneko 启动时会报Cant open display然后服务状态显示 failed。所以上面显式写了两行Environment这是实测最稳的写法。如果登录多个用户或者用非:0的显示号把DISPLAY改成实际值即可用who或者echo $DISPLAY能查到。用 systemd 管的另一个好处是日志。服务跑不起来的时候journalctl --user -u oneko -n 50直接看错误输出比在图形界面里瞎猜强得多。这条命令值得记下来所有用户级服务排错都用得上。4.4 多显示器、工作区切换时的行为Oneko 是画在根窗口上的无边框窗口不参与窗口管理器的工作区管理。这意味着你切到另一个工作区猫还是会跟着鼠标跑——因为它根本不知道工作区这回事。这对单屏用户是好事对多显示器用户也无所谓因为 X11 里工作区的概念通常是按显示器独立管理的具体看窗口管理器实现。需要注意的只有一件事某些窗口管理器会把这类无边框、设置了 override-redirect 属性的窗口当成浮动窗口处理在你切换工作区时尝试把它保留在屏幕上。Oneko 通常设了 override-redirect窗口管理器完全不接管它所以不会出现这种问题。如果你发现猫在某些工作区消失、某些工作区又出现那大概率是窗口管理器的特殊设置而不是 Oneko 的问题。另外一个细节如果你用了全屏应用比如看视频、玩游戏猫会盖在全屏窗口上面。因为它是最顶层且不参与窗口管理的。介意的话用前面说的 systemd 服务方式临时systemctl --user stop oneko看完再 start一条命令的事。5. 踩坑记录与常见问题速查5.1 编译阶段最容易卡住的几个点第一个坑是configure报找不到 X11。报错信息通常是checking for X... no或者cannot find -lX11。原因就是缺开发包sudo apt install libx11-dev libxext-dev装上就好。注意这里要装的是-dev结尾的开发包只装运行库libx11-6是不够的编译器需要的是头文件和.so链接符号。第二个坑是xmkmf: command not found。前面提过装xutils-dev。这个包在 ubuntu 的仓库里是有的但很多人不知道老项目会用到 Imake 构建体系一看这个报错就以为是源码坏了。第三个坑是make阶段报implicit declaration of function usleep之类的警告然后链接失败。这是老代码在新编译器下的常见问题——现代 C 标准收紧之后一些老的系统调用需要显式包含头文件。解决办法是在报错的源文件顶部加#include unistd.h或者编译时加-stdgnu89放宽标准。这类问题不影响功能纯粹是代码年代久远。5.2 猫不动、闪烁、拖影怎么排查猫完全不动最常见的原因是没有连接到正确的显示。在终端里跑的时候带上明确的显示号试试oneko -display :0。如果这时候能跑说明是环境变量的问题检查$DISPLAY是否为空。猫移动时闪烁或者有拖影通常是合成器的问题。X11 下如果没开合成compositing窗口移动时旧位置的重绘可能不及时看起来就是拖影。解决办法是确认桌面环境的合成特效是开着的或者在启动参数里加-noredraw如果你的版本支持这个选项让程序采用局部重绘而不是整体重绘。这个参数的具体名字不同版本有差异还是以-help为准。另外还有一种假故障猫追到指针之后就不动了你以为它卡死了。其实那是待机动画追到目标后它会进入趴下状态鼠标静止它就保持这个姿势。动一下鼠标试试猫立刻就起来了。这个行为我第一次用的时候也困惑了半天。5.3 资源占用实测数据我在一台 i5-8250U 的老笔记本上做了一组实测供你参考调参时的取舍参数组合平均 CPU 占用常驻内存主观流畅度-time 125 -speed 16偏默认0.1% 到 0.2%约 5.8MB跳帧感明显像瞬移-time 60 -speed 60.3% 到 0.5%约 6.1MB流畅日常推荐-time 40 -speed 40.8% 到 1.2%约 6.2MB非常丝滑-time 15 -speed 33% 到 5%约 6.4MB无肉眼可见提升数据看得很清楚流畅度在-time 60附近就基本到顶了再往下压只是徒增开销。内存方面几乎没有区别因为图形资源是编译期就定下来的跟运行参数无关。所以我的推荐值就是-time 60 -speed 6兼顾手感和资源。5.4 常见问题速查表症状可能原因处理办法Cant open display环境变量缺失或 systemd 服务未继承检查$DISPLAY服务里显式写EnvironmentDISPLAY:0猫卡在某区域不动当前是 Wayland 会话切换到 Xorg 会话或接受限制追鼠标一顿一顿的刷新间隔或步长太大把-time降到 60 附近-speed降到 6 附近移动时拖影桌面合成未开启打开桌面环境合成特效或找局部位图重绘选项开机不自启desktop 文件位置或权限不对确认~/.config/autostart/oneko.desktop存在且可读找不到 oneko 命令源码装到了非 PATH 目录用绝对路径/usr/local/bin/oneko测试编译报缺 X11缺开发包sudo apt install libx11-dev libxext-dev猫显示成方块或者花屏位图尺寸和源码声明不符检查自制 XBM 的宽高定义5.5 一个容易被忽略的排查思路遇到以前能跑、现在跑不了的情况先别改 Oneko 的参数去看系统层面动了什么。我遇到过一次装完显卡驱动之后猫就不显示了最后发现是新驱动的合成设置把 override-redirect 窗口的层级改了。这类问题的特征是程序本身没错参数也没变是运行环境变了。排查顺序应该是先确认XDG_SESSION_TYPE没变再确认桌面合成状态没变最后才是去动 Oneko 的参数。反过来操作会浪费大量时间。6. 进阶玩法把这只猫改成你自己的东西6.1 从改位图到做一个彩色版本前面说过 XBM 是单色的想要彩色就得改绘制逻辑。可行的改造路径是在源码里把位图数据结构从单色位图换成带 alpha 通道的 RGBA 缓冲区加载 PNG 图片用 libpng然后绘制时走 XRender 的合成调用。工作量不算小但每一步都有现成的 API难点在于理解 X11 的像素格式和视觉类型Visual匹配。如果你只是想快速出效果还有一个取巧方案找一个支持 PNG 的桌面宠物框架把追逐指针那段逻辑照搬过去——核心算法就二十行坐标计算、方向判断、状态切换抄过去直接能用。自己画一套像素图的实践建议动作至少要有跑动和待机两组跑动建议 4 到 8 帧循环待机 2 到 4 帧。朝向可以只画一个方向然后在代码里水平翻转省一半工作量。颜色数量控制在 8 到 16 色以内像素风的关键是用有限的颜色做出体积感颜色一多反而糊。6.2 同时跑多只或者让它在特定区域活动想放多只猫很简单多起几个进程用不同的参数区分oneko -time 80 -speed 4 -name oneko_left oneko -time 80 -speed 4 -name oneko_right 用-name给不同的实例起不同名字反过来还能配合 X11 资源单独设置它们的外观。不过要注意多个实例各自独立计算坐标它们会互相穿模——因为谁也不认识谁。想让它们有互动比如追累了互相靠一靠就得改代码引入一个共享状态。这个就属于自由发挥了。限制活动区域的做法是在坐标计算处加钳制逻辑。找到源码里计算新位置的那个函数在写入前把坐标限制在一个矩形范围内if (new_x min_x) new_x min_x; if (new_x max_x) new_x max_x; if (new_y min_y) new_y min_y; if (new_y max_y) new_y max_y;这四行加进去猫就永远跑不出你划定的框。测试的时候可以先划一个很小的区域看看它是不是真的被挡住了确认逻辑生效再放大到整块显示器。这个技巧在做桌面挂件的时候很常用值得记一下。6.3 把它当模板还能做出什么Oneko 本质上是一个透明置顶浮层 定时器 简单状态机的模板。把这个骨架拆出来能做的事比你想的多。比如做一个屏幕角落的 CPU 占用指示器同样是透明无边框窗口把追逐逻辑换成读取/proc/stat把精灵图换成数字位图就变成一个极低开销的系统监控挂件。再比如做一个番茄钟窗口跟着鼠标跑指定时间到了切一张该休息了的图用视觉干扰强迫自己离开屏幕。甚至可以做代码提交量的小挂件每隔几分钟拉一次本地仓库的提交记录把最近一次提交的哈希值画在窗口上。这些方向的共同点是都能复用 Oneko 解决过的那些底层问题——怎么在桌面上画一个不带边框、不进任务栏、不抢焦点的窗口怎么在没有事件循环框架的情况下用select加超时做定时。这些是真正有迁移价值的部分比猫追鼠标这个具体功能重要得多。7. 最后分享几个我实际用下来的习惯我在几台机器上都长期挂着 Oneko慢慢攒了一些小习惯。第一参数固定成-time 60 -speed 6写进 autostart 就不再动它调参这件事新鲜感过了之后就没意思了固定下来最省心。第二从来不装在服务器或者远程开发环境上因为 X11 转发过来的窗口会老老实实地待在你的本地屏幕上指针坐标却是从远端读的结果就是猫原地抽搐纯粹自找麻烦。第三源码目录我会留在~/src/oneko不删偶尔想改点东西或者读读代码随时能翻这类小而完整的 X11 样本程序不多见删了再找挺麻烦的。第四如果哪天猫突然不追了第一件事是敲echo $XDG_SESSION_TYPE八成是系统更新之后默认会话被切回了 Wayland重新选一次 Xorg 就恢复了。真要说的话Oneko 这种小程序的价值不在它本身而在于它把一个完整桌面程序需要的最小闭环用最少的代码走通了创建窗口、绘制、响应输入、定时循环、融入桌面环境、开机自启。你在它身上踩过的每一个坑——依赖缺失、构建体系过时、会话类型不匹配、自启动环境变量丢失——都会在你真正写 GUI 程序的时候原封不动地再遇到一遍。只不过那时候你已经知道了这些问题的答案早在三十年前就被一只追鼠标的小猫写过一遍了。
返回列表