繁体   English   中英

Ncurses鼠标滚轮向上滚动

[英]Ncurses mouse wheel scroll up

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

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

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

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

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

“扩展鼠标”是一项可选功能(因为它将更改应用程序的二进制接口),尽管已经使用了一段时间,但尚未包含在ncurses5软件包中。

有关参考,请参阅2005年开始的ncurses更改日志中对--enable-ext-mouse的讨论。

ncurses6 确实支持滚轮鼠标(请参阅发行说明 )。 也许这在Debian 9中是标准的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM