2 * Screen output handling
11 #include <sys/types.h>
16 #include <libcitadel.h>
18 #include "citadel_ipc.h"
19 #include "citadel_decls.h"
25 extern int screenheight;
26 extern int screenwidth;
27 int lines_printed = 0;
30 extern int rc_ansi_color;
31 extern void check_screen_dims(void);
33 void do_keepalive(void);
36 * Initialize the screen
51 void ctdl_beep(void) {
59 * scr_printf() outputs to the terminal
61 int scr_printf(char *fmt, ...)
63 static char outbuf[4096]; /* static for performance -- not re-entrant -- change if needed */
69 retval = vsnprintf(outbuf, sizeof outbuf, fmt, ap);
73 for (i=0; i<len; ++i) {
81 * Read one character from the terminal
83 int scr_getc(int delay)
90 if (!read (0, &buf, 1))
98 * Issue the paginator prompt (more / hit any key to continue)
100 void hit_any_key(void) {
105 /* scr_printf("%s\r", ipc->ServInfo.moreprompt); */
106 scr_printf("<<more>>\r"); // FIXME use the prompt given by the server
111 for (a=0; !IsEmptyStr(&ipc->ServInfo.moreprompt[a]); ++a)
118 if ( (rc_prompt_control == 1)
119 || ((rc_prompt_control == 3) && (userflags & US_PROMPTCTL)) ) {
120 if (b == 'q' || b == 'Q' || b == 's' || b == 'S')
122 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);