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