[Pkg-urxvt-maintainers] [SCM] Git repository for pkg-urxvt branch, upstream, updated. upstream/9.15-2-g6993468

Ryan Kavanagh rak at alioth.debian.org
Mon Mar 25 14:31:30 UTC 2013


Gitweb-URL: http://git.debian.org/?p=pkg-kde//srv/git.debian.org/git/pkg-urxvt/pkg-urxvt.git;a=commitdiff;h=6993468

The following commit has been merged in the upstream branch:
commit 6993468a8eb1fba54aee3a79631ec4448ffe7404
Author: Ryan Kavanagh <rak at debian.org>
Date:   Wed Mar 20 14:23:59 2013 -0400

    Imported Upstream version 9.17
---
 Changes             |   13 +++++-
 config.h.in         |    3 -
 configure           |    6 --
 configure.ac        |    4 --
 doc/rxvt.1.man.in   |    2 +-
 doc/rxvt.7.man.in   |    2 +-
 doc/rxvtc.1.man.in  |    4 +-
 doc/rxvtd.1.man.in  |    4 +-
 libev/Changes       |   18 +++++--
 libev/ev.c          |   49 +++++++++++++++----
 libev/ev.h          |   44 ++++++++--------
 src/background.C    |  136 +++++++++++++++------------------------------------
 src/command.C       |   41 +++++++--------
 src/init.C          |    2 +-
 src/keyboard.C      |   14 ++----
 src/keyboard.h      |    4 +-
 src/main.C          |   20 ++++---
 src/perl/background |   10 ++++
 src/rsinc.h         |    2 +-
 src/rxvt.h          |   61 ++++++++++++-----------
 src/rxvtimg.C       |   37 +++++++++++++-
 src/rxvtimg.h       |    1 +
 src/rxvtperl.xs     |   22 ++++----
 src/rxvttoolkit.C   |    2 +-
 src/rxvttoolkit.h   |    2 +-
 src/screen.C        |   96 +++++++++++++++++++++---------------
 src/version.h       |    4 +-
 src/xdefaults.C     |    6 +-
 28 files changed, 321 insertions(+), 288 deletions(-)

diff --git a/Changes b/Changes
index 9dbd9b2..b7b07f5 100644
--- a/Changes
+++ b/Changes
@@ -28,9 +28,20 @@ TODO: pack rxvt_fatal messages into the exception object
 TODO: load must not cache, but global image cache must be cleaned
 TODO: provide something like % for easy access for parse_keysym
 TODO: description into --help output?
-TODO: shade
 TODO: rxvt -help => (see rxvt-XXX(1))?
 
+9.17 Fri Mar  1 13:46:08 CET 2013
+	- add shade operator in background perl extension.
+        - avoid starting or ending the selection in the middle of wide
+          characters to avoid artifacts (reproted by Tiago Resende).
+	- fix artifacts that may occur if the character in the cursor
+	  cell has width > 1 (reported by Tiago Resende).
+	- fix regression that causes artifacts on scrolling if
+	  saveLines is 0 and the window is resized (reported by Bert
+	  Münnich).
+	- fix build when perl is enabled and pixbuf and transparency
+	  are disabled.
+
 9.16 Thu Dec 27 11:56:43 CET 2012
 	- the "so much new stuff your eyes will pop out" release.
         - INCOMPATIBLE CHANGE: renamed urlLauncher resource to url-launcher.
diff --git a/config.h.in b/config.h.in
index eef30e0..8ade9f5 100644
--- a/config.h.in
+++ b/config.h.in
@@ -1,8 +1,5 @@
 /* config.h.in.  Generated from configure.ac by autoheader.  */
 
-/* Define if you want to have sexy-looking background pixmaps. */
-#undef BG_IMAGE_FROM_FILE
-
 /* Define if you want 8 bit control sequences */
 #undef EIGHT_BIT_CONTROLS
 
diff --git a/configure b/configure
index 1b79b7c..232eb73 100755
--- a/configure
+++ b/configure
@@ -7760,12 +7760,6 @@ $as_echo "#define XRENDER 1" >>confdefs.h
 $as_echo "#define ENABLE_TRANSPARENCY 1" >>confdefs.h
 
   fi
-
-  if test x$support_pixbuf = xyes; then
-
-$as_echo "#define BG_IMAGE_FROM_FILE 1" >>confdefs.h
-
-  fi
 fi
 
 if test x$support_styles = xyes; then
diff --git a/configure.ac b/configure.ac
index d858d00..e88b37e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -645,10 +645,6 @@ if test x$support_image = xyes && test x$rxvt_have_xrender = xyes; then
   if test x$support_inheritpixmap = xyes; then
     AC_DEFINE(ENABLE_TRANSPARENCY, 1, Define if you want your background to use the parent window background)
   fi
-
-  if test x$support_pixbuf = xyes; then
-    AC_DEFINE(BG_IMAGE_FROM_FILE, 1, Define if you want to have sexy-looking background pixmaps.)
-  fi
 fi
 
 if test x$support_styles = xyes; then
diff --git a/doc/rxvt.1.man.in b/doc/rxvt.1.man.in
index c5e2dcb..56b6112 100644
--- a/doc/rxvt.1.man.in
+++ b/doc/rxvt.1.man.in
@@ -124,7 +124,7 @@
 .\" ========================================================================
 .\"
 .IX Title "@@RXVT_NAME@@ 1"
-.TH @@RXVT_NAME@@ 1 "2012-11-06" "@@RXVT_VERSION@@" "RXVT-UNICODE"
+.TH @@RXVT_NAME@@ 1 "2013-03-01" "@@RXVT_VERSION@@" "RXVT-UNICODE"
 .\" For nroff, turn off justification.  Always turn off hyphenation; it makes
 .\" way too many mistakes in technical documents.
 .if n .ad l
diff --git a/doc/rxvt.7.man.in b/doc/rxvt.7.man.in
index 7cd63d7..e5d5bc1 100644
--- a/doc/rxvt.7.man.in
+++ b/doc/rxvt.7.man.in
@@ -124,7 +124,7 @@
 .\" ========================================================================
 .\"
 .IX Title "@@RXVT_NAME@@ 7"
-.TH @@RXVT_NAME@@ 7 "2012-11-06" "@@RXVT_VERSION@@" "RXVT-UNICODE"
+.TH @@RXVT_NAME@@ 7 "2013-03-01" "@@RXVT_VERSION@@" "RXVT-UNICODE"
 .\" For nroff, turn off justification.  Always turn off hyphenation; it makes
 .\" way too many mistakes in technical documents.
 .if n .ad l
diff --git a/doc/rxvtc.1.man.in b/doc/rxvtc.1.man.in
index 22463b2..18666b2 100644
--- a/doc/rxvtc.1.man.in
+++ b/doc/rxvtc.1.man.in
@@ -1,4 +1,4 @@
-.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14)
+.\" Automatically generated by Pod::Man 2.25 (Pod::Simple 3.16)
 .\"
 .\" Standard preamble:
 .\" ========================================================================
@@ -124,7 +124,7 @@
 .\" ========================================================================
 .\"
 .IX Title "@@RXVT_NAME@@ 1"
-.TH @@RXVT_NAME@@ 1 "2012-01-21" "@@RXVT_VERSION@@" "RXVT-UNICODE"
+.TH @@RXVT_NAME@@ 1 "2013-03-01" "@@RXVT_VERSION@@" "RXVT-UNICODE"
 .\" For nroff, turn off justification.  Always turn off hyphenation; it makes
 .\" way too many mistakes in technical documents.
 .if n .ad l
diff --git a/doc/rxvtd.1.man.in b/doc/rxvtd.1.man.in
index d699175..291d787 100644
--- a/doc/rxvtd.1.man.in
+++ b/doc/rxvtd.1.man.in
@@ -1,4 +1,4 @@
-.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14)
+.\" Automatically generated by Pod::Man 2.25 (Pod::Simple 3.16)
 .\"
 .\" Standard preamble:
 .\" ========================================================================
@@ -124,7 +124,7 @@
 .\" ========================================================================
 .\"
 .IX Title "@@RXVT_NAME@@ 1"
-.TH @@RXVT_NAME@@ 1 "2012-01-21" "@@RXVT_VERSION@@" "RXVT-UNICODE"
+.TH @@RXVT_NAME@@ 1 "2013-03-01" "@@RXVT_VERSION@@" "RXVT-UNICODE"
 .\" For nroff, turn off justification.  Always turn off hyphenation; it makes
 .\" way too many mistakes in technical documents.
 .if n .ad l
diff --git a/libev/Changes b/libev/Changes
index 31fd9ea..00a03f1 100644
--- a/libev/Changes
+++ b/libev/Changes
@@ -6,13 +6,14 @@ TODO: faq, process a thing in each iteration
 TODO: dbeugging tips, ev_verify, ev_init twice
 TODO: ev_break for immediate exit (EVBREAK_NOW?)
 TODO: ev_feed_child_event
-
 TODO: document the special problem of signals around fork.
 TODO: store pid for each signal
 TODO: document file descriptor usage per loop
 TODO: store loop pid_t and compare isndie signal handler,store 1 for same, 2 for differign pid, clean up in loop_fork
 TODO: embed watchers need updating when fd changes
 TODO: document portbaility requirements for atomic pointer access
+
+4.15 Fri Mar  1 12:04:50 CET 2013
         - destroying a non-default loop would stop the global waitpid
           watcher (Denis Bilenko).
 	- queueing pending watchers of higher priority from a watcher now invokes
@@ -35,10 +36,12 @@ TODO: document portbaility requirements for atomic pointer access
 	- (ecb) add memory fence support for gcc-alpha (Christian Weisgerber).
         - work around some kernels losing file descriptors by leaking
           the kqueue descriptor in the child.
+        - work around linux inotify not reporting IN_ATTRIB changes for directories
+          in many cases.
         - include sys/syscall.h instead of plain syscall.h.
         - check for io watcher loops in ev_verify, check for the most
           common reported usage bug in ev_io_start.
-        - chose socket vs. WSASocket at compiletime using EV_USE_WSASOCKET.
+        - choose socket vs. WSASocket at compiletime using EV_USE_WSASOCKET.
         - always use WSASend/WSARecv directly on windows, hoping that this
           works in all cases (unlike read/write/send/recv...).
         - try to detect signals around a fork faster (test program by
@@ -47,8 +50,15 @@ TODO: document portbaility requirements for atomic pointer access
         - rename ev::embed::set to ev::embed::set_embed to avoid clashing
           the watcher base set (loop) method.
         - rewrite the async/signal pipe logic to always keep a valid fd, which
-          simplifies (and hopefuly correctifies :) the race checking
+          simplifies (and hopefully correctifies :) the race checking
           on fork, at the cost of one extra fd.
+        - add fat, msdos, jffs2, ramfs, ntfs and btrfs to the list of
+          inotify-supporting filesystems.
+        - move orig_CFLAGS assignment to after AC_INIT, as newer autoconf
+          versions ignore it before
+          (https://bugzilla.redhat.com/show_bug.cgi?id=908096).
+        - add some untested android support.
+        - enum expressions must be of type int (reported by Juan Pablo L).
 
 4.11 Sat Feb  4 19:52:39 CET 2012
 	- INCOMPATIBLE CHANGE: ev_timer_again now clears the pending status, as
@@ -242,7 +252,7 @@ TODO: document portbaility requirements for atomic pointer access
         - implement ev_suspend and ev_resume.
         - new EV_CUSTOM revents flag for use by applications.
         - add documentation section about priorities.
-        - add a glossary to the dcoumentation.
+        - add a glossary to the documentation.
         - extend the ev_fork description slightly.
         - optimize a jump out of call_pending.
 
diff --git a/libev/ev.c b/libev/ev.c
index ff8f090..e5bd5ab 100644
--- a/libev/ev.c
+++ b/libev/ev.c
@@ -359,6 +359,22 @@
 # define EV_HEAP_CACHE_AT EV_FEATURE_DATA
 #endif
 
+#ifdef ANDROID
+/* supposedly, android doesn't typedef fd_mask */
+# undef EV_USE_SELECT
+# define EV_USE_SELECT 0
+/* supposedly, we need to include syscall.h, not sys/syscall.h, so just disable */
+# undef EV_USE_CLOCK_SYSCALL
+# define EV_USE_CLOCK_SYSCALL 0
+#endif
+
+/* aix's poll.h seems to cause lots of trouble */
+#ifdef _AIX
+/* AIX has a completely broken poll.h header */
+# undef EV_USE_POLL
+# define EV_USE_POLL 0
+#endif
+
 /* on linux, we can use a (slow) syscall to avoid a dependency on pthread, */
 /* which makes programs even slower. might work on other unices, too. */
 #if EV_USE_CLOCK_SYSCALL
@@ -375,12 +391,6 @@
 
 /* this block fixes any misconfiguration where we know we run into trouble otherwise */
 
-#ifdef _AIX
-/* AIX has a completely broken poll.h header */
-# undef EV_USE_POLL
-# define EV_USE_POLL 0
-#endif
-
 #ifndef CLOCK_MONOTONIC
 # undef EV_USE_MONOTONIC
 # define EV_USE_MONOTONIC 0
@@ -507,7 +517,7 @@ struct signalfd_siginfo
 #define ECB_H
 
 /* 16 bits major, 16 bits minor */
-#define ECB_VERSION 0x00010002
+#define ECB_VERSION 0x00010003
 
 #ifdef _WIN32
   typedef   signed char   int8_t;
@@ -541,6 +551,15 @@ struct signalfd_siginfo
   #endif
 #endif
 
+/* work around x32 idiocy by defining proper macros */
+#if __x86_64 || _M_AMD64
+  #if __ILP32
+    #define ECB_AMD64_X32 1
+  #else
+    #define ECB_AMD64 1
+  #endif
+#endif
+
 /* many compilers define _GNUC_ to some versions but then only implement
  * what their idiot authors think are the "more important" extensions,
  * causing enormous grief in return for some better fake benchmark numbers.
@@ -2231,8 +2250,9 @@ void
 ev_feed_signal (int signum) EV_THROW
 {
 #if EV_MULTIPLICITY
+  EV_P;
   ECB_MEMORY_FENCE_ACQUIRE;
-  EV_P = signals [signum - 1].loop;
+  EV_A = signals [signum - 1].loop;
 
   if (!EV_A)
     return;
@@ -3895,7 +3915,10 @@ static void noinline stat_timer_cb (EV_P_ ev_timer *w_, int revents);
 static void noinline
 infy_add (EV_P_ ev_stat *w)
 {
-  w->wd = inotify_add_watch (fs_fd, w->path, IN_ATTRIB | IN_DELETE_SELF | IN_MOVE_SELF | IN_MODIFY | IN_DONT_FOLLOW | IN_MASK_ADD);
+  w->wd = inotify_add_watch (fs_fd, w->path,
+                             IN_ATTRIB | IN_DELETE_SELF | IN_MOVE_SELF | IN_MODIFY
+                             | IN_CREATE | IN_DELETE | IN_MOVED_FROM | IN_MOVED_TO
+                             | IN_DONT_FOLLOW | IN_MASK_ADD);
 
   if (w->wd >= 0)
     {
@@ -3909,10 +3932,16 @@ infy_add (EV_P_ ev_stat *w)
         w->timer.repeat = w->interval ? w->interval : DEF_STAT_INTERVAL;
       else if (!statfs (w->path, &sfs)
                && (sfs.f_type == 0x1373 /* devfs */
+                   || sfs.f_type == 0x4006 /* fat */
+                   || sfs.f_type == 0x4d44 /* msdos */
                    || sfs.f_type == 0xEF53 /* ext2/3 */
+                   || sfs.f_type == 0x72b6 /* jffs2 */
+                   || sfs.f_type == 0x858458f6 /* ramfs */
+                   || sfs.f_type == 0x5346544e /* ntfs */
                    || sfs.f_type == 0x3153464a /* jfs */
+                   || sfs.f_type == 0x9123683e /* btrfs */
                    || sfs.f_type == 0x52654973 /* reiser3 */
-                   || sfs.f_type == 0x01021994 /* tempfs */
+                   || sfs.f_type == 0x01021994 /* tmpfs */
                    || sfs.f_type == 0x58465342 /* xfs */))
         w->timer.repeat = 0.; /* filesystem is local, kernel new enough */
       else
