On Sun, Sep 07, 2025 at 01:30:32AM +0300, Robin Haberkorn via Bug reports for 
ncurses, the GNU implementation of curses wrote:
> Hello!
> 
> I am trying to debug subtle mouse-related bugs in one of my projects
> (SciTECO). I wrote a small test program (see attachment). To my surprise for
> every KEY_MOUSE you actually may have to call getmouse() repeatedly - this
> was not obvious from curs_mouse(3X). In XTerm 400 (TERM=xterm-256color) and
> simpleterm (st) the middle mouse button click generates a BUTTON2_RELEASED,

perhaps it's a bug in simpleterm

> followed by a BUTTON2_PRESSED event. Sometimes it's the other way around.
> With vttest I can confirm that the escape sequence for the PRESSED event is
> actually always sent *before* the RELEASED event. My version of ncurses is
> 6.5 (from FreeBSD ports). I do not get PRESSED and RELEASED events separated
> in time like for the left and right buttons, i.e. both events are received
> only when releasing the middle mouse button.
> 
> Can you reproduce these issues?

with xterm, I see press and release events in ncurses,
but with st, I see that some press events are lost
 
> I have another problem that in my app horizontal scrolls generate unexpected
> BUTTON3_PRESSED events in XTerm and GNOME Console, but I cannot yet
> reproduce this with my test program.

ncurses only knows about 5 buttons (a horizontal scroll probably sends
something like buttons 6 and 7)
 
> Yours sincerely,
> Robin Haberkorn
> 
> -- 
> @ii._._.*.._+__.+_+.+...+.+.++..+*+.+._.+...*_*.*.__+__._._.++..+_*.++__+__
> .+_..*...+.+_+__.+._.+...*_+_+__._ ...*_ +.+._.+.._+*+_+__._._ .+_..+.+***_
> . *_+_+__.+.*.++..+_+.*.__+_ _.+...*_*_+__.++*.+...++..+* +.+.._+__._+_.+..
> .++..+*_.*...+*+.+.*_ +*+i2^rj.u#__%uu#_.%uu#_+%uu#_*!+!0a"t1010^t^c^c'0a^#
> 1010"=d'0a-100000"=d'0auuqq*100+q[_^euu]uq-rq:^/100@oo,+,+,+oqq^t0uq@o*+*!!

> #include <curses.h>
> #include <strings.h>
> 
> #define BUTTON_NUM(X) \
>       (BUTTON##X##_PRESSED | BUTTON##X##_RELEASED | \
>        BUTTON##X##_CLICKED | BUTTON##X##_DOUBLE_CLICKED | 
> BUTTON##X##_TRIPLE_CLICKED)
> #define BUTTON_EVENT(X) \
>       (BUTTON1_##X | BUTTON2_##X | BUTTON3_##X | BUTTON4_##X | BUTTON5_##X)
> 
> int main(void)
> {
>       initscr();
>       raw();
>       noecho();
>       scrollok(stdscr, TRUE);
> 
>       keypad(stdscr, TRUE);
>       mouseinterval(0);
>       mousemask(BUTTON_EVENT(PRESSED) | BUTTON_EVENT(RELEASED) /*| 
> REPORT_MOUSE_POSITION*/, NULL);
> 
>       for (;;) {
>               MEVENT event;
>               int c = wgetch(stdscr);
> 
>               if (c == '\e')
>                       break;
>               if (c != KEY_MOUSE)
>                       continue;
> 
>               while (getmouse(&event) == OK) {
>                       printw("EVENT: 0x%016X == %02d [%c%c%c%c%c]\n",
>                              event.bstate, ffs(event.bstate)-1,
>                              event.bstate & BUTTON_NUM(4) ? 'U' : ' ',
>                              event.bstate & BUTTON_NUM(5) ? 'D' : ' ',
>                              event.bstate & BUTTON_EVENT(PRESSED) ? 'P' : ' ',
>                              event.bstate & BUTTON_EVENT(RELEASED) ? 'R' : ' 
> ',
>                              event.bstate & REPORT_MOUSE_POSITION ? 'M' : ' 
> ');
>               }
>       }
> 
>       endwin();
> 
>       return 0;
> }


-- 
Thomas E. Dickey <[email protected]>
https://invisible-island.net

Attachment: signature.asc
Description: PGP signature

Reply via email to