回精華區
作者fuse.bbs@bbs.hightman.net (保險絲) 看板: plan
標題[試試] 支持鼠標的bbs
時間明月水軒BBS (Sun, 18 May 2003 12:53:53 +0800 CST) Updated: 2003/08/24
    各位架bbs的大大應該有用過xwindow上的xterm吧。

    有沒有在xterm里面運行mc,就是midnight command。

    在xterm中運行mc時,可以用鼠標點東西,點菜單,mc里面的edit還可以
    選擇區塊。

    我想我們的bbs如果能用鼠標點選,會有好多好玩的東西作出來。

    我試著作了一下:

: global.h

#define I_TIMEOUT       -31
#define I_OTHERDATA     -32

+ /* fuse.030517: xterm-mouse tracking */
+ #define KEY_XTERM       0x8000

: visio.c:vkey()

+ /* fuse.030517: xterm-mouse tracking */
+ int xterm_btn;
+ int xterm_posx;
+ int xterm_posy;


int
vkey()
{
  ...
  ...
    else if (mode == 2)             /* Cursor key */
    {
      if (ch >= 'A' && ch <= 'D')
        return KEY_UP - (ch - 'A');
      else if (ch >= '1' && ch <= '6')
        mode = 3;
+     else if (ch == 'M')   /* fuse.030517: xterm-mouse tracking */
+       mode = 4;
      else
        return ch;
    }
    else if (mode == 3)             /* Ins Del Home End PgUp PgDn */
    {
      if (ch == '~')
        return KEY_HOME - (last - '1');
      else
        return ch;
    }
+   else if (mode == 4)
+   {
+     /* fuse.030517: xterm-mouse tracking */
+     xterm_btn = ch - ' ';
+     mode = 5;
+   }
+   else if (mode == 5)
+   {
+     xterm_posy = ch - ' ' - 1;
+     mode = 6;
+   }
+   else if (mode == 6)
+   {
+     xterm_posx = ch - ' ' - 1;
+     return KEY_XTERM;
+   }
    last = ch;
  }
}

上面的代碼是在鼠標點擊時捕獲xterm mouse tracking 序列。
即*[M<mb><y><x>
存在xterm_btn, xterm_posx, xterm_posy這三個變量里面。

然后就可以在需要的地方用了,我在xover.c里面是這樣用的:

: xover.c:xover()

void
xover(cmd)
  int cmd;
{
  int pos, num, zone, sysmode;
  XO *xo;
  KeyFunc *xcmd, *cb;
+ extern int xterm_btn;
+ extern int xterm_posx;
+ extern int xterm_posy;

+ send(0, "\033[?1000h", 8, 0);

  ...
  ...

    else if (cmd >= '1' && cmd <= '9')
    {
      cmd = xo_jump(cmd, zone);
    }
+   else if (cmd == KEY_XTERM)  /* fuse.030517: xterm-mouse tracking */
+   {
+     if (xterm_btn == 0)
+     {
+       if (xterm_posy < 7)                     /* Left */
+       {
+         return;
+       }
+       else if (xterm_posy <= 60)              /* Move */
+       {
+         cmd = xo->top + (xterm_posx - 3) + XO_MOVE;
+       }
+       else
+       {
+         if (xterm_posx > (b_lines >> 1))      /* PgDn */
+           cmd = pos + XO_TALL + XO_MOVE;
+         else                                  /* PgUp */
+           cmd = pos - XO_TALL + XO_MOVE;
+       }
+     }
+     else
+     {
+       cmd = XO_NONE;
+     }
+   }
    else

    以上代碼是說:在列表選擇(版面,精華區,文章列表,用戶列表)時
    如果鼠標點在10列以左,就是“左鍵”出去
    如果鼠標點在10-60列,表示移動到相應行
    如果鼠標點在60列以右,在半屏以上點就是向上翻,半屏以下點就是向下翻

--
    順便廣告一下我的fterm:
    fterm主頁:http://fterm.zj001.net
    fterm-big版下載:http://210.83.130.82/~fuse/fterm-big5.zip
    界面演示:http://210.83.130.82/~fuse/ftermbig.gif
              http://210.83.130.82/~fuse/mcbig.gif

--
※ Origin: 明月水軒 <bbs.hightman.net> 
◆ From: 10.11.26.15
精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