f21fa5b5e8
Commilitia Drop:自托管的跨设备剪贴板同步与点对点文件传输。 - 后端 Go(chi / SQLite WAL / SSE Hub / WebRTC signaling + 状态机 / Relay ring buffer),编译进单个 distroless 镜像(前端 go:embed)。 - 前端 React + TanStack Router + Zustand,自实现 SSE + WebRTC P2P,NAT 受阻时回退服务端中继;聚珍(Juzhen)CJK 综合排版。 - 桌面端 Wails v2(macOS / Windows),瘦客户端复用 web。 - 鉴权 OIDC PKCE(自建 Casdoor 等),refresh_token 信封加密存系统密钥库;iOS Shortcut 用 HS256 scoped token。 架构文档与变更记录见 docs 分支(PROJECT_BRIEF / FRONTEND_DESIGN / CHANGELOG)。 本次为公开发布初始提交:完整开发历史(含部署细节)留存于私有归档,公开仓库自此干净起步。
43 lines
1.7 KiB
Objective-C
43 lines
1.7 KiB
Objective-C
#import <Cocoa/Cocoa.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
// cdropPasteboardChangeCount returns the general pasteboard's monotonic change
|
|
// counter. Polling it is the cheap way to detect a copy without a callback API.
|
|
long cdropPasteboardChangeCount(void) {
|
|
return (long)[[NSPasteboard generalPasteboard] changeCount];
|
|
}
|
|
|
|
// cdropPasteboardReadText returns a malloc'd UTF-8 copy of the pasteboard's
|
|
// plain-text payload (caller frees), or NULL when there is no text (image /
|
|
// file only). It sets *sensitive to 1 when a privacy marker type is present —
|
|
// org.nspasteboard.{Concealed,Transient,AutoGenerated}Type — so the upload
|
|
// policy can skip it. (Most password managers set no marker; this is a
|
|
// best-effort secondary guard behind the server's short TTL.)
|
|
char *cdropPasteboardReadText(int *sensitive) {
|
|
NSPasteboard *pb = [NSPasteboard generalPasteboard];
|
|
*sensitive = 0;
|
|
for (NSString *type in pb.types) {
|
|
if ([type isEqualToString:@"org.nspasteboard.ConcealedType"] ||
|
|
[type isEqualToString:@"org.nspasteboard.TransientType"] ||
|
|
[type isEqualToString:@"org.nspasteboard.AutoGeneratedType"]) {
|
|
*sensitive = 1;
|
|
break;
|
|
}
|
|
}
|
|
NSString *s = [pb stringForType:NSPasteboardTypeString];
|
|
if (s == nil) { return NULL; }
|
|
const char *utf8 = [s UTF8String];
|
|
if (utf8 == NULL) { return NULL; }
|
|
return strdup(utf8);
|
|
}
|
|
|
|
// cdropPasteboardWriteText replaces the pasteboard's contents with plain text.
|
|
void cdropPasteboardWriteText(const char *text) {
|
|
NSString *s = [NSString stringWithUTF8String:text];
|
|
if (s == nil) { return; }
|
|
NSPasteboard *pb = [NSPasteboard generalPasteboard];
|
|
[pb clearContents];
|
|
[pb setString:s forType:NSPasteboardTypeString];
|
|
}
|