2017-12-02 138 views
0

我试着写代码,使用鼠标移动和鼠标滚轮旋转。 事实证明,鼠标拖拽和滚轮旋转会产生完全相同的事件 - REPORT_MOUSE_POSITION(8000000) - 并且我无法从另一个中指出。我错过了什么?的ncurses无法区分鼠标移动轮

MEVENT e; 
    mousemask(ALL_MOUSE_EVENTS | REPORT_MOUSE_POSITION, NULL); 
    while ((c = getch()) != 27){ // 27 = ESC 
     if (c == KEY_MOUSE){ 
      if (getmouse(&e) == OK){ 
       // e.bstate produces 8000000 for both wheel and mouse movement 

回答

0

按照惯例,滚轮鼠标事件被视为按钮4和5.“所有事件”标志包括这一点。如果您使用感兴趣的按钮的标志组合,则会得到您想要的结果。

manual page列出了可用标志(您也可以在ncurses.h头文件中看到),但是对于所有事件,只有一个按钮没有等效的预定义符号。

顺便说一句,在ncurses5(ncurses6 was released in August 2015),你无法检测按钮5由于位分配的方式。在头文件中,这部分是有关你的问题,因为按钮5会使用面具作为报告鼠标位置的相同部分:

/*                    
* In 32 bits the version-1 scheme does not provide enough space for a 5th  
* button, unless we choose to change the ABI by omitting the reserved-events. 
*/                    
#if NCURSES_MOUSE_VERSION > 1             

#define BUTTON5_RELEASED  NCURSES_MOUSE_MASK(5, NCURSES_BUTTON_RELEASED) 
#define BUTTON5_PRESSED   NCURSES_MOUSE_MASK(5, NCURSES_BUTTON_PRESSED) 
#define BUTTON5_CLICKED   NCURSES_MOUSE_MASK(5, NCURSES_BUTTON_CLICKED) 
#define BUTTON5_DOUBLE_CLICKED NCURSES_MOUSE_MASK(5, NCURSES_DOUBLE_CLICKED) 
#define BUTTON5_TRIPLE_CLICKED NCURSES_MOUSE_MASK(5, NCURSES_TRIPLE_CLICKED) 

#define BUTTON_CTRL    NCURSES_MOUSE_MASK(6, 0001L)      
#define BUTTON_SHIFT   NCURSES_MOUSE_MASK(6, 0002L)      
#define BUTTON_ALT    NCURSES_MOUSE_MASK(6, 0004L)      
#define REPORT_MOUSE_POSITION NCURSES_MOUSE_MASK(6, 0010L)      

#else                   

#define BUTTON1_RESERVED_EVENT NCURSES_MOUSE_MASK(1, NCURSES_RESERVED_EVENT) 
#define BUTTON2_RESERVED_EVENT NCURSES_MOUSE_MASK(2, NCURSES_RESERVED_EVENT) 
#define BUTTON3_RESERVED_EVENT NCURSES_MOUSE_MASK(3, NCURSES_RESERVED_EVENT) 
#define BUTTON4_RESERVED_EVENT NCURSES_MOUSE_MASK(4, NCURSES_RESERVED_EVENT) 

#define BUTTON_CTRL    NCURSES_MOUSE_MASK(5, 0001L)      
#define BUTTON_SHIFT   NCURSES_MOUSE_MASK(5, 0002L)      
#define BUTTON_ALT    NCURSES_MOUSE_MASK(5, 0004L)      
#define REPORT_MOUSE_POSITION NCURSES_MOUSE_MASK(5, 0010L)      

#endif 

你会得到按钮4 ncurses5,但按钮5会穿过裂缝(您可能会看到一些事件,但无法确定它是按钮5)。在任何人有轮鼠讨论之前(1995年底),都设立了口罩。

+0

我使用的ncurses 5,所以我该不该得到BUTTON4事件? 我只收到REPORT_MOUSE_POSITION事件。 – Nathan