diff options
Diffstat (limited to 'lib/libpanel/panel.c')
-rw-r--r-- | lib/libpanel/panel.c | 817 |
1 files changed, 430 insertions, 387 deletions
diff --git a/lib/libpanel/panel.c b/lib/libpanel/panel.c index 882f040435c..1b13f02ef0b 100644 --- a/lib/libpanel/panel.c +++ b/lib/libpanel/panel.c @@ -22,355 +22,401 @@ ***************************************************************************/ /* panel.c -- implementation of panels library */ +#include "panel.priv.h" -#ifdef TRACE -#define PANEL_DEBUG -#endif - -#include <stdlib.h> -#include "panel.h" +MODULE_ID("$Id: panel.c,v 1.2 1997/11/26 03:56:05 millert Exp $") -typedef struct panelcons +#ifdef TRACE +extern char *_nc_visbuf(const char *); +#ifdef TRACE_TXT +#define USER_PTR(ptr) _nc_visbuf((const char *)ptr) +#else +static char *my_nc_visbuf(const void *ptr) { - struct panelcons *above; - struct panel *pan; + char temp[40]; + if (ptr != 0) + sprintf(temp, "ptr:%p", ptr); + else + strcpy(temp, "<null>"); + return _nc_visbuf(temp); } -PANELCONS; +#define USER_PTR(ptr) my_nc_visbuf((const char *)ptr) +#endif +#endif -#define STATIC static +static PANEL *__bottom_panel = (PANEL *)0; +static PANEL *__top_panel = (PANEL *)0; -STATIC PANEL *__bottom_panel = (PANEL *)0; -STATIC PANEL *__top_panel = (PANEL *)0; -STATIC PANEL __stdscr_pseudo_panel = { (WINDOW *)0 }; +static PANEL __stdscr_pseudo_panel = { (WINDOW *)0, + 0,0,0,0, + (PANEL *)0, (PANEL *)0, + (void *)0, + (PANELCONS *)0 }; -#ifdef PANEL_DEBUG -#define dBug(x) _tracef x -#else -#define dBug(x) -#endif +/* Prototypes */ +static void __panel_link_bottom(PANEL *pan); /*+------------------------------------------------------------------------- dPanel(text,pan) --------------------------------------------------------------------------*/ -#ifdef PANEL_DEBUG -STATIC void -dPanel(char *text, PANEL *pan) +#ifdef TRACE +static void +dPanel(const char *text, const PANEL *pan) { _tracef("%s id=%s b=%s a=%s y=%d x=%d", - text,pan->user, - (pan->below) ? pan->below->user : "--", - (pan->above) ? pan->above->user : "--", + text, USER_PTR(pan->user), + (pan->below) ? USER_PTR(pan->below->user) : "--", + (pan->above) ? USER_PTR(pan->above->user) : "--", pan->wstarty, pan->wstartx); -} /* end of dPanel */ +} /* end of dPanel */ #else -#define dPanel(text,pan) +# define dPanel(text,pan) #endif /*+------------------------------------------------------------------------- dStack(fmt,num,pan) --------------------------------------------------------------------------*/ -#ifdef PANEL_DEBUG -STATIC void -dStack(char *fmt, int num, PANEL *pan) +#ifdef TRACE +static void +dStack(const char *fmt, int num, const PANEL *pan) { -char s80[80]; - - sprintf(s80,fmt,num,pan); - _tracef("%s b=%s t=%s",s80, - (__bottom_panel) ? __bottom_panel->user : "--", - (__top_panel) ? __top_panel->user : "--"); - if(pan) - _tracef("pan id=%s",pan->user); - pan = __bottom_panel; - while(pan) - { - dPanel("stk",pan); - pan = pan->above; - } -} /* end of dStack */ + char s80[80]; + + snprintf(s80,sizeof(s80),fmt,num,pan); + _tracef("%s b=%s t=%s",s80, + (__bottom_panel) ? USER_PTR(__bottom_panel->user) : "--", + (__top_panel) ? USER_PTR(__top_panel->user) : "--"); + if(pan) + _tracef("pan id=%s", USER_PTR(pan->user)); + pan = __bottom_panel; + while(pan) + { + dPanel("stk",pan); + pan = pan->above; + } +} /* end of dStack */ #else -#define dStack(fmt,num,pan) +# define dStack(fmt,num,pan) #endif /*+------------------------------------------------------------------------- Wnoutrefresh(pan) - debugging hook for wnoutrefresh --------------------------------------------------------------------------*/ -#ifdef PANEL_DEBUG -STATIC void -Wnoutrefresh(PANEL *pan) +#ifdef TRACE +static void +Wnoutrefresh(const PANEL *pan) { - dPanel("wnoutrefresh",pan); - wnoutrefresh(pan->win); -} /* end of Wnoutrefresh */ + dPanel("wnoutrefresh",pan); + wnoutrefresh(pan->win); +} /* end of Wnoutrefresh */ #else -#define Wnoutrefresh(pan) wnoutrefresh((pan)->win) +# define Wnoutrefresh(pan) wnoutrefresh((pan)->win) #endif /*+------------------------------------------------------------------------- Touchpan(pan) --------------------------------------------------------------------------*/ -#ifdef PANEL_DEBUG -STATIC void -Touchpan(PANEL *pan) +#ifdef TRACE +static void +Touchpan(const PANEL *pan) { - dPanel("Touchpan",pan); - touchwin(pan->win); -} /* end of Touchpan */ + dPanel("Touchpan",pan); + touchwin(pan->win); +} /* end of Touchpan */ #else -#define Touchpan(pan) touchwin((pan)->win) +# define Touchpan(pan) touchwin((pan)->win) #endif /*+------------------------------------------------------------------------- Touchline(pan,start,count) --------------------------------------------------------------------------*/ -#ifdef PANEL_DEBUG -STATIC void -Touchline(PANEL *pan, int start, int count) +#ifdef TRACE +static void +Touchline(const PANEL *pan, int start, int count) { -char s80[80]; - sprintf(s80,"Touchline s=%d c=%d",start,count); - dPanel(s80,pan); - touchline(pan->win,start,count); -} /* end of Touchline */ + char s80[80]; + snprintf(s80,sizeof(s80),"Touchline s=%d c=%d",start,count); + dPanel(s80,pan); + touchline(pan->win,start,count); +} /* end of Touchline */ #else -#define Touchline(pan,start,count) touchline((pan)->win,start,count) +# define Touchline(pan,start,count) touchline((pan)->win,start,count) #endif /*+------------------------------------------------------------------------- __panels_overlapped(pan1,pan2) - check panel overlapped --------------------------------------------------------------------------*/ -STATIC int -__panels_overlapped(register PANEL *pan1, register PANEL *pan2) +static INLINE bool +__panels_overlapped(register const PANEL *pan1, register const PANEL *pan2) { - if(!pan1 || !pan2) - return(0); - dBug(("__panels_overlapped %s %s",pan1->user,pan2->user)); - if((pan1->wstarty >= pan2->wstarty) && (pan1->wstarty < pan2->wendy) && - (pan1->wstartx >= pan2->wstartx) && (pan1->wstartx < pan2->wendx)) - return(1); - if((pan1->wstarty >= pan1->wstarty) && (pan2->wstarty < pan1->wendy) && - (pan1->wstartx >= pan1->wstartx) && (pan2->wstartx < pan1->wendx)) - return(1); - dBug((" no")); - return(0); -} /* end of __panels_overlapped */ + if(!pan1 || !pan2) + return(FALSE); + dBug(("__panels_overlapped %s %s", USER_PTR(pan1->user), USER_PTR(pan2->user))); + /* pan1 intersects with pan2 ? */ + if((pan1->wstarty >= pan2->wstarty) && (pan1->wstarty < pan2->wendy) && + (pan1->wstartx >= pan2->wstartx) && (pan1->wstartx < pan2->wendx)) + return(TRUE); + /* or vice versa test */ + if((pan2->wstarty >= pan1->wstarty) && (pan2->wstarty < pan1->wendy) && + (pan2->wstartx >= pan1->wstartx) && (pan2->wstartx < pan1->wendx)) + return(TRUE); + dBug((" no")); + return(FALSE); +} /* end of __panels_overlapped */ /*+------------------------------------------------------------------------- __free_obscure(pan) --------------------------------------------------------------------------*/ -STATIC void +static INLINE void __free_obscure(PANEL *pan) { -PANELCONS *tobs = pan->obscure; /* "this" one */ -PANELCONS *nobs; /* "next" one */ + PANELCONS *tobs = pan->obscure; /* "this" one */ + PANELCONS *nobs; /* "next" one */ + + while(tobs) + { + nobs = tobs->above; + free((char *)tobs); + tobs = nobs; + } + pan->obscure = (PANELCONS *)0; +} /* end of __free_obscure */ - while(tobs) { - nobs = tobs->above; - free((char *)tobs); - tobs = nobs; - } - pan->obscure = (PANELCONS *)0; -} /* end of __free_obscure */ +/*+------------------------------------------------------------------------- + Get root (i.e. stdscr's) panel. + Establish the pseudo panel for stdscr if necessary. +--------------------------------------------------------------------------*/ +static PANEL* +__root_panel(void) +{ + if(!__stdscr_pseudo_panel.win) + { /* initialize those fields not already statically initialized */ + assert(stdscr && !__bottom_panel && !__top_panel); + __stdscr_pseudo_panel.win = stdscr; + __stdscr_pseudo_panel.wendy = LINES; + __stdscr_pseudo_panel.wendx = COLS; +#ifdef TRACE + __stdscr_pseudo_panel.user = "stdscr"; +#endif + __panel_link_bottom(&__stdscr_pseudo_panel); + } + return &__stdscr_pseudo_panel; +} /*+------------------------------------------------------------------------- __override(pan,show) --------------------------------------------------------------------------*/ -STATIC void -__override(PANEL *pan, int show) +static void +__override(const PANEL *pan, int show) { -register y; -register PANEL *pan2; -PANELCONS *tobs = pan->obscure; /* "this" one */ - - dBug(("__override %s,%d",pan->user,show)); - - if(show == 1) - Touchpan(pan); - else if(!show) { - Touchpan(pan); -/* - Touchline(&__stdscr_pseudo_panel,pan->wendy,getmaxy(pan->win)); -*/ - Touchpan(&__stdscr_pseudo_panel); - } else if(show == -1) { - while(tobs && (tobs->pan != pan)) - tobs = tobs->above; + int y; + PANEL *pan2; + PANELCONS *tobs = pan->obscure; /* "this" one */ + + dBug(("__override %s,%d", USER_PTR(pan->user),show)); + + switch (show) + { + case P_TOUCH: + Touchpan(pan); + /* The following while loop will now mark all panel window lines + * obscured by use or obscuring us as touched, so they will be + * updated. + */ + break; + case P_UPDATE: + while(tobs && (tobs->pan != pan)) + tobs = tobs->above; + /* The next loop will now only go through the panels obscuring pan; + * it updates all the lines in the obscuring panels in sync. with + * the lines touched in pan itself. This is called in update_panels() + * in a loop from the bottom_panel to the top_panel, resulting in + * the desired update effect. + */ + break; + default: + return; + } + + while(tobs) + { + if((pan2 = tobs->pan) != pan) { + dBug(("test obs pan=%s pan2=%s", USER_PTR(pan->user), USER_PTR(pan2->user))); + for(y = pan->wstarty; y < pan->wendy; y++) { + if( (y >= pan2->wstarty) && (y < pan2->wendy) && + ((is_linetouched(pan->win,y - pan->wstarty) == TRUE)) ) + Touchline(pan2,y - pan2->wstarty,1); } - - while(tobs) { - if((pan2 = tobs->pan) != pan) { - dBug(("test obs pan=%s pan2=%s",pan->user,pan2->user)); - for(y = pan->wstarty; y < pan->wendy; y++) { - if( (y >= pan2->wstarty) && (y < pan2->wendy) && - ((is_linetouched(pan->win,y - pan->wstarty) == 1) || - (is_linetouched(stdscr,y) == 1))) - { - Touchline(pan2,y - pan2->wstarty,1); - } - } - } - tobs = tobs->above; - } -} /* end of __override */ + } + tobs = tobs->above; + } +} /* end of __override */ /*+------------------------------------------------------------------------- __calculate_obscure() --------------------------------------------------------------------------*/ -STATIC void +static void __calculate_obscure(void) { -PANEL *pan; -register PANEL *pan2; -register PANELCONS *tobs; /* "this" one */ -PANELCONS *lobs = (PANELCONS *)0; /* last one */ - - pan = __bottom_panel; - while(pan) { - if(pan->obscure) - __free_obscure(pan); - dBug(("--> __calculate_obscure %s",pan->user)); - lobs = (PANELCONS *)0; /* last one */ - pan2 = __bottom_panel; - while(pan2) { - if(__panels_overlapped(pan,pan2)) { - if(!(tobs = (PANELCONS *)malloc(sizeof(PANELCONS)))) - return; - tobs->pan = pan2; - dPanel("obscured",pan2); - tobs->above = (PANELCONS *)0; - if(lobs) - lobs->above = tobs; - else - pan->obscure = tobs; - lobs = tobs; - } - pan2 = pan2->above; - } - __override(pan,1); - pan = pan->above; + PANEL *pan; + PANEL *pan2; + PANELCONS *tobs; /* "this" one */ + PANELCONS *lobs = (PANELCONS *)0; /* last one */ + + pan = __bottom_panel; + while(pan) + { + if(pan->obscure) + __free_obscure(pan); + dBug(("--> __calculate_obscure %s", USER_PTR(pan->user))); + lobs = (PANELCONS *)0; /* last one */ + pan2 = __bottom_panel; + /* This loop builds a list of panels obsured by pan or obscuring + pan; pan itself is in the list; all panels before pan are + obscured by pan, all panels after pan are obscuring pan. */ + while(pan2) + { + if(__panels_overlapped(pan,pan2)) + { + if(!(tobs = (PANELCONS *)malloc(sizeof(PANELCONS)))) + return; + tobs->pan = pan2; + dPanel("obscured",pan2); + tobs->above = (PANELCONS *)0; + if(lobs) + lobs->above = tobs; + else + pan->obscure = tobs; + lobs = tobs; + } + pan2 = pan2->above; } - -} /* end of __calculate_obscure */ + __override(pan,P_TOUCH); + pan = pan->above; + } +} /* end of __calculate_obscure */ /*+------------------------------------------------------------------------- __panel_is_linked(pan) - check to see if panel is in the stack --------------------------------------------------------------------------*/ -STATIC int -__panel_is_linked(PANEL *pan) +static INLINE bool +__panel_is_linked(const PANEL *pan) { -register PANEL *pan2 = __bottom_panel; - - while(pan2) { - if(pan2 == pan) - return(1); - pan2 = pan2->above; - } - return(OK); -} /* end of __panel_is_linked */ + /* This works! The only case where it would fail is, when the list has + only one element. But this could only be the pseudo panel at the bottom */ + return ( ((pan->above!=(PANEL *)0) || + (pan->below!=(PANEL *)0) || + (pan==__bottom_panel)) ? TRUE : FALSE ); +} /* end of __panel_is_linked */ /*+------------------------------------------------------------------------- __panel_link_top(pan) - link panel into stack at top --------------------------------------------------------------------------*/ -STATIC void +static void __panel_link_top(PANEL *pan) { - -#ifdef PANEL_DEBUG - dStack("<lt%d>",1,pan); - if(__panel_is_linked(pan)) - return; +#ifdef TRACE + dStack("<lt%d>",1,pan); + if(__panel_is_linked(pan)) + return; #endif - pan->above = (PANEL *)0; - pan->below = (PANEL *)0; - if(__top_panel) { - __top_panel->above = pan; - pan->below = __top_panel; - } - __top_panel = pan; - if(!__bottom_panel) - __bottom_panel = pan; - __calculate_obscure(); - dStack("<lt%d>",9,pan); - -} /* end of __panel_link_top */ + pan->above = (PANEL *)0; + pan->below = (PANEL *)0; + if(__top_panel) + { + __top_panel->above = pan; + pan->below = __top_panel; + } + __top_panel = pan; + if(!__bottom_panel) + __bottom_panel = pan; + __calculate_obscure(); + dStack("<lt%d>",9,pan); + +} /* end of __panel_link_top */ /*+------------------------------------------------------------------------- __panel_link_bottom(pan) - link panel into stack at bottom --------------------------------------------------------------------------*/ -STATIC void +static void __panel_link_bottom(PANEL *pan) { - -#ifdef PANEL_DEBUG - dStack("<lb%d>",1,pan); - if(__panel_is_linked(pan)) - return; +#ifdef TRACE + dStack("<lb%d>",1,pan); + if(__panel_is_linked(pan)) + return; #endif - pan->above = (PANEL *)0; - pan->below = (PANEL *)0; - if(__bottom_panel) { - __bottom_panel->below = pan; - pan->above = __bottom_panel; - } - __bottom_panel = pan; - if(!__top_panel) - __top_panel = pan; - __calculate_obscure(); - dStack("<lb%d>",9,pan); - -} /* end of __panel_link_bottom */ + pan->above = (PANEL *)0; + pan->below = (PANEL *)0; + if(__bottom_panel) + { /* the stdscr pseudo panel always stays real bottom; + so we insert after bottom panel*/ + pan->below = __bottom_panel; + pan->above = __bottom_panel->above; + if (pan->above) + pan->above->below = pan; + __bottom_panel->above = pan; + } + else + __bottom_panel = pan; + if(!__top_panel) + __top_panel = pan; + assert(__bottom_panel == &__stdscr_pseudo_panel); + __calculate_obscure(); + dStack("<lb%d>",9,pan); +} /* end of __panel_link_bottom */ /*+------------------------------------------------------------------------- __panel_unlink(pan) - unlink panel from stack --------------------------------------------------------------------------*/ -STATIC void +static void __panel_unlink(PANEL *pan) { -register PANEL *prev; -register PANEL *next; + PANEL *prev; + PANEL *next; -#ifdef PANEL_DEBUG - dStack("<u%d>",1,pan); - if(!__panel_is_linked(pan)) - return; +#ifdef TRACE + dStack("<u%d>",1,pan); + if(!__panel_is_linked(pan)) + return; #endif - __override(pan,0); - __free_obscure(pan); - - prev = pan->below; - next = pan->above; + __override(pan,P_TOUCH); + __free_obscure(pan); - if(prev) { /* if non-zero, we will not update the list head */ - prev->above = next; - if(next) - next->below = prev; - } - else if(next) - next->below = prev; - if(pan == __bottom_panel) - __bottom_panel = next; - if(pan == __top_panel) - __top_panel = prev; + prev = pan->below; + next = pan->above; - __calculate_obscure(); + if(prev) + { /* if non-zero, we will not update the list head */ + prev->above = next; + if(next) + next->below = prev; + } + else if(next) + next->below = prev; + if(pan == __bottom_panel) + __bottom_panel = next; + if(pan == __top_panel) + __top_panel = prev; - pan->above = (PANEL *)0; - pan->below = (PANEL *)0; - dStack("<u%d>",9,pan); + __calculate_obscure(); -} /* end of __panel_unlink */ + pan->above = (PANEL *)0; + pan->below = (PANEL *)0; + dStack("<u%d>",9,pan); +} /* end of __panel_unlink */ /*+------------------------------------------------------------------------- panel_window(pan) - get window associated with panel --------------------------------------------------------------------------*/ WINDOW * -panel_window(PANEL *pan) +panel_window(const PANEL *pan) { - return(pan->win); -} /* end of panel_window */ + return(pan ? pan->win : (WINDOW *)0); +} /* end of panel_window */ /*+------------------------------------------------------------------------- update_panels() - wnoutrefresh windows in an orderly fashion @@ -378,25 +424,24 @@ panel_window(PANEL *pan) void update_panels(void) { -PANEL *pan; - - dBug(("--> update_panels")); - pan = __bottom_panel; - while(pan) { - __override(pan,-1); - pan = pan->above; - } - - if(is_wintouched(stdscr) || (stdscr->_flags & _HASMOVED)) - Wnoutrefresh(&__stdscr_pseudo_panel); - - if(__bottom_panel) { - for (pan = __bottom_panel; pan; pan = pan->above) { - if(is_wintouched(pan->win)) - Wnoutrefresh(pan); - } - } -} /* end of update_panels */ + PANEL *pan; + + dBug(("--> update_panels")); + pan = __bottom_panel; + while(pan) + { + __override(pan,P_UPDATE); + pan = pan->above; + } + + pan = __bottom_panel; + while (pan) + { + if(is_wintouched(pan->win)) + Wnoutrefresh(pan); + pan = pan->above; + } +} /* end of update_panels */ /*+------------------------------------------------------------------------- hide_panel(pan) - remove a panel from stack @@ -404,22 +449,21 @@ PANEL *pan; int hide_panel(register PANEL *pan) { + if(!pan) + return(ERR); - if(!pan) - return(ERR); - - dBug(("--> hide_panel %s",pan->user)); - - if(!__panel_is_linked(pan)) { - pan->above = (PANEL *)0; - pan->below = (PANEL *)0; - return(ERR); - } + dBug(("--> hide_panel %s", USER_PTR(pan->user))); - __panel_unlink(pan); + if(!__panel_is_linked(pan)) + { + pan->above = (PANEL *)0; + pan->below = (PANEL *)0; + return(ERR); + } - return(OK); -} /* end of hide_panel */ + __panel_unlink(pan); + return(OK); +} /* end of hide_panel */ /*+------------------------------------------------------------------------- show_panel(pan) - place a panel on top of stack @@ -428,17 +472,16 @@ may already be in stack int show_panel(register PANEL *pan) { - - if(!pan) - return(ERR); - if(pan == __top_panel) - return(OK); - dBug(("--> show_panel %s",pan->user)); - if(__panel_is_linked(pan)) - (void)hide_panel(pan); - __panel_link_top(pan); - return(OK); -} /* end of show_panel */ + if(!pan) + return(ERR); + if(pan == __top_panel) + return(OK); + dBug(("--> show_panel %s", USER_PTR(pan->user))); + if(__panel_is_linked(pan)) + (void)hide_panel(pan); + __panel_link_top(pan); + return(OK); +} /* end of show_panel */ /*+------------------------------------------------------------------------- top_panel(pan) - place a panel on top of stack @@ -446,8 +489,8 @@ show_panel(register PANEL *pan) int top_panel(register PANEL *pan) { - return(show_panel(pan)); -} /* end of top_panel */ + return(show_panel(pan)); +} /* end of top_panel */ /*+------------------------------------------------------------------------- del_panel(pan) - remove a panel from stack, if in it, and free struct @@ -455,16 +498,16 @@ top_panel(register PANEL *pan) int del_panel(register PANEL *pan) { - if(pan) - { - dBug(("--> del_panel %s",pan->user)); - if(__panel_is_linked(pan)) - (void)hide_panel(pan); - free((char *)pan); - return(OK); - } - return(ERR); -} /* end of del_panel */ + if(pan) + { + dBug(("--> del_panel %s", USER_PTR(pan->user))); + if(__panel_is_linked(pan)) + (void)hide_panel(pan); + free((void *)pan); + return(OK); + } + return(ERR); +} /* end of del_panel */ /*+------------------------------------------------------------------------- bottom_panel(pan) - place a panel on bottom of stack @@ -473,16 +516,16 @@ may already be in stack int bottom_panel(register PANEL *pan) { - if(!pan) - return(ERR); - if(pan == __bottom_panel) - return(OK); - dBug(("--> bottom_panel %s",pan->user)); - if(__panel_is_linked(pan)) - (void)hide_panel(pan); - __panel_link_bottom(pan); - return(OK); -} /* end of bottom_panel */ + if(!pan) + return(ERR); + if(pan == __bottom_panel) + return(OK); + dBug(("--> bottom_panel %s", USER_PTR(pan->user))); + if(__panel_is_linked(pan)) + (void)hide_panel(pan); + __panel_link_bottom(pan); + return(OK); +} /* end of bottom_panel */ /*+------------------------------------------------------------------------- new_panel(win) - create a panel and place on top of stack @@ -490,83 +533,83 @@ bottom_panel(register PANEL *pan) PANEL * new_panel(WINDOW *win) { -PANEL *pan = (PANEL *)malloc(sizeof(PANEL)); - - if(!__stdscr_pseudo_panel.win) { - __stdscr_pseudo_panel.win = stdscr; - __stdscr_pseudo_panel.wstarty = 0; - __stdscr_pseudo_panel.wstartx = 0; - __stdscr_pseudo_panel.wendy = LINES; - __stdscr_pseudo_panel.wendx = COLS; - __stdscr_pseudo_panel.user = "stdscr"; - __stdscr_pseudo_panel.obscure = (PANELCONS *)0; - } - - if(pan) { - pan->win = win; - pan->above = (PANEL *)0; - pan->below = (PANEL *)0; - getbegyx(win, pan->wstarty, pan->wstartx); - pan->wendy = pan->wstarty + getmaxy(win); - pan->wendx = pan->wstartx + getmaxx(win); -#ifdef PANEL_DEBUG - pan->user = "new"; + PANEL *pan = (PANEL *)malloc(sizeof(PANEL)); + + (void)__root_panel(); + + if(pan) + { + pan->win = win; + pan->above = (PANEL *)0; + pan->below = (PANEL *)0; + getbegyx(win, pan->wstarty, pan->wstartx); + pan->wendy = pan->wstarty + getmaxy(win); + pan->wendx = pan->wstartx + getmaxx(win); +#ifdef TRACE + pan->user = "new"; #else - pan->user = (char *)0; + pan->user = (char *)0; #endif - pan->obscure = (PANELCONS *)0; - (void)show_panel(pan); - } - - return(pan); -} /* end of new_panel */ + pan->obscure = (PANELCONS *)0; + (void)show_panel(pan); + } + return(pan); +} /* end of new_panel */ /*+------------------------------------------------------------------------- panel_above(pan) --------------------------------------------------------------------------*/ PANEL * -panel_above(PANEL *pan) +panel_above(const PANEL *pan) { - if(!pan) - return(__bottom_panel); - else - return(pan->above); -} /* end of panel_above */ + if(!pan) + { + /* if top and bottom are equal, we have no or only the pseudo panel; + if not, we return the panel above the pseudo panel */ + return(__bottom_panel==__top_panel ? (PANEL*)0 : __bottom_panel->above); + } + else + return(pan->above); +} /* end of panel_above */ /*+------------------------------------------------------------------------- panel_below(pan) --------------------------------------------------------------------------*/ PANEL * -panel_below(PANEL *pan) +panel_below(const PANEL *pan) { - if(!pan) - return(__top_panel); - else - return(pan->below); -} /* end of panel_below */ + if(!pan) + { + /* if top and bottom are equal, we have no or only the pseudo panel */ + return(__top_panel==__bottom_panel ? (PANEL*)0 : __top_panel); + } + else + { + /* we must not return the pseudo panel */ + return(pan->below==__bottom_panel ? (PANEL*) 0 : pan->below); + } +} /* end of panel_below */ /*+------------------------------------------------------------------------- set_panel_userptr(pan,uptr) --------------------------------------------------------------------------*/ int -set_panel_userptr(PANEL *pan, char *uptr) +set_panel_userptr(PANEL *pan, const void *uptr) { - if(!pan) - return(ERR); - pan->user = uptr; - return(OK); -} /* end of set_panel_userptr */ + if(!pan) + return(ERR); + pan->user = uptr; + return(OK); +} /* end of set_panel_userptr */ /*+------------------------------------------------------------------------- panel_userptr(pan) --------------------------------------------------------------------------*/ -char * -panel_userptr(PANEL *pan) +const void* +panel_userptr(const PANEL *pan) { - if(!pan) - return((char *)0); - return(pan->user); -} /* end of panel_userptr */ + return(pan ? pan->user : (void *)0); +} /* end of panel_userptr */ /*+------------------------------------------------------------------------- move_panel(pan,starty,startx) @@ -574,22 +617,22 @@ panel_userptr(PANEL *pan) int move_panel(PANEL *pan, int starty, int startx) { -WINDOW *win; - - if(!pan) - return(ERR); - if(__panel_is_linked(pan)) - __override(pan,0); - win = pan->win; - if(mvwin(win,starty,startx)) - return(ERR); - getbegyx(win, pan->wstarty, pan->wstartx); - pan->wendy = pan->wstarty + getmaxy(win); - pan->wendx = pan->wstartx + getmaxx(win); - if(__panel_is_linked(pan)) - __calculate_obscure(); - return(OK); -} /* end of move_panel */ + WINDOW *win; + + if(!pan) + return(ERR); + if(__panel_is_linked(pan)) + __override(pan,P_TOUCH); + win = pan->win; + if(mvwin(win,starty,startx)) + return(ERR); + getbegyx(win, pan->wstarty, pan->wstartx); + pan->wendy = pan->wstarty + getmaxy(win); + pan->wendx = pan->wstartx + getmaxx(win); + if(__panel_is_linked(pan)) + __calculate_obscure(); + return(OK); +} /* end of move_panel */ /*+------------------------------------------------------------------------- replace_panel(pan,win) @@ -597,25 +640,25 @@ WINDOW *win; int replace_panel(PANEL *pan, WINDOW *win) { - if(!pan) - return(ERR); - if(__panel_is_linked(pan)) - __override(pan,0); - pan->win = win; - if(__panel_is_linked(pan)) - __calculate_obscure(); - return(OK); -} /* end of replace_panel */ + if(!pan) + return(ERR); + if(__panel_is_linked(pan)) + __override(pan,P_TOUCH); + pan->win = win; + if(__panel_is_linked(pan)) + __calculate_obscure(); + return(OK); +} /* end of replace_panel */ /*+------------------------------------------------------------------------- panel_hidden(pan) --------------------------------------------------------------------------*/ int -panel_hidden(PANEL *pan) +panel_hidden(const PANEL *pan) { - if(!pan) - return(ERR); - return(__panel_is_linked(pan) ? ERR : OK); -} /* end of panel_hidden */ + if(!pan) + return(ERR); + return(__panel_is_linked(pan) ? TRUE : FALSE); +} /* end of panel_hidden */ /* end of panel.c */ |