<!-- 
  ****************************************************************************
  * 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_outopts.3x,v 1.26 2015/07/21 00:23:43 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_outopts 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_outopts 3x</H1>
<PRE>
<STRONG><A HREF="curs_outopts.3x.html">curs_outopts(3x)</A></STRONG>                                       <STRONG><A HREF="curs_outopts.3x.html">curs_outopts(3x)</A></STRONG>




</PRE>
<H2><a name="h2-NAME">NAME</a></H2><PRE>
       <STRONG>clearok</STRONG>, <STRONG>idlok</STRONG>, <STRONG>idcok</STRONG>, <STRONG>immedok</STRONG>, <STRONG>leaveok</STRONG>, <STRONG>setscrreg</STRONG>,
       <STRONG>wsetscrreg</STRONG>, <STRONG>scrollok</STRONG>, <STRONG>nl</STRONG>, <STRONG>nonl</STRONG> - <STRONG>curses</STRONG> output options


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

       <STRONG>int</STRONG> <STRONG>clearok(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>bool</STRONG> <EM>bf</EM><STRONG>);</STRONG>
       <STRONG>int</STRONG> <STRONG>idlok(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>bool</STRONG> <EM>bf</EM><STRONG>);</STRONG>
       <STRONG>void</STRONG> <STRONG>idcok(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>bool</STRONG> <EM>bf</EM><STRONG>);</STRONG>
       <STRONG>void</STRONG> <STRONG>immedok(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>bool</STRONG> <EM>bf</EM><STRONG>);</STRONG>
       <STRONG>int</STRONG> <STRONG>leaveok(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>bool</STRONG> <EM>bf</EM><STRONG>);</STRONG>
       <STRONG>int</STRONG> <STRONG>setscrreg(int</STRONG> <EM>top</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>bot</EM><STRONG>);</STRONG>
       <STRONG>int</STRONG> <STRONG>wsetscrreg(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>top</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>bot</EM><STRONG>);</STRONG>
       <STRONG>int</STRONG> <STRONG>scrollok(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>bool</STRONG> <EM>bf</EM><STRONG>);</STRONG>
       <STRONG>int</STRONG> <STRONG>nl(void);</STRONG>
       <STRONG>int</STRONG> <STRONG>nonl(void);</STRONG>


</PRE>
<H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
       These routines set options that change the style of output
       within  <STRONG>curses</STRONG>.   All  options are initially <STRONG>FALSE</STRONG>, unless
       otherwise stated.  It is not necessary to turn  these  op-
       tions off before calling <STRONG>endwin</STRONG>.


</PRE>
<H3><a name="h3-clearok">clearok</a></H3><PRE>
       If  <STRONG>clearok</STRONG> is called with <STRONG>TRUE</STRONG> as argument, the next call
       to <STRONG>wrefresh</STRONG> with this window will clear  the  screen  com-
       pletely  and  redraw the entire screen from scratch.  This
       is useful when the contents of the screen  are  uncertain,
       or  in  some  cases for a more pleasing visual effect.  If
       the <EM>win</EM> argument to <STRONG>clearok</STRONG> is the global variable <STRONG>curscr</STRONG>,
       the  next  call  to  <STRONG>wrefresh</STRONG>  with  any window causes the
       screen to be cleared and repainted from scratch.


</PRE>
<H3><a name="h3-idlok">idlok</a></H3><PRE>
       If <STRONG>idlok</STRONG> is called with <STRONG>TRUE</STRONG> as  second  argument,  <STRONG>curses</STRONG>
       considers using the hardware insert/delete line feature of
       terminals so equipped.  Calling <STRONG>idlok</STRONG> with <STRONG>FALSE</STRONG> as second
       argument  disables  use  of  line  insertion and deletion.
       This option should be  enabled  only  if  the  application
       needs  insert/delete  line, for example, for a screen edi-
       tor.  It is disabled by default because insert/delete line
       tends  to  be  visually annoying when used in applications
       where it is not really needed.  If insert/delete line can-
       not  be  used,  <STRONG>curses</STRONG> redraws the changed portions of all
       lines.


