File fbiterm-enhance.dif of Package xiterm

--- unix/fbiterm/src/fb_true24.c-dist	2004-04-01 17:29:53.941573163 +0200
+++ unix/fbiterm/src/fb_true24.c	2004-04-01 19:45:32.966421735 +0200
@@ -95,21 +95,43 @@ fb_true24_set_rendition (int bold, int b
 
 void
 fb_true24_draw_char (unsigned char *dst, int offset,
-		     unsigned char *bits, int width, int height)
+		     unsigned char *bits, int cell_width,
+		     const xCharInfo *info,
+		     const TermFont *base)
 {
   int x, y;
+  int height;
+  unsigned int *dst24;
+
+  /**** FIXME ****
+   * this shouldn't work on some architectures because of word boundary!!
+   */
+
+  height = (int)base->ascent - (int)info->ascent;
+  for (y = 0; y < height; y++) {
+    for (x = 0; x < cell_width; x++) {
+      dst24 = (unsigned int *) (dst + offset + 3 * x);
+      *dst24 = bgcmap;
+    }
+    dst += pIterm->fb->line_length;
+  }
+
+  height = info->ascent + info->descent;
   for (y = 0; y < height; y++)
     {
-      unsigned long c1, c2, c3, c4, c, cc;
+      unsigned int c1, c2, c3, c4, c, cc;
       c1 = (*bits++ & 0x000000ff);
       c2 = (*bits++ & 0x000000ff);
       c3 = (*bits++ & 0x000000ff);
       c4 = (*bits++ & 0x000000ff);
       c = cc = (c1 << 24) + (c2 << 16) + (c3 << 8) + c4;
-      for (x = 0; x < width; x++)
+      for (x = 0; x < info->leftSideBearing; x++) {
+	dst24 = (unsigned int *) (dst + offset + 3 * x);
+	*dst24 = bgcmap;
+      }
+      for (; x < info->rightSideBearing; x++)
 	{
-	  unsigned long *dst24;
-	  dst24 = (unsigned long *) (dst + offset + 3 * x);
+	  dst24 = (unsigned int *) (dst + offset + 3 * x);
 
 	  if ((pIterm->underline || pIterm->blink) && (height - y < 2))
 	    *(dst24) = fgcmap;
@@ -134,8 +156,20 @@ fb_true24_draw_char (unsigned char *dst,
 	    }
 	  c <<= 1;
 	}
+      for (; x < cell_width; x++) {
+	dst24 = (unsigned int *) (dst + offset + 3 * x);
+	*dst24 = bgcmap;
+      }
       dst += pIterm->fb->line_length;
     }
+  height = base->descent - info->descent;
+  for (y = 0; y < height; y++) {
+    for (x = 0; x < cell_width; x++) {
+      dst24 = (unsigned int *) (dst + offset + 3 * x);
+      *dst24 = bgcmap;
+    }
+    dst += pIterm->fb->line_length;
+  }
   return;
 }
 
@@ -147,6 +181,8 @@ fb_true24_draw_text (int col, int row, c
   unsigned char *bits;
   char *dst;
   mbstate_t ps;
+  const xCharInfo *cinfo;
+  const TermFont *base;
 
   if (pIterm->lock)
     return;
@@ -184,21 +220,25 @@ fb_true24_draw_text (int col, int row, c
 	  if (len == 1 && mbstring[i] < 0x7f)
 	    {
 	      codepoint = (int) (mbstring[i] & 0x000000ff);
-	      bits = get_glyph (pIterm->asc_font, codepoint, &height);
+	      base = pIterm->asc_font;
+	      bits = get_glyph2 (pIterm->asc_font, codepoint, &height, &cinfo);
 	      w = pIterm->asc_font->cell_width;
 	    }
 	  else
 	    {
 	      mbrtowc (&wc, (char *) &mbstring[i], len, 0);
-	      bits = get_glyph (pIterm->mb_font, wc, &height);
+	      base = pIterm->mb_font;
+	      bits = get_glyph2 (pIterm->mb_font, wc, &height, &cinfo);
 	      wlen = wcwidth (wc);
 	      w = pIterm->asc_font->cell_width * (wlen > 0 ? wlen : 1);
 	    }
 	}
+      else
+	      break;
 
       i += len;
       dst = (char *) (pIterm->fb->buf + starty);
-      fb_true24_draw_char (dst, startx, bits, w, height);
+      fb_true24_draw_char (dst, startx, bits, w, cinfo, base);
       startx += (3 * w);
     }
   return;
