diff -Nru src.t/vteapp.c src/vteapp.c
--- src.t/vteapp.c	2006-02-10 09:25:56.000000000 +0000
+++ src/vteapp.c	2006-04-24 16:24:23.000000000 +0100
@@ -399,6 +399,8 @@
 int
 main(int argc, char **argv)
 {
+	GdkScreen *screen;
+	GdkColormap *colormap;
 	GtkWidget *window, *hbox, *scrollbar, *widget;
 	char *env_add[] = {"FOO=BAR", "BOO=BIZ", NULL};
 	const char *background = NULL;
@@ -574,6 +576,12 @@
 	g_signal_connect(G_OBJECT(window), "delete_event",
 			 GTK_SIGNAL_FUNC(deleted_and_quit), window);
 
+	/* Set ARGB colormap */
+	screen = gtk_widget_get_screen (window);
+	colormap = gdk_screen_get_rgba_colormap (screen);
+	if (colormap)
+	    gtk_widget_set_colormap(GTK_WIDGET (window), colormap);
+
 	/* Create a box to hold everything. */
 	hbox = gtk_hbox_new(0, FALSE);
 	gtk_container_add(GTK_CONTAINER(window), hbox);
@@ -665,6 +673,7 @@
 	}
 	vte_terminal_set_background_tint_color(VTE_TERMINAL(widget), &tint);
 	vte_terminal_set_colors(VTE_TERMINAL(widget), &fore, &back, NULL, 0);
+	vte_terminal_set_opacity(VTE_TERMINAL(widget), 0xcccc);
 	if (highlight_set) {
 		vte_terminal_set_color_highlight(VTE_TERMINAL(widget),
 						 &highlight);
diff -Nru src.t/vte.c src/vte.c
--- src.t/vte.c	2006-03-13 03:29:31.000000000 +0000
+++ src/vte.c	2006-04-24 16:25:08.000000000 +0100
@@ -2160,6 +2160,19 @@
 }
 
 /**
+ * vte_terminal_set_opacity
+ * @terminal: a #VteTerminal
+ * @opacity: the new opacity
+ *
+ * CRACK ALERT!
+ */
+void
+vte_terminal_set_opacity(VteTerminal *terminal, guint16 opacity)
+{
+	terminal->pvt->bg_opacity = opacity;
+}
+
+/**
  * vte_terminal_set_default_colors:
  * @terminal: a #VteTerminal
  *
@@ -6808,6 +6821,7 @@
 	pvt->bg_tint_color.green = 0;
 	pvt->bg_tint_color.blue = 0;
 	pvt->bg_saturation = 0.4 * VTE_SATURATION_MAX;
+	pvt->bg_opacity = 0xffff;
 
 	/* Assume we're visible unless we're told otherwise. */
 	pvt->visibility_state = GDK_VISIBILITY_UNOBSCURED;
@@ -10212,7 +10226,8 @@
 		gdk_rgb_find_color(colormap, &bgcolor);
 	}
 	gdk_window_set_background(widget->window, &bgcolor);
-	_vte_draw_set_background_color(terminal->pvt->draw, &bgcolor);
+	_vte_draw_set_background_color(terminal->pvt->draw, &bgcolor,
+				       terminal->pvt->bg_opacity);
 
 	/* If we're transparent, and either have no root image or are being
 	 * told to update it, get a new copy of the root window. */
diff -Nru src.t/vtedraw.c src/vtedraw.c
--- src.t/vtedraw.c	2006-02-03 13:27:27.000000000 +0000
+++ src/vtedraw.c	2006-04-24 16:24:23.000000000 +0100
@@ -177,11 +177,13 @@
 }
 
 void
-_vte_draw_set_background_color(struct _vte_draw *draw, GdkColor *color)
+_vte_draw_set_background_color(struct _vte_draw *draw,
+			       GdkColor *color,
+			       guint16 opacity)
 {
 	g_return_if_fail(draw->impl != NULL);
 	g_return_if_fail(draw->impl->set_background_color != NULL);
-	draw->impl->set_background_color(draw, color);
+	draw->impl->set_background_color(draw, color, opacity);
 }
 
 void
