merge FLT
[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               || ! (*(void **) (&interface->init)
661                     = dlsym (interface->handle, "device_init"))
662               || ! (*(void **) (&interface->open)
663                     = dlsym (interface->handle, "device_open"))
664               || ! (*(void **) (&interface->fini)
665                     = dlsym (interface->handle, "device_fini"))
666               || (*interface->init) () < 0)
667             {
668               fprintf (stderr, "%s\n", (char *) dlerror ());
669               if (interface->handle)
670                 dlclose (interface->handle);
671               MERROR (MERROR_WIN, NULL);
672             }
673         }
674     }
675
676   M17N_OBJECT (frame, free_frame, MERROR_FRAME);
677   if ((*interface->open) (frame, plist) < 0)
678     {
679       free (frame);
680       MERROR (MERROR_WIN, NULL);
681     }
682
683   if (! mframe_default)
684     mframe_default = frame;
685
686   frame->face = mface ();
687   MPLIST_DO (pl, plist)
688     if (MPLIST_KEY (pl) == Mface)
689       mface_merge (frame->face, (MFace *) MPLIST_VAL (pl));
690   mface__update_frame_face (frame);
691   frame->font
692     = frame->rface->rfont ? (MFont *) frame->rface->rfont : NULL;
693   if (plist_created)
694     M17N_OBJECT_UNREF (plist);
695   return frame;
696 }
697
698 /*=*/
699
700 /***en
701     @brief Return property value of frame.
702
703     The mframe_get_prop () function returns a value of property $KEY
704     of frame $FRAME.  The valid keys and the corresponding return
705     values are as follows.
706
707 @verbatim
708
709         key             type of value   meaning of value
710         ---             -------------   ----------------
711         Mface           MFace *         The default face.
712
713         Mfont           MFont *         The default font.
714
715         Mfont_width     int             Width of the default font.
716
717         Mfont_ascent    int             Ascent of the default font.
718
719         Mfont_descent   int             Descent of the default font.
720
721 @endverbatim
722
723     In the m17n-X library, the followings are also accepted.
724
725 @verbatim
726
727         key             type of value   meaning of value
728         ---             -------------   ----------------
729         Mdisplay        Display *       Display associated with the frame.
730
731         Mscreen         int             Screen number of a screen associated
732                                         with the frame.
733
734         Mcolormap       Colormap        Colormap of the frame.
735
736         Mdepth          unsigned        Depth of the frame.
737 @endverbatim
738 */
739
740 /***ja
741     @brief ¥Õ¥ì¡¼¥à¤Î¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÊÖ¤¹.
742
743     ´Ø¿ô mframe_get_prop () ¤Ï¥Õ¥ì¡¼¥à $FRAME ¤Î¥­¡¼ $KEY 
744     ¤ò»ý¤Ä¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÊÖ¤¹¡£Í­¸ú¤Ê¥­¡¼¤È¤½¤ÎÃͤϰʲ¼¤ÎÄ̤ꡣ
745
746 @verbatim
747
748         ¥­¡¼            Ãͤη¿          ÃͤΰÕÌ£
749         ---             -------------   ----------------
750         Mface           MFace *         ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥§¡¼¥¹
751
752         Mfont           MFont *         ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥©¥ó¥È
753
754         Mfont_width     int             ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥©¥ó¥È¤ÎÉý
755
756         Mfont_ascent    int             ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥©¥ó¥È¤Î ascent
757
758         Mfont_descent   int             ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥©¥ó¥È¤Î descent
759
760 @endverbatim
761
762      m17n-X ¥é¥¤¥Ö¥é¥ê¤Ç¤Ï¡¢°Ê²¼¤Î¥­¡¼¤â»ÈÍѤǤ­¤ë¡£
763
764 @verbatim
765
766         ¥­¡¼            Ãͤη¿          ÃͤΰÕÌ£
767         ---             -------------   ----------------
768         Mdisplay        Display *       ¥Õ¥ì¡¼¥à¤È´ØÏ¢ÉÕ¤±¤é¤ì¤¿¥Ç¥£¥¹¥×¥ì¥¤
769
770         Mscreen         int             ¥Õ¥ì¡¼¥à¤È´ØÏ¢ÉÕ¤±¤é¤ì¤¿¥¹¥¯¥ê¡¼¥ó
771                                         ¤Î¥¹¥¯¥ê¡¼¥ó¥Ê¥ó¥Ð
772
773         Mcolormap       Colormap        ¥Õ¥ì¡¼¥à¤Î¥«¥é¡¼¥Þ¥Ã¥×
774
775         Mdepth          unsigned        ¥Õ¥ì¡¼¥à¤Î¿¼¤µ
776 @endverbatim
777
778 */
779
780 void *
781 mframe_get_prop (MFrame *frame, MSymbol key)
782 {
783   if (key == Mface)
784     return frame->face;
785   if (key == Mfont)
786     return frame->font;
787   if (key == Mfont_width)
788     return (void *) (frame->average_width);
789   if (key == Mfont_ascent)
790     return (void *) (frame->ascent);
791   if (key == Mfont_descent)
792     return (void *) (frame->descent);
793   return (*frame->driver->get_prop) (frame, key);
794 }
795
796 /*=*/
797
798 /***en
799     @brief The default frame.
800
801     The external variable #mframe_default contains a pointer to the
802     default frame that is created by the first call of mframe ().  */
803
804 /***ja
805     @brief ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥ì¡¼¥à.
806
807     ³°ÉôÊÑ¿ô #mframe_default ¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥ì¡¼¥à¤Ø¤Î¥Ý¥¤¥ó¥¿¤ò»ý¤Ä¡£
808     ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥ì¡¼¥à¤Ï¡¢ºÇ½é¤Ë mframe () ¤¬¸Æ¤Ó½Ð¤µ¤ì¤¿¤È¤­¤Ëºî¤é¤ì¤ë¡£  */
809
810 MFrame *mframe_default;
811
812 /*** @} */
813
814 /*
815   Local Variables:
816   coding: euc-japan
817   End:
818 */