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