</PRE>
<H3><a name="h3-idcok">idcok</a></H3><PRE>
       If <STRONG>idcok</STRONG> is called with <STRONG>FALSE</STRONG> as second  argument,  <STRONG>curses</STRONG>
       no longer considers using the hardware insert/delete char-
       acter feature of terminals so equipped.  Use of  character
       insert/delete  is  enabled by default.  Calling <STRONG>idcok</STRONG> with
       <STRONG>TRUE</STRONG> as second argument re-enables use of character inser-
       tion and deletion.


</PRE>
<H3><a name="h3-immedok">immedok</a></H3><PRE>
       If  <STRONG>immedok</STRONG> is called with <STRONG>TRUE</STRONG> <STRONG>as</STRONG> <STRONG>argument</STRONG>, any change in
       the window image, such as the ones caused by <STRONG>waddch,</STRONG> <STRONG>wclr-</STRONG>
       <STRONG>tobot,</STRONG>  <STRONG>wscrl</STRONG>,  etc.,  automatically  cause a call to <STRONG>wre-</STRONG>
       <STRONG>fresh</STRONG>.  However, it may degrade performance  considerably,
       due  to repeated calls to <STRONG>wrefresh</STRONG>.  It is disabled by de-
       fault.


</PRE>
<H3><a name="h3-leaveok">leaveok</a></H3><PRE>
       Normally, the hardware cursor is left at the  location  of
       the window cursor being refreshed.  The <STRONG>leaveok</STRONG> option al-
       lows the cursor to be left wherever the update happens  to
       leave  it.  It is useful for applications where the cursor
       is not used, since it reduces the need for cursor motions.


</PRE>
<H3><a name="h3-setscrreg">setscrreg</a></H3><PRE>
       The <STRONG>setscrreg</STRONG> and <STRONG>wsetscrreg</STRONG> routines allow  the  applica-
       tion  programmer  to  set a software scrolling region in a
       window.  The <EM>top</EM> and <EM>bot</EM> parameters are the  line  numbers
       of  the  top  and  bottom  margin of the scrolling region.
       (Line 0 is the top line of the window.)   If  this  option
       and  <STRONG>scrollok</STRONG> are enabled, an attempt to move off the bot-
       tom margin line causes all lines in the  scrolling  region
       to  scroll  one  line  in the direction of the first line.
       Only the text of the window is scrolled.  (Note that  this
       has nothing to do with the use of a physical scrolling re-
       gion capability in the terminal, like that in  the  VT100.
       If  <STRONG>idlok</STRONG>  is  enabled  and  the  terminal  has  either  a
       scrolling region or insert/delete  line  capability,  they
       will probably be used by the output routines.)


</PRE>
<H3><a name="h3-scrollok">scrollok</a></H3><PRE>
       The  <STRONG>scrollok</STRONG> option controls what happens when the cursor
       of a window is  moved  off  the  edge  of  the  window  or
       scrolling  region,  either as a result of a newline action
       on the bottom line, or typing the last  character  of  the
       last line.  If disabled, (<EM>bf</EM> is <STRONG>FALSE</STRONG>), the cursor is left
       on the bottom line.  If enabled, (<EM>bf</EM> is <STRONG>TRUE</STRONG>), the  window
       is  scrolled  up  one  line (Note that to get the physical
       scrolling effect on the terminal, it is also necessary  to
       call <STRONG>idlok</STRONG>).


</PRE>
<H3><a name="h3-nl_-nonl">nl, nonl</a></H3><PRE>
       The  <STRONG>nl</STRONG>  and  <STRONG>nonl</STRONG> routines control whether the underlying
       display device translates the return key into  newline  on
       input,  and  whether it translates newline into return and
       line-feed on output (in either case, the call  <STRONG>addch('\n')</STRONG>
       does the equivalent of return and line feed on the virtual
       screen).  Initially, these translations do occur.  If  you
       disable  them using <STRONG>nonl</STRONG>, <STRONG>curses</STRONG> will be able to make bet-
       ter use of the line-feed capability, resulting  in  faster
       cursor  motion.   Also, <STRONG>curses</STRONG> will then be able to detect
       the return key.


