<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<!-- 
  * t
  ****************************************************************************
  * Copyright (c) 1998-2005,2006 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.30 2006/12/30 23:43:34 tom Exp @
-->
<HTML>
<HEAD>
<TITLE>curs_mouse 3x</TITLE>
<link rev=made href="mailto:bug-ncurses@gnu.org">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</HEAD>
<BODY>
<H1>curs_mouse 3x</H1>
<HR>
<PRE>
<!-- Manpage converted by man2html 3.0.1 -->
<STRONG><A HREF="curs_mouse.3x.html">curs_mouse(3x)</A></STRONG>                                           <STRONG><A HREF="curs_mouse.3x.html">curs_mouse(3x)</A></STRONG>




</PRE>
<H2>NAME</H2><PRE>
       <STRONG>getmouse</STRONG>, <STRONG>ungetmouse</STRONG>, <STRONG>mousemask</STRONG>, <STRONG>wenclose</STRONG>, <STRONG>mouse_trafo</STRONG>,
       <STRONG>wmouse_trafo</STRONG>, <STRONG>mouseinterval</STRONG> - mouse interface through
       curses


</PRE>
<H2>SYNOPSIS</H2><PRE>
       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>

       <STRONG>typedef</STRONG> <STRONG>unsigned</STRONG> <STRONG>long</STRONG> <STRONG>mmask_t;</STRONG>

       typedef struct
       {
           short id;         <EM>/*</EM> <EM>ID</EM> <EM>to</EM> <EM>distinguish</EM> <EM>multiple</EM> <EM>devices</EM> <EM>*/</EM>
           <STRONG>int</STRONG> <STRONG>x,</STRONG> <STRONG>y,</STRONG> <STRONG>z;</STRONG>      <EM>/*</EM> <EM>event</EM> <EM>coordinates</EM> <EM>*/</EM>
           <STRONG>mmask_t</STRONG> <STRONG>bstate;</STRONG>   <EM>/*</EM> <EM>button</EM> <EM>state</EM> <EM>bits</EM> <EM>*/</EM>
       <STRONG>}</STRONG>
       <STRONG>MEVENT;</STRONG>
       <STRONG>int</STRONG> <STRONG>getmouse(MEVENT</STRONG> <STRONG>*event);</STRONG>
       <STRONG>int</STRONG> <STRONG>ungetmouse(MEVENT</STRONG> <STRONG>*event);</STRONG>
       <STRONG>mmask_t</STRONG> <STRONG>mousemask(mmask_t</STRONG> <STRONG>newmask,</STRONG> <STRONG>mmask_t</STRONG> <STRONG>*oldmask);</STRONG>
       <STRONG>bool</STRONG> <STRONG>wenclose(const</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*win,</STRONG> <STRONG>int</STRONG> <STRONG>y,</STRONG> <STRONG>int</STRONG> <STRONG>x);</STRONG>
       <STRONG>bool</STRONG> <STRONG>mouse_trafo(int*</STRONG> <STRONG>pY,</STRONG> <STRONG>int*</STRONG> <STRONG>pX,</STRONG> <STRONG>bool</STRONG> <STRONG>to_screen);</STRONG>
       <STRONG>bool</STRONG> <STRONG>wmouse_trafo(const</STRONG> <STRONG>WINDOW*</STRONG> <STRONG>win,</STRONG> <STRONG>int*</STRONG> <STRONG>pY,</STRONG> <STRONG>int*</STRONG> <STRONG>pX,</STRONG>
            <STRONG>bool</STRONG> <STRONG>to_screen);</STRONG>
       <STRONG>int</STRONG> <STRONG>mouseinterval(int</STRONG> <STRONG>erval);</STRONG>