diff --git a/libev/ev.h b/libev/ev.h
index a8973ab..c5d582e 100644
--- a/libev/ev.h
+++ b/libev/ev.h
@@ -205,33 +205,33 @@ struct ev_loop;
 /*****************************************************************************/
 
 #define EV_VERSION_MAJOR 4
-#define EV_VERSION_MINOR 11
+#define EV_VERSION_MINOR 15
 
 /* eventmask, revents, events... */
 enum {
-  EV_UNDEF    = 0xFFFFFFFF, /* guaranteed to be invalid */
-  EV_NONE     =       0x00, /* no events */
-  EV_READ     =       0x01, /* ev_io detected read will not block */
-  EV_WRITE    =       0x02, /* ev_io detected write will not block */
-  EV__IOFDSET =       0x80, /* internal use only */
-  EV_IO       =    EV_READ, /* alias for type-detection */
-  EV_TIMER    = 0x00000100, /* timer timed out */
+  EV_UNDEF    = (int)0xFFFFFFFF, /* guaranteed to be invalid */
+  EV_NONE     =            0x00, /* no events */
+  EV_READ     =            0x01, /* ev_io detected read will not block */
+  EV_WRITE    =            0x02, /* ev_io detected write will not block */
+  EV__IOFDSET =            0x80, /* internal use only */
+  EV_IO       =         EV_READ, /* alias for type-detection */
+  EV_TIMER    =      0x00000100, /* timer timed out */
 #if EV_COMPAT3
-  EV_TIMEOUT  =   EV_TIMER, /* pre 4.0 API compatibility */
-#endif
-  EV_PERIODIC = 0x00000200, /* periodic timer timed out */
-  EV_SIGNAL   = 0x00000400, /* signal was received */
-  EV_CHILD    = 0x00000800, /* child/pid had status change */
-  EV_STAT     = 0x00001000, /* stat data changed */
-  EV_IDLE     = 0x00002000, /* event loop is idling */
-  EV_PREPARE  = 0x00004000, /* event loop about to poll */
-  EV_CHECK    = 0x00008000, /* event loop finished poll */
-  EV_EMBED    = 0x00010000, /* embedded event loop needs sweep */
-  EV_FORK     = 0x00020000, /* event loop resumed in child */
-  EV_CLEANUP  = 0x00040000, /* event loop resumed in child */
-  EV_ASYNC    = 0x00080000, /* async intra-loop signal */
-  EV_CUSTOM   = 0x01000000, /* for use by user code */
-  EV_ERROR    = 0x80000000  /* sent when an error occurs */
+  EV_TIMEOUT  =        EV_TIMER, /* pre 4.0 API compatibility */
+#endif
+  EV_PERIODIC =      0x00000200, /* periodic timer timed out */
+  EV_SIGNAL   =      0x00000400, /* signal was received */
+  EV_CHILD    =      0x00000800, /* child/pid had status change */
+  EV_STAT     =      0x00001000, /* stat data changed */
+  EV_IDLE     =      0x00002000, /* event loop is idling */
+  EV_PREPARE  =      0x00004000, /* event loop about to poll */
+  EV_CHECK    =      0x00008000, /* event loop finished poll */
+  EV_EMBED    =      0x00010000, /* embedded event loop needs sweep */
+  EV_FORK     =      0x00020000, /* event loop resumed in child */
+  EV_CLEANUP  =      0x00040000, /* event loop resumed in child */
+  EV_ASYNC    =      0x00080000, /* async intra-loop signal */
+  EV_CUSTOM   =      0x01000000, /* for use by user code */
+  EV_ERROR    = (int)0x80000000  /* sent when an error occurs */
 };
 
 /* can be used to add custom fields to all watchers, while losing binary compatibility */
