--- rxvt-unicode/src/main.C 2010/07/26 22:07:38 1.331 +++ rxvt-unicode/src/main.C 2011/01/10 14:07:19 1.347 @@ -13,7 +13,7 @@ * Copyright (c) 1997,1998 Oezguer Kesim * Copyright (c) 1998-2001 Geoff Wing * - extensive modifications - * Copyright (c) 2003-2008 Marc Lehmann + * Copyright (c) 2003-2010 Marc Lehmann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -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" @@ -96,7 +98,7 @@ compose_char *cc; // break compose chains, as stupid readline really likes to duplicate - // composing characters for some reason near the end of a line. + // composing characters for some reason, near the end of a line. cc = (*this)[c1]; while (cc) { @@ -106,10 +108,8 @@ // check to see whether this combination already exists otherwise for (cc = v.end (); cc-- > v.begin (); ) - { - if (cc->c1 == c1 && cc->c2 == c2) - return COMPOSE_LO + (cc - v.begin ()); - } + if (cc->c1 == c1 && cc->c2 == c2) + return COMPOSE_LO + (cc - v.begin ()); // allocate a new combination if (v.size () == COMPOSE_HI - COMPOSE_LO + 1) @@ -117,7 +117,7 @@ static int seen; if (!seen++) - fprintf (stderr, "too many unrepresentable composite characters, try --enable-unicode3\n"); + rxvt_warn ("too many unrepresentable composite characters, try --enable-unicode3\n"); return REPLACEMENT_CHAR; } @@ -361,6 +361,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 @@ -382,7 +394,7 @@ char buffer[BUFSIZ]; char mesg[BUFSIZ]; char number[32]; - char *mtype = "XlibMessage"; + const char mtype[] = "XlibMessage"; XGetErrorText(dpy, event->error_code, buffer, BUFSIZ); XGetErrorDatabaseText(dpy, mtype, "XError", "X Error", mesg, BUFSIZ); rxvt_warn ("An X Error occurred, trying to continue after report.\n"); @@ -476,6 +488,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,13 +563,13 @@ assert (("fontMask must not overlap other RS masks", 0 == (RS_fontMask & (RS_Sel | RS_baseattrMask | RS_customMask | RS_bgMask | RS_fgMask)))); + 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); - ptytty::init (); - - if (!ev_default_loop (0)) + if (!ev_default_loop ()) rxvt_fatal ("cannot initialise libev (bad value for LIBEV_METHODS?)\n"); rxvt_environ = environ; @@ -879,21 +958,20 @@ { unsigned int i; const char *xpmb = ""; - char fstr[sizeof ("default") + 1], bstr[sizeof ("default") + 1]; + char fstr[] = "default"; + char bstr[] = "default"; - strcpy (fstr, "default"); - strcpy (bstr, "default"); for (i = Color_Black; i <= Color_White; i++) if (pix_colors[Color_fg] == pix_colors[i]) { - sprintf (fstr, "%d", (i - Color_Black)); + sprintf (fstr, "%d", i - Color_Black); break; } for (i = Color_Black; i <= Color_White; i++) if (pix_colors[Color_bg] == pix_colors[i]) { - sprintf (bstr, "%d", (i - Color_Black)); + sprintf (bstr, "%d", i - Color_Black); #ifdef BG_IMAGE_FROM_FILE xpmb = "default;"; #endif @@ -1277,7 +1355,7 @@ if (!p) continue; - s = rxvt_splitcommastring (p); + s = rxvt_strsplit (',', p); for (i = found = 0; !found && s[i]; i++) { @@ -1299,7 +1377,7 @@ for (j = 0; j < xim_styles->count_styles; j++) if (input_style == xim_styles->supported_styles[j]) { - rxvt_freecommastring (s); + rxvt_free_strsplit (s); found = 1; goto foundpet; @@ -1307,7 +1385,7 @@ } - rxvt_freecommastring (s); + rxvt_free_strsplit (s); } foundpet: @@ -1473,7 +1551,7 @@ { bool found = false; - s = rxvt_splitcommastring (p); + s = rxvt_strsplit (',', p); for (i = 0; s[i]; i++) { @@ -1489,7 +1567,7 @@ } } - rxvt_freecommastring (s); + rxvt_free_strsplit (s); if (found) goto done; @@ -1560,39 +1638,31 @@ { Window cr; XTranslateCoordinates (dpy, parent[0], display->root, 0, 0, &x, &y, &cr); -/* fprintf (stderr, "origin is %+d%+d\n", x, y);*/ } Pixmap -rxvt_term::get_pixmap_property (int prop_id) +rxvt_term::get_pixmap_property (Atom property) { - if (prop_id > 0 && prop_id < NUM_XA) - if (xa[prop_id]) - { - int aformat; - unsigned long nitems, bytes_after; - Atom atype; - unsigned char *prop = NULL; - int result = XGetWindowProperty (dpy, display->root, xa[prop_id], - 0L, 1L, False, XA_PIXMAP, &atype, &aformat, - &nitems, &bytes_after, &prop); - if (result == Success && prop && atype == XA_PIXMAP) - return *(Pixmap *)prop; - } + Pixmap pixmap = None; + + int aformat; + unsigned long nitems, bytes_after; + Atom atype; + unsigned char *prop; + int result = XGetWindowProperty (dpy, display->root, property, + 0L, 1L, False, XA_PIXMAP, &atype, &aformat, + &nitems, &bytes_after, &prop); + if (result == Success) + { + if (atype == XA_PIXMAP) + pixmap = *(Pixmap *)prop; + XFree (prop); + } - return None; + return pixmap; } #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 ()