plucky (3) mvgetch.3ncurses.gz

Provided by: ncurses-doc_6.5+20250216-1_all bug

NAME

       getch,  wgetch,  mvgetch, mvwgetch, ungetch, has_key - get (or push back) characters from curses terminal
       keyboard buffer

SYNOPSIS

       #include <curses.h>

       int getch(void);
       int wgetch(WINDOW * win);
       int mvgetch(int y, int x);
       int mvwgetch(WINDOW * win, int y, int x);

       int ungetch(int c);

       /* extension */
       int has_key(int c);

DESCRIPTION

   Reading Characters
       wgetch  gathers  a  key  event  from  the  terminal  keyboard  associated  with  a  curses  window   win.
       ncurses(3NCURSES) describes the variants of this function.

       When  input  is  pending,  wgetch  returns  an  integer  identifying  the key event; for alphanumeric and
       punctuation keys, this value corresponds to the character encoding used by  the  terminal.   Use  of  the
       control  key as a modifier, by holding it down while pressing and releasing another key, often results in
       a distinct code.  The behavior of other keys depends on whether win is in  keypad  mode;  see  subsection
       “Keypad Mode” below.

       If  no  input  is  pending,  then  if the no-delay flag is set in the window (see nodelay(3NCURSES)), the
       function returns ERR; otherwise, curses waits until the  terminal  has  input.   If  cbreak(3NCURSES)  or
       raw(3NCURSES)  has  been  called,  this  happens  after  one character is read.  If nocbreak(3NCURSES) or
       noraw(3NCURSES) has been called, it occurs when the  next  newline  is  read.   (Because  the  terminal's
       canonical  or  “cooked”  mode  is line-buffered, multiple wgetch calls may then be necessary to empty the
       input queue.)  If halfdelay(3NCURSES) has been called, curses waits  until  input  is  available  or  the
       specified delay elapses.

       If echo(3NCURSES) has been called, and the window is not a pad, curses writes the returned character c to
       the window (at the cursor position) per the following rules.

       •   If c matches the terminal's erase character (see erasechar(3NCURSES)), the cursor moves leftward  one
           position  and the new position is erased as if wmove(3NCURSES) and then wdelch(3NCURSES) were called.
           When the window's keypad mode is enabled (see below), KEY_LEFT and KEY_BACKSPACE are handled the same
           way.

       •   curses writes any other c to the window, as with wechochar(3NCURSES).

       •   If  the window win has been moved or modified since the last call to wrefresh(3NCURSES), curses calls
           wrefresh on it.

       If c is a carriage return and nl(3NCURSES) has been called, wgetch returns the character  code  for  line
       feed instead.

   Keypad Mode
       To curses, key strokes not from the alphabetic section of the keyboard (those corresponding to the ECMA-6
       character set—see ascii(7)—optionally modified by either the  control  or  shift  keys)  are  treated  as
       function  keys.  (In curses, the term “function key” includes but is not limited to keycaps engraved with
       “F1”, “PF1”, and so on.)  If the window is in keypad mode, these produce a numeric code corresponding  to
       the  KEY_  symbols listed in subsection “Predefined Key Codes” below; otherwise, they transmit a sequence
       of codes typically starting with the escape character, and which must be collected with  multiple  wgetch
       calls.

       •   The  curses.h  header  file declares many predefined function keys whose names begin with KEY_; these
           object-like macros have values outside the range of eight-bit character codes.

       •   In ncurses, user-defined function keys are configured with define_key(3NCURSES); they have no  names,
           but are also expected to have values outside the range of eight-bit codes.

       A variable intended to hold a function key code must thus be of type short or larger.

       Most  terminals  one  encounters  follow  the  ECMA-48  standard  insofar  as their function keys produce
       character sequences prefixed with the escape  character  ESC.   This  fact  implies  that  curses  cannot
       distinguish  a  user's  press  of the escape key (assuming it sends ESC) from the beginning of a function
       key's character sequence without waiting to see if, and how soon, further  input  arrives.   When  curses
       reads  such  an  ambiguous  character, it sets a timer.  If the remainder of the sequence does not arrive
       within the designated time, wgetch returns the prefix character; otherwise, it returns the  function  key
       code  corresponding  to  the  unique  sequence defined by the terminal.  Consequently, a user of a curses
       application may experience a delay after the escape key is pressed while curses disambiguates the  input;
       see section “EXTENSIONS” below.  If the window is in “no time-out” mode, the timer does not expire; it is
       an infinite (or very large) value.  See notimeout(3NCURSES).   Because  function  key  sequences  usually
       begin  with  ESC,  the  terminal may appear to hang in no time-out mode after the user presses the escape
       key.  Generally, further typing “awakens” curses.

   Ungetting Characters
       ungetch places c into the input queue to be returned by the next call to wgetch.  A  single  input  queue
       serves all windows associated with the screen.

   Predefined Key Codes
       The header file curses.h defines the following function key codes.

       •   Except  for the special case of KEY_RESIZE, a window's keypad mode must be enabled for wgetch to read
           these codes from it.

       •   Not all of these are necessarily supported on any particular terminal.

       •   The naming convention may seem  obscure,  with  some  apparent  misspellings  (such  as  “RSUME”  for
           “resume”);  the names correspond to the terminfo capability names for the keys, and were standardized
           before the IBM PC/AT keyboard layout achieved a dominant position in industry.

              Symbol          Key name
              ───────────────────────────────────────────────────────────────────────────────────────────────────
              KEY_BREAK       Break key
              KEY_DOWN
              KEY_UP          Arrow keys
              KEY_LEFT
              KEY_RIGHT
              KEY_HOME        Home key (upward+left arrow)
              KEY_BACKSPACE   Backspace
              KEY_F0          Function keys; space for 64 keys is reserved
              KEY_F(n)        Function key n where 0 ≤ n ≤ 63
              KEY_DL          Delete line
              KEY_IL          Insert line
              KEY_DC          Delete character
              KEY_IC          Insert character/Enter insert mode
              KEY_EIC         Exit insert character mode
              KEY_CLEAR       Clear screen
              KEY_EOS         Clear to end of screen
              KEY_EOL         Clear to end of line
              KEY_SF          Scroll one line forward
              KEY_SR          Scroll one line backward (reverse)
              KEY_NPAGE       Next page/Page up
              KEY_PPAGE       Previous page/Page down
              KEY_STAB        Set tab
              KEY_CTAB        Clear tab
              KEY_CATAB       Clear all tabs
              KEY_ENTER       Enter/Send
              KEY_SRESET      Soft (partial) reset
              KEY_RESET       (Hard) reset
              KEY_PRINT       Print/Copy
              KEY_LL          Home down/Bottom (lower left)

              KEY_A1          Upper left of keypad
              KEY_A3          Upper right of keypad
              KEY_B2          Center of keypad
              KEY_C1          Lower left of keypad
              KEY_C3          Lower right of keypad
              KEY_BTAB        Back tab key
              KEY_BEG         Beg(inning) key
              KEY_CANCEL      Cancel key
              KEY_CLOSE       Close key
              KEY_COMMAND     Cmd (command) key
              KEY_COPY        Copy key
              KEY_CREATE      Create key
              KEY_END         End key
              KEY_EXIT        Exit key
              KEY_FIND        Find key
              KEY_HELP        Help key
              KEY_MARK        Mark key
              KEY_MESSAGE     Message key
              KEY_MOUSE       Mouse event occurred
              KEY_MOVE        Move key
              KEY_NEXT        Next object key
              KEY_OPEN        Open key
              KEY_OPTIONS     Options key
              KEY_PREVIOUS    Previous object key
              KEY_REDO        Redo key
              KEY_REFERENCE   Ref(erence) key
              KEY_REFRESH     Refresh key
              KEY_REPLACE     Replace key
              KEY_RESIZE      Screen resized
              KEY_RESTART     Restart key
              KEY_RESUME      Resume key
              KEY_SAVE        Save key
              KEY_SELECT      Select key
              KEY_SUSPEND     Suspend key
              KEY_UNDO        Undo key
              ───────────────────────────────────────────────────────────────────────────────────────────────────
              KEY_SBEG        Shifted beginning key
              KEY_SCANCEL     Shifted cancel key
              KEY_SCOMMAND    Shifted command key
              KEY_SCOPY       Shifted copy key
              KEY_SCREATE     Shifted create key
              KEY_SDC         Shifted delete character key
              KEY_SDL         Shifted delete line key
              KEY_SEND        Shifted end key
              KEY_SEOL        Shifted clear line key
              KEY_SEXIT       Shifted exit key
              KEY_SFIND       Shifted find key
              KEY_SHELP       Shifted help key
              KEY_SHOME       Shifted home key
              KEY_SIC         Shifted insert key
              KEY_SLEFT       Shifted left arrow key
              KEY_SMESSAGE    Shifted message key
              KEY_SMOVE       Shifted move key
              KEY_SNEXT       Shifted next object key
              KEY_SOPTIONS    Shifted options key
              KEY_SPREVIOUS   Shifted previous object key
              KEY_SPRINT      Shifted print key
              KEY_SREDO       Shifted redo key
              KEY_SREPLACE    Shifted replace key
              KEY_SRIGHT      Shifted right arrow key
              KEY_SRSUME      Shifted resume key
              KEY_SSAVE       Shifted save key
              KEY_SSUSPEND    Shifted suspend key
              KEY_SUNDO       Shifted undo key

       Many keyboards feature a nine-key directional pad.

                                                    ┌─────┬──────┬───────┐
                                                    │ A1  │  up  │  A3   │
                                                    ├─────┼──────┼───────┤
                                                    │left │  B2  │ right │
                                                    ├─────┼──────┼───────┤
                                                    │ C1  │ down │  C3   │
                                                    └─────┴──────┴───────┘
       Two of the symbols in the list above do not correspond to a physical key.

       •   wgetch returns KEY_RESIZE, even if the window's keypad mode is disabled, if  ncurses  has  handled  a
           SIGWINCH signal since wgetch was called; see initscr(3NCURSES) and resizeterm(3NCURSES).

       •   wgetch  returns  KEY_MOUSE to indicate that a mouse event is pending collection; see mouse(3NCURSES).
           Receipt of this code requires a window's keypad mode to be enabled, because to interpret mouse  input
           (as with xterm(1)'s mouse protocol), ncurses must read an escape sequence, as with a function key.

   Testing Key Codes
       In ncurses, has_key returns a Boolean value indicating whether the terminal type recognizes its parameter
       as a key code value.  See also define_key(3NCURSES) and key_defined(3NCURSES).

RETURN VALUE

       wgetch returns a key code identifying the key event as described above, which may include  KEY_RESIZE  or
       KEY_MOUSE indicating non-key events, or ERR on failure.  wgetch fails if

       •   its timeout expires without any data arriving, or

       •   execution was interrupted by a signal, in which case errno is set to EINTR.

       ungetch  returns  OK  on success and ERR on failure.  ungetch fails if there is no more room in the input
       queue.

       has_key returns TRUE or FALSE.

       Functions taking a WINDOW pointer argument fail if win is a null pointer.

       Functions prefixed with “mv” first perform cursor movement and fail if the position (y, x) is outside the
       window boundaries.

NOTES

       getch, mvgetch, and mvwgetch may be implemented as macros.

       curses discourages assignment of the ESC key to a discrete function by the programmer because the library
       requires a delay while it awaits the potential remainder of a terminal escape sequence.

       Some key strokes are indistinguishable from control characters; for example, KEY_ENTER may be the same as
       ^M,  and  KEY_BACKSPACE may be the same as ^H or ^?.  Consult the terminfo entry for the terminal type to
       determine whether this is the case; see infocmp(1).   Some  curses  implementations,  including  ncurses,
       honor the terminfo key definitions; others treat such control characters specially.

       curses  distinguishes  the Enter keys in the alphabetic and numeric keypad sections of a keyboard because
       (most) terminals do.  KEY_ENTER refers to the key on the numeric keypad and, like other function keys, is
       reliably recognized only if the window's keypad mode is enabled.

       •   The  terminfo key_enter (kent) capability describes the character (sequence) sent by the Enter key of
           a terminal's numeric (or similar) keypad.

       •   “Enter or send” is X/Open Curses's description of this key.

       curses treats the Enter or Return key in the alphabetic section of the keyboard differently.

       •   It usually produces a control code for carriage return (^M) or line feed (^J).

       •   Depending  on  the  terminal  mode  (raw,  cbreak,  or  canonical),  and  whether   nl(3NCURSES)   or
           nonl(3NCURSES) has been called, wgetch may return either a carriage return or line feed upon an Enter
           or Return key stroke.

       Use of wgetch with echo(3NCURSES) and neither cbreak(3NCURSES) nor raw(3NCURSES) is not well-defined.

       Historically, the list of key code macros above was influenced by the keyboard of  the  AT&T  7300  (also
       known  variously as the “3B1”, “Safari 4”, and “UNIX PC”), a 1985 machine rich in function keys.  Today's
       computer keyboards are based on that of the IBM PC/AT and tend to have fewer.  A curses  application  can
       expect  such  a  keyboard to transmit key codes KEY_UP, KEY_DOWN, KEY_LEFT, KEY_RIGHT, KEY_HOME, KEY_END,
       KEY_PPAGE (Page Up), KEY_NPAGE (Page Down), KEY_IC (Insert), KEY_DC  (Delete),  KEY_A1,  KEY_A3,  KEY_B2,
       KEY_C1, KEY_C3, and KEY_F(n) for 1 ≤ n ≤ 12.

EXTENSIONS

       In  ncurses, when a window's “no time-out” mode is not set, the ESCDELAY variable configures the duration
       of the timer used to disambiguate a function  key  character  sequence  from  a  series  of  key  strokes
       beginning with ESC typed by the user; see curses_variables(3NCURSES).

       has_key  is  an  ncurses extension, and is not found in SVr4 curses, 4.4BSD curses, or any other previous
       curses implementation.

PORTABILITY

       Applications  employing  ncurses  extensions  should  condition  their  use  on  the  visibility  of  the
       NCURSES_VERSION preprocessor macro.

       Except  as  noted  in  section  “EXTENSIONS”  above, X/Open Curses Issue 4 describes these functions.  It
       specifies no error conditions for them.

       SVr4 describes a successful return value only as “an integer value other than ERR”.

       wgetch reads only single-byte characters.

       The echo behavior of these functions on input of KEY_ or backspace characters is not documented  in  SVr4
       curses.

       The  behavior  of  wgetch  in  the  presence  of  signal handlers is not documented in SVr4 curses and is
       unspecified by X/Open Curses.  In historical curses implementations, it varied depending on  whether  the
       operating system's dispatch of a signal to a handler interrupted a read(2) call in progress, and also (in
       some implementations) whether an input timeout or non-blocking mode had  been  set.   A  portable  curses
       application  prepares  for two cases: (a) signal receipt does not interrupt wgetch; or (b) signal receipt
       interrupts wgetch and causes it to return ERR with errno set to EINTR.

       KEY_MOUSE is mentioned in X/Open Curses, along with a few related terminfo capabilities, but  no  higher-
       level functions use the feature.  The implementation in ncurses is an extension.

       KEY_RESIZE and has_key are extensions first implemented for ncurses.  By 2022, PDCurses and NetBSD curses
       had added them along with KEY_MOUSE.

SEE ALSO

       ECMA-6 “7-bit coded Character Set”  <https://ecma-international.org/publications-and-standards/standards/
       ecma-6/>

       ECMA-48    “Control    Functions    for    Coded    Character    Sets”   <https://ecma-international.org/
       publications-and-standards/standards/ecma-48/>

       get_wch(3NCURSES)  describes  comparable  functions  of  the  ncurses  library  in   its   wide-character
       configuration (ncursesw).

       ncurses(3NCURSES), addch(3NCURSES), inopts(3NCURSES), mouse(3NCURSES), move(3NCURSES), outopts(3NCURSES),
       refresh(3NCURSES), curses_variables(3NCURSES), resizeterm(3NCURSES), ascii(7)