--- rxvt-unicode/src/main.C 2010/07/28 17:56:16 1.332 +++ rxvt-unicode/src/main.C 2011/02/11 01:24:46 1.352 @@ -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 @@ -98,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) { @@ -108,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) @@ -119,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; } @@ -191,7 +189,6 @@ flush_ev.set (this); destroy_ev.set (this); pty_ev.set (this); - incr_ev.set (this); termwin_ev.set (this); vt_ev.set (this); @@ -230,13 +227,7 @@ delete fontset[0]; #ifdef HAVE_BG_PIXMAP - bgPixmap.destroy (); -#endif -#ifdef HAVE_AFTERIMAGE - if (asv) - destroy_asvisual (asv, 0); - if (asimman) - destroy_image_manager (asimman, 0); + bg_destroy (); #endif if (display) @@ -283,7 +274,6 @@ free (env_term); free (locale); free (v_buffer); - free (incr_buf); delete envv; delete argv; @@ -329,7 +319,6 @@ #if ENABLE_TRANSPARENCY || ENABLE_PERL rootwin_ev.stop (display); #endif - incr_ev.stop (); termwin_ev.stop (display); vt_ev.stop (display); } @@ -363,6 +352,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 @@ -384,7 +385,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"); @@ -513,6 +514,9 @@ # ifdef VLNEXT tio->c_cc[VLNEXT] = CLNEXT; # endif +# ifdef VSTATUS + tio->c_cc[VSTATUS] = CSTATUS; +# endif # if VMIN != VEOF tio->c_cc[VMIN] = 1; @@ -556,9 +560,7 @@ 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; @@ -947,21 +949,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 @@ -1074,7 +1075,7 @@ width, height); #ifdef HAVE_BG_PIXMAP - if (bgPixmap.window_size_sensitive ()) + if (bg_window_size_sensitive ()) update_background (); #endif } @@ -1082,12 +1083,6 @@ if (fix_screen || old_height == 0) scr_reset (); -#ifdef HAVE_BG_PIXMAP -// TODO: this don't seem to have any effect - do we still need it ? If so - in which case exactly ? -// if (bgPixmap.pixmap) -// scr_touch (false); -#endif - #ifdef USE_XIM IMSetPosition (); #endif @@ -1179,10 +1174,10 @@ win = XGetSelectionOwner (dpy, atom); if (win != None) - return True; + return true; } - return False; + return false; } void @@ -1345,7 +1340,7 @@ if (!p) continue; - s = rxvt_splitcommastring (p); + s = rxvt_strsplit (',', p); for (i = found = 0; !found && s[i]; i++) { @@ -1367,7 +1362,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; @@ -1375,7 +1370,7 @@ } - rxvt_freecommastring (s); + rxvt_free_strsplit (s); } foundpet: @@ -1541,7 +1536,7 @@ { bool found = false; - s = rxvt_splitcommastring (p); + s = rxvt_strsplit (',', p); for (i = 0; s[i]; i++) { @@ -1557,7 +1552,7 @@ } } - rxvt_freecommastring (s); + rxvt_free_strsplit (s); if (found) goto done; @@ -1628,39 +1623,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 () @@ -1668,12 +1655,12 @@ if (update_background_ev.is_active ()) return; - bgPixmap.invalidate (); + bg_invalidate (); - ev_tstamp to_wait = 0.5 - (ev::now () - bgPixmap.valid_since); + ev_tstamp to_wait = 0.5 - (ev::now () - bg_valid_since); if (to_wait <= 0.) - bgPixmap.render (); + bg_render (); else update_background_ev.start (to_wait); } @@ -1684,7 +1671,7 @@ make_current (); update_background_ev.stop (); - bgPixmap.render (); + bg_render (); refresh_check (); }