Skip to content

Repository files navigation

MemeDesk 图标

MemeDesk · 桌面表情包播放器

让表情包住进你的 macOS 桌面,24 小时循环播放。

CI

English

GIF / APNG / 静态图 / MP4 / MOV · 多开 · 不占 Dock · 中英双语

MemeDesk 桌面表情包演示

表情包是聊天里的通用货币,但离开聊天框就没了灵魂。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 + 拖动 等比缩放
滚轮 微调大小
右键 大小 / 不透明度 / 速度 / 旋转 / 图层 / 行为 / 镜像 / 穿透 / 锁定 / 复制 / 移除
双击 单独暂停 / 继续这一个实例
拖拽文件到素材库窗口 直接投放桌面
⌘ , 打开设置

菜单栏面板的六个按钮:暂停 / 继续播放、素材库、设置、全部收起 / 全部显示、 清空桌面、退出。

URL Scheme

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 的发布文件, 不带任何标识信息。把「自动检查更新」关掉之后,就只有你手动点按钮时才会发请求。

低占用是怎么做到的

  1. 全局单一帧驱动源:所有实例共用一个 Timer,频率按最快的客户端协商——10fps 的 GIF 只会让时钟跑在 15Hz 左右,没有活跃实例时 Timer 被彻底释放。
  2. 按显示尺寸解码:通过 ImageIO 的 thumbnail 接口直接解出显示大小的位图。800×800 的 GIF 放在 200pt 窗口里只解 400px,内存与耗时约为全尺寸解码的四分之一。
  3. 解码不进主线程:后台串行队列解码并预取接下来 5 帧,未命中就继续显示上一帧,绝不阻塞。缓存按字节数限流,LRU 淘汰。
  4. 见好就收:被完全遮挡、全屏应用在前台、锁屏、使用电池时自动暂停;视频循环前剥离音轨,省下解码器的音频管线。

设计

菜单栏面板、欢迎页、设置、素材库共用同一套设计语言:纯白底(深色模式近黑)、 灰色块按钮、品牌橙只留给主操作。颜色、圆角、字号集中在 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 宏插件而编译失败)

许可证

MIT

About

Keep your favourite memes looping on the macOS desktop — GIF, APNG, MP4 and more, any number at once.

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages