*** empty log message ***
[m17n/m17n-lib.git] / src / m17n-gui.c
index 06413f7..5903bf5 100644 (file)
@@ -1,5 +1,5 @@
 /* m17n-gui.c -- body of the GUI API.
-   Copyright (C) 2003, 2004
+   Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
      National Institute of Advanced Industrial Science and Technology (AIST)
      Registration Number H15PRO112
 
@@ -17,7 +17,7 @@
 
    You should have received a copy of the GNU Lesser General Public
    License along with the m17n library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
    02111-1307, USA.  */
 
 /***en
     @addtogroup m17nGUI
     @brief ¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¾å¤Î GUI ¥µ¥Ý¡¼¥È.
 
-    ¤³¤Î¥»¥¯¥·¥ç¥ó¤Ï¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¤Î¤â¤È¤Ç¤Î M-text ¤Îɽ¼¨¤ÈÆþÎϤË
-    ¤«¤«¤ï¤ë m17n GUI API ¤òÄêµÁ¤¹¤ë¡£
+    ¤³¤Î¥»¥¯¥·¥ç¥ó¤Ï¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¤Î¤â¤È¤Ç¤Î M-text ¤Îɽ¼¨¤ÈÆþÎϤˤ«¤«¤ï¤ë
+    m17n GUI API ¤òÄêµÁ¤¹¤ë¡£
 
-    ¤³¤³¤Ç¤Î¤¹¤Ù¤Æ¤ÎÄêµÁ¤Ï¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¤È¤ÏÆÈΩ¤Ç¤¢¤ë¡£¤·¤«¤·¡¢¼Â
-    ºÝ¤Î¥é¥¤¥Ö¥é¥ê¥Õ¥¡¥¤¥ë¤Ï¸ÄÊ̤Υ¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¤Ë°Í¸¤¹¤ë¾ì¹ç¤¬¤¢
-    ¤ë¡£¤¿¤È¤¨¤Ð¥é¥¤¥Ö¥é¥ê¥Õ¥¡¥¤¥ë m17n-X.so ¤Ï¡¢m17n GUI API ¤Î X ¥¦¥£
-    ¥ó¥É¥¦ÍѤμÂÁõÎã¤Ç¤¢¤ë¡£
+    ¤³¤³¤Ç¤Î¤¹¤Ù¤Æ¤ÎÄêµÁ¤Ï¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¤È¤ÏÆÈΩ¤Ç¤¢¤ë¡£
+    ¤·¤«¤·¡¢¼ÂºÝ¤Î¥é¥¤¥Ö¥é¥ê¥Õ¥¡¥¤¥ë¤Ï¸ÄÊ̤Υ¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¤Ë°Í¸¤¹¤ë¾ì¹ç¤¬¤¢¤ë¡£
+    ¤¿¤È¤¨¤Ð¥é¥¤¥Ö¥é¥ê¥Õ¥¡¥¤¥ë m17n-X.so ¤Ï¡¢m17n GUI API ¤Î X 
+    ¥¦¥£¥ó¥É¥¦ÍѤμÂÁõÎã¤Ç¤¢¤ë¡£
 
     ¸½¼Â¤Ë¤Ï¡¢GUI API ¤Ï¼ç¤Ë¥Ä¡¼¥ë¥­¥Ã¥È¥é¥¤¥Ö¥é¥ê¸þ¤±¤Ç¤¢¤ë¤«¡¢¤Þ¤¿¤Ï 
-    XOM ¤ò¼ÂÁõ¤¹¤ë¤¿¤á¤ËÍѤ¤¤é¤ì¤Æ¤ª¤ê¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤«¤é
-    ¤ÎľÀܤÎÍøÍѤòǰƬ¤Ë¤ª¤¤¤¿¤â¤Î¤Ç¤Ï¤Ê¤¤¡£
+    XOM ¤ò¼ÂÁõ¤¹¤ë¤¿¤á¤ËÍѤ¤¤é¤ì¤Æ¤ª¤ê¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤«¤é¤ÎľÀܤÎÍøÍѤòǰƬ¤Ë¤ª¤¤¤¿¤â¤Î¤Ç¤Ï¤Ê¤¤¡£
 */
 
 /*=*/
@@ -79,8 +78,6 @@
 #include "fontset.h"
 #include "face.h"
 
-static int win_initialized;
-
 #ifndef DLOPEN_SHLIB_EXT
 #define DLOPEN_SHLIB_EXT ".so"
 #endif
@@ -91,12 +88,12 @@ typedef struct
 {
   /** Name of the dynamic library (e.g. "libm17n-X.so").  */
   char *library;
-  /** Handle fo the dynamic library.  */
+  /** Handle of the dynamic library.  */
   void *handle;
   /** Function to call just after loading the library.  */
   int (*init) ();
   /** Function to call to open a frame on the graphic device.  */
-  void *(*open) (MFrame *frame, MPlist *param);
+  int (*open) (MFrame *frame, MPlist *param);
   /** Function to call just before unloading the library.  */
   int (*fini) ();
 } MDeviceLibraryInterface;
@@ -106,7 +103,6 @@ typedef struct
 
 static MPlist *device_library_list;
 
-
 /** Close MFrame and free it.  */
 
 static void
@@ -116,7 +112,6 @@ free_frame (void *object)
 
   (*frame->driver->close) (frame);
   M17N_OBJECT_UNREF (frame->face);
-  free (frame->font);
   M17N_OBJECT_UNREF (frame->font_driver_list);
   free (object);
 }