diff --git a/src/background.C b/src/background.C
index 2552596..b3886e8 100644
--- a/src/background.C
+++ b/src/background.C
@@ -30,7 +30,7 @@
 void
 rxvt_term::bg_destroy ()
 {
-# if ENABLE_TRANSPARENCY
+# if BG_IMAGE_FROM_ROOT
   delete root_img;
   root_img = 0;
 # endif
@@ -38,16 +38,13 @@ rxvt_term::bg_destroy ()
 # if BG_IMAGE_FROM_FILE
   fimage.destroy ();
 # endif
-
-  delete bg_img;
-  bg_img = 0;
 }
 
 bool
 rxvt_term::bg_window_size_sensitive ()
 {
-# if ENABLE_TRANSPARENCY
-  if (bg_flags & BG_IS_TRANSPARENT)
+# if BG_IMAGE_FROM_ROOT
+  if (root_img)
     return true;
 # endif
 
@@ -67,8 +64,8 @@ rxvt_term::bg_window_size_sensitive ()
 bool
 rxvt_term::bg_window_position_sensitive ()
 {
-# if ENABLE_TRANSPARENCY
-  if (bg_flags & BG_IS_TRANSPARENT)
+# if BG_IMAGE_FROM_ROOT
+  if (root_img)
     return true;
 # endif
 
@@ -257,7 +254,7 @@ rxvt_image::set_geometry (const char *geom, bool update)
 }
 
 void
-rxvt_term::get_image_geometry (rxvt_image &image, int &w, int &h, int &x, int &y)
+rxvt_term::render_image (rxvt_image &image)
 {
   int image_width = image.img->w;
   int image_height = image.img->h;
@@ -266,6 +263,11 @@ rxvt_term::get_image_geometry (rxvt_image &image, int &w, int &h, int &x, int &y
   int h_scale = min (image.h_scale, 32767 * 100 / parent_width);
   int v_scale = min (image.v_scale, 32767 * 100 / parent_height);
 
+  int w;
+  int h;
+  int x;
+  int y;
+
   w = h_scale * parent_width / 100;
   h = v_scale * parent_height / 100;
 
@@ -290,27 +292,13 @@ rxvt_term::get_image_geometry (rxvt_image &image, int &w, int &h, int &x, int &y
       x = make_align_position (image.h_align, parent_width, w);
       y = make_align_position (image.v_align, parent_height, h);
     }
-}
-
-bool
-rxvt_term::render_image (rxvt_image &image)
-{
-  int parent_width = szHint.width;
-  int parent_height = szHint.height;
-
-  int x = 0;
-  int y = 0;
-  int w = 0;
-  int h = 0;
-
-  get_image_geometry (image, w, h, x, y);
 
   if (!(image.flags & IM_ROOT_ALIGN)
       && (x >= parent_width
           || y >= parent_height
           || x + w <= 0
           || y + h <= 0))
-    return false;
+    return;
 
   rxvt_img *img = image.img->scale (w, h);
 
@@ -320,7 +308,7 @@ rxvt_term::render_image (rxvt_image &image)
     img->repeat_mode (RepeatNone);
   img->sub_rect (-x, -y, parent_width, parent_height)->replace (img);
 
-  if (bg_flags & BG_IS_VALID)
+  if (bg_img)
     img->draw (bg_img, PictOpOver, image.alpha * 1. / 0xffff);
 
   XRenderPictFormat *format = XRenderFindVisualFormat (dpy, visual);
@@ -328,8 +316,6 @@ rxvt_term::render_image (rxvt_image &image)
 
   delete bg_img;
   bg_img = img;
-
-  return true;
 }
 
 rxvt_image::rxvt_image ()
@@ -439,13 +425,13 @@ image_effects::set_shade (const char *shade_str)
   return false;
 }
 
-# if ENABLE_TRANSPARENCY
+# if BG_IMAGE_FROM_ROOT
 /*
  * Builds a pixmap of the same size as the terminal window that contains
  * the tiled portion of the root pixmap that is supposed to be covered by
  * our window.
  */
-bool
+void
 rxvt_term::render_root_image ()
 {
   /* root dimensions may change from call to call - but Display structure should
@@ -461,13 +447,10 @@ rxvt_term::render_root_image ()
   sx = parent_x;
   sy = parent_y;
 
-  if (!root_img)
-    return false;
-
   /* check if we are outside of the visible part of the virtual screen : */
   if (sx + parent_width <= 0 || sy + parent_height <= 0
       || sx >= root_width || sy >= root_height)
-    return 0;
+    return;
 
   while (sx < 0) sx += root_img->w;
   while (sy < 0) sy += root_img->h;
@@ -478,24 +461,22 @@ rxvt_term::render_root_image ()
     img->blur (root_effects.h_blurRadius, root_effects.v_blurRadius)->replace (img);
 
   if (root_effects.need_tint ())
-    tint_image (img, root_effects.tint, root_effects.tint_set, root_effects.shade);
+    {
+      rgba c (rgba::MAX_CC, rgba::MAX_CC, rgba::MAX_CC);
+
+      if (root_effects.tint_set)
+        root_effects.tint.get (c);
+      rxvt_img::nv factor = root_effects.shade / 100. - 1.;
+      img->shade (factor, c)->replace (img);
+    }
 
   XRenderPictFormat *format = XRenderFindVisualFormat (dpy, visual);
   img->convert_format (format, pix_colors [Color_bg])->replace (img);
 
   delete bg_img;
   bg_img = img;
-
-  return true;
 }
-
-void
-rxvt_term::bg_set_root_pixmap ()
-{
-  delete root_img;
-  root_img = rxvt_img::new_from_root (this);
-}
-# endif /* ENABLE_TRANSPARENCY */
+# endif /* BG_IMAGE_FROM_ROOT */
 
 void
 rxvt_term::bg_render ()
@@ -503,30 +484,26 @@ rxvt_term::bg_render ()
   if (bg_flags & BG_INHIBIT_RENDER)
     return;
 
-  bg_invalidate ();
-# if ENABLE_TRANSPARENCY
-  if (bg_flags & BG_IS_TRANSPARENT)
+  delete bg_img;
+  bg_img = 0;
+  bg_flags = 0;
+
+  if (!mapped)
+    return;
+
+# if BG_IMAGE_FROM_ROOT
+  if (root_img)
     {
-      /*  we need to re-generate transparency pixmap in that case ! */
-      if (render_root_image ())
-        bg_flags |= BG_IS_VALID;
+      render_root_image ();
+      bg_flags |= BG_IS_TRANSPARENT;
     }
 # endif
 
 # if BG_IMAGE_FROM_FILE
   if (fimage.img)
-    {
-      if (render_image (fimage))
-        bg_flags |= BG_IS_VALID;
-    }
+    render_image (fimage);
 # endif
 
-  if (!(bg_flags & BG_IS_VALID))
-    {
-      delete bg_img;
-      bg_img = 0;
-    }
-
   scr_recolour (false);
   bg_flags |= BG_NEEDS_REFRESH;
 
@@ -536,11 +513,9 @@ rxvt_term::bg_render ()
 void
 rxvt_term::bg_init ()
 {
-#if ENABLE_TRANSPARENCY
+#if BG_IMAGE_FROM_ROOT
   if (option (Opt_transparent))
     {
-      bg_set_transparent ();
-
       if (rs [Rs_blurradius])
         root_effects.set_blur (rs [Rs_blurradius]);
 
@@ -550,7 +525,7 @@ rxvt_term::bg_init ()
       if (rs [Rs_shade])
         root_effects.set_shade (rs [Rs_shade]);
 
-      bg_set_root_pixmap ();
+      rxvt_img::new_from_root (this)->replace (root_img);
       XSelectInput (dpy, display->root, PropertyChangeMask);
       rootwin_ev.start (display, display->root);
     }
@@ -566,37 +541,4 @@ rxvt_term::bg_init ()
 #endif
 }
 
-void
-rxvt_term::tint_image (rxvt_img *img, rxvt_color &tint, bool tint_set, int shade)
-{
-  rgba c (rgba::MAX_CC, rgba::MAX_CC, rgba::MAX_CC);
-
-  if (tint_set)
-    tint.get (c);
-
-  if (shade > 100)
-    {
-      c.r = c.r * (200 - shade) / 100;
-      c.g = c.g * (200 - shade) / 100;
-      c.b = c.b * (200 - shade) / 100;
-    }
-  else
-    {
-      c.r = c.r * shade / 100;
-      c.g = c.g * shade / 100;
-      c.b = c.b * shade / 100;
-    }
-
-  img->contrast (c.r, c.g, c.b, c.a);
-
-  if (shade > 100)
-    {
-      c.a = 0xffff;
-      c.r =
-      c.g =
-      c.b = 0xffff * (shade - 100) / 100;
-      img->brightness (c.r, c.g, c.b, c.a);
-    }
-}
-
 #endif /* HAVE_BG_PIXMAP */
diff --git a/src/command.C b/src/command.C
index ab1a4cd..82ad10a 100644
--- a/src/command.C
+++ b/src/command.C
@@ -943,7 +943,7 @@ rxvt_term::flush ()
 {
   flush_ev.stop ();
 
-#ifdef HAVE_BG_PIXMAP
+#ifdef HAVE_IMG
   if (bg_flags & BG_NEEDS_REFRESH)
     {
       bg_flags &= ~BG_NEEDS_REFRESH;
@@ -1474,7 +1474,7 @@ rxvt_term::x_cb (XEvent &ev)
             if (bg_window_position_sensitive ())
               {
                 want_position_change = true;
-                if (!(bg_flags & BG_IS_VALID))
+                if (bg_img == 0)
                   moved = true;
               }
 #endif
@@ -1531,19 +1531,14 @@ rxvt_term::x_cb (XEvent &ev)
 
       case MapNotify:
 #ifdef HAVE_BG_PIXMAP
-        /* This is needed specifically to fix the case of no window manager or a
-         * non-reparenting window manager. In those cases we never get first
-         * ConfigureNotify. Also that speeds startup under normal WM, by taking
-         * care of multiplicity of ConfigureNotify events arriving while WM does
-         * reparenting.
-         * We should not render background immediately, as there could be several
-         * ConfigureNotify's to follow. Lets take care of all of them in one scoop
-         * by scheduling background redraw as soon as we can, but giving a short
-         * bit of time for ConfigureNotifies to arrive.
-         * We should render background PRIOR to drawing any text, but AFTER all
-         * of ConfigureNotifys for the best results.
-         */
-        if (!(bg_flags & BG_IS_VALID))
+        // This is needed at startup for the case of no window manager
+        // or a non-reparenting window manager and also because we
+        // defer bg image updates if the window is not mapped. The
+        // short delay is to optimize for multiple ConfigureNotify
+        // events at startup when the window manager reparents the
+        // window, so as to perform the computation after we have
+        // received all of them.
+        if (bg_img == 0)
           update_background_ev.start (0.025);
 #endif
         mapped = 1;
@@ -1840,7 +1835,7 @@ rxvt_term::update_fade_color (unsigned int idx)
 #endif
 }
 
-#if ENABLE_TRANSPARENCY || ENABLE_PERL
+#if BG_IMAGE_FROM_ROOT || ENABLE_PERL
 void ecb_hot
 rxvt_term::rootwin_cb (XEvent &ev)
 {
@@ -1860,13 +1855,14 @@ rxvt_term::rootwin_cb (XEvent &ev)
         if (ev.xproperty.atom == xa[XA_XROOTPMAP_ID]
             || ev.xproperty.atom == xa[XA_ESETROOT_PMAP_ID])
           {
-# if ENABLE_TRANSPARENCY
-            bg_set_root_pixmap ();
-            update_background ();
+#if BG_IMAGE_FROM_ROOT
+            if (option (Opt_transparent))
+              {
+                rxvt_img::new_from_root (this)->replace (root_img);
+                update_background ();
+              }
 #endif
-#if ENABLE_PERL
             HOOK_INVOKE ((this, HOOK_ROOTPMAP_CHANGE, DT_END));
-#endif
           }
 
         break;
@@ -3455,7 +3451,8 @@ rxvt_term::process_xterm_seq (int op, char *str, char resp)
       case URxvt_Color_border:
         process_color_seq (op, Color_border, str, resp);
         break;
-#if ENABLE_TRANSPARENCY
+
+#if BG_IMAGE_FROM_ROOT
       case URxvt_Color_tint:
         process_color_seq (op, Color_tint, str, resp);
         {
diff --git a/src/init.C b/src/init.C
index b503966..95cc777 100644
--- a/src/init.C
+++ b/src/init.C
@@ -521,7 +521,7 @@ static const char *const def_colorName[] =
 #ifdef RXVT_SCROLLBAR
     COLOR_SCROLLTROUGH,
 #endif
-#if ENABLE_TRANSPARENCY
+#if BG_IMAGE_FROM_ROOT
     NULL,
 #endif
 #if OFF_FOCUS_FADING
diff --git a/src/keyboard.C b/src/keyboard.C
index bbc203b..8d81712 100644
--- a/src/keyboard.C
+++ b/src/keyboard.C
@@ -82,12 +82,7 @@ compare_priority (keysym_t *a, keysym_t *b)
   int ca = ecb_popcount32 (a->state /* & OtherModMask */);
   int cb = ecb_popcount32 (b->state /* & OtherModMask */);
 
-  if (ca != cb)
-    return ca - cb;
-//else if (a->state != b->state) // this behavior is to be discussed
-//  return b->state - a->state;
-  else
-    return 0;
+  return ca - cb;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -183,15 +178,14 @@ keyboard_manager::register_done ()
 
   // now we know the size of each bucket
   // compute the index of each bucket
-  hash [0] = 0;
-  for (index = 0, i = 1; i < KEYSYM_HASH_BUCKETS; ++i)
+  for (index = 0, i = 0; i < KEYSYM_HASH_BUCKETS; ++i)
     {
-      index += hash_bucket_size [i - 1];
       hash [i] = index;
+      index += hash_bucket_size [i];
     }
 
   // and allocate just enough space
-  simplevec <keysym_t *> sorted_keymap (index + hash_bucket_size [i - 1], 0);
+  simplevec <keysym_t *> sorted_keymap (index, 0);
 
   memset (hash_bucket_size, 0, sizeof (hash_bucket_size));
 
diff --git a/src/keyboard.h b/src/keyboard.h
index f7c58ba..af18797 100644
--- a/src/keyboard.h
+++ b/src/keyboard.h
@@ -31,8 +31,8 @@
 #include "rxvtutil.h"
 
 #define KEYSYM_HASH_BITS        4       /* lowest #bits of keysym is used as hash key */
-#define KEYSYM_HASH_BUCKETS     (1<<KEYSYM_HASH_BITS)
-#define KEYSYM_HASH_MASK        (KEYSYM_HASH_BUCKETS-1)
+#define KEYSYM_HASH_BUCKETS     (1 << KEYSYM_HASH_BITS)
+#define KEYSYM_HASH_MASK        (KEYSYM_HASH_BUCKETS - 1)
 
 #define MetaMask                0x0100
 #define NumLockMask             0x0200
diff --git a/src/main.C b/src/main.C
index f16de2e..f03b563 100644
--- a/src/main.C
+++ b/src/main.C
@@ -170,7 +170,7 @@ rxvt_term::rxvt_term ()
 #if defined(MOUSE_WHEEL) && defined(MOUSE_SLIP_WHEELING)
   slip_wheel_ev.set       <rxvt_term, &rxvt_term::slip_wheel_cb>   (this);
 #endif
-#if ENABLE_TRANSPARENCY || ENABLE_PERL
+#if BG_IMAGE_FROM_ROOT || ENABLE_PERL
   rootwin_ev.set          <rxvt_term, &rxvt_term::rootwin_cb> (this),
 #endif
   scrollbar_ev.set        <rxvt_term, &rxvt_term::x_cb>       (this),
@@ -228,6 +228,10 @@ rxvt_term::~rxvt_term ()
   bg_destroy ();
 #endif
 
+#if HAVE_IMG
+  delete bg_img;
+#endif
+
   if (display)
     {
       selection_clear ();
@@ -237,9 +241,12 @@ rxvt_term::~rxvt_term ()
       im_destroy ();
 #endif
       scrollBar.destroy ();
-      if (gc)   XFreeGC (dpy, gc);
+
+      if (gc)
+        XFreeGC (dpy, gc);
 
       delete drawable;
+
       // destroy all windows
       if (parent)
         XDestroyWindow (dpy, parent);
@@ -313,7 +320,7 @@ rxvt_term::destroy ()
       im_ev.stop (display);
 #endif
       scrollbar_ev.stop (display);
-#if ENABLE_TRANSPARENCY || ENABLE_PERL
+#if BG_IMAGE_FROM_ROOT || ENABLE_PERL
       rootwin_ev.stop (display);
 #endif
       termwin_ev.stop (display);
@@ -1367,7 +1374,7 @@ rxvt_term::im_get_ic (const char *modifiers)
 
   set_environ (envv);
 
-  if (! ((p = XSetLocaleModifiers (modifiers)) && *p))
+  if (!((p = XSetLocaleModifiers (modifiers)) && *p))
     return false;
 
   input_method = display->get_xim (locale, modifiers);
@@ -1685,11 +1692,6 @@ rxvt_term::update_background ()
   if (update_background_ev.is_active ())
     return;
 
-  bg_invalidate ();
-
-  if (!mapped)
-    return;
-
   ev_tstamp to_wait = 0.5 - (ev::now () - bg_valid_since);
 
   if (to_wait <= 0.)
diff --git a/src/perl/background b/src/perl/background
index 46040dd..69fd559 100644
--- a/src/perl/background
+++ b/src/perl/background
@@ -819,6 +819,16 @@ Example: the same, but specify the colour by component.
       $_[1]->tint ($_[0])
    }
 
+=item shade $factor, $img
+
+Shade the image by the given factor.
+
+=cut
+
+   sub shade($$) {
+      $_[1]->shade ($_[0])
+   }
+
 =item contrast $factor, $img
 
 =item contrast $r, $g, $b, $img
diff --git a/src/rsinc.h b/src/rsinc.h
index 2906837..1483955 100644
--- a/src/rsinc.h
+++ b/src/rsinc.h
@@ -58,7 +58,7 @@
   def (preeditType)
   def (inputMethod)
 #endif
-#if ENABLE_TRANSPARENCY
+#if BG_IMAGE_FROM_ROOT
   def (transparent)
   def (shade)
   def (blurradius)
diff --git a/src/rxvt.h b/src/rxvt.h
index c90b9b7..8a6c895 100644
--- a/src/rxvt.h
+++ b/src/rxvt.h
@@ -77,10 +77,19 @@ typedef  int32_t tlen_t_; // specifically for use in the line_t structure
 # include <gdk-pixbuf/gdk-pixbuf.h>
 #endif
 
-#if defined(BG_IMAGE_FROM_FILE) || defined(ENABLE_TRANSPARENCY)
+#if XRENDER && (HAVE_PIXBUF || ENABLE_TRANSPARENCY)
 # define HAVE_BG_PIXMAP 1
 #endif
 
+#if HAVE_BG_PIXMAP
+# if HAVE_PIXBUF
+#  define BG_IMAGE_FROM_FILE 1
+# endif
+# if ENABLE_TRANSPARENCY
+#  define BG_IMAGE_FROM_ROOT 1
+# endif
+#endif
+
 #include <ecb.h>
 #include "encoding.h"
 #include "rxvtutil.h"
@@ -582,7 +591,7 @@ enum colour_list {
 #ifdef RXVT_SCROLLBAR
   Color_trough,
 #endif
-#if ENABLE_TRANSPARENCY
+#if BG_IMAGE_FROM_ROOT
   Color_tint,
 #endif
 #if OFF_FOCUS_FADING
@@ -1174,52 +1183,41 @@ struct rxvt_term : zero_initialized, rxvt_vars, rxvt_screen
   XComposeStatus  compose;
   static struct termios def_tio;
   row_col_t       oldcursor;
+
 #ifdef HAVE_BG_PIXMAP
   void bg_init ();
   void bg_destroy ();
 
-  enum {
-    BG_IS_VALID          = 1 << 0,
-
-    BG_IS_TRANSPARENT    = 1 << 1,
-    BG_NEEDS_REFRESH     = 1 << 2,
-    BG_INHIBIT_RENDER    = 1 << 3,
-  };
-
-  uint8_t bg_flags;
-
 # if BG_IMAGE_FROM_FILE
   rxvt_image fimage;
-  void get_image_geometry (rxvt_image &image, int &w, int &h, int &x, int &y);
-  bool render_image (rxvt_image &image);
+  void render_image (rxvt_image &image);
 # endif
 
-# if ENABLE_TRANSPARENCY
+# if BG_IMAGE_FROM_ROOT
   rxvt_img *root_img;
   image_effects root_effects;
 
-  void bg_set_transparent ()
-  {
-    bg_flags |= BG_IS_TRANSPARENT;
-  }
-  void bg_set_root_pixmap ();
-  bool render_root_image ();
+  void render_root_image ();
 # endif
 
-  void tint_image (rxvt_img *img, rxvt_color &tint, bool tint_set, int shade);
-
   ev_tstamp bg_valid_since;
 
-  rxvt_img *bg_img;
-
   bool bg_window_size_sensitive ();
   bool bg_window_position_sensitive ();
 
   void bg_render ();
-  void bg_invalidate ()
-  {
-    bg_flags &= ~BG_IS_VALID;
-  }
+#endif
+
+#ifdef HAVE_IMG
+  enum {
+    BG_IS_TRANSPARENT    = 1 << 1,
+    BG_NEEDS_REFRESH     = 1 << 2,
+    BG_INHIBIT_RENDER    = 1 << 3,
+  };
+
+  uint8_t bg_flags;
+
+  rxvt_img *bg_img;
 #endif
 
 #if ENABLE_OVERLAY
@@ -1283,7 +1281,7 @@ struct rxvt_term : zero_initialized, rxvt_vars, rxvt_screen
     XSelectInput (dpy, vt, vt_emask | vt_emask_perl | vt_emask_xim | vt_emask_mouse);
   }
 
-#if ENABLE_TRANSPARENCY || ENABLE_PERL
+#if BG_IMAGE_FROM_ROOT || ENABLE_PERL
   void rootwin_cb (XEvent &xev);
   xevent_watcher rootwin_ev;
 #endif
@@ -1487,7 +1485,9 @@ struct rxvt_term : zero_initialized, rxvt_vars, rxvt_screen
   void scr_blank_line (line_t &l, unsigned int col, unsigned int width, rend_t efs) const NOTHROW;
   void scr_blank_screen_mem (line_t &l, rend_t efs) const NOTHROW;
   void scr_kill_char (line_t &l, int col) const NOTHROW;
+  void scr_set_char_rend (line_t &l, int col, rend_t rend);
   int scr_scroll_text (int row1, int row2, int count) NOTHROW;
+  void copy_line (line_t &dst, line_t &src);
   void scr_reset ();
   void scr_release () NOTHROW;
   void scr_clear (bool really = false) NOTHROW;
@@ -1546,6 +1546,7 @@ struct rxvt_term : zero_initialized, rxvt_vars, rxvt_screen
   void scr_dump (int fd) NOTHROW;
 
   void selection_check (int check_more) NOTHROW;
+  void selection_changed () NOTHROW; /* sets want_refresh, corrects coordinates */
   void selection_request (Time tm, int selnum = Sel_Primary) NOTHROW;
   void selection_clear (bool clipboard = false) NOTHROW;
   void selection_make (Time tm);
diff --git a/src/rxvtimg.C b/src/rxvtimg.C
index 2042f22..d561e59 100644
--- a/src/rxvtimg.C
+++ b/src/rxvtimg.C
@@ -535,7 +535,7 @@ rxvt_img::blur (int rh, int rv)
   Display *dpy = s->dpy;
   int size = max (rh, rv) * 2 + 1;
   nv *kernel = (nv *)malloc (size * sizeof (nv));
-  XFixed *params = (XFixed *)malloc ((size + 2) * sizeof (XFixed));
+  XFixed *params = rxvt_temp_buf<XFixed> (size + 2);
   rxvt_img *img = new_empty ();
 
   XRenderPictureAttributes pa;
@@ -580,7 +580,6 @@ rxvt_img::blur (int rh, int rv)
     }
 
   free (kernel);
-  free (params);
 
   XRenderFreePicture (dpy, src);
   XRenderFreePicture (dpy, dst);
@@ -917,6 +916,40 @@ rxvt_img::tint (const rgba &c)
 }
 
 rxvt_img *
+rxvt_img::shade (nv factor, rgba c)
+{
+  clamp_it (factor, -1., 1.);
+  factor++;
+
+  if (factor > 1)
+    {
+      c.r = c.r * (2 - factor);
+      c.g = c.g * (2 - factor);
+      c.b = c.b * (2 - factor);
+    }
+  else
+    {
+      c.r = c.r * factor;
+      c.g = c.g * factor;
+      c.b = c.b * factor;
+    }
+
+  rxvt_img *img = this->tint (c);
+
+  if (factor > 1)
+    {
+      c.a = 0xffff;
+      c.r =
+      c.g =
+      c.b = 0xffff * (factor - 1);
+
+      img->brightness (c.r, c.g, c.b, c.a);
+    }
+
+  return img;
+}
+
+rxvt_img *
 rxvt_img::filter (const char *name, int nparams, nv *params)
 {
   composer cc (this);
diff --git a/src/rxvtimg.h b/src/rxvtimg.h
index 22fda84..fbd99d6 100644
--- a/src/rxvtimg.h
+++ b/src/rxvtimg.h
@@ -130,6 +130,7 @@ struct rxvt_img
   rxvt_img *rotate (int cx, int cy, nv phi);
   rxvt_img *convert_format (XRenderPictFormat *format, const rgba &bg);
   rxvt_img *tint (const rgba &c);
+  rxvt_img *shade (nv factor, rgba c = rgba (rgba::MAX_CC, rgba::MAX_CC, rgba::MAX_CC));
   rxvt_img *filter (const char *name, int nparams = 0, nv *params = 0);
   rxvt_img *muladd (nv mul, nv add); // general multiply and add, implemented as the biggest hack ever :/
 
diff --git a/src/rxvtperl.xs b/src/rxvtperl.xs
index 4d8709e..ce28ad9 100644
--- a/src/rxvtperl.xs
+++ b/src/rxvtperl.xs
@@ -59,6 +59,7 @@ typedef int		render_repeat_mode;
 #if HAVE_PIXBUF
 typedef GdkPixbuf *	urxvt__pixbuf;
 #endif
+#if HAVE_IMG
 typedef rxvt_img *	urxvt__img;
 typedef rxvt_img::nv	rxvt_img__nv;
 
@@ -107,6 +108,7 @@ parse_rgba (SV *sv, rxvt_screen *s = 0)
 }
 
 /////////////////////////////////////////////////////////////////////////////
+#endif
 
 static wchar_t *
 sv2wcs (SV *sv)
@@ -1879,7 +1881,7 @@ rxvt_term::screen_cur (...)
               {
                 THIS->selection.screen = THIS->current_screen;
 
-                THIS->want_refresh = 1;
+                THIS->selection_changed ();
                 THIS->refresh_check ();
               }
           }
@@ -2203,13 +2205,12 @@ rxvt_term::new_img_from_file (octet_string filename)
 
 #endif
 
-#if HAVE_BG_PIXMAP
-
 void
 rxvt_term::set_background (rxvt_img *img, bool border = false)
 	CODE:
-        THIS->bg_destroy ();
-        THIS->bg_flags &= ~(rxvt_term::BG_NEEDS_REFRESH | rxvt_term::BG_INHIBIT_RENDER | rxvt_term::BG_IS_TRANSPARENT);
+        delete THIS->bg_img;
+        THIS->bg_img = 0;
+        THIS->bg_flags = 0;
 
         if (img) // TODO: cannot be false
           {
@@ -2237,8 +2238,6 @@ rxvt_term::set_background (rxvt_img *img, bool border = false)
 
 #endif
 
-#endif
-
 #############################################################################
 # urxvt::overlay
 #############################################################################
@@ -2390,6 +2389,9 @@ rxvt_img::tint (SV *c)
 	C_ARGS: cc
 
 rxvt_img *
+rxvt_img::shade (rxvt_img::nv factor)
+
+rxvt_img *
 rxvt_img::filter (octet_string name, SV *params = &PL_sv_undef)
 	CODE:
         rxvt_img::nv *vparams = 0;
@@ -2397,20 +2399,18 @@ rxvt_img::filter (octet_string name, SV *params = &PL_sv_undef)
 
         if (SvOK (params))
 	  {
-            // we overlay rxvt_temp_buf, what a hack
-            assert (sizeof (rxvt_img::nv) >= sizeof (int));
-
             if (!SvROK (params) || SvTYPE (SvRV (params)) != SVt_PVAV)
               croak ("rxvt_img::filter: params must be an array reference with parameter values");
 
             nparams = av_len ((AV *)SvRV (params)) + 1;
-            vparams = rxvt_temp_buf<rxvt_img::nv> (nparams);
+            vparams = (rxvt_img::nv *)malloc (nparams * sizeof (rxvt_img::nv));
 
             for (int i = 0; i < nparams; ++i)
               vparams [i] = SvNV (*av_fetch ((AV *)SvRV (params), i, 1));
           }
 
         RETVAL = THIS->filter (name, nparams, vparams);
+        free (vparams);
 	OUTPUT:
         RETVAL
 
diff --git a/src/rxvttoolkit.C b/src/rxvttoolkit.C
index 545c3c5..ce9bf56 100644
--- a/src/rxvttoolkit.C
+++ b/src/rxvttoolkit.C
@@ -68,7 +68,7 @@ static const char *const xa_names[] =
   "WM_LOCALE_NAME",
   "XIM_SERVERS",
 #endif
-#if ENABLE_TRANSPARENCY || ENABLE_PERL
+#if BG_IMAGE_FROM_ROOT || ENABLE_PERL
   "_XROOTPMAP_ID",
   "ESETROOT_PMAP_ID",
 #endif
diff --git a/src/rxvttoolkit.h b/src/rxvttoolkit.h
index 48a58a4..369d8e7 100644
--- a/src/rxvttoolkit.h
+++ b/src/rxvttoolkit.h
@@ -68,7 +68,7 @@ enum {
   XA_WM_LOCALE_NAME,
   XA_XIM_SERVERS,
 #endif
-#if ENABLE_TRANSPARENCY || ENABLE_PERL
+#if BG_IMAGE_FROM_ROOT || ENABLE_PERL
   XA_XROOTPMAP_ID,
   XA_ESETROOT_PMAP_ID,
 #endif
diff --git a/src/screen.C b/src/screen.C
index 29b26fa..2589a08 100644
--- a/src/screen.C
+++ b/src/screen.C
@@ -152,6 +152,16 @@ rxvt_term::scr_kill_char (line_t &l, int col) const NOTHROW
   } while (col < ncol && l.t[col] == NOCHAR);
 }
 
+// set the rendition of a single wide character beginning at the given column
+void
+rxvt_term::scr_set_char_rend (line_t &l, int col, rend_t rend)
+{
+  do {
+    l.r[col] = rend;
+    col++;
+  } while (col < ncol && l.t[col] == NOCHAR);
+}
+
 /* ------------------------------------------------------------------------- *
  *                          SCREEN INITIALISATION                            *
  * ------------------------------------------------------------------------- */
@@ -190,6 +200,16 @@ rxvt_term::scr_alloc () NOTHROW
   row_buf   = swap_buf  + nrow;
 }
 
