2013-05-27 46 views
1

我正在用ncurses編碼用戶界面。 我有一個問題,當我的終端寬度或高度超過222個字符/行,鼠標座標返回-33的值,所以當我點擊以超過222個字符mouse_x = -33 當我點擊超出222行mouse_y = - 33Ncurses錯誤鼠標座標超出222寬度或高度終端

是否有可能告訴ncurses否停止超過222個字符/行的鼠標事件? 在vim中,當您將:vs分隔欄移動超過222個字符時,也會發生此錯誤,它會返回到x = 0。

也許這個bug已經修復了?

1 #include <ncurses.h> 
    2 
    3 void treat_mouse(MEVENT* event); 
    4 
    5 int  main(void) 
    6 { 
    7   bool run; 
    8   int  key; 
    9   MEVENT event; 
10 
11   run = true; 
12   initscr(); 
13   noecho(); 
14   keypad(stdscr, TRUE); 
15   mousemask(BUTTON1_PRESSED, NULL); 
16   while (run == true) 
17   { 
18     key = getch(); 
19     switch (key) 
20     { 
21       case 'q': 
22         run = false; 
23         break; 
24       case KEY_MOUSE: 
25         treat_mouse(&event); 
26         break; 
27       default: 
28         break; 
29     } 
30   } 
31   endwin(); 
32   return 0; 
33 } 
34 
35 void treat_mouse(MEVENT* event) 
36 { 
37   if (getmouse(event) == OK) 
38     mvwprintw(stdscr, 0, 0, "click: x = %d, y = %d\n", event->x, event->y); 
39 } 

========================編輯===================== ==

好的,我找到了。

我已經下載了這裏的ncurses代碼源http://ftp.gnu.org/pub/gnu/ncurses/

,我已經採取了這一鏈接ncurses的5.9.tar.gz 04-APR-2011 19:12 2.7M

我已搜查getch()

getch()致電wgetch()

wgetch()致電_nc_wgetch()

_nc_wgetch()致電_mouse_inline()

_mouse_inline()結構屏幕一個函數指針誰打電話_nc_mouse_inline()no_mouse_inline()誰是一個空函數(當沒有鼠標,我認爲)。

你可以看到_nc_mouse_inline()功能ncurses的5.9/ncurses的/基/ lib_mouse.c

她使用無符號的字符來演算鼠標座標,看到這樣的痘痘例如:

821 static bool 
822 _nc_mouse_inline(SCREEN *sp) 
823 /* mouse report received in the keyboard stream -- parse its info */ 
824 { 
. 
. 
. 
832   unsigned char kbuf[4]; 
. 
. 
. 
970   eventp->x = (kbuf[1] - ' ') - 1; 
971   eventp->y = (kbuf[2] - ' ') - 1; 
. 
. 
. 
984  return (result); 
985 } 

終於我會做任何事情。

回答

0

我想你已經找到了你的問題的答案。

unsigned char kbuf[4]; 
eventp->x = (kbuf[1] - ' ') - 1; 
eventp->y = (kbuf[2] - ' ') - 1; 

鼠標x和y被接收爲unsigned char,這樣他們可以保持最大值爲255 ' '(空間)是ASCII 32,所以可能的最大值爲255 - 32 - 1其等於222

該值然後包裝爲0,給出等於-33的0 - 32 -1

+0

這是xterm鼠標協議的限制。有一個擴展(SGR 1006),但關於它在ncurses中支持的最新消息只是:https://lists.gnu.org/archive/html/bug-ncurses/2013-01/msg00014.html – ninjalj