xref: /openbsd-src/lib/libpanel/panel.c (revision 5ccab61934faf55a1aab8bfa60df77051688d3ff)
1*5ccab619Stholo 
2*5ccab619Stholo /***************************************************************************
3*5ccab619Stholo *                            COPYRIGHT NOTICE                              *
4*5ccab619Stholo ****************************************************************************
5*5ccab619Stholo *                     panels is copyright (C) 1995                         *
6*5ccab619Stholo *                          Zeyd M. Ben-Halim                               *
7*5ccab619Stholo *                          zmbenhal@netcom.com                             *
8*5ccab619Stholo *                          Eric S. Raymond                                 *
9*5ccab619Stholo *                          esr@snark.thyrsus.com                           *
10*5ccab619Stholo *                                                                          *
11*5ccab619Stholo *	      All praise to the original author, Warren Tucker.            *
12*5ccab619Stholo *                                                                          *
13*5ccab619Stholo *        Permission is hereby granted to reproduce and distribute panels   *
14*5ccab619Stholo *        by any means and for any fee, whether alone or as part of a       *
15*5ccab619Stholo *        larger distribution, in source or in binary form, PROVIDED        *
16*5ccab619Stholo *        this notice is included with any such distribution, and is not    *
17*5ccab619Stholo *        removed from any of its header files. Mention of panels in any    *
18*5ccab619Stholo *        applications linked with it is highly appreciated.                *
19*5ccab619Stholo *                                                                          *
20*5ccab619Stholo *        panels comes AS IS with no warranty, implied or expressed.        *
21*5ccab619Stholo *                                                                          *
22*5ccab619Stholo ***************************************************************************/
23*5ccab619Stholo 
24*5ccab619Stholo /* panel.c -- implementation of panels library */
25*5ccab619Stholo 
26*5ccab619Stholo #ifdef TRACE
27*5ccab619Stholo #define PANEL_DEBUG
28*5ccab619Stholo #endif
29*5ccab619Stholo 
30*5ccab619Stholo #include <stdlib.h>
31*5ccab619Stholo #include "panel.h"
32*5ccab619Stholo 
33*5ccab619Stholo typedef struct panelcons
34*5ccab619Stholo {
35*5ccab619Stholo 	struct panelcons *above;
36*5ccab619Stholo 	struct panel *pan;
37*5ccab619Stholo }
38*5ccab619Stholo PANELCONS;
39*5ccab619Stholo 
40*5ccab619Stholo #define STATIC static
41*5ccab619Stholo 
42*5ccab619Stholo STATIC PANEL *__bottom_panel = (PANEL *)0;
43*5ccab619Stholo STATIC PANEL *__top_panel = (PANEL *)0;
44*5ccab619Stholo STATIC PANEL __stdscr_pseudo_panel = { (WINDOW *)0 };
45*5ccab619Stholo 
46*5ccab619Stholo #ifdef PANEL_DEBUG
47*5ccab619Stholo #define dBug(x) _tracef x
48*5ccab619Stholo #else
49*5ccab619Stholo #define dBug(x)
50*5ccab619Stholo #endif
51*5ccab619Stholo 
52*5ccab619Stholo /*+-------------------------------------------------------------------------
53*5ccab619Stholo 	dPanel(text,pan)
54*5ccab619Stholo --------------------------------------------------------------------------*/
55*5ccab619Stholo #ifdef PANEL_DEBUG
56*5ccab619Stholo STATIC void
57*5ccab619Stholo dPanel(char *text, PANEL *pan)
58*5ccab619Stholo {
59*5ccab619Stholo 	_tracef("%s id=%s b=%s a=%s y=%d x=%d",
60*5ccab619Stholo 		text,pan->user,
61*5ccab619Stholo 		(pan->below) ? pan->below->user : "--",
62*5ccab619Stholo 		(pan->above) ? pan->above->user : "--",
63*5ccab619Stholo 		pan->wstarty, pan->wstartx);
64*5ccab619Stholo }	/* end of dPanel */
65*5ccab619Stholo #else
66*5ccab619Stholo #define dPanel(text,pan)
67*5ccab619Stholo #endif
68*5ccab619Stholo 
69*5ccab619Stholo /*+-------------------------------------------------------------------------
70*5ccab619Stholo 	dStack(fmt,num,pan)
71*5ccab619Stholo --------------------------------------------------------------------------*/
72*5ccab619Stholo #ifdef PANEL_DEBUG
73*5ccab619Stholo STATIC void
74*5ccab619Stholo dStack(char *fmt, int num, PANEL *pan)
75*5ccab619Stholo {
76*5ccab619Stholo char s80[80];
77*5ccab619Stholo 
78*5ccab619Stholo 	sprintf(s80,fmt,num,pan);
79*5ccab619Stholo 	_tracef("%s b=%s t=%s",s80,
80*5ccab619Stholo 		(__bottom_panel) ? __bottom_panel->user : "--",
81*5ccab619Stholo 		(__top_panel)    ? __top_panel->user    : "--");
82*5ccab619Stholo 	if(pan)
83*5ccab619Stholo 		_tracef("pan id=%s",pan->user);
84*5ccab619Stholo 	pan = __bottom_panel;
85*5ccab619Stholo 	while(pan)
86*5ccab619Stholo 	{
87*5ccab619Stholo 		dPanel("stk",pan);
88*5ccab619Stholo 		pan = pan->above;
89*5ccab619Stholo 	}
90*5ccab619Stholo }	/* end of dStack */
91*5ccab619Stholo #else
92*5ccab619Stholo #define dStack(fmt,num,pan)
93*5ccab619Stholo #endif
94*5ccab619Stholo 
95*5ccab619Stholo /*+-------------------------------------------------------------------------
96*5ccab619Stholo 	Wnoutrefresh(pan) - debugging hook for wnoutrefresh
97*5ccab619Stholo --------------------------------------------------------------------------*/
98*5ccab619Stholo #ifdef PANEL_DEBUG
99*5ccab619Stholo STATIC void
100*5ccab619Stholo Wnoutrefresh(PANEL *pan)
101*5ccab619Stholo {
102*5ccab619Stholo 	dPanel("wnoutrefresh",pan);
103*5ccab619Stholo 	wnoutrefresh(pan->win);
104*5ccab619Stholo }	/* end of Wnoutrefresh */
105*5ccab619Stholo #else
106*5ccab619Stholo #define Wnoutrefresh(pan) wnoutrefresh((pan)->win)
107*5ccab619Stholo #endif
108*5ccab619Stholo 
109*5ccab619Stholo /*+-------------------------------------------------------------------------
110*5ccab619Stholo 	Touchpan(pan)
111*5ccab619Stholo --------------------------------------------------------------------------*/
112*5ccab619Stholo #ifdef PANEL_DEBUG
113*5ccab619Stholo STATIC void
114*5ccab619Stholo Touchpan(PANEL *pan)
115*5ccab619Stholo {
116*5ccab619Stholo 	dPanel("Touchpan",pan);
117*5ccab619Stholo 	touchwin(pan->win);
118*5ccab619Stholo }	/* end of Touchpan */
119*5ccab619Stholo #else
120*5ccab619Stholo #define Touchpan(pan) touchwin((pan)->win)
121*5ccab619Stholo #endif
122*5ccab619Stholo 
123*5ccab619Stholo /*+-------------------------------------------------------------------------
124*5ccab619Stholo 	Touchline(pan,start,count)
125*5ccab619Stholo --------------------------------------------------------------------------*/
126*5ccab619Stholo #ifdef PANEL_DEBUG
127*5ccab619Stholo STATIC void
128*5ccab619Stholo Touchline(PANEL *pan, int start, int count)
129*5ccab619Stholo {
130*5ccab619Stholo char s80[80];
131*5ccab619Stholo 	sprintf(s80,"Touchline s=%d c=%d",start,count);
132*5ccab619Stholo 	dPanel(s80,pan);
133*5ccab619Stholo 	touchline(pan->win,start,count);
134*5ccab619Stholo }	/* end of Touchline */
135*5ccab619Stholo #else
136*5ccab619Stholo #define Touchline(pan,start,count) touchline((pan)->win,start,count)
137*5ccab619Stholo #endif
138*5ccab619Stholo 
139*5ccab619Stholo /*+-------------------------------------------------------------------------
140*5ccab619Stholo 	__panels_overlapped(pan1,pan2) - check panel overlapped
141*5ccab619Stholo --------------------------------------------------------------------------*/
142*5ccab619Stholo STATIC int
143*5ccab619Stholo __panels_overlapped(register PANEL *pan1, register PANEL *pan2)
144*5ccab619Stholo {
145*5ccab619Stholo 	if(!pan1 || !pan2)
146*5ccab619Stholo 		return(0);
147*5ccab619Stholo 	dBug(("__panels_overlapped %s %s",pan1->user,pan2->user));
148*5ccab619Stholo 	if((pan1->wstarty >= pan2->wstarty) && (pan1->wstarty < pan2->wendy) &&
149*5ccab619Stholo 		(pan1->wstartx >= pan2->wstartx) && (pan1->wstartx < pan2->wendx))
150*5ccab619Stholo 		return(1);
151*5ccab619Stholo 	if((pan1->wstarty >= pan1->wstarty) && (pan2->wstarty < pan1->wendy) &&
152*5ccab619Stholo 		(pan1->wstartx >= pan1->wstartx) && (pan2->wstartx < pan1->wendx))
153*5ccab619Stholo 		return(1);
154*5ccab619Stholo 	dBug(("  no"));
155*5ccab619Stholo 	return(0);
156*5ccab619Stholo }	/* end of __panels_overlapped */
157*5ccab619Stholo 
158*5ccab619Stholo /*+-------------------------------------------------------------------------
159*5ccab619Stholo 	__free_obscure(pan)
160*5ccab619Stholo --------------------------------------------------------------------------*/
161*5ccab619Stholo STATIC void
162*5ccab619Stholo __free_obscure(PANEL *pan)
163*5ccab619Stholo {
164*5ccab619Stholo PANELCONS *tobs = pan->obscure;				/* "this" one */
165*5ccab619Stholo PANELCONS *nobs;					/* "next" one */
166*5ccab619Stholo 
167*5ccab619Stholo 	while(tobs) {
168*5ccab619Stholo 		nobs = tobs->above;
169*5ccab619Stholo 		free((char *)tobs);
170*5ccab619Stholo 		tobs = nobs;
171*5ccab619Stholo 	}
172*5ccab619Stholo 	pan->obscure = (PANELCONS *)0;
173*5ccab619Stholo }	/* end of __free_obscure */
174*5ccab619Stholo 
175*5ccab619Stholo /*+-------------------------------------------------------------------------
176*5ccab619Stholo 	__override(pan,show)
177*5ccab619Stholo --------------------------------------------------------------------------*/
178*5ccab619Stholo STATIC void
179*5ccab619Stholo __override(PANEL *pan, int show)
180*5ccab619Stholo {
181*5ccab619Stholo register y;
182*5ccab619Stholo register PANEL *pan2;
183*5ccab619Stholo PANELCONS *tobs = pan->obscure;				/* "this" one */
184*5ccab619Stholo 
185*5ccab619Stholo 	dBug(("__override %s,%d",pan->user,show));
186*5ccab619Stholo 
187*5ccab619Stholo 	if(show == 1)
188*5ccab619Stholo 		Touchpan(pan);
189*5ccab619Stholo 	else if(!show) {
190*5ccab619Stholo 		Touchpan(pan);
191*5ccab619Stholo /*
192*5ccab619Stholo 		Touchline(&__stdscr_pseudo_panel,pan->wendy,getmaxy(pan->win));
193*5ccab619Stholo */
194*5ccab619Stholo 		Touchpan(&__stdscr_pseudo_panel);
195*5ccab619Stholo 	} else if(show == -1) {
196*5ccab619Stholo 		while(tobs && (tobs->pan != pan))
197*5ccab619Stholo 			tobs = tobs->above;
198*5ccab619Stholo 	}
199*5ccab619Stholo 
200*5ccab619Stholo 	while(tobs) {
201*5ccab619Stholo 		if((pan2 = tobs->pan) != pan) {
202*5ccab619Stholo 			dBug(("test obs pan=%s pan2=%s",pan->user,pan2->user));
203*5ccab619Stholo 			for(y = pan->wstarty; y < pan->wendy; y++) {
204*5ccab619Stholo 				if( (y >= pan2->wstarty) && (y < pan2->wendy) &&
205*5ccab619Stholo 					((is_linetouched(pan->win,y - pan->wstarty) == 1) ||
206*5ccab619Stholo 					(is_linetouched(stdscr,y) == 1)))
207*5ccab619Stholo 				{
208*5ccab619Stholo 					Touchline(pan2,y - pan2->wstarty,1);
209*5ccab619Stholo 				}
210*5ccab619Stholo 			}
211*5ccab619Stholo 		}
212*5ccab619Stholo 		tobs = tobs->above;
213*5ccab619Stholo 	}
214*5ccab619Stholo }	/* end of __override */
215*5ccab619Stholo 
216*5ccab619Stholo /*+-------------------------------------------------------------------------
217*5ccab619Stholo 	__calculate_obscure()
218*5ccab619Stholo --------------------------------------------------------------------------*/
219*5ccab619Stholo STATIC void
220*5ccab619Stholo __calculate_obscure(void)
221*5ccab619Stholo {
222*5ccab619Stholo PANEL *pan;
223*5ccab619Stholo register PANEL *pan2;
224*5ccab619Stholo register PANELCONS *tobs;			/* "this" one */
225*5ccab619Stholo PANELCONS *lobs = (PANELCONS *)0;		/* last one */
226*5ccab619Stholo 
227*5ccab619Stholo 	pan = __bottom_panel;
228*5ccab619Stholo 	while(pan) {
229*5ccab619Stholo 		if(pan->obscure)
230*5ccab619Stholo 			__free_obscure(pan);
231*5ccab619Stholo 		dBug(("--> __calculate_obscure %s",pan->user));
232*5ccab619Stholo 		lobs = (PANELCONS *)0;		/* last one */
233*5ccab619Stholo 		pan2 = __bottom_panel;
234*5ccab619Stholo 		while(pan2) {
235*5ccab619Stholo 			if(__panels_overlapped(pan,pan2)) {
236*5ccab619Stholo 				if(!(tobs = (PANELCONS *)malloc(sizeof(PANELCONS))))
237*5ccab619Stholo 					return;
238*5ccab619Stholo 				tobs->pan = pan2;
239*5ccab619Stholo 				dPanel("obscured",pan2);
240*5ccab619Stholo 				tobs->above = (PANELCONS *)0;
241*5ccab619Stholo 				if(lobs)
242*5ccab619Stholo 					lobs->above = tobs;
243*5ccab619Stholo 				else
244*5ccab619Stholo 					pan->obscure = tobs;
245*5ccab619Stholo 				lobs  = tobs;
246*5ccab619Stholo 			}
247*5ccab619Stholo 			pan2 = pan2->above;
248*5ccab619Stholo 		}
249*5ccab619Stholo 		__override(pan,1);
250*5ccab619Stholo 		pan = pan->above;
251*5ccab619Stholo 	}
252*5ccab619Stholo 
253*5ccab619Stholo }	/* end of __calculate_obscure */
254*5ccab619Stholo 
255*5ccab619Stholo /*+-------------------------------------------------------------------------
256*5ccab619Stholo 	__panel_is_linked(pan) - check to see if panel is in the stack
257*5ccab619Stholo --------------------------------------------------------------------------*/
258*5ccab619Stholo STATIC int
259*5ccab619Stholo __panel_is_linked(PANEL *pan)
260*5ccab619Stholo {
261*5ccab619Stholo register PANEL *pan2 = __bottom_panel;
262*5ccab619Stholo 
263*5ccab619Stholo 	while(pan2) {
264*5ccab619Stholo 		if(pan2 == pan)
265*5ccab619Stholo 			return(1);
266*5ccab619Stholo 		pan2 = pan2->above;
267*5ccab619Stholo 	}
268*5ccab619Stholo 	return(OK);
269*5ccab619Stholo }	/* end of __panel_is_linked */
270*5ccab619Stholo 
271*5ccab619Stholo /*+-------------------------------------------------------------------------
272*5ccab619Stholo 	__panel_link_top(pan) - link panel into stack at top
273*5ccab619Stholo --------------------------------------------------------------------------*/
274*5ccab619Stholo STATIC void
275*5ccab619Stholo __panel_link_top(PANEL *pan)
276*5ccab619Stholo {
277*5ccab619Stholo 
278*5ccab619Stholo #ifdef PANEL_DEBUG
279*5ccab619Stholo 	dStack("<lt%d>",1,pan);
280*5ccab619Stholo 	if(__panel_is_linked(pan))
281*5ccab619Stholo 		return;
282*5ccab619Stholo #endif
283*5ccab619Stholo 
284*5ccab619Stholo 	pan->above = (PANEL *)0;
285*5ccab619Stholo 	pan->below = (PANEL *)0;
286*5ccab619Stholo 	if(__top_panel) {
287*5ccab619Stholo 		__top_panel->above = pan;
288*5ccab619Stholo 		pan->below = __top_panel;
289*5ccab619Stholo 	}
290*5ccab619Stholo 	__top_panel = pan;
291*5ccab619Stholo 	if(!__bottom_panel)
292*5ccab619Stholo 		__bottom_panel = pan;
293*5ccab619Stholo 	__calculate_obscure();
294*5ccab619Stholo 	dStack("<lt%d>",9,pan);
295*5ccab619Stholo 
296*5ccab619Stholo }	/* end of __panel_link_top */
297*5ccab619Stholo 
298*5ccab619Stholo /*+-------------------------------------------------------------------------
299*5ccab619Stholo 	__panel_link_bottom(pan) - link panel into stack at bottom
300*5ccab619Stholo --------------------------------------------------------------------------*/
301*5ccab619Stholo STATIC void
302*5ccab619Stholo __panel_link_bottom(PANEL *pan)
303*5ccab619Stholo {
304*5ccab619Stholo 
305*5ccab619Stholo #ifdef PANEL_DEBUG
306*5ccab619Stholo 	dStack("<lb%d>",1,pan);
307*5ccab619Stholo 	if(__panel_is_linked(pan))
308*5ccab619Stholo 		return;
309*5ccab619Stholo #endif
310*5ccab619Stholo 
311*5ccab619Stholo 	pan->above = (PANEL *)0;
312*5ccab619Stholo 	pan->below = (PANEL *)0;
313*5ccab619Stholo 	if(__bottom_panel) {
314*5ccab619Stholo 		__bottom_panel->below = pan;
315*5ccab619Stholo 		pan->above = __bottom_panel;
316*5ccab619Stholo 	}
317*5ccab619Stholo 	__bottom_panel = pan;
318*5ccab619Stholo 	if(!__top_panel)
319*5ccab619Stholo 		__top_panel = pan;
320*5ccab619Stholo 	__calculate_obscure();
321*5ccab619Stholo 	dStack("<lb%d>",9,pan);
322*5ccab619Stholo 
323*5ccab619Stholo }	/* end of __panel_link_bottom */
324*5ccab619Stholo 
325*5ccab619Stholo /*+-------------------------------------------------------------------------
326*5ccab619Stholo 	__panel_unlink(pan) - unlink panel from stack
327*5ccab619Stholo --------------------------------------------------------------------------*/
328*5ccab619Stholo STATIC void
329*5ccab619Stholo __panel_unlink(PANEL *pan)
330*5ccab619Stholo {
331*5ccab619Stholo register PANEL *prev;
332*5ccab619Stholo register PANEL *next;
333*5ccab619Stholo 
334*5ccab619Stholo #ifdef PANEL_DEBUG
335*5ccab619Stholo 	dStack("<u%d>",1,pan);
336*5ccab619Stholo 	if(!__panel_is_linked(pan))
337*5ccab619Stholo 		return;
338*5ccab619Stholo #endif
339*5ccab619Stholo 
340*5ccab619Stholo 	__override(pan,0);
341*5ccab619Stholo 	__free_obscure(pan);
342*5ccab619Stholo 
343*5ccab619Stholo 	prev = pan->below;
344*5ccab619Stholo 	next = pan->above;
345*5ccab619Stholo 
346*5ccab619Stholo 	if(prev) {		/* if non-zero, we will not update the list head */
347*5ccab619Stholo 		prev->above = next;
348*5ccab619Stholo 		if(next)
349*5ccab619Stholo 			next->below = prev;
350*5ccab619Stholo 	}
351*5ccab619Stholo 	else if(next)
352*5ccab619Stholo 		next->below = prev;
353*5ccab619Stholo 	if(pan == __bottom_panel)
354*5ccab619Stholo 		__bottom_panel = next;
355*5ccab619Stholo 	if(pan == __top_panel)
356*5ccab619Stholo 		__top_panel = prev;
357*5ccab619Stholo 
358*5ccab619Stholo 	__calculate_obscure();
359*5ccab619Stholo 
360*5ccab619Stholo 	pan->above = (PANEL *)0;
361*5ccab619Stholo 	pan->below = (PANEL *)0;
362*5ccab619Stholo 	dStack("<u%d>",9,pan);
363*5ccab619Stholo 
364*5ccab619Stholo }	/* end of __panel_unlink */
365*5ccab619Stholo 
366*5ccab619Stholo /*+-------------------------------------------------------------------------
367*5ccab619Stholo 	panel_window(pan) - get window associated with panel
368*5ccab619Stholo --------------------------------------------------------------------------*/
369*5ccab619Stholo WINDOW *
370*5ccab619Stholo panel_window(PANEL *pan)
371*5ccab619Stholo {
372*5ccab619Stholo 	return(pan->win);
373*5ccab619Stholo }	/* end of panel_window */
374*5ccab619Stholo 
375*5ccab619Stholo /*+-------------------------------------------------------------------------
376*5ccab619Stholo 	update_panels() - wnoutrefresh windows in an orderly fashion
377*5ccab619Stholo --------------------------------------------------------------------------*/
378*5ccab619Stholo void
379*5ccab619Stholo update_panels(void)
380*5ccab619Stholo {
381*5ccab619Stholo PANEL *pan;
382*5ccab619Stholo 
383*5ccab619Stholo 	dBug(("--> update_panels"));
384*5ccab619Stholo 	pan = __bottom_panel;
385*5ccab619Stholo 	while(pan) {
386*5ccab619Stholo 		__override(pan,-1);
387*5ccab619Stholo 		pan = pan->above;
388*5ccab619Stholo 	}
389*5ccab619Stholo 
390*5ccab619Stholo 	if(is_wintouched(stdscr) || (stdscr->_flags & _HASMOVED))
391*5ccab619Stholo 		Wnoutrefresh(&__stdscr_pseudo_panel);
392*5ccab619Stholo 
393*5ccab619Stholo 	if(__bottom_panel) {
394*5ccab619Stholo 		for (pan = __bottom_panel; pan; pan = pan->above) {
395*5ccab619Stholo 			if(is_wintouched(pan->win))
396*5ccab619Stholo 				Wnoutrefresh(pan);
397*5ccab619Stholo 		}
398*5ccab619Stholo 	}
399*5ccab619Stholo }	/* end of update_panels */
400*5ccab619Stholo 
401*5ccab619Stholo /*+-------------------------------------------------------------------------
402*5ccab619Stholo 	hide_panel(pan) - remove a panel from stack
403*5ccab619Stholo --------------------------------------------------------------------------*/
404*5ccab619Stholo int
405*5ccab619Stholo hide_panel(register PANEL *pan)
406*5ccab619Stholo {
407*5ccab619Stholo 
408*5ccab619Stholo 	if(!pan)
409*5ccab619Stholo 		return(ERR);
410*5ccab619Stholo 
411*5ccab619Stholo 	dBug(("--> hide_panel %s",pan->user));
412*5ccab619Stholo 
413*5ccab619Stholo 	if(!__panel_is_linked(pan)) {
414*5ccab619Stholo 		pan->above = (PANEL *)0;
415*5ccab619Stholo 		pan->below = (PANEL *)0;
416*5ccab619Stholo 		return(ERR);
417*5ccab619Stholo 	}
418*5ccab619Stholo 
419*5ccab619Stholo 	__panel_unlink(pan);
420*5ccab619Stholo 
421*5ccab619Stholo 	return(OK);
422*5ccab619Stholo }	/* end of hide_panel */
423*5ccab619Stholo 
424*5ccab619Stholo /*+-------------------------------------------------------------------------
425*5ccab619Stholo 	show_panel(pan) - place a panel on top of stack
426*5ccab619Stholo may already be in stack
427*5ccab619Stholo --------------------------------------------------------------------------*/
428*5ccab619Stholo int
429*5ccab619Stholo show_panel(register PANEL *pan)
430*5ccab619Stholo {
431*5ccab619Stholo 
432*5ccab619Stholo 	if(!pan)
433*5ccab619Stholo 		return(ERR);
434*5ccab619Stholo 	if(pan == __top_panel)
435*5ccab619Stholo 		return(OK);
436*5ccab619Stholo 	dBug(("--> show_panel %s",pan->user));
437*5ccab619Stholo 	if(__panel_is_linked(pan))
438*5ccab619Stholo 		(void)hide_panel(pan);
439*5ccab619Stholo 	__panel_link_top(pan);
440*5ccab619Stholo 	return(OK);
441*5ccab619Stholo }	/* end of show_panel */
442*5ccab619Stholo 
443*5ccab619Stholo /*+-------------------------------------------------------------------------
444*5ccab619Stholo 	top_panel(pan) - place a panel on top of stack
445*5ccab619Stholo --------------------------------------------------------------------------*/
446*5ccab619Stholo int
447*5ccab619Stholo top_panel(register PANEL *pan)
448*5ccab619Stholo {
449*5ccab619Stholo 	return(show_panel(pan));
450*5ccab619Stholo }	/* end of top_panel */
451*5ccab619Stholo 
452*5ccab619Stholo /*+-------------------------------------------------------------------------
453*5ccab619Stholo 	del_panel(pan) - remove a panel from stack, if in it, and free struct
454*5ccab619Stholo --------------------------------------------------------------------------*/
455*5ccab619Stholo int
456*5ccab619Stholo del_panel(register PANEL *pan)
457*5ccab619Stholo {
458*5ccab619Stholo 	if(pan)
459*5ccab619Stholo 	{
460*5ccab619Stholo 		dBug(("--> del_panel %s",pan->user));
461*5ccab619Stholo 		if(__panel_is_linked(pan))
462*5ccab619Stholo 			(void)hide_panel(pan);
463*5ccab619Stholo 		free((char *)pan);
464*5ccab619Stholo 		return(OK);
465*5ccab619Stholo 	}
466*5ccab619Stholo 	return(ERR);
467*5ccab619Stholo }	/* end of del_panel */
468*5ccab619Stholo 
469*5ccab619Stholo /*+-------------------------------------------------------------------------
470*5ccab619Stholo 	bottom_panel(pan) - place a panel on bottom of stack
471*5ccab619Stholo may already be in stack
472*5ccab619Stholo --------------------------------------------------------------------------*/
473*5ccab619Stholo int
474*5ccab619Stholo bottom_panel(register PANEL *pan)
475*5ccab619Stholo {
476*5ccab619Stholo 	if(!pan)
477*5ccab619Stholo 		return(ERR);
478*5ccab619Stholo 	if(pan == __bottom_panel)
479*5ccab619Stholo 		return(OK);
480*5ccab619Stholo 	dBug(("--> bottom_panel %s",pan->user));
481*5ccab619Stholo 	if(__panel_is_linked(pan))
482*5ccab619Stholo 		(void)hide_panel(pan);
483*5ccab619Stholo 	__panel_link_bottom(pan);
484*5ccab619Stholo 	return(OK);
485*5ccab619Stholo }	/* end of bottom_panel */
486*5ccab619Stholo 
487*5ccab619Stholo /*+-------------------------------------------------------------------------
488*5ccab619Stholo 	new_panel(win) - create a panel and place on top of stack
489*5ccab619Stholo --------------------------------------------------------------------------*/
490*5ccab619Stholo PANEL *
491*5ccab619Stholo new_panel(WINDOW *win)
492*5ccab619Stholo {
493*5ccab619Stholo PANEL *pan = (PANEL *)malloc(sizeof(PANEL));
494*5ccab619Stholo 
495*5ccab619Stholo 	if(!__stdscr_pseudo_panel.win) {
496*5ccab619Stholo 		__stdscr_pseudo_panel.win = stdscr;
497*5ccab619Stholo 		__stdscr_pseudo_panel.wstarty = 0;
498*5ccab619Stholo 		__stdscr_pseudo_panel.wstartx = 0;
499*5ccab619Stholo 		__stdscr_pseudo_panel.wendy = LINES;
500*5ccab619Stholo 		__stdscr_pseudo_panel.wendx = COLS;
501*5ccab619Stholo 		__stdscr_pseudo_panel.user = "stdscr";
502*5ccab619Stholo 		__stdscr_pseudo_panel.obscure = (PANELCONS *)0;
503*5ccab619Stholo 	}
504*5ccab619Stholo 
505*5ccab619Stholo 	if(pan) {
506*5ccab619Stholo 		pan->win = win;
507*5ccab619Stholo 		pan->above = (PANEL *)0;
508*5ccab619Stholo 		pan->below = (PANEL *)0;
509*5ccab619Stholo 		getbegyx(win, pan->wstarty, pan->wstartx);
510*5ccab619Stholo 		pan->wendy = pan->wstarty + getmaxy(win);
511*5ccab619Stholo 		pan->wendx = pan->wstartx + getmaxx(win);
512*5ccab619Stholo #ifdef PANEL_DEBUG
513*5ccab619Stholo 		pan->user = "new";
514*5ccab619Stholo #else
515*5ccab619Stholo 		pan->user = (char *)0;
516*5ccab619Stholo #endif
517*5ccab619Stholo 		pan->obscure = (PANELCONS *)0;
518*5ccab619Stholo 		(void)show_panel(pan);
519*5ccab619Stholo 	}
520*5ccab619Stholo 
521*5ccab619Stholo 	return(pan);
522*5ccab619Stholo }	/* end of new_panel */
523*5ccab619Stholo 
524*5ccab619Stholo /*+-------------------------------------------------------------------------
525*5ccab619Stholo 	panel_above(pan)
526*5ccab619Stholo --------------------------------------------------------------------------*/
527*5ccab619Stholo PANEL *
528*5ccab619Stholo panel_above(PANEL *pan)
529*5ccab619Stholo {
530*5ccab619Stholo 	if(!pan)
531*5ccab619Stholo 		return(__bottom_panel);
532*5ccab619Stholo 	else
533*5ccab619Stholo 		return(pan->above);
534*5ccab619Stholo }	/* end of panel_above */
535*5ccab619Stholo 
536*5ccab619Stholo /*+-------------------------------------------------------------------------
537*5ccab619Stholo 	panel_below(pan)
538*5ccab619Stholo --------------------------------------------------------------------------*/
539*5ccab619Stholo PANEL *
540*5ccab619Stholo panel_below(PANEL *pan)
541*5ccab619Stholo {
542*5ccab619Stholo 	if(!pan)
543*5ccab619Stholo 		return(__top_panel);
544*5ccab619Stholo 	else
545*5ccab619Stholo 		return(pan->below);
546*5ccab619Stholo }	/* end of panel_below */
547*5ccab619Stholo 
548*5ccab619Stholo /*+-------------------------------------------------------------------------
549*5ccab619Stholo 	set_panel_userptr(pan,uptr)
550*5ccab619Stholo --------------------------------------------------------------------------*/
551*5ccab619Stholo int
552*5ccab619Stholo set_panel_userptr(PANEL *pan, char *uptr)
553*5ccab619Stholo {
554*5ccab619Stholo 	if(!pan)
555*5ccab619Stholo 		return(ERR);
556*5ccab619Stholo 	pan->user = uptr;
557*5ccab619Stholo 	return(OK);
558*5ccab619Stholo }	/* end of set_panel_userptr */
559*5ccab619Stholo 
560*5ccab619Stholo /*+-------------------------------------------------------------------------
561*5ccab619Stholo 	panel_userptr(pan)
562*5ccab619Stholo --------------------------------------------------------------------------*/
563*5ccab619Stholo char *
564*5ccab619Stholo panel_userptr(PANEL *pan)
565*5ccab619Stholo {
566*5ccab619Stholo 	if(!pan)
567*5ccab619Stholo 		return((char *)0);
568*5ccab619Stholo 	return(pan->user);
569*5ccab619Stholo }	/* end of panel_userptr */
570*5ccab619Stholo 
571*5ccab619Stholo /*+-------------------------------------------------------------------------
572*5ccab619Stholo 	move_panel(pan,starty,startx)
573*5ccab619Stholo --------------------------------------------------------------------------*/
574*5ccab619Stholo int
575*5ccab619Stholo move_panel(PANEL *pan, int starty, int startx)
576*5ccab619Stholo {
577*5ccab619Stholo WINDOW *win;
578*5ccab619Stholo 
579*5ccab619Stholo 	if(!pan)
580*5ccab619Stholo 		return(ERR);
581*5ccab619Stholo 	if(__panel_is_linked(pan))
582*5ccab619Stholo 		__override(pan,0);
583*5ccab619Stholo 	win = pan->win;
584*5ccab619Stholo 	if(mvwin(win,starty,startx))
585*5ccab619Stholo 		return(ERR);
586*5ccab619Stholo 	getbegyx(win, pan->wstarty, pan->wstartx);
587*5ccab619Stholo 	pan->wendy = pan->wstarty + getmaxy(win);
588*5ccab619Stholo 	pan->wendx = pan->wstartx + getmaxx(win);
589*5ccab619Stholo 	if(__panel_is_linked(pan))
590*5ccab619Stholo 		__calculate_obscure();
591*5ccab619Stholo 	return(OK);
592*5ccab619Stholo }	/* end of move_panel */
593*5ccab619Stholo 
594*5ccab619Stholo /*+-------------------------------------------------------------------------
595*5ccab619Stholo 	replace_panel(pan,win)
596*5ccab619Stholo --------------------------------------------------------------------------*/
597*5ccab619Stholo int
598*5ccab619Stholo replace_panel(PANEL *pan, WINDOW *win)
599*5ccab619Stholo {
600*5ccab619Stholo 	if(!pan)
601*5ccab619Stholo 		return(ERR);
602*5ccab619Stholo 	if(__panel_is_linked(pan))
603*5ccab619Stholo 		__override(pan,0);
604*5ccab619Stholo 	pan->win = win;
605*5ccab619Stholo 	if(__panel_is_linked(pan))
606*5ccab619Stholo 		__calculate_obscure();
607*5ccab619Stholo 	return(OK);
608*5ccab619Stholo }	/* end of replace_panel */
609*5ccab619Stholo 
610*5ccab619Stholo /*+-------------------------------------------------------------------------
611*5ccab619Stholo 	panel_hidden(pan)
612*5ccab619Stholo --------------------------------------------------------------------------*/
613*5ccab619Stholo int
614*5ccab619Stholo panel_hidden(PANEL *pan)
615*5ccab619Stholo {
616*5ccab619Stholo 	if(!pan)
617*5ccab619Stholo 		return(ERR);
618*5ccab619Stholo 	return(__panel_is_linked(pan) ? ERR : OK);
619*5ccab619Stholo }	/* end of panel_hidden */
620*5ccab619Stholo 
621*5ccab619Stholo /* end of panel.c */
622