(mframe): Fix strict aliasing bug.
[m17n/m17n-lib.git] / src / m17n-gui.c
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
5
6    This file is part of the m17n library.
7
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.
12
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.
17
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,
21    02111-1307, USA.  */
22
23 /***en
24     @addtogroup m17nGUI
25     @brief GUI support for a window system.
26
27     This section defines the m17n GUI API concerning M-text drawing
28     and inputting under a window system.
29
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.
34
35     Actually the GUI API is mainly for toolkit libraries or to
36     implement XOM, not for direct use from application programs.
37 */
38
39 /***ja
40     @addtogroup m17nGUI
41     @brief ¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¾å¤Î GUI ¥µ¥Ý¡¼¥È.
42
43     ¤³¤Î¥»¥¯¥·¥ç¥ó¤Ï¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¤Î¤â¤È¤Ç¤Î M-text ¤Îɽ¼¨¤ÈÆþÎϤˤ«¤«¤ï¤ë
44     m17n GUI API ¤òÄêµÁ¤¹¤ë¡£
45
46     ¤³¤³¤Ç¤Î¤¹¤Ù¤Æ¤ÎÄêµÁ¤Ï¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¤È¤ÏÆÈΩ¤Ç¤¢¤ë¡£
47     ¤·¤«¤·¡¢¼ÂºÝ¤Î¥é¥¤¥Ö¥é¥ê¥Õ¥¡¥¤¥ë¤Ï¸ÄÊ̤Υ¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¤Ë°Í¸¤¹¤ë¾ì¹ç¤¬¤¢¤ë¡£
48     ¤¿¤È¤¨¤Ð¥é¥¤¥Ö¥é¥ê¥Õ¥¡¥¤¥ë m17n-X.so ¤Ï¡¢m17n GUI API ¤Î X 
49     ¥¦¥£¥ó¥É¥¦ÍѤμÂÁõÎã¤Ç¤¢¤ë¡£
50
51     ¸½¼Â¤Ë¤Ï¡¢GUI API ¤Ï¼ç¤Ë¥Ä¡¼¥ë¥­¥Ã¥È¥é¥¤¥Ö¥é¥ê¸þ¤±¤Ç¤¢¤ë¤«¡¢¤Þ¤¿¤Ï 
52     XOM ¤ò¼ÂÁõ¤¹¤ë¤¿¤á¤ËÍѤ¤¤é¤ì¤Æ¤ª¤ê¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤«¤é¤ÎľÀܤÎÍøÍѤòǰƬ¤Ë¤ª¤¤¤¿¤â¤Î¤Ç¤Ï¤Ê¤¤¡£
53 */
54
55 /*=*/
56
57 #if !defined (FOR_DOXYGEN) || defined (DOXYGEN_INTERNAL_MODULE)
58 /*** @addtogroup m17nInternal
59      @{ */
60
61 #include "config.h"
62
63 #include <stdio.h>
64 #include <string.h>
65 #include <stdlib.h>
66
67 #include "config.h"
68 #ifdef HAVE_DLFCN_H
69 #include <dlfcn.h>
70 #endif
71
72 #include "m17n-gui.h"
73 #include "m17n-misc.h"
74 #include "internal.h"
75 #include "plist.h"
76 #include "internal-gui.h"
77 #include "font.h"
78 #include "fontset.h"
79 #include "face.h"
80
81 #ifndef DLOPEN_SHLIB_EXT
82 #define DLOPEN_SHLIB_EXT ".so"
83 #endif
84
85 /** Information about a dynamic library supporting a specific graphic
86     device.  */
87 typedef struct
88 {
89   /** Name of the dynamic library (e.g. "libm17n-X.so").  */
90   char *library;
91   /** Handle of the dynamic library.  */
92   void *handle;
93   /** Function to call just after loading the library.  */
94   int (*init) ();
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.  */
98   int (*fini) ();
99 } MDeviceLibraryInterface;
100
101
102 /** Plist of device symbol vs MDeviceLibraryInterface.  */
103
104 static MPlist *device_library_list;
105
106 /** Close MFrame and free it.  */
107
108 static void
109 free_frame (void *object)
110 {
111   MFrame *frame = (MFrame *) object;
112
113   (*frame->driver->close) (frame);
114   M17N_OBJECT_UNREF (frame->face);
115   M17N_OBJECT_UNREF (frame->font_driver_list);
116   free (object);
117 }
118
119
120 /** Register a dynamic library of name LIB by a key NAME.  */
121
122 static int
123 register_device_library (MSymbol name, char *lib)
124 {
125   MDeviceLibraryInterface *interface;
126
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);
134   return 0;
135 }
136
137 \f
138 #ifdef HAVE_FREETYPE
139 /** Null device support.  */
140
141 static struct {
142   MPlist *realized_fontset_list;
143   MPlist *realized_font_list;
144   MPlist *realized_face_list;
145 } null_device;
146
147 static void
148 null_device_close (MFrame *frame)
149 {
150 }
151
152 static void *
153 null_device_get_prop (MFrame *frame, MSymbol key)
154 {
155   return NULL;
156 }
157
158 static void
159 null_device_realize_face (MRealizedFace *rface)
160 {
161   rface->info = NULL;
162 }
163
164 static void
165 null_device_free_realized_face (MRealizedFace *rface)
166 {
167 }
168
169 static MDeviceDriver null_driver =
170   {
171     null_device_close,
172     null_device_get_prop,
173     null_device_realize_face,
174     null_device_free_realized_face
175   };
176
177 static int
178 null_device_init ()
179 {
180   null_device.realized_fontset_list = mplist ();
181   null_device.realized_font_list = mplist ();
182   null_device.realized_face_list = mplist ();  
183   return 0;
184 }
185
186 static int
187 null_device_fini ()
188 {
189   MPlist *plist;
190
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);
194
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);
198
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);
202   return 0;
203 }
204
205 static int
206 null_device_open (MFrame *frame, MPlist *param)
207 {
208   MFace *face;
209
210   frame->device = NULL;
211   frame->device_type = 0;
212   frame->dpi = (int) mplist_get (param, Mresolution);
213   if (frame->dpi == 0)
214     frame->dpi = 100;
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);
224   return 0;
225 }
226
227 static MDeviceLibraryInterface null_interface =
228   { NULL, NULL, null_device_init, null_device_open, null_device_fini };
229
230 #endif
231 \f
232 /* Internal API */
233
234 \f
235 /* External API */
236
237 void
238 m17n_init_win (void)
239 {
240   int mdebug_flag = MDEBUG_INIT;
241
242   merror_code = MERROR_NONE;
243   if (m17n__gui_initialized++)
244     return;
245   m17n_init ();
246   m17n_init_flt ();
247   if (merror_code != MERROR_NONE)
248     {
249       m17n__gui_initialized--;
250       return;
251     }
252
253   MDEBUG_PUSH_TIME ();
254
255   Mgd = msymbol ("gd");
256
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");
262
263   Mdisplay = msymbol ("display");
264   Mscreen = msymbol ("screen");
265   Mdrawable = msymbol ("drawable");
266   Mdepth = msymbol ("depth");
267   Mwidget = msymbol ("widget");
268   Mcolormap = msymbol ("colormap");
269
270   MDEBUG_PUSH_TIME ();
271   if (mfont__init () < 0)
272     goto err;
273   MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize font module."));
274   if (mfont__fontset_init () < 0)
275     goto err;
276   MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize fontset module."));
277   if (mface__init () < 0)
278     goto err;
279   MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize face module."));
280   if (mdraw__init () < 0)
281     goto err;
282   MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize draw module."));
283   if (minput__win_init () < 0)
284     goto err;
285   MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize input-win module."));
286   mframe_default = NULL;
287
288   register_device_library (Mx, "libm17n-X");
289   register_device_library (Mgd, "libm17n-gd");
290   return;
291
292  err:
293   MDEBUG_POP_TIME ();
294   MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize the m17n GUI module."));
295   MDEBUG_POP_TIME ();
296 }
297
298 void
299 m17n_fini_win (void)
300 {
301   int mdebug_flag = MDEBUG_FINI;
302   MPlist *plist;
303
304   if (m17n__gui_initialized == 0
305       || --m17n__gui_initialized > 0)
306     return;
307
308   MDEBUG_PUSH_TIME ();
309   MDEBUG_PUSH_TIME ();
310   MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize device modules."));
311   MPLIST_DO (plist, device_library_list)
312     {
313       MDeviceLibraryInterface *interface = MPLIST_VAL (plist);
314
315       if (interface->handle && interface->fini)
316         {
317           (*interface->fini) ();
318           dlclose (interface->handle);
319         }
320       free (interface->library);
321       free (interface);
322     }
323 #ifdef HAVE_FREETYPE
324   if (null_interface.handle)
325     {
326       (*null_interface.fini) ();
327       null_interface.handle = NULL;
328     }
329 #endif  /* not HAVE_FREETYPE */
330   M17N_OBJECT_UNREF (device_library_list);
331   minput__win_fini ();
332   MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize input-gui module."));
333   mdraw__fini ();
334   MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize draw module."));
335   mface__fini ();
336   MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize face module."));
337   mfont__fontset_fini ();
338   MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize fontset module."));
339   mfont__fini ();
340   MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize font module."));
341   mframe_default = NULL;
342   MDEBUG_POP_TIME ();
343   MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize the gui modules."));
344   MDEBUG_POP_TIME ();
345   m17n_fini_flt ();
346   m17n_fini ();
347 }
348
349 /*** @} */ 
350 #endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
351
352 /*** @addtogroup m17nFrame */
353 /***en
354     @brief A @e frame is an object corresponding to the graphic device.
355
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.  */
359 /***ja
360     @brief @e ¥Õ¥ì¡¼¥à ¤È¤Ï¥°¥é¥Õ¥£¥Ã¥¯¥Ç¥Ð¥¤¥¹¤ËÂбþ¤¹¤ë¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ë.
361
362     @e ¥Õ¥ì¡¼¥à ¤È¤Ï #MFrame 
363     ·¿¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ê¡¢¸Ä¡¹¤Îɽ¼¨¡¿ÆþÎϥǥХ¤¥¹¤Î¾ðÊó¤ò³ÊǼ¤¹¤ë¤¿¤á¤ËÍѤ¤¤é¤ì¤ë¡£
364     ¤Û¤È¤ó¤É¤¹¤Ù¤Æ¤Î m17n GUI´Ø¿ô¤Ï¡¢°ú¿ô¤È¤·¤Æ¥Õ¥ì¡¼¥à¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÍ׵᤹¤ë¡£  */
365
366 /*** @{ */
367 /*=*/
368
369 /***en
370     @name Variables: Keys of frame parameter
371
372     These are the symbols to use in a parameter to create a frame.  See
373     the function mframe () for details.
374
375     #Mdevice, #Mdisplay, #Mscreen, #Mdrawable, #Mdepth, and #Mcolormap
376     are also keys of a frame property.  */
377
378 /***ja
379     @name ÊÑ¿ô¡§ ¥Õ¥ì¡¼¥à¥Ñ¥é¥á¡¼¥¿ÍÑ¥­¡¼
380
381     ¥Õ¥ì¡¼¥à¤òÀ¸À®¤¹¤ëºÝ¤Î¥Ñ¥é¥á¡¼¥¿¤ËÍѤ¤¤ë¥·¥ó¥Ü¥ë¡£¾Ü¤·¤¯¤Ï´Ø¿ô
382     mframe () ¤ÎÀâÌÀ»²¾È¡£
383
384     #Mdevice¡¢ #Mdisplay¡¢ #Mscreen¡¢ #Mdrawable¡¢ #Mdepth¡¢#Mcolormap
385     ¤Ï¥Õ¥ì¡¼¥à¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤Ç¤â¤¢¤ë¡£  */
386
387 /*=*/
388
389 MSymbol Mdevice, Mdisplay, Mscreen, Mdrawable, Mdepth, Mcolormap, Mwidget; 
390
391 MSymbol Mgd;
392
393 /*=*/
394
395 /***en
396     @name Variables: Keys of frame property
397
398     These are the symbols to use as an argument to the function
399     mframe_get_prop ().  */
400 /***ja
401     @name ÊÑ¿ô¡§ ¥Õ¥ì¡¼¥à¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼
402
403     ´Ø¿ô mframe_get_prop () ¤Î°ú¿ô¤ËÍѤ¤¤é¤ì¤ë¥·¥ó¥Ü¥ë¡£  */ 
404 /*** @{ */ 
405 /*=*/
406 MSymbol Mfont;
407 MSymbol Mfont_width;
408 MSymbol Mfont_ascent;
409 MSymbol Mfont_descent;
410
411 /*=*/
412
413 /*** @} */ 
414 /*=*/
415
416 /***en
417     @brief Create a new frame.
418
419     The mframe () function creates a new frame with parameters listed
420     in $PLIST which may be @c NULL.
421
422     The recognized keys in $PLIST are window system dependent.
423
424     The following key is always recognized.
425
426     <ul>
427
428     <li> #Mdevice, the value must be one of #Mx, #Mgd, and #Mnil.
429
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.
434
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.
439
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.
444
445     <li> #Mface, the value must be a pointer to #MFace.
446
447     The value is used as the default face of the frame.
448
449     </ul>
450
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.
454
455     <ul>
456
457     <li> #Mdrawable, the value type must be <tt>Drawable</tt>.
458
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
462     specified display.
463
464     When this parameter is specified, the parameter of key #Mscreen
465     is ignored.
466
467     <li> #Mwidget, the value type must be <tt>Widget</tt>.
468
469     The created frame can be used for drawables whose root window and
470     depth are the same as those of the specified widget.
471
472     If a parameter of key #Mface is not specified, the default face
473     is created from the resources of the widget.
474
475     When this parameter is specified, the parameters of key #Mdisplay,
476     #Mscreen, #Mdrawable, #Mdepth are ignored.
477
478     <li> #Mdepth, the value type must be <tt>unsigned</tt>.
479
480     The created frame can be used for drawables of the specified
481     depth.
482
483     <li> #Mscreen, the value type must be <tt>(Screen *)</tt>.
484
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.
488
489     When this parameter is specified, parameter of key #Mdisplay is
490     ignored.
491
492     <li> #Mdisplay, the value type must be <tt>(Display *)</tt>.
493
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.
497
498     <li> #Mcolormap, the value type must be <tt>(Colormap)</tt>.
499
500     The created frame uses the specified colormap.
501
502     <li> #Mfont, the value must be #Mx, #Mfreetype, or #Mxft.
503
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
510     device.
511     
512     When this parameter is not specified, all font backend supported
513     on the device are used.
514
515     </ul>
516
517     @return
518     If the operation was successful, mframe () returns a pointer to a
519     newly created frame.  Otherwise, it returns @c NULL.  */
520
521 /***ja
522     @brief ¿·¤·¤¤¥Õ¥ì¡¼¥à¤òºî¤ë.
523
524     ´Ø¿ô mframe () ¤Ï $PLIST Ãæ¤Î¥Ñ¥é¥á¡¼¥¿¤ò»ý¤Ä¿·¤·¤¤¥Õ¥ì¡¼¥à¤òºî¤ë¡£
525     $PLIST ¤Ï @c NULL ¤Ç¤âÎɤ¤¡£
526
527     $PLIST ¤Ë¸½¤ï¤ì¤ë¥­¡¼¤Î¤¦¤Á¤É¤ì¤¬Ç§¼±¤µ¤ì¤ë¤«¤Ï¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¤Ë°Í¸¤¹¤ë¡£
528
529     °Ê²¼¤Î¥­¡¼¤Ï¾ï¤Ëǧ¼±¤µ¤ì¤ë¡£
530
531     <ul>
532
533     <li> #Mdevice. ÃͤϠ#Mx, #Mgd, #Mnil ¤Î¤¤¤º¤ì¤«¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
534
535     Ãͤ¬ #Mx ¤Ê¤é¤Ð¡¢¿·¤·¤¤¥Õ¥ì¡¼¥à¤Ï X ¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥àÍѤǤ¢¤ë¡£
536     ¤³¤Î¥Õ¥ì¡¼¥à¤È¶¦¤Ë»ØÄꤵ¤ì¤¿°ú¿ô #MDrawWindow ¤Ï¡¢ @c Window
537     ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¥Õ¥ì¡¼¥à¤ÏÆɤ߽ñ¤­¤È¤â¤Ë²Äǽ¤Ç¤¢¤ê¡¢¤¹¤Ù¤Æ¤ÎGUI 
538     ´Ø¿ô¤¬»ÈÍѤǤ­¤ë¡£
539
540     Ãͤ¬ #Mgd ¤Ê¤é¤Ð¡¢¿·¤·¤¤¥Õ¥ì¡¼¥à¤Ï GD 
541     ¥é¥¤¥Ö¥é¥ê¤Î¥¤¥á¡¼¥¸¥ª¥Ö¥¸¥§¥¯¥ÈÍѤǤ¢¤ë¡£¤³¤Î¥Õ¥ì¡¼¥à¤È¶¦¤Ë»ØÄꤵ¤ì¤¿°ú¿ô
542     #MDrawWindow ¤Ï¡¢ @c gdImagePtr ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¥Õ¥ì¡¼¥à¤Ï½ñ¤­½Ð¤·ÀìÍѤǤ¢¤ê¡¢
543     minput_ ¤Ç»Ï¤Þ¤ë̾Á°¤Î´Ø¿ô¤Ï»ÈÍѤǤ­¤Ê¤¤¡£
544
545     Ãͤ¬ #Mnil ¤Ê¤é¤Ð¡¢¿·¤·¤¤¥Õ¥ì¡¼¥à¤Ï, null 
546     ¥Ç¥Ð¥¤¥¹ÍѤǤ¢¤ë¡£¤³¤Î¥Õ¥ì¡¼¥à¤ÏÆɤ߽ñ¤­¤Ç¤­¤Ê¤¤¤Î¤Ç¡¢°ú¿ô #MDrawWindow 
547     ¤òɬÍפȤ¹¤ëmdraw_ ¤Ç»Ï¤Þ¤ë̾Á°¤Î´Ø¿ô¤ä¡¢minput_ ¤Ç»Ï¤Þ¤ë̾Á°¤Î´Ø¿ô¤Ï»ÈÍѤǤ­¤Ê¤¤¡£
548
549     <li> #Mface. ÃͤϠ#MFace ¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
550
551     ¤³¤ÎÃͤϥե졼¥à¤Î¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥§¡¼¥¹¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
552
553     </ul>
554
555     ¤³¤ì¤é¤Î¥­¡¼¤Ë²Ã¤¨¡¢#Mdevice ¤Î¥­¡¼¤¬ #Mx 
556     ¤Ç¤¢¤ë¾ì¹ç¤Ë¸Â¤ê°Ê²¼¤Î¥­¡¼¤âǧ¼±¤µ¤ì¤ë¡£°Ê²¼¤Î¥­¡¼¤Ï¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤È¡¢¥Õ¥ì¡¼¥à¤ÇÍøÍѤǤ­¤ë 
557     drawable ¤Î¿¼¤µ¤ò»ØÄꤹ¤ë¡£
558
559     <ul>
560
561     <li> #Mdrawable. ÃͤϠ<tt>Drawable</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
562
563     ¥­¡¼ #Mdisplay ¤ò»ý¤Ä¥Ñ¥é¥á¡¼¥¿¤â»ØÄꤵ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ë¡£
564     À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤵ¤ì¤¿¥Ç¥£¥¹¥×¥ì¥¤¾å¤Î»ØÄꤵ¤ì¤¿ drawable 
565     ¤ÈƱ¤¸¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤È¿¼¤µ¤ò»ý¤Ä drawable ¤ËÍѤ¤¤é¤ì¤ë¡£
566
567     ¤³¤Î¥Ñ¥é¥á¡¼¥¿¤¬¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢#Mscreen ¤ò¥­¡¼¤È¤¹¤ë¥Ñ¥é¥á¡¼¥¿¤Ï̵»ë¤µ¤ì¤ë¡£
568
569     <li> #Mwidget. ÃͤϠ<tt>Widget</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
570
571     À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¥¦¥£¥¸¥§¥Ã¥È¤ÈƱ¤¸¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤È¿¼¤µ¤ò»ý¤Ä
572     drawable ¤ËÍѤ¤¤é¤ì¤ë¡£
573
574     ¥­¡¼ #Mface ¤ò»ý¤Ä¥Ñ¥é¥á¡¼¥¿¤¬¤Ê¤±¤ì¤Ð¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥§¡¼¥¹¤Ï¤³¤Î
575     ¥¦¥£¥¸¥§¥Ã¥È¤Î¥ê¥½¡¼¥¹¤«¤éºî¤é¤ì¤ë¡£
576
577     ¤³¤Î¥Ñ¥é¥á¡¼¥¿¤¬¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢#Mdisplay, #Mscreen, #Mdrawable,
578     #Mdepth ¤ò¥­¡¼¤È¤¹¤ë¥Ñ¥é¥á¡¼¥¿¤Ï̵»ë¤µ¤ì¤ë¡£
579
580     <li> #Mdepth. ÃͤϠ<tt>unsigned</tt>  ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
581
582     À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¿¼¤µ¤Î drawable ¤ËÍѤ¤¤é¤ì¤ë¡£
583
584     <li> #Mscreen. ÃͤϠ<tt>(Screen *)</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
585
586     À¸À®¤·¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¥¹¥¯¥ê¡¼¥ó¤ÈƱ¤¸¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤ò»ý¤Á¡¢¥¹¥¯¥ê¡¼¥ó¤Î¥Ç¥Õ¥©¥ë¥È¤Î¿¼¤µ¤ÈƱ¤¸¿¼¤µ¤ò»ý¤Ä drawable ¤ËÍѤ¤¤é¤ì¤ë¡£
587
588     ¤³¤Î¥Ñ¥é¥á¡¼¥¿¤¬¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢#Mdisplay ¤ò¥­¡¼¤È¤¹¤ë¥Ñ¥é¥á¡¼¥¿¤Ï̵»ë¤µ¤ì¤ë¡£
589
590     <li> #Mdisplay. ÃͤϠ<tt>(Display *)</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
591
592     À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¥Ç¥£¥¹¥×¥ì¥¤¤Î¥Ç¥Õ¥©¥ë¥È¥¹¥¯¥ê¡¼¥ó¤ÈƱ¤¸¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤ÈƱ¤¸¿¼¤µ¤ò»ý¤Ädrawables ¤ËÍѤ¤¤é¤ì¤ë¡£
593
594     <li> #Mcolormap. ÃͤϠ<tt>(Colormap)</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
595
596     À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¥«¥é¡¼¥Þ¥Ã¥×¤ò»ÈÍѤ¹¤ë¡£
597
598     <li> #Mfont. Ãͤϡ¢#Mx, #Mfreetype, #Mxft ¤Î¤¤¤º¤ì¤«¡£
599
600     À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï»ØÄꤷ¤¿¥Õ¥©¥ó¥È¥Ð¥Ã¥¯¥¨¥ó¥É¤ò»ÈÍѤ¹¤ë¡£Ãͤ¬ 
601     #Mx ¤Ç¤¢¤ì¤Ð X ¤Î¥³¥¢¥Õ¥©¥ó¥È¡¢#Mfreetype ¤Ç¤¢¤ì¤Ð FreeType 
602     ¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¥í¡¼¥«¥ë¥Õ¥©¥ó¥È¡¢#Mxft ¤Ç¤¢¤ì¤Ð Xft 
603     ¥é¥¤¥Ö¥é¥ê·Ðͳ¤ÇÍѤ¤¤ë¥í¡¼¥«¥ë¥Õ¥©¥ó¥È¤ò»ÈÍѤ¹¤ë¡£
604     Ê£¿ô¤Î¥Õ¥©¥ó¥È¥Ð¥Ã¥¯¥¨¥ó¥É¤ò»ÈÍѤ·¤¿¤¤¾ì¹ç¤Ë¤Ï¡¢¤³¤Î¥Ñ¥é¥á¡¼¥¿¤òÊ£¿ô²ó¡¢°Û¤Ê¤ëÃͤǻØÄꤹ¤ë¤³¤È¤¬¤Ç¤­¤ë¡£
605     »ØÄꤷ¤¿¥Ð¥Ã¥¯¥¨¥ó¥É¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Ê¤¤¥Ç¥Ð¥¤¥¹¤Ç¤Ï¡¢¤³¤Î¥Ñ¥é¥á¡¼¥¿¤Ï̵»ë¤µ¤ì¤ë¡£
606
607     ¤³¤Î¥Ñ¥é¥á¡¼¥¿¤¬Ìµ¤¤¾ì¹ç¤Ë¤Ï¡¢¥Ç¥Ð¥¤¥¹¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¤¹¤Ù¤Æ¤Î¥Õ¥©¥ó¥È¥Ð¥Ã¥¯¥¨¥ó¥É¤òÍøÍѤ¹¤ë¡£
608
609     </ul>
610
611     @return
612     À®¸ù¤¹¤ì¤Ð mframe() ¤Ï¿·¤·¤¤¥Õ¥ì¡¼¥à¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð
613     @c NULL ¤òÊÖ¤¹¡£  */
614
615 MFrame *
616 mframe (MPlist *plist)
617 {
618   MFrame *frame;
619   int plist_created = 0;
620   MPlist *pl;
621   MSymbol device;
622   MDeviceLibraryInterface *interface;
623
624   if (plist)
625     {
626       pl = mplist_find_by_key (plist, Mdevice);
627       if (pl)
628         device = MPLIST_VAL (pl);
629       else
630         device = Mx;
631     }
632   else
633     {
634       plist = mplist ();
635       plist_created = 1;
636       device = Mx;
637     }
638
639   if (device == Mnil)
640     {
641 #ifdef HAVE_FREETYPE
642       interface = &null_interface;
643       if (! interface->handle)
644         {
645           (*interface->init) ();
646           interface->handle = (void *) 1;
647         }
648 #else  /* not HAVE_FREETYPE */
649       MERROR (MERROR_WIN, NULL);
650 #endif  /* not HAVE_FREETYPE */
651     }
652   else
653     {
654       interface = mplist_get (device_library_list, device);
655       if (! interface)
656         MERROR (MERROR_WIN, NULL);
657       if (! interface->handle)
658         {
659           if (! (interface->handle = dlopen (interface->library, RTLD_NOW))
660               || ! (interface->init
661                     = (int (*) ()) dlsym (interface->handle, "device_init"))
662               || ! (interface->open
663                     = (int (*) (MFrame *, MPlist *)) dlsym (interface->handle,
664                                                             "device_open"))
665               || ! (interface->fini
666                     = (int (*) ()) dlsym (interface->handle, "device_fini"))
667               || (*interface->init) () < 0)
668             {
669               fprintf (stderr, "%s\n", (char *) dlerror ());
670               if (interface->handle)
671                 dlclose (interface->handle);
672               MERROR (MERROR_WIN, NULL);
673             }
674         }
675     }
676
677   M17N_OBJECT (frame, free_frame, MERROR_FRAME);
678   if ((*interface->open) (frame, plist) < 0)
679     {
680       free (frame);
681       MERROR (MERROR_WIN, NULL);
682     }
683
684   if (! mframe_default)
685     mframe_default = frame;
686
687   frame->face = mface ();
688   MPLIST_DO (pl, plist)
689     if (MPLIST_KEY (pl) == Mface)
690       mface_merge (frame->face, (MFace *) MPLIST_VAL (pl));
691   mface__update_frame_face (frame);
692   frame->font
693     = frame->rface->rfont ? (MFont *) frame->rface->rfont : NULL;
694   if (plist_created)
695     M17N_OBJECT_UNREF (plist);
696   return frame;
697 }
698
699 /*=*/
700
701 /***en
702     @brief Return property value of frame.
703
704     The mframe_get_prop () function returns a value of property $KEY
705     of frame $FRAME.  The valid keys and the corresponding return
706     values are as follows.
707
708 @verbatim
709
710         key             type of value   meaning of value
711         ---             -------------   ----------------
712         Mface           MFace *         The default face.
713
714         Mfont           MFont *         The default font.
715
716         Mfont_width     int             Width of the default font.
717
718         Mfont_ascent    int             Ascent of the default font.
719
720         Mfont_descent   int             Descent of the default font.
721
722 @endverbatim
723
724     In the m17n-X library, the followings are also accepted.
725
726 @verbatim
727
728         key             type of value   meaning of value
729         ---             -------------   ----------------
730         Mdisplay        Display *       Display associated with the frame.
731
732         Mscreen         int             Screen number of a screen associated
733                                         with the frame.
734
735         Mcolormap       Colormap        Colormap of the frame.
736
737         Mdepth          unsigned        Depth of the frame.
738 @endverbatim
739 */
740
741 /***ja
742     @brief ¥Õ¥ì¡¼¥à¤Î¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÊÖ¤¹.
743
744     ´Ø¿ô mframe_get_prop () ¤Ï¥Õ¥ì¡¼¥à $FRAME ¤Î¥­¡¼ $KEY 
745     ¤ò»ý¤Ä¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÊÖ¤¹¡£Í­¸ú¤Ê¥­¡¼¤È¤½¤ÎÃͤϰʲ¼¤ÎÄ̤ꡣ
746
747 @verbatim
748
749         ¥­¡¼            Ãͤη¿          ÃͤΰÕÌ£
750         ---             -------------   ----------------
751         Mface           MFace *         ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥§¡¼¥¹
752
753         Mfont           MFont *         ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥©¥ó¥È
754
755         Mfont_width     int             ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥©¥ó¥È¤ÎÉý
756
757         Mfont_ascent    int             ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥©¥ó¥È¤Î ascent
758
759         Mfont_descent   int             ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥©¥ó¥È¤Î descent
760
761 @endverbatim
762
763      m17n-X ¥é¥¤¥Ö¥é¥ê¤Ç¤Ï¡¢°Ê²¼¤Î¥­¡¼¤â»ÈÍѤǤ­¤ë¡£
764
765 @verbatim
766
767         ¥­¡¼            Ãͤη¿          ÃͤΰÕÌ£
768         ---             -------------   ----------------
769         Mdisplay        Display *       ¥Õ¥ì¡¼¥à¤È´ØÏ¢ÉÕ¤±¤é¤ì¤¿¥Ç¥£¥¹¥×¥ì¥¤
770
771         Mscreen         int             ¥Õ¥ì¡¼¥à¤È´ØÏ¢ÉÕ¤±¤é¤ì¤¿¥¹¥¯¥ê¡¼¥ó
772                                         ¤Î¥¹¥¯¥ê¡¼¥ó¥Ê¥ó¥Ð
773
774         Mcolormap       Colormap        ¥Õ¥ì¡¼¥à¤Î¥«¥é¡¼¥Þ¥Ã¥×
775
776         Mdepth          unsigned        ¥Õ¥ì¡¼¥à¤Î¿¼¤µ
777 @endverbatim
778
779 */
780
781 void *
782 mframe_get_prop (MFrame *frame, MSymbol key)
783 {
784   if (key == Mface)
785     return frame->face;
786   if (key == Mfont)
787     return frame->font;
788   if (key == Mfont_width)
789     return (void *) (frame->average_width);
790   if (key == Mfont_ascent)
791     return (void *) (frame->ascent);
792   if (key == Mfont_descent)
793     return (void *) (frame->descent);
794   return (*frame->driver->get_prop) (frame, key);
795 }
796
797 /*=*/
798
799 /***en
800     @brief The default frame.
801
802     The external variable #mframe_default contains a pointer to the
803     default frame that is created by the first call of mframe ().  */
804
805 /***ja
806     @brief ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥ì¡¼¥à.
807
808     ³°ÉôÊÑ¿ô #mframe_default ¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥ì¡¼¥à¤Ø¤Î¥Ý¥¤¥ó¥¿¤ò»ý¤Ä¡£
809     ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥ì¡¼¥à¤Ï¡¢ºÇ½é¤Ë mframe () ¤¬¸Æ¤Ó½Ð¤µ¤ì¤¿¤È¤­¤Ëºî¤é¤ì¤ë¡£  */
810
811 MFrame *mframe_default;
812
813 /*** @} */
814
815 /*
816   Local Variables:
817   coding: euc-japan
818   End:
819 */