ngspice/src/frontend/help/provide.c

146 lines
3.6 KiB
C

/**********
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1986 Wayne A. Christopher, U. C. Berkeley CAD Group
Modified 1999 Emmanuel Rouat
**********/
/*
* faustus@cad.berkeley.edu, ucbvax!faustus
* Permission is granted to modify and re-distribute this code in any manner
* as long as this notice is preserved. All standard disclaimers apply.
*
* Toss the help window up on the screen, and deal with the graph...
*/
#include <config.h>
#include "ngspice/ngspice.h"
#include "ngspice/cpstd.h"
#include "ngspice/hlpdefs.h"
#include "ngspice/suffix.h"
bool hlp_usex = FALSE;
void
hlp_provide(topic *top)
{
toplink *res;
topic *parent, *newtop;
if (!top)
return;
#ifndef X_DISPLAY_MISSING
if (getenv("DISPLAY") || hlp_displayname)
hlp_usex = TRUE;
#endif
top->xposition = top->yposition = 0;
if (hlp_usex) {
if (!hlp_xdisplay(top)) {
fprintf(stderr, "Couldn't open X display.\n");
return;
}
} else {
if (!hlp_tdisplay(top)) {
fprintf(stderr, "Couldn't display text\n");
return;
}
}
#ifndef X_DISPLAY_MISSING /* X11 does this asynchronously */
if (hlp_usex) return;
#endif
for (;;) {
if (hlp_usex)
res = hlp_xhandle(&parent);
else
res = hlp_thandle(&parent);
if (!res && !parent) {
/* No more windows. */
hlp_killfamily(top);
if (hlp_usex) hlp_xclosedisplay(); /* need to change
display pointer back J.H. */
return;
}
if (res) {
/* Create a new window... */
if (hlp_usex)
hlp_xwait(parent, TRUE);
if ((newtop = hlp_read(res->place)) == NULL) {
fprintf(stderr, "Internal error: bad link\n");
hlp_xwait(parent, FALSE);
continue;
}
if (hlp_usex)
hlp_xwait(parent, FALSE);
newtop->next = parent->children;
parent->children = newtop;
newtop->parent = parent;
newtop->xposition = parent->xposition + 50;
newtop->yposition = parent->yposition + 50;
if (hlp_usex) {
if (!hlp_xdisplay(newtop)) {
fprintf(stderr, "Couldn't open win\n");
return;
}
} else {
if (!hlp_tdisplay(newtop)) {
fprintf(stderr, "Couldn't display\n");
return;
}
}
} else {
/* Blow this one and its descendants away. */
hlp_killfamily(parent);
hlp_fixchildren(parent);
if (parent == top)
return;
}
}
}
void
hlp_fixchildren(topic *parent)
{
topic *pa;
if (parent->parent) {
if (parent->parent->children == parent)
parent->parent->children =
parent->next;
else {
for (pa = parent->parent->children;
pa->next; pa = pa->next)
if (pa->next == parent)
break;
if (!pa->next) {
fprintf(stderr, "bah...\n");
}
pa->next = pa->next->next;
}
}
}
/* Note that this doesn't actually free the data structures, just gets
* rid of the window.
*/
void
hlp_killfamily(topic *top)
{
topic *ch;
for (ch = top->children; ch; ch = ch->next)
hlp_killfamily(ch);
if (hlp_usex)
hlp_xkillwin(top);
else
hlp_tkillwin(top);
top->children = NULL;
return;
}