--- rxvt-unicode/src/main.C 2010/07/26 09:57:53 1.330 +++ rxvt-unicode/src/main.C 2010/12/07 19:47:02 1.338 @@ -32,6 +32,7 @@ #include "../config.h" /* NECESSARY */ #include "rxvt.h" /* NECESSARY */ +#include "init.h" #include "keyboard.h" #include "rxvtperl.h" @@ -52,6 +53,7 @@ # endif #endif +struct termios rxvt_term::def_tio; vector rxvt_term::termlist; // used to tell global functions which terminal instance is "active" @@ -361,6 +363,18 @@ delete this; } +void +rxvt_term::set_option (uint8_t opt, bool set) +{ + if (!opt) + return; + + uint8_t mask = 1 << (opt & 7); + uint8_t &val = options [opt >> 3]; + + val = val & ~mask | (set ? mask : 0); +} + /*----------------------------------------------------------------------*/ /* * Exit gracefully, clearing the utmp entry and restoring tty attributes @@ -476,6 +490,73 @@ kill (getpid (), w.signum); } +static void +rxvt_get_ttymode (struct termios *tio) +{ + if (tcgetattr (STDIN_FILENO, tio) < 0) + memset (tio, 0, sizeof (struct termios)); + + for (int i = 0; i < NCCS; i++) + tio->c_cc[i] = VDISABLE; + + tio->c_cc[VINTR] = CINTR; + tio->c_cc[VQUIT] = CQUIT; + tio->c_cc[VERASE] = CERASE; +#ifdef VERASE2 + tio->c_cc[VERASE2] = CERASE2; +#endif + tio->c_cc[VKILL] = CKILL; + tio->c_cc[VEOF] = CEOF; + tio->c_cc[VSTART] = CSTART; + tio->c_cc[VSTOP] = CSTOP; + tio->c_cc[VSUSP] = CSUSP; +# ifdef VDSUSP + tio->c_cc[VDSUSP] = CDSUSP; +# endif +# ifdef VREPRINT + tio->c_cc[VREPRINT] = CRPRNT; +# endif +# ifdef VDISCRD + tio->c_cc[VDISCRD] = CFLUSH; +# endif +# ifdef VWERSE + tio->c_cc[VWERSE] = CWERASE; +# endif +# ifdef VLNEXT + tio->c_cc[VLNEXT] = CLNEXT; +# endif +# ifdef VSTATUS + tio->c_cc[VSTATUS] = CSTATUS; +# endif + +# if VMIN != VEOF + tio->c_cc[VMIN] = 1; +# endif +# if VTIME != VEOL + tio->c_cc[VTIME] = 0; +# endif + + /* input modes */ + tio->c_iflag = (BRKINT | IGNPAR | ICRNL +# ifdef IMAXBEL + | IMAXBEL +# endif + | IXON); + + /* output modes */ + tio->c_oflag = (OPOST | ONLCR); + + /* control modes */ + tio->c_cflag = (CS8 | CREAD); + + /* local modes */ + tio->c_lflag = (ISIG | ICANON | IEXTEN | ECHO +# if defined (ECHOCTL) && defined (ECHOKE) + | ECHOCTL | ECHOKE +# endif + | ECHOE | ECHOK); +} + char **rxvt_environ; // startup environment void @@ -484,9 +565,13 @@ assert (("fontMask must not overlap other RS masks", 0 == (RS_fontMask & (RS_Sel | RS_baseattrMask | RS_customMask | RS_bgMask | RS_fgMask)))); - ptytty::init (); + rxvt_get_ttymode (&rxvt_term::def_tio); + + // get rid of stdin/stdout as we don't need them, to free resources + dup2 (STDERR_FILENO, STDIN_FILENO); + dup2 (STDERR_FILENO, STDOUT_FILENO); - if (!ev_default_loop (0)) + if (!ev_default_loop ()) rxvt_fatal ("cannot initialise libev (bad value for LIBEV_METHODS?)\n"); rxvt_environ = environ; @@ -1556,7 +1641,6 @@ { Window cr; XTranslateCoordinates (dpy, parent[0], display->root, 0, 0, &x, &y, &cr); -/* fprintf (stderr, "origin is %+d%+d\n", x, y);*/ } Pixmap @@ -1580,15 +1664,6 @@ } #ifdef HAVE_BG_PIXMAP -# if TRACE_PIXMAPS -# undef update_background -void -rxvt_term::trace_update_background (const char *file, int line) -{ - fprintf (stderr, "%s:%d:update_background()\n", file, line); - update_background (); -} -# endif void rxvt_term::update_background ()