]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - panel/panel.priv.h
ncurses 5.9 - patch 20121215
[ncurses.git] / panel / panel.priv.h
index 57bf793a007e6b101edd2c73e46a5b1ce22d10a4..76607fb2c0cad688df27210150329fd704a205a7 100644 (file)
@@ -1,7 +1,35 @@
-/* $Id: panel.priv.h,v 1.13 2000/01/15 20:39:53 juergen Exp $ */
-
-#ifndef _PANEL_PRIV_H
-#define _PANEL_PRIV_H
+/****************************************************************************
+ * Copyright (c) 1998-2011,2012 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: panel.priv.h,v 1.25 2012/12/15 23:57:43 tom Exp $ */
+
+#ifndef NCURSES_PANEL_PRIV_H
+#define NCURSES_PANEL_PRIV_H 1
 
 #if HAVE_CONFIG_H
 #  include <ncurses_cfg.h>
 
 #if HAVE_CONFIG_H
 #  include <ncurses_cfg.h>
 #include <string.h>
 #include <assert.h>
 
 #include <string.h>
 #include <assert.h>
 
-#if HAVE_LIBDMALLOC
-#  include <dmalloc.h>    /* Gray Watson's library */
-#endif
-
-#if HAVE_LIBDBMALLOC
-#  include <dbmalloc.h>   /* Conor Cahill's library */
-#endif
+struct screen;              /* forward declaration */
 
 
-#include <nc_panel.h>
+#include "curses.priv.h"    /* includes nc_panel.h */
 #include "panel.h"
 
 #include "panel.h"
 
-#if ( CC_HAS_INLINE_FUNCS && !defined(TRACE) )
-#  define INLINE inline
-#else
-#  define INLINE
-#endif
 
 
-#ifdef USE_RCS_IDS
+#if USE_RCS_IDS
 #  define MODULE_ID(id) static const char Ident[] = id;
 #else
 #  define MODULE_ID(id) /*nothing*/
 #  define MODULE_ID(id) static const char Ident[] = id;
 #else
 #  define MODULE_ID(id) /*nothing*/
 
 
 #ifdef TRACE
 
 
 #ifdef TRACE
-   extern const char *_nc_my_visbuf(const void *);
+   extern NCURSES_EXPORT(const char *) _nc_my_visbuf (const void *);
 #  ifdef TRACE_TXT
 #    define USER_PTR(ptr) _nc_visbuf((const char *)ptr)
 #  else
 #    define USER_PTR(ptr) _nc_my_visbuf((const char *)ptr)
 #  endif
 
 #  ifdef TRACE_TXT
 #    define USER_PTR(ptr) _nc_visbuf((const char *)ptr)
 #  else
 #    define USER_PTR(ptr) _nc_my_visbuf((const char *)ptr)
 #  endif
 
-   extern void _nc_dPanel(const char*, const PANEL*);
-   extern void _nc_dStack(const char*, int, const PANEL*);
-   extern void _nc_Wnoutrefresh(const PANEL*);
-   extern void _nc_Touchpan(const PANEL*);
-   extern void _nc_Touchline(const PANEL*, int, int);
+#  define returnPanel(code)    TRACE_RETURN(code,panel)
+
+   extern NCURSES_EXPORT(PANEL *) _nc_retrace_panel (PANEL *);
+   extern NCURSES_EXPORT(void) _nc_dPanel (const char*, const PANEL*);
+   extern NCURSES_EXPORT(void) _nc_dStack (const char*, int, const PANEL*);
+   extern NCURSES_EXPORT(void) _nc_Wnoutrefresh (const PANEL*);
+   extern NCURSES_EXPORT(void) _nc_Touchpan (const PANEL*);
+   extern NCURSES_EXPORT(void) _nc_Touchline (const PANEL*, int, int);
 
 #  define dBug(x) _tracef x
 #  define dPanel(text,pan) _nc_dPanel(text,pan)
 
 #  define dBug(x) _tracef x
 #  define dPanel(text,pan) _nc_dPanel(text,pan)