diff -Nru src.t/vtedraw.h src/vtedraw.h
--- src.t/vtedraw.h	2004-04-20 06:16:56.000000000 +0100
+++ src/vtedraw.h	2006-04-24 16:24:23.000000000 +0100
@@ -58,7 +58,7 @@
 	GdkColormap* (*get_colormap)(struct _vte_draw *draw);
 	void (*start)(struct _vte_draw *draw);
 	void (*end)(struct _vte_draw *draw);
-	void (*set_background_color)(struct _vte_draw *, GdkColor *);
+	void (*set_background_color)(struct _vte_draw *, GdkColor *, guint16);
 	void (*set_background_image)(struct _vte_draw *,
 				     enum VteBgSourceType type,
 				     GdkPixbuf *pixbuf,
@@ -116,7 +116,9 @@
 
 /* Set the background color, a background pixbuf (if you want transparency,
    you'll have to do that yourself), and clear an area to the default. */
-void _vte_draw_set_background_color(struct _vte_draw *draw, GdkColor *color);
+void _vte_draw_set_background_color(struct _vte_draw *draw,
+				    GdkColor *color,
+				    guint16 opacity);
 void _vte_draw_set_background_image(struct _vte_draw *draw,
 				    enum VteBgSourceType type,
 				    GdkPixbuf *pixbuf,
diff -Nru src.t/vteft2.c src/vteft2.c
--- src.t/vteft2.c	2004-04-20 06:16:56.000000000 +0100
+++ src/vteft2.c	2006-04-24 16:24:23.000000000 +0100
@@ -149,7 +149,7 @@
 }
 
 static void
-_vte_ft2_set_background_color(struct _vte_draw *draw, GdkColor *color)
+_vte_ft2_set_background_color(struct _vte_draw *draw, GdkColor *color, guint16 opacity)
 {
 	struct _vte_ft2_data *data;
 	data = (struct _vte_ft2_data*) draw->impl_data;
diff -Nru src.t/vtegl.c src/vtegl.c
--- src.t/vtegl.c	2004-04-20 06:16:56.000000000 +0100
+++ src/vtegl.c	2006-04-24 16:24:23.000000000 +0100
@@ -261,7 +261,7 @@
 }
 
 static void
-_vte_gl_set_background_color(struct _vte_draw *draw, GdkColor *color)
+_vte_gl_set_background_color(struct _vte_draw *draw, GdkColor *color, guint16 opacity)
 {
 	struct _vte_gl_data *data;
 
diff -Nru src.t/vte.h src/vte.h
--- src.t/vte.h	2004-05-01 08:12:51.000000000 +0100
+++ src/vte.h	2006-04-24 16:24:23.000000000 +0100
@@ -274,6 +274,7 @@
 					    double saturation);
 void vte_terminal_set_background_transparent(VteTerminal *terminal,
 					     gboolean transparent);
+void vte_terminal_set_opacity(VteTerminal *terminal, guint16 opacity);
 
 /* Set whether or not the cursor blinks. */
 void vte_terminal_set_cursor_blinks(VteTerminal *terminal, gboolean blink);
diff -Nru src.t/vtepango.c src/vtepango.c
--- src.t/vtepango.c	2005-07-25 09:49:42.000000000 +0100
+++ src/vtepango.c	2006-04-24 16:24:23.000000000 +0100
@@ -178,7 +178,7 @@
 }
 
 static void
-_vte_pango_set_background_color(struct _vte_draw *draw, GdkColor *color)
+_vte_pango_set_background_color(struct _vte_draw *draw, GdkColor *color, guint16 opacity)
 {
 	struct _vte_pango_data *data;
 	data = (struct _vte_pango_data*) draw->impl_data;
diff -Nru src.t/vtepangox.c src/vtepangox.c
--- src.t/vtepangox.c	2004-04-20 06:16:56.000000000 +0100
+++ src/vtepangox.c	2006-04-24 16:24:23.000000000 +0100
@@ -190,7 +190,7 @@
 }
 
 static void