@@ -130,9 +125,11 @@ register_device_library (MSymbol name, char *lib)
   MDeviceLibraryInterface *interface;
 
   MSTRUCT_CALLOC (interface, MERROR_WIN);
-  interface->library = malloc (strlen (lib) 
+  interface->library = malloc (strlen (M17N_MODULE_DIR) + 1
+                              + strlen (lib) 
                               + strlen (DLOPEN_SHLIB_EXT) + 1);
-  sprintf (interface->library, "%s%s", lib, DLOPEN_SHLIB_EXT);
+  sprintf (interface->library, "%s/%s%s", M17N_MODULE_DIR, lib,
+          DLOPEN_SHLIB_EXT);
   if (! device_library_list)
     device_library_list = mplist ();
   mplist_add (device_library_list, name, interface);
@@ -154,19 +151,19 @@ null_device_close (MFrame *frame)
 {
 }
 
-void *
+static void *
 null_device_get_prop (MFrame *frame, MSymbol key)
 {
   return NULL;
 }
 
-void
+static void
 null_device_realize_face (MRealizedFace *rface)
 {
   rface->info = NULL;
 }
 
-void
+static void
 null_device_free_realized_face (MRealizedFace *rface)
 {
 }
@@ -201,18 +198,22 @@ null_device_fini ()
     mface__free_realized ((MRealizedFace *) MPLIST_VAL (plist));
   M17N_OBJECT_UNREF (null_device.realized_face_list);
 
-  MPLIST_DO (plist, null_device.realized_font_list)
-    mfont__free_realized ((MRealizedFont *) MPLIST_VAL (plist));
+  if (MPLIST_VAL (null_device.realized_font_list))
+    mfont__free_realized (MPLIST_VAL (null_device.realized_font_list));
   M17N_OBJECT_UNREF (null_device.realized_font_list);
   return 0;
 }
 
-static void *
+static int
 null_device_open (MFrame *frame, MPlist *param)
 {
   MFace *face;
 
+  frame->device = NULL;
   frame->device_type = 0;
+  frame->dpi = (int) mplist_get (param, Mresolution);
+  if (frame->dpi == 0)
+    frame->dpi = 100;
   frame->driver = &null_driver;
   frame->font_driver_list = mplist ();
   mplist_add (frame->font_driver_list, Mfreetype, &mfont__ft_driver);
@@ -222,7 +223,7 @@ null_device_open (MFrame *frame, MPlist *param)
   face = mface_copy (mface__default);
   mplist_push (param, Mface, face);
   M17N_OBJECT_UNREF (face);
-  return &null_device;
+  return 0;
 }
 
 static MDeviceLibraryInterface null_interface =
@@ -232,31 +233,29 @@ static MDeviceLibraryInterface null_interface =
 \f
 /* Internal API */
 
-MSymbol Mfreetype;
-
-/*** @} */ 
-#endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
-
 \f
 /* External API */
 
 void
 m17n_init_win (void)
 {
-  int mdebug_mask = MDEBUG_INIT;
+  int mdebug_flag = MDEBUG_INIT;
 
-  if (win_initialized++)
+  merror_code = MERROR_NONE;
+  if (m17n__gui_initialized++)
     return;
   m17n_init ();
+  m17n_init_flt ();
   if (merror_code != MERROR_NONE)
-    return;
+    {
+      m17n__gui_initialized--;
+      return;
+    }
 
   MDEBUG_PUSH_TIME ();
 
-  Mx = msymbol ("x");
   Mgd = msymbol ("gd");
 
-  Mfreetype = msymbol ("freetype");
   Mfont = msymbol ("font");
   Mfont_width = msymbol ("font-width");
   Mfont_ascent = msymbol ("font-ascent");
@@ -268,15 +267,12 @@ m17n_init_win (void)
   Mdrawable = msymbol ("drawable");
   Mdepth = msymbol ("depth");
   Mwidget = msymbol ("widget");
-
-  register_device_library (Mx, "libm17n-X");
-  register_device_library (Mgd, "libm17n-gd");
+  Mcolormap = msymbol ("colormap");
 
   MDEBUG_PUSH_TIME ();
   if (mfont__init () < 0)
     goto err;
   MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize font module."));
-  MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize win module."));
   if (mfont__fontset_init () < 0)
     goto err;
   MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize fontset module."));
@@ -291,63 +287,70 @@ m17n_init_win (void)
   MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize input-win module."));
   mframe_default = NULL;
 
+  register_device_library (Mx, "libm17n-X");
+  register_device_library (Mgd, "libm17n-gd");
+  return;
+
  err:
   MDEBUG_POP_TIME ();
   MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize the m17n GUI module."));
   MDEBUG_POP_TIME ();
-  return;
 }
 
 void
 m17n_fini_win (void)
 {
-  int mdebug_mask = MDEBUG_FINI;
+  int mdebug_flag = MDEBUG_FINI;
+  MPlist *plist;
 
-  if (win_initialized > 1)
-    win_initialized--;
-  else
+  if (m17n__gui_initialized == 0
+      || --m17n__gui_initialized > 0)
+    return;
+
+  MDEBUG_PUSH_TIME ();
+  MDEBUG_PUSH_TIME ();
+  MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize device modules."));
+  MPLIST_DO (plist, device_library_list)
     {
-      MPlist *plist;
+      MDeviceLibraryInterface *interface = MPLIST_VAL (plist);
 
-      win_initialized = 0;
-      MDEBUG_PUSH_TIME ();
-      MDEBUG_PUSH_TIME ();
-      MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize device modules."));
-      MPLIST_DO (plist, device_library_list)
+      if (interface->handle && interface->fini)
        {
-         MDeviceLibraryInterface *interface = MPLIST_VAL (plist);
-
-         if (interface->handle && interface->fini)
-           {
-             (*interface->fini) ();
-             dlclose (interface->handle);
-           }
-         free (interface->library);
-         free (interface);
+         (*interface->fini) ();
+         dlclose (interface->handle);
        }
-      M17N_OBJECT_UNREF (device_library_list);
+      free (interface->library);
+      free (interface);
+    }
 #ifdef HAVE_FREETYPE
-      if (null_interface.handle)
-       (*null_interface.fini) ();
-#endif /* not HAVE_FREETYPE */
-      MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize input-gui module."));
-      minput__win_fini ();
-      MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize draw module."));
-      mdraw__fini ();
-      MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize face module."));
-      mface__fini ();
-      MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize fontset module."));
-      mfont__fontset_fini ();
-      MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize font module."));
-      mfont__fini ();
-      mframe_default = NULL;
-      MDEBUG_POP_TIME ();
-      MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize the gui modules."));
-      MDEBUG_POP_TIME ();
+  if (null_interface.handle)
+    {
+      (*null_interface.fini) ();
+      null_interface.handle = NULL;
     }
+#endif /* not HAVE_FREETYPE */
+  M17N_OBJECT_UNREF (device_library_list);
+  minput__win_fini ();
+  MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize input-gui module."));
+  mdraw__fini ();
+  MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize draw module."));
+  mface__fini ();
+  MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize face module."));
+  mfont__fontset_fini ();
+  MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize fontset module."));
+  mfont__fini ();
+  MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize font module."));
+  mframe_default = NULL;
+  MDEBUG_POP_TIME ();
+  MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize the gui modules."));
+  MDEBUG_POP_TIME ();
+  m17n_fini_flt ();
   m17n_fini ();
 }
 
