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 ¤ò¼ÂÁõ¤¹¤ë¤¿¤á¤ËÍѤ¤¤é¤ì¤Æ¤ª¤ê¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤«¤é
53 ¤ÎľÀܤÎÍøÍѤòǰƬ¤Ë¤ª¤¤¤¿¤â¤Î¤Ç¤Ï¤Ê¤¤¡£
58 #if !defined (FOR_DOXYGEN) || defined (DOXYGEN_INTERNAL_MODULE)
59 /*** @addtogroup m17nInternal
74 #include "m17n-misc.h"
77 #include "internal-gui.h"
82 #ifndef DLOPEN_SHLIB_EXT
83 #define DLOPEN_SHLIB_EXT ".so"
86 /** Information about a dynamic library supporting a specific graphic
90 /** Name of the dynamic library (e.g. "libm17n-X.so"). */
92 /** Handle fo the dynamic library. */
94 /** Function to call just after loading the library. */
96 /** Function to call to open a frame on the graphic device. */
97 int (*open) (MFrame *frame, MPlist *param);
98 /** Function to call just before unloading the library. */
100 } MDeviceLibraryInterface;
103 /** Plist of device symbol vs MDeviceLibraryInterface. */
105 static MPlist *device_library_list;
107 /** Close MFrame and free it. */
110 free_frame (void *object)
112 MFrame *frame = (MFrame *) object;
114 (*frame->driver->close) (frame);
115 M17N_OBJECT_UNREF (frame->face);
117 M17N_OBJECT_UNREF (frame->font_driver_list);
122 /** Register a dynamic library of name LIB by a key NAME. */
125 register_device_library (MSymbol name, char *lib)
127 MDeviceLibraryInterface *interface;
129 MSTRUCT_CALLOC (interface, MERROR_WIN);
130 interface->library = malloc (strlen (lib)
131 + strlen (DLOPEN_SHLIB_EXT) + 1);
132 sprintf (interface->library, "%s%s", lib, DLOPEN_SHLIB_EXT);
133 if (! device_library_list)
134 device_library_list = mplist ();
135 mplist_add (device_library_list, name, interface);
141 /** Null device support. */
144 MPlist *realized_fontset_list;
145 MPlist *realized_font_list;
146 MPlist *realized_face_list;
150 null_device_close (MFrame *frame)
155 null_device_get_prop (MFrame *frame, MSymbol key)
161 null_device_realize_face (MRealizedFace *rface)
167 null_device_free_realized_face (MRealizedFace *rface)
171 static MDeviceDriver null_driver =
174 null_device_get_prop,
175 null_device_realize_face,
176 null_device_free_realized_face
182 null_device.realized_fontset_list = mplist ();
183 null_device.realized_font_list = mplist ();
184 null_device.realized_face_list = mplist ();
193 MPLIST_DO (plist, null_device.realized_fontset_list)
194 mfont__free_realized_fontset ((MRealizedFontset *) MPLIST_VAL (plist));
195 M17N_OBJECT_UNREF (null_device.realized_fontset_list);
197 MPLIST_DO (plist, null_device.realized_face_list)
198 mface__free_realized ((MRealizedFace *) MPLIST_VAL (plist));
199 M17N_OBJECT_UNREF (null_device.realized_face_list);
201 MPLIST_DO (plist, null_device.realized_font_list)
202 mfont__free_realized ((MRealizedFont *) MPLIST_VAL (plist));
203 M17N_OBJECT_UNREF (null_device.realized_font_list);
208 null_device_open (MFrame *frame, MPlist *param)
212 frame->device = NULL;
213 frame->device_type = 0;
214 frame->driver = &null_driver;
215 frame->font_driver_list = mplist ();
216 mplist_add (frame->font_driver_list, Mfreetype, &mfont__ft_driver);
217 frame->realized_font_list = null_device.realized_font_list;
218 frame->realized_face_list = null_device.realized_face_list;
219 frame->realized_fontset_list = null_device.realized_fontset_list;
220 face = mface_copy (mface__default);
221 mplist_push (param, Mface, face);
222 M17N_OBJECT_UNREF (face);
226 static MDeviceLibraryInterface null_interface =
227 { NULL, NULL, null_device_init, null_device_open, null_device_fini };
234 #endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
242 int mdebug_mask = MDEBUG_INIT;
244 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");
270 if (mfont__init () < 0)
272 MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize font module."));
273 if (mfont__fontset_init () < 0)
275 MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize fontset module."));
276 if (mface__init () < 0)
278 MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize face module."));
279 if (mdraw__init () < 0)
281 MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize draw module."));
282 if (minput__win_init () < 0)
284 MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize input-win module."));
285 mframe_default = NULL;
287 register_device_library (Mx, "libm17n-X");
288 register_device_library (Mgd, "libm17n-gd");
293 MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize the m17n GUI module."));
300 int mdebug_mask = MDEBUG_FINI;
303 if (m17n__gui_initialized == 0
304 || --m17n__gui_initialized > 0)
309 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize device modules."));
310 MPLIST_DO (plist, device_library_list)
312 MDeviceLibraryInterface *interface = MPLIST_VAL (plist);
314 if (interface->handle && interface->fini)
316 (*interface->fini) ();
317 dlclose (interface->handle);
319 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."));
343 /*** @addtogroup m17nFrame */
345 @brief A @e frame is an object corresponding to the graphic device.
347 A @e frame is an object of the type #MFrame to hold various
348 information about each display/input device. Almost all m17n GUI
349 functions require a pointer to a frame as an argument. */
352 @brief @e ¥Õ¥ì¡¼¥à ¤È¤Ï¥°¥é¥Õ¥£¥Ã¥¯¥Ç¥Ð¥¤¥¹¤ËÂбþ¤¹¤ë¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ë.
354 @e ¥Õ¥ì¡¼¥à ¤È¤Ï #MFrame ·¿¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ê¡¢¸Ä¡¹¤Îɽ¼¨¡¿ÆþÎÏ¥Ç
355 ¥Ð¥¤¥¹¤Î¾ðÊó¤ò³ÊǼ¤¹¤ë¤¿¤á¤ËÍѤ¤¤é¤ì¤ë¡£¤Û¤È¤ó¤É¤¹¤Ù¤Æ¤Î m17n GUI
356 ´Ø¿ô¤Ï¡¢°ú¿ô¤È¤·¤Æ¥Õ¥ì¡¼¥à¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÍ׵᤹¤ë¡£ */
362 @name Variables: Keys of frame parameter
364 These are the symbols to use in a parameter to creat a frame. See
365 the function mframe () for details.
367 #Mdevice, #Mdisplay, #Mscreen, #Mdrawable, #Mdepth, and #Mcolormap
368 are also keys of a frame property. */
371 @name ÊÑ¿ô¡§ ¥Õ¥ì¡¼¥à¥Ñ¥é¥á¡¼¥¿ÍÑ¥¡¼
373 ¥Õ¥ì¡¼¥à¤òÀ¸À®¤¹¤ëºÝ¤Î¥Ñ¥é¥á¡¼¥¿¤ËÍѤ¤¤ë¥·¥ó¥Ü¥ë¡£¾Ü¤·¤¯¤Ï´Ø¿ô
374 mframe () ¤ÎÀâÌÀ»²¾È¡£
376 #Mdevice¡¢ #Mdisplay¡¢ #Mscreen¡¢ #Mdrawable¡¢ #Mdepth¡¢#Mcolormap
377 ¤Ï¥Õ¥ì¡¼¥à¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤Ç¤â¤¢¤ë¡£ */
381 MSymbol Mdevice, Mdisplay, Mscreen, Mdrawable, Mdepth, Mcolormap, Mwidget;
388 @name Variables: Keys of frame property
390 These are the symbols to use as an argument to the function
391 mframe_get_prop (). */
393 @name ÊÑ¿ô¡§ ¥Õ¥ì¡¼¥à¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼
395 ´Ø¿ô mframe_get_prop () ¤Î°ú¿ô¤ËÍѤ¤¤é¤ì¤ë¥·¥ó¥Ü¥ë¡£ */
400 MSymbol Mfont_ascent;
401 MSymbol Mfont_descent;
409 @brief Create a new frame.
411 The mframe () function creates a new frame with parameters listed
412 in $PLIST which may be @c NULL.
414 The recognized keys in $PLIST are window system dependent.
416 The following key is always recognized.
420 <li> #Mdevice, the value must be one of #Mx, #Mgd, and #Mnil.
422 If the value is #Mx, the frame is for X Window System. The
423 argument #MDrawWindow specified together with the frame must be of
424 type @c Window. The frame is both readable and writable, thus all
425 GUI functions can be used.
427 If the value is #Mgd, the frame is for an image object of GD
428 library. The argument #MDrawWindow specified together with the
429 frame must be of type @c gdImagePtr. The frame is writable
430 only, thus functions minput_XXX can't be used for the frame.
432 If the value is #Mnil, the frame is for a null device. The frame
433 is not writable nor readable, thus functions mdraw_XXX that
434 require the argument #MDrawWindow and functions minput_XXX can't
435 be used for the frame.
437 <li> #Mface, the value must be a pointer to #MFace.
439 The value is used as the default face of the frame.
443 In addition, if the value of the key #Mdevice is #Mx, the
444 following keys are recognized. They are to specify the root
445 window and the depth of drawables that can be used with the frame.
449 <li> #Mdrawable, the value type must be <tt>Drawable</tt>.
451 A parameter of key #Mdisplay must also be specified. The
452 created frame can be used for drawables whose root window and
453 depth are the same as those of the specified drawable on the
456 When this parameter is specified, the parameter of key #Mscreen
459 <li> #Mwidget, the value type must be <tt>Widget</tt>.
461 The created frame can be used for drawables whose root window and
462 depth are the same as those of the specified widget.
464 If a parameter of key #Mface is not specified, the default face
465 is created from the resources of the widget.
467 When this parameter is specified, the parameters of key #Mdisplay,
468 #Mscreen, #Mdrawable, #Mdepth are ignored.
470 <li> #Mdepth, the value type must be <tt>unsigned</tt>.
472 The created frame can be used for drawables of the specified
475 <li> #Mscreen, the value type must be <tt>(Screen *)</tt>.
477 The created frame can be used for drawables whose root window is
478 the same as the root window of the specified screen, and depth is
479 the same at the default depth of the screen.
481 When this parameter is specified, parameter of key #Mdisplay is
484 <li> #Mdisplay, the value type must be <tt>(Display *)</tt>.
486 The created frame can be used for drawables whose root window is
487 the same as the root window for the default screen of the display,
488 and depth is the same as the default depth of the screen.
490 <li> #Mcolormap, the value type must be <tt>(Colormap)</tt>.
492 The created frame uses the specified colormap.
494 <li> #Mfont, the value must be #Mx, #Mfreetype, or #Mxft.
496 The created frame uses the specified font backend. The value #Mx
497 instructs to use X core fonts, #Mfreetype to use local fonts
498 supported by FreeType fonts, and #Mxft to use local fonts via Xft
499 library. You can specify this parameter more than once with
500 different values if you want to use multiple font backends. This
501 is ignored if the specified font backend is not supported on the
504 When this parameter is not specified, all font backend supported
505 on the device are used.
510 If the operation was successful, mframe () returns a pointer to a
511 newly created frame. Otherwise, it returns @c NULL. */
514 @brief ¿·¤·¤¤¥Õ¥ì¡¼¥à¤òºî¤ë.
516 ´Ø¿ô mframe () ¤Ï $PLIST Ãæ¤Î¥Ñ¥é¥á¡¼¥¿¤ò»ý¤Ä¿·¤·¤¤¥Õ¥ì¡¼¥à¤òºî¤ë¡£
517 $PLIST ¤Ï @c NULL ¤Ç¤âÎɤ¤¡£
519 $PLIST ¤Ë¸½¤ï¤ì¤ë¥¡¼¤Î¤¦¤Á¤É¤ì¤¬Ç§¼±¤µ¤ì¤ë¤«¤Ï¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à
522 °Ê²¼¤Î¥¡¼¤Ï¾ï¤Ëǧ¼±¤µ¤ì¤ë¡£
526 <li> #Mdevice. ÃÍ¤Ï #Mx, #Mgd, #Mnil ¤Î¤¤¤º¤ì¤«¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
528 Ãͤ¬ #Mx ¤Ê¤é¤Ð¡¢¿·¤·¤¤¥Õ¥ì¡¼¥à¤Ï X ¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥àÍѤǤ¢¤ë¡£¤³
529 ¤Î¥Õ¥ì¡¼¥à¤È¶¦¤Ë»ØÄꤵ¤ì¤¿°ú¿ô #MDrawWindow ¤Ï¡¢ @c Window ·¿¤Ç¤Ê
530 ¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¥Õ¥ì¡¼¥à¤ÏÆɤ߽ñ¤¤È¤â¤Ë²Äǽ¤Ç¤¢¤ê¡¢¤¹¤Ù¤Æ¤ÎGUI ´Ø
533 Ãͤ¬ #Mgd ¤Ê¤é¤Ð¡¢¿·¤·¤¤¥Õ¥ì¡¼¥à¤Ï GD ¥é¥¤¥Ö¥é¥ê¤Î¥¤¥á¡¼¥¸¥ª¥Ö¥¸¥§
534 ¥¯¥ÈÍѤǤ¢¤ë¡£¤³¤Î¥Õ¥ì¡¼¥à¤È¶¦¤Ë»ØÄꤵ¤ì¤¿°ú¿ô #MDrawWindow ¤Ï¡¢
535 @c gdImagePtr ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¥Õ¥ì¡¼¥à¤Ï½ñ¤½Ð¤·ÀìÍѤǤ¢¤ê¡¢
536 minput_ ¤Ç»Ï¤Þ¤ë̾Á°¤Î´Ø¿ô¤Ï»ÈÍѤǤ¤Ê¤¤¡£
538 Ãͤ¬ #Mnil ¤Ê¤é¤Ð¡¢¿·¤·¤¤¥Õ¥ì¡¼¥à¤Ï, null ¥Ç¥Ð¥¤¥¹ÍѤǤ¢¤ë¡£¤³¤Î¥Õ
539 ¥ì¡¼¥à¤ÏÆɤ߽ñ¤¤Ç¤¤Ê¤¤¤Î¤Ç¡¢°ú¿ô #MDrawWindow ¤òɬÍפȤ¹¤ëmdraw_
540 ¤Ç»Ï¤Þ¤ë̾Á°¤Î´Ø¿ô¤ä¡¢minput_ ¤Ç»Ï¤Þ¤ë̾Á°¤Î´Ø¿ô¤Ï»ÈÍѤǤ¤Ê¤¤¡£
542 <li> #Mface. ÃÍ¤Ï #MFace ¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
544 ¤³¤ÎÃͤϥե졼¥à¤Î¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥§¡¼¥¹¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
548 ¤³¤ì¤é¤Î¥¡¼¤Ë²Ã¤¨¡¢#Mdevice ¤Î¥¡¼¤¬ #Mx ¤Ç¤¢¤ë¾ì¹ç¤Ë¸Â¤ê°Ê²¼¤Î¥¡¼
549 ¤âǧ¼±¤µ¤ì¤ë¡£°Ê²¼¤Î¥¡¼¤Ï¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤È¡¢¥Õ¥ì¡¼¥à¤ÇÍøÍѤǤ¤ë
550 drawable ¤Î¿¼¤µ¤ò»ØÄꤹ¤ë¡£
554 <li> #Mdrawable. ÃÍ¤Ï <tt>Drawable</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
556 ¥¡¼ #Mdisplay ¤ò»ý¤Ä¥Ñ¥é¥á¡¼¥¿¤â»ØÄꤵ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ë¡£À¸À®¤µ
557 ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤵ¤ì¤¿¥Ç¥£¥¹¥×¥ì¥¤¾å¤Î»ØÄꤵ¤ì¤¿ drawable ¤ÈƱ
558 ¤¸¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤È¿¼¤µ¤ò»ý¤Ä drawable ¤ËÍѤ¤¤é¤ì¤ë¡£
560 ¤³¤Î¥Ñ¥é¥á¡¼¥¿¤¬¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢#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 À¸À®¤·¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¥¹¥¯¥ê¡¼¥ó¤ÈƱ¤¸¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤ò»ý¤Á¡¢
581 ¥¹¥¯¥ê¡¼¥ó¤Î¥Ç¥Õ¥©¥ë¥È¤Î¿¼¤µ¤ÈƱ¤¸¿¼¤µ¤ò»ý¤Ä drawable ¤ËÍѤ¤¤é¤ì¤ë¡£
583 ¤³¤Î¥Ñ¥é¥á¡¼¥¿¤¬¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢#Mdisplay ¤ò¥¡¼¤È¤¹¤ë¥Ñ¥é¥á¡¼¥¿¤Ï̵
586 <li> #Mdisplay. ÃÍ¤Ï <tt>(Display *)</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
588 À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¥Ç¥£¥¹¥×¥ì¥¤¤Î¥Ç¥Õ¥©¥ë¥È¥¹¥¯¥ê¡¼¥ó¤È
589 Ʊ¤¸¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤ÈƱ¤¸¿¼¤µ¤ò»ý¤Ädrawables ¤ËÍѤ¤¤é¤ì¤ë¡£
591 <li> #Mcolormap. ÃÍ¤Ï <tt>(Colormap)</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
593 À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¥«¥é¡¼¥Þ¥Ã¥×¤ò»ÈÍѤ¹¤ë¡£
595 <li> #Mfont. Ãͤϡ¢#Mx, #Mfreetype, #Mxft ¤Î¤¤¤º¤ì¤«¡£
597 À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï»ØÄꤷ¤¿¥Õ¥©¥ó¥È¥Ð¥Ã¥¯¥¨¥ó¥É¤ò»ÈÍѤ¹¤ë¡£Ãͤ¬
598 #Mx ¤Ç¤¢¤ì¤Ð X ¤Î¥³¥¢¥Õ¥©¥ó¥È¡¢#Mfreetype ¤Ç¤¢¤ì¤Ð FreeType ¤Ç¥µ¥Ý¡¼
599 ¥È¤µ¤ì¤Æ¤¤¤ë¥í¡¼¥«¥ë¥Õ¥©¥ó¥È¡¢#Mxft ¤Ç¤¢¤ì¤Ð Xft ¥é¥¤¥Ö¥é¥ê·Ðͳ¤Ç
600 ÍѤ¤¤ë¥í¡¼¥«¥ë¥Õ¥©¥ó¥È¤ò»ÈÍѤ¹¤ë¡£Ê£¿ô¤Î¥Õ¥©¥ó¥È¥Ð¥Ã¥¯¥¨¥ó¥É¤ò»ÈÍÑ
601 ¤·¤¿¤¤¾ì¹ç¤Ë¤Ï¡¢¤³¤Î¥Ñ¥é¥á¡¼¥¿¤òÊ£¿ô²ó¡¢°Û¤Ê¤ëÃͤǻØÄꤹ¤ë¤³¤È¤¬¤Ç
602 ¤¤ë¡£»ØÄꤷ¤¿¥Ð¥Ã¥¯¥¨¥ó¥É¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Ê¤¤¥Ç¥Ð¥¤¥¹¤Ç¤Ï¡¢¤³¤Î
603 ¥Ñ¥é¥á¡¼¥¿¤Ï̵»ë¤µ¤ì¤ë¡£
605 ¤³¤Î¥Ñ¥é¥á¡¼¥¿¤¬Ìµ¤¤¾ì¹ç¤Ë¤Ï¡¢¥Ç¥Ð¥¤¥¹¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¤¹¤Ù¤Æ¤Î
606 ¥Õ¥©¥ó¥È¥Ð¥Ã¥¯¥¨¥ó¥É¤òÍøÍѤ¹¤ë¡£
611 À®¸ù¤¹¤ì¤Ð mframe() ¤Ï¿·¤·¤¤¥Õ¥ì¡¼¥à¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±
612 ¤ì¤Ð @c NULL ¤òÊÖ¤¹¡£ */
615 mframe (MPlist *plist)
618 int plist_created = 0;
621 MDeviceLibraryInterface *interface;
625 pl = mplist_find_by_key (plist, Mdevice);
627 device = MPLIST_VAL (pl);
641 interface = &null_interface;
642 if (! interface->handle)
644 (*interface->init) ();
645 interface->handle = (void *) 1;
647 #else /* not HAVE_FREETYPE */
648 MERROR (MERROR_WIN, NULL);
649 #endif /* not HAVE_FREETYPE */
653 interface = mplist_get (device_library_list, device);
655 MERROR (MERROR_WIN, NULL);
656 if (! interface->handle)
658 if (! (interface->handle = dlopen (interface->library, RTLD_NOW))
659 || ! (interface->init = dlsym (interface->handle, "device_init"))
660 || ! (interface->open = dlsym (interface->handle, "device_open"))
661 || ! (interface->fini = dlsym (interface->handle, "device_fini"))
662 || (*interface->init) () < 0)
664 fprintf (stderr, "%s\n", (char *) dlerror ());
665 if (interface->handle)
666 dlclose (interface->handle);
667 MERROR (MERROR_WIN, NULL);
672 M17N_OBJECT (frame, free_frame, MERROR_FRAME);
673 if ((*interface->open) (frame, plist) < 0)
676 MERROR (MERROR_WIN, NULL);
679 if (! mframe_default)
680 mframe_default = frame;
682 frame->face = mface ();
683 MPLIST_DO (pl, plist)
684 if (MPLIST_KEY (pl) == Mface)
685 mface_merge (frame->face, (MFace *) MPLIST_VAL (pl));
686 mface__update_frame_face (frame);
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->font;
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 () ¤¬¸Æ¤Ó½Ð¤µ¤ì¤¿¤È¤¤Ë
806 MFrame *mframe_default;