<!-- 
  ****************************************************************************
  * Copyright (c) 1998-2010,2015 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_termattrs.3x,v 1.13 2015/07/21 00:03:34 tom Exp @
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="generator" content="Manpage converted by man2html - see http://invisible-island.net/scripts/readme.html#others_scripts">
<TITLE>curs_termattrs 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 class="no-header">curs_termattrs 3x</H1>
<PRE>
<STRONG><A HREF="curs_termattrs.3x.html">curs_termattrs(3x)</A></STRONG>                                   <STRONG><A HREF="curs_termattrs.3x.html">curs_termattrs(3x)</A></STRONG>




</PRE>
<H2><a name="h2-NAME">NAME</a></H2><PRE>
       <STRONG>baudrate</STRONG>, <STRONG>erasechar</STRONG>, <STRONG>erasewchar</STRONG>, <STRONG>has_ic</STRONG>, <STRONG>has_il</STRONG>, <STRONG>killchar</STRONG>,
       <STRONG>killwchar</STRONG>, <STRONG>longname</STRONG>,  <STRONG>term_attrs</STRONG>,  <STRONG>termattrs</STRONG>,  <STRONG>termname</STRONG>  -
       <STRONG>curses</STRONG> environment query routines


</PRE>
<H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>

       <STRONG>int</STRONG> <STRONG>baudrate(void);</STRONG>
       <STRONG>char</STRONG> <STRONG>erasechar(void);</STRONG>
       <STRONG>int</STRONG> <STRONG>erasewchar(wchar_t</STRONG> <STRONG>*</STRONG><EM>ch</EM><STRONG>);</STRONG>
       <STRONG>bool</STRONG> <STRONG>has_ic(void);</STRONG>
       <STRONG>bool</STRONG> <STRONG>has_il(void);</STRONG>
       <STRONG>char</STRONG> <STRONG>killchar(void);</STRONG>
       <STRONG>int</STRONG> <STRONG>killwchar(wchar_t</STRONG> <STRONG>*</STRONG><EM>ch</EM><STRONG>);</STRONG>
       <STRONG>char</STRONG> <STRONG>*longname(void);</STRONG>
       <STRONG>attr_t</STRONG> <STRONG>term_attrs(void);</STRONG>
       <STRONG>chtype</STRONG> <STRONG>termattrs(void);</STRONG>
       <STRONG>char</STRONG> <STRONG>*termname(void);</STRONG>


</PRE>
<H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>

</PRE>
<H3><a name="h3-baudrate">baudrate</a></H3><PRE>
       The  <STRONG>baudrate</STRONG> routine returns the output speed of the ter-
       minal.  The number returned is in  bits  per  second,  for
       example <STRONG>9600</STRONG>, and is an integer.


</PRE>
<H3><a name="h3-erasechar_-erasewchar">erasechar, erasewchar</a></H3><PRE>
       The  <STRONG>erasechar</STRONG>  routine  returns  the user's current erase
       character.

       The <STRONG>erasewchar</STRONG> routine stores the current erase  character
       in  the  location referenced by <EM>ch</EM>.  If no erase character
       has been defined, the routine fails and the location  ref-
       erenced by <EM>ch</EM> is not changed.


</PRE>
<H3><a name="h3-has_is_-has_il">has_is, has_il</a></H3><PRE>
       The <STRONG>has_ic</STRONG> routine is true if the terminal has insert- and
       delete- character capabilities.

       The <STRONG>has_il</STRONG> routine is true if the terminal has insert- and
       delete-line  capabilities,  or  can  simulate  them  using
       scrolling regions.  This might be used to determine if  it
       would  be  appropriate to turn on physical scrolling using
       <STRONG>scrollok</STRONG>.


</PRE>
<H3><a name="h3-killchar_-killwchar">killchar, killwchar</a></H3><PRE>
       The <STRONG>killchar</STRONG> routine returns the user's current line  kill
       character.

       The <STRONG>killwchar</STRONG> routine stores the current line-kill charac-
       ter in the location referenced by  <EM>ch</EM>.   If  no  line-kill
       character  has  been  defined,  the  routine fails and the
       location referenced by <EM>ch</EM> is not changed.