+void
+rxvt_term::copy_line (line_t &dst, line_t &src)
+{
+  scr_blank_screen_mem (dst, DEFAULT_RSTYLE);
+  dst.l = min (src.l, ncol);
+  memcpy (dst.t, src.t, sizeof (text_t) * dst.l);
+  memcpy (dst.r, src.r, sizeof (rend_t) * dst.l);
+  dst.f = src.f;
+}
+
 void ecb_cold
 rxvt_term::scr_reset ()
 {
@@ -232,8 +252,6 @@ rxvt_term::scr_reset ()
   line_t *prev_swap_buf  = swap_buf;
   line_t *prev_row_buf   = row_buf;
 
-  int common_col = min (prev_ncol, ncol);
-
   scr_alloc ();
 
   if (!prev_row_buf)
@@ -277,13 +295,8 @@ rxvt_term::scr_reset ()
 
       for (int row = min (nrow, prev_nrow); row--; )
         {
-          scr_blank_screen_mem (drawn_buf [row], DEFAULT_RSTYLE);
-          scr_blank_screen_mem (swap_buf  [row], DEFAULT_RSTYLE);
-
-          memcpy (drawn_buf [row].t, prev_drawn_buf [row].t, sizeof (text_t) * common_col);
-          memcpy (drawn_buf [row].r, prev_drawn_buf [row].r, sizeof (rend_t) * common_col);
-          memcpy (swap_buf  [row].t, prev_swap_buf  [row].t, sizeof (text_t) * common_col);
-          memcpy (swap_buf  [row].r, prev_swap_buf  [row].r, sizeof (rend_t) * common_col);
+          copy_line (drawn_buf [row], prev_drawn_buf [row]);
+          copy_line (swap_buf [row], prev_swap_buf [row]);
         }
 
       int p    = MOD (term_start + prev_nrow, prev_total_rows);  // previous row
@@ -388,10 +401,7 @@ rxvt_term::scr_reset ()
               line_t &src = prev_row_buf [MOD (term_start + row, prev_total_rows)];
               line_t &dst = row_buf [row];
 
-              scr_blank_screen_mem (dst, DEFAULT_RSTYLE);
-
-              memcpy (dst.t, src.t, sizeof (text_t) * common_col);
-              memcpy (dst.r, src.r, sizeof (rend_t) * common_col);
+              copy_line (dst, src);
             }
 
           for (int row = prev_nrow; row < nrow; row++)
