comparison mcabber/src/screen.c @ 24:e88b15cbf2de

[/trunk] Changeset 40 by mikael * Change structure -> src directory for mcabber source code...
author mikael
date Sun, 27 Mar 2005 20:16:02 +0000
parents
children 0cd8025eebee
comparison
equal deleted inserted replaced
23:d7107507424b 24:e88b15cbf2de
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <ncurses.h>
5 #include <panel.h>
6 #include <time.h>
7 #include <ctype.h>
8 #include <locale.h>
9
10 #include "screen.h"
11 #include "utils.h"
12 #include "buddies.h"
13 #include "parsecfg.h"
14 #include "lang.h"
15 #include "server.h"
16 #include "list.h"
17
18 /* Definicion de tipos */
19 #define window_entry(n) list_entry(n, window_entry_t, list)
20
21 LIST_HEAD(window_list);
22
23 typedef struct _window_entry_t {
24 WINDOW *win;
25 PANEL *panel;
26 char *name;
27 int nlines;
28 char **texto;
29 int hidden_msg;
30 struct list_head list;
31 } window_entry_t;
32
33
34 /* Variables globales a SCREEN.C */
35 static WINDOW *rosterWnd, *chatWnd, *inputWnd;
36 static WINDOW *logWnd, *logWnd_border;
37 static PANEL *rosterPanel, *chatPanel, *inputPanel;
38 static PANEL *logPanel, *logPanel_border;
39 static int maxY, maxX;
40 static window_entry_t *currentWindow;
41
42 static int chatmode;
43 int update_roaster;
44
45 static char inputLine[INPUTLINE_LENGTH+1];
46 static char *ptr_inputline;
47 static short int inputline_offset;
48
49
50 /* Funciones */
51
52 int scr_WindowHeight(WINDOW * win)
53 {
54 int x, y;
55 getmaxyx(win, y, x);
56 return x;
57 }
58
59 void scr_draw_box(WINDOW * win, int y, int x, int height, int width,
60 int Color, chtype box, chtype border)
61 {
62 int i, j;
63
64 wattrset(win, COLOR_PAIR(Color));
65 for (i = 0; i < height; i++) {
66 wmove(win, y + i, x);
67 for (j = 0; j < width; j++)
68 if (!i && !j)
69 waddch(win, border | ACS_ULCORNER);
70 else if (i == height - 1 && !j)
71 waddch(win, border | ACS_LLCORNER);
72 else if (!i && j == width - 1)
73 waddch(win, box | ACS_URCORNER);
74 else if (i == height - 1 && j == width - 1)
75 waddch(win, box | ACS_LRCORNER);
76 else if (!i)
77 waddch(win, border | ACS_HLINE);
78 else if (i == height - 1)
79 waddch(win, box | ACS_HLINE);
80 else if (!j)
81 waddch(win, border | ACS_VLINE);
82 else if (j == width - 1)
83 waddch(win, box | ACS_VLINE);
84 else
85 waddch(win, box | ' ');
86 }
87 }
88
89 int FindColor(char *name)
90 {
91 if (!strcmp(name, "default"))
92 return -1;
93 if (!strcmp(name, "black"))
94 return COLOR_BLACK;
95 if (!strcmp(name, "red"))
96 return COLOR_RED;
97 if (!strcmp(name, "green"))
98 return COLOR_GREEN;
99 if (!strcmp(name, "yellow"))
100 return COLOR_YELLOW;
101 if (!strcmp(name, "blue"))
102 return COLOR_BLUE;
103 if (!strcmp(name, "magenta"))
104 return COLOR_MAGENTA;
105 if (!strcmp(name, "cyan"))
106 return COLOR_CYAN;
107 if (!strcmp(name, "white"))
108 return COLOR_WHITE;
109
110 return -1;
111 }
112
113 void ParseColors(void)
114 {
115 char *colors[11] = {
116 "", "",
117 "borderlines",
118 "jidonlineselected",
119 "jidonline",
120 "jidofflineselected",
121 "jidoffline",
122 "text",
123 NULL
124 };
125
126 char *tmp = malloc(1024);
127 char *color1;
128 char *background = cfg_read("color_background");
129 char *backselected = cfg_read("color_backselected");
130 int i = 0;
131
132 while (colors[i]) {
133 sprintf(tmp, "color_%s", colors[i]);
134 color1 = cfg_read(tmp);
135
136 switch (i + 1) {
137 case 1:
138 init_pair(1, COLOR_BLACK, COLOR_WHITE);
139 break;
140 case 2:
141 init_pair(2, COLOR_WHITE, COLOR_BLACK);
142 break;
143 case 3:
144 init_pair(3, FindColor(color1), FindColor(background));
145 break;
146 case 4:
147 init_pair(4, FindColor(color1), FindColor(backselected));
148 break;
149 case 5:
150 init_pair(5, FindColor(color1), FindColor(background));
151 break;
152 case 6:
153 init_pair(6, FindColor(color1), FindColor(backselected));
154 break;
155 case 7:
156 init_pair(7, FindColor(color1), FindColor(background));
157 break;
158 case 8:
159 init_pair(8, FindColor(color1), FindColor(background));
160 break;
161 }
162 i++;
163 }
164 }
165
166
167 window_entry_t *scr_CreatePanel(char *title, int x, int y, int lines,
168 int cols, int dont_show)
169 {
170 window_entry_t *tmp = calloc(1, sizeof(window_entry_t));
171
172 tmp->win = newwin(lines, cols, y, x);
173 tmp->panel = new_panel(tmp->win);
174 tmp->name = (char *) calloc(1, 1024);
175 strncpy(tmp->name, title, 1024);
176
177 scr_draw_box(tmp->win, 0, 0, lines, cols, COLOR_GENERAL, 0, 0);
178 //mvwprintw(tmp->win, 0, (cols - (2 + strlen(title))) / 2, " %s ", title);
179 if ((!dont_show)) {
180 currentWindow = tmp;
181 } else {
182 if (currentWindow)
183 top_panel(currentWindow->panel);
184 else
185 top_panel(chatPanel);
186 }
187
188 list_add_tail(&tmp->list, &window_list);
189 update_panels();
190
191 return tmp;
192 }
193
194
195 void scr_CreatePopup(char *title, char *texto, int corte, int type,
196 char *returnstring)
197 {
198 WINDOW *popupWin;
199 PANEL *popupPanel;
200
201 int lineas = 0;
202 int cols = 0;
203
204 char **submsgs;
205 int n = 0;
206 int i;
207
208 char *instr = (char *) calloc(1, 1024);
209
210 /* fprintf(stderr, "\r\n%d", lineas); */
211
212 submsgs = ut_SplitMessage(texto, &n, corte);
213
214 switch (type) {
215 case 1:
216 case 0:
217 lineas = n + 4;
218 break;
219 }
220
221 cols = corte + 3;
222 popupWin = newwin(lineas, cols, (maxY - lineas) / 2, (maxX - cols) / 2);
223 popupPanel = new_panel(popupWin);
224
225 /*ATENCION!!! Colorear el popup ??
226 / box (popupWin, 0, 0); */
227 scr_draw_box(popupWin, 0, 0, lineas, cols, COLOR_POPUP, 0, 0);
228 mvwprintw(popupWin, 0, (cols - (2 + strlen(title))) / 2, " %s ", title);
229
230 for (i = 0; i < n; i++)
231 mvwprintw(popupWin, i + 1, 2, "%s", submsgs[i]);
232
233
234 for (i = 0; i < n; i++)
235 free(submsgs[i]);
236 free(submsgs);
237
238 switch (type) {
239 case 0:
240 mvwprintw(popupWin, n + 2,
241 (cols - (2 + strlen(i18n("Press any key")))) / 2,
242 i18n("Press any key"));
243 update_panels();
244 doupdate();
245 getch();
246 break;
247 case 1:
248 {
249 char ch;
250 int scroll = 0;
251 int input_x = 0;
252
253 wmove(popupWin, 3, 1);
254 wrefresh(popupWin);
255 keypad(popupWin, TRUE);
256 while ((ch = getch()) != '\n') {
257 switch (ch) {
258 case 0x09:
259 case KEY_UP:
260 case KEY_DOWN:
261 break;
262 case KEY_RIGHT:
263 case KEY_LEFT:
264 break;
265 case KEY_BACKSPACE:
266 case 127:
267 if (input_x || scroll) {
268 /* wattrset (popupWin, 0); */
269 if (!input_x) {
270 scroll = scroll < cols - 3 ? 0 : scroll - (cols - 3);
271 wmove(popupWin, 3, 1);
272 for (i = 0; i < cols; i++)
273 waddch
274 (popupWin,
275 instr
276 [scroll
277 + input_x + i] ? instr[scroll + input_x + i] : ' ');
278 input_x = strlen(instr) - scroll;
279 } else
280 input_x--;
281 instr[scroll + input_x] = '\0';
282 mvwaddch(popupWin, 3, input_x + 1, ' ');
283 wmove(popupWin, 3, input_x + 1);
284 wrefresh(popupWin);
285 }
286 default:
287 if ( /*ch<0x100 && */ isprint(ch) || ch == 'ñ'
288 || ch == 'Ñ') {
289 if (scroll + input_x < 1024) {
290 instr[scroll + input_x] = ch;
291 instr[scroll + input_x + 1] = '\0';
292 if (input_x == cols - 3) {
293 scroll++;
294 wmove(popupWin, 3, 1);
295 for (i = 0; i < cols - 3; i++)
296 waddch(popupWin, instr[scroll + i]);
297 } else {
298 wmove(popupWin, 3, 1 + input_x++);
299 waddch(popupWin, ch);
300 }
301 wrefresh(popupWin);
302 } else {
303 flash();
304 }
305 }
306 }
307 }
308 }
309 if (returnstring != NULL)
310 strcpy(returnstring, instr);
311 break;
312 }
313
314 del_panel(popupPanel);
315 delwin(popupWin);
316 update_panels();
317 doupdate();
318 free(instr);
319 keypad(inputWnd, TRUE);
320 }
321
322 void scr_RoolWindow(void)
323 {
324 }
325
326 window_entry_t *scr_SearchWindow(char *winId)
327 {
328 struct list_head *pos, *n;
329 window_entry_t *search_entry = NULL;
330
331 list_for_each_safe(pos, n, &window_list) {
332 search_entry = window_entry(pos);
333 if (search_entry->name) {
334 if (!strcasecmp(search_entry->name, winId)) {
335 return search_entry;
336 }
337 }
338 }
339 return NULL;
340 }
341
342 void scr_ShowWindow(char *winId)
343 {
344 int n, width, i;
345 window_entry_t *tmp = scr_SearchWindow(winId);
346 if (tmp != NULL) {
347 top_panel(tmp->panel);
348 currentWindow = tmp;
349 chatmode = TRUE;
350 tmp->hidden_msg = FALSE;
351 update_roaster = TRUE;
352 width = scr_WindowHeight(tmp->win);
353 for (n = 0; n < tmp->nlines; n++) {
354 mvwprintw(tmp->win, n + 1, 1, "");
355 for (i = 0; i < width - 2; i++)
356 waddch(tmp->win, ' ');
357 mvwprintw(tmp->win, n + 1, 1, "%s", tmp->texto[n]);
358 }
359 //move(CHAT_WIN_HEIGHT - 1, maxX - 1);
360 update_panels();
361 doupdate();
362 } else {
363 top_panel(chatPanel);
364 currentWindow = tmp;
365 }
366 }
367
368 void scr_ShowBuddyWindow(void)
369 {
370 buddy_entry_t *tmp = bud_SelectedInfo();
371 if (tmp->jid != NULL)
372 scr_ShowWindow(tmp->jid);
373 top_panel(inputPanel);
374 }
375
376
377 void scr_WriteInWindow(char *winId, char *texto, int TimeStamp, int force_show)
378 {
379 time_t ahora;
380 int n;
381 int i;
382 int width;
383 window_entry_t *tmp;
384 int dont_show = FALSE;
385
386
387 tmp = scr_SearchWindow(winId);
388
389 if (!chatmode)
390 dont_show = TRUE;
391 else if ((!force_show) && ((!currentWindow || (currentWindow != tmp))))
392 dont_show = TRUE;
393 // scr_LogPrint("dont_show=%d", dont_show);
394
395 if (tmp == NULL) {
396 tmp = scr_CreatePanel(winId, 20, 0, CHAT_WIN_HEIGHT, maxX - 20, dont_show);
397 tmp->texto = (char **) calloc((CHAT_WIN_HEIGHT+1) * 3, sizeof(char *));
398 for (n = 0; n < CHAT_WIN_HEIGHT * 3; n++)
399 tmp->texto[n] = (char *) calloc(1, 1024);
400
401 if (TimeStamp) {
402 ahora = time(NULL);
403 strftime(tmp->texto[tmp->nlines], 1024, "[%H:%M] ",
404 localtime(&ahora));
405 strcat(tmp->texto[tmp->nlines], texto);
406 } else {
407 sprintf(tmp->texto[tmp->nlines], " %s", texto);
408 }
409 tmp->nlines++;
410 } else {
411 if (tmp->nlines < CHAT_WIN_HEIGHT - 2) {
412 if (TimeStamp) {
413 ahora = time(NULL);
414 strftime(tmp->texto[tmp->nlines], 1024,
415 "[%H:%M] ", localtime(&ahora));
416 strcat(tmp->texto[tmp->nlines], texto);
417 } else {
418 sprintf(tmp->texto[tmp->nlines], " %s", texto);
419 }
420 tmp->nlines++;
421 } else {
422 for (n = 0; n < tmp->nlines; n++) {
423 memset(tmp->texto[n], 0, 1024);
424 strncpy(tmp->texto[n], tmp->texto[n + 1], 1024);
425 }
426 if (TimeStamp) {
427 ahora = time(NULL);
428 strftime(tmp->texto[tmp->nlines - 1], 1024,
429 "[%H:%M] ", localtime(&ahora));
430 strcat(tmp->texto[tmp->nlines - 1], texto);
431 } else {
432 sprintf(tmp->texto[tmp->nlines - 1], " %s", texto);
433 }
434 }
435 }
436
437 if (!dont_show) {
438 top_panel(tmp->panel);
439 width = scr_WindowHeight(tmp->win);
440 for (n = 0; n < tmp->nlines; n++) {
441 mvwprintw(tmp->win, n + 1, 1, "");
442 for (i = 0; i < width - 2; i++)
443 waddch(tmp->win, ' ');
444 mvwprintw(tmp->win, n + 1, 1, "%s", tmp->texto[n]);
445 }
446
447 update_panels();
448 doupdate();
449 } else {
450 tmp->hidden_msg = TRUE;
451 update_roaster = TRUE;
452 }
453 }
454
455 void scr_InitCurses(void)
456 {
457 initscr();
458 noecho();
459 raw();
460 //cbreak();
461 start_color();
462 use_default_colors();
463
464 ParseColors();
465
466 getmaxyx(stdscr, maxY, maxX);
467 inputLine[0] = 0;
468 ptr_inputline = inputLine;
469
470 //setlocale(LC_CTYPE, "");
471
472 return;
473 }
474
475 void scr_DrawMainWindow(void)
476 {
477 /* Draw main panels */
478 rosterWnd = newwin(CHAT_WIN_HEIGHT, 20, 0, 0);
479 rosterPanel = new_panel(rosterWnd);
480 scr_draw_box(rosterWnd, 0, 0, CHAT_WIN_HEIGHT, 20, COLOR_GENERAL, 0, 0);
481 mvwprintw(rosterWnd, 0, (20 - strlen(i18n("Roster"))) / 2,
482 i18n("Roster"));
483
484 chatWnd = newwin(CHAT_WIN_HEIGHT, maxX - 20, 0, 20);
485 chatPanel = new_panel(chatWnd);
486 scr_draw_box(chatWnd, 0, 0, CHAT_WIN_HEIGHT, maxX - 20, COLOR_GENERAL, 0, 0);
487 //mvwprintw(chatWnd, 0,
488 // ((maxX - 20) - strlen(i18n("Status Window"))) / 2,
489 // i18n("Status Window"));
490 //wbkgd(chatWnd, COLOR_PAIR(COLOR_GENERAL));
491 mvwprintw(chatWnd, 1, 1, "This is the status window");
492
493 logWnd_border = newwin(LOG_WIN_HEIGHT, maxX, CHAT_WIN_HEIGHT, 0);
494 logPanel_border = new_panel(logWnd_border);
495 scr_draw_box(logWnd_border, 0, 0, LOG_WIN_HEIGHT, maxX, COLOR_GENERAL, 0, 0);
496 // mvwprintw(logWnd_border, 0,
497 // ((maxX - 20) - strlen(i18n("Log Window"))) / 2,
498 // i18n("Log Window"));
499 //logWnd = newwin(LOG_WIN_HEIGHT - 2, maxX-20 - 2, CHAT_WIN_HEIGHT+1, 20+1);
500 logWnd = derwin(logWnd_border, LOG_WIN_HEIGHT-2, maxX-2, 1, 1);
501 logPanel = new_panel(logWnd);
502 wbkgd(logWnd, COLOR_PAIR(COLOR_GENERAL));
503 //wattrset(logWnd, COLOR_PAIR(COLOR_GENERAL));
504 scr_LogPrint("Start up.");
505
506 scrollok(logWnd,TRUE);
507 //idlok(logWnd,TRUE); // XXX Necessary?
508
509 inputWnd = newwin(1, maxX, maxY-1, 0);
510 inputPanel = new_panel(inputWnd);
511 //wbkgd(inputWnd, COLOR_PAIR(COLOR_GENERAL));
512
513 bud_DrawRoster(rosterWnd);
514 update_panels();
515 doupdate();
516 return;
517 }
518
519 void scr_TerminateCurses(void)
520 {
521 clear();
522 refresh();
523 endwin();
524 return;
525 }
526
527 void scr_WriteIncomingMessage(char *jidfrom, char *text)
528 {
529 char **submsgs;
530 int n, i;
531 char *buffer = (char *) malloc(5 + strlen(text));
532
533 sprintf(buffer, "<== %s", text);
534
535 submsgs =
536 ut_SplitMessage(buffer, &n, maxX - scr_WindowHeight(rosterWnd) - 20);
537
538 for (i = 0; i < n; i++) {
539 if (i == 0)
540 scr_WriteInWindow(jidfrom, submsgs[i], TRUE, FALSE);
541 else
542 scr_WriteInWindow(jidfrom, submsgs[i], FALSE, FALSE);
543 }
544
545 for (i = 0; i < n; i++)
546 free(submsgs[i]);
547
548 free(submsgs);
549 free(buffer);
550
551 top_panel(inputPanel);
552 //wmove(inputWnd, 0, ptr_inputline - (char*)&inputLine);
553 update_panels();
554 doupdate();
555 }
556
557 int scr_Getch(void)
558 {
559 int ch;
560 // keypad(inputWnd, TRUE);
561 ch = wgetch(inputWnd);
562 return ch;
563 }
564
565 WINDOW *scr_GetRosterWindow(void)
566 {
567 return rosterWnd;
568 }
569
570 WINDOW *scr_GetStatusWindow(void)
571 {
572 return chatWnd;
573 }
574
575 WINDOW *scr_GetInputWindow(void)
576 {
577 return inputWnd;
578 }
579
580 void scr_LogPrint(const char *fmt, ...)
581 {
582 time_t timestamp;
583 char *buffer;
584 va_list ap;
585
586 buffer = (char *) calloc(1, 4096);
587
588 timestamp = time(NULL);
589 strftime(buffer, 64, "[%H:%M:%S] ", localtime(&timestamp));
590 wprintw(logWnd, "\n%s", buffer);
591
592 va_start(ap, fmt);
593 vsnprintf(buffer, 4096, fmt, ap);
594 va_end(ap);
595
596 wprintw(logWnd, "%s", buffer);
597 free(buffer);
598
599 update_panels();
600 doupdate();
601 }
602
603 // scr_IsHiddenMessage(jid)
604 // Returns TRUE if there is a hidden message in the window
605 // for the jid contact.
606 int scr_IsHiddenMessage(char *jid) {
607 window_entry_t *wintmp;
608
609 wintmp = scr_SearchWindow(jid);
610 if ((wintmp) && (wintmp->hidden_msg))
611 return TRUE;
612
613 return FALSE;
614 }
615
616 void send_message(int sock, char *msg)
617 {
618 char **submsgs;
619 char *buffer = (char *) calloc(1, 24+strlen(msg));
620 char *buffer2 = (char *) calloc(1, 1024);
621 int n, i;
622 buddy_entry_t *tmp = bud_SelectedInfo();
623
624 scr_ShowWindow(tmp->jid);
625
626 sprintf(buffer, "--> %s", msg);
627
628 submsgs =
629 ut_SplitMessage(buffer, &n,
630 maxX - scr_WindowHeight(rosterWnd) - 20);
631 for (i = 0; i < n; i++) {
632 if (i == 0)
633 scr_WriteInWindow(tmp->jid, submsgs[i], TRUE, TRUE);
634 else
635 scr_WriteInWindow(tmp->jid, submsgs[i], FALSE, TRUE);
636 }
637
638 for (i = 0; i < n; i++)
639 free(submsgs[i]);
640 free(submsgs);
641
642 //move(CHAT_WIN_HEIGHT - 1, maxX - 1);
643 refresh();
644 sprintf(buffer2, "%s@%s/%s", cfg_read("username"),
645 cfg_read("server"), cfg_read("resource"));
646 srv_sendtext(sock, tmp->jid, msg, buffer2);
647 free(buffer);
648 free(buffer2);
649
650 top_panel(inputPanel);
651 }
652
653 int process_line(char *line, int sock)
654 {
655 if (*line != '/') {
656 send_message(sock, line);
657 return 0;
658 }
659 if (!strcasecmp(line, "/quit")) {
660 return 255;
661 }
662 // Commands handling
663 // TODO
664 // say...
665
666 scr_LogPrint("Unrecognised command, sorry.");
667 return 0;
668 }
669
670 // check_offset(int direction)
671 // Check inputline_offset value, and make sure the cursor is inside the
672 // screen.
673 inline void check_offset(int direction)
674 {
675 // Left side
676 if (inputline_offset && direction <= 0) {
677 while (ptr_inputline <= (char*)&inputLine + inputline_offset) {
678 if (inputline_offset) {
679 inputline_offset -= 5;
680 if (inputline_offset < 0)
681 inputline_offset = 0;
682 }
683 }
684 }
685 // Right side
686 if (direction >= 0) {
687 while (ptr_inputline >= inputline_offset + (char*)&inputLine + maxX)
688 inputline_offset += 5;
689 }
690 }
691
692 int process_key(int key, int sock)
693 {
694 if (isprint(key)) {
695 char tmpLine[INPUTLINE_LENGTH+1];
696
697 // Check the line isn't too long
698 if (strlen(inputLine) >= INPUTLINE_LENGTH)
699 return 0;
700
701 // Insert char
702 strcpy(tmpLine, ptr_inputline);
703 *ptr_inputline++ = key;
704 strcpy(ptr_inputline, tmpLine);
705 check_offset(1);
706 } else {
707 switch(key) {
708 case KEY_BACKSPACE:
709 if (ptr_inputline != (char*)&inputLine) {
710 *--ptr_inputline = 0;
711 check_offset(-1);
712 }
713 break;
714 case KEY_DC:
715 if (*ptr_inputline)
716 strcpy(ptr_inputline, ptr_inputline+1);
717 break;
718 case KEY_LEFT:
719 if (ptr_inputline != (char*)&inputLine) {
720 ptr_inputline--;
721 check_offset(-1);
722 }
723 break;
724 case KEY_RIGHT:
725 if (*ptr_inputline)
726 ptr_inputline++;
727 check_offset(1);
728 break;
729 case 9: // Tab
730 scr_LogPrint("I'm unable to complete yet");
731 break;
732 case '\n': // Enter
733 // XXX Test:
734 chatmode = TRUE;
735 if (inputLine[0] == 0) {
736 scr_ShowBuddyWindow();
737 break;
738 }
739 if (process_line(inputLine, sock))
740 return 255;
741 ptr_inputline = inputLine;
742 *ptr_inputline = 0;
743 inputline_offset = 0;
744 break;
745 case KEY_UP:
746 bud_RosterUp();
747 if (chatmode)
748 scr_ShowBuddyWindow();
749 break;
750 case KEY_DOWN:
751 bud_RosterDown();
752 if (chatmode)
753 scr_ShowBuddyWindow();
754 break;
755 case KEY_PPAGE:
756 scr_LogPrint("PageUp??");
757 break;
758 case KEY_NPAGE:
759 scr_LogPrint("PageDown??");
760 break;
761 case KEY_HOME:
762 case 1:
763 ptr_inputline = inputLine;
764 inputline_offset = 0;
765 break;
766 case KEY_END:
767 case 5:
768 for (; *ptr_inputline; ptr_inputline++) ;
769 check_offset(1);
770 break;
771 case 21: // Ctrl-u
772 strcpy(inputLine, ptr_inputline);
773 ptr_inputline = inputLine;
774 inputline_offset = 0;
775 break;
776 case KEY_EOL:
777 case 11: // Ctrl-k
778 *ptr_inputline = 0;
779 break;
780 case 16: // Ctrl-p
781 scr_LogPrint("Ctrl-p not yet implemented");
782 break;
783 case 14: // Ctrl-n
784 scr_LogPrint("Ctrl-n not yet implemented");
785 break;
786 case 27: // ESC
787 currentWindow = NULL;
788 chatmode = FALSE;
789 top_panel(chatPanel);
790 top_panel(inputPanel);
791 break;
792 default:
793 scr_LogPrint("Unkown key=%d", key);
794 }
795 //scr_LogPrint("[%02x]", key);
796 }
797 mvwprintw(inputWnd, 0,0, "%s", inputLine + inputline_offset);
798 wclrtoeol(inputWnd);
799 if (*ptr_inputline) {
800 wmove(inputWnd, 0, ptr_inputline - (char*)&inputLine - inputline_offset);
801 }
802 update_panels();
803 doupdate();
804 return 0;
805 }