xref: /dflybsd-src/contrib/ncurses/panel/panel.priv.h (revision 0cadad7e49c6219b0de0675ef6a6f44683d177d4)
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 #include <ncurses_cfg.h>
37fdd4e1e0SJan Lentfer 
38fdd4e1e0SJan Lentfer #include <stdlib.h>
39fdd4e1e0SJan Lentfer #include <string.h>
40fdd4e1e0SJan Lentfer #include <assert.h>
41fdd4e1e0SJan Lentfer 
4200d8f3c4SJohn Marino struct screen;              /* forward declaration */
4300d8f3c4SJohn Marino 
4400d8f3c4SJohn Marino #include "curses.priv.h"    /* includes nc_panel.h */
45*32bb5217SDaniel Fojt 
46*32bb5217SDaniel Fojt #define NCURSES_OPAQUE_PANEL 0
47*32bb5217SDaniel Fojt 
48fdd4e1e0SJan Lentfer #include "panel.h"
4900d8f3c4SJohn Marino 
50fdd4e1e0SJan Lentfer #ifdef TRACE
51fdd4e1e0SJan Lentfer    extern NCURSES_EXPORT(const char *) _nc_my_visbuf (const void *);
52fdd4e1e0SJan Lentfer #  ifdef TRACE_TXT
53fdd4e1e0SJan Lentfer #    define USER_PTR(ptr) _nc_visbuf((const char *)ptr)
54fdd4e1e0SJan Lentfer #  else
55fdd4e1e0SJan Lentfer #    define USER_PTR(ptr) _nc_my_visbuf((const char *)ptr)
56fdd4e1e0SJan Lentfer #  endif
57fdd4e1e0SJan Lentfer 
583468e90cSJohn Marino #  define returnPanel(code)	TRACE_RETURN1(code,panel)
591d102085SJan Lentfer 
601d102085SJan Lentfer    extern NCURSES_EXPORT(PANEL *) _nc_retrace_panel (PANEL *);
61fdd4e1e0SJan Lentfer    extern NCURSES_EXPORT(void) _nc_dPanel (const char*, const PANEL*);
62fdd4e1e0SJan Lentfer    extern NCURSES_EXPORT(void) _nc_dStack (const char*, int, const PANEL*);
63fdd4e1e0SJan Lentfer    extern NCURSES_EXPORT(void) _nc_Wnoutrefresh (const PANEL*);
64fdd4e1e0SJan Lentfer    extern NCURSES_EXPORT(void) _nc_Touchpan (const PANEL*);
65fdd4e1e0SJan Lentfer    extern NCURSES_EXPORT(void) _nc_Touchline (const PANEL*, int, int);
66fdd4e1e0SJan Lentfer 
67fdd4e1e0SJan Lentfer #  define dBug(x) _tracef x
68fdd4e1e0SJan Lentfer #  define dPanel(text,pan) _nc_dPanel(text,pan)
69fdd4e1e0SJan Lentfer #  define dStack(fmt,num,pan) _nc_dStack(fmt,num,pan)
70fdd4e1e0SJan Lentfer #  define Wnoutrefresh(pan) _nc_Wnoutrefresh(pan)
71fdd4e1e0SJan Lentfer #  define Touchpan(pan) _nc_Touchpan(pan)
72fdd4e1e0SJan Lentfer #  define Touchline(pan,start,count) _nc_Touchline(pan,start,count)
73fdd4e1e0SJan Lentfer #else /* !TRACE */
741d102085SJan Lentfer #  define returnPanel(code)	return code
75fdd4e1e0SJan Lentfer #  define dBug(x)
76fdd4e1e0SJan Lentfer #  define dPanel(text,pan)
77fdd4e1e0SJan Lentfer #  define dStack(fmt,num,pan)
78fdd4e1e0SJan Lentfer #  define Wnoutrefresh(pan) wnoutrefresh((pan)->win)
79fdd4e1e0SJan Lentfer #  define Touchpan(pan) touchwin((pan)->win)
80fdd4e1e0SJan Lentfer #  define Touchline(pan,start,count) touchline((pan)->win,start,count)
81fdd4e1e0SJan Lentfer #endif
82fdd4e1e0SJan Lentfer 
8300d8f3c4SJohn Marino #if NCURSES_SP_FUNCS
8400d8f3c4SJohn Marino #define GetScreenHook(sp) \
8500d8f3c4SJohn Marino 			struct panelhook* ph = NCURSES_SP_NAME(_nc_panelhook)(sp)
8600d8f3c4SJohn Marino #define GetPanelHook(pan) \
873468e90cSJohn Marino 			GetScreenHook(pan ? _nc_screen_of((pan)->win) : 0)
8800d8f3c4SJohn Marino #define GetWindowHook(win) \
8900d8f3c4SJohn Marino 			SCREEN* sp = _nc_screen_of(win); \
9000d8f3c4SJohn Marino 			GetScreenHook(sp)
9100d8f3c4SJohn Marino #define GetHook(pan)	SCREEN* sp = _nc_screen_of(pan->win); \
9200d8f3c4SJohn Marino 			GetScreenHook(sp)
9300d8f3c4SJohn Marino 
9400d8f3c4SJohn Marino #define _nc_stdscr_pseudo_panel ((ph)->stdscr_pseudo_panel)
9500d8f3c4SJohn Marino #define _nc_top_panel           ((ph)->top_panel)
9600d8f3c4SJohn Marino #define _nc_bottom_panel        ((ph)->bottom_panel)
9700d8f3c4SJohn Marino 
9800d8f3c4SJohn Marino #else	/* !NCURSES_SP_FUNCS */
9900d8f3c4SJohn Marino 
10000d8f3c4SJohn Marino #define GetScreenHook(sp) /* nothing */
10100d8f3c4SJohn Marino #define GetPanelHook(pan) /* nothing */
10200d8f3c4SJohn Marino #define GetWindowHook(win) /* nothing */
10300d8f3c4SJohn Marino #define GetHook(pan) /* nothing */
10400d8f3c4SJohn Marino 
105fdd4e1e0SJan Lentfer #define _nc_stdscr_pseudo_panel _nc_panelhook()->stdscr_pseudo_panel
106fdd4e1e0SJan Lentfer #define _nc_top_panel           _nc_panelhook()->top_panel
107fdd4e1e0SJan Lentfer #define _nc_bottom_panel        _nc_panelhook()->bottom_panel
108fdd4e1e0SJan Lentfer 
10900d8f3c4SJohn Marino #endif	/* NCURSES_SP_FUNCS */
11000d8f3c4SJohn Marino 
111fdd4e1e0SJan Lentfer #define EMPTY_STACK() (_nc_top_panel == _nc_bottom_panel)
112fdd4e1e0SJan Lentfer #define Is_Bottom(p)  (((p) != (PANEL*)0) && !EMPTY_STACK() && (_nc_bottom_panel->above == (p)))
113fdd4e1e0SJan Lentfer #define Is_Top(p)     (((p) != (PANEL*)0) && !EMPTY_STACK() && (_nc_top_panel == (p)))
11400d8f3c4SJohn Marino #define Is_Pseudo(p)  (((p) != (PANEL*)0) && ((p) == _nc_bottom_panel))
115fdd4e1e0SJan Lentfer 
116fdd4e1e0SJan Lentfer /*+-------------------------------------------------------------------------
117fdd4e1e0SJan Lentfer 	IS_LINKED(pan) - check to see if panel is in the stack
118fdd4e1e0SJan Lentfer --------------------------------------------------------------------------*/
119fdd4e1e0SJan Lentfer /* This works! The only case where it would fail is, when the list has
120fdd4e1e0SJan Lentfer    only one element. But this could only be the pseudo panel at the bottom */
121fdd4e1e0SJan Lentfer #define IS_LINKED(p) (((p)->above || (p)->below ||((p)==_nc_bottom_panel)) ? TRUE : FALSE)
122fdd4e1e0SJan Lentfer 
123fdd4e1e0SJan Lentfer #define PSTARTX(pan) ((pan)->win->_begx)
124fdd4e1e0SJan Lentfer #define PENDX(pan)   ((pan)->win->_begx + getmaxx((pan)->win) - 1)
125fdd4e1e0SJan Lentfer #define PSTARTY(pan) ((pan)->win->_begy)
126fdd4e1e0SJan Lentfer #define PENDY(pan)   ((pan)->win->_begy + getmaxy((pan)->win) - 1)
127fdd4e1e0SJan Lentfer 
128fdd4e1e0SJan Lentfer /*+-------------------------------------------------------------------------
129fdd4e1e0SJan Lentfer 	PANELS_OVERLAPPED(pan1,pan2) - check panel overlapped
130fdd4e1e0SJan Lentfer ---------------------------------------------------------------------------*/
131fdd4e1e0SJan Lentfer #define PANELS_OVERLAPPED(pan1,pan2) \
132fdd4e1e0SJan Lentfer (( !(pan1) || !(pan2) || \
133fdd4e1e0SJan Lentfer        PSTARTY(pan1) > PENDY(pan2) || PENDY(pan1) < PSTARTY(pan2) ||\
134fdd4e1e0SJan Lentfer        PSTARTX(pan1) > PENDX(pan2) || PENDX(pan1) < PSTARTX(pan2) ) \
135fdd4e1e0SJan Lentfer      ? FALSE : TRUE)
136fdd4e1e0SJan Lentfer 
137fdd4e1e0SJan Lentfer 
138fdd4e1e0SJan Lentfer /*+-------------------------------------------------------------------------
139fdd4e1e0SJan Lentfer 	Compute the intersection rectangle of two overlapping rectangles
140fdd4e1e0SJan Lentfer ---------------------------------------------------------------------------*/
141fdd4e1e0SJan Lentfer #define COMPUTE_INTERSECTION(pan1,pan2,ix1,ix2,iy1,iy2)\
142fdd4e1e0SJan Lentfer    ix1 = (PSTARTX(pan1) < PSTARTX(pan2)) ? PSTARTX(pan2) : PSTARTX(pan1);\
143fdd4e1e0SJan Lentfer    ix2 = (PENDX(pan1)   < PENDX(pan2))   ? PENDX(pan1)   : PENDX(pan2);\
144fdd4e1e0SJan Lentfer    iy1 = (PSTARTY(pan1) < PSTARTY(pan2)) ? PSTARTY(pan2) : PSTARTY(pan1);\
145fdd4e1e0SJan Lentfer    iy2 = (PENDY(pan1)   < PENDY(pan2))   ? PENDY(pan1)   : PENDY(pan2);\
14600d8f3c4SJohn Marino    assert((ix1<=ix2) && (iy1<=iy2))
147fdd4e1e0SJan Lentfer 
148fdd4e1e0SJan Lentfer 
149fdd4e1e0SJan Lentfer /*+-------------------------------------------------------------------------
150fdd4e1e0SJan Lentfer 	Walk through the panel stack starting at the given location and
151fdd4e1e0SJan Lentfer         check for intersections; overlapping panels are "touched", so they
152fdd4e1e0SJan Lentfer         are incrementally overwriting cells that should be hidden.
153fdd4e1e0SJan Lentfer         If the "touch" flag is set, the panel gets touched before it is
154fdd4e1e0SJan Lentfer         updated.
155fdd4e1e0SJan Lentfer ---------------------------------------------------------------------------*/
156fdd4e1e0SJan Lentfer #define PANEL_UPDATE(pan,panstart)\
157fdd4e1e0SJan Lentfer {  PANEL* pan2 = ((panstart) ? (panstart) : _nc_bottom_panel);\
1583468e90cSJohn Marino    while(pan2 && pan2->win) {\
159fdd4e1e0SJan Lentfer       if ((pan2 != pan) && PANELS_OVERLAPPED(pan,pan2)) {\
160fdd4e1e0SJan Lentfer         int y, ix1, ix2, iy1, iy2;\
161fdd4e1e0SJan Lentfer         COMPUTE_INTERSECTION(pan, pan2, ix1, ix2, iy1, iy2);\
162fdd4e1e0SJan Lentfer 	for(y = iy1; y <= iy2; y++) {\
163fdd4e1e0SJan Lentfer 	  if (is_linetouched(pan->win,y - PSTARTY(pan))) {\
164fdd4e1e0SJan Lentfer             struct ldat* line = &(pan2->win->_line[y - PSTARTY(pan2)]);\
165fdd4e1e0SJan Lentfer             CHANGED_RANGE(line, ix1 - PSTARTX(pan2), ix2 - PSTARTX(pan2));\
166fdd4e1e0SJan Lentfer           }\
167fdd4e1e0SJan Lentfer 	}\
168fdd4e1e0SJan Lentfer       }\
169fdd4e1e0SJan Lentfer       pan2 = pan2->above;\
170fdd4e1e0SJan Lentfer    }\
171fdd4e1e0SJan Lentfer }
172fdd4e1e0SJan Lentfer 
173fdd4e1e0SJan Lentfer /*+-------------------------------------------------------------------------
174fdd4e1e0SJan Lentfer 	Remove panel from stack.
175fdd4e1e0SJan Lentfer ---------------------------------------------------------------------------*/
176fdd4e1e0SJan Lentfer #define PANEL_UNLINK(pan,err) \
177fdd4e1e0SJan Lentfer {  err = ERR;\
178fdd4e1e0SJan Lentfer    if (pan) {\
179fdd4e1e0SJan Lentfer      if (IS_LINKED(pan)) {\
180fdd4e1e0SJan Lentfer        if ((pan)->below)\
181fdd4e1e0SJan Lentfer          (pan)->below->above = (pan)->above;\
182fdd4e1e0SJan Lentfer        if ((pan)->above)\
183fdd4e1e0SJan Lentfer          (pan)->above->below = (pan)->below;\
184fdd4e1e0SJan Lentfer        if ((pan) == _nc_bottom_panel) \
185fdd4e1e0SJan Lentfer          _nc_bottom_panel = (pan)->above;\
186fdd4e1e0SJan Lentfer        if ((pan) == _nc_top_panel) \
187fdd4e1e0SJan Lentfer          _nc_top_panel = (pan)->below;\
188fdd4e1e0SJan Lentfer        err = OK;\
189fdd4e1e0SJan Lentfer      }\
190fdd4e1e0SJan Lentfer      (pan)->above = (pan)->below = (PANEL*)0;\
191fdd4e1e0SJan Lentfer    }\
192fdd4e1e0SJan Lentfer }
193fdd4e1e0SJan Lentfer 
194fdd4e1e0SJan Lentfer #define HIDE_PANEL(pan,err,err_if_unlinked)\
195fdd4e1e0SJan Lentfer   if (IS_LINKED(pan)) {\
196fdd4e1e0SJan Lentfer     Touchpan(pan);\
197fdd4e1e0SJan Lentfer     PANEL_UPDATE(pan,(PANEL*)0);\
198fdd4e1e0SJan Lentfer     PANEL_UNLINK(pan,err);\
199fdd4e1e0SJan Lentfer   } \
200fdd4e1e0SJan Lentfer   else {\
201fdd4e1e0SJan Lentfer       err = err_if_unlinked;\
202fdd4e1e0SJan Lentfer   }
203fdd4e1e0SJan Lentfer 
20400d8f3c4SJohn Marino #if NCURSES_SP_FUNCS
20500d8f3c4SJohn Marino /* These may become later renamed and part of panel.h and the public API */
20600d8f3c4SJohn Marino extern NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_update_panels)(SCREEN*);
20700d8f3c4SJohn Marino #endif
2083468e90cSJohn Marino /* *INDENT-ON* */
20900d8f3c4SJohn Marino 
210fdd4e1e0SJan Lentfer #endif /* NCURSES_PANEL_PRIV_H */
211