00001
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
00055 window[LOCALWIN].win = newwin(LINES / 2, COLS, 0, 0);
00056 scrollok(window[LOCALWIN].win, TRUE);
00057 wclear(window[LOCALWIN].win);
00058
00059
00060 dwin = newwin(1, COLS, LINES / 2, 0);
00061 i = COLS;
00062 while(i-- > 0)
00063 waddch(dwin, '-');
00064 wrefresh(dwin);
00065
00066
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
00132 if(ch == '\r' || ch == '\n') {
00133 waddch(w, '\n');
00134 } else
00135
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
00145 if(ch == 0x15 || ch == window[win].kill) {
00146 getyx(w, r, c);
00147 wmove(w, r, 0);
00148 wclrtoeol(w);
00149 } else
00150
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
00160 if(ch == 0x07) {
00161 putchar(ch);
00162 }
00163 else
00164
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 }