@@ -56,6 +76,7 @@
 #  define Touchpan(pan) _nc_Touchpan(pan)
 #  define Touchline(pan,start,count) _nc_Touchline(pan,start,count)
 #else /* !TRACE */
 #  define Touchpan(pan) _nc_Touchpan(pan)
 #  define Touchline(pan,start,count) _nc_Touchline(pan,start,count)
 #else /* !TRACE */
+#  define returnPanel(code)    return code
 #  define dBug(x)
 #  define dPanel(text,pan)
 #  define dStack(fmt,num,pan)
 #  define dBug(x)
 #  define dPanel(text,pan)
 #  define dStack(fmt,num,pan)
 #  define Touchline(pan,start,count) touchline((pan)->win,start,count)
 #endif
 
 #  define Touchline(pan,start,count) touchline((pan)->win,start,count)
 #endif
 
+#if NCURSES_SP_FUNCS
+#define GetScreenHook(sp) \
+                       struct panelhook* ph = NCURSES_SP_NAME(_nc_panelhook)(sp)
+#define GetPanelHook(pan) \
+                       GetScreenHook(pan ? _nc_screen_of((pan)->win) : 0)
+#define GetWindowHook(win) \
+                       SCREEN* sp = _nc_screen_of(win); \
+                       GetScreenHook(sp)
+#define GetHook(pan)   SCREEN* sp = _nc_screen_of(pan->win); \
+                       GetScreenHook(sp)
+
+#define _nc_stdscr_pseudo_panel ((ph)->stdscr_pseudo_panel)
+#define _nc_top_panel           ((ph)->top_panel)
+#define _nc_bottom_panel        ((ph)->bottom_panel)
+
+#else  /* !NCURSES_SP_FUNCS */
+
+#define GetScreenHook(sp) /* nothing */
+#define GetPanelHook(pan) /* nothing */
+#define GetWindowHook(win) /* nothing */
+#define GetHook(pan) /* nothing */
+
 #define _nc_stdscr_pseudo_panel _nc_panelhook()->stdscr_pseudo_panel
 #define _nc_stdscr_pseudo_panel _nc_panelhook()->stdscr_pseudo_panel
-#define _nc_top_panel _nc_panelhook()->top_panel
-#define _nc_bottom_panel _nc_panelhook()->bottom_panel
-
-#define EMPTY_STACK() (_nc_top_panel==_nc_bottom_panel)
-#define Is_Bottom(p)  (((p)!=(PANEL*)0) && !EMPTY_STACK() && (_nc_bottom_panel->above==(p))) 
-#define Is_Top(p) (((p)!=(PANEL*)0) && !EMPTY_STACK() && (_nc_top_panel==(p)))
-#define Is_Pseudo(p) ((p) && ((p)==_nc_bottom_panel))
-
-/* borrowed from curses.priv.h */
-#define CHANGED_RANGE(line,start,end) \
-       if (line->firstchar == _NOCHANGE \
-        || line->firstchar > (start)) \
-               line->firstchar = start; \
-       if (line->lastchar == _NOCHANGE \
-        || line->lastchar < (end)) \
-               line->lastchar = end
+#define _nc_top_panel           _nc_panelhook()->top_panel
+#define _nc_bottom_panel        _nc_panelhook()->bottom_panel
+
+#endif /* NCURSES_SP_FUNCS */
+
+#define EMPTY_STACK() (_nc_top_panel == _nc_bottom_panel)
+#define Is_Bottom(p)  (((p) != (PANEL*)0) && !EMPTY_STACK() && (_nc_bottom_panel->above == (p)))
+#define Is_Top(p)     (((p) != (PANEL*)0) && !EMPTY_STACK() && (_nc_top_panel == (p)))
+#define Is_Pseudo(p)  (((p) != (PANEL*)0) && ((p) == _nc_bottom_panel))
 
 /*+-------------------------------------------------------------------------
        IS_LINKED(pan) - check to see if panel is in the stack
 
 /*+-------------------------------------------------------------------------
        IS_LINKED(pan) - check to see if panel is in the stack
    ix2 = (PENDX(pan1)   < PENDX(pan2))   ? PENDX(pan1)   : PENDX(pan2);\
    iy1 = (PSTARTY(pan1) < PSTARTY(pan2)) ? PSTARTY(pan2) : PSTARTY(pan1);\
    iy2 = (PENDY(pan1)   < PENDY(pan2))   ? PENDY(pan1)   : PENDY(pan2);\
    ix2 = (PENDX(pan1)   < PENDX(pan2))   ? PENDX(pan1)   : PENDX(pan2);\
    iy1 = (PSTARTY(pan1) < PSTARTY(pan2)) ? PSTARTY(pan2) : PSTARTY(pan1);\
    iy2 = (PENDY(pan1)   < PENDY(pan2))   ? PENDY(pan1)   : PENDY(pan2);\
-   assert((ix1<=ix2) && (iy1<=iy2));\
+   assert((ix1<=ix2) && (iy1<=iy2))
 
 
 /*+-------------------------------------------------------------------------
        Walk through the panel stack starting at the given location and
         check for intersections; overlapping panels are "touched", so they
 
 
 /*+-------------------------------------------------------------------------
        Walk through the panel stack starting at the given location and
         check for intersections; overlapping panels are "touched", so they
-        are incrementally overwriting cells that should be hidden. 
+        are incrementally overwriting cells that should be hidden.
         If the "touch" flag is set, the panel gets touched before it is
         If the "touch" flag is set, the panel gets touched before it is
-        updated. 
+        updated.
 ---------------------------------------------------------------------------*/
 ---------------------------------------------------------------------------*/
