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);
116 M17N_OBJECT_UNREF (frame->font_driver_list);
121 /** Register a dynamic library of name LIB by a key NAME. */
124 register_device_library (MSymbol name, char *lib)
126 MDeviceLibraryInterface *interface;
128 MSTRUCT_CALLOC (interface, MERROR_WIN);
129 interface->library = malloc (strlen (lib)
130 + strlen (DLOPEN_SHLIB_EXT) + 1);
131 sprintf (interface->library, "%s%s", lib, DLOPEN_SHLIB_EXT);
132 if (! device_library_list)
133 device_library_list = mplist ();
134 mplist_add (device_library_list, name, interface);
140 /** Null device support. */
143 MPlist *realized_fontset_list;
144 MPlist *realized_font_list;
145 MPlist *realized_face_list;
149 null_device_close (MFrame *frame)
154 null_device_get_prop (MFrame *frame, MSymbol key)
160 null_device_realize_face (MRealizedFace *rface)
166 null_device_free_realized_face (MRealizedFace *rface)
170 static MDeviceDriver null_driver =
173 null_device_get_prop,
174 null_device_realize_face,
175 null_device_free_realized_face
181 null_device.realized_fontset_list = mplist ();
182 null_device.realized_font_list = mplist ();
183 null_device.realized_face_list = mplist ();
192 MPLIST_DO (plist, null_device.realized_fontset_list)
193 mfont__free_realized_fontset ((MRealizedFontset *) MPLIST_VAL (plist));
194 M17N_OBJECT_UNREF (null_device.realized_fontset_list);
196 MPLIST_DO (plist, null_device.realized_face_list)
197 mface__free_realized ((MRealizedFace *) MPLIST_VAL (plist));
198 M17N_OBJECT_UNREF (null_device.realized_face_list);
200 MPLIST_DO (plist, null_device.realized_font_list)
201 mfont__free_realized ((MRealizedFont *) MPLIST_VAL (plist));
202 M17N_OBJECT_UNREF (null_device.realized_font_list);
207 null_device_open (MFrame *frame, MPlist *param)
211 frame->device = NULL;
212 frame->device_type = 0;
213 frame->driver = &null_driver;
214 frame->font_driver_list = mplist ();
215 mplist_add (frame->font_driver_list, Mfreetype, &mfont__ft_driver);
216 frame->realized_font_list = null_device.realized_font_list;
217 frame->realized_face_list = null_device.realized_face_list;
218 frame->realized_fontset_list = null_device.realized_fontset_list;
219 face = mface_copy (mface__default);
220 mplist_push (param, Mface, face);
221 M17N_OBJECT_UNREF (face);
225 static MDeviceLibraryInterface null_interface =
226 { NULL, NULL, null_device_init, null_device_open, null_device_fini };
238 int mdebug_mask = MDEBUG_INIT;
240 merror_code = MERROR_NONE;
241 if (m17n__gui_initialized++)
244 if (merror_code != MERROR_NONE)
246 m17n__gui_initialized--;
252 Mgd = msymbol ("gd");
254 Mfont = msymbol ("font");
255 Mfont_width = msymbol ("font-width");
256 Mfont_ascent = msymbol ("font-ascent");
257 Mfont_descent = msymbol ("font-descent");
258 Mdevice = msymbol ("device");
260 Mdisplay = msymbol ("display");
261 Mscreen = msymbol ("screen");
262 Mdrawable = msymbol ("drawable");
263 Mdepth = msymbol ("depth");
264 Mwidget = msymbol ("widget");
267 if (mfont__init () < 0)
269 MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize font module."));
270 if (mfont__fontset_init () < 0)
272 MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize fontset module."));
273 if (mface__init () < 0)
275 MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize face module."));
276 if (mdraw__init () < 0)
278 MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize draw module."));
279 if (minput__win_init () < 0)
281 MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize input-win module."));
282 mframe_default = NULL;
284 register_device_library (Mx, "libm17n-X");
285 register_device_library (Mgd, "libm17n-gd");
290 MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize the m17n GUI module."));
297 int mdebug_mask = MDEBUG_FINI;
300 if (m17n__gui_initialized == 0
301 || --m17n__gui_initialized > 0)
306 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize device modules."));
307 MPLIST_DO (plist, device_library_list)
309 MDeviceLibraryInterface *interface = MPLIST_VAL (plist);
311 if (interface->handle && interface->fini)
313 (*interface->fini) ();
314 dlclose (interface->handle);
316 free (interface->library);
319 if (null_interface.handle)
320 (*null_interface.fini) ();
321 #endif /* not HAVE_FREETYPE */
322 M17N_OBJECT_UNREF (device_library_list);
323 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize input-gui module."));
325 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize draw module."));
327 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize face module."));
329 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize fontset module."));
330 mfont__fontset_fini ();
331 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize font module."));
333 mframe_default = NULL;
335 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize the gui modules."));
341 #endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
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. */
351 @brief @e ¥Õ¥ì¡¼¥à ¤È¤Ï¥°¥é¥Õ¥£¥Ã¥¯¥Ç¥Ð¥¤¥¹¤ËÂбþ¤¹¤ë¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ë.
353 @e ¥Õ¥ì¡¼¥à ¤È¤Ï #MFrame
354 ·¿¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ê¡¢¸Ä¡¹¤Îɽ¼¨¡¿ÆþÎϥǥХ¤¥¹¤Î¾ðÊó¤ò³ÊǼ¤¹¤ë¤¿¤á¤ËÍѤ¤¤é¤ì¤ë¡£
355 ¤Û¤È¤ó¤É¤¹¤Ù¤Æ¤Î m17n GUI´Ø¿ô¤Ï¡¢°ú¿ô¤È¤·¤Æ¥Õ¥ì¡¼¥à¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÍ׵᤹¤ë¡£ */
361 @name Variables: Keys of frame parameter
363 These are the symbols to use in a parameter to create a frame. See
364 the function mframe () for details.
366 #Mdevice, #Mdisplay, #Mscreen, #Mdrawable, #Mdepth, and #Mcolormap
367 are also keys of a frame property. */
370 @name ÊÑ¿ô¡§ ¥Õ¥ì¡¼¥à¥Ñ¥é¥á¡¼¥¿ÍÑ¥¡¼
372 ¥Õ¥ì¡¼¥à¤òÀ¸À®¤¹¤ëºÝ¤Î¥Ñ¥é¥á¡¼¥¿¤ËÍѤ¤¤ë¥·¥ó¥Ü¥ë¡£¾Ü¤·¤¯¤Ï´Ø¿ô
373 mframe () ¤ÎÀâÌÀ»²¾È¡£
375 #Mdevice¡¢ #Mdisplay¡¢ #Mscreen¡¢ #Mdrawable¡¢ #Mdepth¡¢#Mcolormap
376 ¤Ï¥Õ¥ì¡¼¥à¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤Ç¤â¤¢¤ë¡£ */
380 MSymbol Mdevice, Mdisplay, Mscreen, Mdrawable, Mdepth, Mcolormap, Mwidget;
387 @name Variables: Keys of frame property
389 These are the symbols to use as an argument to the function
390 mframe_get_prop (). */
392 @name ÊÑ¿ô¡§ ¥Õ¥ì¡¼¥à¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼
394 ´Ø¿ô mframe_get_prop () ¤Î°ú¿ô¤ËÍѤ¤¤é¤ì¤ë¥·¥ó¥Ü¥ë¡£ */
399 MSymbol Mfont_ascent;
400 MSymbol Mfont_descent;
408 @brief Create a new frame.
410 The mframe () function creates a new frame with parameters listed
411 in $PLIST which may be @c NULL.
413 The recognized keys in $PLIST are window system dependent.
415 The following key is always recognized.
419 <li> #Mdevice, the value must be one of #Mx, #Mgd, and #Mnil.
421 If the value is #Mx, the frame is for X Window System. The
422 argument #MDrawWindow specified together with the frame must be of
423 type @c Window. The frame is both readable and writable, thus all
424 GUI functions can be used.
426 If the value is #Mgd, the frame is for an image object of GD
427 library. The argument #MDrawWindow specified together with the
428 frame must be of type @c gdImagePtr. The frame is writable
429 only, thus functions minput_XXX can't be used for the frame.
431 If the value is #Mnil, the frame is for a null device. The frame
432 is not writable nor readable, thus functions mdraw_XXX that
433 require the argument #MDrawWindow and functions minput_XXX can't
434 be used for the frame.
436 <li> #Mface, the value must be a pointer to #MFace.
438 The value is used as the default face of the frame.
442 In addition, if the value of the key #Mdevice is #Mx, the
443 following keys are recognized. They are to specify the root
444 window and the depth of drawables that can be used with the frame.
448 <li> #Mdrawable, the value type must be <tt>Drawable</tt>.
450 A parameter of key #Mdisplay must also be specified. The
451 created frame can be used for drawables whose root window and
452 depth are the same as those of the specified drawable on the
455 When this parameter is specified, the parameter of key #Mscreen
458 <li> #Mwidget, the value type must be <tt>Widget</tt>.
460 The created frame can be used for drawables whose root window and
461 depth are the same as those of the specified widget.
463 If a parameter of key #Mface is not specified, the default face
464 is created from the resources of the widget.
466 When this parameter is specified, the parameters of key #Mdisplay,
467 #Mscreen, #Mdrawable, #Mdepth are ignored.
469 <li> #Mdepth, the value type must be <tt>unsigned</tt>.
471 The created frame can be used for drawables of the specified
474 <li> #Mscreen, the value type must be <tt>(Screen *)</tt>.
476 The created frame can be used for drawables whose root window is
477 the same as the root window of the specified screen, and depth is
478 the same at the default depth of the screen.
480 When this parameter is specified, parameter of key #Mdisplay is
483 <li> #Mdisplay, the value type must be <tt>(Display *)</tt>.
485 The created frame can be used for drawables whose root window is
486 the same as the root window for the default screen of the display,
487 and depth is the same as the default depth of the screen.
489 <li> #Mcolormap, the value type must be <tt>(Colormap)</tt>.
491 The created frame uses the specified colormap.
493 <li> #Mfont, the value must be #Mx, #Mfreetype, or #Mxft.
495 The created frame uses the specified font backend. The value #Mx
496 instructs to use X core fonts, #Mfreetype to use local fonts
497 supported by FreeType fonts, and #Mxft to use local fonts via Xft
498 library. You can specify this parameter more than once with
499 different values if you want to use multiple font backends. This
500 is ignored if the specified font backend is not supported on the
503 When this parameter is not specified, all font backend supported
504 on the device are used.
509 If the operation was successful, mframe () returns a pointer to a
510 newly created frame. Otherwise, it returns @c NULL. */
513 @brief ¿·¤·¤¤¥Õ¥ì¡¼¥à¤òºî¤ë.
515 ´Ø¿ô mframe () ¤Ï $PLIST Ãæ¤Î¥Ñ¥é¥á¡¼¥¿¤ò»ý¤Ä¿·¤·¤¤¥Õ¥ì¡¼¥à¤òºî¤ë¡£
516 $PLIST ¤Ï @c NULL ¤Ç¤âÎɤ¤¡£
518 $PLIST ¤Ë¸½¤ï¤ì¤ë¥¡¼¤Î¤¦¤Á¤É¤ì¤¬Ç§¼±¤µ¤ì¤ë¤«¤Ï¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¤Ë°Í¸¤¹¤ë¡£
520 °Ê²¼¤Î¥¡¼¤Ï¾ï¤Ëǧ¼±¤µ¤ì¤ë¡£
524 <li> #Mdevice. ÃÍ¤Ï #Mx, #Mgd, #Mnil ¤Î¤¤¤º¤ì¤«¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
526 Ãͤ¬ #Mx ¤Ê¤é¤Ð¡¢¿·¤·¤¤¥Õ¥ì¡¼¥à¤Ï X ¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥àÍѤǤ¢¤ë¡£
527 ¤³¤Î¥Õ¥ì¡¼¥à¤È¶¦¤Ë»ØÄꤵ¤ì¤¿°ú¿ô #MDrawWindow ¤Ï¡¢ @c Window
528 ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¥Õ¥ì¡¼¥à¤ÏÆɤ߽ñ¤¤È¤â¤Ë²Äǽ¤Ç¤¢¤ê¡¢¤¹¤Ù¤Æ¤ÎGUI
531 Ãͤ¬ #Mgd ¤Ê¤é¤Ð¡¢¿·¤·¤¤¥Õ¥ì¡¼¥à¤Ï GD
532 ¥é¥¤¥Ö¥é¥ê¤Î¥¤¥á¡¼¥¸¥ª¥Ö¥¸¥§¥¯¥ÈÍѤǤ¢¤ë¡£¤³¤Î¥Õ¥ì¡¼¥à¤È¶¦¤Ë»ØÄꤵ¤ì¤¿°ú¿ô
533 #MDrawWindow ¤Ï¡¢ @c gdImagePtr ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¥Õ¥ì¡¼¥à¤Ï½ñ¤½Ð¤·ÀìÍѤǤ¢¤ê¡¢
534 minput_ ¤Ç»Ï¤Þ¤ë̾Á°¤Î´Ø¿ô¤Ï»ÈÍѤǤ¤Ê¤¤¡£
536 Ãͤ¬ #Mnil ¤Ê¤é¤Ð¡¢¿·¤·¤¤¥Õ¥ì¡¼¥à¤Ï, null
537 ¥Ç¥Ð¥¤¥¹ÍѤǤ¢¤ë¡£¤³¤Î¥Õ¥ì¡¼¥à¤ÏÆɤ߽ñ¤¤Ç¤¤Ê¤¤¤Î¤Ç¡¢°ú¿ô #MDrawWindow
538 ¤òɬÍפȤ¹¤ëmdraw_ ¤Ç»Ï¤Þ¤ë̾Á°¤Î´Ø¿ô¤ä¡¢minput_ ¤Ç»Ï¤Þ¤ë̾Á°¤Î´Ø¿ô¤Ï»ÈÍѤǤ¤Ê¤¤¡£
540 <li> #Mface. ÃÍ¤Ï #MFace ¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
542 ¤³¤ÎÃͤϥե졼¥à¤Î¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥§¡¼¥¹¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
546 ¤³¤ì¤é¤Î¥¡¼¤Ë²Ã¤¨¡¢#Mdevice ¤Î¥¡¼¤¬ #Mx
547 ¤Ç¤¢¤ë¾ì¹ç¤Ë¸Â¤ê°Ê²¼¤Î¥¡¼¤âǧ¼±¤µ¤ì¤ë¡£°Ê²¼¤Î¥¡¼¤Ï¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤È¡¢¥Õ¥ì¡¼¥à¤ÇÍøÍѤǤ¤ë
548 drawable ¤Î¿¼¤µ¤ò»ØÄꤹ¤ë¡£
552 <li> #Mdrawable. ÃÍ¤Ï <tt>Drawable</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
554 ¥¡¼ #Mdisplay ¤ò»ý¤Ä¥Ñ¥é¥á¡¼¥¿¤â»ØÄꤵ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ë¡£
555 À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤵ¤ì¤¿¥Ç¥£¥¹¥×¥ì¥¤¾å¤Î»ØÄꤵ¤ì¤¿ drawable
556 ¤ÈƱ¤¸¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤È¿¼¤µ¤ò»ý¤Ä drawable ¤ËÍѤ¤¤é¤ì¤ë¡£
558 ¤³¤Î¥Ñ¥é¥á¡¼¥¿¤¬¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢#Mscreen ¤ò¥¡¼¤È¤¹¤ë¥Ñ¥é¥á¡¼¥¿¤Ï̵»ë¤µ¤ì¤ë¡£
560 <li> #Mwidget. ÃÍ¤Ï <tt>Widget</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
562 À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¥¦¥£¥¸¥§¥Ã¥È¤ÈƱ¤¸¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤È¿¼¤µ¤ò»ý¤Ä
563 drawable ¤ËÍѤ¤¤é¤ì¤ë¡£
565 ¥¡¼ #Mface ¤ò»ý¤Ä¥Ñ¥é¥á¡¼¥¿¤¬¤Ê¤±¤ì¤Ð¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥§¡¼¥¹¤Ï¤³¤Î
566 ¥¦¥£¥¸¥§¥Ã¥È¤Î¥ê¥½¡¼¥¹¤«¤éºî¤é¤ì¤ë¡£
568 ¤³¤Î¥Ñ¥é¥á¡¼¥¿¤¬¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢#Mdisplay, #Mscreen, #Mdrawable,
569 #Mdepth ¤ò¥¡¼¤È¤¹¤ë¥Ñ¥é¥á¡¼¥¿¤Ï̵»ë¤µ¤ì¤ë¡£
571 <li> #Mdepth. ÃÍ¤Ï <tt>unsigned</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
573 À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¿¼¤µ¤Î drawable ¤ËÍѤ¤¤é¤ì¤ë¡£
575 <li> #Mscreen. ÃÍ¤Ï <tt>(Screen *)</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
577 À¸À®¤·¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¥¹¥¯¥ê¡¼¥ó¤ÈƱ¤¸¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤ò»ý¤Á¡¢¥¹¥¯¥ê¡¼¥ó¤Î¥Ç¥Õ¥©¥ë¥È¤Î¿¼¤µ¤ÈƱ¤¸¿¼¤µ¤ò»ý¤Ä drawable ¤ËÍѤ¤¤é¤ì¤ë¡£
579 ¤³¤Î¥Ñ¥é¥á¡¼¥¿¤¬¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢#Mdisplay ¤ò¥¡¼¤È¤¹¤ë¥Ñ¥é¥á¡¼¥¿¤Ï̵»ë¤µ¤ì¤ë¡£
581 <li> #Mdisplay. ÃÍ¤Ï <tt>(Display *)</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
583 À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¥Ç¥£¥¹¥×¥ì¥¤¤Î¥Ç¥Õ¥©¥ë¥È¥¹¥¯¥ê¡¼¥ó¤ÈƱ¤¸¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤ÈƱ¤¸¿¼¤µ¤ò»ý¤Ädrawables ¤ËÍѤ¤¤é¤ì¤ë¡£
585 <li> #Mcolormap. ÃÍ¤Ï <tt>(Colormap)</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
587 À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¥«¥é¡¼¥Þ¥Ã¥×¤ò»ÈÍѤ¹¤ë¡£
589 <li> #Mfont. Ãͤϡ¢#Mx, #Mfreetype, #Mxft ¤Î¤¤¤º¤ì¤«¡£
591 À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï»ØÄꤷ¤¿¥Õ¥©¥ó¥È¥Ð¥Ã¥¯¥¨¥ó¥É¤ò»ÈÍѤ¹¤ë¡£Ãͤ¬
592 #Mx ¤Ç¤¢¤ì¤Ð X ¤Î¥³¥¢¥Õ¥©¥ó¥È¡¢#Mfreetype ¤Ç¤¢¤ì¤Ð FreeType
593 ¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¥í¡¼¥«¥ë¥Õ¥©¥ó¥È¡¢#Mxft ¤Ç¤¢¤ì¤Ð Xft
594 ¥é¥¤¥Ö¥é¥ê·Ðͳ¤ÇÍѤ¤¤ë¥í¡¼¥«¥ë¥Õ¥©¥ó¥È¤ò»ÈÍѤ¹¤ë¡£
595 Ê£¿ô¤Î¥Õ¥©¥ó¥È¥Ð¥Ã¥¯¥¨¥ó¥É¤ò»ÈÍѤ·¤¿¤¤¾ì¹ç¤Ë¤Ï¡¢¤³¤Î¥Ñ¥é¥á¡¼¥¿¤òÊ£¿ô²ó¡¢°Û¤Ê¤ëÃͤǻØÄꤹ¤ë¤³¤È¤¬¤Ç¤¤ë¡£
596 »ØÄꤷ¤¿¥Ð¥Ã¥¯¥¨¥ó¥É¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Ê¤¤¥Ç¥Ð¥¤¥¹¤Ç¤Ï¡¢¤³¤Î¥Ñ¥é¥á¡¼¥¿¤Ï̵»ë¤µ¤ì¤ë¡£
598 ¤³¤Î¥Ñ¥é¥á¡¼¥¿¤¬Ìµ¤¤¾ì¹ç¤Ë¤Ï¡¢¥Ç¥Ð¥¤¥¹¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¤¹¤Ù¤Æ¤Î¥Õ¥©¥ó¥È¥Ð¥Ã¥¯¥¨¥ó¥É¤òÍøÍѤ¹¤ë¡£
603 À®¸ù¤¹¤ì¤Ð mframe() ¤Ï¿·¤·¤¤¥Õ¥ì¡¼¥à¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð
607 mframe (MPlist *plist)
610 int plist_created = 0;
613 MDeviceLibraryInterface *interface;
617 pl = mplist_find_by_key (plist, Mdevice);
619 device = MPLIST_VAL (pl);
633 interface = &null_interface;
634 if (! interface->handle)
636 (*interface->init) ();
637 interface->handle = (void *) 1;
639 #else /* not HAVE_FREETYPE */
640 MERROR (MERROR_WIN, NULL);
641 #endif /* not HAVE_FREETYPE */
645 interface = mplist_get (device_library_list, device);
647 MERROR (MERROR_WIN, NULL);
648 if (! interface->handle)
650 if (! (interface->handle = dlopen (interface->library, RTLD_NOW))
651 || ! (interface->init = dlsym (interface->handle, "device_init"))
652 || ! (interface->open = dlsym (interface->handle, "device_open"))
653 || ! (interface->fini = dlsym (interface->handle, "device_fini"))
654 || (*interface->init) () < 0)
656 fprintf (stderr, "%s\n", (char *) dlerror ());
657 if (interface->handle)
658 dlclose (interface->handle);
659 MERROR (MERROR_WIN, NULL);
664 M17N_OBJECT (frame, free_frame, MERROR_FRAME);
665 if ((*interface->open) (frame, plist) < 0)
668 MERROR (MERROR_WIN, NULL);
671 if (! mframe_default)
672 mframe_default = frame;
674 frame->face = mface ();
675 MPLIST_DO (pl, plist)
676 if (MPLIST_KEY (pl) == Mface)
677 mface_merge (frame->face, (MFace *) MPLIST_VAL (pl));
678 mface__update_frame_face (frame);
681 M17N_OBJECT_UNREF (plist);
688 @brief Return property value of frame.
690 The mframe_get_prop () function returns a value of property $KEY
691 of frame $FRAME. The valid keys and the corresponding return
692 values are as follows.
696 key type of value meaning of value
697 --- ------------- ----------------
698 Mface MFace * The default face.
700 Mfont MFont * The default font.
702 Mfont_width int Width of the default font.
704 Mfont_ascent int Ascent of the default font.
706 Mfont_descent int Descent of the default font.
710 In the m17n-X library, the followings are also accepted.
714 key type of value meaning of value
715 --- ------------- ----------------
716 Mdisplay Display * Display associated with the frame.
718 Mscreen int Screen number of a screen associated
721 Mcolormap Colormap Colormap of the frame.
723 Mdepth unsigned Depth of the frame.
728 @brief ¥Õ¥ì¡¼¥à¤Î¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÊÖ¤¹.
730 ´Ø¿ô mframe_get_prop () ¤Ï¥Õ¥ì¡¼¥à $FRAME ¤Î¥¡¼ $KEY
731 ¤ò»ý¤Ä¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÊÖ¤¹¡£Í¸ú¤Ê¥¡¼¤È¤½¤ÎÃͤϰʲ¼¤ÎÄ̤ꡣ
736 --- ------------- ----------------
737 Mface MFace * ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥§¡¼¥¹
739 Mfont MFont * ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥©¥ó¥È
741 Mfont_width int ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥©¥ó¥È¤ÎÉý
743 Mfont_ascent int ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥©¥ó¥È¤Î ascent
745 Mfont_descent int ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥©¥ó¥È¤Î descent
749 m17n-X ¥é¥¤¥Ö¥é¥ê¤Ç¤Ï¡¢°Ê²¼¤Î¥¡¼¤â»ÈÍѤǤ¤ë¡£
754 --- ------------- ----------------
755 Mdisplay Display * ¥Õ¥ì¡¼¥à¤È´ØÏ¢ÉÕ¤±¤é¤ì¤¿¥Ç¥£¥¹¥×¥ì¥¤
757 Mscreen int ¥Õ¥ì¡¼¥à¤È´ØÏ¢ÉÕ¤±¤é¤ì¤¿¥¹¥¯¥ê¡¼¥ó
760 Mcolormap Colormap ¥Õ¥ì¡¼¥à¤Î¥«¥é¡¼¥Þ¥Ã¥×
762 Mdepth unsigned ¥Õ¥ì¡¼¥à¤Î¿¼¤µ
768 mframe_get_prop (MFrame *frame, MSymbol key)
773 return &frame->rface->rfont->font;
774 if (key == Mfont_width)
775 return (void *) (frame->space_width);
776 if (key == Mfont_ascent)
777 return (void *) (frame->ascent);
778 if (key == Mfont_descent)
779 return (void *) (frame->descent);
780 return (*frame->driver->get_prop) (frame, key);
786 @brief The default frame.
788 The external variable #mframe_default contains a pointer to the
789 default frame that is created by the first call of mframe (). */
792 @brief ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥ì¡¼¥à.
794 ³°ÉôÊÑ¿ô #mframe_default ¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥ì¡¼¥à¤Ø¤Î¥Ý¥¤¥ó¥¿¤ò»ý¤Ä¡£
795 ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥ì¡¼¥à¤Ï¡¢ºÇ½é¤Ë mframe () ¤¬¸Æ¤Ó½Ð¤µ¤ì¤¿¤È¤¤Ëºî¤é¤ì¤ë¡£ */
797 MFrame *mframe_default;