我正在使用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 }
最后我会做任何事情。
答案 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。