Linux无障碍环境搭建:6年测评师实战指南
|
文章配图,仅供参考 去年一月份,我们那个无障碍环境搭建的改版上线翻车了——不是功能崩,是键盘焦点在 NVDA 里绕着 GTK3 对话框打转,像磁铁吸住回形针那样原地抖。PM 站我工位边啃三明治,油星子甩到我双屏壁纸上:左边是 Debian 官网截图打了马赛克的登录框,右边是我自己截的 Orca 日志,灰底绿字,字体设成了 16px DejaVu Sans,因为上周发现缩放 125% 时 GTK 的 fontconfig fallback 会漏掉 monospace fallback 链最后一环。我抬手按 F5,抬手、按键、松手——松手那一下食指指甲盖蹭到了空格键边缘,卡了一下,没弹起来,得用拇指从底下顶。同事老张端着保温杯路过,杯盖拧太紧,他哼了半声“啧”,倒水时手腕一抖,水线歪了,泼进键盘右下角 USB-C 集线器散热孔里。汤洒了——就一滴,落在我刚拆封的 Logitech MX Keys 机械轴测试样机左上角,顺着 ESC 键帽斜坡滑到底边,停在 Caps Lock 和 Tab 之间那道缝里。我原以为是 at-spi2-core 版本兼容问题,结果扒日志扒到凌晨两点,发现是 gnome-settings-daemon 里那个 accessibility-keyboard-toggle 插件,在启用 Screen Reader 时硬塞了个 idle-add(带 300ms 延迟),而 NVDA 启动后立即发了两次 atspi_get_desktop_count ——第二次被 idle-add 的队列吃了,没触发 callback,导致后续所有事件监听器全悬在那儿喘气。这个我敢打包票。但到底该 patch 插件还是等上游 merge 那个未合入的 PR#1473?我说不准。PR review 是后端小刘提的,他昨天在 Slack 里回我:“你确定不是 dbus-glib 的消息队列满载后静默丢包?” 我没回。因为他根本没看 commit diff 里那一行 g_main_context_invoke_full,他只看了标题。 优胜劣汰。就这四个字,别加解释。不是赞美,是描述现象——比如 Orca 切换到 Firefox 时能正常朗读 SVG ``,但 Chrome DevTools 切到 Accessibility tab 之后,再切回来,焦点树就塌一半。我亲眼见过三个团队在半年内把 AT-SPI 客户端从自己写的 C++ 绑定,换成了 Python + atspi2,又换成 Rust + zbus + atspi-dbus,就为躲 libatspi 里那个 2017 年留下的 refcount race condition;结果第四个团队直接删了所有客户端代码,让 WebApp 自己挂 ARIA live region,用 fetch 轮询状态。淘汰的不是技术,是耐心。我试过把 LibreOffice 的 accessibility 模块单独编译成静态库链接进 Electron 应用——它起不来。不是 crash,是 init 函数里 malloc 了一块 8KB 的共享内存段,然后卡在 shm_open 的 O_EXCL 标志上,死锁在 /dev/shm/lo_accessibility_XXXX。我试了十七次。第十八次改了 umask,起了。但第三天用户反馈说盲文点显器同步延迟 1.3 秒,定位到是 systemd --user 的 cgroup cpu.weight 被桌面环境默认设成 10,而 at-spi-bus-launcher 进程跑在同一个 scope 下,调度优先级被压穿了。没人提这事儿。文档里写的是 “works out of the box”。盒子里全是灰。 CSS 命名这事真让人来气。上周 PR 被 QA 打回来,说 focus-visible 不触发,查半天发现是 team-internal 的 tailwind preset 里覆盖了 :focus-ring,而那个 ring-offset-shadow 默认 opacity 是 .92,NVDA 在高对比度模式下会强制重绘为 solid black,结果阴影层叠顺序错乱,焦点框被盖住了。我改完 push,老张端着空保温杯又路过,这次他停了一下,指着我屏幕上 VS Code 右下角状态栏说:“你 git branch 名怎么叫 feat/a11y-ff-fix-2023Q4?” 我说:“因为上个季度叫 feat/a11y-ff-fix-2023Q3。” 他点点头走了。我其实忘了上个季度 fix 的到底是 Firefox 还是 Flatpak 沙箱里的 D-Bus 代理路径。这个我说不准。 还有件事:上周工资条到账,税后比上月少四百三十七元。HR 邮件说“年度个税清算补扣”,我点开个税 APP,专项附加扣除里突然多出一条“继续教育”,显示“Linux 内核源码阅读计划(线上)”,有效期从 2022 年 10 月开始。我没报过这个课。但退税流程走了一半,我就放弃了申诉——反正退税退回来也是补扣回去。就像我们搭那个无障碍环境,最后上线的那个版本,其实是把所有 AT 工具的初始化延迟调到了 500ms 以上,用 setTimeout 把它们全拖进宏任务队列末端,避开 render-blocking。逻辑丑,但 NVDA+Firefox+Wayland 跑得稳。谁还管 init 时序是否符合 AT-SPI2 spec 第 4.3.2 节?spec 是活的,人不是。我键盘上那个卡住的空格键,现在得用指甲盖往下按才能弹回,松手瞬间有轻微“嗒”声,像老式继电器断开。我今天没修。反正它响的时候,我知道焦点还在哪儿。 下一步?下周约 Orca 维护者喝咖啡,带我的 MX Keys 样机和那滴干了的汤渍照片。不聊架构,聊他家用啥显示器校准仪——听说最近 GNOME 的 color-management 配置文件加载时会跳过 ~/.local/share/icc/ 目录下的软链。这个我还没试。但我想试试。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


Linux新手避坑指南:零基础安装与环境配置一站式搞定
Linux深度学习环境搭建:12年电商运维排障实录
Linux安全环境搭建:从前端CSS师视角看系统防护艺术
Linux数据库环境搭建七步实操指南
Linux运维老手也常踩的5个Unix环境搭建坑
嵌入式Linux开发者Unix环境搭建避坑指南
Linux下H5开发环境与数据库一键配置