Ncurses鼠标滚轮向上滚动

时间:2013-12-13 12:10:32

标签: c linux ncurses

我想使用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;
   }
 }

2 个答案:

答案 0 :(得分:4)

在主循环之外的某处添加mouseinterval(0);。 (也许就在keypad(stdscr, TRUE);之后)

此命令导致鼠标事件没有延迟,因此您无法检测到BUTTON1_CLICKEDBUTTON1_DOUBLE_CLICKED及类似的事情(尽管您可以通过跟踪来实现BUTTON1_PRESSEDBUTTON1_RELEASED以及鼠标事件之间的时间。

虽然有一点需要注意,当我使用C测试时,一切正常,但getmouse在滚轮向下事件上返回ERR。这可能仍然有用,因为它是唯一给出这个结果的事件。当我在Rust中测试相同的代码时,它工作得很好,所以你的里程可能会有所不同。

答案 1 :(得分:3)

ncurses5不支持滚轮鼠标,但作为可选功能除外。这是因为在{20}中期选择的mousemask_t中的位布局为第五个鼠标按钮留下的空间不足。当时,其他一些设备(用于玩游戏)似乎更重要;这是在X为轮式鼠标提供协议之前。

“扩展鼠标”是一个可选功能(因为它会更改应用程序二进制接口),并且尚未包含在ncurses5包中,尽管它已经有一段时间了。

供参考,请参阅ncurses更改日志中--enable-ext-mouse的讨论,从2005开始。

ncurses6 支持滚轮鼠标(参见release notes)。也许这将是Debian 9中的标准。

相关问题