<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<!-- 
  ****************************************************************************
  * Copyright (c) 1998-2005,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_outopts.3x,v 1.21 2007/06/02 20:40:07 tom Exp @
-->
<HTML>
<HEAD>
<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>curs_outopts 3x</H1>
<HR>
<PRE>
<!-- Manpage converted by man2html 3.0.1 -->
<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>NAME</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>SYNOPSIS</H2><PRE>
       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>

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


</PRE>
<H2>DESCRIPTION</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>.

       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.

       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.

       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.

       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.

       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.

       The  <STRONG>setscrreg</STRONG>  and <STRONG>wsetscrreg</STRONG> routines allow the applica-
       tion programmer to set a software scrolling  region  in  a
       window.   <EM>top</EM>  and <EM>bot</EM> 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 en-
       abled, an attempt to move off the bottom margin line caus-
       es 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 region capability  in
       the terminal, like that in the VT100.  If <STRONG>idlok</STRONG> is enabled
       and the terminal has either  a  scrolling  region  or  in-
       sert/delete line capability, they will probably be used by
       the output routines.)

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

       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>RETURN VALUE</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 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>PORTABILITY</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>NOTES</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>SEE ALSO</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_outopts.3x.html">curs_outopts(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>
