* This file contains functions which implement parts of the
* text-mode user interface.
*
- * Copyright (c) 1987-2010 by the citadel.org team
+ * Copyright (c) 1987-2012 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 open source software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3.
*
* 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
*/
#include "sysdep.h"
#include "rooms.h"
#include "client_chat.h"
#include "citadel_dirs.h"
+#include "tuiconfig.h"
#ifndef HAVE_SNPRINTF
#include "snprintf.h"
#endif
char rc_open_cmd[SIZ];
char rc_gotmail_cmd[SIZ];
-char *gl_string;
int next_lazy_cmd = 5;
extern int screenwidth, screenheight;
* 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);
static time_t idlet = 0;
static void really_do_keepalive(void) {
- int r; /* IPC response code */
time(&idlet);
* 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", "");
-/* Gets a line from the terminal */
-/* string == Pointer to string buffer */
-/* lim == Maximum length - if negative, no-show */
-void ctdl_getline(char *string, int lim)
+/*
+ * Function to read a line of text from the terminal.
+ *
+ * string Pointer to string buffer
+ * lim Maximum length
+ * noshow Echo asterisks instead of keystrokes?
+ * bs Allow backspacing out of the prompt? (returns -1 if this happens)
+ *
+ * returns: string length
+ */
+int ctdl_getline(char *string, int lim, int noshow, int bs)
{
- int a, b;
- char flag = 0;
+ int pos = strlen(string);
+ int ch;
- if (lim < 0) {
- lim = (0 - lim);
- flag = 1;
- }
- strcpy(string, "");
- gl_string = string;
async_ka_start();
-
-GLA: a = inkey();
- /* a = (a & 127); ** commented out because it isn't just an ASCII world anymore */
- if ((a == 8 || a == 23) && (IsEmptyStr(string)))
- goto GLA;
- if ((a != 10) && (a != 8) && (strlen(string) == lim))
- goto GLA;
- if ((a == 8) && (string[0] != 0)) {
- string[strlen(string) - 1] = 0;
- scr_putc(8); scr_putc(32); scr_putc(8);
- goto GLA;
+ if (noshow && !IsEmptyStr(string)) {
+ int num_stars = strlen(string);
+ while (num_stars--) {
+ scr_putc('*');
+ }
}
- if ((a == 23) && (string[0] != 0)) {
- do {
- string[strlen(string) - 1] = 0;
- scr_putc(8); scr_putc(32); scr_putc(8);
- } while (!IsEmptyStr(string) && string[strlen(string) - 1] != ' ');
- goto GLA;
+ else {
+ scr_printf("%s", string);
}
- if ((a == 10)) {
- scr_putc(10);
- async_ka_end();
- return;
+
+ while(1) {
+ ch = inkey();
+
+ if ((ch == 8) && (pos > 0)) { /* backspace */
+ --pos;
+ scr_putc(8); scr_putc(32); scr_putc(8);
+ }
+
+ else if ((ch == 8) && (pos == 0) && (bs)) { /* backspace out of the prompt */
+ async_ka_end();
+ return(-1);
+ }
+
+ else if ((ch == 23) && (pos > 0)) { /* Ctrl-W deletes a word */
+ while ((pos > 0) && !isspace(string[pos])) {
+ --pos;
+ scr_putc(8); scr_putc(32); scr_putc(8);
+ }
+ while ((pos > 0) && !isspace(string[pos-1])) {
+ --pos;
+ scr_putc(8); scr_putc(32); scr_putc(8);
+ }
+ }
+
+ else if (ch == 10) { /* return */
+ string[pos] = 0;
+ scr_printf("\n");
+ async_ka_end();
+ return(pos);
+ }
+
+ else if (isprint(ch)) { /* payload characters */
+ scr_putc((noshow ? '*' : ch));
+ string[pos] = ch;
+ ++pos;
+ }
}
- if (a < 32)
- a = '.';
- b = strlen(string);
- string[b] = a;
- string[b + 1] = 0;
- if (flag == 0)
- scr_putc(a);
- if (flag == 1)
- scr_putc('*');
- goto GLA;
}
-/*
- * strprompt() - prompt for a string, print the existing value and
- * allow the user to press return to keep it...
+/*
+ * newprompt() prompt for a string, print the existing value, and
+ * allow the user to press return to keep it...
+ * If len is negative, pass the "noshow" flag to ctdl_getline()
*/
void strprompt(char *prompt, char *str, int len)
{
- int i;
- char buf[128];
-
print_instant();
color(DIM_WHITE);
- scr_printf("%s ", prompt);
- color(DIM_MAGENTA);
- scr_printf("[");
- color(BRIGHT_MAGENTA);
-
- if (len >= 0) {
- scr_printf("%s", str);
- }
- else {
- for (i=0; !IsEmptyStr(&str[i]); ++i) {
- scr_printf("*");
- }
- }
-
- color(DIM_MAGENTA);
- scr_printf("]");
+ scr_printf("%s", prompt);
color(DIM_WHITE);
scr_printf(": ");
color(BRIGHT_CYAN);
- ctdl_getline(buf, len);
- if (buf[0] != 0)
- strcpy(str, buf);
+ ctdl_getline(str, abs(len), (len<0), 0);
color(DIM_WHITE);
}
}
/*
- * newprompt() - prompt for a string with no existing value
- * (clears out string buffer first)
+ * newprompt() prompt for a string with no existing value
+ * (clears out string buffer first)
+ * If len is negative, pass the "noshow" flag to ctdl_getline()
*/
void newprompt(char *prompt, char *str, int len)
{
+ str[0] = 0;
color(BRIGHT_MAGENTA);
scr_printf("%s", prompt);
color(DIM_MAGENTA);
- ctdl_getline(str, len);
+ ctdl_getline(str, abs(len), (len<0), 0);
color(DIM_WHITE);
}
{
FILE *ccfile;
char buf[1024];
- char editor_key[100];
struct citcmd *cptr;
struct citcmd *lastcmd = NULL;
int a, d;
int b = 0;
- int i;
-
/* first, set up some defaults for non-required variables */
- for (i = 0; i < MAX_EDITORS; i++)
- strcpy(editor_paths[i], "");
+ strcpy(editor_path, "");
strcpy(printcmd, "");
strcpy(imagecmd, "");
strcpy(rc_username, "");
#ifdef HAVE_OPENSSL
rc_encrypt = RC_DEFAULT;
#endif
- rc_alt_semantics = 0;
/* now try to open the citadel.rc file */
#endif
}
- if (!strncasecmp(buf, "editor=", 7))
- strcpy(editor_paths[0], &buf[7]);
-
- for (i = 0; i < MAX_EDITORS; i++)
- {
- sprintf(editor_key, "editor%d=", i);
- if (!strncasecmp(buf, editor_key, strlen(editor_key)))
- strcpy(editor_paths[i], &buf[strlen(editor_key)]);
+ if (!strncasecmp(buf, "editor=", 7)) {
+ strcpy(editor_path, &buf[7]);
}
if (!strncasecmp(buf, "printcmd=", 9))
if (!strncasecmp(buf, "expcmd=", 7))
strcpy(rc_exp_cmd, &buf[7]);
- if (!strncasecmp(buf, "local_screen_dimensions=", 24))
- have_xterm = (char) atoi(&buf[24]);
-
if (!strncasecmp(buf, "use_floors=", 11)) {
if (!strcasecmp(&buf[11], "yes"))
rc_floor_mode = RC_YES;
if (!strncasecmp(&buf[11], "user", 4))
rc_ansi_color = 3; /* user config */
}
+ if (!strncasecmp(buf, "status_line=", 12)) {
+ if (!strncasecmp(&buf[12], "on", 2))
+ enable_status_line = 1;
+ }
if (!strncasecmp(buf, "use_background=", 15)) {
if (!strncasecmp(&buf[15], "on", 2))
rc_color_use_bg = 9;
if (!strncasecmp(buf, "gotmailcmd=", 11))
strcpy(rc_gotmail_cmd, &buf[11]);
- if (!strncasecmp(buf, "alternate_semantics=", 20)) {
- if (!strncasecmp(&buf[20], "yes", 3)) {
- rc_alt_semantics = 1;
- }
- else {
- rc_alt_semantics = 0;
- }
- }
-
if (!strncasecmp(buf, "cmd=", 4)) {
strcpy(buf, &buf[4]);
scr_printf("\n%s", room_name);
color(DIM_WHITE);
scr_printf("%c ", room_prompt(room_flags));
- scr_flush();
while (1) {
ch = inkey();
if (cmdmatch(cmdbuf, cptr, 5)) {
/* We've found our command. */
if (requires_string(cptr, cmdpos)) {
- ctdl_getline(argbuf, 64);
+ argbuf[0] = 0;
+ ctdl_getline(argbuf, 64, 0, 0);
} else {
scr_printf("\n");
}
(colornum & 7),
rc_color_use_bg);
- scr_flush();
}
}
if (enable_color) {
printf("\033[4%dm\033[2J\033[H\033[0m",
colornum ? colornum : rc_color_use_bg);
- scr_flush();
}
}
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));