/commands/talk/screen.c

https://github.com/Spenser309/CS551 · C · 208 lines · 171 code · 27 blank · 10 comment · 46 complexity · b8bd16f10dceadf7601934095af7ec54 MD5 · raw file

  1. /* screen.c Copyright Michael Temari 08/01/1996 All Rights Reserved */
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. #include <stdio.h>
  5. #include <signal.h>
  6. #include <ctype.h>
  7. #include <string.h>
  8. #include <unistd.h>
  9. #include <curses.h>
  10. #include "screen.h"
  11. _PROTOTYPE(void gotsig, (int sig));
  12. _PROTOTYPE(static char *delword, (WINDOW *w));
  13. struct {
  14. WINDOW *win;
  15. char erase;
  16. char kill;
  17. char werase;
  18. } window[2];
  19. static char line[80+1];
  20. int ScreenDone = 0;
  21. static WINDOW *dwin;
  22. void gotsig(sig)
  23. int sig;
  24. {
  25. ScreenDone = 1;
  26. signal(sig, gotsig);
  27. }
  28. int ScreenInit()
  29. {
  30. int i;
  31. if(initscr() == (WINDOW *)NULL) {
  32. fprintf(stderr, "talk: Could not initscr\n");
  33. return(-1);
  34. }
  35. signal(SIGINT, gotsig);
  36. signal(SIGQUIT, gotsig);
  37. signal(SIGPIPE, gotsig);
  38. signal(SIGHUP, gotsig);
  39. clear();
  40. refresh();
  41. noecho();
  42. cbreak();
  43. /* local window */
  44. window[LOCALWIN].win = newwin(LINES / 2, COLS, 0, 0);
  45. scrollok(window[LOCALWIN].win, TRUE);
  46. wclear(window[LOCALWIN].win);
  47. /* divider between windows */
  48. dwin = newwin(1, COLS, LINES / 2, 0);
  49. i = COLS;
  50. while(i-- > 0)
  51. waddch(dwin, '-');
  52. wrefresh(dwin);
  53. /* remote window */
  54. window[REMOTEWIN].win = newwin(LINES - (LINES / 2) - 1, COLS, LINES / 2 + 1, 0);
  55. scrollok(window[REMOTEWIN].win, TRUE);
  56. wclear(window[REMOTEWIN].win);
  57. return(0);
  58. }
  59. void ScreenMsg(msg)
  60. char *msg;
  61. {
  62. WINDOW *w;
  63. w =window[LOCALWIN].win;
  64. wmove(w, 0, 0);
  65. if(*msg != '\0') {
  66. wprintw(w, "[%s]", msg);
  67. wclrtoeol(w);
  68. } else
  69. werase(w);
  70. wrefresh(w);
  71. }
  72. void ScreenWho(user, host)
  73. char *user;
  74. char *host;
  75. {
  76. if(*host != '\0') {
  77. wmove(dwin, 0, (COLS - (1 + strlen(user) + 1 + strlen(host) + 1)) / 2);
  78. wprintw(dwin, " %s@%s ", user, host);
  79. } else {
  80. wmove(dwin, 0, (COLS - (1 + strlen(user) + 1)) / 2);
  81. wprintw(dwin, " %s ", user);
  82. }
  83. wrefresh(dwin);
  84. }
  85. void ScreenEdit(lcc, rcc)
  86. char lcc[];
  87. char rcc[];
  88. {
  89. window[LOCALWIN].erase = lcc[0];
  90. window[LOCALWIN].kill = lcc[1];
  91. window[LOCALWIN].werase = lcc[2];
  92. window[REMOTEWIN].erase = rcc[0];
  93. window[REMOTEWIN].kill = rcc[1];
  94. window[REMOTEWIN].werase = rcc[2];
  95. }
  96. void ScreenPut(data, len, win)
  97. char *data;
  98. int len;
  99. int win;
  100. {
  101. WINDOW *w;
  102. unsigned char ch;
  103. int r, c;
  104. w = window[win].win;
  105. while(len-- > 0) {
  106. ch = *data++;
  107. /* new line CR, NL */
  108. if(ch == '\r' || ch == '\n') {
  109. waddch(w, '\n');
  110. } else
  111. /* erase a character, BS, DEL */
  112. if(ch == 0x08 || ch == 0x7f || ch == window[win].erase) {
  113. getyx(w, r, c);
  114. if(c > 0)
  115. c--;
  116. wmove(w, r, c);
  117. waddch(w, ' ');
  118. wmove(w, r, c);
  119. } else
  120. /* erase line CTL-U */
  121. if(ch == 0x15 || ch == window[win].kill) {
  122. getyx(w, r, c);
  123. wmove(w, r, 0);
  124. wclrtoeol(w);
  125. } else
  126. /* refresh CTL-L */
  127. if(ch == 0x0c) {
  128. if(win == LOCALWIN) {
  129. touchwin(w);
  130. wrefresh(w);
  131. touchwin(window[REMOTEWIN].win);
  132. wrefresh(window[REMOTEWIN].win);
  133. }
  134. } else
  135. /* bell CTL-G */
  136. if(ch == 0x07) {
  137. putchar(ch);
  138. }
  139. else
  140. /* erase last word CTL-W */
  141. if(ch == 0x17 || ch == window[win].werase) {
  142. (void) delword(w);
  143. } else {
  144. getyx(w, r, c);
  145. if(1 || isprint(ch)) {
  146. if(ch != ' ' && c == (COLS - 1))
  147. wprintw(w, "\n%s", delword(w));
  148. waddch(w, ch);
  149. }
  150. }
  151. }
  152. wrefresh(w);
  153. }
  154. static char *delword(w)
  155. WINDOW *w;
  156. {
  157. int r, c;
  158. int i = 0;
  159. char ch;
  160. char *p = &line[80];
  161. *p-- = '\0';
  162. getyx(w, r, c);
  163. if(c == 0) return;
  164. while(c >= 0) {
  165. c--;
  166. ch = mvwinch(w, r, c);
  167. if(ch == ' ') break;
  168. *p-- = ch;
  169. i = 1;
  170. waddch(w, ' ');
  171. }
  172. c += i;
  173. wmove(w, r, c);
  174. return(++p);
  175. }
  176. void ScreenEnd()
  177. {
  178. move(LINES - 1, 0);
  179. refresh();
  180. endwin();
  181. }