1 /* m17n-gui.c -- body of the GUI API.
2 Copyright (C) 2003, 2004
3 National Institute of Advanced Industrial Science and Technology (AIST)
4 Registration Number H15PRO112
6 This file is part of the m17n library.
8 The m17n library is free software; you can redistribute it and/or
9 modify it under the terms of the GNU Lesser General Public License
10 as published by the Free Software Foundation; either version 2.1 of
11 the License, or (at your option) any later version.
13 The m17n library is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public
19 License along with the m17n library; if not, write to the Free
20 Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
25 @brief GUI support for a window system.
27 This section defines the m17n GUI API concerning M-text drawing
28 and inputting under a window system.
30 All the definitions here are independent of window systems. An
31 actual library file, however, can depend on a specific window
32 system. For instance, the library file m17n-X.so is an example of
33 implementation of the m17n GUI API for the X Window System.
35 Actually the GUI API is mainly for toolkit libraries or to
36 implement XOM, not for direct use from application programs.
41 @brief ¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¾å¤Î GUI ¥µ¥Ý¡¼¥È.
43 ¤³¤Î¥»¥¯¥·¥ç¥ó¤Ï¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¤Î¤â¤È¤Ç¤Î M-text ¤Îɽ¼¨¤ÈÆþÎϤˤ«¤«¤ï¤ë
44 m17n GUI API ¤òÄêµÁ¤¹¤ë¡£
46 ¤³¤³¤Ç¤Î¤¹¤Ù¤Æ¤ÎÄêµÁ¤Ï¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¤È¤ÏÆÈΩ¤Ç¤¢¤ë¡£
47 ¤·¤«¤·¡¢¼ÂºÝ¤Î¥é¥¤¥Ö¥é¥ê¥Õ¥¡¥¤¥ë¤Ï¸ÄÊ̤Υ¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¤Ë°Í¸¤¹¤ë¾ì¹ç¤¬¤¢¤ë¡£
48 ¤¿¤È¤¨¤Ð¥é¥¤¥Ö¥é¥ê¥Õ¥¡¥¤¥ë m17n-X.so ¤Ï¡¢m17n GUI API ¤Î X
49 ¥¦¥£¥ó¥É¥¦ÍѤμÂÁõÎã¤Ç¤¢¤ë¡£
51 ¸½¼Â¤Ë¤Ï¡¢GUI API ¤Ï¼ç¤Ë¥Ä¡¼¥ë¥¥Ã¥È¥é¥¤¥Ö¥é¥ê¸þ¤±¤Ç¤¢¤ë¤«¡¢¤Þ¤¿¤Ï
52 XOM ¤ò¼ÂÁõ¤¹¤ë¤¿¤á¤ËÍѤ¤¤é¤ì¤Æ¤ª¤ê¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤«¤é¤ÎľÀܤÎÍøÍѤòǰƬ¤Ë¤ª¤¤¤¿¤â¤Î¤Ç¤Ï¤Ê¤¤¡£
57 #if !defined (FOR_DOXYGEN) || defined (DOXYGEN_INTERNAL_MODULE)
58 /*** @addtogroup m17nInternal
73 #include "m17n-misc.h"
76 #include "internal-gui.h"
81 #ifndef DLOPEN_SHLIB_EXT
82 #define DLOPEN_SHLIB_EXT ".so"
85 /** Information about a dynamic library supporting a specific graphic
89 /** Name of the dynamic library (e.g. "libm17n-X.so"). */
91 /** Handle of the dynamic library. */
93 /** Function to call just after loading the library. */
95 /** Function to call to open a frame on the graphic device. */
96 int (*open) (MFrame *frame, MPlist *param);
97 /** Function to call just before unloading the library. */
99 } MDeviceLibraryInterface;
102 /** Plist of device symbol vs MDeviceLibraryInterface. */
104 static MPlist *device_library_list;
106 /** Close MFrame and free it. */
109 free_frame (void *object)
111 MFrame *frame = (MFrame *) object;
113 (*frame->driver->close) (frame);
114 M17N_OBJECT_UNREF (frame->face);
115 M17N_OBJECT_UNREF (frame->font_driver_list);
120 /** Register a dynamic library of name LIB by a key NAME. */
123 register_device_library (MSymbol name, char *lib)
125 MDeviceLibraryInterface *interface;
127 MSTRUCT_CALLOC (interface, MERROR_WIN);
128 interface->library = malloc (strlen (lib)
129 + strlen (DLOPEN_SHLIB_EXT) + 1);
130 sprintf (interface->library, "%s%s", lib, DLOPEN_SHLIB_EXT);
131 if (! device_library_list)
132 device_library_list = mplist ();
133 mplist_add (device_library_list, name, interface);
139 /** Null device support. */
142 MPlist *realized_fontset_list;
143 MPlist *realized_font_list;
144 MPlist *realized_face_list;
148 null_device_close (MFrame *frame)
153 null_device_get_prop (MFrame *frame, MSymbol key)
159 null_device_realize_face (MRealizedFace *rface)
165 null_device_free_realized_face (MRealizedFace *rface)
169 static MDeviceDriver null_driver =
172 null_device_get_prop,
173 null_device_realize_face,
174 null_device_free_realized_face
180 null_device.realized_fontset_list = mplist ();
181 null_device.realized_font_list = mplist ();
182 null_device.realized_face_list = mplist ();
191 MPLIST_DO (plist, null_device.realized_fontset_list)
192 mfont__free_realized_fontset ((MRealizedFontset *) MPLIST_VAL (plist));
193 M17N_OBJECT_UNREF (null_device.realized_fontset_list);
195 MPLIST_DO (plist, null_device.realized_face_list)
196 mface__free_realized ((MRealizedFace *) MPLIST_VAL (plist));
197 M17N_OBJECT_UNREF (null_device.realized_face_list);
199 if (MPLIST_VAL (null_device.realized_font_list))
200 mfont__free_realized (MPLIST_VAL (null_device.realized_font_list));
201 M17N_OBJECT_UNREF (null_device.realized_font_list);
206 null_device_open (MFrame *frame, MPlist *param)
210 frame->device = NULL;
211 frame->device_type = 0;
212 frame->dpi = (int) mplist_get (param, Mresolution);
215 frame->driver = &null_driver;
216 frame->font_driver_list = mplist ();
217 mplist_add (frame->font_driver_list, Mfreetype, &mfont__ft_driver);
218 frame->realized_font_list = null_device.realized_font_list;
219 frame->realized_face_list = null_device.realized_face_list;
220 frame->realized_fontset_list = null_device.realized_fontset_list;
221 face = mface_copy (mface__default);
222 mplist_push (param, Mface, face);
223 M17N_OBJECT_UNREF (face);
227 static MDeviceLibraryInterface null_interface =
228 { NULL, NULL, null_device_init, null_device_open, null_device_fini };
240 int mdebug_flag = MDEBUG_INIT;
242 merror_code = MERROR_NONE;
243 if (m17n__gui_initialized++)
247 if (merror_code != MERROR_NONE)
249 m17n__gui_initialized--;
255 Mgd = msymbol ("gd");
257 Mfont = msymbol ("font");
258 Mfont_width = msymbol ("font-width");
259 Mfont_ascent = msymbol ("font-ascent");
260 Mfont_descent = msymbol ("font-descent");
261 Mdevice = msymbol ("device");
263 Mdisplay = msymbol ("display");
264 Mscreen = msymbol ("screen");
265 Mdrawable = msymbol ("drawable");
266 Mdepth = msymbol ("depth");
267 Mwidget = msymbol ("widget");
268 Mcolormap = msymbol ("colormap");
271 if (mfont__init () < 0)
273 MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize font module."));
274 if (mfont__fontset_init () < 0)
276 MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize fontset module."));
277 if (mface__init () < 0)
279 MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize face module."));
280 if (mdraw__init () < 0)
282 MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize draw module."));
283 if (minput__win_init () < 0)
285 MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize input-win module."));
286 mframe_default = NULL;
288 register_device_library (Mx, "libm17n-X");
289 register_device_library (Mgd, "libm17n-gd");
294 MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize the m17n GUI module."));
301 int mdebug_flag = MDEBUG_FINI;
304 if (m17n__gui_initialized == 0
305 || --m17n__gui_initialized > 0)
310 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize device modules."));
311 MPLIST_DO (plist, device_library_list)
313 MDeviceLibraryInterface *interface = MPLIST_VAL (plist);
315 if (interface->handle && interface->fini)
317 (*interface->fini) ();
318 dlclose (interface->handle);
320 free (interface->library);
324 if (null_interface.handle)
326 (*null_interface.fini) ();
327 null_interface.handle = NULL;
329 #endif /* not HAVE_FREETYPE */
330 M17N_OBJECT_UNREF (device_library_list);
332 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize input-gui module."));
334 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize draw module."));
336 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize face module."));
337 mfont__fontset_fini ();
338 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize fontset module."));
340 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize font module."));
341 mframe_default = NULL;
343 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize the gui modules."));
350 #endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
352 /*** @addtogroup m17nFrame */
354 @brief A @e frame is an object corresponding to the graphic device.
356 A @e frame is an object of the type #MFrame to hold various
357 information about each display/input device. Almost all m17n GUI
358 functions require a pointer to a frame as an argument. */
360 @brief @e ¥Õ¥ì¡¼¥à ¤È¤Ï¥°¥é¥Õ¥£¥Ã¥¯¥Ç¥Ð¥¤¥¹¤ËÂбþ¤¹¤ë¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ë.
362 @e ¥Õ¥ì¡¼¥à ¤È¤Ï #MFrame
363 ·¿¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ê¡¢¸Ä¡¹¤Îɽ¼¨¡¿ÆþÎϥǥХ¤¥¹¤Î¾ðÊó¤ò³ÊǼ¤¹¤ë¤¿¤á¤ËÍѤ¤¤é¤ì¤ë¡£
364 ¤Û¤È¤ó¤É¤¹¤Ù¤Æ¤Î m17n GUI´Ø¿ô¤Ï¡¢°ú¿ô¤È¤·¤Æ¥Õ¥ì¡¼¥à¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÍ׵᤹¤ë¡£ */
370 @name Variables: Keys of frame parameter
372 These are the symbols to use in a parameter to create a frame. See
373 the function mframe () for details.
375 #Mdevice, #Mdisplay, #Mscreen, #Mdrawable, #Mdepth, and #Mcolormap
376 are also keys of a frame property. */
379 @name ÊÑ¿ô¡§ ¥Õ¥ì¡¼¥à¥Ñ¥é¥á¡¼¥¿ÍÑ¥¡¼
381 ¥Õ¥ì¡¼¥à¤òÀ¸À®¤¹¤ëºÝ¤Î¥Ñ¥é¥á¡¼¥¿¤ËÍѤ¤¤ë¥·¥ó¥Ü¥ë¡£¾Ü¤·¤¯¤Ï´Ø¿ô
382 mframe () ¤ÎÀâÌÀ»²¾È¡£
384 #Mdevice¡¢ #Mdisplay¡¢ #Mscreen¡¢ #Mdrawable¡¢ #Mdepth¡¢#Mcolormap
385 ¤Ï¥Õ¥ì¡¼¥à¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤Ç¤â¤¢¤ë¡£ */
389 MSymbol Mdevice, Mdisplay, Mscreen, Mdrawable, Mdepth, Mcolormap, Mwidget;
396 @name Variables: Keys of frame property
398 These are the symbols to use as an argument to the function
399 mframe_get_prop (). */
401 @name ÊÑ¿ô¡§ ¥Õ¥ì¡¼¥à¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼
403 ´Ø¿ô mframe_get_prop () ¤Î°ú¿ô¤ËÍѤ¤¤é¤ì¤ë¥·¥ó¥Ü¥ë¡£ */
408 MSymbol Mfont_ascent;
409 MSymbol Mfont_descent;
417 @brief Create a new frame.
419 The mframe () function creates a new frame with parameters listed
420 in $PLIST which may be @c NULL.
422 The recognized keys in $PLIST are window system dependent.
424 The following key is always recognized.
428 <li> #Mdevice, the value must be one of #Mx, #Mgd, and #Mnil.
430 If the value is #Mx, the frame is for X Window System. The
431 argument #MDrawWindow specified together with the frame must be of
432 type @c Window. The frame is both readable and writable, thus all
433 GUI functions can be used.
435 If the value is #Mgd, the frame is for an image object of GD
436 library. The argument #MDrawWindow specified together with the
437 frame must be of type @c gdImagePtr. The frame is writable
438 only, thus functions minput_XXX can't be used for the frame.
440 If the value is #Mnil, the frame is for a null device. The frame
441 is not writable nor readable, thus functions mdraw_XXX that
442 require the argument #MDrawWindow and functions minput_XXX can't
443 be used for the frame.
445 <li> #Mface, the value must be a pointer to #MFace.
447 The value is used as the default face of the frame.
451 In addition, if the value of the key #Mdevice is #Mx, the
452 following keys are recognized. They are to specify the root
453 window and the depth of drawables that can be used with the frame.
457 <li> #Mdrawable, the value type must be <tt>Drawable</tt>.
459 A parameter of key #Mdisplay must also be specified. The
460 created frame can be used for drawables whose root window and
461 depth are the same as those of the specified drawable on the
464 When this parameter is specified, the parameter of key #Mscreen
467 <li> #Mwidget, the value type must be <tt>Widget</tt>.
469 The created frame can be used for drawables whose root window and
470 depth are the same as those of the specified widget.
472 If a parameter of key #Mface is not specified, the default face
473 is created from the resources of the widget.
475 When this parameter is specified, the parameters of key #Mdisplay,
476 #Mscreen, #Mdrawable, #Mdepth are ignored.
478 <li> #Mdepth, the value type must be <tt>unsigned</tt>.
480 The created frame can be used for drawables of the specified
483 <li> #Mscreen, the value type must be <tt>(Screen *)</tt>.
485 The created frame can be used for drawables whose root window is
486 the same as the root window of the specified screen, and depth is
487 the same at the default depth of the screen.
489 When this parameter is specified, parameter of key #Mdisplay is
492 <li> #Mdisplay, the value type must be <tt>(Display *)</tt>.
494 The created frame can be used for drawables whose root window is
495 the same as the root window for the default screen of the display,
496 and depth is the same as the default depth of the screen.
498 <li> #Mcolormap, the value type must be <tt>(Colormap)</tt>.
500 The created frame uses the specified colormap.
502 <li> #Mfont, the value must be #Mx, #Mfreetype, or #Mxft.
504 The created frame uses the specified font backend. The value #Mx
505 instructs to use X core fonts, #Mfreetype to use local fonts
506 supported by FreeType fonts, and #Mxft to use local fonts via Xft
507 library. You can specify this parameter more than once with
508 different values if you want to use multiple font backends. This
509 is ignored if the specified font backend is not supported on the
512 When this parameter is not specified, all font backend supported
513 on the device are used.
518 If the operation was successful, mframe () returns a pointer to a
519 newly created frame. Otherwise, it returns @c NULL. */
522 @brief ¿·¤·¤¤¥Õ¥ì¡¼¥à¤òºî¤ë.
524 ´Ø¿ô mframe () ¤Ï $PLIST Ãæ¤Î¥Ñ¥é¥á¡¼¥¿¤ò»ý¤Ä¿·¤·¤¤¥Õ¥ì¡¼¥à¤òºî¤ë¡£
525 $PLIST ¤Ï @c NULL ¤Ç¤âÎɤ¤¡£
527 $PLIST ¤Ë¸½¤ï¤ì¤ë¥¡¼¤Î¤¦¤Á¤É¤ì¤¬Ç§¼±¤µ¤ì¤ë¤«¤Ï¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¤Ë°Í¸¤¹¤ë¡£
529 °Ê²¼¤Î¥¡¼¤Ï¾ï¤Ëǧ¼±¤µ¤ì¤ë¡£
533 <li> #Mdevice. ÃÍ¤Ï #Mx, #Mgd, #Mnil ¤Î¤¤¤º¤ì¤«¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
535 Ãͤ¬ #Mx ¤Ê¤é¤Ð¡¢¿·¤·¤¤¥Õ¥ì¡¼¥à¤Ï X ¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥àÍѤǤ¢¤ë¡£
536 ¤³¤Î¥Õ¥ì¡¼¥à¤È¶¦¤Ë»ØÄꤵ¤ì¤¿°ú¿ô #MDrawWindow ¤Ï¡¢ @c Window
537 ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¥Õ¥ì¡¼¥à¤ÏÆɤ߽ñ¤¤È¤â¤Ë²Äǽ¤Ç¤¢¤ê¡¢¤¹¤Ù¤Æ¤ÎGUI
540 Ãͤ¬ #Mgd ¤Ê¤é¤Ð¡¢¿·¤·¤¤¥Õ¥ì¡¼¥à¤Ï GD
541 ¥é¥¤¥Ö¥é¥ê¤Î¥¤¥á¡¼¥¸¥ª¥Ö¥¸¥§¥¯¥ÈÍѤǤ¢¤ë¡£¤³¤Î¥Õ¥ì¡¼¥à¤È¶¦¤Ë»ØÄꤵ¤ì¤¿°ú¿ô
542 #MDrawWindow ¤Ï¡¢ @c gdImagePtr ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¥Õ¥ì¡¼¥à¤Ï½ñ¤½Ð¤·ÀìÍѤǤ¢¤ê¡¢
543 minput_ ¤Ç»Ï¤Þ¤ë̾Á°¤Î´Ø¿ô¤Ï»ÈÍѤǤ¤Ê¤¤¡£
545 Ãͤ¬ #Mnil ¤Ê¤é¤Ð¡¢¿·¤·¤¤¥Õ¥ì¡¼¥à¤Ï, null
546 ¥Ç¥Ð¥¤¥¹ÍѤǤ¢¤ë¡£¤³¤Î¥Õ¥ì¡¼¥à¤ÏÆɤ߽ñ¤¤Ç¤¤Ê¤¤¤Î¤Ç¡¢°ú¿ô #MDrawWindow
547 ¤òɬÍפȤ¹¤ëmdraw_ ¤Ç»Ï¤Þ¤ë̾Á°¤Î´Ø¿ô¤ä¡¢minput_ ¤Ç»Ï¤Þ¤ë̾Á°¤Î´Ø¿ô¤Ï»ÈÍѤǤ¤Ê¤¤¡£
549 <li> #Mface. ÃÍ¤Ï #MFace ¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
551 ¤³¤ÎÃͤϥե졼¥à¤Î¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥§¡¼¥¹¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
555 ¤³¤ì¤é¤Î¥¡¼¤Ë²Ã¤¨¡¢#Mdevice ¤Î¥¡¼¤¬ #Mx
556 ¤Ç¤¢¤ë¾ì¹ç¤Ë¸Â¤ê°Ê²¼¤Î¥¡¼¤âǧ¼±¤µ¤ì¤ë¡£°Ê²¼¤Î¥¡¼¤Ï¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤È¡¢¥Õ¥ì¡¼¥à¤ÇÍøÍѤǤ¤ë
557 drawable ¤Î¿¼¤µ¤ò»ØÄꤹ¤ë¡£
561 <li> #Mdrawable. ÃÍ¤Ï <tt>Drawable</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
563 ¥¡¼ #Mdisplay ¤ò»ý¤Ä¥Ñ¥é¥á¡¼¥¿¤â»ØÄꤵ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ë¡£
564 À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤵ¤ì¤¿¥Ç¥£¥¹¥×¥ì¥¤¾å¤Î»ØÄꤵ¤ì¤¿ drawable
565 ¤ÈƱ¤¸¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤È¿¼¤µ¤ò»ý¤Ä drawable ¤ËÍѤ¤¤é¤ì¤ë¡£
567 ¤³¤Î¥Ñ¥é¥á¡¼¥¿¤¬¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢#Mscreen ¤ò¥¡¼¤È¤¹¤ë¥Ñ¥é¥á¡¼¥¿¤Ï̵»ë¤µ¤ì¤ë¡£
569 <li> #Mwidget. ÃÍ¤Ï <tt>Widget</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
571 À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¥¦¥£¥¸¥§¥Ã¥È¤ÈƱ¤¸¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤È¿¼¤µ¤ò»ý¤Ä
572 drawable ¤ËÍѤ¤¤é¤ì¤ë¡£
574 ¥¡¼ #Mface ¤ò»ý¤Ä¥Ñ¥é¥á¡¼¥¿¤¬¤Ê¤±¤ì¤Ð¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥§¡¼¥¹¤Ï¤³¤Î
575 ¥¦¥£¥¸¥§¥Ã¥È¤Î¥ê¥½¡¼¥¹¤«¤éºî¤é¤ì¤ë¡£
577 ¤³¤Î¥Ñ¥é¥á¡¼¥¿¤¬¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢#Mdisplay, #Mscreen, #Mdrawable,
578 #Mdepth ¤ò¥¡¼¤È¤¹¤ë¥Ñ¥é¥á¡¼¥¿¤Ï̵»ë¤µ¤ì¤ë¡£
580 <li> #Mdepth. ÃÍ¤Ï <tt>unsigned</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
582 À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¿¼¤µ¤Î drawable ¤ËÍѤ¤¤é¤ì¤ë¡£
584 <li> #Mscreen. ÃÍ¤Ï <tt>(Screen *)</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
586 À¸À®¤·¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¥¹¥¯¥ê¡¼¥ó¤ÈƱ¤¸¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤ò»ý¤Á¡¢¥¹¥¯¥ê¡¼¥ó¤Î¥Ç¥Õ¥©¥ë¥È¤Î¿¼¤µ¤ÈƱ¤¸¿¼¤µ¤ò»ý¤Ä drawable ¤ËÍѤ¤¤é¤ì¤ë¡£
588 ¤³¤Î¥Ñ¥é¥á¡¼¥¿¤¬¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢#Mdisplay ¤ò¥¡¼¤È¤¹¤ë¥Ñ¥é¥á¡¼¥¿¤Ï̵»ë¤µ¤ì¤ë¡£
590 <li> #Mdisplay. ÃÍ¤Ï <tt>(Display *)</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
592 À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¥Ç¥£¥¹¥×¥ì¥¤¤Î¥Ç¥Õ¥©¥ë¥È¥¹¥¯¥ê¡¼¥ó¤ÈƱ¤¸¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤ÈƱ¤¸¿¼¤µ¤ò»ý¤Ädrawables ¤ËÍѤ¤¤é¤ì¤ë¡£
594 <li> #Mcolormap. ÃÍ¤Ï <tt>(Colormap)</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
596 À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¥«¥é¡¼¥Þ¥Ã¥×¤ò»ÈÍѤ¹¤ë¡£
598 <li> #Mfont. Ãͤϡ¢#Mx, #Mfreetype, #Mxft ¤Î¤¤¤º¤ì¤«¡£
600 À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï»ØÄꤷ¤¿¥Õ¥©¥ó¥È¥Ð¥Ã¥¯¥¨¥ó¥É¤ò»ÈÍѤ¹¤ë¡£Ãͤ¬
601 #Mx ¤Ç¤¢¤ì¤Ð X ¤Î¥³¥¢¥Õ¥©¥ó¥È¡¢#Mfreetype ¤Ç¤¢¤ì¤Ð FreeType
602 ¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¥í¡¼¥«¥ë¥Õ¥©¥ó¥È¡¢#Mxft ¤Ç¤¢¤ì¤Ð Xft
603 ¥é¥¤¥Ö¥é¥ê·Ðͳ¤ÇÍѤ¤¤ë¥í¡¼¥«¥ë¥Õ¥©¥ó¥È¤ò»ÈÍѤ¹¤ë¡£
604 Ê£¿ô¤Î¥Õ¥©¥ó¥È¥Ð¥Ã¥¯¥¨¥ó¥É¤ò»ÈÍѤ·¤¿¤¤¾ì¹ç¤Ë¤Ï¡¢¤³¤Î¥Ñ¥é¥á¡¼¥¿¤òÊ£¿ô²ó¡¢°Û¤Ê¤ëÃͤǻØÄꤹ¤ë¤³¤È¤¬¤Ç¤¤ë¡£
605 »ØÄꤷ¤¿¥Ð¥Ã¥¯¥¨¥ó¥É¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Ê¤¤¥Ç¥Ð¥¤¥¹¤Ç¤Ï¡¢¤³¤Î¥Ñ¥é¥á¡¼¥¿¤Ï̵»ë¤µ¤ì¤ë¡£
607 ¤³¤Î¥Ñ¥é¥á¡¼¥¿¤¬Ìµ¤¤¾ì¹ç¤Ë¤Ï¡¢¥Ç¥Ð¥¤¥¹¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¤¹¤Ù¤Æ¤Î¥Õ¥©¥ó¥È¥Ð¥Ã¥¯¥¨¥ó¥É¤òÍøÍѤ¹¤ë¡£
612 À®¸ù¤¹¤ì¤Ð mframe() ¤Ï¿·¤·¤¤¥Õ¥ì¡¼¥à¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð
616 mframe (MPlist *plist)
619 int plist_created = 0;
622 MDeviceLibraryInterface *interface;
626 pl = mplist_find_by_key (plist, Mdevice);
628 device = MPLIST_VAL (pl);
642 interface = &null_interface;
643 if (! interface->handle)
645 (*interface->init) ();
646 interface->handle = (void *) 1;
648 #else /* not HAVE_FREETYPE */
649 MERROR (MERROR_WIN, NULL);
650 #endif /* not HAVE_FREETYPE */
654 interface = mplist_get (device_library_list, device);
656 MERROR (MERROR_WIN, NULL);
657 if (! interface->handle)
659 if (! (interface->handle = dlopen (interface->library, RTLD_NOW))
660 || ! (*(void **) (&interface->init)
661 = dlsym (interface->handle, "device_init"))
662 || ! (*(void **) (&interface->open)
663 = dlsym (interface->handle, "device_open"))
664 || ! (*(void **) (&interface->fini)
665 = dlsym (interface->handle, "device_fini"))
666 || (*interface->init) () < 0)
668 fprintf (stderr, "%s\n", (char *) dlerror ());
669 if (interface->handle)
670 dlclose (interface->handle);
671 MERROR (MERROR_WIN, NULL);
676 M17N_OBJECT (frame, free_frame, MERROR_FRAME);
677 if ((*interface->open) (frame, plist) < 0)
680 MERROR (MERROR_WIN, NULL);
683 if (! mframe_default)
684 mframe_default = frame;
686 frame->face = mface ();
687 MPLIST_DO (pl, plist)
688 if (MPLIST_KEY (pl) == Mface)
689 mface_merge (frame->face, (MFace *) MPLIST_VAL (pl));
690 mface__update_frame_face (frame);
692 = frame->rface->rfont ? (MFont *) frame->rface->rfont : NULL;
694 M17N_OBJECT_UNREF (plist);
701 @brief Return property value of frame.
703 The mframe_get_prop () function returns a value of property $KEY
704 of frame $FRAME. The valid keys and the corresponding return
705 values are as follows.
709 key type of value meaning of value
710 --- ------------- ----------------
711 Mface MFace * The default face.
713 Mfont MFont * The default font.
715 Mfont_width int Width of the default font.
717 Mfont_ascent int Ascent of the default font.
719 Mfont_descent int Descent of the default font.
723 In the m17n-X library, the followings are also accepted.
727 key type of value meaning of value
728 --- ------------- ----------------
729 Mdisplay Display * Display associated with the frame.
731 Mscreen int Screen number of a screen associated
734 Mcolormap Colormap Colormap of the frame.
736 Mdepth unsigned Depth of the frame.
741 @brief ¥Õ¥ì¡¼¥à¤Î¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÊÖ¤¹.
743 ´Ø¿ô mframe_get_prop () ¤Ï¥Õ¥ì¡¼¥à $FRAME ¤Î¥¡¼ $KEY
744 ¤ò»ý¤Ä¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÊÖ¤¹¡£Í¸ú¤Ê¥¡¼¤È¤½¤ÎÃͤϰʲ¼¤ÎÄ̤ꡣ
749 --- ------------- ----------------
750 Mface MFace * ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥§¡¼¥¹
752 Mfont MFont * ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥©¥ó¥È
754 Mfont_width int ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥©¥ó¥È¤ÎÉý
756 Mfont_ascent int ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥©¥ó¥È¤Î ascent
758 Mfont_descent int ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥©¥ó¥È¤Î descent
762 m17n-X ¥é¥¤¥Ö¥é¥ê¤Ç¤Ï¡¢°Ê²¼¤Î¥¡¼¤â»ÈÍѤǤ¤ë¡£
767 --- ------------- ----------------
768 Mdisplay Display * ¥Õ¥ì¡¼¥à¤È´ØÏ¢ÉÕ¤±¤é¤ì¤¿¥Ç¥£¥¹¥×¥ì¥¤
770 Mscreen int ¥Õ¥ì¡¼¥à¤È´ØÏ¢ÉÕ¤±¤é¤ì¤¿¥¹¥¯¥ê¡¼¥ó
773 Mcolormap Colormap ¥Õ¥ì¡¼¥à¤Î¥«¥é¡¼¥Þ¥Ã¥×
775 Mdepth unsigned ¥Õ¥ì¡¼¥à¤Î¿¼¤µ
781 mframe_get_prop (MFrame *frame, MSymbol key)
787 if (key == Mfont_width)
788 return (void *) (frame->average_width);
789 if (key == Mfont_ascent)
790 return (void *) (frame->ascent);
791 if (key == Mfont_descent)
792 return (void *) (frame->descent);
793 return (*frame->driver->get_prop) (frame, key);
799 @brief The default frame.
801 The external variable #mframe_default contains a pointer to the
802 default frame that is created by the first call of mframe (). */
805 @brief ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥ì¡¼¥à.
807 ³°ÉôÊÑ¿ô #mframe_default ¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥ì¡¼¥à¤Ø¤Î¥Ý¥¤¥ó¥¿¤ò»ý¤Ä¡£
808 ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥ì¡¼¥à¤Ï¡¢ºÇ½é¤Ë mframe () ¤¬¸Æ¤Ó½Ð¤µ¤ì¤¿¤È¤¤Ëºî¤é¤ì¤ë¡£ */
810 MFrame *mframe_default;