lil-agents 多屏适配实战:Dock 自动隐藏时角色为何不消失?DockVisibility 深度解析
【免费下载链接】lil-agentstiny AI companions that live on your macOS dock项目地址https://gitcode.com/gh_mirrors/li/lil-agents点击查看免费下载lil-agents 是一款小巧的 macOS 应用让 Bruce 和 Jazz 两个可爱的 AI 伴侣角色住在你的 Dock 上方来回散步点击它们即可打开 Claude Code、OpenAI Codex 等 AI 终端聊天。角色站在 Dock 上就必须时刻感知屏幕环境全屏应用、多显示器、Dock 自动隐藏……每一种场景下角色该出现还是该隐藏这篇文章带你完整读懂 LilAgents/DockVisibility.swift 的判断逻辑以及它是如何做到Dock 自动隐藏时角色依然优雅显示、全屏时自动退场的。问题起点角色站在 Dock 上环境却在不停变化lil-agents 的角色本质是悬浮在 Dock 区域上方的透明动画窗口。这个位置带来一个天然的难题角色的可见区域完全取决于操作系统留给 Dock 的空间。在 macOS 里屏幕有两种关键矩形矩形含义frame整块屏幕的完整物理区域visibleFrame扣除 Dock、菜单栏等系统占用后的可用区域由此可以推出三种典型场景Dock 固定在底部/左右visibleFrame会在对应一侧缩进角色照常站在 Dock 上方全屏应用visibleFrame与frame完全重合Dock 和菜单栏都不可见角色没有立足之地Dock 自动隐藏Auto Hide平时visibleFrame底部不缩进但用户把鼠标滑到底部时 Dock 会浮现——角色此时反而应该显示。第三种场景正是标题里的问题Dock 自动隐藏时角色为什么不该消失核心规则DockVisibility 用两个矩形做出判断全部判断逻辑集中在 LilAgents/DockVisibility.swift一共只有两个静态函数非常精炼。规则一Dock 是否正在占用屏幕空间screenHasVisibleDockReservedArea通过对比两个矩形判断 Dock 是否在底部或左右两侧预留了区域static func screenHasVisibleDockReservedArea( screenFrame: CGRect, visibleFrame: CGRect ) - Bool { visibleFrame.minX screenFrame.minX || visibleFrame.minY screenFrame.minY || visibleFrame.maxX screenFrame.maxX }三个条件分别对应Dock 在左侧、Dock 在底部、Dock 在右侧。只要有一处缩进就说明 Dock 可见角色应当显示。规则二Dock 不可见时还要看三个条件当规则一不成立Dock 没有占用空间时进入shouldShowCharacters的兜底判断let menuBarVisible visibleFrame.maxY screenFrame.maxY return dockAutohideEnabled isMainScreen menuBarVisible也就是说Dock 虽被隐藏但同时满足以下三点角色仍然显示用户开启了 Dock 自动隐藏dockAutohideEnabled当前是主屏幕isMainScreen菜单栏可见visibleFrame.maxY screenFrame.maxY——这条同时排除了全屏应用场景。 为什么这样设计自动隐藏时用户随时可能唤起 Dock角色提前站岗在 Dock 原本的位置等 Dock 滑出时角色恰好在其上方体验无缝衔接而全屏时菜单栏也不可见三个条件不成立角色自然退场。Dock 自动隐藏时角色为何不消失三个关键细节判断公式只是骨架真正的工程价值在 LilAgents/LilAgentsController.swift 的配套细节里。细节一直接读取系统偏好判断自动隐藏开关dockAutohideEnabled()LilAgentsController.swift#L136-L139从com.apple.dock这个系统偏好套件中读取autohide键值private func dockAutohideEnabled() - Bool { let dockDefaults UserDefaults(suiteName: com.apple.dock) return dockDefaults?.bool(forKey: autohide) ?? false }这保证判断结果与系统设置 → 桌面与程序坞 → 自动隐藏与显示程序坞完全一致用户在系统里切换开关后角色行为立刻跟随。细节二小心NSScreen.main这个陷阱多屏用户常遇到一个诡异 Bug点击副屏上的窗口主屏上的角色突然消失。原因藏在这段注释里LilAgentsController.swift#L164-L167// Prefer the screen that currently shows the dock (bottom inset in visibleFrame). // NSScreen.main changes with keyboard focus and must NOT be used here — clicking a // secondary display switches NSScreen.main to that display, causing characters on // the dock screen to be incorrectly hidden.activeScreen的选屏策略是**谁在显示 Dock 就用谁**而不是跟随键盘焦点用户通过菜单栏手动指定了屏幕pinnedScreenIndex→ 锁定该屏幕永远显示角色否则找第一块visibleFrame有 Dock 缩进的屏幕Dock 自动隐藏导致没人占坑时退而求其次——找菜单栏在顶部留了空间的屏幕作为主屏。这套优先级让角色在多显示器、外接显示器、焦点切换时都稳定站在正确的位置。细节三隐藏时记账回来时不穿帮进入全屏时角色被hideForEnvironment()隐藏WalkerCharacter.swift#L191-L202。如果只是一次简单隐藏角色恢复后会出现瞬移——散步进度、思考气泡时间全乱了。showForEnvironmentIfNeeded()WalkerCharacter.swift#L204-L229的处理很巧妙把隐藏掉的时长补偿回所有动画计时器let hiddenDuration CACurrentMediaTime() - hiddenAt walkStartTime hiddenDuration pauseEndTime hiddenDuration completionBubbleExpiry hiddenDuration lastPhraseUpdate hiddenDuration隐藏前角色在散步退出全屏回来后它恰好从应该走到的位置继续走对话气泡的时间戳也不会错乱。对用户来说就像角色去趟洗手间又自然地走回来一样。用单元测试把每种屏幕场景钉死这套可见性逻辑配了一份完整的测试Tests/DockVisibilityTests.swift。它用一个 1440×900 的虚拟屏幕覆盖了 6 种组合场景场景期望行为Dock 固定在底部✅ 显示角色Dock 固定在左侧✅ 显示角色Dock 固定在右侧✅ 显示角色全屏Dock 与菜单栏均不可见❌ 隐藏角色自动隐藏开启 主屏 菜单栏可见✅ 显示角色自动隐藏开启 副屏❌ 保持隐藏测试通过Tests/main.swift直接驱动运行任何一个分支被改坏都会立刻在 CI 中暴露——这正是纯几何 纯布尔设计的好处核心逻辑与 UI 彻底解耦可以脱离屏幕直接验证。小结从 DockVisibility 学到的多屏适配思路lil-agents 处理 Dock 自动隐藏与多屏问题的思路对任何需要在特定屏幕区域安家的 macOS 应用都有参考价值能用系统事实就不用猜测Dock 缩进量、autohide开关都是操作系统给出的确定信号直接消费即可把核心判断抽成纯函数DockVisibility不依赖任何 UI只比较两个矩形因此可测试、可复用警惕隐式APINSScreen.main跟随键盘焦点的语义在多屏下是隐蔽的 Bug 源显式按显示 Dock 的屏幕选择更可靠隐藏不等于消失把隐藏时长补偿回动画状态角色回归时体验才连贯。想继续深入可以看看角色窗口与动画的实现 LilAgents/WalkerCharacter.swift、整体调度与 Dock 几何计算 LilAgents/LilAgentsController.swift以及项目说明 CLAUDE.md。lil-agents 遵循 MIT 协议源码结构清晰非常适合作为 macOS 多屏适配的学习样本。赞分享【免费下载链接】lil-agentstiny AI companions that live on your macOS dock项目地址https://gitcode.com/gh_mirrors/li/lil-agents点击查看免费下载相关推荐lil-agents 代码原理如何精准计算 Dock 几何并让角色无缝行走lil agents 代码原理如何精准计算 Dock 几何并让角色无缝行走 lil agents 是一款运行在 macOS Dock 上方的微型 AI 陪伴应智能隐藏功能深度解析Dash to Dock如何自动躲避窗口Dash to Dock是GNOME桌面环境中最受欢迎的扩展之一它的智能隐藏Intellihide功能让dock栏能够自动躲避窗口为用户提供更加流畅的桌桌面应用如何在Steam Deck上玩安卓游戏SteamOS-Waydroid-Installer 一键装好安卓系统如何在Steam Deck上玩安卓游戏SteamOS Waydroid Installer 一键装好安卓系统 Steam Deck 想玩安卓游戏怎么办Ste创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Amical听写历史与智能笔记完整指南:如何搜索、内联编辑并复用你的语音内容