+/*** @} */ 
+#endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
+
 /*** @addtogroup m17nFrame */
 /***en
     @brief A @e frame is an object corresponding to the graphic device.
@@ -355,13 +358,12 @@ m17n_fini_win (void)
     A @e frame is an object of the type #MFrame to hold various
     information about each display/input device.  Almost all m17n GUI
     functions require a pointer to a frame as an argument.  */
-
 /***ja
     @brief @e ¥Õ¥ì¡¼¥à ¤È¤Ï¥°¥é¥Õ¥£¥Ã¥¯¥Ç¥Ð¥¤¥¹¤ËÂбþ¤¹¤ë¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ë.
 
-    @e ¥Õ¥ì¡¼¥à ¤È¤Ï #MFrame ·¿¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ê¡¢¸Ä¡¹¤Îɽ¼¨¡¿ÆþÎÏ¥Ç
-    ¥Ð¥¤¥¹¤Î¾ðÊó¤ò³ÊǼ¤¹¤ë¤¿¤á¤ËÍѤ¤¤é¤ì¤ë¡£¤Û¤È¤ó¤É¤¹¤Ù¤Æ¤Î m17n GUI
-    ´Ø¿ô¤Ï¡¢°ú¿ô¤È¤·¤Æ¥Õ¥ì¡¼¥à¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÍ׵᤹¤ë¡£  */
+    @e ¥Õ¥ì¡¼¥à ¤È¤Ï #MFrame 
+    ·¿¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ê¡¢¸Ä¡¹¤Îɽ¼¨¡¿ÆþÎϥǥХ¤¥¹¤Î¾ðÊó¤ò³ÊǼ¤¹¤ë¤¿¤á¤ËÍѤ¤¤é¤ì¤ë¡£
+    ¤Û¤È¤ó¤É¤¹¤Ù¤Æ¤Î m17n GUI´Ø¿ô¤Ï¡¢°ú¿ô¤È¤·¤Æ¥Õ¥ì¡¼¥à¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÍ׵᤹¤ë¡£  */
 
 /*** @{ */
 /*=*/
@@ -369,11 +371,11 @@ m17n_fini_win (void)
 /***en
     @name Variables: Keys of frame parameter
 
-    These are the symbols to use in a parameter to creat a frame.  See
+    These are the symbols to use in a parameter to create a frame.  See
     the function mframe () for details.
 
-    #Mdevice, #Mdisplay, #Mscreen, #Mdrawable, #Mdepth, and #Mcolormap
-    are also keys of a frame property.  */
+    @b Mdevice, @b Mdisplay, @b Mscreen, @b Mdrawable, @b Mdepth, and
+    @b Mcolormap are also keys of a frame property.  */
 
 /***ja
     @name ÊÑ¿ô¡§ ¥Õ¥ì¡¼¥à¥Ñ¥é¥á¡¼¥¿ÍÑ¥­¡¼
@@ -381,14 +383,14 @@ m17n_fini_win (void)
     ¥Õ¥ì¡¼¥à¤òÀ¸À®¤¹¤ëºÝ¤Î¥Ñ¥é¥á¡¼¥¿¤ËÍѤ¤¤ë¥·¥ó¥Ü¥ë¡£¾Ü¤·¤¯¤Ï´Ø¿ô
     mframe () ¤ÎÀâÌÀ»²¾È¡£
 
-    #Mdevice¡¢ #Mdisplay¡¢ #Mscreen¡¢ #Mdrawable¡¢ #Mdepth¡¢#Mcolormap
-    ¤Ï¥Õ¥ì¡¼¥à¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤Ç¤â¤¢¤ë¡£  */
+    @b Mdevice¡¢ @b Mdisplay¡¢ @b Mscreen¡¢ @b Mdrawable¡¢ @b Mdepth¡¢
+    @b Mcolormap ¤Ï¥Õ¥ì¡¼¥à¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤Ç¤â¤¢¤ë¡£  */
 
 /*=*/
 
 MSymbol Mdevice, Mdisplay, Mscreen, Mdrawable, Mdepth, Mcolormap, Mwidget; 
 
