***************************************************************************
Copyright 2018-2023,2024 Thomas E. Dickey *
Copyright 1998-2015,2017 Free Software Foundation, Inc. *
*
Permission is hereby granted, free of charge, to any person obtaining a *
copy of this software and associated documentation files (the *
"Software"), to deal in the Software without restriction, including *
without limitation the rights to use, copy, modify, merge, publish, *
distribute, distribute with modifications, sublicense, and/or sell *
copies of the Software, and to permit persons to whom the Software is *
furnished to do so, subject to the following conditions: *
*
The above copyright notice and this permission notice shall be included *
in all copies or substantial portions of the Software. *
*
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
*
Except as contained in this notice, the name(s) of the above copyright *
holders shall not be used in advertising or otherwise to promote the *
sale, use or other dealings in this Software without prior written *
authorization. *
***************************************************************************
$Id: curs_mouse.3x,v 1.98 2024/04/20 19:02:07 tom Exp $
#include <curses.h>typedef unsigned long mmask_t;
typedef struct { short id; /* ID to distinguish multiple devices */ int x, y, z; /* event coordinates */ mmask_t bstate; /* button state bits */ } MEVENT;
bool has_mouse(void);
mmask_t mousemask(mmask_t newmask, mmask_t *oldmask);
int getmouse(MEVENT *event); int ungetmouse(MEVENT *event);
bool wenclose(const WINDOW *win, int y, int x);
bool mouse_trafo(int* pY, int* pX, bool to_screen); bool wmouse_trafo(const WINDOW* win, int* pY, int* pX, bool to_screen);
int mouseinterval(int erval);
Mouse events are ignored when input is in cooked mode, and cause an error beep when cooked mode is being simulated in a window by a function such as \%getstr that expects a linefeed for input-loop termination.
As a side effect, setting a zero mouse mask may turn off the mouse pointer; setting a nonzero mask may turn it on. Whether this happens is device-dependent.
| Name Description | 
| BUTTON1_PRESSED mouse button 1 down | 
| BUTTON1_RELEASED mouse button 1 up | 
| BUTTON1_CLICKED mouse button 1 clicked | 
| BUTTON1_DOUBLE_CLICKED mouse button 1 double clicked | 
| BUTTON1_TRIPLE_CLICKED mouse button 1 triple clicked | 
| BUTTON2_PRESSED mouse button 2 down | 
| BUTTON2_RELEASED mouse button 2 up | 
| BUTTON2_CLICKED mouse button 2 clicked | 
| BUTTON2_DOUBLE_CLICKED mouse button 2 double clicked | 
| BUTTON2_TRIPLE_CLICKED mouse button 2 triple clicked | 
| BUTTON3_PRESSED mouse button 3 down | 
| BUTTON3_RELEASED mouse button 3 up | 
| BUTTON3_CLICKED mouse button 3 clicked | 
| BUTTON3_DOUBLE_CLICKED mouse button 3 double clicked | 
| BUTTON3_TRIPLE_CLICKED mouse button 3 triple clicked | 
| BUTTON4_PRESSED mouse button 4 down | 
| BUTTON4_RELEASED mouse button 4 up | 
| BUTTON4_CLICKED mouse button 4 clicked | 
| BUTTON4_DOUBLE_CLICKED mouse button 4 double clicked | 
| BUTTON4_TRIPLE_CLICKED mouse button 4 triple clicked | 
| BUTTON5_PRESSED mouse button 5 down | 
| BUTTON5_RELEASED mouse button 5 up | 
| BUTTON5_CLICKED mouse button 5 clicked | 
| BUTTON5_DOUBLE_CLICKED mouse button 5 double clicked | 
| BUTTON5_TRIPLE_CLICKED mouse button 5 triple clicked | 
| BUTTON_SHIFT | 
| shift was down during button state change | 
| BUTTON_CTRL | 
| control was down during button state change | 
| BUTTON_ALT | 
| alt was down during button state change | 
| ALL_MOUSE_EVENTS report all button state changes | 
| REPORT_MOUSE_POSITION report mouse movement | 
If the parameter is a pad, \%wenclose uses the most recent screen coordinates used for this pad in \%prefresh(3X) or \%pnoutrefresh(3X).
The referenced coordinates are only replaced by the converted coordinates if the transformation was successful.
Calling \%mouseinterval(0) disables click resolution. When \%ncurses detects a mouse event, it awaits further input activity up to this interval, and then checks for a subsequent mouse event which can be combined with the first event. If the timeout expires without input activity (which would happen with a zero interval), then no click resolution will occur.
This function returns the previous interval value. Use \%mouseinterval(-1) to obtain the interval without altering it.
The mouse interval is set to one sixth of a second when the corresponding screen is initialized, e.g., in initscr(3X) or setupterm(3X).
\%getmouse and \%ungetmouse return ERR upon failure and OK upon success.
\%getmouse fails if: .bP no mouse driver was initialized, .bP the mask of reportable events is zero, .bP a mouse event was detected that does not match the mask, .bP or if no more events remain in the queue.
\%ungetmouse returns an error if the event queue is full.
\%mousemask returns the mask of reportable events.
\%mouseinterval returns the previous interval value, unless the terminal was not initialized. In that case, it returns the maximum interval value (166).
Under \%ncurses , these calls are implemented using either \%xterm 's built-in mouse-tracking API or platform-specific drivers including
.bP Alessandro Rubini's gpm server .bP FreeBSD sysmouse .bP OS/2 EMX
If you are using an unsupported configuration, mouse events will not be visible to \%ncurses (and the \%mousemask function will always return 0).
If the \%term\%info entry contains a XM string, this is used in the \%xterm mouse driver to control the way the terminal is initialized for mouse operation. The default, if XM is not found, corresponds to private mode 1000 of \%xterm:
\eE[?1000%?%p1%{1}%=%th%el%;
The mouse driver also recognizes a newer \%xterm private mode 1006, e.g.,
\eE[?1006;1000%?%p1%{1}%=%th%el%;
The z member in the event structure is not presently used. It is intended for use with touch screens (which may be pressure-sensitive) or with 3D-mice/trackballs/power gloves.
The \%ALL_MOUSE_EVENTS class does not include \%REPORT_MOUSE_POSITION. They are distinct. For example, in \%xterm , wheel/scrolling mice send position reports as a sequence of presses of buttons 4 or 5 without matching button-releases.
3 1 has definitions for reserved events. The mask uses 28 bits.
3 2 adds definitions for button 5, removes the definitions for reserved events. The mask uses 29 bits.
SVr4 curses had support for the mouse in a variant of \%xterm(1). It is mentioned in a few places, with little supporting documentation. .bP Its \*(``libcurses\*('' manual page lists functions for this feature prototyped in \%curses.h.
.EX extern int mouse_set(long int); extern int mouse_on(long int); extern int mouse_off(long int); extern int request_mouse_pos(void); extern int map_button(unsigned long); extern void wmouse_position(WINDOW *, int *, int *); extern unsigned long getmouse(void), getbmap(void);
terminfo(TI_ENV) man page. They can be found in, e.g., the "z/OS
V1R1.0 C Curses" book, Chapter 17, pp. 179-186 (PDF 213-220).
| buttons btns BT | 
| Number of buttons on the mouse | 
| get_mouse getm Gm | 
| Curses should get button events | 
| key_mouse kmous Km | 
| 0631, Mouse event has occurred | 
| mouse_info minfo Mi | 
| Mouse status information | 
| req_mouse_pos reqmp RQ | 
| Request mouse position report | 
When developing the \%xterm mouse support for \%ncurses in September 1995, Eric Raymond was uninterested in using the same interface due to its lack of documentation. Later, in 1998, Mark Hesseling provided support in \%PDCurses 2.3 using the SVr4 interface. \%PDCurses , however, does not use video terminals, making it unnecessary to be concerned about compatibility with the escape sequences.
Mouse event reports from \%xterm are not detected correctly in a window with keypad application mode disabled, since they are interpreted as a variety of function key. Set the terminal's \%term\%info capability \%kmous to \*(``\eE[M\*('' (the beginning of the response from \%xterm for mouse clicks). Other values of \%kmous are permitted under the same assumption, that is, the report begins with that sequence.
Because there are no standard response sequences that serve to identify terminals supporting the \%xterm mouse protocol, \%ncurses assumes that if \%kmous is defined in the terminal description, or if the terminal type's primary name or aliases contain the string \%\*(``xterm\*('', then the terminal may send mouse events. The \%kmous capability is checked first, allowing use of newer \%xterm mouse protocols, such as its private mode 1006.