</PRE>
<H3><a name="h3-longname">longname</a></H3><PRE>
       The <STRONG>longname</STRONG> routine returns a pointer to  a  static  area
       containing  a verbose description of the current terminal.
       The maximum length of a verbose description is 128 charac-
       ters.   It  is  defined  only after the call to <STRONG>initscr</STRONG> or
       <STRONG>newterm</STRONG>.  The area is overwritten by each call to  <STRONG>newterm</STRONG>
       and  is  not  restored by <STRONG>set_term</STRONG>, so the value should be
       saved between calls to <STRONG>newterm</STRONG> if <STRONG>longname</STRONG> is going to  be
       used with multiple terminals.


</PRE>
<H3><a name="h3-termattrs_-term_attrs">termattrs, term_attrs</a></H3><PRE>
       If  a  given  terminal  does not support a video attribute
       that an application program is trying to use,  <STRONG>curses</STRONG>  may
       substitute  a  different video attribute for it.  The <STRONG>ter-</STRONG>
       <STRONG>mattrs</STRONG> and <STRONG>term_attrs</STRONG> functions return a logical <STRONG>OR</STRONG> of all
       video  attributes  supported  by the terminal using <EM>A</EM><STRONG>_</STRONG> and
       <EM>WA</EM><STRONG>_</STRONG> constants respectively.  This  information  is  useful
       when  a  <STRONG>curses</STRONG>  program  needs  complete control over the
       appearance of the screen.


</PRE>
<H3><a name="h3-termname">termname</a></H3><PRE>
       The <STRONG>termname</STRONG> routine returns the  terminal  name  used  by
       <STRONG>setupterm</STRONG>.


</PRE>
<H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
       <STRONG>longname</STRONG> and <STRONG>termname</STRONG> return <STRONG>NULL</STRONG> on error.

       Routines  that  return  an integer return <STRONG>ERR</STRONG> upon failure
       and <STRONG>OK</STRONG> (SVr4 only specifies "an integer value  other  than
       <STRONG>ERR</STRONG>") upon successful completion.


</PRE>
<H2><a name="h2-NOTES">NOTES</a></H2><PRE>
       Note that <STRONG>termattrs</STRONG> may be a macro.


</PRE>
<H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
       The  XSI  Curses  standard,  Issue 4 describes these func-
       tions.  It changes the return type of <STRONG>termattrs</STRONG> to the new
       type  <STRONG>attr_t</STRONG>.  Most versions of curses truncate the result
       returned by <STRONG>termname</STRONG> to 14 characters.


</PRE>
<H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
       <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>, <STRONG><A HREF="curs_initscr.3x.html">curs_initscr(3x)</A></STRONG>, <STRONG><A HREF="curs_outopts.3x.html">curs_outopts(3x)</A></STRONG>



                                                     <STRONG><A HREF="curs_termattrs.3x.html">curs_termattrs(3x)</A></STRONG>
</PRE>
<div class="nav">
<ul>
<li><a href="#h2-NAME">NAME</a></li>
<li><a href="#h2-SYNOPSIS">SYNOPSIS</a></li>
<li><a href="#h2-DESCRIPTION">DESCRIPTION</a>
<ul>
<li><a href="#h3-baudrate">baudrate</a></li>
<li><a href="#h3-erasechar_-erasewchar">erasechar, erasewchar</a></li>
<li><a href="#h3-has_is_-has_il">has_is, has_il</a></li>
<li><a href="#h3-killchar_-killwchar">killchar, killwchar</a></li>
<li><a href="#h3-longname">longname</a></li>
<li><a href="#h3-termattrs_-term_attrs">termattrs, term_attrs</a></li>
<li><a href="#h3-termname">termname</a></li>
</ul>
</li>
<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
<li><a href="#h2-NOTES">NOTES</a></li>
<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
</ul>
</div>
</BODY>
</HTML>