@@ -1708,7 +1718,7 @@ rxvt_term::scr_rvideo_mode (bool on) NOTHROW
       rvideo_state = on;
 
       ::swap (pix_colors[Color_fg], pix_colors[Color_bg]);
-#ifdef HAVE_BG_PIXMAP
+#ifdef HAVE_IMG
       if (bg_img == 0)
 #endif
           XSetWindowBackground (dpy, vt, pix_colors[Color_bg]);
@@ -2034,12 +2044,10 @@ rxvt_term::scr_refresh () NOTHROW
   int16_t col, row,   /* column/row we're processing               */
           ocrow;      /* old cursor row                            */
   int i;              /* tmp                                       */
-#ifndef NO_CURSORCOLOR
-  rend_t cc1;         /* store colours at cursor position (s)      */
-#endif
-  rend_t *crp;        // cursor rendition pointer
   rend_t ccol1,  /* Cursor colour       */
          ccol2;  /* Cursor colour2      */
+  rend_t cur_rend;
+  int cur_col;
 
   want_refresh = 0;        /* screen is current */
 
@@ -2053,7 +2061,7 @@ rxvt_term::scr_refresh () NOTHROW
 
   unsigned int old_screen_flags = screen.flags;
   bool have_bg = 0;
-#ifdef HAVE_BG_PIXMAP
+#ifdef HAVE_IMG
   have_bg = bg_img != 0;
 #endif
   ocrow = oldcursor.row; /* is there an old outline cursor on screen? */
