summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/libpanel/Makefile1
-rw-r--r--lib/libpanel/panel.318
-rw-r--r--lib/libpanel/panel.c817
-rw-r--r--lib/libpanel/panel.h14
-rw-r--r--lib/libpanel/panel.priv.h52
-rw-r--r--lib/libpanel/shlib_version2
6 files changed, 500 insertions, 404 deletions
diff --git a/lib/libpanel/Makefile b/lib/libpanel/Makefile
index 938f750b552..91f9ab85a37 100644
--- a/lib/libpanel/Makefile
+++ b/lib/libpanel/Makefile
@@ -2,6 +2,7 @@ LIB= panel
SRCS= panel.c
HDRS= panel.h
MAN= panel.3
+CFLAGS+= -I${.CURDIR}/../libcurses -DHAVE_CONFIG_H
includes:
@cd ${.CURDIR}; for i in ${HDRS}; do \
diff --git a/lib/libpanel/panel.3 b/lib/libpanel/panel.3
index 13f9de094d9..6d06b1a838f 100644
--- a/lib/libpanel/panel.3
+++ b/lib/libpanel/panel.3
@@ -1,6 +1,6 @@
.TH panel 3X ""
.ds n 5
-.ds d @TERMINFO@
+.ds d /usr/share/terminfo
.SH NAME
panel - panel stack extension for curses
.SH SYNOPSIS
@@ -20,21 +20,21 @@ panel - panel stack extension for curses
.br
\fBint hide_panel(PANEL *pan)\fR
.br
-\fBWINDOW *panel_window(PANEL *pan)\fR
+\fBWINDOW *panel_window(const PANEL *pan)\fR
.br
\fBint replace_panel(PANEL *pan, WINDOW *window)\fR
.br
\fBint move_panel(PANEL *pan, int starty, int startx)\fR
.br
-\fBint panel_hidden(PANEL *pan)\fR
+\fBint panel_hidden(const PANEL *pan)\fR
.br
-\fBPANEL *panel_above(PANEL *pan)\fR
+\fBPANEL *panel_above(const PANEL *pan)\fR
.br
-\fBPANEL *panel_below(PANEL *pan)\fR
+\fBPANEL *panel_below(const PANEL *pan)\fR
.br
-\fBint set_panel_userptr(PANEL *pan, char *ptr)\fR
+\fBint set_panel_userptr(PANEL *pan, const void *ptr)\fR
.br
-\fBchar *panel_userptr(PANEL *pan)\fR
+\fBconst void *panel_userptr(const PANEL *pan)\fR
.br
\fBint del_panel(PANEL *pan)\fR
.br
@@ -56,7 +56,7 @@ high-level curses calls, and work anywhere terminfo curses does.
.SH FUNCTIONS
.TP
\fBnew_panel(win)\fR
-allocates a \fBPANEL\fR structure, assovciates it with
+allocates a \fBPANEL\fR structure, associates it with
\fBwin\fR, places the panel on the top of the stack (causes it
to be displayed above any other panel) and returns a
pointer to the new panel.
@@ -136,7 +136,7 @@ move to the top of the stack. You are cautioned to use the correct
function to ensure compatibility with native panel libraries.
.SH NOTE
In your library list, libpanel.a should be before libcurses.a; that is,
-you want to say `-lpanel -lcurses -ltermlib', not the other way around (which would
+you want to say `-lpanel -lcurses', not the other way around (which would
give you a link error using GNU \fBld\fR(1) and some other linkers).
.SH FILES
.P
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 */
diff --git a/lib/libpanel/panel.h b/lib/libpanel/panel.h
index 8c9b6b92047..2f917827459 100644
--- a/lib/libpanel/panel.h
+++ b/lib/libpanel/panel.h
@@ -37,7 +37,7 @@ typedef struct panel
int wendx;
struct panel *below;
struct panel *above;
- char *user;
+ const void *user;
struct panelcons *obscure;
}
PANEL;
@@ -46,7 +46,7 @@ PANEL;
extern "C" {
#endif
-extern WINDOW *panel_window(PANEL *);
+extern WINDOW *panel_window(const PANEL *);
extern void update_panels(void);
extern int hide_panel(PANEL *);
extern int show_panel(PANEL *);
@@ -54,13 +54,13 @@ extern int del_panel(PANEL *);
extern int top_panel(PANEL *);
extern int bottom_panel(PANEL *);
extern PANEL *new_panel(WINDOW *);
-extern PANEL *panel_above(PANEL *);
-extern PANEL *panel_below(PANEL *);
-extern int set_panel_userptr(PANEL *,char *);
-extern char *panel_userptr(PANEL *);
+extern PANEL *panel_above(const PANEL *);
+extern PANEL *panel_below(const PANEL *);
+extern int set_panel_userptr(PANEL *,const void *);
+extern const void* panel_userptr(const PANEL *);
extern int move_panel(PANEL *, int, int);
extern int replace_panel(PANEL *,WINDOW *);
-extern int panel_hidden(PANEL *);
+extern int panel_hidden(const PANEL *);
#if defined(__cplusplus)
}
diff --git a/lib/libpanel/panel.priv.h b/lib/libpanel/panel.priv.h
new file mode 100644
index 00000000000..1d12e1822c1
--- /dev/null
+++ b/lib/libpanel/panel.priv.h
@@ -0,0 +1,52 @@
+/* $Id: panel.priv.h,v 1.1 1997/11/26 03:56:06 millert Exp $ */
+
+#ifndef _PANEL_PRIV_H
+#define _PANEL_PRIV_H
+
+#if HAVE_CONFIG_H
+# include <ncurses_cfg.h>
+#endif
+
+#include <stdlib.h>
+#include <assert.h>
+
+#if HAVE_LIBDMALLOC
+#include <dmalloc.h> /* Gray Watson's library */
+#endif
+
+#if HAVE_LIBDBMALLOC
+#include <dbmalloc.h> /* Conor Cahill's library */
+#endif
+
+#include "panel.h"
+
+
+#if ( CC_HAS_INLINE_FUNCS && !defined(TRACE) )
+# define INLINE inline
+#else
+# define INLINE
+#endif
+
+
+typedef struct panelcons
+{
+ struct panelcons *above;
+ struct panel *pan;
+} PANELCONS;
+
+#ifdef TRACE
+# define dBug(x) _tracef x
+#else
+# define dBug(x)
+#endif
+
+#ifdef USE_RCS_IDS
+#define MODULE_ID(id) static const char Ident[] = id;
+#else
+#define MODULE_ID(id) /*nothing*/
+#endif
+
+#define P_TOUCH (0)
+#define P_UPDATE (1)
+
+#endif
diff --git a/lib/libpanel/shlib_version b/lib/libpanel/shlib_version
index 97c9f92d6b8..1edea46de91 100644
--- a/lib/libpanel/shlib_version
+++ b/lib/libpanel/shlib_version
@@ -1,2 +1,2 @@
-major=0
+major=1
minor=0