/* * This version of frontend uses timeout to read from socket. */ #include <signal.h> #include <stdio.h> #include <errno.h> #include <curses.h> char *rcv_message(); extern void prepare_ipc(), exit(), send_message(), read_server(); void catch_alarm(); extern int errno; char prompt[100]; int screen_garbled; int main() { char buff[200]; int len = 0, ch; initscr(); cbreak(); noecho(); nonl(); scrollok(stdscr, 1); prepare_ipc(); signal(SIGALRM, catch_alarm); alarm(1); while(1) { read_server(); if (screen_garbled && len > 0) { buff[len] = '\0'; printw("\n%s", prompt); refresh(); } screen_garbled = 0; ch = getch(); if (ch != 0 && ch != -1) { switch(ch) { default: buff[len++] = ch; addch(ch); refresh(); break; case '\b': if (len == 0) break; printw("\b \b"); len--; refresh(); break; case 'u' - 'a' + 1: printw("^U\n"); refresh(); len = 0; break; case '\n': case '\r': addstr("\n"); refresh(); buff[len] = '\n'; buff[len+1] = '\0'; send_message(buff); len = 0; break; } } } } void read_server() { char *str; while(1) { str = rcv_message(); if (str == 0) return; if (str[0] == '\0') { endwin(); exit(0); } if (!screen_garbled) save_prompt(); printw("%s", str); screen_garbled = 1; refresh(); } } /* * Do nothing but capturing the alarm, and setting up a new. */ void catch_alarm() { signal(SIGALRM, catch_alarm); alarm(1); } save_prompt() { int x, y; int i; getyx(stdscr, y, x); if (x == 0) { prompt[0] = '\0'; return; } for (i=0; i<x; i++) { move(y, i); prompt[i] = inch(); } move(y, x); prompt[i] = '\0'; }