作者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