-MSymbol Mx, Mgd;
+MSymbol Mgd;
 
 /*=*/
 
@@ -425,14 +427,14 @@ MSymbol Mfont_descent;
 
     <ul>
 
-    <li> #Mdevice, the value must be one of #Mx, #Mgd, and #Mnil.
+    <li> @b Mdevice, the value must be one of #Mx, @b Mgd, and #Mnil.
 
     If the value is #Mx, the frame is for X Window System.  The
     argument #MDrawWindow specified together with the frame must be of
     type @c Window.  The frame is both readable and writable, thus all
     GUI functions can be used.
 
-    If the value is #Mgd, the frame is for an image object of GD
+    If the value is @b Mgd, the frame is for an image object of GD
     library.  The argument #MDrawWindow specified together with the
     frame must be of type @c gdImagePtr.  The frame is writable
     only, thus functions minput_XXX can't be used for the frame.
@@ -448,23 +450,23 @@ MSymbol Mfont_descent;
 
     </ul>
 
-    In addition, if the value of the key #Mdevice is #Mx, the
+    In addition, if the value of the key @b Mdevice is #Mx, the
     following keys are recognized.  They are to specify the root
     window and the depth of drawables that can be used with the frame.
 
     <ul>
 
-    <li> #Mdrawable, the value type must be <tt>Drawable</tt>.
+    <li> @b Mdrawable, the value type must be <tt>Drawable</tt>.
 
-    A parameter of key #Mdisplay must also be specified.  The
+    A parameter of key @b Mdisplay must also be specified.  The
     created frame can be used for drawables whose root window and
     depth are the same as those of the specified drawable on the
     specified display.
 
-    When this parameter is specified, the parameter of key #Mscreen
+    When this parameter is specified, the parameter of key @b Mscreen
     is ignored.
 
-    <li> #Mwidget, the value type must be <tt>Widget</tt>.
+    <li> @b Mwidget, the value type must be <tt>Widget</tt>.
 
     The created frame can be used for drawables whose root window and
     depth are the same as those of the specified widget.
@@ -472,33 +474,46 @@ MSymbol Mfont_descent;
     If a parameter of key #Mface is not specified, the default face
     is created from the resources of the widget.
 
-    When this parameter is specified, the parameters of key #Mdisplay,
-    #Mscreen, #Mdrawable, #Mdepth are ignored.
+    When this parameter is specified, the parameters of key @b Mdisplay,
+    @b Mscreen, @b Mdrawable, @b Mdepth are ignored.
 
-    <li> #Mdepth, the value type must be <tt>unsigned</tt>.
+    <li> @b Mdepth, the value type must be <tt>unsigned</tt>.
 
     The created frame can be used for drawables of the specified
     depth.
 
-    <li> #Mscreen, the value type must be <tt>(Screen *)</tt>.
+    <li> @b Mscreen, the value type must be <tt>(Screen *)</tt>.
 
     The created frame can be used for drawables whose root window is
     the same as the root window of the specified screen, and depth is
     the same at the default depth of the screen.
 
-    When this parameter is specified, parameter of key #Mdisplay is
+    When this parameter is specified, parameter of key @b Mdisplay is
     ignored.
 
-    <li> #Mdisplay, the value type must be <tt>(Display *)</tt>.
+    <li> @b Mdisplay, the value type must be <tt>(Display *)</tt>.
 
     The created frame can be used for drawables whose root window is
     the same as the root window for the default screen of the display,
     and depth is the same as the default depth of the screen.
 
-    <li> #Mcolormap, the value type must be <tt>(Colormap)</tt>.
+    <li> @b Mcolormap, the value type must be <tt>(Colormap)</tt>.
 
     The created frame uses the specified colormap.
 
+    <li> @b Mfont, the value must be #Mx, #Mfreetype, or #Mxft.
+
+    The created frame uses the specified font backend.  The value #Mx
+    instructs to use X core fonts, #Mfreetype to use local fonts
+    supported by FreeType fonts, and #Mxft to use local fonts via Xft
+    library.  You can specify this parameter more than once with
+    different values if you want to use multiple font backends.  This
+    is ignored if the specified font backend is not supported on the
+    device.
+    
+    When this parameter is not specified, all font backend supported
+    on the device are used.
+
     </ul>
 
     @return
@@ -511,28 +526,27 @@ MSymbol Mfont_descent;
     ´Ø¿ô mframe () ¤Ï $PLIST Ãæ¤Î¥Ñ¥é¥á¡¼¥¿¤ò»ý¤Ä¿·¤·¤¤¥Õ¥ì¡¼¥à¤òºî¤ë¡£
     $PLIST ¤Ï @c NULL ¤Ç¤âÎɤ¤¡£
 
