<!-- 
  ****************************************************************************
  * Copyright (c) 1998-2013,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_overlay.3x,v 1.18 2015/07/21 00:51:31 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_overlay 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_overlay 3x</H1>
<PRE>
<STRONG><A HREF="curs_overlay.3x.html">curs_overlay(3x)</A></STRONG>                                       <STRONG><A HREF="curs_overlay.3x.html">curs_overlay(3x)</A></STRONG>




</PRE>
<H2><a name="h2-NAME">NAME</a></H2><PRE>
       <STRONG>overlay</STRONG>, <STRONG>overwrite</STRONG>, <STRONG>copywin</STRONG> - overlay and manipulate
       overlapped <STRONG>curses</STRONG> windows


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

       <STRONG>int</STRONG> <STRONG>overlay(const</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>srcwin</EM><STRONG>,</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>dstwin</EM><STRONG>);</STRONG>
       <STRONG>int</STRONG> <STRONG>overwrite(const</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>srcwin</EM><STRONG>,</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>dstwin</EM><STRONG>);</STRONG>
       <STRONG>int</STRONG> <STRONG>copywin(const</STRONG>  <STRONG>WINDOW</STRONG>  <STRONG>*</STRONG><EM>srcwin</EM><STRONG>,</STRONG>  <STRONG>WINDOW</STRONG>  <STRONG>*</STRONG><EM>dstwin</EM><STRONG>,</STRONG>  <STRONG>int</STRONG>
       <EM>sminrow</EM><STRONG>,</STRONG>
             <STRONG>int</STRONG> <EM>smincol</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>dminrow</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>dmincol</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>dmaxrow</EM><STRONG>,</STRONG>
             <STRONG>int</STRONG> <EM>dmaxcol</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>overlay</EM><STRONG>);</STRONG>


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

</PRE>
<H3><a name="h3-overlay_-overwrite">overlay, overwrite</a></H3><PRE>
       The  <STRONG>overlay</STRONG>  and <STRONG>overwrite</STRONG> routines overlay <EM>srcwin</EM> on top
       of <EM>dstwin</EM>.  <EM>scrwin</EM> and <EM>dstwin</EM> are not required to  be  the
       same  size;  only  text  where  the two windows overlap is
       copied.  The difference is that <STRONG>overlay</STRONG> is non-destructive
       (blanks are not copied) whereas <STRONG>overwrite</STRONG> is destructive.


</PRE>
<H3><a name="h3-copywin">copywin</a></H3><PRE>
       The  <STRONG>copywin</STRONG>  routine provides a finer granularity of con-
       trol over the <STRONG>overlay</STRONG> and <STRONG>overwrite</STRONG> routines.  As  in  the
       <STRONG>prefresh</STRONG> routine, a rectangle is specified in the destina-
       tion window, (<EM>dminrow</EM>, <EM>dmincol</EM>)  and  (<EM>dmaxrow</EM>,  <EM>dmaxcol</EM>),
       and  the  upper-left-corner coordinates of the source win-
       dow, (<EM>sminrow</EM>, <EM>smincol</EM>).  If the argument <EM>overlay</EM> is <STRONG>true</STRONG>,
       then copying is non-destructive, as in <STRONG>overlay</STRONG>.


</PRE>
<H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
       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.

       X/Open  defines  no error conditions.  In this implementa-
       tion, <STRONG>copywin</STRONG>, <STRONG>overlay</STRONG> and <STRONG>overwrite</STRONG> return  an  error  if
       either of the window pointers are null, or if some part of
       the window would be placed off-screen.


</PRE>
<H2><a name="h2-NOTES">NOTES</a></H2><PRE>
       Note that <STRONG>overlay</STRONG> and <STRONG>overwrite</STRONG> may be macros.


</PRE>
<H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
       The XSI Curses standard, Issue 4 describes these functions
       (adding the const qualifiers).  It further specifies their
       behavior in the presence of characters with multibyte ren-
       ditions (not yet supported in this implementation).


</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_pad.3x.html">curs_pad(3x)</A></STRONG>, <STRONG><A HREF="curs_refresh.3x.html">curs_refresh(3x)</A></STRONG>



                                                       <STRONG><A HREF="curs_overlay.3x.html">curs_overlay(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-overlay_-overwrite">overlay, overwrite</a></li>
<li><a href="#h3-copywin">copywin</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>
