feat: 修复终端换行错乱根因 + 顶带重设计 + 移除移动端分屏
- 换行错乱根因:tmux 客户端格子改以 ghostty 实测为权威(像素除法 偏大 1 行/列 → 远端按更宽排版、本地自动换行掉字符),单 pane 实测 格子直发 refresh-client;kickoff 用 raw surface 真实格子;顶栏 格子数 tmux 模式读 clientGrid(模拟器连本机 sshd 端到端验证) - 顶带落地为真实 chrome 行:✕/⌄ 独立按钮组 + 弱化标题 + TmuxWindowTabGroup window tab 组,pane 不再被悬浮胶囊遮内容 - 放弃移动端分屏:删 SplitMenu/分屏入口,tmux window 切换上移顶部 tab,侧边栏改列活动会话;底部动作条合并状态行 - Info.plist 补 NSLocalNetworkUsageDescription(LAN 直连必需, 缺失时 socket 静默超时) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -150,18 +150,6 @@ enum UIPreviewFixture {
|
||||
]),
|
||||
]
|
||||
|
||||
/// 分屏菜单要列的会话(当前 attached + 两个 detached)。对拍设计稿 `3b`。
|
||||
static func tmuxSessions(current: String) -> [TmuxSessionInfo] {
|
||||
// 相对时刻用 timeIntervalSinceNow 造(脚本里不能用固定日期,会随时间漂移)。
|
||||
[
|
||||
TmuxSessionInfo(name: current, windows: 3, isAttached: true, lastActivity: nil),
|
||||
TmuxSessionInfo(name: "scratch", windows: 1, isAttached: false,
|
||||
lastActivity: Date(timeIntervalSinceNow: -3 * 86400)),
|
||||
TmuxSessionInfo(name: "deploy", windows: 2, isAttached: false,
|
||||
lastActivity: Date(timeIntervalSinceNow: -86400)),
|
||||
]
|
||||
}
|
||||
|
||||
/// 把启动参数拼成一台主机(供 `-txOpenAsHost 1` 走真实的「点主机连接」路径)。
|
||||
static func hostFromLaunchArgs() -> SavedHost? {
|
||||
let d = UserDefaults.standard
|
||||
@@ -186,8 +174,7 @@ enum UIPreviewFixture {
|
||||
/// 为什么不用坐标点击:本环境没有 GUI,idb companion 不可用;而坐标点击还会随布局改动失效。
|
||||
/// 走 URL 直接驱动 `AppRouter`/`SessionManager` 的公开语义,既稳定又正是要验的那条路径。
|
||||
///
|
||||
/// 支持:`home` · `minimize` · `close`(弹确认) · `close-now`(直接关) · `split/v|h`
|
||||
/// · `split-now/v|h`(直接分屏) · `resize/<cols>`(resize-pane)
|
||||
/// 支持:`home` · `minimize` · `close`(弹确认) · `close-now`(直接关) · `resize/<cols>`(resize-pane)
|
||||
/// · `pick/<会话名>` · `pick-new/<名>` · `pick-native`(连接前的会话选择器)
|
||||
/// · `dismiss` · `session/<序号>`(1 起,按首页卡片顺序)· `sidebar/toggle|pin`
|
||||
@MainActor
|
||||
@@ -204,16 +191,8 @@ enum UIPreviewFixture {
|
||||
case "close-now":
|
||||
// 跳过确认直接关(回归脚本用)。
|
||||
if let id = router.route.sessionID { router.goHome(); manager.close(id) }
|
||||
case "split":
|
||||
guard router.route.sessionID != nil else { return false }
|
||||
router.present(.splitMenu(vertical: path.dropFirst().first != "h"))
|
||||
case "dismiss":
|
||||
router.dismissModal()
|
||||
case "split-now":
|
||||
// 跳过菜单直接对当前会话分屏(验证 split-window 链路)。
|
||||
guard let id = router.route.sessionID, let s = manager.session(id),
|
||||
let tmux = s.tmuxController else { return false }
|
||||
tmux.splitWindow(vertical: path.dropFirst().first != "h")
|
||||
case "pick":
|
||||
// 会话选择器:attach 指定会话(`ui/pick/<name>`)。此时通常还在首页,故优先取待选择的会话。
|
||||
guard let s = manager.sessionAwaitingChoice ?? router.route.sessionID.flatMap(manager.session),
|
||||
|
||||
Reference in New Issue
Block a user