xref: /freebsd-src/contrib/ncurses/panel/panel.priv.h (revision 7a65641922f404b84e9a249d48593de84d8e8d17)
118259542SPeter Wemm /****************************************************************************
2e1865124SBaptiste Daroussin  * Copyright 2020 Thomas E. Dickey                                          *
3e1865124SBaptiste Daroussin  * Copyright 1998-2014,2017 Free Software Foundation, Inc.                  *
418259542SPeter Wemm  *                                                                          *
518259542SPeter Wemm  * Permission is hereby granted, free of charge, to any person obtaining a  *
618259542SPeter Wemm  * copy of this software and associated documentation files (the            *
718259542SPeter Wemm  * "Software"), to deal in the Software without restriction, including      *
818259542SPeter Wemm  * without limitation the rights to use, copy, modify, merge, publish,      *
918259542SPeter Wemm  * distribute, distribute with modifications, sublicense, and/or sell       *
1018259542SPeter Wemm  * copies of the Software, and to permit persons to whom the Software is    *
1118259542SPeter Wemm  * furnished to do so, subject to the following conditions:                 *
1218259542SPeter Wemm  *                                                                          *
1318259542SPeter Wemm  * The above copyright notice and this permission notice shall be included  *
1418259542SPeter Wemm  * in all copies or substantial portions of the Software.                   *
1518259542SPeter Wemm  *                                                                          *
1618259542SPeter Wemm  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
1718259542SPeter Wemm  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
1818259542SPeter Wemm  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
1918259542SPeter Wemm  * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
2018259542SPeter Wemm  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
2118259542SPeter Wemm  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
2218259542SPeter Wemm  * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
2318259542SPeter Wemm  *                                                                          *
2418259542SPeter Wemm  * Except as contained in this notice, the name(s) of the above copyright   *
2518259542SPeter Wemm  * holders shall not be used in advertising or otherwise to promote the     *
2618259542SPeter Wemm  * sale, use or other dealings in this Software without prior written       *
2718259542SPeter Wemm  * authorization.                                                           *
2818259542SPeter Wemm  ****************************************************************************/
2918259542SPeter Wemm 
30*7a656419SBaptiste Daroussin /* $Id: panel.priv.h,v 1.30 2020/09/26 18:05:32 tom Exp $ */
310e3d5408SPeter Wemm 
327a69bbfbSPeter Wemm #ifndef NCURSES_PANEL_PRIV_H
337a69bbfbSPeter Wemm #define NCURSES_PANEL_PRIV_H 1
34aae38d10SBaptiste Daroussin /* *INDENT-OFF* */
350e3d5408SPeter Wemm 
360e3d5408SPeter Wemm #if HAVE_CONFIG_H
370e3d5408SPeter Wemm #  include <ncurses_cfg.h>
380e3d5408SPeter Wemm #endif
390e3d5408SPeter Wemm 
400e3d5408SPeter Wemm #include <stdlib.h>
410e3d5408SPeter Wemm #include <string.h>
420e3d5408SPeter Wemm #include <assert.h>
430e3d5408SPeter Wemm 
4406bfebdeSXin LI struct screen;              /* forward declaration */
4506bfebdeSXin LI 
4606bfebdeSXin LI #include "curses.priv.h"    /* includes nc_panel.h */
47aae38d10SBaptiste Daroussin 
48aae38d10SBaptiste Daroussin #define NCURSES_OPAQUE_PANEL 0
49aae38d10SBaptiste Daroussin 
500e3d5408SPeter Wemm #include "panel.h"
5106bfebdeSXin LI 
520e3d5408SPeter Wemm #ifdef TRACE
53*7a656419SBaptiste Daroussin    extern PANEL_EXPORT(const char *) _nc_my_visbuf (const void *, int);
540e3d5408SPeter Wemm #  ifdef TRACE_TXT
55*7a656419SBaptiste Daroussin #    define USER_PTR(ptr,n) _nc_visbuf2(n, (const char *)ptr)
560e3d5408SPeter Wemm #  else
57*7a656419SBaptiste Daroussin #    define USER_PTR(ptr,n) _nc_my_visbuf((const char *)ptr, n)
580e3d5408SPeter Wemm #  endif
590e3d5408SPeter Wemm 
60aae38d10SBaptiste Daroussin #  define returnPanel(code)	TRACE_RETURN1(code,panel)
614a1a9510SRong-En Fan 
62*7a656419SBaptiste Daroussin    extern PANEL_EXPORT(PANEL *) _nc_retrace_panel (PANEL *);
63*7a656419SBaptiste Daroussin    extern PANEL_EXPORT(void) _nc_dPanel (const char*, const PANEL*);
64*7a656419SBaptiste Daroussin    extern PANEL_EXPORT(void) _nc_dStack (const char*, int, const PANEL*);
65*7a656419SBaptiste Daroussin    extern PANEL_EXPORT(void) _nc_Wnoutrefresh (const PANEL*);
66*7a656419SBaptiste Daroussin    extern PANEL_EXPORT(void) _nc_Touchpan (const PANEL*);
67*7a656419SBaptiste Daroussin    extern PANEL_EXPORT(void) _nc_Touchline (const PANEL*, int, int);
680e3d5408SPeter Wemm 
690e3d5408SPeter Wemm #  define dBug(x) _tracef x
700e3d5408SPeter Wemm #  define dPanel(text,pan) _nc_dPanel(text,pan)
710e3d5408SPeter Wemm #  define dStack(fmt,num,pan) _nc_dStack(fmt,num,pan)
720e3d5408SPeter Wemm #  define Wnoutrefresh(pan) _nc_Wnoutrefresh(pan)
730e3d5408SPeter Wemm #  define Touchpan(pan) _nc_Touchpan(pan)
740e3d5408SPeter Wemm #  define Touchline(pan,start,count) _nc_Touchline(pan,start,count)
750e3d5408SPeter Wemm #else /* !TRACE */
764a1a9510SRong-En Fan #  define returnPanel(code)	return code
770e3d5408SPeter Wemm #  define dBug(x)
780e3d5408SPeter Wemm #  define dPanel(text,pan)
790e3d5408SPeter Wemm #  define dStack(fmt,num,pan)
800e3d5408SPeter Wemm #  define Wnoutrefresh(pan) wnoutrefresh((pan)->win)
810e3d5408SPeter Wemm #  define Touchpan(pan) touchwin((pan)->win)
820e3d5408SPeter Wemm #  define Touchline(pan,start,count) touchline((pan)->win,start,count)
830e3d5408SPeter Wemm #endif
840e3d5408SPeter Wemm 
8506bfebdeSXin LI #if NCURSES_SP_FUNCS
8606bfebdeSXin LI #define GetScreenHook(sp) \
8706bfebdeSXin LI 			struct panelhook* ph = NCURSES_SP_NAME(_nc_panelhook)(sp)
8806bfebdeSXin LI #define GetPanelHook(pan) \
8973f0a83dSXin LI 			GetScreenHook(pan ? _nc_screen_of((pan)->win) : 0)
9006bfebdeSXin LI #define GetWindowHook(win) \
9106bfebdeSXin LI 			SCREEN* sp = _nc_screen_of(win); \
9206bfebdeSXin LI 			GetScreenHook(sp)
9306bfebdeSXin LI #define GetHook(pan)	SCREEN* sp = _nc_screen_of(pan->win); \
9406bfebdeSXin LI 			GetScreenHook(sp)
9506bfebdeSXin LI 
9606bfebdeSXin LI #define _nc_stdscr_pseudo_panel ((ph)->stdscr_pseudo_panel)
9706bfebdeSXin LI #define _nc_top_panel           ((ph)->top_panel)
9806bfebdeSXin LI #define _nc_bottom_panel        ((ph)->bottom_panel)
9906bfebdeSXin LI 
10006bfebdeSXin LI #else	/* !NCURSES_SP_FUNCS */
10106bfebdeSXin LI 
10206bfebdeSXin LI #define GetScreenHook(sp) /* nothing */
10306bfebdeSXin LI #define GetPanelHook(pan) /* nothing */
10406bfebdeSXin LI #define GetWindowHook(win) /* nothing */
10506bfebdeSXin LI #define GetHook(pan) /* nothing */
10606bfebdeSXin LI 
1070e3d5408SPeter Wemm #define _nc_stdscr_pseudo_panel _nc_panelhook()->stdscr_pseudo_panel
1080e3d5408SPeter Wemm #define _nc_top_panel           _nc_panelhook()->top_panel
1090e3d5408SPeter Wemm #define _nc_bottom_panel        _nc_panelhook()->bottom_panel
1100e3d5408SPeter Wemm 
11106bfebdeSXin LI #endif	/* NCURSES_SP_FUNCS */
11206bfebdeSXin LI 
1131759abf3SPeter Wemm #define EMPTY_STACK() (_nc_top_panel == _nc_bottom_panel)
1141759abf3SPeter Wemm #define Is_Bottom(p)  (((p) != (PANEL*)0) && !EMPTY_STACK() && (_nc_bottom_panel->above == (p)))
1151759abf3SPeter Wemm #define Is_Top(p)     (((p) != (PANEL*)0) && !EMPTY_STACK() && (_nc_top_panel == (p)))
11606bfebdeSXin LI #define Is_Pseudo(p)  (((p) != (PANEL*)0) && ((p) == _nc_bottom_panel))
1170e3d5408SPeter Wemm 
1181759abf3SPeter Wemm /*+-------------------------------------------------------------------------
11915589c42SPeter Wemm 	IS_LINKED(pan) - check to see if panel is in the stack
1201759abf3SPeter Wemm --------------------------------------------------------------------------*/
1211759abf3SPeter Wemm /* This works! The only case where it would fail is, when the list has
1221759abf3SPeter Wemm    only one element. But this could only be the pseudo panel at the bottom */
12315589c42SPeter Wemm #define IS_LINKED(p) (((p)->above || (p)->below ||((p)==_nc_bottom_panel)) ? TRUE : FALSE)
1241759abf3SPeter Wemm 
1251759abf3SPeter Wemm #define PSTARTX(pan) ((pan)->win->_begx)
12615589c42SPeter Wemm #define PENDX(pan)   ((pan)->win->_begx + getmaxx((pan)->win) - 1)
1271759abf3SPeter Wemm #define PSTARTY(pan) ((pan)->win->_begy)
12815589c42SPeter Wemm #define PENDY(pan)   ((pan)->win->_begy + getmaxy((pan)->win) - 1)
1291759abf3SPeter Wemm 
1301759abf3SPeter Wemm /*+-------------------------------------------------------------------------
1311759abf3SPeter Wemm 	PANELS_OVERLAPPED(pan1,pan2) - check panel overlapped
1321759abf3SPeter Wemm ---------------------------------------------------------------------------*/
1331759abf3SPeter Wemm #define PANELS_OVERLAPPED(pan1,pan2) \
1341759abf3SPeter Wemm (( !(pan1) || !(pan2) || \
13515589c42SPeter Wemm        PSTARTY(pan1) > PENDY(pan2) || PENDY(pan1) < PSTARTY(pan2) ||\
13615589c42SPeter Wemm        PSTARTX(pan1) > PENDX(pan2) || PENDX(pan1) < PSTARTX(pan2) ) \
1371759abf3SPeter Wemm      ? FALSE : TRUE)
1381759abf3SPeter Wemm 
1391759abf3SPeter Wemm 
14015589c42SPeter Wemm /*+-------------------------------------------------------------------------
14115589c42SPeter Wemm 	Compute the intersection rectangle of two overlapping rectangles
14215589c42SPeter Wemm ---------------------------------------------------------------------------*/
14315589c42SPeter Wemm #define COMPUTE_INTERSECTION(pan1,pan2,ix1,ix2,iy1,iy2)\
14415589c42SPeter Wemm    ix1 = (PSTARTX(pan1) < PSTARTX(pan2)) ? PSTARTX(pan2) : PSTARTX(pan1);\
14515589c42SPeter Wemm    ix2 = (PENDX(pan1)   < PENDX(pan2))   ? PENDX(pan1)   : PENDX(pan2);\
14615589c42SPeter Wemm    iy1 = (PSTARTY(pan1) < PSTARTY(pan2)) ? PSTARTY(pan2) : PSTARTY(pan1);\
14715589c42SPeter Wemm    iy2 = (PENDY(pan1)   < PENDY(pan2))   ? PENDY(pan1)   : PENDY(pan2);\
14806bfebdeSXin LI    assert((ix1<=ix2) && (iy1<=iy2))
14915589c42SPeter Wemm 
15015589c42SPeter Wemm 
15115589c42SPeter Wemm /*+-------------------------------------------------------------------------
15215589c42SPeter Wemm 	Walk through the panel stack starting at the given location and
15315589c42SPeter Wemm         check for intersections; overlapping panels are "touched", so they
15415589c42SPeter Wemm         are incrementally overwriting cells that should be hidden.
15515589c42SPeter Wemm         If the "touch" flag is set, the panel gets touched before it is
15615589c42SPeter Wemm         updated.
15715589c42SPeter Wemm ---------------------------------------------------------------------------*/
1587a69bbfbSPeter Wemm #define PANEL_UPDATE(pan,panstart)\
15915589c42SPeter Wemm {  PANEL* pan2 = ((panstart) ? (panstart) : _nc_bottom_panel);\
16073f0a83dSXin LI    while(pan2 && pan2->win) {\
1611759abf3SPeter Wemm       if ((pan2 != pan) && PANELS_OVERLAPPED(pan,pan2)) {\
16215589c42SPeter Wemm         int y, ix1, ix2, iy1, iy2;\
16315589c42SPeter Wemm         COMPUTE_INTERSECTION(pan, pan2, ix1, ix2, iy1, iy2);\
16415589c42SPeter Wemm 	for(y = iy1; y <= iy2; y++) {\
16515589c42SPeter Wemm 	  if (is_linetouched(pan->win,y - PSTARTY(pan))) {\
16615589c42SPeter Wemm             struct ldat* line = &(pan2->win->_line[y - PSTARTY(pan2)]);\
16715589c42SPeter Wemm             CHANGED_RANGE(line, ix1 - PSTARTX(pan2), ix2 - PSTARTX(pan2));\
16815589c42SPeter Wemm           }\
1691759abf3SPeter Wemm 	}\
1701759abf3SPeter Wemm       }\
1711759abf3SPeter Wemm       pan2 = pan2->above;\
1721759abf3SPeter Wemm    }\
1731759abf3SPeter Wemm }
17415589c42SPeter Wemm 
17515589c42SPeter Wemm /*+-------------------------------------------------------------------------
17615589c42SPeter Wemm 	Remove panel from stack.
17715589c42SPeter Wemm ---------------------------------------------------------------------------*/
17815589c42SPeter Wemm #define PANEL_UNLINK(pan,err) \
17915589c42SPeter Wemm {  err = ERR;\
18015589c42SPeter Wemm    if (pan) {\
18115589c42SPeter Wemm      if (IS_LINKED(pan)) {\
18215589c42SPeter Wemm        if ((pan)->below)\
18315589c42SPeter Wemm          (pan)->below->above = (pan)->above;\
18415589c42SPeter Wemm        if ((pan)->above)\
18515589c42SPeter Wemm          (pan)->above->below = (pan)->below;\
18615589c42SPeter Wemm        if ((pan) == _nc_bottom_panel) \
18715589c42SPeter Wemm          _nc_bottom_panel = (pan)->above;\
18815589c42SPeter Wemm        if ((pan) == _nc_top_panel) \
18915589c42SPeter Wemm          _nc_top_panel = (pan)->below;\
19015589c42SPeter Wemm        err = OK;\
19115589c42SPeter Wemm      }\
19215589c42SPeter Wemm      (pan)->above = (pan)->below = (PANEL*)0;\
19315589c42SPeter Wemm    }\
19415589c42SPeter Wemm }
19515589c42SPeter Wemm 
19615589c42SPeter Wemm #define HIDE_PANEL(pan,err,err_if_unlinked)\
19715589c42SPeter Wemm   if (IS_LINKED(pan)) {\
1987a69bbfbSPeter Wemm     Touchpan(pan);\
1997a69bbfbSPeter Wemm     PANEL_UPDATE(pan,(PANEL*)0);\
20015589c42SPeter Wemm     PANEL_UNLINK(pan,err);\
20115589c42SPeter Wemm   } \
20215589c42SPeter Wemm   else {\
2037a69bbfbSPeter Wemm       err = err_if_unlinked;\
20415589c42SPeter Wemm   }
20515589c42SPeter Wemm 
20606bfebdeSXin LI #if NCURSES_SP_FUNCS
20706bfebdeSXin LI /* These may become later renamed and part of panel.h and the public API */
208*7a656419SBaptiste Daroussin extern PANEL_EXPORT(void) NCURSES_SP_NAME(_nc_update_panels)(SCREEN*);
20906bfebdeSXin LI #endif
210aae38d10SBaptiste Daroussin /* *INDENT-ON* */
21106bfebdeSXin LI 
2127a69bbfbSPeter Wemm #endif /* NCURSES_PANEL_PRIV_H */
213