diff -ur rxvt-unicode-9.02.orig/src/rxvttoolkit.C rxvt-unicode-9.02/src/rxvttoolkit.C
--- rxvt-unicode-9.02.orig/src/rxvttoolkit.C	2008-01-26 06:00:27.000000000 -0800
+++ rxvt-unicode-9.02/src/rxvttoolkit.C	2008-03-23 10:41:42.000000000 -0700
@@ -739,11 +739,27 @@
 }
 
 bool
-rxvt_color::set (rxvt_screen *screen, const char *name)
+rxvt_color::set (rxvt_screen *screen, const char *cname)
 {
   rgba c;
   char eos;
   int skip;
+  char *name;
+  char nambuf[28];
+  char *sep;
+  long range,colr=0;
+  rgba start_c;
+
+  if(((sep=strchr(cname, '-')) || (sep=strchr(cname, '<')) || (sep=strchr(cname, '>')))
+     && sep-cname<sizeof(nambuf)) {
+    name=nambuf;
+    strncpy(nambuf, cname, sep-cname);
+    nambuf[sep-cname]=0;
+  } else {
+    name=(char *)cname;
+  }
+
+  do {
 
   c.a = rgba::MAX_CC;
 
@@ -775,6 +791,61 @@
         }
     }
 
+  if(sep) {
+    colr++;
+    if(colr==1) {
+      // store first color and prepare to parse next
+      name=sep+1;
+      start_c.r=c.r;
+      start_c.g=c.g;
+      start_c.b=c.b;
+      start_c.a=c.a;
+    } else {
+      srand48((long)time(NULL));
+      if(sep[0]=='-') {
+	// handle color1-color2 (linear progression)
+        range=abs(start_c.r-c.r);
+        if(range < abs(start_c.g-c.g)) range=abs(start_c.g-c.g);
+        if(range < abs(start_c.b-c.b)) range=abs(start_c.b-c.b);
+        if(range < abs(start_c.a-c.a)) range=abs(start_c.a-c.a);
+	colr=drand48()*range;
+	c.r=(start_c.r-c.r) ? c.r+colr*range/(start_c.r-c.r) : c.r;
+	c.g=(start_c.g-c.g) ? c.g+colr*range/(start_c.g-c.g) : c.g;
+	c.b=(start_c.b-c.b) ? c.b+colr*range/(start_c.b-c.b) : c.b;
+	c.a=(start_c.a-c.a) ? c.a+colr*range/(start_c.a-c.a) : c.a;
+      } else {
+	// handle color1>color2 (random between limits)
+	if(sep[0]=='<') {
+	  // treat color1<color2 as color2>color1
+	  colr=c.r; c.r=start_c.r; start_c.r=colr;
+	  colr=c.g; c.g=start_c.g; start_c.g=colr;
+	  colr=c.b; c.b=start_c.b; start_c.b=colr;
+	  colr=c.a; c.a=start_c.a; start_c.a=colr;
+	}
+	// adjust each channel and handle wrap-around
+	range=(start_c.r < c.r) ? rgba::MAX_CC+1 : 0;
+	colr=c.r+drand48()*(start_c.r-c.r+range);
+	if(colr > rgba::MAX_CC) colr-=(rgba::MAX_CC+1);
+	c.r=colr;
+	range=(start_c.g < c.g) ? rgba::MAX_CC+1 : 0;
+	colr=c.g+drand48()*(start_c.g-c.g+range);
+	if(colr > rgba::MAX_CC) colr-=(rgba::MAX_CC+1);
+	c.g=colr;
+	range=(start_c.b < c.b) ? rgba::MAX_CC+1 : 0;
+	colr=c.b+drand48()*(start_c.b-c.b+range);
+	if(colr > rgba::MAX_CC) colr-=(rgba::MAX_CC+1);
+	c.b=colr;
+	range=(start_c.a < c.a) ? rgba::MAX_CC+1 : 0;
+	colr=c.a+drand48()*(start_c.a-c.a+range);
+	if(colr > rgba::MAX_CC) colr-=(rgba::MAX_CC+1);
+	c.a=colr;
+      }
+      sep=NULL;
+    }
+  }
+
+  } while(sep);
+
   return set (screen, c);
 }
 
