xref: /dflybsd-src/contrib/ncurses/panel/panel.priv.h (revision 32bb52175a24acc0286e62a60b5410d43607de45)
1fdd4e1e0SJan Lentfer /****************************************************************************
2*32bb5217SDaniel Fojt  * Copyright 2020 Thomas E. Dickey                                          *
3*32bb5217SDaniel Fojt  * Copyright 1998-2014,2017 Free Software Foundation, Inc.                  *
4fdd4e1e0SJan Lentfer  *                                                                          *
5fdd4e1e0SJan Lentfer  * Permission is hereby granted, free of charge, to any person obtaining a  *
6fdd4e1e0SJan Lentfer  * copy of this software and associated documentation files (the            *
7fdd4e1e0SJan Lentfer  * "Software"), to deal in the Software without restriction, including      *
8fdd4e1e0SJan Lentfer  * without limitation the rights to use, copy, modify, merge, publish,      *
9fdd4e1e0SJan Lentfer  * distribute, distribute with modifications, sublicense, and/or sell       *
10fdd4e1e0SJan Lentfer  * copies of the Software, and to permit persons to whom the Software is    *
11fdd4e1e0SJan Lentfer  * furnished to do so, subject to the following conditions:                 *
12fdd4e1e0SJan Lentfer  *                                                                          *
13fdd4e1e0SJan Lentfer  * The above copyright notice and this permission notice shall be included  *
14fdd4e1e0SJan Lentfer  * in all copies or substantial portions of the Software.                   *
15fdd4e1e0SJan Lentfer  *                                                                          *
16fdd4e1e0SJan Lentfer  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
17fdd4e1e0SJan Lentfer  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
18fdd4e1e0SJan Lentfer  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
19fdd4e1e0SJan Lentfer  * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
20fdd4e1e0SJan Lentfer  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
21fdd4e1e0SJan Lentfer  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
22fdd4e1e0SJan Lentfer  * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
23fdd4e1e0SJan Lentfer  *                                                                          *
24fdd4e1e0SJan Lentfer  * Except as contained in this notice, the name(s) of the above copyright   *
25fdd4e1e0SJan Lentfer  * holders shall not be used in advertising or otherwise to promote the     *
26fdd4e1e0SJan Lentfer  * sale, use or other dealings in this Software without prior written       *
27fdd4e1e0SJan Lentfer  * authorization.                                                           *
28fdd4e1e0SJan Lentfer  ****************************************************************************/
29fdd4e1e0SJan Lentfer 
30*32bb5217SDaniel Fojt /* $Id: panel.priv.h,v 1.28 2020/02/02 23:34:34 tom Exp $ */
31fdd4e1e0SJan Lentfer 
32fdd4e1e0SJan Lentfer #ifndef NCURSES_PANEL_PRIV_H
33fdd4e1e0SJan Lentfer #define NCURSES_PANEL_PRIV_H 1
343468e90cSJohn Marino /* *INDENT-OFF* */
35fdd4e1e0SJan Lentfer 
36fdd4e1e0SJan Lentfer #if HAVE_CONFIG_H
37fdd4e1e0SJan Lentfer #  include <ncurses_cfg.h>
38fdd4e1e0SJan Lentfer #endif
39fdd4e1e0SJan Lentfer 
40fdd4e1e0SJan Lentfer #include <stdlib.h>
41fdd4e1e0SJan Lentfer #include <string.h>
42fdd4e1e0SJan Lentfer #include <assert.h>
43fdd4e1e0SJan Lentfer 
4400d8f3c4SJohn Marino struct screen;              /* forward declaration */
4500d8f3c4SJohn Marino 
4600d8f3c4SJohn Marino #include "curses.priv.h"    /* includes nc_panel.h */
47*32bb5217SDaniel Fojt 
48*32bb5217SDaniel Fojt #define NCURSES_OPAQUE_PANEL 0
49*32bb5217SDaniel Fojt 
50fdd4e1e0SJan Lentfer #include "panel.h"
5100d8f3c4SJohn Marino 
52fdd4e1e0SJan Lentfer #ifdef TRACE
53fdd4e1e0SJan Lentfer    extern NCURSES_EXPORT(const char *) _nc_my_visbuf (const void *);
54fdd4e1e0SJan Lentfer #  ifdef TRACE_TXT
55fdd4e1e0SJan Lentfer #    define USER_PTR(ptr) _nc_visbuf((const char *)ptr)
56fdd4e1e0SJan Lentfer #  else
57fdd4e1e0SJan Lentfer #    define USER_PTR(ptr) _nc_my_visbuf((const char *)ptr)
58fdd4e1e0SJan Lentfer #  endif
59fdd4e1e0SJan Lentfer 
603468e90cSJohn Marino #  define returnPanel(code)	TRACE_RETURN1(code,panel)
611d102085SJan Lentfer 
621d102085SJan Lentfer    extern NCURSES_EXPORT(PANEL *) _nc_retrace_panel (PANEL *);
63fdd4e1e0SJan Lentfer    extern NCURSES_EXPORT(void) _nc_dPanel (const char*, const PANEL*);
64fdd4e1e0SJan Lentfer    extern NCURSES_EXPORT(void) _nc_dStack (const char*, int, const PANEL*);
65fdd4e1e0SJan Lentfer    extern NCURSES_EXPORT(void) _nc_Wnoutrefresh (const PANEL*);
66fdd4e1e0SJan Lentfer    extern NCURSES_EXPORT(void) _nc_Touchpan (const PANEL*);
67fdd4e1e0SJan Lentfer    extern NCURSES_EXPORT(void) _nc_Touchline (const PANEL*, int, int);
68fdd4e1e0SJan Lentfer 
69fdd4e1e0SJan Lentfer #  define dBug(x) _tracef x
70fdd4e1e0SJan Lentfer #  define dPanel(text,pan) _nc_dPanel(text,pan)
71fdd4e1e0SJan Lentfer #  define dStack(fmt,num,pan) _nc_dStack(fmt,num,pan)
72fdd4e1e0SJan Lentfer #  define Wnoutrefresh(pan) _nc_Wnoutrefresh(pan)
73fdd4e1e0SJan Lentfer #  define Touchpan(pan) _nc_Touchpan(pan)
74fdd4e1e0SJan Lentfer #  define Touchline(pan,start,count) _nc_Touchline(pan,start,count)
75fdd4e1e0SJan Lentfer #else /* !TRACE */
761d102085SJan Lentfer #  define returnPanel(code)	return code
77fdd4e1e0SJan Lentfer #  define dBug(x)
78fdd4e1e0SJan Lentfer #  define dPanel(text,pan)
79fdd4e1e0SJan Lentfer #  define dStack(fmt,num,pan)
80fdd4e1e0SJan Lentfer #  define Wnoutrefresh(pan) wnoutrefresh((pan)->win)
81fdd4e1e0SJan Lentfer #  define Touchpan(pan) touchwin((pan)->win)
82fdd4e1e0SJan Lentfer #  define Touchline(pan,start,count) touchline((pan)->win,start,count)
83fdd4e1e0SJan Lentfer #endif
84fdd4e1e0SJan Lentfer 
8500d8f3c4SJohn Marino #if NCURSES_SP_FUNCS
8600d8f3c4SJohn Marino #define GetScreenHook(sp) \
8700d8f3c4SJohn Marino 			struct panelhook* ph = NCURSES_SP_NAME(_nc_panelhook)(sp)
8800d8f3c4SJohn Marino #define GetPanelHook(pan) \
893468e90cSJohn Marino 			GetScreenHook(pan ? _nc_screen_of((pan)->win) : 0)
9000d8f3c4SJohn Marino #define GetWindowHook(win) \
9100d8f3c4SJohn Marino 			SCREEN* sp = _nc_screen_of(win); \
9200d8f3c4SJohn Marino 			GetScreenHook(sp)
9300d8f3c4SJohn Marino #define GetHook(pan)	SCREEN* sp = _nc_screen_of(pan->win); \
9400d8f3c4SJohn Marino 			GetScreenHook(sp)
9500d8f3c4SJohn Marino 
9600d8f3c4SJohn Marino #define _nc_stdscr_pseudo_panel ((ph)->stdscr_pseudo_panel)
9700d8f3c4SJohn Marino #define _nc_top_panel           ((ph)->top_panel)
9800d8f3c4SJohn Marino #define _nc_bottom_panel        ((ph)->bottom_panel)
9900d8f3c4SJohn Marino 
10000d8f3c4SJohn Marino #else	/* !NCURSES_SP_FUNCS */
10100d8f3c4SJohn Marino 
10200d8f3c4SJohn Marino #define GetScreenHook(sp) /* nothing */
10300d8f3c4SJohn Marino #define GetPanelHook(pan) /* nothing */
10400d8f3c4SJohn Marino #define GetWindowHook(win) /* nothing */
10500d8f3c4SJohn Marino #define GetHook(pan) /* nothing */
10600d8f3c4SJohn Marino 
107fdd4e1e0SJan Lentfer #define _nc_stdscr_pseudo_panel _nc_panelhook()->stdscr_pseudo_panel
108fdd4e1e0SJan Lentfer #define _nc_top_panel           _nc_panelhook()->top_panel
109fdd4e1e0SJan Lentfer #define _nc_bottom_panel        _nc_panelhook()->bottom_panel
110fdd4e1e0SJan Lentfer 
11100d8f3c4SJohn Marino #endif	/* NCURSES_SP_FUNCS */
11200d8f3c4SJohn Marino 
113fdd4e1e0SJan Lentfer #define EMPTY_STACK() (_nc_top_panel == _nc_bottom_panel)
114fdd4e1e0SJan Lentfer #define Is_Bottom(p)  (((p) != (PANEL*)0) && !EMPTY_STACK() && (_nc_bottom_panel->above == (p)))
115fdd4e1e0SJan Lentfer #define Is_Top(p)     (((p) != (PANEL*)0) && !EMPTY_STACK() && (_nc_top_panel == (p)))
11600d8f3c4SJohn Marino #define Is_Pseudo(p)  (((p) != (PANEL*)0) && ((p) == _nc_bottom_panel))
117fdd4e1e0SJan Lentfer 
118fdd4e1e0SJan Lentfer /*+-------------------------------------------------------------------------
119fdd4e1e0SJan Lentfer 	IS_LINKED(pan) - check to see if panel is in the stack
120fdd4e1e0SJan Lentfer --------------------------------------------------------------------------*/
121fdd4e1e0SJan Lentfer /* This works! The only case where it would fail is, when the list has
122fdd4e1e0SJan Lentfer    only one element. But this could only be the pseudo panel at the bottom */
123fdd4e1e0SJan Lentfer #define IS_LINKED(p) (((p)->above || (p)->below ||((p)==_nc_bottom_panel)) ? TRUE : FALSE)
124fdd4e1e0SJan Lentfer 
125fdd4e1e0SJan Lentfer #define PSTARTX(pan) ((pan)->win->_begx)
126fdd4e1e0SJan Lentfer #define PENDX(pan)   ((pan)->win->_begx + getmaxx((pan)->win) - 1)
127fdd4e1e0SJan Lentfer #define PSTARTY(pan) ((pan)->win->_begy)
128fdd4e1e0SJan Lentfer #define PENDY(pan)   ((pan)->win->_begy + getmaxy((pan)->win) - 1)
129fdd4e1e0SJan Lentfer 
130fdd4e1e0SJan Lentfer /*+-------------------------------------------------------------------------
131fdd4e1e0SJan Lentfer 	PANELS_OVERLAPPED(pan1,pan2) - check panel overlapped
132fdd4e1e0SJan Lentfer ---------------------------------------------------------------------------*/
133fdd4e1e0SJan Lentfer #define PANELS_OVERLAPPED(pan1,pan2) \
134fdd4e1e0SJan Lentfer (( !(pan1) || !(pan2) || \
135fdd4e1e0SJan Lentfer        PSTARTY(pan1) > PENDY(pan2) || PENDY(pan1) < PSTARTY(pan2) ||\
136fdd4e1e0SJan Lentfer        PSTARTX(pan1) > PENDX(pan2) || PENDX(pan1) < PSTARTX(pan2) ) \
137fdd4e1e0SJan Lentfer      ? FALSE : TRUE)
138fdd4e1e0SJan Lentfer 
139fdd4e1e0SJan Lentfer 
140fdd4e1e0SJan Lentfer /*+-------------------------------------------------------------------------
141fdd4e1e0SJan Lentfer 	Compute the intersection rectangle of two overlapping rectangles
142fdd4e1e0SJan Lentfer ---------------------------------------------------------------------------*/
143fdd4e1e0SJan Lentfer #define COMPUTE_INTERSECTION(pan1,pan2,ix1,ix2,iy1,iy2)\
144fdd4e1e0SJan Lentfer    ix1 = (PSTARTX(pan1) < PSTARTX(pan2)) ? PSTARTX(pan2) : PSTARTX(pan1);\
145fdd4e1e0SJan Lentfer    ix2 = (PENDX(pan1)   < PENDX(pan2))   ? PENDX(pan1)   : PENDX(pan2);\
146fdd4e1e0SJan Lentfer    iy1 = (PSTARTY(pan1) < PSTARTY(pan2)) ? PSTARTY(pan2) : PSTARTY(pan1);\
147fdd4e1e0SJan Lentfer    iy2 = (PENDY(pan1)   < PENDY(pan2))   ? PENDY(pan1)   : PENDY(pan2);\
14800d8f3c4SJohn Marino    assert((ix1<=ix2) && (iy1<=iy2))
149fdd4e1e0SJan Lentfer 
150fdd4e1e0SJan Lentfer 
151fdd4e1e0SJan Lentfer /*+-------------------------------------------------------------------------
152fdd4e1e0SJan Lentfer 	Walk through the panel stack starting at the given location and
153fdd4e1e0SJan Lentfer         check for intersections; overlapping panels are "touched", so they
154fdd4e1e0SJan Lentfer         are incrementally overwriting cells that should be hidden.
155fdd4e1e0SJan Lentfer         If the "touch" flag is set, the panel gets touched before it is
156fdd4e1e0SJan Lentfer         updated.
157fdd4e1e0SJan Lentfer ---------------------------------------------------------------------------*/
158fdd4e1e0SJan Lentfer #define PANEL_UPDATE(pan,panstart)\
159fdd4e1e0SJan Lentfer {  PANEL* pan2 = ((panstart) ? (panstart) : _nc_bottom_panel);\
1603468e90cSJohn Marino    while(pan2 && pan2->win) {\
161fdd4e1e0SJan Lentfer       if ((pan2 != pan) && PANELS_OVERLAPPED(pan,pan2)) {\
162fdd4e1e0SJan Lentfer         int y, ix1, ix2, iy1, iy2;\
163fdd4e1e0SJan Lentfer         COMPUTE_INTERSECTION(pan, pan2, ix1, ix2, iy1, iy2);\
164fdd4e1e0SJan Lentfer 	for(y = iy1; y <= iy2; y++) {\
165fdd4e1e0SJan Lentfer 	  if (is_linetouched(pan->win,y - PSTARTY(pan))) {\
166fdd4e1e0SJan Lentfer             struct ldat* line = &(pan2->win->_line[y - PSTARTY(pan2)]);\
167fdd4e1e0SJan Lentfer             CHANGED_RANGE(line, ix1 - PSTARTX(pan2), ix2 - PSTARTX(pan2));\
168fdd4e1e0SJan Lentfer           }\
169fdd4e1e0SJan Lentfer 	}\
170fdd4e1e0SJan Lentfer       }\
171fdd4e1e0SJan Lentfer       pan2 = pan2->above;\
172fdd4e1e0SJan Lentfer    }\
173fdd4e1e0SJan Lentfer }
174fdd4e1e0SJan Lentfer 
175fdd4e1e0SJan Lentfer /*+-------------------------------------------------------------------------
176fdd4e1e0SJan Lentfer 	Remove panel from stack.
177fdd4e1e0SJan Lentfer ---------------------------------------------------------------------------*/
178fdd4e1e0SJan Lentfer #define PANEL_UNLINK(pan,err) \
179fdd4e1e0SJan Lentfer {  err = ERR;\
180fdd4e1e0SJan Lentfer    if (pan) {\
181fdd4e1e0SJan Lentfer      if (IS_LINKED(pan)) {\
182fdd4e1e0SJan Lentfer        if ((pan)->below)\
183fdd4e1e0SJan Lentfer          (pan)->below->above = (pan)->above;\
184fdd4e1e0SJan Lentfer        if ((pan)->above)\
185fdd4e1e0SJan Lentfer          (pan)->above->below = (pan)->below;\
186fdd4e1e0SJan Lentfer        if ((pan) == _nc_bottom_panel) \
187fdd4e1e0SJan Lentfer          _nc_bottom_panel = (pan)->above;\
188fdd4e1e0SJan Lentfer        if ((pan) == _nc_top_panel) \
189fdd4e1e0SJan Lentfer          _nc_top_panel = (pan)->below;\
190fdd4e1e0SJan Lentfer        err = OK;\
191fdd4e1e0SJan Lentfer      }\
192fdd4e1e0SJan Lentfer      (pan)->above = (pan)->below = (PANEL*)0;\
193fdd4e1e0SJan Lentfer    }\
194fdd4e1e0SJan Lentfer }
195fdd4e1e0SJan Lentfer 
196fdd4e1e0SJan Lentfer #define HIDE_PANEL(pan,err,err_if_unlinked)\
197fdd4e1e0SJan Lentfer   if (IS_LINKED(pan)) {\
198fdd4e1e0SJan Lentfer     Touchpan(pan);\
199fdd4e1e0SJan Lentfer     PANEL_UPDATE(pan,(PANEL*)0);\
200fdd4e1e0SJan Lentfer     PANEL_UNLINK(pan,err);\
201fdd4e1e0SJan Lentfer   } \
202fdd4e1e0SJan Lentfer   else {\
203fdd4e1e0SJan Lentfer       err = err_if_unlinked;\
204fdd4e1e0SJan Lentfer   }
205fdd4e1e0SJan Lentfer 
20600d8f3c4SJohn Marino #if NCURSES_SP_FUNCS
20700d8f3c4SJohn Marino /* These may become later renamed and part of panel.h and the public API */
20800d8f3c4SJohn Marino extern NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_update_panels)(SCREEN*);
20900d8f3c4SJohn Marino #endif
2103468e90cSJohn Marino /* *INDENT-ON* */
21100d8f3c4SJohn Marino 
212fdd4e1e0SJan Lentfer #endif /* NCURSES_PANEL_PRIV_H */
213