X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Ftextclient%2Fcommands.c;h=e98dad3872955267bc358fa2d75392baead8b30e;hb=646e848010680ff99c345958338bcb8e1143d6dd;hp=427887cbb67554bd5d4670856a953e74947907be;hpb=a217e08a2d59d90bac3bf83d39de33d5221ef107;p=citadel.git diff --git a/citadel/textclient/commands.c b/citadel/textclient/commands.c index 427887cbb..e98dad387 100644 --- a/citadel/textclient/commands.c +++ b/citadel/textclient/commands.c @@ -1,24 +1,22 @@ /* - * $Id$ - * * This file contains functions which implement parts of the * text-mode user interface. * - * Copyright (c) 1987-2009 by the citadel.org team + * Copyright (c) 1987-2010 by the citadel.org team * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "sysdep.h" @@ -102,7 +100,6 @@ char rc_gotmail_cmd[SIZ]; char *gl_string; int next_lazy_cmd = 5; -int lines_printed = 0; /* line count for paginator */ extern int screenwidth, screenheight; extern int termn8; extern CtdlIPC *ipc_for_signal_handlers; /* KLUDGE cover your eyes */ @@ -138,7 +135,7 @@ char was_a_key_pressed(void) { * in the middle of a data transfer from the server, in which case * sending a NOOP would throw the client protocol out of sync. */ - if (FD_ISSET(0, &rfds)) { + if ((retval > 0) && FD_ISSET(0, &rfds)) { set_keepalives(KA_NO); the_character = inkey(); set_keepalives(KA_YES); @@ -153,69 +150,6 @@ char was_a_key_pressed(void) { -/* - * Check to see if we need to pause at the end of a screen. - * If we do, we have to switch to half keepalives during the pause because - * we are probably in the middle of a server operation and the NOOP command - * would confuse everything. - */ -int checkpagin(int lp, unsigned int pagin, unsigned int height) -{ - int thekey; - - if (sigcaught) return(lp); - thekey = was_a_key_pressed(); - if (thekey == 'q' || thekey == 'Q' || thekey == 's' || thekey == 'S') - thekey = STOP_KEY; - if (thekey == 'n' || thekey == 'N') - thekey = NEXT_KEY; - if ( (thekey == NEXT_KEY) || (thekey == STOP_KEY)) sigcaught = thekey; - if (sigcaught) return(lp); - - if (!pagin) return(0); - if (lp>=(height-1)) { - set_keepalives(KA_HALF); - hit_any_key(ipc_for_signal_handlers); /* Cheating -IO */ - set_keepalives(KA_YES); - return(0); - } - return(lp); -} - - - - -/* - * pprintf() ... paginated version of printf() - */ -void pprintf(const char *format, ...) { - va_list arg_ptr; - static char buf[4096]; /* static for performance, change if needed */ - int i; - - /* If sigcaught is nonzero, a keypress has interrupted this and we - * should just drain output. - */ - if (sigcaught) return; - - /* Otherwise, start spewing... */ - va_start(arg_ptr, format); - vsnprintf(buf, sizeof(buf), format, arg_ptr); - va_end(arg_ptr); - - for (i=0; !IsEmptyStr(&buf[i]); ++i) { - scr_putc(buf[i]); - if (buf[i]==10) { - ++lines_printed; - lines_printed = checkpagin(lines_printed, - (userflags & US_PAGINATOR), - screenheight); - } - } -} - - - /* * print_instant() - print instant messages if there are any */ @@ -299,7 +233,6 @@ void print_instant(void) } /* fall back to built-in instant message display */ scr_printf("\n"); - lines_printed++; /* Header derived from flags */ if (flags & 2) @@ -329,22 +262,9 @@ void print_instant(void) scr_printf(" @%s", node); scr_printf(":\n"); - lines_printed++; - fmout(screenwidth, NULL, listing, NULL, 1, screenheight, -1, 0); + fmout(screenwidth, NULL, listing, NULL, 0); free(listing); - /* when running in curses mode, the scroll bar in most - xterm-style programs becomes useless, so it makes sense to - pause after a screenful of pages if the user has been idle - for a while. However, this is annoying to some of the users - who aren't in curses mode and tend to leave their clients - idle. keepalives become disabled, resulting in getting booted - when coming back to the idle session. but they probably have - a working scrollback in their terminal, so disable it in this - case: - */ - if (!is_curses_enabled()) - lines_printed = 0; } scr_printf("\n---\n"); color(BRIGHT_WHITE); @@ -364,7 +284,6 @@ void set_keepalives(int s) static time_t idlet = 0; static void really_do_keepalive(void) { - int r; /* IPC response code */ time(&idlet); @@ -378,7 +297,7 @@ static void really_do_keepalive(void) { * wait for a response. */ if (keepalives_enabled == KA_YES) { - r = CtdlIPCNoop(ipc_for_signal_handlers); + CtdlIPCNoop(ipc_for_signal_handlers); if (instant_msgs > 0) { if (ok_to_interrupt == 1) { scr_printf("\r%64s\r", ""); @@ -500,7 +419,6 @@ int inkey(void) time_t start_time; scr_flush(); - lines_printed = 0; time(&start_time); do { @@ -509,9 +427,7 @@ int inkey(void) * necessary and then waits again. */ do { - scr_set_windowsize(ipc_for_signal_handlers); do_keepalive(); - scr_set_windowsize(ipc_for_signal_handlers); FD_ZERO(&rfds); FD_SET(0, &rfds); @@ -531,24 +447,6 @@ int inkey(void) if (a == 13) { a = 10; } -/* not so fast there dude, we have to handle UTF-8 and ISO-8859-1... - if (a > 126) { - a = 0; - } - if (((a != 23) && (a != 4) && (a != 10) && (a != 8) && (a != NEXT_KEY) && (a != STOP_KEY)) - && ((a < 32) || (a > 126))) { - a = 0; - } - */ - -#ifndef DISABLE_CURSES -#if defined(HAVE_CURSES_H) || defined(HAVE_NCURSES_H) - if (a == ERR) { - logoff(NULL, 3); - } -#endif -#endif - } while (a == 0); return (a); } @@ -792,9 +690,6 @@ void load_command_set(void) strcpy(rc_gotmail_cmd, ""); #ifdef HAVE_OPENSSL rc_encrypt = RC_DEFAULT; -#endif -#if defined(HAVE_CURSES_H) && !defined(DISABLE_CURSES) - rc_screen = RC_DEFAULT; #endif rc_alt_semantics = 0; @@ -841,15 +736,6 @@ void load_command_set(void) #endif } -#if defined(HAVE_CURSES_H) && !defined(DISABLE_CURSES) - if (!strncasecmp(buf, "fullscreen=", 11)) { - if (!strcasecmp(&buf[11], "yes")) - rc_screen = RC_YES; - else if (!strcasecmp(&buf[11], "no")) - rc_screen = RC_NO; - } -#endif - if (!strncasecmp(buf, "editor=", 7)) strcpy(editor_paths[0], &buf[7]); @@ -1134,7 +1020,6 @@ int getcmd(CtdlIPC *ipc, char *argbuf) scr_printf("\n%s", room_name); color(DIM_WHITE); scr_printf("%c ", room_prompt(room_flags)); - scr_flush(); while (1) { ch = inkey(); @@ -1218,24 +1103,24 @@ int getcmd(CtdlIPC *ipc, char *argbuf) } if (ch == '?') { - pprintf("\rOne of ... \n"); + scr_printf("\rOne of ... \n"); for (cptr = cmdlist; cptr != NULL; cptr = cptr->next) { if (cmdmatch(cmdbuf, cptr, cmdpos)) { for (a = 0; a < 5; ++a) { keyopt(cmd_expand(cptr->c_keys[a], 1)); - pprintf(" "); + scr_printf(" "); } - pprintf("\n"); + scr_printf("\n"); } } sigcaught = 0; - pprintf("\n%s%c ", room_name, room_prompt(room_flags)); + scr_printf("\n%s%c ", room_name, room_prompt(room_flags)); got = 0; for (cptr = cmdlist; cptr != NULL; cptr = cptr->next) { if ((got == 0) && (cmdmatch(cmdbuf, cptr, cmdpos))) { for (a = 0; a < cmdpos; ++a) { - pprintf("%s ", + scr_printf("%s ", cmd_expand(cptr->c_keys[a], 0)); } got = 1; @@ -1350,9 +1235,6 @@ int fmout( FILE *fpin, /* file to read from, or NULL to format given text */ char *text, /* text to be formatted (when fpin is NULL */ FILE *fpout, /* file to write to, or NULL to write to screen */ - char pagin, /* nonzero if we should use the paginator */ - int height, /* screen height to use */ - int starting_lp,/* starting value for lines_printed, -1 for global */ int subst) /* nonzero if we should use hypertext mode */ { char *buffer = NULL; /* The current message */ @@ -1365,7 +1247,7 @@ int fmout( /* Space for a single word, which can be at most screenwidth */ word = (char *)calloc(1, width); if (!word) { - err_printf("Can't alloc memory to print message: %s!\n", + scr_printf("Can't alloc memory to print message: %s!\n", strerror(errno)); logoff(NULL, 3); } @@ -1374,7 +1256,7 @@ int fmout( if (fpin) { buffer = load_message_from_file(fpin); if (!buffer) { - err_printf("Can't print message: %s!\n", + scr_printf("Can't print message: %s!\n", strerror(errno)); logoff(NULL, 3); } @@ -1383,9 +1265,6 @@ int fmout( } e = buffer; - if (starting_lp >= 0) - lines_printed = starting_lp; - /* Run the message body */ while (*e) { /* Catch characters that shouldn't be there at all */ @@ -1401,8 +1280,6 @@ int fmout( fprintf(fpout, "\n"); } else { scr_printf("\n"); - ++lines_printed; - lines_printed = checkpagin(lines_printed, pagin, height); } column = 0; } else if (old != ' ') {/* Don't print two spaces */ @@ -1434,8 +1311,6 @@ int fmout( fprintf(fpout, "\n"); } else { scr_printf("\n"); - ++lines_printed; - lines_printed = checkpagin(lines_printed, pagin, height); } column = 0; } else if (!(column == 0 && old == ' ')) { @@ -1481,8 +1356,6 @@ int fmout( fprintf(fpout, "\n"); } else { scr_printf("\n"); - ++lines_printed; - lines_printed = checkpagin(lines_printed, pagin, height); } column = 0; } @@ -1506,8 +1379,6 @@ int fmout( fprintf(fpout, "\n"); } else { scr_printf("\n"); - ++lines_printed; - lines_printed = checkpagin(lines_printed, pagin, height); } return sigcaught; @@ -1534,10 +1405,6 @@ void color(int colornum) current_color = colornum; if (enable_color) { -#if defined(HAVE_CURSES_H) && !defined(DISABLE_CURSES) - if (scr_color(colornum)) - return; -#endif /* When switching to dim white, actually output an 'original * pair' sequence -- this looks better on black-on-white * terminals. - Changed to ORIGINAL_PAIR as this actually @@ -1552,7 +1419,6 @@ void color(int colornum) (colornum & 7), rc_color_use_bg); - scr_flush(); } } @@ -1561,7 +1427,6 @@ void cls(int colornum) if (enable_color) { printf("\033[4%dm\033[2J\033[H\033[0m", colornum ? colornum : rc_color_use_bg); - scr_flush(); } } @@ -1610,6 +1475,11 @@ void look_for_ansi(void) if (FD_ISSET(0, &rfds)) { abuf[strlen(abuf) + 1] = 0; rv = read(0, &abuf[strlen(abuf)], 1); + if (rv < 0) { + scr_printf("failed to read after select: %s", + strerror(errno)); + break; + } } } while (FD_ISSET(0, &rfds)); @@ -1632,13 +1502,13 @@ void keyopt(char *buf) { color(DIM_WHITE); for (i=0; !IsEmptyStr(&buf[i]); ++i) { if (buf[i]=='<') { - pprintf("%c", buf[i]); + scr_printf("%c", buf[i]); color(BRIGHT_MAGENTA); } else { if (buf[i]=='>'&& buf[i+1] != '>') { color(DIM_WHITE); } - pprintf("%c", buf[i]); + scr_printf("%c", buf[i]); } } color(DIM_WHITE);