-    $PLIST ¤Ë¸½¤ï¤ì¤ë¥­¡¼¤Î¤¦¤Á¤É¤ì¤¬Ç§¼±¤µ¤ì¤ë¤«¤Ï¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à
-    ¤Ë°Í¸¤¹¤ë¡£
+    $PLIST ¤Ë¸½¤ï¤ì¤ë¥­¡¼¤Î¤¦¤Á¤É¤ì¤¬Ç§¼±¤µ¤ì¤ë¤«¤Ï¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¤Ë°Í¸¤¹¤ë¡£
 
     °Ê²¼¤Î¥­¡¼¤Ï¾ï¤Ëǧ¼±¤µ¤ì¤ë¡£
 
     <ul>
 
-    <li> #Mdevice. ÃͤϠ#Mx, #Mgd, #Mnil ¤Î¤¤¤º¤ì¤«¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
+    <li> @b Mdevice. ÃͤϠ#Mx, @b Mgd, #Mnil ¤Î¤¤¤º¤ì¤«¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
 
-    Ãͤ¬ #Mx ¤Ê¤é¤Ð¡¢¿·¤·¤¤¥Õ¥ì¡¼¥à¤Ï X ¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥àÍѤǤ¢¤ë¡£¤³
-    ¤Î¥Õ¥ì¡¼¥à¤È¶¦¤Ë»ØÄꤵ¤ì¤¿°ú¿ô #MDrawWindow ¤Ï¡¢ @c Window ·¿¤Ç¤Ê
-    ¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¥Õ¥ì¡¼¥à¤ÏÆɤ߽ñ¤­¤È¤â¤Ë²Äǽ¤Ç¤¢¤ê¡¢¤¹¤Ù¤Æ¤ÎGUI ´Ø
-    ¿ô¤¬»ÈÍѤǤ­¤ë¡£
+    Ãͤ¬ #Mx ¤Ê¤é¤Ð¡¢¿·¤·¤¤¥Õ¥ì¡¼¥à¤Ï X ¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥àÍѤǤ¢¤ë¡£
+    ¤³¤Î¥Õ¥ì¡¼¥à¤È¶¦¤Ë»ØÄꤵ¤ì¤¿°ú¿ô #MDrawWindow ¤Ï¡¢ @c Window
+    ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¥Õ¥ì¡¼¥à¤ÏÆɤ߽ñ¤­¤È¤â¤Ë²Äǽ¤Ç¤¢¤ê¡¢¤¹¤Ù¤Æ¤ÎGUI 
+    ´Ø¿ô¤¬»ÈÍѤǤ­¤ë¡£
 
-    Ãͤ¬ #Mgd ¤Ê¤é¤Ð¡¢¿·¤·¤¤¥Õ¥ì¡¼¥à¤Ï GD ¥é¥¤¥Ö¥é¥ê¤Î¥¤¥á¡¼¥¸¥ª¥Ö¥¸¥§
-    ¥¯¥ÈÍѤǤ¢¤ë¡£¤³¤Î¥Õ¥ì¡¼¥à¤È¶¦¤Ë»ØÄꤵ¤ì¤¿°ú¿ô #MDrawWindow ¤Ï¡¢ 
-    @c gdImagePtr ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¥Õ¥ì¡¼¥à¤Ï½ñ¤­½Ð¤·ÀìÍѤǤ¢¤ê¡¢
+    Ãͤ¬ @b Mgd ¤Ê¤é¤Ð¡¢¿·¤·¤¤¥Õ¥ì¡¼¥à¤Ï GD 
+    ¥é¥¤¥Ö¥é¥ê¤Î¥¤¥á¡¼¥¸¥ª¥Ö¥¸¥§¥¯¥ÈÍѤǤ¢¤ë¡£¤³¤Î¥Õ¥ì¡¼¥à¤È¶¦¤Ë»ØÄꤵ¤ì¤¿°ú¿ô
+    #MDrawWindow ¤Ï¡¢ @c gdImagePtr ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¥Õ¥ì¡¼¥à¤Ï½ñ¤­½Ð¤·ÀìÍѤǤ¢¤ê¡¢
     minput_ ¤Ç»Ï¤Þ¤ë̾Á°¤Î´Ø¿ô¤Ï»ÈÍѤǤ­¤Ê¤¤¡£
 
-    Ãͤ¬ #Mnil ¤Ê¤é¤Ð¡¢¿·¤·¤¤¥Õ¥ì¡¼¥à¤Ï, null ¥Ç¥Ð¥¤¥¹ÍѤǤ¢¤ë¡£¤³¤Î¥Õ
-    ¥ì¡¼¥à¤ÏÆɤ߽ñ¤­¤Ç¤­¤Ê¤¤¤Î¤Ç¡¢°ú¿ô #MDrawWindow ¤òɬÍפȤ¹¤ëmdraw_ 
-    ¤Ç»Ï¤Þ¤ë̾Á°¤Î´Ø¿ô¤ä¡¢minput_ ¤Ç»Ï¤Þ¤ë̾Á°¤Î´Ø¿ô¤Ï»ÈÍѤǤ­¤Ê¤¤¡£
+    Ãͤ¬ #Mnil ¤Ê¤é¤Ð¡¢¿·¤·¤¤¥Õ¥ì¡¼¥à¤Ï, null 
+    ¥Ç¥Ð¥¤¥¹ÍѤǤ¢¤ë¡£¤³¤Î¥Õ¥ì¡¼¥à¤ÏÆɤ߽ñ¤­¤Ç¤­¤Ê¤¤¤Î¤Ç¡¢°ú¿ô #MDrawWindow 
+    ¤òɬÍפȤ¹¤ëmdraw_ ¤Ç»Ï¤Þ¤ë̾Á°¤Î´Ø¿ô¤ä¡¢minput_ ¤Ç»Ï¤Þ¤ë̾Á°¤Î´Ø¿ô¤Ï»ÈÍѤǤ­¤Ê¤¤¡£
 
     <li> #Mface. ÃͤϠ#MFace ¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
 
