]> ncurses.scripts.mit.edu Git - ncurses.git/blob - man/curs_mouse.3x
41622522f067ea34928db8a431fb8162fab97f88
[ncurses.git] / man / curs_mouse.3x
1 '\" t
2 .\"***************************************************************************
3 .\" Copyright 2018-2023,2024 Thomas E. Dickey                                *
4 .\" Copyright 1998-2015,2017 Free Software Foundation, Inc.                  *
5 .\"                                                                          *
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:                 *
13 .\"                                                                          *
14 .\" The above copyright notice and this permission notice shall be included  *
15 .\" in all copies or substantial portions of the Software.                   *
16 .\"                                                                          *
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.                               *
24 .\"                                                                          *
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       *
28 .\" authorization.                                                           *
29 .\"***************************************************************************
30 .\"
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"
33 .ie \n(.g \{\
34 .ds `` \(lq
35 .ds '' \(rq
36 .\}
37 .el \{\
38 .ie t .ds `` ``
39 .el   .ds `` ""
40 .ie t .ds '' ''
41 .el   .ds '' ""
42 .\}
43 .
44 .de bP
45 .ie n  .IP \(bu 4
46 .el    .IP \(bu 2
47 ..
48 .SH NAME
49 \fB\%has_mouse\fP,
50 \fB\%getmouse\fP,
51 \fB\%ungetmouse\fP,
52 \fB\%mousemask\fP,
53 \fB\%wenclose\fP,
54 \fB\%mouse_trafo\fP,
55 \fB\%wmouse_trafo\fP,
56 \fB\%mouseinterval\fP \-
57 get mouse events in \fIcurses\fR
58 .SH SYNOPSIS
59 .nf
60 \fB#include <curses.h>
61 .PP
62 \fBtypedef unsigned long mmask_t;
63 .PP
64 \fBtypedef struct {
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 */
68 \fB} MEVENT;
69 .PP
70 \fBbool has_mouse(void);
71 .PP
72 \fBmmask_t mousemask(mmask_t \fInewmask\fP, mmask_t *\fIoldmask\fP);
73 .PP
74 \fBint getmouse(MEVENT *\fIevent\fP);
75 \fBint ungetmouse(MEVENT *\fIevent\fP);
76 .PP
77 \fBbool wenclose(const WINDOW *\fIwin\fP, int \fIy\fP, int \fIx\fP);
78 .PP
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);
83 .PP
84 \fBint mouseinterval(int \fIerval\fB);\fR
85 .fi
86 .SH DESCRIPTION
87 These functions provide an interface to mouse events from
88 \fB\%ncurses\fP(3X).
89 Mouse events are represented by \fB\%KEY_MOUSE\fP
90 pseudo-key values in the \fB\%wgetch\fP(3X) input stream.
91 .SS has_mouse
92 The \fB\%has_mouse\fP function returns \fBTRUE\fP if the mouse driver
93 has been successfully initialized,
94 and \fBFALSE\fP otherwise.
95 .PP
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
99 termination.
100 .SS mousemask
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.
104 .bP
105 The function returns an updated copy of \fInewmask\fP
106 to indicate which of the specified mouse events can be reported.
107 .IP
108 If the screen has not been initialized,
109 or if the terminal does not support mouse-events,
110 this function returns 0.
111 .bP
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.
115 .PP
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.
119 .SS "Mouse Events"
120 Here are the mouse event type masks which may be defined:
121 .PP
122 .TS
123 Lb Lb
124 Lb Lx.
125 Name    Description
126 =
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
132 _
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
138 _
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
144 _
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
150 _
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
156 _
157 BUTTON_SHIFT    T{
158 shift was down during button state change
159 T}
160 BUTTON_CTRL     T{
161 control was down during button state change
162 T}
163 BUTTON_ALT      T{
164 alt was down during button state change
165 T}
166 ALL_MOUSE_EVENTS        report all button state changes
167 REPORT_MOUSE_POSITION   report mouse movement
168 _
169 .TE
170 .SS getmouse
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
175 \fB\%getmouse\fP.
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
180 coordinates.
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
185 item from the queue.
186 .SS ungetmouse
187 The \fB\%ungetmouse\fP function behaves analogously to \fB\%ungetch\fP.
188 It pushes
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.
191 .SS wenclose
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.
197 .PP
198 If the parameter is a pad,
199 \fB\%wenclose\fP uses the most recent screen coordinates used for
200 this pad in
201 \fB\%prefresh\fP(3X) or
202 \fB\%pnoutrefresh\fP(3X).
203 .SS wmouse_trafo
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).
211 .bP
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.
218 .IP
219 If one of the parameters was \fBNULL\fP or the location is
220 not inside the window, \fBFALSE\fP is returned.
221 .bP
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.
228 .IP
229 If one of the parameters is \fBNULL\fP or the point is not inside the
230 window, \fBFALSE\fP is returned.
231 .PP
232 The referenced coordinates
233 are only replaced by the converted coordinates if the transformation was
234 successful.
235 .SS mouse_trafo
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.
239 .SS mouseinterval
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
243 be resolved as a
244 .IR click .
245 An application might interpret button press and release events separated
246 by more than the mouse interval as a \*(``long press\*('',
247 or,
248 with motion,
249 as a \*(``drag\*(''.
250 .PP
251 Calling \fB\%mouseinterval(0)\fP disables click resolution.
252 When
253 .I \%ncurses
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.
261 .PP
262 This function returns the previous interval value.
263 Use \fB\%mouseinterval(\-1)\fP to obtain the interval without altering it.
264 .PP
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).
268 .SH RETURN VALUE
269 \fB\%has_mouse\fP,
270 \fB\%wenclose\fP,
271 \fB\%mouse_trafo\fP,
272 and
273 \fB\%wmouse_trafo\fP
274 return \fBTRUE\fP or \fBFALSE\fP as noted above.
275 .PP
276 \fB\%getmouse\fP and \fB\%ungetmouse\fP
277 return \fBERR\fP upon failure and \fBOK\fP upon success.
278 .PP
279 \fB\%getmouse\fP fails if:
280 .bP
281 no mouse driver was initialized,
282 .bP
283 the mask of reportable events is zero,
284 .bP
285 a mouse event was detected that does not match the mask,
286 .bP
287 or if no more events remain in the queue.
288 .PP
289 \fB\%ungetmouse\fP returns
290 .B ERR
291 if the event queue is full.
292 .PP
293 \fB\%mousemask\fP
294 returns the mask of reportable events.
295 .PP
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).
300 .SH NOTES
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.
303 .PP
304 Under
305 .IR \%ncurses ,
306 these calls are implemented using either
307 .IR \%xterm 's
308 built-in mouse-tracking API or
309 platform-specific drivers including
310 .RS 3
311 .bP
312 Alessandro Rubini's gpm server
313 .bP
314 FreeBSD sysmouse
315 .bP
316 OS/2 EMX
317 .RE
318 .PP
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
322 return \fB0\fP).
323 .PP
324 If the
325 .I \%term\%info
326 entry contains a \fBXM\fP string,
327 this is used in the
328 .I \%xterm
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
333 .I \%xterm:
334 .PP
335 .RS 3
336 \eE[?1000%?%p1%{1}%=%th%el%;
337 .RE
338 .PP
339 The mouse driver also recognizes a newer
340 .I \%xterm
341 private mode 1006,
342 e.g.,
343 .PP
344 .RS 3
345 \eE[?1006;1000%?%p1%{1}%=%th%el%;
346 .RE
347 .PP
348 The \fIz\fP member in the event structure is not presently used.
349 It is intended
350 for use with touch screens (which may be pressure-sensitive) or with
351 3D-mice/trackballs/power gloves.
352 .PP
353 The \fB\%ALL_MOUSE_EVENTS\fP class does not
354 include \fB\%REPORT_MOUSE_POSITION\fP.
355 They are distinct.
356 For example,
357 in
358 .IR \%xterm ,
359 wheel/scrolling mice send position reports as a sequence of
360 presses of buttons 4 or 5 without matching button-releases.
361 .SH EXTENSIONS
362 These functions were designed for
363 \fB\%ncurses\fP(3X),
364 and are not found in SVr4
365 .IR curses ,
366 4.4BSD
367 .IR curses ,
368 or any other previous curses implementation.
369 (SVr4
370 .I curses
371 did have a
372 .I \%getmouse
373 function,
374 which took no argument and returned a different type.)
375 .SH PORTABILITY
376 Applications employing the
377 .I \%ncurses
378 mouse extension should condition its use on the visibility of the
379 .B \%NCURSES_MOUSE_VERSION
380 preprocessor macro.
381 When the interface changes,
382 the macro's value increments.
383 Multiple versions are available when
384 .I \%ncurses
385 is configured;
386 see section \*(``ALTERNATE CONFIGURATIONS\*('' of \fB\%ncurses\fP(3X).
387 The following values may be specified.
388 .RS 3
389 .TP 3
390 1
391 has definitions for reserved events.
392 The mask uses 28 bits.
393 .TP 3
394 2
395 adds definitions for button 5,
396 removes the definitions for reserved events.
397 The mask uses 29 bits.
398 .RE
399 .PP
400 SVr4
401 .I curses
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.
405 .bP
406 Its \*(``libcurses\*('' manual page lists functions for this feature
407 prototyped in \fI\%curses.h\fP.
408 .PP
409 .RS 8
410 .EX
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);
418 .EE
419 .RE
420 .bP
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).
425 .RS 8
426 .TS
427 Lb Lb Lb Lx.
428 buttons btns    BT      T{
429 Number of buttons on the mouse
430 T}
431 get_mouse       getm    Gm      T{
432 Curses should get button events
433 T}
434 key_mouse       kmous   Km      T{
435 0631, Mouse event has occurred
436 T}
437 mouse_info      minfo   Mi      T{
438 Mouse status information
439 T}
440 req_mouse_pos   reqmp   RQ      T{
441 Request mouse position report
442 T}
443 .TE
444 .RE
445 .bP
446 The interface made assumptions
447 (as does
448 .IR \%ncurses )
449 about the escape sequences sent to and received from the terminal.
450 .IP
451 For instance,
452 the SVr4
453 .I curses
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.
459 .IP
460 Those features required a terminal program that had been modified
461 to work with SVr4
462 .IR curses .
463 They were not part of the X Consortium's
464 .IR \%xterm .
465 .PP
466 When developing the
467 .I \%xterm
468 mouse support for
469 .I \%ncurses
470 in September 1995,
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
474 .I \%PDCurses
475 2.3 using the SVr4 interface.
476 .IR \%PDCurses ,
477 however,
478 does not use video terminals,
479 making it unnecessary to be concerned about compatibility with the
480 escape sequences.
481 .SH BUGS
482 Mouse events from
483 .I \%xterm
484 are
485 .I not
486 ignored in cooked mode if they have been enabled by \fB\%mousemask\fP.
487 Instead,
488 the
489 .I \%xterm
490 mouse report sequence appears in the string read.
491 .PP
492 An
493 .I \%ncurses
494 window must enable \fB\%keypad\fP(3X) to correctly receive mouse event
495 reports from
496 .I \%xterm
497 since they are encoded like function keys.
498 Set the terminal's
499 .I \%term\%info
500 capability \fB\%kmous\fP to \*(``\eE[M\*(''
501 (the beginning of the response from
502 .I \%xterm
503 for mouse clicks).
504 Other values of \fB\%kmous\fP are permitted under the same assumption,
505 that is,
506 the report begins with that sequence.
507 .PP
508 Because there are no standard response sequences that serve to identify
509 terminals supporting the
510 .I \%xterm
511 mouse protocol,
512 .I \%ncurses
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
515 \%\*(``xterm\*('',
516 then the terminal may send mouse events.
517 The \fB\%kmous\fP capability is checked first,
518 allowing use of newer
519 .I \%xterm
520 mouse protocols,
521 such as its private mode 1006.
522 .SH SEE ALSO
523 \fB\%curses\fP(3X),
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)