我想使用ncurses使用鼠标滚轮处理滚动但我遇到类似这个问题的问题:
http://lists.gnu.org/archive/html/bug-ncurses/2012-01/msg00011.html
Besides, mouse wheel-up event is only reported as mask 02000000
(BUTTON4_PRESSED) just one time, even if I scroll the wheel continuously.
我在debian 5,6,7和archlinux上尝试过ncurses 5.7到5.9。
每个ncurses lib都有NCURSES_MOUSE_VERSION 1
,尝试使用--enable-ext-mouse重新编译。
向下滚动效果非常好,ncurses报告每个滚动条有多个REPORT_MOUSE_POSITION 0x8000000
和一个BUTTON2_PRESSED 0x128
。
向上滚动只会导致BUTTON4_PRESSED 0x80000
MEVENT event;
mousemask(BUTTON1_CLICKED|BUTTON4_PRESSED|BUTTON2_PRESSED, NULL); // Tried with REPORT_MOUSE_POSITION also
while(run)
{
switch(in = getch())
{
case KEY_MOUSE:
if(getmouse(&event) == OK)
{
else if (event.bstate & BUTTON4_PRESSED)
line_up();
else if (event.bstate & BUTTON2_PRESSED || event.bstate == 0x8000000)
line_down();
}
break;
}
}
答案 0 :(得分:4)
在主循环之外的某处添加mouseinterval(0);
。 (也许就在keypad(stdscr, TRUE);
之后)
此命令导致鼠标事件没有延迟,因此您无法检测到BUTTON1_CLICKED
或BUTTON1_DOUBLE_CLICKED
及类似的事情(尽管您可以通过跟踪来实现BUTTON1_PRESSED
,BUTTON1_RELEASED
以及鼠标事件之间的时间。
虽然有一点需要注意,当我使用C测试时,一切正常,但getmouse
在滚轮向下事件上返回ERR
。这可能仍然有用,因为它是唯一给出这个结果的事件。当我在Rust中测试相同的代码时,它工作得很好,所以你的里程可能会有所不同。
答案 1 :(得分:3)
ncurses5不支持滚轮鼠标,但作为可选功能除外。这是因为在{20}中期选择的mousemask_t
中的位布局为第五个鼠标按钮留下的空间不足。当时,其他一些设备(用于玩游戏)似乎更重要;这是在X为轮式鼠标提供协议之前。
“扩展鼠标”是一个可选功能(因为它会更改应用程序二进制接口),并且尚未包含在ncurses5包中,尽管它已经有一段时间了。
供参考,请参阅ncurses更改日志中--enable-ext-mouse
的讨论,从2005开始。
ncurses6 支持滚轮鼠标(参见release notes)。也许这将是Debian 9中的标准。