@@ -540,58 +554,65 @@ MSymbol Mfont_descent;
 
     </ul>
 
-    ¤³¤ì¤Ë²Ã¤¨¤Æ¡¢#Mdevice ¤Î¥­¡¼¤¬ #Mx ¤Ç¤¢¤ì¤Ð¡¢°Ê²¼¤Î¥­¡¼¤âǧ¼±¤µ¤ì
-    ¤ë¡£¤³¤ì¤é¤Ï¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤È¡¢¥Õ¥ì¡¼¥à¤ÇÍøÍѤǤ­¤ë drawable ¤Î¿¼
-    ¤µ¤ò»ØÄꤹ¤ë¡£
+    ¤³¤ì¤é¤Î¥­¡¼¤Ë²Ã¤¨¡¢@b Mdevice ¤Î¥­¡¼¤¬ #Mx 
+    ¤Ç¤¢¤ë¾ì¹ç¤Ë¸Â¤ê°Ê²¼¤Î¥­¡¼¤âǧ¼±¤µ¤ì¤ë¡£°Ê²¼¤Î¥­¡¼¤Ï¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤È¡¢¥Õ¥ì¡¼¥à¤ÇÍøÍѤǤ­¤ë 
+    drawable ¤Î¿¼¤µ¤ò»ØÄꤹ¤ë¡£
 
     <ul>
 
-    <li> #Mdrawable. ÃͤϠ<tt>Drawable</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
+    <li> @b Mdrawable. ÃͤϠ<tt>Drawable</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
 
-    ¥­¡¼ #Mdisplay ¤ò»ý¤Ä¥Ñ¥é¥á¡¼¥¿¤â»ØÄꤵ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ë¡£À¸À®¤µ
-    ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤵ¤ì¤¿¥Ç¥£¥¹¥×¥ì¥¤¾å¤Î»ØÄꤵ¤ì¤¿ drawable ¤ÈƱ
-    ¤¸¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤È¿¼¤µ¤ò»ý¤Ä drawable ¤ËÍѤ¤¤é¤ì¤ë¡£
+    ¥­¡¼ @b Mdisplay ¤ò»ý¤Ä¥Ñ¥é¥á¡¼¥¿¤â»ØÄꤵ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ë¡£
+    À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤵ¤ì¤¿¥Ç¥£¥¹¥×¥ì¥¤¾å¤Î»ØÄꤵ¤ì¤¿ drawable 
+    ¤ÈƱ¤¸¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤È¿¼¤µ¤ò»ý¤Ä drawable ¤ËÍѤ¤¤é¤ì¤ë¡£
 
-    ¤³¤Î¥Ñ¥é¥á¡¼¥¿¤¬¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢#Mscreen ¤ò¥­¡¼¤È¤¹¤ë¥Ñ¥é¥á¡¼¥¿¤Ï̵
-    »ë¤µ¤ì¤ë¡£
+    ¤³¤Î¥Ñ¥é¥á¡¼¥¿¤¬¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢@b Mscreen ¤ò¥­¡¼¤È¤¹¤ë¥Ñ¥é¥á¡¼¥¿¤Ï̵»ë¤µ¤ì¤ë¡£
 
-    <li> #Mwidget. ÃͤϠ<tt>Widget</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
+    <li> @b Mwidget. ÃͤϠ<tt>Widget</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
 
-    À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¥¦¥£¥¸¥§¥Ã¥È¤ÈƱ¤¸¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤È
-    ¿¼¤µ¤ò»ý¤Ä drawable ¤ËÍѤ¤¤é¤ì¤ë¡£
+    À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¥¦¥£¥¸¥§¥Ã¥È¤ÈƱ¤¸¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤È¿¼¤µ¤ò»ý¤Ä
+    drawable ¤ËÍѤ¤¤é¤ì¤ë¡£
 
     ¥­¡¼ #Mface ¤ò»ý¤Ä¥Ñ¥é¥á¡¼¥¿¤¬¤Ê¤±¤ì¤Ð¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥§¡¼¥¹¤Ï¤³¤Î
     ¥¦¥£¥¸¥§¥Ã¥È¤Î¥ê¥½¡¼¥¹¤«¤éºî¤é¤ì¤ë¡£
 
-    ¤³¤Î¥Ñ¥é¥á¡¼¥¿¤¬¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢#Mdisplay, #Mscreen, #Mdrawable,
-    #Mdepth ¤ò¥­¡¼¤È¤¹¤ë¥Ñ¥é¥á¡¼¥¿¤Ï̵»ë¤µ¤ì¤ë¡£
+    ¤³¤Î¥Ñ¥é¥á¡¼¥¿¤¬¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢@b Mdisplay, @b Mscreen, @b Mdrawable,
+    @b Mdepth ¤ò¥­¡¼¤È¤¹¤ë¥Ñ¥é¥á¡¼¥¿¤Ï̵»ë¤µ¤ì¤ë¡£
 