Amical听写历史与智能笔记完整指南:如何搜索、内联编辑并复用你的语音内容

【免费下载链接】amical 🎙️ AI Dictation App - Open Source and Local-first ⚡ Type 3x faster, no keyboard needed. 🆓 Powered by open source models, works offline, fast and accurate. 项目地址: https://gitcode.com/gh_mirrors/…

2026/10/11 19:51:46 阅读更多 →
GitHub趋势周报:从Star数到构建链路的开发者情报作战图

GitHub趋势周报:从Star数到构建链路的开发者情报作战图

1. 这份周报不是“新闻简报”,而是一份开发者情报作战图 你点开GitHub Trending页面,刷到第40周的榜单——Top 25里有3个Rust项目、2个TypeScript驱动的CLI工具、1个用Zig重写的POSIX工具链,还有个叫 llm-local-runner 的本地大模型调度器…

2026/10/11 19:50:45 阅读更多 →
新手PPT制作实战:素材库、AI辅助与插件全流程提效指南

新手PPT制作实战:素材库、AI辅助与插件全流程提效指南

每次看到有人电脑里躺着好几个G的PPT素材包,桌面上装满了五花八门的演示工具,我就知道这位大概率还没走出新手村。工具没少下载,做出来的片子依旧一言难尽——不是排版密密麻麻,就是配色刺眼到不敢直视,动画倒是加了不…

