3 * $Id: pres_curses.c,v 1.1 1999/06/02 16:53:35 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.1 1999/06/02 16:53:35 mdw
37 /*----- Header files ------------------------------------------------------*/
48 #include <sys/types.h>
51 #if defined(HAVE_NCURSES_H)
53 #elif defined(HAVE_NCURSES_NCURSES_H)
54 # include <ncurses/ncurses.h>
55 #elif defined(HAVE_CURSES_H)
58 # error "Where's your <curses.h> header?"
62 #include <mLib/alloc.h>
63 #include <mLib/report.h>
67 #include "pres_curses.h"
73 /*----- Data structures ---------------------------------------------------*/
84 /*----- Static variables --------------------------------------------------*/
86 static cwin
*cwins
= 0;
89 /*----- Main code ---------------------------------------------------------*/
97 * Use: Calculates window sizes for all the windows. The heights are
98 * determined in a way which doesn't allow rounding errors to be
99 * an issue (although there will be up to a line's height
100 * difference between two windows). No actual changing of
101 * curses structures is done.
104 static void sizes(void)
107 int t
= 0, h
= LINES
, w
= nwins
;
109 for (c
= cwins
; c
; c
= c
->next
) {
119 /* --- @sig_tstp@ --- */
122 static void sig_tstp(int s
)
129 /* --- @sig_cont@ --- */
132 static void sig_cont(int s
)
138 /* --- @sig_winch@ --- */
142 static void sig_winch(int s
)
148 for (c
= cwins
; c
; c
= c
->next
) {
149 mvwin(c
->w
, c
->top
, 0);
150 wresize(c
->w
, c
->height
, COLS
);
151 mvwin(c
->s
, c
->top
+ c
->height
, 0);
160 /* --- @curses_ok@ --- */
164 if (!isatty(STDOUT_FILENO
)) {
165 moan("can't use curses: stdout isn't a terminal");
168 if (setupterm(0, STDOUT_FILENO
, 0) == ERR
) {
169 moan("can't use curses: couldn't read terminfo");
172 if (!tigetstr("cup")) {
173 moan("can't use curses: terminal insufficiently winning");
179 /* --- @curses_init@ --- */
181 int curses_init(archcons
*a
)
183 cwin
**cc
= &cwins
, *c
;
185 /* --- Allocate my window structures --- */
188 for (; a
; a
= a
->cdr
) {
192 c
= xmalloc(sizeof(cwin
));
202 /* --- Haul curses up by its naughty bits --- */
205 keypad(stdscr
, TRUE
);
211 /* --- Grind through everything setting up windows --- */
214 for (c
= cwins
; c
; c
= c
->next
) {
215 if ((c
->w
= newwin(c
->height
, COLS
, c
->top
, 0)) == 0 ||
216 (c
->s
= newwin(1, COLS
, c
->top
+ c
->height
, 0)) == 0)
218 scrollok(c
->w
, TRUE
);
221 wbkgdset(c
->s
, A_STANDOUT
);
223 mvwprintw(c
->s
, 0, 0, " %s [running]\n", c
->e
->arch
);
230 signal(SIGWINCH
, sig_winch
);
233 signal(SIGTSTP
, sig_tstp
);
234 signal(SIGCONT
, sig_cont
);
253 /* --- @curses_output@ --- */
255 void curses_output(archent
*e
, const char *p
, size_t sz
)
266 /* --- @curses_close@ --- */
268 void curses_close(archent
*e
, int ok
)
271 mvwprintw(c
->s
, 0, 0, " %s [%s]\n", e
->arch
, ok ?
"finished" : "failed");
275 /* --- @curses_done@ --- */
277 void curses_done(archcons
*a
)
279 if (opt_flags
& optFlag_beep
) {
285 for (; a
; a
= a
->cdr
) {
295 /* --- @curses_abort@ --- */
297 void curses_abort(archcons
*a
)
300 signal(SIGWINCH
, SIG_DFL
);
303 signal(SIGTSTP
, SIG_DFL
);
304 signal(SIGCONT
, SIG_DFL
);
309 /*----- That's all, folks -------------------------------------------------*/
312 int pres_curses__built
= 1;