-    <li> #Mdepth. ÃͤϠ<tt>unsigned</tt>  ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
+    <li> @b Mdepth. ÃͤϠ<tt>unsigned</tt>  ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
 
     À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¿¼¤µ¤Î drawable ¤ËÍѤ¤¤é¤ì¤ë¡£
 
-    <li> #Mscreen. ÃͤϠ<tt>(Screen *)</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
+    <li> @b Mscreen. ÃͤϠ<tt>(Screen *)</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
 
-    À¸À®¤·¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¥¹¥¯¥ê¡¼¥ó¤ÈƱ¤¸¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤ò»ý¤Á¡¢
-    ¥¹¥¯¥ê¡¼¥ó¤Î¥Ç¥Õ¥©¥ë¥È¤Î¿¼¤µ¤ÈƱ¤¸¿¼¤µ¤ò»ý¤Ä drawable ¤ËÍѤ¤¤é¤ì¤ë¡£
+    À¸À®¤·¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¥¹¥¯¥ê¡¼¥ó¤ÈƱ¤¸¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤ò»ý¤Á¡¢¥¹¥¯¥ê¡¼¥ó¤Î¥Ç¥Õ¥©¥ë¥È¤Î¿¼¤µ¤ÈƱ¤¸¿¼¤µ¤ò»ý¤Ä drawable ¤ËÍѤ¤¤é¤ì¤ë¡£
 
-    ¤³¤Î¥Ñ¥é¥á¡¼¥¿¤¬¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢#Mdisplay ¤ò¥­¡¼¤È¤¹¤ë¥Ñ¥é¥á¡¼¥¿¤Ï̵
-    »ë¤µ¤ì¤ë¡£
+    ¤³¤Î¥Ñ¥é¥á¡¼¥¿¤¬¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢@b Mdisplay ¤ò¥­¡¼¤È¤¹¤ë¥Ñ¥é¥á¡¼¥¿¤Ï̵»ë¤µ¤ì¤ë¡£
 
-    <li> #Mdisplay. ÃͤϠ<tt>(Display *)</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
+    <li> @b Mdisplay. ÃͤϠ<tt>(Display *)</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
 
-    À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¥Ç¥£¥¹¥×¥ì¥¤¤Î¥Ç¥Õ¥©¥ë¥È¥¹¥¯¥ê¡¼¥ó¤È
-    Æ±¤¸¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤ÈƱ¤¸¿¼¤µ¤ò»ý¤Ädrawables ¤ËÍѤ¤¤é¤ì¤ë¡£
+    À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¥Ç¥£¥¹¥×¥ì¥¤¤Î¥Ç¥Õ¥©¥ë¥È¥¹¥¯¥ê¡¼¥ó¤ÈƱ¤¸¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤ÈƱ¤¸¿¼¤µ¤ò»ý¤Ädrawables ¤ËÍѤ¤¤é¤ì¤ë¡£
 
-    <li> #Mcolormap. ÃͤϠ<tt>(Colormap)</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
+    <li> @b Mcolormap. ÃͤϠ<tt>(Colormap)</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
 
     À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¥«¥é¡¼¥Þ¥Ã¥×¤ò»ÈÍѤ¹¤ë¡£
 
+    <li> #Mfont. Ãͤϡ¢#Mx, #Mfreetype, #Mxft ¤Î¤¤¤º¤ì¤«¡£
+
+    À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï»ØÄꤷ¤¿¥Õ¥©¥ó¥È¥Ð¥Ã¥¯¥¨¥ó¥É¤ò»ÈÍѤ¹¤ë¡£Ãͤ¬ 
+    #Mx ¤Ç¤¢¤ì¤Ð X ¤Î¥³¥¢¥Õ¥©¥ó¥È¡¢#Mfreetype ¤Ç¤¢¤ì¤Ð FreeType 
+    ¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¥í¡¼¥«¥ë¥Õ¥©¥ó¥È¡¢#Mxft ¤Ç¤¢¤ì¤Ð Xft 
+    ¥é¥¤¥Ö¥é¥ê·Ðͳ¤ÇÍѤ¤¤ë¥í¡¼¥«¥ë¥Õ¥©¥ó¥È¤ò»ÈÍѤ¹¤ë¡£
+    Ê£¿ô¤Î¥Õ¥©¥ó¥È¥Ð¥Ã¥¯¥¨¥ó¥É¤ò»ÈÍѤ·¤¿¤¤¾ì¹ç¤Ë¤Ï¡¢¤³¤Î¥Ñ¥é¥á¡¼¥¿¤òÊ£¿ô²ó¡¢°Û¤Ê¤ëÃͤǻØÄꤹ¤ë¤³¤È¤¬¤Ç¤­¤ë¡£
+    »ØÄꤷ¤¿¥Ð¥Ã¥¯¥¨¥ó¥É¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Ê¤¤¥Ç¥Ð¥¤¥¹¤Ç¤Ï¡¢¤³¤Î¥Ñ¥é¥á¡¼¥¿¤Ï̵»ë¤µ¤ì¤ë¡£
+
+    ¤³¤Î¥Ñ¥é¥á¡¼¥¿¤¬Ìµ¤¤¾ì¹ç¤Ë¤Ï¡¢¥Ç¥Ð¥¤¥¹¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¤¹¤Ù¤Æ¤Î¥Õ¥©¥ó¥È¥Ð¥Ã¥¯¥¨¥ó¥É¤òÍøÍѤ¹¤ë¡£
+
     </ul>
 
     @return
