2 .\"***************************************************************************
3 .\" Copyright 2018-2023,2024 Thomas E. Dickey *
4 .\" Copyright 1998-2015,2017 Free Software Foundation, Inc. *
6 .\" Permission is hereby granted, free of charge, to any person obtaining a *
7 .\" copy of this software and associated documentation files (the *
8 .\" "Software"), to deal in the Software without restriction, including *
9 .\" without limitation the rights to use, copy, modify, merge, publish, *
10 .\" distribute, distribute with modifications, sublicense, and/or sell *
11 .\" copies of the Software, and to permit persons to whom the Software is *
12 .\" furnished to do so, subject to the following conditions: *
14 .\" The above copyright notice and this permission notice shall be included *
15 .\" in all copies or substantial portions of the Software. *
17 .\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
18 .\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
19 .\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
20 .\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
21 .\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
22 .\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
23 .\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
25 .\" Except as contained in this notice, the name(s) of the above copyright *
26 .\" holders shall not be used in advertising or otherwise to promote the *
27 .\" sale, use or other dealings in this Software without prior written *
29 .\"***************************************************************************
31 .\" $Id: curs_mouse.3x,v 1.103 2024/05/25 20:10:58 tom Exp $
32 .TH curs_mouse 3X 2024-05-25 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls"
56 \fB\%mouseinterval\fP \-
57 get mouse events in \fIcurses\fR
60 \fB#include <curses.h>
62 \fBtypedef unsigned long mmask_t;
65 \fB short id; \fI/* ID to distinguish multiple devices */
66 \fB int x, y, z; \fI/* event coordinates */
67 \fB mmask_t bstate; \fI/* button state bits */
70 \fBbool has_mouse(void);
72 \fBmmask_t mousemask(mmask_t \fInewmask\fP, mmask_t *\fIoldmask\fP);
74 \fBint getmouse(MEVENT *\fIevent\fP);
75 \fBint ungetmouse(MEVENT *\fIevent\fP);
77 \fBbool wenclose(const WINDOW *\fIwin\fP, int \fIy\fP, int \fIx\fP);
79 \fBbool mouse_trafo(int* \fIpY\fP, int* \fIpX\fP, bool \fIto_screen\fP);
80 \fBbool wmouse_trafo(const WINDOW* \fIwin\fP,
81 .ti +18n \" "bool wmouse_trafo("
82 \fBint* \fIpY\fB, int* \fIpX\fB, bool \fIto_screen\fB);
84 \fBint mouseinterval(int \fIerval\fB);\fR
87 These functions provide an interface to mouse events from
89 Mouse events are represented by \fB\%KEY_MOUSE\fP
90 pseudo-key values in the \fB\%wgetch\fP(3X) input stream.
92 The \fB\%has_mouse\fP function returns \fBTRUE\fP if the mouse driver
93 has been successfully initialized,
94 and \fBFALSE\fP otherwise.
96 Mouse events are ignored when input is in cooked mode, and
97 cause an error beep when cooked mode is being simulated in a window by a
98 function such as \fB\%getstr\fP that expects a linefeed for input-loop
101 To make mouse events visible, use the \fB\%mousemask\fP function.
102 This sets the mouse events to be reported.
103 By default, no mouse events are reported.
105 The function returns an updated copy of \fInewmask\fP
106 to indicate which of the specified mouse events can be reported.
108 If the screen has not been initialized,
109 or if the terminal does not support mouse-events,
110 this function returns 0.
112 If \fIoldmask\fP is non-\fBNULL\fP,
113 this function fills the indicated location with the previous value of the
114 current screen's mouse event mask.
116 As a side effect, setting a zero mouse mask may turn off the mouse pointer;
117 setting a nonzero mask may turn it on.
118 Whether this happens is device-dependent.
120 Here are the mouse event type masks which may be defined:
127 BUTTON1_PRESSED mouse button 1 down
128 BUTTON1_RELEASED mouse button 1 up
129 BUTTON1_CLICKED mouse button 1 clicked
130 BUTTON1_DOUBLE_CLICKED mouse button 1 double clicked
131 BUTTON1_TRIPLE_CLICKED mouse button 1 triple clicked
133 BUTTON2_PRESSED mouse button 2 down
134 BUTTON2_RELEASED mouse button 2 up
135 BUTTON2_CLICKED mouse button 2 clicked
136 BUTTON2_DOUBLE_CLICKED mouse button 2 double clicked
137 BUTTON2_TRIPLE_CLICKED mouse button 2 triple clicked
139 BUTTON3_PRESSED mouse button 3 down
140 BUTTON3_RELEASED mouse button 3 up
141 BUTTON3_CLICKED mouse button 3 clicked
142 BUTTON3_DOUBLE_CLICKED mouse button 3 double clicked
143 BUTTON3_TRIPLE_CLICKED mouse button 3 triple clicked
145 BUTTON4_PRESSED mouse button 4 down
146 BUTTON4_RELEASED mouse button 4 up
147 BUTTON4_CLICKED mouse button 4 clicked
148 BUTTON4_DOUBLE_CLICKED mouse button 4 double clicked
149 BUTTON4_TRIPLE_CLICKED mouse button 4 triple clicked
151 BUTTON5_PRESSED mouse button 5 down
152 BUTTON5_RELEASED mouse button 5 up
153 BUTTON5_CLICKED mouse button 5 clicked
154 BUTTON5_DOUBLE_CLICKED mouse button 5 double clicked
155 BUTTON5_TRIPLE_CLICKED mouse button 5 triple clicked
158 shift was down during button state change
161 control was down during button state change
164 alt was down during button state change
166 ALL_MOUSE_EVENTS report all button state changes
167 REPORT_MOUSE_POSITION report mouse movement
171 Once a class of mouse events has been made visible in a window,
172 calling the \fB\%wgetch\fP function on that window may return
173 \fB\%KEY_MOUSE\fP as an indicator that a mouse event has been queued.
174 To read the event data and pop the event off the queue, call
176 This function will return \fBOK\fP if a mouse event
177 is actually visible in the given window, \fBERR\fP otherwise.
178 When \fB\%getmouse\fP returns \fBOK\fP, the data deposited as y and
179 x in the event structure coordinates will be screen-relative character-cell
181 The returned state mask will have exactly one bit set to
182 indicate the event type.
183 The corresponding data in the queue is marked invalid.
184 A subsequent call to \fB\%getmouse\fP will retrieve the next older
187 The \fB\%ungetmouse\fP function behaves analogously to \fB\%ungetch\fP.
189 a \fB\%KEY_MOUSE\fP event onto the input queue, and associates with that event
190 the given state data and screen-relative character-cell coordinates.
192 The \fB\%wenclose\fP function tests whether a given pair of screen-relative
193 character-cell coordinates is enclosed by a given window, returning \fBTRUE\fP
194 if it is and \fBFALSE\fP otherwise.
195 It is useful for determining what subset of
196 the screen windows enclose the location of a mouse event.
198 If the parameter is a pad,
199 \fB\%wenclose\fP uses the most recent screen coordinates used for
201 \fB\%prefresh\fP(3X) or
202 \fB\%pnoutrefresh\fP(3X).
204 The \fB\%wmouse_trafo\fP function transforms a given pair of coordinates
205 from \fB\%stdscr\fP-relative coordinates
206 to coordinates relative to the given window or vice versa.
207 The resulting \fB\%stdscr\fP-relative coordinates are not always
208 identical to screen coordinates due to the mechanism to reserve
209 lines on top or bottom of the screen for other purposes
210 (see the \fB\%ripoffline\fP(3X) and \fB\%slk_init\fP(3X) calls, for example).
212 If the parameter \fIto_screen\fP is \fBTRUE\fP, the pointers
213 \fIpY, pX\fP must reference the coordinates of a location
214 inside the window \fIwin\fP.
215 They are converted to \fB\%stdscr\fP-relative coordinates and returned
216 through the pointers.
217 If the conversion was successful, the function returns \fBTRUE\fP.
219 If one of the parameters was \fBNULL\fP or the location is
220 not inside the window, \fBFALSE\fP is returned.
222 If \fIto_screen\fP is
223 \fBFALSE\fP, the pointers \fIpY, pX\fP must reference
224 \fB\%stdscr\fP-relative coordinates.
225 They are converted to window-relative coordinates if the
226 window \fIwin\fP encloses this point.
227 In this case the function returns \fBTRUE\fP.
229 If one of the parameters is \fBNULL\fP or the point is not inside the
230 window, \fBFALSE\fP is returned.
232 The referenced coordinates
233 are only replaced by the converted coordinates if the transformation was
236 The \fB\%mouse_trafo\fP function performs the same translation
237 as \fB\%wmouse_trafo\fP,
238 using \fB\%stdscr\fP for \fIwin\fP.
240 The \fB\%mouseinterval\fP function sets the maximum time
241 (in thousandths of a second)
242 that can elapse between press and release events for them to
245 An application might interpret button press and release events separated
246 by more than the mouse interval as a \*(``long press\*('',
251 Calling \fB\%mouseinterval(0)\fP disables click resolution.
254 detects a mouse event,
255 it awaits further input activity up to this interval,
256 and then checks for a subsequent mouse event which can be combined
257 with the first event.
258 If the timeout expires without input activity
259 (which would happen with a zero interval),
260 then no click resolution will occur.
262 This function returns the previous interval value.
263 Use \fB\%mouseinterval(\-1)\fP to obtain the interval without altering it.
265 The mouse interval is set to one sixth of a second
266 when the corresponding screen is initialized,
267 e.g., in \fBinitscr\fP(3X) or \fBsetupterm\fP(3X).
274 return \fBTRUE\fP or \fBFALSE\fP as noted above.
276 \fB\%getmouse\fP and \fB\%ungetmouse\fP
277 return \fBERR\fP upon failure and \fBOK\fP upon success.
279 \fB\%getmouse\fP fails if:
281 no mouse driver was initialized,
283 the mask of reportable events is zero,
285 a mouse event was detected that does not match the mask,
287 or if no more events remain in the queue.
289 \fB\%ungetmouse\fP returns
291 if the event queue is full.
294 returns the mask of reportable events.
296 \fB\%mouseinterval\fP
297 returns the previous interval value, unless
298 the terminal was not initialized.
299 In that case, it returns the maximum interval value (166).
301 The order of the \fB\%MEVENT\fP structure members is not guaranteed.
302 Additional fields may be added to the structure in the future.
306 these calls are implemented using either
308 built-in mouse-tracking API or
309 platform-specific drivers including
312 Alessandro Rubini's gpm server
319 If you are using an unsupported configuration,
320 mouse events will not be visible to
321 \fI\%ncurses\fP (and the \fB\%mousemask\fP function will always
326 entry contains a \fBXM\fP string,
329 mouse driver to control the
330 way the terminal is initialized for mouse operation.
331 The default, if \fBXM\fP is not found,
332 corresponds to private mode 1000 of
336 \eE[?1000%?%p1%{1}%=%th%el%;
339 The mouse driver also recognizes a newer
345 \eE[?1006;1000%?%p1%{1}%=%th%el%;
348 The \fIz\fP member in the event structure is not presently used.
350 for use with touch screens (which may be pressure-sensitive) or with
351 3D-mice/trackballs/power gloves.
353 The \fB\%ALL_MOUSE_EVENTS\fP class does not
354 include \fB\%REPORT_MOUSE_POSITION\fP.
359 wheel/scrolling mice send position reports as a sequence of
360 presses of buttons 4 or 5 without matching button-releases.
362 These functions were designed for
364 and are not found in SVr4
368 or any other previous curses implementation.
374 which took no argument and returned a different type.)
376 Applications employing the
378 mouse extension should condition its use on the visibility of the
379 .B \%NCURSES_MOUSE_VERSION
381 When the interface changes,
382 the macro's value increments.
383 Multiple versions are available when
386 see section \*(``ALTERNATE CONFIGURATIONS\*('' of \fB\%ncurses\fP(3X).
387 The following values may be specified.
391 has definitions for reserved events.
392 The mask uses 28 bits.
395 adds definitions for button 5,
396 removes the definitions for reserved events.
397 The mask uses 29 bits.
402 had support for the mouse in a variant of \fI\%xterm\fP(1).
403 It is mentioned in a few places,
404 with little supporting documentation.
406 Its \*(``libcurses\*('' manual page lists functions for this feature
407 prototyped in \fI\%curses.h\fP.
411 extern int mouse_set(long int);
412 extern int mouse_on(long int);
413 extern int mouse_off(long int);
414 extern int request_mouse_pos(void);
415 extern int map_button(unsigned long);
416 extern void wmouse_position(WINDOW *, int *, int *);
417 extern unsigned long getmouse(void), getbmap(void);
421 Its \*(``terminfo\*('' manual page lists capabilities for the feature.
422 .\" These don't appear in in the SVID 4th edition, Volume 3,
423 .\" terminfo(TI_ENV) man page. They can be found in, e.g., the "z/OS
424 .\" V1R1.0 C Curses" book, Chapter 17, pp. 179-186 (PDF 213-220).
429 Number of buttons on the mouse
432 Curses should get button events
434 key_mouse kmous Km T{
435 0631, Mouse event has occurred
437 mouse_info minfo Mi T{
438 Mouse status information
440 req_mouse_pos reqmp RQ T{
441 Request mouse position report
446 The interface made assumptions
449 about the escape sequences sent to and received from the terminal.
454 library used the \fB\%get_mouse\fP capability to tell the terminal which
455 mouse button events it should send,
456 passing the mouse-button bit mask to the terminal.
457 Also, it could ask the terminal
458 where the mouse was using the \fB\%req_mouse_pos\fP capability.
460 Those features required a terminal program that had been modified
463 They were not part of the X Consortium's
471 Eric Raymond was uninterested in using the same interface due to its
472 lack of documentation.
473 Later, in 1998, Mark Hesseling provided support in
475 2.3 using the SVr4 interface.
478 does not use video terminals,
479 making it unnecessary to be concerned about compatibility with the
486 ignored in cooked mode if they have been enabled by \fB\%mousemask\fP.
490 mouse report sequence appears in the string read.
494 window must enable \fB\%keypad\fP(3X) to correctly receive mouse event
497 since they are encoded like function keys.
500 capability \fB\%kmous\fP to \*(``\eE[M\*(''
501 (the beginning of the response from
504 Other values of \fB\%kmous\fP are permitted under the same assumption,
506 the report begins with that sequence.
508 Because there are no standard response sequences that serve to identify
509 terminals supporting the
513 assumes that if \fB\%kmous\fP is defined in the terminal description,
514 or if the terminal type's primary name or aliases contain the string
516 then the terminal may send mouse events.
517 The \fB\%kmous\fP capability is checked first,
518 allowing use of newer
521 such as its private mode 1006.
524 \fB\%curs_inopts\fP(3X),
525 \fB\%curs_kernel\fP(3X),
526 \fB\%curs_pad\fP(3X),
527 \fB\%curs_slk\fP(3X),
528 \fB\%curs_variables\fP(3X)