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., 59 Temple Place, Suite 330, Boston, MA
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 fo 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_mask = MDEBUG_INIT;
242 merror_code = MERROR_NONE;
243 if (m17n__gui_initialized++)
246 if (merror_code != MERROR_NONE)
248 m17n__gui_initialized--;
254 Mgd = msymbol ("gd");
256 Mfont = msymbol ("font");
257 Mfont_width = msymbol ("font-width");
258 Mfont_ascent = msymbol ("font-ascent");
259 Mfont_descent = msymbol ("font-descent");
260 Mdevice = msymbol ("device");
262 Mdisplay = msymbol ("display");
263 Mscreen = msymbol ("screen");
264 Mdrawable = msymbol ("drawable");
265 Mdepth = msymbol ("depth");
266 Mwidget = msymbol ("widget");
269 if (mfont__init () < 0)
271 MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize font module."));
272 if (mfont__fontset_init () < 0)
274 MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize fontset module."));
275 if (mface__init () < 0)
277 MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize face module."));
278 if (mdraw__init () < 0)
280 MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize draw module."));
281 if (minput__win_init () < 0)
283 MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize input-win module."));
284 mframe_default = NULL;
286 register_device_library (Mx, "libm17n-X");
287 register_device_library (Mgd, "libm17n-gd");
292 MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize the m17n GUI module."));
299 int mdebug_mask = MDEBUG_FINI;
302 if (m17n__gui_initialized == 0
303 || --m17n__gui_initialized > 0)
308 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize device modules."));
309 MPLIST_DO (plist, device_library_list)
311 MDeviceLibraryInterface *interface = MPLIST_VAL (plist);
313 if (interface->handle && interface->fini)
315 (*interface->fini) ();
316 dlclose (interface->handle);
318 free (interface->library);
322 if (null_interface.handle)
323 (*null_interface.fini) ();
324 #endif /* not HAVE_FREETYPE */
325 M17N_OBJECT_UNREF (device_library_list);
326 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize input-gui module."));
328 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize draw module."));
330 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize face module."));
332 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize fontset module."));
333 mfont__fontset_fini ();
334 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize font module."));
336 mframe_default = NULL;
338 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize the gui modules."));
344 #endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
346 /*** @addtogroup m17nFrame */
348 @brief A @e frame is an object corresponding to the graphic device.
350 A @e frame is an object of the type #MFrame to hold various
351 information about each display/input device. Almost all m17n GUI
352 functions require a pointer to a frame as an argument. */
354 @brief @e ¥Õ¥ì¡¼¥à ¤È¤Ï¥°¥é¥Õ¥£¥Ã¥¯¥Ç¥Ð¥¤¥¹¤ËÂбþ¤¹¤ë¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ë.
356 @e ¥Õ¥ì¡¼¥à ¤È¤Ï #MFrame
357 ·¿¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ê¡¢¸Ä¡¹¤Îɽ¼¨¡¿ÆþÎϥǥХ¤¥¹¤Î¾ðÊó¤ò³ÊǼ¤¹¤ë¤¿¤á¤ËÍѤ¤¤é¤ì¤ë¡£
358 ¤Û¤È¤ó¤É¤¹¤Ù¤Æ¤Î m17n GUI´Ø¿ô¤Ï¡¢°ú¿ô¤È¤·¤Æ¥Õ¥ì¡¼¥à¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÍ׵᤹¤ë¡£ */
364 @name Variables: Keys of frame parameter
366 These are the symbols to use in a parameter to create a frame. See
367 the function mframe () for details.
369 #Mdevice, #Mdisplay, #Mscreen, #Mdrawable, #Mdepth, and #Mcolormap
370 are also keys of a frame property. */
373 @name ÊÑ¿ô¡§ ¥Õ¥ì¡¼¥à¥Ñ¥é¥á¡¼¥¿ÍÑ¥¡¼
375 ¥Õ¥ì¡¼¥à¤òÀ¸À®¤¹¤ëºÝ¤Î¥Ñ¥é¥á¡¼¥¿¤ËÍѤ¤¤ë¥·¥ó¥Ü¥ë¡£¾Ü¤·¤¯¤Ï´Ø¿ô
376 mframe () ¤ÎÀâÌÀ»²¾È¡£
378 #Mdevice¡¢ #Mdisplay¡¢ #Mscreen¡¢ #Mdrawable¡¢ #Mdepth¡¢#Mcolormap
379 ¤Ï¥Õ¥ì¡¼¥à¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤Ç¤â¤¢¤ë¡£ */
383 MSymbol Mdevice, Mdisplay, Mscreen, Mdrawable, Mdepth, Mcolormap, Mwidget;
390 @name Variables: Keys of frame property
392 These are the symbols to use as an argument to the function
393 mframe_get_prop (). */
395 @name ÊÑ¿ô¡§ ¥Õ¥ì¡¼¥à¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼
397 ´Ø¿ô mframe_get_prop () ¤Î°ú¿ô¤ËÍѤ¤¤é¤ì¤ë¥·¥ó¥Ü¥ë¡£ */
402 MSymbol Mfont_ascent;
403 MSymbol Mfont_descent;
411 @brief Create a new frame.
413 The mframe () function creates a new frame with parameters listed
414 in $PLIST which may be @c NULL.
416 The recognized keys in $PLIST are window system dependent.
418 The following key is always recognized.
422 <li> #Mdevice, the value must be one of #Mx, #Mgd, and #Mnil.
424 If the value is #Mx, the frame is for X Window System. The
425 argument #MDrawWindow specified together with the frame must be of
426 type @c Window. The frame is both readable and writable, thus all
427 GUI functions can be used.
429 If the value is #Mgd, the frame is for an image object of GD
430 library. The argument #MDrawWindow specified together with the
431 frame must be of type @c gdImagePtr. The frame is writable
432 only, thus functions minput_XXX can't be used for the frame.
434 If the value is #Mnil, the frame is for a null device. The frame
435 is not writable nor readable, thus functions mdraw_XXX that
436 require the argument #MDrawWindow and functions minput_XXX can't
437 be used for the frame.
439 <li> #Mface, the value must be a pointer to #MFace.
441 The value is used as the default face of the frame.
445 In addition, if the value of the key #Mdevice is #Mx, the
446 following keys are recognized. They are to specify the root
447 window and the depth of drawables that can be used with the frame.
451 <li> #Mdrawable, the value type must be <tt>Drawable</tt>.
453 A parameter of key #Mdisplay must also be specified. The
454 created frame can be used for drawables whose root window and
455 depth are the same as those of the specified drawable on the
458 When this parameter is specified, the parameter of key #Mscreen
461 <li> #Mwidget, the value type must be <tt>Widget</tt>.
463 The created frame can be used for drawables whose root window and
464 depth are the same as those of the specified widget.
466 If a parameter of key #Mface is not specified, the default face
467 is created from the resources of the widget.
469 When this parameter is specified, the parameters of key #Mdisplay,
470 #Mscreen, #Mdrawable, #Mdepth are ignored.
472 <li> #Mdepth, the value type must be <tt>unsigned</tt>.
474 The created frame can be used for drawables of the specified
477 <li> #Mscreen, the value type must be <tt>(Screen *)</tt>.
479 The created frame can be used for drawables whose root window is
480 the same as the root window of the specified screen, and depth is
481 the same at the default depth of the screen.
483 When this parameter is specified, parameter of key #Mdisplay is
486 <li> #Mdisplay, the value type must be <tt>(Display *)</tt>.
488 The created frame can be used for drawables whose root window is
489 the same as the root window for the default screen of the display,
490 and depth is the same as the default depth of the screen.
492 <li> #Mcolormap, the value type must be <tt>(Colormap)</tt>.
494 The created frame uses the specified colormap.
496 <li> #Mfont, the value must be #Mx, #Mfreetype, or #Mxft.
498 The created frame uses the specified font backend. The value #Mx
499 instructs to use X core fonts, #Mfreetype to use local fonts
500 supported by FreeType fonts, and #Mxft to use local fonts via Xft
501 library. You can specify this parameter more than once with
502 different values if you want to use multiple font backends. This
503 is ignored if the specified font backend is not supported on the
506 When this parameter is not specified, all font backend supported
507 on the device are used.
512 If the operation was successful, mframe () returns a pointer to a
513 newly created frame. Otherwise, it returns @c NULL. */
516 @brief ¿·¤·¤¤¥Õ¥ì¡¼¥à¤òºî¤ë.
518 ´Ø¿ô mframe () ¤Ï $PLIST Ãæ¤Î¥Ñ¥é¥á¡¼¥¿¤ò»ý¤Ä¿·¤·¤¤¥Õ¥ì¡¼¥à¤òºî¤ë¡£
519 $PLIST ¤Ï @c NULL ¤Ç¤âÎɤ¤¡£
521 $PLIST ¤Ë¸½¤ï¤ì¤ë¥¡¼¤Î¤¦¤Á¤É¤ì¤¬Ç§¼±¤µ¤ì¤ë¤«¤Ï¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¤Ë°Í¸¤¹¤ë¡£
523 °Ê²¼¤Î¥¡¼¤Ï¾ï¤Ëǧ¼±¤µ¤ì¤ë¡£
527 <li> #Mdevice. ÃÍ¤Ï #Mx, #Mgd, #Mnil ¤Î¤¤¤º¤ì¤«¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
529 Ãͤ¬ #Mx ¤Ê¤é¤Ð¡¢¿·¤·¤¤¥Õ¥ì¡¼¥à¤Ï X ¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥àÍѤǤ¢¤ë¡£
530 ¤³¤Î¥Õ¥ì¡¼¥à¤È¶¦¤Ë»ØÄꤵ¤ì¤¿°ú¿ô #MDrawWindow ¤Ï¡¢ @c Window
531 ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¥Õ¥ì¡¼¥à¤ÏÆɤ߽ñ¤¤È¤â¤Ë²Äǽ¤Ç¤¢¤ê¡¢¤¹¤Ù¤Æ¤ÎGUI
534 Ãͤ¬ #Mgd ¤Ê¤é¤Ð¡¢¿·¤·¤¤¥Õ¥ì¡¼¥à¤Ï GD
535 ¥é¥¤¥Ö¥é¥ê¤Î¥¤¥á¡¼¥¸¥ª¥Ö¥¸¥§¥¯¥ÈÍѤǤ¢¤ë¡£¤³¤Î¥Õ¥ì¡¼¥à¤È¶¦¤Ë»ØÄꤵ¤ì¤¿°ú¿ô
536 #MDrawWindow ¤Ï¡¢ @c gdImagePtr ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¥Õ¥ì¡¼¥à¤Ï½ñ¤½Ð¤·ÀìÍѤǤ¢¤ê¡¢
537 minput_ ¤Ç»Ï¤Þ¤ë̾Á°¤Î´Ø¿ô¤Ï»ÈÍѤǤ¤Ê¤¤¡£
539 Ãͤ¬ #Mnil ¤Ê¤é¤Ð¡¢¿·¤·¤¤¥Õ¥ì¡¼¥à¤Ï, null
540 ¥Ç¥Ð¥¤¥¹ÍѤǤ¢¤ë¡£¤³¤Î¥Õ¥ì¡¼¥à¤ÏÆɤ߽ñ¤¤Ç¤¤Ê¤¤¤Î¤Ç¡¢°ú¿ô #MDrawWindow
541 ¤òɬÍפȤ¹¤ëmdraw_ ¤Ç»Ï¤Þ¤ë̾Á°¤Î´Ø¿ô¤ä¡¢minput_ ¤Ç»Ï¤Þ¤ë̾Á°¤Î´Ø¿ô¤Ï»ÈÍѤǤ¤Ê¤¤¡£
543 <li> #Mface. ÃÍ¤Ï #MFace ¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
545 ¤³¤ÎÃͤϥե졼¥à¤Î¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥§¡¼¥¹¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
549 ¤³¤ì¤é¤Î¥¡¼¤Ë²Ã¤¨¡¢#Mdevice ¤Î¥¡¼¤¬ #Mx
550 ¤Ç¤¢¤ë¾ì¹ç¤Ë¸Â¤ê°Ê²¼¤Î¥¡¼¤âǧ¼±¤µ¤ì¤ë¡£°Ê²¼¤Î¥¡¼¤Ï¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤È¡¢¥Õ¥ì¡¼¥à¤ÇÍøÍѤǤ¤ë
551 drawable ¤Î¿¼¤µ¤ò»ØÄꤹ¤ë¡£
555 <li> #Mdrawable. ÃÍ¤Ï <tt>Drawable</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
557 ¥¡¼ #Mdisplay ¤ò»ý¤Ä¥Ñ¥é¥á¡¼¥¿¤â»ØÄꤵ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ë¡£
558 À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤵ¤ì¤¿¥Ç¥£¥¹¥×¥ì¥¤¾å¤Î»ØÄꤵ¤ì¤¿ drawable
559 ¤ÈƱ¤¸¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤È¿¼¤µ¤ò»ý¤Ä drawable ¤ËÍѤ¤¤é¤ì¤ë¡£
561 ¤³¤Î¥Ñ¥é¥á¡¼¥¿¤¬¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢#Mscreen ¤ò¥¡¼¤È¤¹¤ë¥Ñ¥é¥á¡¼¥¿¤Ï̵»ë¤µ¤ì¤ë¡£
563 <li> #Mwidget. ÃÍ¤Ï <tt>Widget</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
565 À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¥¦¥£¥¸¥§¥Ã¥È¤ÈƱ¤¸¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤È¿¼¤µ¤ò»ý¤Ä
566 drawable ¤ËÍѤ¤¤é¤ì¤ë¡£
568 ¥¡¼ #Mface ¤ò»ý¤Ä¥Ñ¥é¥á¡¼¥¿¤¬¤Ê¤±¤ì¤Ð¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥§¡¼¥¹¤Ï¤³¤Î
569 ¥¦¥£¥¸¥§¥Ã¥È¤Î¥ê¥½¡¼¥¹¤«¤éºî¤é¤ì¤ë¡£
571 ¤³¤Î¥Ñ¥é¥á¡¼¥¿¤¬¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢#Mdisplay, #Mscreen, #Mdrawable,
572 #Mdepth ¤ò¥¡¼¤È¤¹¤ë¥Ñ¥é¥á¡¼¥¿¤Ï̵»ë¤µ¤ì¤ë¡£
574 <li> #Mdepth. ÃÍ¤Ï <tt>unsigned</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
576 À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¿¼¤µ¤Î drawable ¤ËÍѤ¤¤é¤ì¤ë¡£
578 <li> #Mscreen. ÃÍ¤Ï <tt>(Screen *)</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
580 À¸À®¤·¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¥¹¥¯¥ê¡¼¥ó¤ÈƱ¤¸¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤ò»ý¤Á¡¢¥¹¥¯¥ê¡¼¥ó¤Î¥Ç¥Õ¥©¥ë¥È¤Î¿¼¤µ¤ÈƱ¤¸¿¼¤µ¤ò»ý¤Ä drawable ¤ËÍѤ¤¤é¤ì¤ë¡£
582 ¤³¤Î¥Ñ¥é¥á¡¼¥¿¤¬¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢#Mdisplay ¤ò¥¡¼¤È¤¹¤ë¥Ñ¥é¥á¡¼¥¿¤Ï̵»ë¤µ¤ì¤ë¡£
584 <li> #Mdisplay. ÃÍ¤Ï <tt>(Display *)</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
586 À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¥Ç¥£¥¹¥×¥ì¥¤¤Î¥Ç¥Õ¥©¥ë¥È¥¹¥¯¥ê¡¼¥ó¤ÈƱ¤¸¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤ÈƱ¤¸¿¼¤µ¤ò»ý¤Ädrawables ¤ËÍѤ¤¤é¤ì¤ë¡£
588 <li> #Mcolormap. ÃÍ¤Ï <tt>(Colormap)</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
590 À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¥«¥é¡¼¥Þ¥Ã¥×¤ò»ÈÍѤ¹¤ë¡£
592 <li> #Mfont. Ãͤϡ¢#Mx, #Mfreetype, #Mxft ¤Î¤¤¤º¤ì¤«¡£
594 À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï»ØÄꤷ¤¿¥Õ¥©¥ó¥È¥Ð¥Ã¥¯¥¨¥ó¥É¤ò»ÈÍѤ¹¤ë¡£Ãͤ¬
595 #Mx ¤Ç¤¢¤ì¤Ð X ¤Î¥³¥¢¥Õ¥©¥ó¥È¡¢#Mfreetype ¤Ç¤¢¤ì¤Ð FreeType
596 ¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¥í¡¼¥«¥ë¥Õ¥©¥ó¥È¡¢#Mxft ¤Ç¤¢¤ì¤Ð Xft
597 ¥é¥¤¥Ö¥é¥ê·Ðͳ¤ÇÍѤ¤¤ë¥í¡¼¥«¥ë¥Õ¥©¥ó¥È¤ò»ÈÍѤ¹¤ë¡£
598 Ê£¿ô¤Î¥Õ¥©¥ó¥È¥Ð¥Ã¥¯¥¨¥ó¥É¤ò»ÈÍѤ·¤¿¤¤¾ì¹ç¤Ë¤Ï¡¢¤³¤Î¥Ñ¥é¥á¡¼¥¿¤òÊ£¿ô²ó¡¢°Û¤Ê¤ëÃͤǻØÄꤹ¤ë¤³¤È¤¬¤Ç¤¤ë¡£
599 »ØÄꤷ¤¿¥Ð¥Ã¥¯¥¨¥ó¥É¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Ê¤¤¥Ç¥Ð¥¤¥¹¤Ç¤Ï¡¢¤³¤Î¥Ñ¥é¥á¡¼¥¿¤Ï̵»ë¤µ¤ì¤ë¡£
601 ¤³¤Î¥Ñ¥é¥á¡¼¥¿¤¬Ìµ¤¤¾ì¹ç¤Ë¤Ï¡¢¥Ç¥Ð¥¤¥¹¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¤¹¤Ù¤Æ¤Î¥Õ¥©¥ó¥È¥Ð¥Ã¥¯¥¨¥ó¥É¤òÍøÍѤ¹¤ë¡£
606 À®¸ù¤¹¤ì¤Ð mframe() ¤Ï¿·¤·¤¤¥Õ¥ì¡¼¥à¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð
610 mframe (MPlist *plist)
613 int plist_created = 0;
616 MDeviceLibraryInterface *interface;
620 pl = mplist_find_by_key (plist, Mdevice);
622 device = MPLIST_VAL (pl);
636 interface = &null_interface;
637 if (! interface->handle)
639 (*interface->init) ();
640 interface->handle = (void *) 1;
642 #else /* not HAVE_FREETYPE */
643 MERROR (MERROR_WIN, NULL);
644 #endif /* not HAVE_FREETYPE */
648 interface = mplist_get (device_library_list, device);
650 MERROR (MERROR_WIN, NULL);
651 if (! interface->handle)
653 if (! (interface->handle = dlopen (interface->library, RTLD_NOW))
654 || ! (interface->init
655 = (int (*) ()) dlsym (interface->handle, "device_init"))
656 || ! (interface->open
657 = (int (*) (MFrame *, MPlist *)) dlsym (interface->handle,
659 || ! (interface->fini
660 = (int (*) ()) dlsym (interface->handle, "device_fini"))
661 || (*interface->init) () < 0)
663 fprintf (stderr, "%s\n", (char *) dlerror ());
664 if (interface->handle)
665 dlclose (interface->handle);
666 MERROR (MERROR_WIN, NULL);
671 M17N_OBJECT (frame, free_frame, MERROR_FRAME);
672 if ((*interface->open) (frame, plist) < 0)
675 MERROR (MERROR_WIN, NULL);
678 if (! mframe_default)
679 mframe_default = frame;
681 frame->face = mface ();
682 MPLIST_DO (pl, plist)
683 if (MPLIST_KEY (pl) == Mface)
684 mface_merge (frame->face, (MFace *) MPLIST_VAL (pl));
685 mface__update_frame_face (frame);
686 frame->font = frame->rface->rfont ? frame->rface->rfont->font : NULL;
689 M17N_OBJECT_UNREF (plist);
696 @brief Return property value of frame.
698 The mframe_get_prop () function returns a value of property $KEY
699 of frame $FRAME. The valid keys and the corresponding return
700 values are as follows.
704 key type of value meaning of value
705 --- ------------- ----------------
706 Mface MFace * The default face.
708 Mfont MFont * The default font.
710 Mfont_width int Width of the default font.
712 Mfont_ascent int Ascent of the default font.
714 Mfont_descent int Descent of the default font.
718 In the m17n-X library, the followings are also accepted.
722 key type of value meaning of value
723 --- ------------- ----------------
724 Mdisplay Display * Display associated with the frame.
726 Mscreen int Screen number of a screen associated
729 Mcolormap Colormap Colormap of the frame.
731 Mdepth unsigned Depth of the frame.
736 @brief ¥Õ¥ì¡¼¥à¤Î¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÊÖ¤¹.
738 ´Ø¿ô mframe_get_prop () ¤Ï¥Õ¥ì¡¼¥à $FRAME ¤Î¥¡¼ $KEY
739 ¤ò»ý¤Ä¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÊÖ¤¹¡£Í¸ú¤Ê¥¡¼¤È¤½¤ÎÃͤϰʲ¼¤ÎÄ̤ꡣ
744 --- ------------- ----------------
745 Mface MFace * ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥§¡¼¥¹
747 Mfont MFont * ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥©¥ó¥È
749 Mfont_width int ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥©¥ó¥È¤ÎÉý
751 Mfont_ascent int ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥©¥ó¥È¤Î ascent
753 Mfont_descent int ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥©¥ó¥È¤Î descent
757 m17n-X ¥é¥¤¥Ö¥é¥ê¤Ç¤Ï¡¢°Ê²¼¤Î¥¡¼¤â»ÈÍѤǤ¤ë¡£
762 --- ------------- ----------------
763 Mdisplay Display * ¥Õ¥ì¡¼¥à¤È´ØÏ¢ÉÕ¤±¤é¤ì¤¿¥Ç¥£¥¹¥×¥ì¥¤
765 Mscreen int ¥Õ¥ì¡¼¥à¤È´ØÏ¢ÉÕ¤±¤é¤ì¤¿¥¹¥¯¥ê¡¼¥ó
768 Mcolormap Colormap ¥Õ¥ì¡¼¥à¤Î¥«¥é¡¼¥Þ¥Ã¥×
770 Mdepth unsigned ¥Õ¥ì¡¼¥à¤Î¿¼¤µ
776 mframe_get_prop (MFrame *frame, MSymbol key)
781 return (frame->rface->rfont ? frame->rface->rfont->font : NULL);
782 if (key == Mfont_width)
783 return (void *) (frame->space_width);
784 if (key == Mfont_ascent)
785 return (void *) (frame->ascent);
786 if (key == Mfont_descent)
787 return (void *) (frame->descent);
788 return (*frame->driver->get_prop) (frame, key);
794 @brief The default frame.
796 The external variable #mframe_default contains a pointer to the
797 default frame that is created by the first call of mframe (). */
800 @brief ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥ì¡¼¥à.
802 ³°ÉôÊÑ¿ô #mframe_default ¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥ì¡¼¥à¤Ø¤Î¥Ý¥¤¥ó¥¿¤ò»ý¤Ä¡£
803 ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥ì¡¼¥à¤Ï¡¢ºÇ½é¤Ë mframe () ¤¬¸Æ¤Ó½Ð¤µ¤ì¤¿¤È¤¤Ëºî¤é¤ì¤ë¡£ */
805 MFrame *mframe_default;