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