--- /dev/null
+--- fbterm-1.2/src/screen.cpp.old 2008-12-15 20:27:32.000000000 +0100
++++ fbterm-1.2/src/screen.cpp 2008-12-15 20:31:55.000000000 +0100
+@@ -184,8 +184,6 @@ void Screen::switchVc(bool enter)
+
+ void Screen::setupSysPalette(bool restore)
+ {
+- if (vinfo.bits_per_pixel != 8) return;
+-
+ static bool palette_saved = false;
+ static u16 saved_red[NR_COLORS], saved_green[NR_COLORS], saved_blue[NR_COLORS];
+ fb_cmap cmap;
+@@ -212,17 +210,62 @@ void Screen::setupSysPalette(bool restor
+ INIT_CMAP(saved_red, saved_green, saved_blue);
+ ioctl(mFd, FBIOGETCMAP, &cmap);
+ }
++ if (finfo.visual == FB_VISUAL_DIRECTCOLOR && vinfo.bits_per_pixel != 8) {
++ u16 *red, *green, *blue;
++ int rcols = 1 << vinfo.red.length;
++ int gcols = 1 << vinfo.green.length;
++ int bcols = 1 << vinfo.blue.length;
++
++ /* Make our palette the length of the deepest color */
++ int cols = (rcols > gcols ? rcols : gcols);
++ cols = (cols > bcols ? cols : bcols);
++
++ red = new u16[cols];
++ if (!red)
++ return;
++ for (int i = 0; i < rcols; i++)
++ red[i] = (65535 / (rcols - 1)) * i;
++
++ green = new u16[cols];
++ if (!green) {
++ delete[] red;
++ return;
++ }
++ for (int i = 0; i < gcols; i++)
++ green[i] = (65535 / (gcols - 1)) * i;
++
++ blue = new u16[cols];
++ if (!blue) {
++ delete[] red;
++ delete[] green;
++ return;
++ }
++ for (int i = 0; i < bcols; i++)
++ blue[i] = (65535 / (bcols - 1)) * i;
++
++ cmap.start = 0;
++ cmap.len = cols;
++ cmap.red = red;
++ cmap.blue = blue;
++ cmap.green = green;
++ cmap.transp = NULL;
++ ioctl(mFd, FBIOPUTCMAP, &cmap);
++ delete[] red;
++ delete[] blue;
++ delete[] green;
+
+- u16 red[NR_COLORS], green[NR_COLORS], blue[NR_COLORS];
++ } else {
++ u16 red[NR_COLORS], green[NR_COLORS], blue[NR_COLORS];
+
+- for (u32 i = 0; i < NR_COLORS; i++) {
+- red[i] = palette[i].red << 8 | palette[i].red;
+- green[i] = palette[i].green << 8 | palette[i].green;
+- blue[i] = palette[i].blue << 8 | palette[i].blue;
+- }
++ for (u32 i = 0; i < NR_COLORS; i++) {
++ red[i] = palette[i].red << 8 | palette[i].red;
++ green[i] = palette[i].green << 8 | palette[i].green;
++ blue[i] = palette[i].blue << 8 | palette[i].blue;
++ }
+
+- INIT_CMAP(red, green, blue);
+- ioctl(mFd, FBIOPUTCMAP, &cmap);
++ INIT_CMAP(red, green, blue);
++ ioctl(mFd, FBIOPUTCMAP, &cmap);
++ }
+ }
+ }
+