-#define PANEL_UPDATE(pan,panstart,touch)\
+#define PANEL_UPDATE(pan,panstart)\
 {  PANEL* pan2 = ((panstart) ? (panstart) : _nc_bottom_panel);\
 {  PANEL* pan2 = ((panstart) ? (panstart) : _nc_bottom_panel);\
-   if (touch)\
-      Touchpan(pan);\
-   while(pan2) {\
+   while(pan2 && pan2->win) {\
       if ((pan2 != pan) && PANELS_OVERLAPPED(pan,pan2)) {\
       if ((pan2 != pan) && PANELS_OVERLAPPED(pan,pan2)) {\
-        int y,ix1,ix2,iy1,iy2;\
-        COMPUTE_INTERSECTION(pan,pan2,ix1,ix2,iy1,iy2);\
+        int y, ix1, ix2, iy1, iy2;\
+        COMPUTE_INTERSECTION(pan, pan2, ix1, ix2, iy1, iy2);\
        for(y = iy1; y <= iy2; y++) {\
          if (is_linetouched(pan->win,y - PSTARTY(pan))) {\
             struct ldat* line = &(pan2->win->_line[y - PSTARTY(pan2)]);\
        for(y = iy1; y <= iy2; y++) {\
          if (is_linetouched(pan->win,y - PSTARTY(pan))) {\
             struct ldat* line = &(pan2->win->_line[y - PSTARTY(pan2)]);\
-            CHANGED_RANGE(line,ix1-PSTARTX(pan2),ix2-PSTARTX(pan2));\
+            CHANGED_RANGE(line, ix1 - PSTARTX(pan2), ix2 - PSTARTX(pan2));\
           }\
        }\
       }\
           }\
        }\
       }\
 
 #define HIDE_PANEL(pan,err,err_if_unlinked)\
   if (IS_LINKED(pan)) {\
 
 #define HIDE_PANEL(pan,err,err_if_unlinked)\
   if (IS_LINKED(pan)) {\
-    PANEL_UPDATE(pan,(PANEL*)0,TRUE);\
+    Touchpan(pan);\
+    PANEL_UPDATE(pan,(PANEL*)0);\
     PANEL_UNLINK(pan,err);\
   } \
   else {\
     PANEL_UNLINK(pan,err);\
   } \
   else {\
-    if (err_if_unlinked)\
-      err = ERR;\
+      err = err_if_unlinked;\
   }
 
   }
 
-#endif /* _PANEL_PRIV_H */
+#if NCURSES_SP_FUNCS
+/* These may become later renamed and part of panel.h and the public API */
+extern NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_update_panels)(SCREEN*);
+#endif
+
+#endif /* NCURSES_PANEL_PRIV_H */