回精華區
作者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;

--
□ 本文章由 itocitoc.Dorm-GD2.NCTU.edu.tw 發表
精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