</PRE>
<H2>DESCRIPTION</H2><PRE>
       These  functions provide an interface to mouse events from
       <STRONG><A HREF="ncurses.3x.html">ncurses(3x)</A></STRONG>.  Mouse events are  represented  by  <STRONG>KEY_MOUSE</STRONG>
       pseudo-key values in the <STRONG>wgetch</STRONG> input stream.

       To  make mouse events visible, use the <STRONG>mousemask</STRONG> function.
       This will set the mouse events to  be  reported.   By  de-
       fault,  no  mouse  events are reported.  The function will
       return a mask to indicate which  of  the  specified  mouse
       events  can be reported; on complete failure it returns 0.
       If oldmask is non-NULL, this function fills the  indicated
       location  with  the  previous  value of the given window's
       mouse event mask.

       As a side effect, setting a zero mousemask  may  turn  off
       the  mouse pointer; setting a nonzero mask may turn it on.
       Whether this happens is device-dependent.

       Here are the mouse event type masks which may be defined:


       <EM>Name</EM>                     <EM>Description</EM>
       ---------------------------------------------------------------------
       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
       ---------------------------------------------------------------------

       Once a class of mouse events have been made visible  in  a
       window, calling the <STRONG>wgetch</STRONG> function on that window may re-
       turn <STRONG>KEY_MOUSE</STRONG> as an indicator that a mouse event has been
       queued.   To read the event data and pop the event off the
       queue, call <STRONG>getmouse</STRONG>.  This function will return <STRONG>OK</STRONG>  if  a
       mouse  event  is actually visible in the given window, <STRONG>ERR</STRONG>
       otherwise.  When <STRONG>getmouse</STRONG> returns <STRONG>OK</STRONG>, the  data  deposited
       as  y  and  x  in  the event structure coordinates will be
       screen-relative character-cell coordinates.  The  returned
       state  mask  will have exactly one bit set to indicate the
       event type.

       The <STRONG>ungetmouse</STRONG> function behaves  analogously  to  <STRONG>ungetch</STRONG>.
       It  pushes a <STRONG>KEY_MOUSE</STRONG> event onto the input queue, and as-
       sociates with that event the given state data and  screen-
       relative character-cell coordinates.

       The  <STRONG>wenclose</STRONG>  function  tests  whether  a  given  pair of
       screen-relative character-cell coordinates is enclosed  by
       a  given  window, returning TRUE if it is and FALSE other-
       wise.  It is useful for determining  what  subset  of  the
       screen windows enclose the location of a mouse event.

       The <STRONG>wmouse_trafo</STRONG> function transforms a given pair of coor-
       dinates from stdscr-relative  coordinates  to  coordinates
       relative to the given window or vice versa.  Please remem-
       ber, that stdscr-relative coordinates are not always iden-
       tical  to window-relative coordinates due to the mechanism
       to reserve lines on top or bottom of the screen for  other
       purposes (see the <STRONG>ripoffline()</STRONG> and <STRONG>slk_init</STRONG> calls, for ex-
       ample).  If the parameter <STRONG>to_screen</STRONG> is <STRONG>TRUE</STRONG>, the  pointers
       <STRONG>pY,</STRONG> <STRONG>pX</STRONG> must reference the coordinates of a location inside
       the window <STRONG>win</STRONG>.  They are converted to window-relative co-
       ordinates  and returned through the pointers.  If the con-
       version was successful, the function returns <STRONG>TRUE</STRONG>.  If one
       of  the  parameters was NULL or the location is not inside
       the window, <STRONG>FALSE</STRONG> is returned.  If <STRONG>to_screen</STRONG> is <STRONG>FALSE</STRONG>, the
       pointers  <STRONG>pY,</STRONG>  <STRONG>pX</STRONG>  must  reference window-relative coordi-
       nates.  They are converted to stdscr-relative  coordinates
       if  the  window <STRONG>win</STRONG> encloses this point.  In this case the
       function returns <STRONG>TRUE</STRONG>.  If one of the parameters  is  NULL
       or  the point is not inside the window, <STRONG>FALSE</STRONG> is returned.
       Please notice, that the referenced  coordinates  are  only
       replaced  by  the converted coordinates if the transforma-
       tion was successful.

       The <STRONG>mouse_trafo</STRONG> function performs the same translation  as
       <STRONG>wmouse_trafo</STRONG>, using stdscr for <STRONG>win</STRONG>.

       The <STRONG>mouseinterval</STRONG> function sets the maximum time (in thou-
       sands of a second) that can elapse between press  and  re-
       lease  events  for  them to be recognized as a click.  Use
       <STRONG>mouseinterval(0)</STRONG> to disable click resolution.  This  func-
       tion returns the previous interval value.  Use <STRONG>mouseinter-</STRONG>
       <STRONG>val(-1)</STRONG> to obtain the interval without altering  it.   The
       default is one sixth of a second.

       Note  that  mouse  events will be ignored when input is in
       cooked mode, and will cause an error beep when cooked mode
       is  being simulated in a window by a function such as <STRONG>get-</STRONG>
       <STRONG>str</STRONG> that expects a linefeed for input-loop termination.