--- unix/fbiterm/src/fbiterm.c-dist	2004-04-01 15:37:49.000000000 +0200
+++ unix/fbiterm/src/fbiterm.c	2004-04-02 13:08:32.023077503 +0200
@@ -51,11 +51,12 @@ catchSignal ()
 static void
 iterm_usage (void)
 {
-  fprintf (stdout, "Usage: iterm [ -a <fontfile> ] [ -m <fontfile> ] [ -v ]\n\
+  fprintf (stdout, "Usage: fbiterm [-a <fontfile>] [-m <fontfile>] [-v] [-s <fontsize>] [cmds...]\n\
 \n\
 options:\n\
   -a <fontfile>\tascii text font\n\
   -m <fontfile>\tunicode text font\n\
+  -s\t\tspecify the font size (12,14,16,24)\n\
   -v\t\tprint version information and exit\n\
   -h\t\tthis help message\n");
 
@@ -67,6 +68,8 @@ main (int argc, char *argv[])
 {
   unsigned char buf[BUFSIZ + 1], *ascfontname, *mbfontname;
   int i;
+  int fontsize = 0;
+  char **prog_args;
 
   setlocale (LC_ALL, "");
 
@@ -90,23 +93,23 @@ main (int argc, char *argv[])
       exit (1);
     }
 
-  ascfontname = DefaultAsc;
-  mbfontname = DefaultMB;
-  while ((i = getopt (argc, argv, "a:m:hv")) != EOF)
+  ascfontname = NULL;
+  mbfontname = NULL;
+  while ((i = getopt (argc, argv, "a:m:hvs:")) != EOF)
     switch (i)
       {
       case 'a':
 	if (optarg != NULL)
 	  ascfontname = optarg;
 	else
-	  ascfontname = DefaultAsc;
+	  ascfontname = NULL;
 	break;
 
       case 'm':
 	if (optarg != NULL)
 	  mbfontname = optarg;
 	else
-	  mbfontname = DefaultMB;
+	  mbfontname = NULL;
 	break;
 
       case 'v':
@@ -114,18 +117,37 @@ main (int argc, char *argv[])
 	exit (0);
 	break;
 
+      case 's':
+	fontsize = atoi(optarg);
+	break;
+
       case 'h':
       default:
 	iterm_usage ();
 	break;
       }
 
-  if (optind < argc)
-    iterm_usage ();
+  prog_args = NULL;
+  if (optind < argc) {
+	  int i, j, num_args = argc - optind;
+	  prog_args = malloc(sizeof(char*) * (num_args + 1));
+	  if (! prog_args) {
+		  fprintf(stderr, "can't malloc args\n");
+		  exit(1);
+	  }
+	  for (i = 0, j = optind; j < argc; i++, j++)
+		  prog_args[i] = argv[j];
+	  prog_args[i] = NULL;
+  }
 
   /* initialize font/framebuffer/terminal/VT/input */
-  if (InitFont (ascfontname, mbfontname) < 0)
-    exitFbiterm (FONT_ERROR_EXIT);
+  if (fontsize) {
+    if (InitFontWithSize (fontsize) < 0)
+      exitFbiterm (FONT_ERROR_EXIT);
+  } else {
+    if (InitFont (ascfontname, mbfontname) < 0)
+      exitFbiterm (FONT_ERROR_EXIT);
+  }
 
   if (InitTerm () < 0)
     exitFbiterm (TERM_ERROR_EXIT);
@@ -135,7 +157,7 @@ main (int argc, char *argv[])
     exitFbiterm (FB_ERROR_EXIT);
   pIterm->fbInitialized = 1;
   
-  if (InitVt () < 0)
+  if (InitVt (prog_args) < 0)
     exitFbiterm (VT_ERROR_EXIT);
 
   if (InitInput () < 0)
--- unix/fbiterm/src/fbiterm.h-dist	2004-04-01 17:09:59.294149629 +0200
+++ unix/fbiterm/src/fbiterm.h	2004-04-01 19:37:44.106428870 +0200
@@ -53,10 +53,6 @@
 #define FB_ENV    "FRAMEBUFFER"
 #define FB_DEFDEV "/dev/fb0"
 
-#define DefaultAsc	"/usr/lib/X11/fonts/misc/8x16.pcf.gz"
-#define DefaultMB	"/usr/lib/X11/fonts/misc/unifont.pcf.gz"
-#define DefaultFont	"/usr/local/share/iterm/fonts/8x16.pcf.gz"
-
 enum ITERM_RETCODE
 {
   ITERM_REPLACEFONT = 1,
@@ -89,6 +85,8 @@ typedef struct _TermFont
   FontRec *frec;		/* FontRec structure (defined by X11) */
   int cell_width;		/* cell width per character */
   int cell_height;		/* cell height per character */
+  int ascent;
+  int descent;
 }
 TermFont;
 
@@ -137,9 +135,10 @@ Iterm;
 
 /* function prototypes */
 int InitFont (char *ascfont, char *mbfont);
+int InitFontWithSize (int fontsize);
 int InitFb ();
 int InitTerm ();
-int InitVt ();
+int InitVt (char **prog_args);
 int InitInput (void);
 void exitFbiterm (int exitcode);
 
@@ -193,7 +192,8 @@ extern void VTCore_set_direction ();
 extern int
 wcwidth (wint_t __c)
   __THROW;
-     extern unsigned char *get_glyph ();
+// extern unsigned char *get_glyph ();
+     extern unsigned char *get_glyph2 ();
      extern Iterm *pIterm;
 
 #endif /* __ITERM_H__ */
--- unix/fbiterm/src/fb_true8.c-dist	2004-04-01 17:29:15.207340311 +0200
+++ unix/fbiterm/src/fb_true8.c	2004-04-01 19:38:11.825162859 +0200
@@ -84,23 +84,37 @@ fb_true8_set_rendition (int bold, int bl
 
 void
 fb_true8_draw_char (unsigned char *dst, int offset,
-		    unsigned char *bits, int width, int height)
+		    unsigned char *bits, int cell_width,
+		    const xCharInfo *info,
+		    const TermFont *base)
 {
   int x, y;
+  int height;
+  unsigned char *dst8;
 
+  height = (int)base->ascent - (int)info->ascent;
+  for (y = 0; y < height; y++) {
+    dst8 = (unsigned char *) (dst + offset);
+    for (x = 0; x < cell_width; x++)
+      *dst8++ = (char) bgcmap;
+    dst += pIterm->fb->line_length;
+  }
+
+  height = info->ascent + info->descent;
   for (y = 0; y < height; y++)
     {
-      unsigned long c1, c2, c3, c4, c, cc;
+      unsigned int c1, c2, c3, c4, c, cc;
       c1 = (*bits++ & 0x000000ff);
       c2 = (*bits++ & 0x000000ff);
       c3 = (*bits++ & 0x000000ff);
       c4 = (*bits++ & 0x000000ff);
       c = cc = (c1 << 24) + (c2 << 16) + (c3 << 8) + c4;
-      for (x = 0; x < width; x++)
+      dst8 = (unsigned char *) (dst + offset);
+      for (x = 0; x < info->leftSideBearing; x++) {
+	*dst8++ = (char) bgcmap;
+      }
+      for (; x < info->rightSideBearing; x++, dst8++)
 	{
-	  unsigned char *dst8;
-	  dst8 = (unsigned char *) (dst + offset + x);
-
 	  if (pIterm->underline && (height - y < 2))
 	    *(dst8) = fgcmap;
 	  else
@@ -122,8 +136,17 @@ fb_true8_draw_char (unsigned char *dst, 
 	    }
 	  c <<= 1;
 	}
+      for (; x < cell_width; x++)
+	*dst8++ = (char) bgcmap;
       dst += pIterm->fb->line_length;
     }
+  height = base->descent - info->descent;
+  for (y = 0; y < height; y++) {
+    dst8 = (unsigned char *) (dst + offset);
+    for (x = 0; x < cell_width; x++)
+      *dst8++ = (char) bgcmap;
+    dst += pIterm->fb->line_length;
+  }
   return;
 }
 
@@ -135,6 +158,8 @@ fb_true8_draw_text (int col, int row, ch
   unsigned char *bits;
   char *dst;
   mbstate_t ps;
+  const xCharInfo *cinfo;
+  const TermFont *base;
 
   if (pIterm->lock)
     return;
@@ -172,21 +197,25 @@ fb_true8_draw_text (int col, int row, ch
 	  if (len == 1 && mbstring[i] < 0x7f)
 	    {
 	      codepoint = (int) (mbstring[i] & 0x000000ff);
-	      bits = get_glyph (pIterm->asc_font, codepoint, &height);
+	      base = pIterm->asc_font;
+	      bits = get_glyph2 (pIterm->asc_font, codepoint, &height, &cinfo);
 	      w = pIterm->asc_font->cell_width;
 	    }
 	  else
 	    {
 	      mbrtowc (&wc, (char *) &mbstring[i], len, 0);
-	      bits = get_glyph (pIterm->mb_font, wc, &height);
+	      base = pIterm->mb_font;
+	      bits = get_glyph2 (pIterm->mb_font, wc, &height, &cinfo);
 	      wlen = wcwidth (wc);
 	      w = pIterm->asc_font->cell_width * (wlen > 0 ? wlen : 1);
 	    }
 	}
+      else
+	      break;
 
       i += len;
       dst = (char *) (pIterm->fb->buf + starty);
-      fb_true8_draw_char (dst, startx, bits, w, height);
+      fb_true8_draw_char (dst, startx, bits, w, cinfo, base);
       startx += w;
     }
   return;
--- unix/fbiterm/src/font_stubs.c-dist	2004-04-01 17:28:58.374150309 +0200
+++ unix/fbiterm/src/font_stubs.c	2004-04-01 17:29:03.051091740 +0200
@@ -22,14 +22,6 @@ init_fs_handlers ()
 {
 }
 void
-ceil ()
-{
-}
-void
-floor ()
-{
-}
-void
 ClientSignal ()
 {
 }
--- unix/fbiterm/src/fb_true32.c-dist	2004-04-01 19:33:49.233517488 +0200
+++ unix/fbiterm/src/fb_true32.c	2004-04-01 19:37:34.718551031 +0200
@@ -96,22 +96,37 @@ fb_true32_set_rendition (int bold, int b
 
 void
 fb_true32_draw_char (unsigned char *dst, int offset,
-		     unsigned char *bits, int width, int height)
+		     unsigned char *bits, int cell_width,
+		     const xCharInfo *info,
+		     const TermFont *base)
 {
   int x, y;
+  int height;
+  unsigned int *dst32;
+
+  height = (int)base->ascent - (int)info->ascent;
+  for (y = 0; y < height; y++) {
+    dst32 = (unsigned int *) (dst + offset);
+    for (x = 0; x < cell_width; x++)
+      *dst32++ = bgcmap;
+    dst += pIterm->fb->line_length;
+  }
+
+  height = (int)info->ascent + (int)info->descent;
   for (y = 0; y < height; y++)
     {
-      unsigned long c1, c2, c3, c4, c, cc;
+      unsigned int c1, c2, c3, c4, c, cc;
       c1 = (*bits++ & 0x000000ff);
       c2 = (*bits++ & 0x000000ff);
       c3 = (*bits++ & 0x000000ff);
       c4 = (*bits++ & 0x000000ff);
       c = cc = (c1 << 24) + (c2 << 16) + (c3 << 8) + c4;
-      for (x = 0; x < width; x++)
+      dst32 = (unsigned int *) (dst + offset);
+      for (x = 0; x < info->leftSideBearing; x++) {
+	*dst32++ = bgcmap;
+      }
+      for (; x < info->rightSideBearing; x++, dst32++)
 	{
-	  unsigned int *dst32;
-	  dst32 = (unsigned int *) (dst + offset + 4 * x);
-
 	  if ((pIterm->underline || pIterm->blink) && (height - y < 2))
 	    *(dst32) = fgcmap;
 	  else
@@ -135,8 +150,17 @@ fb_true32_draw_char (unsigned char *dst,
 	    }
 	  c <<= 1;
 	}
+      for (; x < cell_width; x++)
+	*dst32++ = bgcmap;
       dst += pIterm->fb->line_length;
     }
+  height = (int)base->descent - (int)info->descent;
+  for (y = 0; y < height; y++) {
+    dst32 = (unsigned int *) (dst + offset);
+    for (x = 0; x < cell_width; x++)
+      *dst32++ = bgcmap;
+    dst += pIterm->fb->line_length;
+  }
   return;
 }
 
@@ -148,6 +172,8 @@ fb_true32_draw_text (int col, int row, c
   unsigned char *bits;
   char *dst;
   mbstate_t ps;
+  const xCharInfo *cinfo;
+  const TermFont *base;
 
   if (pIterm->lock)
     return;
@@ -185,21 +211,25 @@ fb_true32_draw_text (int col, int row, c
 	  if (len == 1 && mbstring[i] < 0x7f)
 	    {
 	      codepoint = (int) (mbstring[i] & 0x000000ff);
-	      bits = get_glyph (pIterm->asc_font, codepoint, &height);
+	      base = pIterm->asc_font;
+	      bits = get_glyph2 (pIterm->asc_font, codepoint, &height, &cinfo);
 	      w = pIterm->asc_font->cell_width;
 	    }
 	  else
 	    {
 	      mbrtowc (&wc, (char *) &mbstring[i], len, 0);
-	      bits = get_glyph (pIterm->mb_font, wc, &height);
+	      base = pIterm->mb_font;
+	      bits = get_glyph2 (pIterm->mb_font, wc, &height, &cinfo);
 	      wlen = wcwidth (wc);
 	      w = pIterm->asc_font->cell_width * (wlen > 0 ? wlen : 1);
 	    }
 	}
+      else
+	break;
 
       i += len;
       dst = (char *) (pIterm->fb->buf + starty);
-      fb_true32_draw_char (dst, startx, bits, w, height);
+      fb_true32_draw_char (dst, startx, bits, w, cinfo, base);
       startx += (4 * w);
     }
   return;
--- unix/fbiterm/src/font.c-dist	2004-04-01 16:41:37.508753260 +0200
+++ unix/fbiterm/src/font.c	2004-04-01 19:39:57.556260303 +0200
@@ -114,14 +114,14 @@ get_glyph_codepoint (TermFont * fs, int 
 }
 
 unsigned char *
-get_glyph (TermFont * fs, int codepoint, unsigned int *height)
+get_glyph2 (TermFont * fs, int codepoint, unsigned int *height, const xCharInfo **metricp)
 {
   unsigned short firstCol, lastCol, firstRow, lastRow;
   unsigned short col, row, numCols, numRows;
   unsigned int can_num, codep;
   int r, c, n;
   unsigned char *bits;
-  xCharInfo *metric;
+  const xCharInfo *metric;
 
   BitmapFontPtr bp = (BitmapFontPtr) (fs->frec->fontPrivate);
   CharInfoPtr cp = (CharInfoPtr) (bp->metrics);
@@ -139,6 +139,7 @@ get_glyph (TermFont * fs, int codepoint,
   bits = dp->bits;
   metric = &(dp->metrics);
   *height = (metric->ascent + metric->descent);
+  *metricp = metric;
 
   can_num = codep = get_glyph_codepoint (fs, codepoint);
 
@@ -160,14 +161,28 @@ get_glyph (TermFont * fs, int codepoint,
 	      bits = cp[n].bits;
 	      metric = &(cp[n].metrics);
 	      *height = (metric->ascent + metric->descent);
+	      *metricp = metric;
 	    }
 	  return bits;
 	}
     }
+#if 0
+  fprintf(stderr, "code:%x, left=%d,right=%d,wid=%d,asc=%d,dsc=%d\n",
+	  codepoint, metric->leftSideBearing, metric->rightSideBearing, metric->characterWidth, metric->ascent, metric->descent);
+#endif
 
   return bits;
 }
 
+#if 0
+unsigned char *
+get_glyph (TermFont * fs, int codepoint, unsigned int *height)
+{
+  xCharInfo *dummy;
+  return get_glyph2(fs, codepoint, height, &dummy);
+}
+#endif
+
 /* load font */
 TermFont *
 load_font (char *input_filename)
@@ -228,6 +243,8 @@ load_font (char *input_filename)
   pFs->cell_width = font->info.maxbounds.characterWidth;
   pFs->cell_height =
     font->info.maxbounds.ascent + font->info.maxbounds.descent;
+  pFs->ascent = font->info.maxbounds.ascent;
+  pFs->descent = font->info.maxbounds.descent;
 
 #ifdef STRICT_DEF
   /* check terminal font */
@@ -265,9 +282,113 @@ load_font (char *input_filename)
   return pFs;
 }
 
