Index: uspace/lib/congfx/src/console.c
===================================================================
--- uspace/lib/congfx/src/console.c	(revision bb14312c8c42ea170b99a8d6db9a607a3b2aba04)
+++ uspace/lib/congfx/src/console.c	(revision ff6e91bcf78218e49444169033c0d4edb9c50021)
@@ -75,4 +75,41 @@
 };
 
+/** Convert pixel value to charfield.
+ *
+ * On the bottom of this function lies a big big hack. In the absence
+ * of support for different color formats (FIX ME!), here's a single
+ * format that can represent both 3x8bit RGB and 24-bit characters
+ * with 8-bit EGA attributes (i.e. we can specify the foreground and
+ * background colors individually).
+ *
+ * A    R   G   B
+ * 0    red grn blu  24-bit color
+ * attr c2  c1  c0   attribute + 24-bit character
+ */
+static void console_gc_pix_to_charfield(pixel_t clr, charfield_t *ch)
+{
+	uint8_t attr;
+
+	if ((clr >> 24) == 0) {
+		/* RGB (no text) */
+		ch->ch = 0;
+		ch->flags = CHAR_FLAG_DIRTY;
+		ch->attrs.type = CHAR_ATTR_RGB;
+		ch->attrs.val.rgb.fgcolor = clr ^ 0xffffff;
+		ch->attrs.val.rgb.bgcolor = clr;
+	} else {
+		/* EGA attributes (with text) */
+		attr = clr >> 24;
+		ch->ch = clr & 0xffffff;
+		ch->flags = CHAR_FLAG_DIRTY;
+		ch->attrs.type = CHAR_ATTR_INDEX;
+		ch->attrs.val.index.fgcolor = attr & 0x7;
+		ch->attrs.val.index.bgcolor = (attr >> 4) & 0x7;
+		ch->attrs.val.index.attr =
+		    ((attr & 0x8) ? CATTR_BRIGHT : 0) +
+		    ((attr & 0x80) ? CATTR_BLINK : 0);
+	}
+}
+
 /** Set clipping rectangle on console GC.
  *
@@ -107,5 +144,5 @@
 	console_gc_t *cgc = (console_gc_t *) arg;
 
-	cgc->clr = PIXEL(0, color->r >> 8, color->g >> 8, color->b >> 8);
+	cgc->clr = PIXEL(color->attr, color->r >> 8, color->g >> 8, color->b >> 8);
 	return EOK;
 }
@@ -131,9 +168,5 @@
 	cols = cgc->rect.p1.x - cgc->rect.p0.x;
 
-	ch.ch = cgc->clr >> 24;
-	ch.flags = CHAR_FLAG_DIRTY;
-	ch.attrs.type = CHAR_ATTR_RGB;
-	ch.attrs.val.rgb.fgcolor = cgc->clr ^ 0xffffff;
-	ch.attrs.val.rgb.bgcolor = cgc->clr;
+	console_gc_pix_to_charfield(cgc->clr, &ch);
 
 	for (y = crect.p0.y; y < crect.p1.y; y++) {
@@ -374,10 +407,5 @@
 				    y - offs.y - cbm->rect.p0.y);
 
-				ch.ch = clr >> 24;
-				ch.flags = CHAR_FLAG_DIRTY;
-				ch.attrs.type = CHAR_ATTR_RGB;
-				ch.attrs.val.rgb.fgcolor = clr ^ 0xffffff;
-				ch.attrs.val.rgb.bgcolor = clr;
-
+				console_gc_pix_to_charfield(clr, &ch);
 				cbm->cgc->buf[y * cols + x] = ch;
 			}
@@ -392,9 +420,5 @@
 				    y - offs.y - cbm->rect.p0.y);
 
-				ch.ch = clr >> 24;
-				ch.flags = CHAR_FLAG_DIRTY;
-				ch.attrs.type = CHAR_ATTR_RGB;
-				ch.attrs.val.rgb.fgcolor = clr ^ 0xffffff;
-				ch.attrs.val.rgb.bgcolor = clr;
+				console_gc_pix_to_charfield(clr, &ch);
 
 				if (clr != cbm->key_color)
@@ -404,9 +428,5 @@
 	} else {
 		/* Color key & colorize */
-		ch.ch = 0;
-		ch.flags = CHAR_FLAG_DIRTY;
-		ch.attrs.type = CHAR_ATTR_RGB;
-		ch.attrs.val.rgb.fgcolor = cbm->cgc->clr;
-		ch.attrs.val.rgb.bgcolor = cbm->cgc->clr;
+		console_gc_pix_to_charfield(cbm->cgc->clr, &ch);
 
 		for (y = crect.p0.y; y < crect.p1.y; y++) {
