Ncurses错误鼠标坐标超过222宽度或高度终端

时间:2013-05-27 17:54:05

标签: c events mouse ncurses curses

我正在使用ncurses编写用户界面。 当我的终端宽度或高度超过222个字符/行时,我有一个问题,鼠标坐标返回-33值,所以当我点击超过222个字符时mouse_x = -33 当我点击超过222行mouse_y = -33

是否有可能告诉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()谁是一个空功能(当我认为没有鼠标时)。

你可以在 ncurses-5.9 / ncurses / base / lib_mouse.c

中看到 _nc_mouse_inline()函数

她使用 unsigned char 来计算鼠标坐标,看看这个小例子:

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 }

最后我会做任何事情。

1 个答案:

答案 0 :(得分:0)

我认为你找到了问题的答案。

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

鼠标x和y已收到unsigned char,因此它们可容纳的最大值为255. ' '(空格)为ASCII 32,因此可能的最大值为{{1} }等于222。

然后该值将换行为0,使255 - 32 - 1等于-33。