+static char *ascii_fonts10[] = {
+  "/usr/share/fonts/misc/h10.pcf.gz",
+  "/usr/lib/X11/fonts/misc/h10.pcf.gz",
+  NULL
+};
+static char *mb_fonts10[] = {
+  "/usr/share/fonts/misc/b10.pcf.gz",
+  "/usr/share/fonts/misc/f10.pcf.gz",
+  "/usr/lib/X11/fonts/misc/b10.pcf.gz",
+  "/usr/lib/X11/fonts/misc/f10.pcf.gz",
+  NULL
+};
+
+static char *ascii_fonts12[] = {
+  "/usr/share/fonts/misc/6x12.pcf.gz",
+  "/usr/share/fonts/misc/h12.pcf.gz",
+  "/usr/lib/X11/fonts/misc/6x12.pcf.gz",
+  "/usr/lib/X11/fonts/misc/h12.pcf.gz",
+  NULL
+};
+static char *mb_fonts12[] = {
+  "/usr/share/fonts/misc/b12.pcf.gz",
+  "/usr/share/fonts/misc/f12.pcf.gz",
+  "/usr/lib/X11/fonts/misc/b12.pcf.gz",
+  "/usr/lib/X11/fonts/misc/f12.pcf.gz",
+  NULL
+};
+
+static char *ascii_fonts14[] = {
+  "/usr/share/fonts/misc/7x14.pcf.gz",
+  "/usr/share/fonts/misc/h14.pcf.gz",
+  "/usr/lib/X11/fonts/misc/7x14.pcf.gz",
+  "/usr/lib/X11/fonts/misc/h14.pcf.gz",
+  NULL
+};
+static char *mb_fonts14[] = {
+  "/usr/share/fonts/misc/b14.pcf.gz",
+  "/usr/share/fonts/misc/f14.pcf.gz",
+  "/usr/lib/X11/fonts/misc/b14.pcf.gz",
+  "/usr/lib/X11/fonts/misc/f14.pcf.gz",
+  NULL
+};
+
+static char *ascii_fonts16[] = {
+  "/usr/share/fonts/misc/8x16.pcf.gz",
+  "/usr/share/fonts/misc/h16.pcf.gz",
+  "/usr/lib/X11/fonts/misc/8x16.pcf.gz",
+  "/usr/lib/X11/fonts/misc/h16.pcf.gz",
+  "/usr/share/fbiterm/fonts/8x16.pcf.gz",
+  NULL
+};
+static char *mb_fonts16[] = {
+  "/usr/share/fonts/misc/unifont.pcf.gz",
+  "/usr/share/fonts/misc/b16.pcf.gz",
+  "/usr/share/fonts/misc/f16.pcf.gz",
+  "/usr/lib/X11/fonts/misc/unifont.pcf.gz",
+  "/usr/lib/X11/fonts/misc/b16.pcf.gz",
+  "/usr/lib/X11/fonts/misc/f16.pcf.gz",
+  "/usr/share/fbiterm/fonts/b16.pcf.gz",
+  NULL
+};
+
+static char *ascii_fonts24[] = {
+  "/usr/share/fonts/misc/12x24.pcf.gz",
+  "/usr/share/fonts/misc/h24.pcf.gz",
+  "/usr/lib/X11/fonts/misc/12x24.pcf.gz",
+  "/usr/lib/X11/fonts/misc/h24.pcf.gz",
+  NULL
+};
+static char *mb_fonts24[] = {
+  "/usr/share/fonts/misc/b24.pcf.gz",
+  "/usr/share/fonts/misc/f24.pcf.gz",
+  "/usr/lib/X11/fonts/misc/b24.pcf.gz",
+  "/usr/lib/X11/fonts/misc/f24.pcf.gz",
+  NULL
+};
+
+struct font_list {
+  int size;
+  char **ascii_fonts;
+  char **mb_fonts;
+};
+
+static struct font_list font_lists[] = {
+  { 10, ascii_fonts10, mb_fonts10 },
+  { 12, ascii_fonts12, mb_fonts12 },
+  { 14, ascii_fonts14, mb_fonts14 },
+  { 16, ascii_fonts16, mb_fonts16 },
+  { 24, ascii_fonts24, mb_fonts24 },
+  { 0, },
+};
+
+
+static char *search_font(char **list)
+{
+  struct stat sbuf;
+  for (; *list; list++) {
+    if (! stat(*list, &sbuf))
+      return *list;
+  }
+  return NULL;
+}
+
 /* Load X font */
