2011-09-18 37 views
7

鼠標移動事件,我不知道是否有這樣的事情在ncurses的鼠標移動事件,如果有一種方法來抓住他們。繼Interfacing with the mouse(從NCurses programming HOWTO)看來,通過啓用呼叫REPORT_MOUSE_POSITION位爲mousemask,一個確實可以捕獲鼠標移動事件。在NCURSES

所以,我試過了,它似乎並沒有工作。我有這樣的事情:

int ch, count=0; 
mmask_t old; 

initscr(); 
noecho(); 
cbreak(); 
mousemask (ALL_MOUSE_EVENTS | REPORT_MOUSE_POSITION, &old); 
keypad (stdscr, TRUE); 

while ((ch = getchar()) != 'q') 
{ 
    count++; 
    if (ch == KEY_MOUSE) 
    { 
    MEVENT event; 
    assert (getmouse (&event) == OK); 
    mvprintw (0, 0, "Mouse Event!\n"); 
    } 
    mvprintw (1, 1, "Event number %4d",count); 
} 

... 

我預計,因爲我會移動我的鼠標光標,我會看到事件計數器增加。但事實並非如此。我也試着在鼠標按鈕1關閉的情況下移動它,以查看是否生成「拖動」事件,而且它也沒有做任何事情。問題是,如果這只是我的終端仿真器的問題?或者,也許我誤解了NCurses認爲的鼠標移動事件?所有其他鼠標事件都已收到(我可以在控制檯中使用鼠標操作程序)。

我試圖侏儒末端,xterm的,以及其他一些東西。我也嘗試了一個文本環境(沒有X),通過轉到我的Linux機器(Fedora 15,Ctrl + Alt + F2)的tty,並沒有奏效。

最後,假設我確實得到了這個權利,並且應該報告這些事件,那麼字段的MEVENT對於鼠標移動evenet是什麼?

非常感謝提前!

回答

16

您需要:

  1. 支持鼠標事件報告的終端;
  2. $TERM指向其具有適當XM條目正確初始化終端的terminfo項。

xterm至少滿足(1);對於(2),您可能需要爲TERM設置不同的值。

嘗試:

  • TERM=xterm-1002時,同時按鈕被按下的光標移動到不同的單元獲得位置事件;或
  • TERM=xterm-1003總是得到一個位置,只要事件將光標移動到不同的小區,即使沒有按鈕被按下。

生成的事件在bstate字段中設置了REPORT_MOUSE_POSITION位。

(在curs_mouse(3x)手冊頁的「便攜性」部分介紹了終端初始化和Xterm Control Sequences文檔的「鼠標跟蹤」部分介紹了相關的「隱私模式」擴展名)。

的代碼,你」上面給出的需要使用getch(),而不是getchar();並且在循環內部需要一個refresh()!除此之外,當使用其中一個適當的TERM設置時,它適用於xterm

+0

我意外地在stackoverflow中輸入了getchar,我真正的代碼確實使用getch。當我在這裏輸入僞代碼時,我再次跳過了刷新:P無論如何,非常感謝 - 您對xterm的建議工作得非常好! –