screen.c

Go to the documentation of this file.
00001 /* screen.c Copyright Michael Temari 08/01/1996 All Rights Reserved */
00002 
00003 #include <sys/types.h>
00004 #include <sys/stat.h>
00005 #include <stdio.h>
00006 #include <signal.h>
00007 #include <ctype.h>
00008 #include <string.h>
00009 #include <unistd.h>
00010 #include <curses.h>
00011 
00012 #include "screen.h"
00013 
00014 _PROTOTYPE(void gotsig, (int sig));
00015 _PROTOTYPE(static char *delword, (WINDOW *w));
00016 
00017 struct {
00018         WINDOW *win;
00019         char erase;
00020         char kill;
00021         char werase;
00022 } window[2];
00023 
00024 static char line[80+1];
00025 
00026 int ScreenDone = 0;
00027 
00028 static WINDOW *dwin;
00029 
00030 void gotsig(sig)
00031 int sig;
00032 {
00033    ScreenDone = 1;
00034    signal(sig, gotsig);
00035 }
00036 
00037 int ScreenInit()
00038 {
00039 int i;
00040 
00041    if(initscr() == (WINDOW *)NULL) {
00042         fprintf(stderr, "talk: Could not initscr\n");
00043         return(-1);
00044    }
00045    signal(SIGINT, gotsig);
00046    signal(SIGQUIT, gotsig);
00047    signal(SIGPIPE, gotsig);
00048    signal(SIGHUP, gotsig);
00049    clear();
00050    refresh();
00051    noecho();
00052    cbreak();
00053 
00054    /* local window */
00055    window[LOCALWIN].win = newwin(LINES / 2, COLS, 0, 0);
00056    scrollok(window[LOCALWIN].win, TRUE);
00057    wclear(window[LOCALWIN].win);
00058 
00059    /* divider between windows */
00060    dwin = newwin(1, COLS, LINES / 2, 0);
00061    i = COLS;
00062    while(i-- > 0)
00063         waddch(dwin, '-');
00064    wrefresh(dwin);
00065 
00066    /* remote window */
00067    window[REMOTEWIN].win = newwin(LINES - (LINES / 2) - 1, COLS, LINES / 2 + 1, 0);
00068    scrollok(window[REMOTEWIN].win, TRUE);
00069    wclear(window[REMOTEWIN].win);
00070 
00071    return(0);
00072 }
00073 
00074 void ScreenMsg(msg)
00075 char *msg;
00076 {
00077 WINDOW *w;
00078 
00079    w =window[LOCALWIN].win;
00080 
00081    wmove(w, 0, 0);
00082 
00083    if(*msg != '\0') {
00084         wprintw(w, "[%s]", msg);
00085         wclrtoeol(w);
00086    } else
00087         werase(w);
00088 
00089    wrefresh(w);
00090 }
00091 
00092 void ScreenWho(user, host)
00093 char *user;
00094 char *host;
00095 {
00096    if(*host != '\0') {
00097         wmove(dwin, 0, (COLS - (1 + strlen(user) + 1 + strlen(host) + 1)) / 2);
00098         wprintw(dwin, " %s@%s ", user, host);
00099    } else {
00100         wmove(dwin, 0, (COLS - (1 + strlen(user) + 1)) / 2);
00101         wprintw(dwin, " %s ", user);
00102    }
00103    wrefresh(dwin);
00104 }
00105 
00106 void ScreenEdit(lcc, rcc)
00107 char lcc[];
00108 char rcc[];
00109 {
00110    window[LOCALWIN].erase   = lcc[0];
00111    window[LOCALWIN].kill    = lcc[1];
00112    window[LOCALWIN].werase  = lcc[2];
00113    window[REMOTEWIN].erase  = rcc[0];
00114    window[REMOTEWIN].kill   = rcc[1];
00115    window[REMOTEWIN].werase = rcc[2];
00116 }
00117 
00118 void ScreenPut(data, len, win)
00119 char *data;
00120 int len;
00121 int win;
00122 {
00123 WINDOW *w;
00124 unsigned char ch;
00125 int r, c;
00126 
00127    w = window[win].win;
00128 
00129    while(len-- > 0) {
00130         ch = *data++;
00131         /* new line CR, NL */
00132         if(ch == '\r' || ch == '\n') {
00133                 waddch(w, '\n');
00134         } else
00135         /* erase a character, BS, DEL  */
00136         if(ch == 0x08 || ch == 0x7f || ch == window[win].erase) {
00137                 getyx(w, r, c);
00138                 if(c > 0)
00139                         c--;
00140                 wmove(w, r, c);
00141                 waddch(w, ' ');
00142                 wmove(w, r, c);
00143         } else
00144         /* erase line CTL-U */
00145         if(ch == 0x15 || ch == window[win].kill) {
00146                 getyx(w, r, c);
00147                 wmove(w, r, 0);
00148                 wclrtoeol(w);
00149         } else
00150         /* refresh CTL-L */
00151         if(ch == 0x0c) {
00152                 if(win == LOCALWIN) {
00153                         touchwin(w);
00154                         wrefresh(w);
00155                         touchwin(window[REMOTEWIN].win);
00156                         wrefresh(window[REMOTEWIN].win);
00157                 }
00158         } else
00159         /* bell CTL-G */
00160         if(ch == 0x07) {
00161                 putchar(ch);
00162         }
00163         else
00164         /* erase last word CTL-W */
00165         if(ch == 0x17 || ch == window[win].werase) {
00166                 (void) delword(w);
00167         } else {
00168                 getyx(w, r, c);
00169                 if(1 || isprint(ch)) {
00170                         if(ch != ' ' && c == (COLS - 1))
00171                                 wprintw(w, "\n%s", delword(w));
00172                         waddch(w, ch);
00173                 }
00174         }
00175    }
00176    wrefresh(w);
00177 }
00178 
00179 static char *delword(w)
00180 WINDOW *w;
00181 {
00182 int r, c;
00183 int i = 0;
00184 char ch;
00185 char *p = &line[80];
00186 
00187    *p-- = '\0';
00188    getyx(w, r, c);
00189    if(c == 0) return;
00190    while(c >= 0) {
00191         c--;
00192         ch = mvwinch(w, r, c);
00193         if(ch == ' ') break;
00194         *p-- = ch;
00195         i = 1;
00196         waddch(w, ' ');
00197    }
00198    c += i;
00199    wmove(w, r, c);
00200    return(++p);
00201 }
00202 
00203 void ScreenEnd()
00204 {
00205    move(LINES - 1, 0);
00206    refresh();
00207    endwin();
00208 }

Generated on Fri Apr 14 22:57:13 2006 for minix by  doxygen 1.4.6