3 * $Id: pres_curses.c,v 1.3 1999/07/16 12:49:58 mdw Exp $
5 * Curses-based output presentation
10 /*----- Licensing notice --------------------------------------------------*
12 * This file is part of sw-tools.
14 * sw-tools is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation; either version 2 of the License, or
17 * (at your option) any later version.
19 * sw-tools is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
24 * You should have received a copy of the GNU General Public License
25 * along with sw-tools; if not, write to the Free Software Foundation,
26 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
29 /*----- Revision history --------------------------------------------------*
31 * $Log: pres_curses.c,v $
32 * Revision 1.3 1999/07/16 12:49:58 mdw
33 * Improve exit status display. New interface from `doto' project.
35 * Revision 1.2 1999/06/24 15:51:16 mdw
36 * Fix signal handlers so they don't corrupt `errno'.
38 * Revision 1.1.1.1 1999/06/02 16:53:35 mdw
43 /*----- Header files ------------------------------------------------------*/
54 #include <sys/types.h>
57 #if defined(HAVE_NCURSES_H)
59 #elif defined(HAVE_NCURSES_NCURSES_H)
60 # include <ncurses/ncurses.h>
61 #elif defined(HAVE_CURSES_H)
64 # error "Where's your <curses.h> header?"
68 #include <mLib/alloc.h>
69 #include <mLib/report.h>
73 #include "pres_curses.h"
79 /*----- Data structures ---------------------------------------------------*/
90 /*----- Static variables --------------------------------------------------*/
92 static cwin *cwins = 0;
95 /*----- Main code ---------------------------------------------------------*/
103 * Use: Calculates window sizes for all the windows. The heights are
104 * determined in a way which doesn't allow rounding errors to be
105 * an issue (although there will be up to a line's height
106 * difference between two windows). No actual changing of
107 * curses structures is done.
110 static void sizes(void)
113 int t = 0, h = LINES, w = nwins;
115 for (c = cwins; c; c = c->next) {
125 /* --- @sig_tstp@ --- */
128 static void sig_tstp(int s)
137 /* --- @sig_cont@ --- */
140 static void sig_cont(int s)
148 /* --- @sig_winch@ --- */
152 static void sig_winch(int s)
160 for (c = cwins; c; c = c->next) {
161 mvwin(c->w, c->top, 0);
162 wresize(c->w, c->height, COLS);
163 mvwin(c->s, c->top + c->height, 0);
173 /* --- @curses_ok@ --- */
177 if (!isatty(STDOUT_FILENO)) {
178 moan("can't use curses: stdout isn't a terminal");
181 if (setupterm(0, STDOUT_FILENO, 0) == ERR) {
182 moan("can't use curses: couldn't read terminfo");
185 if (!tigetstr("cup")) {
186 moan("can't use curses: terminal insufficiently winning");
192 /* --- @curses_init@ --- */
194 int curses_init(archcons *a)
196 cwin **cc = &cwins, *c;
198 /* --- Allocate my window structures --- */
201 for (; a; a = a->cdr) {
205 c = xmalloc(sizeof(cwin));
215 /* --- Haul curses up by its naughty bits --- */
218 keypad(stdscr, TRUE);
224 /* --- Grind through everything setting up windows --- */
227 for (c = cwins; c; c = c->next) {
228 if ((c->w = newwin(c->height, COLS, c->top, 0)) == 0 ||
229 (c->s = newwin(1, COLS, c->top + c->height, 0)) == 0)
231 scrollok(c->w, TRUE);
234 wbkgdset(c->s, A_STANDOUT);
236 mvwprintw(c->s, 0, 0, " %s [running]\n", c->e->arch);
243 signal(SIGWINCH, sig_winch);
246 signal(SIGTSTP, sig_tstp);
247 signal(SIGCONT, sig_cont);
266 /* --- @curses_output@ --- */
268 void curses_output(archent *e, const char *p, size_t sz)
279 /* --- @curses_close@ --- */
281 void curses_close(archent *e, int ok, const char *summ)
284 mvwprintw(c->s, 0, 0, " %s [%s]\n", e->arch, summ);
288 /* --- @curses_done@ --- */
290 void curses_done(archcons *a)
292 if (opt_flags & optFlag_beep) {
298 for (; a; a = a->cdr) {
308 /* --- @curses_abort@ --- */
310 void curses_abort(archcons *a)
313 signal(SIGWINCH, SIG_DFL);
316 signal(SIGTSTP, SIG_DFL);
317 signal(SIGCONT, SIG_DFL);
322 /*----- That's all, folks -------------------------------------------------*/
325 int pres_curses__built = 1;