作者hialan (You are dead.)
看板PttCurrent
标题[问题] screen.c
时间Sat Mar 5 23:10:51 2005
我在 trace screen.c 的时候我觉得有些地方怪怪的..
我把相关的部分列出来
t_columns: 目前 Client Term 的大小
scr_cols : == ANSILINELEN (511) 也就是说,每一行最多有几个字元
cur_col : 目前游标所在的第几的字元
tc_col : 上一次由标所在的地方
rel_move(): 根据上一次游标所在的位置以及即将移动的位置
输出相对应的控制码 (他只会输出 \r 或是 \n)
首先是为什麽 rel_move 里面一开始
if (new_ln >= t_lines || new_col >= t_columns)
return;
是用 t_lines, t_columns 而不是用 scr_lns, scr_cols
照理说在很多地方都有将 cur_col 当作引数
而 cur_col 的范围是在 0~511, t_columns 一般是 80
如果碰到 ASCII 图片很容易就爆掉直接 return
用到 tc_col 的只有四个函式 rel_move() redoscr() refresh() redoln()
不过 redoscr() 和 refresh() 中会计算 tc_col
tc_col += len;
if (tc_col >= t_columns) {
/* XXX Is this code right? */
if (automargins)
tc_col = t_columns - 1;
else {
tc_col -= t_columns;
tc_line++;
if (tc_line >= t_lines)
tc_line = b_lines;
}
}
假设我们在编辑 ASCII 图片,tc_col 原本就超过 t_columns ,
而 len 是这次输出的长度, automargins 值为 1
所以 tc_col 得出的是一个怪怪的值, t_columns - 1
照理说应该是 scr_cols - 1
所以我觉得这些地方的 t_columns 应该改成 scr_cols
不过为什麽目前 Ptt 画面没有东跳跳西跳跳,还运作的很好
这也是我觉得很奇怪的原因:p
---
我会来看这部分的 code 的原因很奇怪
是因为我自己的 code 在宣告 t_columns 是设定 80
然後经过一个初使化的函式把 t_columns 改成 ANSILINELEN
我把他改回 80 然後画面开始爆走 XD
把这些地方改成 scr_cols 就好了:p
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.32.80.33