</PRE>
<H2>RETURN VALUE</H2><PRE>
       <STRONG>getmouse</STRONG> and <STRONG>ungetmouse</STRONG> return the integer <STRONG>ERR</STRONG> upon  fail-
       ure or <STRONG>OK</STRONG> upon successful completion.

              <STRONG>getmouse</STRONG>
                   returns an error.  If no mouse driver was ini-
                   tialized, or if the mask parameter is zero,

              <STRONG>ungetmouse</STRONG>
                   returns an error if the FIFO is full.

       <STRONG>mousemask</STRONG> returns the mask of reportable events.

       <STRONG>mouseinterval</STRONG> returns the previous interval value,  unless
       the  terminal  was  not initialized.  In that case, it re-
       turns the maximum interval value (166).

       <STRONG>wenclose</STRONG> and <STRONG>wmouse_trafo</STRONG> are boolean functions  returning
       <STRONG>TRUE</STRONG> or <STRONG>FALSE</STRONG> depending on their test result.


</PRE>
<H2>PORTABILITY</H2><PRE>
       These  calls  were  designed  for <STRONG><A HREF="ncurses.3x.html">ncurses(3x)</A></STRONG>, and are not
       found in SVr4 curses, 4.4BSD curses, or any other previous
       version of curses.

       The feature macro <STRONG>NCURSES_MOUSE_VERSION</STRONG> is provided so the
       preprocessor can be used to test  whether  these  features
       are  present.   If  the interface is changed, the value of
       <STRONG>NCURSES_MOUSE_VERSION</STRONG> will be incremented.   These  values
       for  <STRONG>NCURSES_MOUSE_VERSION</STRONG> may be specified when configur-
       ing ncurses:

              1  has definitions for reserved events.   The  mask
                 uses 28 bits.

              2  adds definitions for button 5, removes the defi-
                 nitions for reserved events.  The mask  uses  29
                 bits.

       The  order  of the <STRONG>MEVENT</STRONG> structure members is not guaran-
       teed.  Additional fields may be added to the structure  in
       the future.

       Under  <STRONG><A HREF="ncurses.3x.html">ncurses(3x)</A></STRONG>,  these calls are implemented using ei-
       ther xterm's built-in mouse-tracking API or  platform-spe-
       cific drivers including
              Alessandro Rubini's gpm server.
              FreeBSD sysmouse
              OS/2 EMX
       If  you  are  using  an  unsupported  configuration, mouse
       events will not be visible to <STRONG><A HREF="ncurses.3x.html">ncurses(3x)</A></STRONG> (and the  <STRONG>mouse-</STRONG>
       <STRONG>mask</STRONG> function will always return <STRONG>0</STRONG>).

       If  the  terminfo entry contains a <STRONG>XM</STRONG> string, this is used
       in the xterm mouse driver to control the way the  terminal
       is initialized for mouse operation.  The default, if <STRONG>XM</STRONG> is
       not found, corresponds to private mode 1000 of xterm:
              \E[?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.


</PRE>
<H2>BUGS</H2><PRE>
       Mouse  events under xterm will not in fact be ignored dur-
       ing cooked mode, if they have been enabled  by  <STRONG>mousemask</STRONG>.
       Instead,  the  xterm  mouse report sequence will appear in
       the string read.

       Mouse events under xterm will not be detected correctly in
       a  window  with  its keypad bit off, since they are inter-
       preted as a variety of function key.   Your  terminfo  de-
       scription  should  have <STRONG>kmous</STRONG> set to "\E[M" (the beginning
       of the response from xterm for mouse clicks).  Other  val-
       ues  for  <STRONG>kmous</STRONG>  are permitted, but under the same assump-
       tion, i.e., it is the beginning of the response.

       Because there are  no  standard  terminal  responses  that
       would  serve to identify terminals which support the xterm
       mouse protocol, <STRONG>ncurses</STRONG> assumes that if your  $TERM  envi-
       ronment  variable contains "xterm", or <STRONG>kmous</STRONG> is defined in
       the terminal description, then the terminal may send mouse
       events.


</PRE>
<H2>SEE ALSO</H2><PRE>
       <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>, <STRONG><A HREF="curs_kernel.3x.html">curs_kernel(3x)</A></STRONG>, <STRONG><A HREF="curs_slk.3x.html">curs_slk(3x)</A></STRONG>.



                                                         <STRONG><A HREF="curs_mouse.3x.html">curs_mouse(3x)</A></STRONG>
</PRE>
<HR>
<ADDRESS>
Man(1) output converted with
<a href="http://www.oac.uci.edu/indiv/ehood/man2html.html">man2html</a>
</ADDRESS>
</BODY>
</HTML>