-int
-InitFont (char *ascfontfile, char *mbfontfile)
+static int
+do_init_font(char *ascfontfile, char *mbfontfile,
+	     char **ascii_fonts, char **mb_fonts)
 {
   struct stat sbuf;
   int rc = 0;
@@ -275,32 +374,24 @@ InitFont (char *ascfontfile, char *mbfon
   char *mbfname = mbfontfile;
 
   /* check mbfont first */
-  if (stat (mbfname, &sbuf) < 0)
-    {
-      if (stat (DefaultMB, &sbuf) < 0)
-	{
-	  if (stat (DefaultAsc, &sbuf) < 0)
-	    {
-	      if (stat (DefaultFont, &sbuf) < 0)
-		{
-		  fprintf (stderr, "font file not found.\n");
-		  return -1;
-		}
-	      else
-		{
-		  mbfname = DefaultFont;
-		  rc |= ITERM_REPLACEFONT;
-		}
-	    }
-	  else
-	    {
-	      mbfname = DefaultAsc;
-	      rc |= ITERM_REPLACEFONT;
-	    }
-	}
-      else
-	mbfname = DefaultMB;
+  if (! mbfname || stat (mbfname, &sbuf) < 0) {
+    mbfname = search_font(mb_fonts);
+    if (! mbfname) {
+      mbfname = search_font(ascii_fonts);
+      if (! mbfname) {
+	fprintf (stderr, "font file not found.\n");
+	return -1;
+      }
+      rc |= ITERM_REPLACEFONT;
     }
+  }
+  if (! ascfname || stat (ascfname, &sbuf) < 0) {
+    ascfname = search_font(ascii_fonts);
+    if (! ascfname) {
+	fprintf (stderr, "font file not found.\n");
+	return -1;
+      }
+  }
 
   pIterm->mb_font = (TermFont *) load_font (mbfname);
   if (pIterm->mb_font == NULL)
@@ -309,23 +400,6 @@ InitFont (char *ascfontfile, char *mbfon
       return -1;
     }
 
-  /* check ascii font */
-  if (stat (ascfname, &sbuf) < 0)
-    {
-      if (stat (DefaultAsc, &sbuf) < 0)
-	{
-	  if (stat (DefaultFont, &sbuf) < 0)
-	    {
-	      fprintf (stderr, "ascii font file not found.\n");
-	      return -1;
-	    }
-	  else
-	    ascfname = DefaultFont;
-	}
-      else
-	ascfname = DefaultAsc;
-    }
-
   if (!strcmp (ascfname, mbfname))
     pIterm->asc_font = pIterm->mb_font;
   else
@@ -365,3 +439,26 @@ InitFont (char *ascfontfile, char *mbfon
     max (pIterm->asc_font->cell_height, pIterm->mb_font->cell_height);
   return rc;
 }
+
+/*
+ */
+
+int
+InitFont (char *ascfontfile, char *mbfontfile)
+{
+  /* choose 16pixel fonts */
+  return do_init_font(ascfontfile, mbfontfile, ascii_fonts16, mb_fonts16);
+}
+
+int
+InitFontWithSize (int fontsize)
+{
+  struct font_list *l;
+
+  for (l = font_lists; l->size; l++) {
+    if (l->size == fontsize)
+      return do_init_font(NULL, NULL, l->ascii_fonts, l->mb_fonts);
+  }
+  fprintf (stderr, "no matching font size found.\n");
+  return -1;
+}
--- unix/fbiterm/src/fb_true16.c-dist	2004-04-01 17:29:39.349875880 +0200
+++ unix/fbiterm/src/fb_true16.c	2004-04-01 19:35:58.979192273 +0200
@@ -94,22 +94,37 @@ fb_true16_set_rendition (int bold, int b
 
 void
 fb_true16_draw_char (unsigned char *dst, int offset,
-		     unsigned char *bits, int width, int height)
+		    unsigned char *bits, int cell_width,
+		    const xCharInfo *info,
+		    const TermFont *base)
 {
   int x, y;
+  int height;
+  unsigned short *dst16;
+
+  height = (int)base->ascent - (int)info->ascent;
+  for (y = 0; y < height; y++) {
+    dst16 = (unsigned short *) (dst + offset);
+    for (x = 0; x < cell_width; x++)
+      *dst16++ = bgcmap;
+    dst += pIterm->fb->line_length;
+  }
+
+  height = (int)info->ascent + (int)info->descent;
   for (y = 0; y < height; y++)
     {
-      unsigned long c1, c2, c3, c4, c, cc;
+      unsigned int c1, c2, c3, c4, c, cc;
       c1 = (*bits++ & 0x000000ff);
       c2 = (*bits++ & 0x000000ff);
       c3 = (*bits++ & 0x000000ff);
       c4 = (*bits++ & 0x000000ff);
       c = cc = (c1 << 24) + (c2 << 16) + (c3 << 8) + c4;
-      for (x = 0; x < width; x++)
+      dst16 = (unsigned short *) (dst + offset);
+      for (x = 0; x < info->leftSideBearing; x++) {
+	*dst16++ = bgcmap;
+      }
+      for (; x < info->rightSideBearing; x++, dst16++)
 	{
-	  unsigned short *dst16;
-	  dst16 = (unsigned short *) (dst + offset + 2 * x);
-
 	  if ((pIterm->underline || pIterm->blink) && (height - y < 2))
 	    *(dst16) = fgcmap;
 	  else
@@ -133,8 +148,17 @@ fb_true16_draw_char (unsigned char *dst,
 	    }
 	  c <<= 1;
 	}
+      for (; x < cell_width; x++)
+	*dst16++ = bgcmap;
       dst += pIterm->fb->line_length;
     }
+  height = (int)base->descent - (int)info->descent;
+  for (y = 0; y < height; y++) {
+    dst16 = (unsigned short *) (dst + offset);
+    for (x = 0; x < cell_width; x++)
+      *dst16++ = bgcmap;
+    dst += pIterm->fb->line_length;
+  }
   return;
 }
 
@@ -146,6 +170,8 @@ fb_true16_draw_text (int col, int row, c
   unsigned char *bits;
   char *dst;
   mbstate_t ps;
+  const xCharInfo *cinfo;
+  const TermFont *base;
 
   if (pIterm->lock)
     return;
@@ -183,21 +209,25 @@ fb_true16_draw_text (int col, int row, c
 	  if (len == 1 && mbstring[i] < 0x7f)
 	    {
 	      codepoint = (int) (mbstring[i] & 0x000000ff);
-	      bits = get_glyph (pIterm->asc_font, codepoint, &height);
+	      base = pIterm->asc_font;
+	      bits = get_glyph2 (pIterm->asc_font, codepoint, &height, &cinfo);
 	      w = pIterm->asc_font->cell_width;
 	    }
 	  else
 	    {
 	      mbrtowc (&wc, (char *) &mbstring[i], len, 0);
-	      bits = get_glyph (pIterm->mb_font, wc, &height);
+	      base = pIterm->mb_font;
+	      bits = get_glyph2 (pIterm->mb_font, wc, &height, &cinfo);
 	      wlen = wcwidth (wc);
 	      w = pIterm->asc_font->cell_width * (wlen > 0 ? wlen : 1);
 	    }
 	}
+      else
+	      break;
 
       i += len;
       dst = (char *) (pIterm->fb->buf + starty);
-      fb_true16_draw_char (dst, startx, bits, w, height);
+      fb_true16_draw_char (dst, startx, bits, w, cinfo, base);
       startx += (2 * w);
     }
   return;
--- unix/fbiterm/src/vt.c-dist	2004-04-01 15:45:10.948683658 +0200
+++ unix/fbiterm/src/vt.c	2004-04-01 16:15:54.931946454 +0200
@@ -14,13 +14,17 @@
 
 /* Initialize Terminal IO */
 static TerminalIO *
-init_io ()
+init_io ( char **program_args )
 {
-  char *defaultShell = "/bin/sh";
   char *shell;
-  char *program[] = { defaultShell, NULL };
+  char *program[] = { "/bin/sh", NULL };
 
   putenv ("TERM=iterm");
+  if (program_args) {
+	  return (TerminalIO *) TtyTerminalIO_new (pIterm->cols, pIterm->rows,
+						   program_args[0], program_args);
+  }
+
   shell = getenv ("SHELL");
   if (shell != NULL && shell[0] != '\0')
     program[0] = shell;
@@ -31,7 +35,7 @@ init_io ()
 
 /* Initialize VT machine */
 int
-InitVt ()
+InitVt (char **prog_args)
 {
   /* create screen view object */
   pIterm->view = VTScreenView_new ();
@@ -43,7 +47,7 @@ InitVt ()
 
   /* create terminal IO object */
   ioctl (0, TIOCSCTTY, 0);
-  pIterm->tio = init_io (pIterm);
+  pIterm->tio = init_io (prog_args);
   if (pIterm->tio == NULL)
     {
       fprintf (stderr, "init_io() failed.\n");
--- /dev/null	2004-03-28 01:27:57.000000000 +0100
+++ unix/fbiterm/README.SuSE	2004-04-01 19:51:56.850602203 +0200
@@ -0,0 +1,8 @@
+this version of fbiterm is enhanced to support the following features:
+
+- run a given command from the command line argument directly and quits
+- specify the font size with -s option (10,12,14,16,24 pixels)
+- automatic search of supported fonts
+- showing GNU unifonts correctly
+
+as default, 16bit font is used.