<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<!-- 
  ****************************************************************************
  * Copyright (c) 1998-2003,2007 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.10 2007/06/02 20:40:07 tom Exp @
-->
<HTML>
<HEAD>
<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>curs_termattrs 3x</H1>
<HR>
<PRE>
<!-- Manpage converted by man2html 3.0.1 -->
<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>NAME</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>SYNOPSIS</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>DESCRIPTION</H2><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.

       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.

       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>.

       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.

       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.

       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>termattrs</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  use-
       ful  when a <STRONG>curses</STRONG> program needs complete control over the
       appearance of the screen.

       The <STRONG>termname</STRONG> routine returns the  terminal  name  used  by
       <STRONG>setupterm</STRONG>.


</PRE>
<H2>RETURN VALUE</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>NOTES</H2><PRE>
       Note that <STRONG>termattrs</STRONG> may be a macro.


</PRE>
<H2>PORTABILITY</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>SEE ALSO</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>
<HR>
<ADDRESS>
Man(1) output converted with
<a href="http://www.oac.uci.edu/indiv/ehood/man2html.html">man2html</a>
</ADDRESS>
</BODY>
</HTML>
