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 static int win_initialized;
84 #ifndef DLOPEN_SHLIB_EXT
85 #define DLOPEN_SHLIB_EXT ".so"
88 /** Information about a dynamic library supporting a specific graphic
92 /** Name of the dynamic library (e.g. "libm17n-X.so"). */
94 /** Handle fo the dynamic library. */
96 /** Function to call just after loading the library. */
98 /** Function to call to open a frame on the graphic device. */
99 int (*open) (MFrame *frame, MPlist *param);
100 /** Function to call just before unloading the library. */
102 } MDeviceLibraryInterface;
105 /** Plist of device symbol vs MDeviceLibraryInterface. */
107 static MPlist *device_library_list;
109 /** Close MFrame and free it. */
112 free_frame (void *object)
114 MFrame *frame = (MFrame *) object;
116 (*frame->driver->close) (frame);
117 M17N_OBJECT_UNREF (frame->face);
119 M17N_OBJECT_UNREF (frame->font_driver_list);
124 /** Register a dynamic library of name LIB by a key NAME. */
127 register_device_library (MSymbol name, char *lib)
129 MDeviceLibraryInterface *interface;
131 MSTRUCT_CALLOC (interface, MERROR_WIN);
132 interface->library = malloc (strlen (lib)
133 + strlen (DLOPEN_SHLIB_EXT) + 1);
134 sprintf (interface->library, "%s%s", lib, DLOPEN_SHLIB_EXT);
135 if (! device_library_list)
136 device_library_list = mplist ();
137 mplist_add (device_library_list, name, interface);
143 /** Null device support. */
146 MPlist *realized_fontset_list;
147 MPlist *realized_font_list;
148 MPlist *realized_face_list;
152 null_device_close (MFrame *frame)
157 null_device_get_prop (MFrame *frame, MSymbol key)
163 null_device_realize_face (MRealizedFace *rface)
169 null_device_free_realized_face (MRealizedFace *rface)
173 static MDeviceDriver null_driver =
176 null_device_get_prop,
177 null_device_realize_face,
178 null_device_free_realized_face
184 null_device.realized_fontset_list = mplist ();
185 null_device.realized_font_list = mplist ();
186 null_device.realized_face_list = mplist ();
195 MPLIST_DO (plist, null_device.realized_fontset_list)
196 mfont__free_realized_fontset ((MRealizedFontset *) MPLIST_VAL (plist));
197 M17N_OBJECT_UNREF (null_device.realized_fontset_list);
199 MPLIST_DO (plist, null_device.realized_face_list)
200 mface__free_realized ((MRealizedFace *) MPLIST_VAL (plist));
201 M17N_OBJECT_UNREF (null_device.realized_face_list);
203 MPLIST_DO (plist, null_device.realized_font_list)
204 mfont__free_realized ((MRealizedFont *) MPLIST_VAL (plist));
205 M17N_OBJECT_UNREF (null_device.realized_font_list);
210 null_device_open (MFrame *frame, MPlist *param)
214 frame->device = NULL;
215 frame->device_type = 0;
216 frame->driver = &null_driver;
217 frame->font_driver_list = mplist ();
218 mplist_add (frame->font_driver_list, Mfreetype, &mfont__ft_driver);
219 frame->realized_font_list = null_device.realized_font_list;
220 frame->realized_face_list = null_device.realized_face_list;
221 frame->realized_fontset_list = null_device.realized_fontset_list;
222 face = mface_copy (mface__default);
223 mplist_push (param, Mface, face);
224 M17N_OBJECT_UNREF (face);
228 static MDeviceLibraryInterface null_interface =
229 { NULL, NULL, null_device_init, null_device_open, null_device_fini };
236 #endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
244 int mdebug_mask = MDEBUG_INIT;
246 if (win_initialized++)
249 if (merror_code != MERROR_NONE)
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."));
300 int mdebug_mask = MDEBUG_FINI;
302 if (win_initialized > 1)
311 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize device modules."));
312 MPLIST_DO (plist, device_library_list)
314 MDeviceLibraryInterface *interface = MPLIST_VAL (plist);
316 if (interface->handle && interface->fini)
318 (*interface->fini) ();
319 dlclose (interface->handle);
321 free (interface->library);
324 if (null_interface.handle)
325 (*null_interface.fini) ();
326 #endif /* not HAVE_FREETYPE */
327 M17N_OBJECT_UNREF (device_library_list);
328 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize input-gui module."));
330 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize draw module."));
332 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize face module."));
334 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize fontset module."));
335 mfont__fontset_fini ();
336 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize font module."));
338 mframe_default = NULL;
340 MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize the gui modules."));
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. */
355 @brief @e ¥Õ¥ì¡¼¥à ¤È¤Ï¥°¥é¥Õ¥£¥Ã¥¯¥Ç¥Ð¥¤¥¹¤ËÂбþ¤¹¤ë¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ë.
357 @e ¥Õ¥ì¡¼¥à ¤È¤Ï #MFrame ·¿¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ê¡¢¸Ä¡¹¤Îɽ¼¨¡¿ÆþÎÏ¥Ç
358 ¥Ð¥¤¥¹¤Î¾ðÊó¤ò³ÊǼ¤¹¤ë¤¿¤á¤ËÍѤ¤¤é¤ì¤ë¡£¤Û¤È¤ó¤É¤¹¤Ù¤Æ¤Î m17n GUI
359 ´Ø¿ô¤Ï¡¢°ú¿ô¤È¤·¤Æ¥Õ¥ì¡¼¥à¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÍ׵᤹¤ë¡£ */
365 @name Variables: Keys of frame parameter
367 These are the symbols to use in a parameter to creat a frame. See
368 the function mframe () for details.
370 #Mdevice, #Mdisplay, #Mscreen, #Mdrawable, #Mdepth, and #Mcolormap
371 are also keys of a frame property. */
374 @name ÊÑ¿ô¡§ ¥Õ¥ì¡¼¥à¥Ñ¥é¥á¡¼¥¿ÍÑ¥¡¼
376 ¥Õ¥ì¡¼¥à¤òÀ¸À®¤¹¤ëºÝ¤Î¥Ñ¥é¥á¡¼¥¿¤ËÍѤ¤¤ë¥·¥ó¥Ü¥ë¡£¾Ü¤·¤¯¤Ï´Ø¿ô
377 mframe () ¤ÎÀâÌÀ»²¾È¡£
379 #Mdevice¡¢ #Mdisplay¡¢ #Mscreen¡¢ #Mdrawable¡¢ #Mdepth¡¢#Mcolormap
380 ¤Ï¥Õ¥ì¡¼¥à¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤Ç¤â¤¢¤ë¡£ */
384 MSymbol Mdevice, Mdisplay, Mscreen, Mdrawable, Mdepth, Mcolormap, Mwidget;
391 @name Variables: Keys of frame property
393 These are the symbols to use as an argument to the function
394 mframe_get_prop (). */
396 @name ÊÑ¿ô¡§ ¥Õ¥ì¡¼¥à¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼
398 ´Ø¿ô mframe_get_prop () ¤Î°ú¿ô¤ËÍѤ¤¤é¤ì¤ë¥·¥ó¥Ü¥ë¡£ */
403 MSymbol Mfont_ascent;
404 MSymbol Mfont_descent;
412 @brief Create a new frame.
414 The mframe () function creates a new frame with parameters listed
415 in $PLIST which may be @c NULL.
417 The recognized keys in $PLIST are window system dependent.
419 The following key is always recognized.
423 <li> #Mdevice, the value must be one of #Mx, #Mgd, and #Mnil.
425 If the value is #Mx, the frame is for X Window System. The
426 argument #MDrawWindow specified together with the frame must be of
427 type @c Window. The frame is both readable and writable, thus all
428 GUI functions can be used.
430 If the value is #Mgd, the frame is for an image object of GD
431 library. The argument #MDrawWindow specified together with the
432 frame must be of type @c gdImagePtr. The frame is writable
433 only, thus functions minput_XXX can't be used for the frame.
435 If the value is #Mnil, the frame is for a null device. The frame
436 is not writable nor readable, thus functions mdraw_XXX that
437 require the argument #MDrawWindow and functions minput_XXX can't
438 be used for the frame.
440 <li> #Mface, the value must be a pointer to #MFace.
442 The value is used as the default face of the frame.
446 In addition, if the value of the key #Mdevice is #Mx, the
447 following keys are recognized. They are to specify the root
448 window and the depth of drawables that can be used with the frame.
452 <li> #Mdrawable, the value type must be <tt>Drawable</tt>.
454 A parameter of key #Mdisplay must also be specified. The
455 created frame can be used for drawables whose root window and
456 depth are the same as those of the specified drawable on the
459 When this parameter is specified, the parameter of key #Mscreen
462 <li> #Mwidget, the value type must be <tt>Widget</tt>.
464 The created frame can be used for drawables whose root window and
465 depth are the same as those of the specified widget.
467 If a parameter of key #Mface is not specified, the default face
468 is created from the resources of the widget.
470 When this parameter is specified, the parameters of key #Mdisplay,
471 #Mscreen, #Mdrawable, #Mdepth are ignored.
473 <li> #Mdepth, the value type must be <tt>unsigned</tt>.
475 The created frame can be used for drawables of the specified
478 <li> #Mscreen, the value type must be <tt>(Screen *)</tt>.
480 The created frame can be used for drawables whose root window is
481 the same as the root window of the specified screen, and depth is
482 the same at the default depth of the screen.
484 When this parameter is specified, parameter of key #Mdisplay is
487 <li> #Mdisplay, the value type must be <tt>(Display *)</tt>.
489 The created frame can be used for drawables whose root window is
490 the same as the root window for the default screen of the display,
491 and depth is the same as the default depth of the screen.
493 <li> #Mcolormap, the value type must be <tt>(Colormap)</tt>.
495 The created frame uses the specified colormap.
497 <li> #Mfont, the value must be #Mx, #Mfreetype, or #Mxft.
499 The created frame uses the specified font backend. The value #Mx
500 instructs to use X core fonts, #Mfreetype to use local fonts
501 supported by FreeType fonts, and #Mxft to use local fonts via Xft
502 library. You can specify this parameter more than once with
503 different values if you want to use multiple font backends. This
504 is ignored if the specified font backend is not supported on the
507 When this parameter is not specified, all font backend supported
508 on the device are used.
513 If the operation was successful, mframe () returns a pointer to a
514 newly created frame. Otherwise, it returns @c NULL. */
517 @brief ¿·¤·¤¤¥Õ¥ì¡¼¥à¤òºî¤ë.
519 ´Ø¿ô mframe () ¤Ï $PLIST Ãæ¤Î¥Ñ¥é¥á¡¼¥¿¤ò»ý¤Ä¿·¤·¤¤¥Õ¥ì¡¼¥à¤òºî¤ë¡£
520 $PLIST ¤Ï @c NULL ¤Ç¤âÎɤ¤¡£
522 $PLIST ¤Ë¸½¤ï¤ì¤ë¥¡¼¤Î¤¦¤Á¤É¤ì¤¬Ç§¼±¤µ¤ì¤ë¤«¤Ï¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à
525 °Ê²¼¤Î¥¡¼¤Ï¾ï¤Ëǧ¼±¤µ¤ì¤ë¡£
529 <li> #Mdevice. ÃÍ¤Ï #Mx, #Mgd, #Mnil ¤Î¤¤¤º¤ì¤«¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
531 Ãͤ¬ #Mx ¤Ê¤é¤Ð¡¢¿·¤·¤¤¥Õ¥ì¡¼¥à¤Ï X ¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥àÍѤǤ¢¤ë¡£¤³
532 ¤Î¥Õ¥ì¡¼¥à¤È¶¦¤Ë»ØÄꤵ¤ì¤¿°ú¿ô #MDrawWindow ¤Ï¡¢ @c Window ·¿¤Ç¤Ê
533 ¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¥Õ¥ì¡¼¥à¤ÏÆɤ߽ñ¤¤È¤â¤Ë²Äǽ¤Ç¤¢¤ê¡¢¤¹¤Ù¤Æ¤ÎGUI ´Ø
536 Ãͤ¬ #Mgd ¤Ê¤é¤Ð¡¢¿·¤·¤¤¥Õ¥ì¡¼¥à¤Ï GD ¥é¥¤¥Ö¥é¥ê¤Î¥¤¥á¡¼¥¸¥ª¥Ö¥¸¥§
537 ¥¯¥ÈÍѤǤ¢¤ë¡£¤³¤Î¥Õ¥ì¡¼¥à¤È¶¦¤Ë»ØÄꤵ¤ì¤¿°ú¿ô #MDrawWindow ¤Ï¡¢
538 @c gdImagePtr ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¥Õ¥ì¡¼¥à¤Ï½ñ¤½Ð¤·ÀìÍѤǤ¢¤ê¡¢
539 minput_ ¤Ç»Ï¤Þ¤ë̾Á°¤Î´Ø¿ô¤Ï»ÈÍѤǤ¤Ê¤¤¡£
541 Ãͤ¬ #Mnil ¤Ê¤é¤Ð¡¢¿·¤·¤¤¥Õ¥ì¡¼¥à¤Ï, null ¥Ç¥Ð¥¤¥¹ÍѤǤ¢¤ë¡£¤³¤Î¥Õ
542 ¥ì¡¼¥à¤ÏÆɤ߽ñ¤¤Ç¤¤Ê¤¤¤Î¤Ç¡¢°ú¿ô #MDrawWindow ¤òɬÍפȤ¹¤ëmdraw_
543 ¤Ç»Ï¤Þ¤ë̾Á°¤Î´Ø¿ô¤ä¡¢minput_ ¤Ç»Ï¤Þ¤ë̾Á°¤Î´Ø¿ô¤Ï»ÈÍѤǤ¤Ê¤¤¡£
545 <li> #Mface. ÃÍ¤Ï #MFace ¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
547 ¤³¤ÎÃͤϥե졼¥à¤Î¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥§¡¼¥¹¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
551 ¤³¤ì¤é¤Î¥¡¼¤Ë²Ã¤¨¡¢#Mdevice ¤Î¥¡¼¤¬ #Mx ¤Ç¤¢¤ë¾ì¹ç¤Ë¸Â¤ê°Ê²¼¤Î¥¡¼
552 ¤âǧ¼±¤µ¤ì¤ë¡£°Ê²¼¤Î¥¡¼¤Ï¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤È¡¢¥Õ¥ì¡¼¥à¤ÇÍøÍѤǤ¤ë
553 drawable ¤Î¿¼¤µ¤ò»ØÄꤹ¤ë¡£
557 <li> #Mdrawable. ÃÍ¤Ï <tt>Drawable</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
559 ¥¡¼ #Mdisplay ¤ò»ý¤Ä¥Ñ¥é¥á¡¼¥¿¤â»ØÄꤵ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ë¡£À¸À®¤µ
560 ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤵ¤ì¤¿¥Ç¥£¥¹¥×¥ì¥¤¾å¤Î»ØÄꤵ¤ì¤¿ drawable ¤ÈƱ
561 ¤¸¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤È¿¼¤µ¤ò»ý¤Ä drawable ¤ËÍѤ¤¤é¤ì¤ë¡£
563 ¤³¤Î¥Ñ¥é¥á¡¼¥¿¤¬¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢#Mscreen ¤ò¥¡¼¤È¤¹¤ë¥Ñ¥é¥á¡¼¥¿¤Ï̵
566 <li> #Mwidget. ÃÍ¤Ï <tt>Widget</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
568 À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¥¦¥£¥¸¥§¥Ã¥È¤ÈƱ¤¸¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤È
569 ¿¼¤µ¤ò»ý¤Ä drawable ¤ËÍѤ¤¤é¤ì¤ë¡£
571 ¥¡¼ #Mface ¤ò»ý¤Ä¥Ñ¥é¥á¡¼¥¿¤¬¤Ê¤±¤ì¤Ð¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥§¡¼¥¹¤Ï¤³¤Î
572 ¥¦¥£¥¸¥§¥Ã¥È¤Î¥ê¥½¡¼¥¹¤«¤éºî¤é¤ì¤ë¡£
574 ¤³¤Î¥Ñ¥é¥á¡¼¥¿¤¬¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢#Mdisplay, #Mscreen, #Mdrawable,
575 #Mdepth ¤ò¥¡¼¤È¤¹¤ë¥Ñ¥é¥á¡¼¥¿¤Ï̵»ë¤µ¤ì¤ë¡£
577 <li> #Mdepth. ÃÍ¤Ï <tt>unsigned</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
579 À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¿¼¤µ¤Î drawable ¤ËÍѤ¤¤é¤ì¤ë¡£
581 <li> #Mscreen. ÃÍ¤Ï <tt>(Screen *)</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
583 À¸À®¤·¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¥¹¥¯¥ê¡¼¥ó¤ÈƱ¤¸¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤ò»ý¤Á¡¢
584 ¥¹¥¯¥ê¡¼¥ó¤Î¥Ç¥Õ¥©¥ë¥È¤Î¿¼¤µ¤ÈƱ¤¸¿¼¤µ¤ò»ý¤Ä drawable ¤ËÍѤ¤¤é¤ì¤ë¡£
586 ¤³¤Î¥Ñ¥é¥á¡¼¥¿¤¬¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢#Mdisplay ¤ò¥¡¼¤È¤¹¤ë¥Ñ¥é¥á¡¼¥¿¤Ï̵
589 <li> #Mdisplay. ÃÍ¤Ï <tt>(Display *)</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
591 À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¥Ç¥£¥¹¥×¥ì¥¤¤Î¥Ç¥Õ¥©¥ë¥È¥¹¥¯¥ê¡¼¥ó¤È
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 ¤¤ë¡£»ØÄꤷ¤¿¥Ð¥Ã¥¯¥¨¥ó¥É¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Ê¤¤¥Ç¥Ð¥¤¥¹¤Ç¤Ï¡¢¤³¤Î
606 ¥Ñ¥é¥á¡¼¥¿¤Ï̵»ë¤µ¤ì¤ë¡£
608 ¤³¤Î¥Ñ¥é¥á¡¼¥¿¤¬Ìµ¤¤¾ì¹ç¤Ë¤Ï¡¢¥Ç¥Ð¥¤¥¹¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¤¹¤Ù¤Æ¤Î
609 ¥Õ¥©¥ó¥È¥Ð¥Ã¥¯¥¨¥ó¥É¤òÍøÍѤ¹¤ë¡£
614 À®¸ù¤¹¤ì¤Ð mframe() ¤Ï¿·¤·¤¤¥Õ¥ì¡¼¥à¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±
615 ¤ì¤Ð @c NULL ¤òÊÖ¤¹¡£ */
618 mframe (MPlist *plist)
621 int plist_created = 0;
624 MDeviceLibraryInterface *interface;
628 pl = mplist_find_by_key (plist, Mdevice);
630 device = MPLIST_VAL (pl);
644 interface = &null_interface;
645 if (! interface->handle)
647 (*interface->init) ();
648 interface->handle = (void *) 1;
650 #else /* not HAVE_FREETYPE */
651 MERROR (MERROR_WIN, NULL);
652 #endif /* not HAVE_FREETYPE */
656 interface = mplist_get (device_library_list, device);
658 MERROR (MERROR_WIN, NULL);
659 if (! interface->handle)
661 if (! (interface->handle = dlopen (interface->library, RTLD_NOW))
662 || ! (interface->init = dlsym (interface->handle, "device_init"))
663 || ! (interface->open = dlsym (interface->handle, "device_open"))
664 || ! (interface->fini = dlsym (interface->handle, "device_fini"))
665 || (*interface->init) () < 0)
667 fprintf (stderr, "%s\n", (char *) dlerror ());
668 if (interface->handle)
669 dlclose (interface->handle);
670 MERROR (MERROR_WIN, NULL);
675 M17N_OBJECT (frame, free_frame, MERROR_FRAME);
676 if ((*interface->open) (frame, plist) < 0)
679 MERROR (MERROR_WIN, NULL);
682 if (! mframe_default)
683 mframe_default = frame;
685 frame->face = mface ();
686 MPLIST_DO (pl, plist)
687 if (MPLIST_KEY (pl) == Mface)
688 mface_merge (frame->face, (MFace *) MPLIST_VAL (pl));
689 mface__update_frame_face (frame);
692 M17N_OBJECT_UNREF (plist);
699 @brief Return property value of frame.
701 The mframe_get_prop () function returns a value of property $KEY
702 of frame $FRAME. The valid keys and the corresponding return
703 values are as follows.
707 key type of value meaning of value
708 --- ------------- ----------------
709 Mface MFace * The default face.
711 Mfont MFont * The default font.
713 Mfont_width int Width of the default font.
715 Mfont_ascent int Ascent of the default font.
717 Mfont_descent int Descent of the default font.
721 In the m17n-X library, the followings are also accepted.
725 key type of value meaning of value
726 --- ------------- ----------------
727 Mdisplay Display * Display associated with the frame.
729 Mscreen int Screen number of a screen associated
732 Mcolormap Colormap Colormap of the frame.
734 Mdepth unsigned Depth of the frame.
739 @brief ¥Õ¥ì¡¼¥à¤Î¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÊÖ¤¹.
741 ´Ø¿ô mframe_get_prop () ¤Ï¥Õ¥ì¡¼¥à $FRAME ¤Î¥¡¼ $KEY ¤ò»ý¤Ä¥×¥í¥Ñ
742 ¥Æ¥£¤ÎÃͤòÊÖ¤¹¡£Í¸ú¤Ê¥¡¼¤È¤½¤ÎÃͤϰʲ¼¤ÎÄ̤ꡣ
747 --- ------------- ----------------
748 Mface MFace * ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥§¡¼¥¹
750 Mfont MFont * ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥©¥ó¥È
752 Mfont_width int ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥©¥ó¥È¤ÎÉý
754 Mfont_ascent int ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥©¥ó¥È¤Î ascent
756 Mfont_descent int ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥©¥ó¥È¤Î descent
760 m17n-X ¥é¥¤¥Ö¥é¥ê¤Ç¤Ï¡¢°Ê²¼¤Î¥¡¼¤â»ÈÍѤǤ¤ë¡£
765 --- ------------- ----------------
766 Mdisplay Display * ¥Õ¥ì¡¼¥à¤È´ØÏ¢ÉÕ¤±¤é¤ì¤¿¥Ç¥£¥¹¥×¥ì¥¤
768 Mscreen int ¥Õ¥ì¡¼¥à¤È´ØÏ¢ÉÕ¤±¤é¤ì¤¿¥¹¥¯¥ê¡¼¥ó
771 Mcolormap Colormap ¥Õ¥ì¡¼¥à¤Î¥«¥é¡¼¥Þ¥Ã¥×
773 Mdepth unsigned ¥Õ¥ì¡¼¥à¤Î¿¼¤µ
779 mframe_get_prop (MFrame *frame, MSymbol key)
784 return &frame->rface->rfont->font;
785 if (key == Mfont_width)
786 return (void *) (frame->space_width);
787 if (key == Mfont_ascent)
788 return (void *) (frame->ascent);
789 if (key == Mfont_descent)
790 return (void *) (frame->descent);
791 return (*frame->driver->get_prop) (frame, key);
797 @brief The default frame.
799 The external variable #mframe_default contains a pointer to the
800 default frame that is created by the first call of mframe (). */
803 @brief ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥ì¡¼¥à.
805 ³°ÉôÊÑ¿ô #mframe_default ¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥ì¡¼¥à¤Ø¤Î¥Ý¥¤¥ó¥¿¤ò»ý
806 ¤Ä¡£¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥ì¡¼¥à¤Ï¡¢ºÇ½é¤Ë mframe () ¤¬¸Æ¤Ó½Ð¤µ¤ì¤¿¤È¤¤Ë
809 MFrame *mframe_default;