@
LonnyWong 哈哈哈,实际上我基于 item2 实现过一个简单的版本,但是感觉不是很满意,主要是因为 item2 只能在 mac 上用,我也没有精力实现多个。我想实现一个从任何地方都能用的版本。主要是实现 frame 一层,不过这一层实际上如果被偶尔翻转(不是 ssh 这种 tcp 的,比如 rlogin 到喘口)就不靠谱了,这个其实好解决,我正好用 lwip 的 checksum 解决。另外还有一就是被高级重担吞的情况,因为 tmux 等实现了一个完整的终端模拟器,知道哪些地方屏幕刷新了多次没用就扔了,所以为了过 tmux (其实主要是为了对付一众基于 tmux 或者类似软件跳板机),我实际上实现了两层,有一个解析终端转移码的状态机,只提取绿色字体和绿色背景的内容。这样的话就知道有价值的信息,避免 tmux 本身的 bar 输出干扰。然后一定要实现的是慢启动,因为实际上我们不知道中间节点到底存不存在 tmux (有可能不存在丢包),因为要用最小流量试探,慢慢试探到可行的流量大小来。如果直接无脑写很多数据,到达对端的概率可能不足 0.1%。lwip 是支持慢启动的。实际上如果只用 lwip ,应该也行。不过我的状态机也不太可能是负优化就是了。
如果你的 tmux 可以被替换,事实上可以使用这个代码解决 tmux 会扔内容的问题。不过我的场景不能如此假设,就是了。
```index c9c61086..b3333020 100644
--- a/screen-write.c
+++ b/screen-write.c
@@ -1645,7 +1645,7 @@ screen_write_collect_add(struct screen_write_ctx *ctx,
* a plain character is encountered.
*/
- collect = 1;
+ collect = 0;
if (gc->data.width != 1 || gc->data.size != 1 || *gc->data.data >= 0x7f)
collect = 0;
else if (gc->attr & GRID_ATTR_CHARSET)
@@ -1819,7 +1819,7 @@ screen_write_cell(struct screen_write_ctx *ctx, const struct grid_cell *gc)
}
/* Write to the screen. */
- if (!skip) {
+ if (1 || !skip) {
if (selected) {
screen_select_cell(s, &tmp_gc, gc);
ttyctx.cell = &tmp_gc;
diff --git a/tty.c b/tty.c
index bcbccca6..10bd56da 100644
--- a/tty.c
+++ b/tty.c
@@ -196,6 +196,7 @@ tty_timer_callback(__unused int fd, __unused short events, void *data)
static int
tty_block_maybe(struct tty *tty)
{
+ return 0;
struct client *c = tty->client;
size_t size = EVBUFFER_LENGTH(tty->out);
struct timeval tv = { .tv_usec = TTY_BLOCK_INTERVAL };
```