作者itoc (Internet Explorer), 信區: plan
標題[功能] 支援超過 24 列的畫面
時間Thu Mar 27 23:11:04 2003 Updated: 2005/01/10
: include/global.h
VAR int b_lines; /* bottom line */
+ VAR int screen_resized; /* 1: b_lines/b_cols change */
: bbsd.c:tn_login()
bbstate = STAT_STARTED; /* 進入系統以後才可以回水球 */
+ screen_resized = 0;
: visio.c:iac_count()
if ((*look) == TELOPT_NAWS)
{
b_lines = ntohs(* (short *) (look + 3)) - 1;
b_cols = ntohs(* (short *) (look + 1)) - 1;
if (b_lines >= T_LINES)
b_lines = T_LINES - 1;
else if (b_lines < 23)
b_lines = 23;
if (b_cols >= T_COLS)
b_cols = T_COLS - 1;
else if (b_cols < 79)
b_cols = 79;
d_cols = b_cols - 79;
+ screen_resized = 1;
}
: visio.c:igetch()
vi_head = (*data) == IAC ? iac_count(data) : 0;
+ if (screen_resized)
+ return Ctrl('L'); /* 剛好被 igetch() 拿來當作全域 redraw */
: visio.c:vget()
for (;;)
{
move(x, y + col);
ch = vkey();
+ /* Kyo: 未加上 screen_resized 判斷的話
+ 會導致一些一開始就會送 TELOPT_NAWS 的 telnet 軟體, 無法輸入任何字元
+ 這只適用於即時螢幕更新, 其他不會被影響 */
+ if (screen_resized)
+ {
+ screen_resized = 0;
+ continue;
+ }
: xover.c:xover()
cmd = vkey();
+ if (screen_resized) /* 若變動了螢幕大小,要重新載入 */
+ {
+ screen_resized = 0;
+ xo->top = pos / XO_TALL * XO_TALL;
+ cmd = XO_INIT;
+ }
: menu.c:menu()
switch (cmd)
{
+ case Ctrl('L'):
+ refresh();
+ break;
case KEY_DOWN:
if (++cc <= max)
break;
...
...
cmd = vkey();
+ if (screen_resized) /* 若變動了螢幕大小,要重繪 menu */
+ {
+ screen_resized = 0;
+ mode = MENU_DRAW | MENU_FILM;
+ }
: more.c:more()
+ resized:
if ((fd = open(fpath, O_RDONLY)) < 0)
return -1;
...
...
key = vkey();
+ if (screen_resized)
+ {
+ screen_resized = 0;
+ close(fd);
+ goto resized;
+ }
: edit.c:vedit() /* Kyo: 為了畫面顯示正常, 所以才拆成兩段 @@ */
+ if (screen_resized)
+ {
+ screen_resized = 0;
+ refresh();
+ }
cc = vkey();
+ if (screen_resized)
+ {
+ ve_mode = mode | VE_REDRAW;
+ clear();
+ continue;
+ }
Kyo: 然後還有 pans 也很慘, 真要即時處裡會改到瘋掉
所以就維持半自動, 也就是離開選單後再按一鍵就會更新畫面
因為 screen_resized 後要將 screen_resized 還原
所以拿 tmp_screen 來暫放 ...
: windows.c:pans()
- int cur, old_cur, max, ch, i;
+ int cur, old_cur, max, ch, i, tmp_screen;
/* 畫出整個選單 */
+ resized:
if (x == -1 && y == -1) /* tsaikd.041007 自動找位置 */
{
x = (b_lines - 4 - ch) / 2;
y = (b_cols - 12 - desc_maxlen) / 2;
}
...
...
switch (ch = vkey())
{
+ case Ctrl('L'):
+ if (screen_resized)
+ {
+ clear(); /* 不清畫面的話, 會很悲慘 */
+ tmp_screen = 1;
+ screen_resized = 0;
+ hotkey = desc[cur][0];
+ x = y = -1; /* 置中 */
+ goto resized;
+ }
+ continue;
: help.c:do_help()
- int ch, cur, i;
+ int ch, cur, i, old_b_lines;
...
if (redraw)
{
...
outf(FEETER_HELP);
move(3 + cur, 0);
outc('>');
redraw = 0;
+ old_b_lines = b_lines;
}
ch = vkey();
switch (ch)
{
+ case Ctrl('L'):
+ if (screen_resized)
+ {
+ int realpos;
+ screen_resized = 0;
+ redraw = 1;
+ realpos = (BMIN(num, (old_b_lines - 3)) * pageno + cur);
+ pageno = realpos / XO_TALL;
+ cur = realpos % XO_TALL;
+ pagemax = num / XO_TALL;
+ }
+ break;
: admutil.c:m_innbbs()
- int ch, cur, i;
+ int ch, cur, i, old_b_lines;
...
if (redraw)
{
...
outf(FEETER_INNBBS);
move(3 + cur, 0);
outc('>');
redraw = 0;
+ old_b_lines = b_lines;
}
ch = vkey();
switch (ch)
{
+ case Ctrl('L'):
+ if (screen_resized)
+ {
+ int realpos;
+ screen_resized = 0;
+ redraw = 1;
+ realpos = (BMIN(num, (old_b_lines - 3)) * pageno + cur);
+ pageno = realpos / XO_TALL;
+ cur = realpos % XO_TALL;
+ pagemax = num / XO_TALL;
+ }
+ break;
--
□ 本文章由 itoc 從 itoc.Dorm-GD2.NCTU.edu.tw 發表