Files
kid aa92d0e676 初始提交:terminalX 可运行态(M0/M1/M1.5 已真机验证)
- M0: libghostty SSH 终端(渲染/输入/连接)+ 白屏修复(OutputGate) + 会话状态机/自动重连
- M1: tsnet 用户态组网 + SSH-over-tsnet(fd 桥),shell 级真机验证;R5(Go+gvisor+C+++Swift 同进程) retire
- M1.5: tmux -CC 原生 tab(MVP)
- 结构: packages/(TXCore·TXTransport), apps/TerminalX, vendor/(libghostty-spm/libssh2/mbedtls/tsnet-bridge), artifacts/
- 文档: CLAUDE.md + docs/HANDOFF.md(新会话入口)
- 环境: 认证代理→依赖 vendor 本地化;Go 在 ~/.local/go;仅模拟器/未签名
- 待续: M2 mosh, tmux 多 pane, M4 安全(host key/SE)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-24 10:20:46 +08:00

1.7 KiB

MSDisplayLink

The missing DisplayLink driver for Apple platforms. Use CADisplayLink on UIKit and CVDisplayLink on AppKit.

Battle tested in ColorfulX

Called MS but it has nothing to do with Microsoft. :P

Preview

Preview

Installation

Swift Package Manager

.package(url: "https://github.com/Lakr233/MSDisplayLink.git", from: "2.0.8")

CocoaPods

Never thought about it.

Usage

UIKit/AppKit

Follow the steps to get called. The DisplayLinkDelegate is friendly to confirm for a UIView or NSView.

  • Hold reference to DisplayLink object.
  • Confirm to DisplayLinkDelegate protocol to get called within synchronization().
  • Call displayLink.delegatingObject with a DisplayLinkDelegate object.

Tech Tips:

  • Call to synchronization() is performed at a background thread.
  • Scheduler is a serial queue unique to each DisplayLinkDriver holds by DisplayLink.
    • Queue inherits the quality of service from the where you created the DisplayLink.
    • Does not make scene to use concurrent queue.
    • Does not share the queue across different DisplayLink objects.
    • Queue names are same.

SwiftUI

import MSDisplayLink
import SwiftUI

struct ContentView: View {
    @State var frame: Int = 0
    var body: some View {
        VStack {
            Text("MSDisplayLink Trigger: \(frame)")
                .monospacedDigit()
                .contentTransition(.numericText())
        }
        .animation(.interactiveSpring, value: frame)
        .modifier(DisplayLinkModifier(scheduleToMainThread: true) {
            frame += 1
        })
        .padding()
    }
}

License

MIT License


2024.08.14