</PRE>
<H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
       The functions <STRONG>setscrreg</STRONG> and <STRONG>wsetscrreg</STRONG> return <STRONG>OK</STRONG> upon suc-
       cess and <STRONG>ERR</STRONG> upon failure.  All other routines that return
       an integer always return <STRONG>OK</STRONG>.

       X/Open Curses does not define any error conditions.

       In this implementation, those functions that have a window
       pointer  will  return  an  error  if the window pointer is
       null.

              <STRONG>wclrtoeol</STRONG>
                   returns an error if  the  cursor  position  is
                   about to wrap.

              <STRONG>wsetscrreg</STRONG>
                   returns  an error if the scrolling region lim-
                   its extend outside the window.

       X/Open does not define any error conditions.  This  imple-
       mentation returns an error if the window pointer is null.


</PRE>
<H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
       These  functions are described in the XSI Curses standard,
       Issue 4.

       The XSI Curses standard is ambiguous on  the  question  of
       whether  <STRONG>raw</STRONG>()  should  disable the CRLF translations con-
       trolled by <STRONG>nl</STRONG>() and <STRONG>nonl</STRONG>().  BSD curses did turn off these
       translations;  AT&amp;T  curses (at least as late as SVr1) did
       not.  We choose to do so, on the theory that a  programmer
       requesting  raw  input wants a clean (ideally 8-bit clean)
       connection that the operating system will not alter.

       Some historic curses implementations had,  as  an  undocu-
       mented  feature,  the  ability  to  do  the  equivalent of
       <STRONG>clearok(...,</STRONG> <STRONG>1)</STRONG> by saying <STRONG>touchwin(stdscr)</STRONG>  or  <STRONG>clear(std-</STRONG>
       <STRONG>scr)</STRONG>.  This will not work under ncurses.

       Earlier  System  V  curses  implementations specified that
       with <STRONG>scrollok</STRONG> enabled, any window modification  triggering
       a  scroll also forced a physical refresh.  XSI Curses does
       not require this, and <STRONG>ncurses</STRONG> avoids doing it  to  perform
       better vertical-motion optimization at <STRONG>wrefresh</STRONG> time.

       The  XSI  Curses standard does not mention that the cursor
       should be made invisible  as  a  side-effect  of  <STRONG>leaveok</STRONG>.
       SVr4  curses  documentation  does  this, but the code does
       not.  Use <STRONG>curs_set</STRONG> to make the cursor invisible.


</PRE>
<H2><a name="h2-NOTES">NOTES</a></H2><PRE>
       Note that <STRONG>clearok</STRONG>, <STRONG>leaveok</STRONG>, <STRONG>scrollok</STRONG>, <STRONG>idcok</STRONG>, <STRONG>nl</STRONG>, <STRONG>nonl</STRONG>  and
       <STRONG>setscrreg</STRONG> may be macros.

       The <STRONG>immedok</STRONG> routine is useful for windows that are used as
       terminal emulators.


</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_addch.3x.html">curs_addch(3x)</A></STRONG>, <STRONG><A HREF="curs_clear.3x.html">curs_clear(3x)</A></STRONG>,
       <STRONG><A HREF="curs_initscr.3x.html">curs_initscr(3x)</A></STRONG>, <STRONG><A HREF="curs_scroll.3x.html">curs_scroll(3x)</A></STRONG>, <STRONG><A HREF="curs_refresh.3x.html">curs_refresh(3x)</A></STRONG>,
       <STRONG><A HREF="curs_variables.3x.html">curs_variables(3x)</A></STRONG>.



                                                       <STRONG><A HREF="curs_outopts.3x.html">curs_outopts(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-clearok">clearok</a></li>
<li><a href="#h3-idlok">idlok</a></li>
<li><a href="#h3-idcok">idcok</a></li>
<li><a href="#h3-immedok">immedok</a></li>
<li><a href="#h3-leaveok">leaveok</a></li>
<li><a href="#h3-setscrreg">setscrreg</a></li>
<li><a href="#h3-scrollok">scrollok</a></li>
<li><a href="#h3-nl_-nonl">nl, nonl</a></li>
</ul>
</li>
<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
<li><a href="#h2-NOTES">NOTES</a></li>
<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
</ul>
</div>
</BODY>
</HTML>