-_vte_pango_x_set_background_color(struct _vte_draw *draw, GdkColor *color)
+_vte_pango_x_set_background_color(struct _vte_draw *draw, GdkColor *color, guint16 opacity)
 {
 	struct _vte_pango_x_data *data;
 	data = (struct _vte_pango_x_data*) draw->impl_data;
diff -Nru src.t/vte-private.h src/vte-private.h
--- src.t/vte-private.h	2006-03-08 20:31:13.000000000 +0000
+++ src/vte-private.h	2006-04-24 16:24:23.000000000 +0100
@@ -338,6 +338,7 @@
 	guint bg_update_tag;
 	GdkColor bg_tint_color;
 	long bg_saturation;	/* out of VTE_SATURATION_MAX */
+	guint16 bg_opacity;
 
 	/* Key modifiers. */
 	GdkModifierType modifiers;
diff -Nru src.t/vteskel.c src/vteskel.c
--- src.t/vteskel.c	2004-04-20 06:16:56.000000000 +0100
+++ src/vteskel.c	2006-04-24 16:24:23.000000000 +0100
@@ -34,6 +34,7 @@
 	GdkPixmap *pixmap;
 	gint pixmapw, pixmaph;
 	gint scrollx, scrolly;
+	guint16 opacity;
 };
 
 static gboolean
@@ -107,11 +108,12 @@
 }
 
 static void
-_vte_skel_set_background_color(struct _vte_draw *draw, GdkColor *color)
+_vte_skel_set_background_color(struct _vte_draw *draw, GdkColor *color, guint16 opacity)
 {
 	struct _vte_skel_data *data;
 	data = (struct _vte_skel_data*) draw->impl_data;
 	data->color = *color;
+	data->opacity = opacity;
 }
 
 static void
diff -Nru src.t/vtexft.c src/vtexft.c
--- src.t/vtexft.c	2006-02-25 23:20:42.000000000 +0000
+++ src/vtexft.c	2006-04-24 16:24:23.000000000 +0100
@@ -69,6 +69,7 @@
 	XftDraw *draw;
 	GC gc;
 	GdkColor color;
+	guint16 opacity;
 	GdkPixmap *pixmap;
 	Pixmap xpixmap;
 	gint pixmapw, pixmaph;
@@ -332,6 +333,7 @@
 	data->draw = NULL;
 	data->gc = NULL;
 	memset(&data->color, 0, sizeof(data->color));
+	data->opacity = 0xffff;
 	data->pixmap = NULL;
 	data->xpixmap = -1;
 	data->pixmapw = data->pixmaph = -1;
@@ -435,11 +437,13 @@
 }
 
 static void
-_vte_xft_set_background_color(struct _vte_draw *draw, GdkColor *color)
+_vte_xft_set_background_color(struct _vte_draw *draw, GdkColor *color,
+			      guint16 opacity)
 {
 	struct _vte_xft_data *data;
 	data = (struct _vte_xft_data*) draw->impl_data;
 	data->color = *color;
+	data->opacity = opacity;
 }
 
 static void
@@ -485,10 +489,10 @@
 	if (!GDK_IS_PIXMAP(data->pixmap) ||
 	    (data->pixmapw <= 0) ||
 	    (data->pixmaph <= 0)) {
-		rcolor.red = data->color.red;
-		rcolor.green = data->color.green;
-		rcolor.blue = data->color.blue;
-		rcolor.alpha = 0xffff;
+		rcolor.red = data->color.red * data->opacity / 0xffff;
+		rcolor.green = data->color.green * data->opacity / 0xffff;
+		rcolor.blue = data->color.blue * data->opacity / 0xffff;
+		rcolor.alpha = data->opacity;
 		if (XftColorAllocValue(data->display, data->visual,
 				       data->colormap, &rcolor, &ftcolor)) {
 			XftDrawRect(data->draw, &ftcolor,