@@ -2088,10 +2096,10 @@ rxvt_term::scr_refresh () NOTHROW
         while (col && ROW(screen.cur.row).t[col] == NOCHAR)
           col--;
 
-        crp = &ROW(screen.cur.row).r[col];
+        cur_rend = ROW(screen.cur.row).r[col];
+        cur_col = col;
 
 #ifndef NO_CURSORCOLOR
-        cc1 = *crp & (RS_fgMask | RS_bgMask);
         if (ISSET_PIXCOLOR (Color_cursor))
           ccol1 = Color_cursor;
         else
@@ -2115,14 +2123,18 @@ rxvt_term::scr_refresh () NOTHROW
 
         if (focus)
           {
+            rend_t rend = cur_rend;
+
             if (option (Opt_cursorUnderline))
-              *crp ^= RS_Uline;
+              rend ^= RS_Uline;
             else
               {
-                *crp ^= RS_RVid;
-                *crp = SET_FGCOLOR (*crp, ccol1);
-                *crp = SET_BGCOLOR (*crp, ccol2);
+                rend ^= RS_RVid;
+                rend = SET_FGCOLOR (rend, ccol1);
+                rend = SET_BGCOLOR (rend, ccol2);
               }
+
+            scr_set_char_rend (ROW(screen.cur.row), cur_col, rend);
           }
       }
 
@@ -2451,17 +2463,7 @@ rxvt_term::scr_refresh () NOTHROW
   if (showcursor)
     {
       if (focus)
-        {
-          if (option (Opt_cursorUnderline))
-            *crp ^= RS_Uline;
-          else
-            {
-              *crp ^= RS_RVid;
-#ifndef NO_CURSORCOLOR
-              *crp = (*crp & ~ (RS_fgMask | RS_bgMask)) | cc1;
-#endif
-            }
-        }
+        scr_set_char_rend (ROW(screen.cur.row), cur_col, cur_rend);
       else if (oldcursor.row >= 0)
         {
           int cursorwidth = 1;
@@ -2534,7 +2536,7 @@ rxvt_term::scr_recolour (bool refresh) NOTHROW
 {
   bool transparent = false;
 
-#ifdef HAVE_BG_PIXMAP
+#ifdef HAVE_IMG
   if (bg_img != 0)
     {
 # if ENABLE_TRANSPARENCY
@@ -2695,6 +2697,20 @@ rxvt_term::selection_check (int check_more) NOTHROW
     CLEAR_ALL_SELECTION ();
 }
 
+void
+rxvt_term::selection_changed () NOTHROW
+{
+  line_t &r1 = ROW (selection.beg.row);
+  while (selection.beg.col >    0 && r1.t [selection.beg.col] == NOCHAR)
+    --selection.beg.col;
+
+  line_t &r2 = ROW (selection.end.row);
+  while (selection.end.col < r2.l && r2.t [selection.end.col] == NOCHAR)
+    ++selection.end.col;
+
+  want_refresh = 1;
+}
+
 /* ------------------------------------------------------------------------- */
 /*
  * Paste a selection direct to the command fd
@@ -3005,7 +3021,7 @@ rxvt_term::selection_start_colrow (int col, int row) NOTHROW
  */
 
 /* what do we want: spaces/tabs are delimiters or cutchars or non-cutchars */
-#define DELIMIT_TEXT(x) 		\
+#define DELIMIT_TEXT(x)		\
     (unicode::is_space (x) ? 2 : (x) <= 0xff && !!strchr (rs[Rs_cutchars], (x)))
 #define DELIMIT_REND(x)        1
 
@@ -3137,8 +3153,6 @@ rxvt_term::selection_extend_colrow (int32_t col, int32_t row, int button3, int b
     LEFT, RIGHT
   } closeto = RIGHT;
 
-  want_refresh = 1;
-
   switch (selection.op)
     {
       case SELECTION_INIT:
@@ -3327,6 +3341,8 @@ rxvt_term::selection_extend_colrow (int32_t col, int32_t row, int button3, int b
   if (selection.rect && selection.beg.col > selection.end.col)
     ::swap (selection.beg.col, selection.end.col);
 #endif
+
+  selection_changed ();
 }
 
 #if !ENABLE_MINIMAL
diff --git a/src/version.h b/src/version.h
index d2f7f72..d09491b 100644
--- a/src/version.h
+++ b/src/version.h
@@ -1,3 +1,3 @@
 // VERSION _must_ be \d.\d+
-#define VERSION "9.16"
-#define DATE	"2012-11-06"
+#define VERSION "9.17"
+#define DATE	"2013-03-01"
diff --git a/src/xdefaults.C b/src/xdefaults.C
index 856acaf..69acdd8 100644
--- a/src/xdefaults.C
+++ b/src/xdefaults.C
@@ -113,7 +113,7 @@ optList[] = {
               BOOL (Rs_scrollTtyOutput, NULL, "si",  Opt_scrollTtyOutput, Optflag_Reverse, "scroll-on-tty-output inhibit"),
               BOOL (Rs_scrollTtyKeypress, "scrollTtyKeypress", "sk", Opt_scrollTtyKeypress, 0, "scroll-on-keypress"),
               BOOL (Rs_scrollWithBuffer, "scrollWithBuffer", "sw", Opt_scrollWithBuffer, 0, "scroll-with-buffer"),
-#if ENABLE_TRANSPARENCY
+#if BG_IMAGE_FROM_ROOT
               BOOL (Rs_transparent, "inheritPixmap", "ip", Opt_transparent, 0, "inherit parent pixmap"),
               BOOL (Rs_transparent, "transparent", "tr", Opt_transparent, 0, "inherit parent pixmap"),
               STRG (Rs_color + Color_tint, "tintColor", "tint", "color", "tint color"),
@@ -197,9 +197,9 @@ optList[] = {
 #if BG_IMAGE_FROM_FILE
               RSTRG (Rs_path, "path", "search path"),
               STRG (Rs_backgroundPixmap, "backgroundPixmap", "pixmap", "file[;geom]", "background pixmap"),
-# if ENABLE_EWMH
+#endif
+#if ENABLE_EWMH
               STRG (Rs_iconfile, "iconFile", "icon", "file", "path to application icon image"),
-# endif
 #endif
               /* fonts: command-line option = resource name */
               STRG (Rs_font, "font", "fn", "fontname", "normal text font"),

-- 
Git repository for pkg-urxvt




More information about the Pkg-urxvt-maintainers mailing list