=============================================================================
pfterm - piaip's flat terminal system
also as the "Perfect Term"
API Manual
函式說明手冊
VERSION 1.1
最後更新: 2007/12/24 18:00 piaip
=============================================================================
pfterm 是為了解決 non-ANSI based terminal 處理日漸困難的問題而誕生的。
舊有的系統 (screen.c) 假設輸出的資料全是單純的 ASCII 文字,
所以在處理 DBCS以及 ANSI 碼的時候非常容易誤判或輸出不足的資料。
另外緩衝區字串大小 (ANSILINELEN) 造成的浪費也是個問題。
pfterm 的螢幕處理方式是自為一個虛擬的 DBCS-aware ANSI Terminal,
在更新時才即時產生最佳化的輸出。
=============================================================================
pfterm API 是以 ncurses-like 為基礎。
以 fterm_* 為開頭的 API, 多半是 pfterm 內部使用的函式;
而跟 ncurses 同名或相近的 API 則是一般程式使用的部份。
=============================================================================
//// common ncurse-like library interface
//// ncurse 相容部份
// initialization 初始化
void initscr (void); 初始系統
int resizeterm (int rows, int cols); 調整視窗大小為(rows,col)
int endwin (void); 結束系統
// cursor 游標
void getyx (int *y, int *x); 取得目前游標位置
void move (int y, int x); 移動游標
// clear 清除畫面
void clear (void); 清除螢幕並回到原點(0,0)
void clrtoeol (void); 清至行尾
void clrtobot (void); 清至螢幕底部
// clear (non-ncurses) 清除(非標準,不建議使用)
void clrtoln (int ln); 從目前行往下清至(不包含)ln行:[y,ln)
void clrcurln (void); 清除目前行, 相當於 clrtoln(y+1)
void clrtobeg (void); 清至行首
void clrtohome (void); 清至螢幕原點(0,0)
void clrscr (void); 清除螢幕但不回到原點
void clrregion (int r1, int r2); 清除[r1,r2]或[r2,r1]的範圍 (雙向)
// flushing 更新畫面
void doupdate (void); 更新畫面 (只送出改變的部份)
void refresh (void); 更新畫面 (若有輸入按鍵則不更新)
void redrawwin (void); 強制下次更新全部畫面(仍需 refresh)
// scrolling 捲動
void scroll (void); 向上捲動一行
void rscroll (void); 向下捲動一行
void scrl (int rows); 捲動 rows 行 (正值往上負值往下)
// scrolling (non-ncurses) 捲動(非標準,不建議使用)
void region_scroll_up(int top, int bot); 上捲一行 [top,bot] 的內容
// attributes 顏色與屬性
ftattr attrget (void); 讀取目前屬性
void attrset (ftattr attr); 設定屬性
void attrsetfg (ftattr attr); 設定前景色 (0-7)
void attrsetbg (ftattr attr); 設定背景色 (0-7)
// output (non-ncurses) 輸出 (非 ncurses 風格)
void outc (unsigned char c); 輸出字元 (可含 ANSI 控制碼)
void outs (const char *s); 輸出字串 (可含 ANSI 控制碼)
void outstr (const char *str); 輸出完整字串 (可含ANSI控制碼)
P.S: 差異在於, outstr() 會先計算所需的空間,並把該處正確清除掉,
outstr() 內建 DBCS 的辨識能力,所以不會蓋字只蓋到一半變亂碼。
outc/outs 則是無視舊內容直接覆蓋。
但注意 outstr 目前並不會去考慮 str 本身是否真為完整 DBCS 字串。
// readback 讀取螢幕上的文字
int instr (char *str); 把游標處的字串讀回到 str 處
int innstr (char *str, int n); 把游標處最多 n 個字元讀回 str
int inansistr (char *str, int n); 讀回有 ANSI 控制碼格式的字串。
P.S: 注意 inansistr 通常需要比較長的空間 (建議使用 ANSILINELEN)
結尾會設回標準的屬性 (ESC[m),若空間不足則中間會掉字。
in*str 傳回的是所讀到的字元數。
// restore 回存
void scr_dump (void *psb); 將目前畫面存入 psb
void scr_restore (void *psb); 由 psb 讀出畫面並釋放資源
目前的 psb 接受的是 screen_backup_t*, dump 前不需初始
dump 會為它配置記憶體,restore 則會釋放,
所以一定要成對。
// grayout Grayout 淡入淡出系統
void grayout (int y, int end, int level);
將區間 [y, end] 的內容作淡出或淡入的處理。 level 控制色彩:
GRAYOUT_DARK: 轉為暗色字
GRAYOUT_BOLD: 轉為亮色字
GRAYOUT_NORM: 轉為無色彩的普通字
// deprecated 建議停用部份
void standout (void); 屬性設為反白
void standend (void); 重設屬性
註: pfterm 目前並未真的支援 stand 屬性,所以只是假的反白效果。
move() 至該位置再畫字則屬性會改變。
=============================================================================
//// flat-term internal processor
//// pfterm 內部函式
要將 pfterm 接上某個底層 (網路/BBS/檔案/...) 只要定義好幾個
轉接函式即可快速移植:
int fterm_inbuf (void); // raw input adapter
鍵盤輸入的轉接函式,傳回是否仍有未讀取的輸入。 (最佳化 refresh 用)
void fterm_rawc (int c); // raw output adapter
輸出的基本轉接函式,輸出一個字元到底層系統。
void fterm_rawnewline(void); // raw output adapter
輸出的基本轉接函式,輸出一個換行符號到底層系統。
void fterm_rawflush (void); // raw output adapter
輸出的基本轉接函式,送出所有已輸出的內容到底層系統。
------------------------------------------------------------------------------
下面是呼叫轉接函式的基本命令:
void fterm_raws (const char *s); 輸出字串
void fterm_rawnc (int c, int n); 輸出 n 個重複的字元 c
void fterm_rawnum (int arg); 輸出數字
void fterm_rawcmd (int arg, int defval, char c); 輸出 ANSI 命令
void fterm_rawcmd2 (int arg1, int arg2, int defval, char c);
rawcmd/rawcmd2 會輸出 ESC_CHR '[' arg ';' arg2 c 的命令
若 arg/arg2 與 defval 相等則該參數會忽略不印
void fterm_rawattr (ftattr attr); 改變底層輸出屬性與色彩
void fterm_rawclear (void); 輸出清除全部畫面(不移動)的命令
void fterm_rawclreol (void); 輸出清至行尾的命令
void fterm_rawhome (void); 輸出移至原點(0,0)的命令
void fterm_rawscroll (int dy); 捲動螢幕 dy 行,正往上負往下
void fterm_rawcursor (void); 更新底層游標的位置與屬性
void fterm_rawmove (int y, int x); 移動底層游標到指定的位置
void fterm_rawmove_opt(int y, int x); 最佳化移動游標
void fterm_rawmove_rel(int dy, int dx); 移動底層游標到指定的相對位置
int fterm_chattr (char *s, 將屬性從 oattr 轉為 nattr 所需的
ftattr oattr, ftattr nattr); ANSI 控制碼輸出至 s 處。
注意s要夠長(起碼要 FTATTR_MINCMD=16
字元), 考慮相容性建議 32 以上。
下面是內部函式,不建議直接使用:
void fterm_markdirty (void); 標記目前畫面需要更新
void fterm_exec (void); (內部用)執行已收集到的 ANSI 命令
void fterm_flippage (void); (內部用)切頁 (pfterm 為 dual buffer)
void fterm_dupe2bk (void); (內部用)同步背景頁
int fterm_prepare_str(int len); (內部用)安全清除長度為 len 的空間
=============================================================================
// vim:expandtab:sw=4:ts=4