2026/10/11 19:50:45 阅读更多 →

最新新闻

YashanDB单机部署实操:从环境准备到实例启动的完整指南

YashanDB单机部署实操:从环境准备到实例启动的完整指南

数据库这玩意儿,平时看着没啥存在感,可真到要部署的时候,环境、依赖、权限、端口、内核参数,哪一个拎出来都能把人折腾得没脾气。最近一段时间,因为项目选型,我在几台机器上反复部署过YashanDB——一款国产…

2026/10/11 20:34:21 阅读更多 →
基于卷积神经网络的农作物病虫害识别系统实战:从数据集到部署

基于卷积神经网络的农作物病虫害识别系统实战:从数据集到部署

简介:这份资源是面向计算机相关专业毕业设计与项目实战学习者的农作物病虫害识别检测系统,基于深度学习卷积神经网络实现,涵盖从模型训练到Web端部署的完整链路。项目经导师指导并通过评审,源码均经本地编译调试可运行&#xff0c…

2026/10/11 20:34:21 阅读更多 →
基于动态分时电价的电动汽车有序充放电实时优化调度系统详解

基于动态分时电价的电动汽车有序充放电实时优化调度系统详解

做电动汽车充放电调度这个方向,算起来也有不短时间了。从最早单纯追求“充得便宜”,到后来加上V2G反向放电,再到把动态分时电价引入优化过程,每一步都踩过不少坑。今天趁项目收尾,把这套基于动态分时电价的电动汽车有序…

2026/10/11 20:34:21 阅读更多 →
从Excel到ERP:小微商家数字化转型的真实痛点与破局路径(附ROI测算)

从Excel到ERP:小微商家数字化转型的真实痛点与破局路径(附ROI测算)

写在前面网上管家婆成立于1993年,30余年服务超过80万中小客户。在对373家电商客户的调研中,52%的客户属于"初创型"——在引入系统之前只用过打单软件甚至纯靠Excel管理。以下内容从这些客户的真实痛点出发,分析从表格到ERP的转型难…

2026/10/11 20:34:21 阅读更多 →
MySQL中trx_mysql_thread_id为0的真相:XA事务与锁等待排查指南

MySQL中trx_mysql_thread_id为0的真相:XA事务与锁等待排查指南

1. 从一次诡异的锁等待说起 先讲个真实场景。某天中午,线上业务突然出现大量锁等待超时,监控面板上一片红色。当时我第一时间看了 information_schema.innodb_trx ,发现有一条事务状态为 RUNNING ,已经跑了快二十分钟&#xf…

2026/10/11 20:34:21 阅读更多 →
医院六大医疗信息系统集成实战:HIS、LIS、PACS、EMR、RIS、CDR数据流与接口详解

医院六大医疗信息系统集成实战:HIS、LIS、PACS、EMR、RIS、CDR数据流与接口详解

简介:本资源是一份面向医院信息科人员、医疗IT从业者及卫生信息管理专业学习者的系统性入门资料,全面梳理当前主流医疗信息化系统的核心定位、功能模块与协同关系,助力快速建立行业知识框架并支撑系统选型、实施或运维工作。文档为单文件Word…

2026/10/11 20:33:20 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →