This is windowstuff.c in view mode; [Download] [Up]
/* $Id: windowstuff.c,v 1.2 1995/12/19 19:30:47 eilts Exp eilts $ */
#include "bbs.h"
int windowtext(const char *text, const char *header, const int waittime,
const confrecordtyp *confrecord)
{
int zeilen, spalten, k, oldx, oldy;
char str[MSG_MAX+2], *sp;
#ifdef NO_NCURSES
char *bgbp;
#endif
const char *conttxt;
WINDOW *twin;
conttxt = msg("windowtext",0,confrecord->userrecord.lang);
strmaxcpy(str,text,STRLEN);
k = strlen(str) - 1;
if (str[k++] != '\n') {
str[k++] = '\n';
str[k] = '\0';
}
zeilen = 4;
spalten = 5;
k = 5;
for (sp=str; *sp!='\0'; sp++) {
if (*sp == '\n') {
zeilen++;
if (k > spalten) spalten = k;
k = 5;
}
else {
k++;
}
}
k = strlen(conttxt) + 4;
if (spalten < k) spalten = k;
if (zeilen > LINES) zeilen = LINES;
if (spalten > COLS) spalten = COLS;
getyx(stdscr,oldy,oldx);
if ((twin=newwin(zeilen,spalten,(LINES-zeilen)/2,(COLS-spalten)/2)) == NULL) {
fprintf(stderr,"\ncannot open window\n");
bbsgetch(FALSE);
return(-1);
}
#ifdef NO_NCURSES
bgbp = savebackground(twin);
#else
touchwin(stdscr);
#endif
werase(twin);
box(twin,'|','-');
if (*header != '\0') {
wmove(twin,0,(spalten-strlen(header))/2);
waddstr(twin,header);
k = 2;
wmove(twin,k++,2);
for (sp=str; *sp!='\0'; sp++) {
if (*sp == '\n') {
wmove(twin,k++,2);
}
else {
waddch(twin,*sp);
}
}
}
if (waittime > 0) {
wrefresh(twin);
sleep(waittime);
}
else {
wmove(twin,zeilen-1,(spalten-strlen(conttxt))/2);
waddstr(twin,conttxt);
wrefresh(twin);
waitonkeypress(TRUE);
}
#ifdef NO_NCURSES
restorebackground(twin,bgbp);
#endif
delwin(twin);
move(oldy,oldx);
refresh();
return 0;
}
#ifdef NO_NCURSES
char *savebackground(WINDOW *win)
{
int x, y;
char *buf;
if ((buf=(char *)malloc((win->_maxx*win->_maxy)*sizeof(char)))==NULL) {
return(NULL);
}
for (x=0; x<win->_maxx; x++) {
for (y=0; y<win->_maxy; y++) {
move(win->_begy+y,win->_begx+x);
buf[x+y*win->_maxx] = inch();
}
}
return(buf);
}
int restorebackground(WINDOW *win, char *buf)
{
int x, y;
char c;
if (buf == NULL) return(-1);
for (x=0; x<win->_maxx; x++) {
for (y=0; y<win->_maxy; y++) {
c = buf[x+y*win->_maxx];
wmove(win,y,x);
if (c != winch(win)) {
waddch(win,c);
}
}
}
wrefresh(win);
free(buf);
return(0);
}
#endif
int window_on(struct termios *save_termios, tty_editstateenum *ttystate,
confrecordtyp *confrecord)
{
char *sp;
if (! confrecord->curses_on) {
#if ! defined(NO_NCURSES) || defined(__hpux)
if (initscr() == NULL) {
#else
if (initscr() == ERR) {
#endif
sp = getenv("TERM");
if (sp == NULL) sp = "unknown";
errormsg(E_LOGFILE|E_USER,confrecord,"bbs","window_on",
"cannot start curses, TERM=%s",sp);
return(-1);
}
if (tty_editset(STDIN_FILENO,save_termios,ttystate) < 0) {
errormsg(E_LOGFILE|E_USER,confrecord,"bbs","window_on",
"cannot set terminal to cbreak: %m");
return(-1);
}
confrecord->curses_on = TRUE;
}
return 0;
}
int window_off(struct termios *save_termios, tty_editstateenum *ttystate,
confrecordtyp *confrecord)
{
if (confrecord->curses_on) {
mvcur(0,COLS -1,LINES -1,0);
clrtoeol();
if (tty_editreset(STDIN_FILENO,save_termios,ttystate) < 0) {
errormsg(E_LOGFILE|E_USER,confrecord,"bbs","window_on",
"cannot reset terminal from cbreak: %m");
return(-1);
}
refresh();
endwin();
confrecord->curses_on = FALSE;
}
return 0;
}
boolean termexists(const char *termname)
{
char tgetentbuf[TGETENTBUF];
return tgetent(tgetentbuf,termname);
}
int addstr_withmargin(const char *str)
{
int mlen, x_p, k;
const char *sp;
getyx(stdscr,k,x_p);
mlen = COLS - x_p - 3;
for (k=0,sp=str; *sp && *sp!='\n'; k++,sp++) ;
if (k <= mlen) {
for (k=0,sp=str; *sp && *sp!='\n'; sp++) addch(*sp);
}
else {
for (k=0,sp=str; *sp && *sp!='\n' && k<mlen; k++,sp++) addch(*sp);
addstr("...");
}
return(0);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.