表情包是聊天里的通用货币,但离开聊天框就没了灵魂。MemeDesk 把它们放回你盯得最久的地方—— 桌面壁纸之上:想放几个放几个,每个都能拖动、缩放、旋转、弹跳、追随鼠标, 看视频时自动安静,锁屏时自动休息。
- 多开:同时摆任意多个,各自独立配置,重启后原样恢复(Security-Scoped Bookmark)。
- 格式全:GIF / APNG / PNG / JPG / HEIC / WebP / MP4 / MOV / M4V, 扩展名、UTType、文件魔数三重判定,视频自动去音轨循环。
- 三种图层:沉在图标下、贴伏在桌面上(默认)、悬浮于一切之上。
- 六种行为:静止、呼吸浮动、屏幕弹跳、重力吊床、追随鼠标、随机游荡。
- 单实例控制:大小、不透明度、播放速度、旋转、镜像、鼠标穿透、锁定,右键即达。
- 低占用:大图先降采样再解码(阈值可调),被遮挡 / 全屏 / 锁屏 / 用电池时自动暂停。
- 只驻菜单栏:
LSUIElement应用,Dock 和 App 切换器里都看不到。 - 自动更新:内置更新器直接读 GitHub Releases,能自动检查 / 自动安装,也能手动点。 安装是原地替换 App 本体,桌面布局和素材不受影响。
- 中英双语:默认跟随系统,可在设置里手动切换。
memedesk://URL Scheme:配合快捷键、Raycast、Alfred 一句话控制。- 内置 6 个示例素材:打开素材库即可一键投放。
从 Releases 下载最新的 MemeDesk-x.y.z.dmg,拖进 Applications,打开即可。
产物为 ad-hoc 签名。首次启动若被 Gatekeeper 拦下,右键 App 选择「打开」。
想自己构建(需要完整 Xcode,只有 Command Line Tools 编译不了 SwiftUI):
xcode-select --install # 已安装可跳过
./Scripts/build.sh # → dist/MemeDesk.app
open dist/MemeDesk.app需要磁盘镜像再执行 ./Scripts/make_dmg.sh;用完整 Xcode 工程调试:
brew install xcodegen
xcodegen -s Xcode/project.yml # 生成 MemeDesk.xcodeproj
open MemeDesk.xcodeproj| 操作 | 效果 |
|---|---|
| 点击菜单栏图标 | 控制面板:添加、素材库、设置、批量收起 / 暂停 |
| 拖动表情包 | 移动(带边缘吸附,不会拖出屏幕找不回来) |
Option + 拖动 |
等比缩放 |
| 滚轮 | 微调大小 |
| 右键 | 大小 / 不透明度 / 速度 / 旋转 / 图层 / 行为 / 镜像 / 穿透 / 锁定 / 复制 / 移除 |
| 双击 | 单独暂停 / 继续这一个实例 |
| 拖拽文件到素材库窗口 | 直接投放桌面 |
⌘ , |
打开设置 |
菜单栏面板的六个按钮:暂停 / 继续播放、素材库、设置、全部收起 / 全部显示、 清空桌面、退出。
open "memedesk://add?file=/Users/me/cat.gif" # 投放指定文件
open "memedesk://hide" # 全部收起
open "memedesk://show" # 全部显示
open "memedesk://pause" # 全局暂停
open "memedesk://resume" # 全局继续
open "memedesk://clear" # 清空桌面- 沉在图标下:夹在壁纸与 Finder 图标之间,最接近原生观感;但 macOS 会吞掉低于普通窗口层级的鼠标事件,该模式下交互不可用。
- 贴伏在桌面上(默认):压住桌面图标,被任何 App 窗口盖住。
- 悬浮于一切之上:连全屏视频也盖得住。
设置 → 更新:
- 自动检查更新(默认开):启动后查一次,之后每天一次。
- 发现新版本后自动下载并安装(默认关 —— 它会重启 App,这件事交给你决定)。
- 检查更新 按钮:随时手动查一次。
- 菜单栏面板的「设置」按钮上会出现一个橙色小点,表示有新版可用。
更新包先校验再安装:SHA-256 一定查;在 Info.plist 里配上 Ed25519 公钥之后还会验签,
而且缺签名文件直接拒绝,不会悄悄降级成只查哈希。
安装时 App 会在原地被替换,~/Library/Application Support/MemeDesk/ 里的桌面布局、素材路径和
设置都在 App 包之外,所以不受影响。装完自动重启,桌面原样恢复。
关于联网:检查更新是全项目唯一会联网的地方,只访问 api.github.com 和 GitHub 的发布文件,
不带任何标识信息。把「自动检查更新」关掉之后,就只有你手动点按钮时才会发请求。
- 全局单一帧驱动源:所有实例共用一个 Timer,频率按最快的客户端协商——10fps 的 GIF 只会让时钟跑在 15Hz 左右,没有活跃实例时 Timer 被彻底释放。
- 按显示尺寸解码:通过 ImageIO 的 thumbnail 接口直接解出显示大小的位图。800×800 的 GIF 放在 200pt 窗口里只解 400px,内存与耗时约为全尺寸解码的四分之一。
- 解码不进主线程:后台串行队列解码并预取接下来 5 帧,未命中就继续显示上一帧,绝不阻塞。缓存按字节数限流,LRU 淘汰。
- 见好就收:被完全遮挡、全屏应用在前台、锁屏、使用电池时自动暂停;视频循环前剥离音轨,省下解码器的音频管线。
菜单栏面板、欢迎页、设置、素材库共用同一套设计语言:纯白底(深色模式近黑)、
灰色块按钮、品牌橙只留给主操作。颜色、圆角、字号集中在 Sources/MemeDesk/UI/Design.swift,
App 图标由 Scripts/make_icon.py 从同一个 1024px 母版生成 .icns 与 .png——
Finder、Dock 和欢迎页看到的永远是同一张脸。
菜单栏按钮是例外,而且是刻意的。 那里不放 App 图标(一个橙色圆角方块,既比系统图标"重"、 又比它们小一圈),而是模板图:颜色交给系统决定 —— 浅色菜单栏是黑的,深色是白的。 在设置里随时切换,改完立刻生效。图案分两组:
- 笑脸(矢量绘制,
Sources/MemeDesk/UI/MenuBarIcon.swift)——实心圆脸、五官挖空, 8 个表情:微笑 / 大笑 / 眨眼 / 惊讶 / 墨镜 / 爱心 / 难过 / 生气。 - 基米(从照片色调映射,
Sources/MemeDesk/UI/MenuBarIconBitmaps.swift)——四级 alpha, 照片里亮处(脸)实心、暗处(五官)透明,2 个:咧嘴笑 / 挠头。数据以 2bit/像素打包 内嵌在源码里,App 里不需要额外的图片资源;生成脚本是Scripts/make_menubar_icons.py。
- macOS 13 Ventura 及以上
- 发布包只含 arm64(Apple 芯片)。0.1.7 短暂发过双架构,但下载体积要翻倍 (zip 0.76 MB → 1.34 MB),从 0.1.8 起改回只发 arm64 —— Intel Mac 请从源码构建, 构建步骤见下,源码是跨架构的
- 源码构建需要完整 Xcode(仅 Command Line Tools 会因缺少 SwiftUI 宏插件而编译失败)
