***************************************************************************
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.