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