-    À®¸ù¤¹¤ì¤Ð mframe() ¤Ï¿·¤·¤¤¥Õ¥ì¡¼¥à¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±
-    ¤ì¤Ð @c NULL ¤òÊÖ¤¹¡£  */
+    À®¸ù¤¹¤ì¤Ð mframe() ¤Ï¿·¤·¤¤¥Õ¥ì¡¼¥à¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð
+    @c NULL ¤òÊÖ¤¹¡£  */
 
 MFrame *
 mframe (MPlist *plist)
@@ -624,7 +645,7 @@ mframe (MPlist *plist)
       if (! interface->handle)
        {
          (*interface->init) ();
-         interface->handle = Mt;
+         interface->handle = (void *) 1;
        }
 #else  /* not HAVE_FREETYPE */
       MERROR (MERROR_WIN, NULL);
@@ -637,23 +658,26 @@ mframe (MPlist *plist)
        MERROR (MERROR_WIN, NULL);
       if (! interface->handle)
        {
-         interface->handle = dlopen (interface->library, RTLD_NOW);
-         if (! interface->handle)
-           MERROR (MERROR_WIN, NULL);
-         interface->init = dlsym (interface->handle, "device_init");
-         interface->open = dlsym (interface->handle, "device_open");
-         interface->fini = dlsym (interface->handle, "device_fini");
-         if (! interface->init || ! interface->open || ! interface->fini
+         if (! (interface->handle = dlopen (interface->library, RTLD_NOW))
+             || ! (interface->init
+                   = (int (*) ()) dlsym (interface->handle, "device_init"))
+             || ! (interface->open
+                   = (int (*) (MFrame *, MPlist *)) dlsym (interface->handle,
+                                                           "device_open"))
+             || ! (interface->fini
+                   = (int (*) ()) dlsym (interface->handle, "device_fini"))
              || (*interface->init) () < 0)
            {
-             dlclose (interface->handle);
+             fprintf (stderr, "%s\n", (char *) dlerror ());
+             if (interface->handle)
+               dlclose (interface->handle);
              MERROR (MERROR_WIN, NULL);
            }
        }
     }
 
   M17N_OBJECT (frame, free_frame, MERROR_FRAME);
-  if (! (frame->device = (*interface->open) (frame, plist)))
+  if ((*interface->open) (frame, plist) < 0)
     {
       free (frame);
       MERROR (MERROR_WIN, NULL);
@@ -667,7 +691,8 @@ mframe (MPlist *plist)
     if (MPLIST_KEY (pl) == Mface)
       mface_merge (frame->face, (MFace *) MPLIST_VAL (pl));
   mface__update_frame_face (frame);
-
+  frame->font
+    = frame->rface->rfont ? (MFont *) frame->rface->rfont : NULL;
   if (plist_created)
     M17N_OBJECT_UNREF (plist);
   return frame;
@@ -718,8 +743,8 @@ mframe (MPlist *plist)
 /***ja
     @brief ¥Õ¥ì¡¼¥à¤Î¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÊÖ¤¹.
 
-    ´Ø¿ô mframe_get_prop () ¤Ï¥Õ¥ì¡¼¥à $FRAME ¤Î¥­¡¼ $KEY ¤ò»ý¤Ä¥×¥í¥Ñ
-    ¥Æ¥£¤ÎÃͤòÊÖ¤¹¡£Í­¸ú¤Ê¥­¡¼¤È¤½¤ÎÃͤϰʲ¼¤ÎÄ̤ꡣ
+    ´Ø¿ô mframe_get_prop () ¤Ï¥Õ¥ì¡¼¥à $FRAME ¤Î¥­¡¼ $KEY 
+    ¤ò»ý¤Ä¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÊÖ¤¹¡£Í­¸ú¤Ê¥­¡¼¤È¤½¤ÎÃͤϰʲ¼¤ÎÄ̤ꡣ
 
 @verbatim
 
@@ -761,9 +786,9 @@ mframe_get_prop (MFrame *frame, MSymbol key)
   if (key == Mface)
     return frame->face;
   if (key == Mfont)
-    return &frame->rface->rfont->font;
+    return frame->font;
   if (key == Mfont_width)
-    return (void *) (frame->space_width);
+    return (void *) (frame->average_width);
   if (key == Mfont_ascent)
     return (void *) (frame->ascent);
   if (key == Mfont_descent)
@@ -782,9 +807,8 @@ mframe_get_prop (MFrame *frame, MSymbol key)
 /***ja
     @brief ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥ì¡¼¥à.
 
-    ³°ÉôÊÑ¿ô #mframe_default ¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥ì¡¼¥à¤Ø¤Î¥Ý¥¤¥ó¥¿¤ò»ý
-    ¤Ä¡£¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥ì¡¼¥à¤Ï¡¢ºÇ½é¤Ë mframe () ¤¬¸Æ¤Ó½Ð¤µ¤ì¤¿¤È¤­¤Ë
-    ºî¤é¤ì¤ë¡£  */
+    ³°ÉôÊÑ¿ô #mframe_default ¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥ì¡¼¥à¤Ø¤Î¥Ý¥¤¥ó¥¿¤ò»ý¤Ä¡£
+    ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥ì¡¼¥à¤Ï¡¢ºÇ½é¤Ë mframe () ¤¬¸Æ¤Ó½Ð¤µ¤ì¤¿¤È¤­¤Ëºî¤é¤ì¤ë¡£  */
 
 MFrame *mframe_default;