X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fterminal.c;h=f9725c80c7f6bfc9bffd51cf751fb65ff0da98b3;hb=refs%2Fheads%2Fmaster;hp=03ac5d402b1a146fda1befbe9c4ece145ef74923;hpb=f5b50d6c0e974bd0b407b3032c0895f29855d29d;p=sympathy.git diff --git a/src/terminal.c b/src/terminal.c index 03ac5d4..f9725c8 100644 --- a/src/terminal.c +++ b/src/terminal.c @@ -1,15 +1,73 @@ -/* +/* * terminal.c: * - * Copyright (c) 2008 James McKenzie , + * Copyright (c) 2008 James McKenzie , * All rights reserved. * */ -static char rcsid[] = "$Id$"; +static char rcsid[] = + "$Id: terminal.c,v 1.24 2008/03/12 10:47:26 james Exp $"; -/* - * $Log$ +/* + * $Log: terminal.c,v $ + * Revision 1.24 2008/03/12 10:47:26 james + * @@ + * + * Revision 1.23 2008/03/12 01:30:23 james + * *** empty log message *** + * + * Revision 1.22 2008/03/11 17:56:50 james + * *** empty log message *** + * + * Revision 1.21 2008/03/11 17:56:04 james + * *** empty log message *** + * + * Revision 1.20 2008/03/10 11:49:33 james + * *** empty log message *** + * + * Revision 1.19 2008/03/07 14:16:44 james + * *** empty log message *** + * + * Revision 1.18 2008/03/07 14:13:40 james + * *** empty log message *** + * + * Revision 1.17 2008/03/07 13:16:02 james + * *** empty log message *** + * + * Revision 1.16 2008/03/07 12:42:08 james + * *** empty log message *** + * + * Revision 1.15 2008/03/07 12:37:04 james + * *** empty log message *** + * + * Revision 1.14 2008/03/03 06:04:42 james + * *** empty log message *** + * + * Revision 1.13 2008/03/02 10:37:56 james + * *** empty log message *** + * + * Revision 1.12 2008/02/28 16:57:52 james + * *** empty log message *** + * + * Revision 1.11 2008/02/26 23:56:12 james + * *** empty log message *** + * + * Revision 1.10 2008/02/26 23:23:17 james + * *** empty log message *** + * + * Revision 1.9 2008/02/15 03:32:07 james + * *** empty log message *** + * + * Revision 1.8 2008/02/14 10:39:14 james + * *** empty log message *** + * + * Revision 1.7 2008/02/14 01:55:57 james + * *** empty log message *** + * + * Revision 1.6 2008/02/14 00:57:58 james + * *** empty log message *** + * * Revision 1.5 2008/02/13 18:05:06 james * *** empty log message *** * @@ -48,8 +106,7 @@ static char rcsid[] = "$Id$"; #include "project.h" -typedef struct TERMINAL_struct -{ +typedef struct TERMINAL_struct { TTY_SIGNATURE; struct termios orig_termios; struct TERMINAL_struct *next; @@ -85,11 +142,17 @@ terminal_close (TTY * _t) set_nonblocking (t->wfd); - t->xmit (_t, "\033[r", 3); - t->xmit (_t, "\033[0m", 4); - i = sprintf (buf, "\033[%d;%dH", CRT_ROWS + 1, 1); + t->xmit (_t, "\033%@", 3); // Leave UTF-8 + t->xmit (_t, "\033(B", 3); // US-ASCII in G0 + t->xmit (_t, "\033)B", 3); // US-ASCII in G1 + t->xmit (_t, "\017", 1); // Select G0 + t->xmit (_t, "\033[?25h", 6); // Show cursor + t->xmit (_t, "\033[r", 3); // No margins + t->xmit (_t, "\033[0m", 4); // Default attributes + i = sprintf (buf, "\033[%d;%dH", t->displayed_length ? (t->displayed_length + 1) : (CRT_ROWS + 1), 1); + // Cursor to bottom t->xmit (_t, buf, i); - t->xmit (_t, "\033[J", 3); + t->xmit (_t, "\033[J", 3); // erase rest of screen set_blocking (t->rfd); set_blocking (t->wfd); @@ -128,16 +191,13 @@ terminal_getsize (TTY * _t) if (!t) return; - if (ioctl (t->wfd, TIOCGWINSZ, &sz)) - { - t->size.x = CRT_COLS; - t->size.y = CRT_ROWS; - } - else - { - t->size.x = sz.ws_col; - t->size.y = sz.ws_row; - } + if (ioctl (t->wfd, TIOCGWINSZ, &sz)) { + t->size.x = CRT_COLS; + t->size.y = CRT_ROWS; + } else { + t->size.x = sz.ws_col; + t->size.y = sz.ws_row; + } } @@ -153,7 +213,7 @@ terminal_dispatch (void) terminal_winches = 0; for (t = terminal_list; t; t = t->next) - terminal_getsize ((TTY *)t); + terminal_getsize ((TTY *) t); } @@ -167,19 +227,18 @@ terminal_read (TTY * _t, void *buf, int len) terminal_dispatch (); set_nonblocking (t->rfd); - do - { + do { - red = wrap_read (t->rfd, buf, len); - if (red < 0) - return -1; - if (!red) - return done; + red = wrap_read (t->rfd, buf, len); + if (red < 0) + return -1; + if (!red) + return done; - buf += red; - len -= red; - done += red; - } + buf += red; + len -= red; + done += red; + } while (len); @@ -197,20 +256,19 @@ terminal_write (TTY * _t, void *buf, int len) set_blocking (t->wfd); - do - { + do { - writ = wrap_write (t->wfd, buf, len); - if (writ < 0) - return -1; + writ = wrap_write (t->wfd, buf, len); + if (writ < 0) + return -1; - if (!writ) - usleep (1000); + if (!writ) + usleep (1000); - buf += writ; - len -= writ; - done += writ; - } + buf += writ; + len -= writ; + done += writ; + } while (len); @@ -232,16 +290,17 @@ terminal_register_handlers (void) sigaction (SIGINT, &sa, NULL); } + TTY * terminal_open (int rfd, int wfd) { TERMINAL *t; pid_t child; - char name[1024]; struct termios termios; - t = (TERMINAL *) malloc (sizeof (TERMINAL)); + t = (TERMINAL *) xmalloc (sizeof (TERMINAL)); + strcpy (t->name, "terminal"); t->rfd = rfd; t->wfd = wfd; @@ -257,13 +316,14 @@ terminal_open (int rfd, int wfd) cfmakeraw (&termios); - //raw_termios (&termios); + // raw_termios (&termios); tcsetattr (wfd, TCSANOW, &termios); t->recv = terminal_read; t->xmit = terminal_write; t->close = terminal_close; + t->blocked = 0; terminal_getsize ((TTY *) t);