2 * Screen output handling
11 #include <sys/types.h>
16 #include <libcitadel.h>
18 #include "citadel_ipc.h"
19 #include "citadel_decls.h"
25 /* the default paginator prompt will be replaced by the server's prompt when we learn it */
26 char *moreprompt = " -- more -- ";
28 extern int screenheight;
29 extern int screenwidth;
30 int lines_printed = 0;
33 extern int rc_ansi_color;
34 extern int rc_prompt_control;
35 extern void check_screen_dims(void);
37 void do_keepalive(void);
40 * Initialize the screen
55 void ctdl_beep(void) {
63 * scr_printf() outputs to the terminal
65 int scr_printf(char *fmt, ...)
67 static char outbuf[4096]; /* static for performance -- not re-entrant -- change if needed */
73 retval = vsnprintf(outbuf, sizeof outbuf, fmt, ap);
77 for (i=0; i<len; ++i) {
85 * Read one character from the terminal
87 int scr_getc(int delay)
94 if (!read (0, &buf, 1))
102 * Issue the paginator prompt (more / hit any key to continue)
104 void hit_any_key(void) {
109 scr_printf("%s\r", moreprompt);
112 for (a=0; a<screenwidth; ++a) {
117 if ( (rc_prompt_control == 1) || ((rc_prompt_control == 3) && (userflags & US_PROMPTCTL)) ) {
118 if (b == 'q' || b == 'Q' || b == 's' || b == 'S') {
121 if (b == 'n' || b == 'N') {
126 if (b==NEXT_KEY) sigcaught = SIGINT;
127 if (b==STOP_KEY) sigcaught = SIGQUIT;
132 * Output one character to the terminal
136 /* handle tabs normally */
140 } while ((cols_printed % 8) != 0);
144 /* Output the character... */
145 if (putc(c, stdout) == EOF) {
153 else if (c == '\r') {
156 else if (isprint(c)) {
158 if ((screenwidth > 0) && (cols_printed > screenwidth)) {
164 // if we want to do a top status line, this is a reasonable way to do it
165 // printf("\033[s\033[0;70H");
166 // printf("\033[K %d/%d %d/%d", cols_printed, screenwidth, lines_printed, screenheight);
169 if ((screenheight > 0) && (lines_printed > (screenheight-2))) {
186 static volatile int caught_sigwinch = 0;
190 * scr_winch() handles window size changes from SIGWINCH
191 * resizes all our windows for us
193 RETSIGTYPE scr_winch(int signum)
195 /* if we receive this signal, we must be running
196 * in a terminal that supports resizing.
201 signal(SIGWINCH, scr_winch);