(null_device_open): Check Mresolution param and set
[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., 59 Temple Place, Suite 330, Boston, MA
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 fo 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_mask = MDEBUG_INIT;
241
242   merror_code = MERROR_NONE;
243   if (m17n__gui_initialized++)
244     return;
245   m17n_init ();
246   if (merror_code != MERROR_NONE)
247     {
248       m17n__gui_initialized--;
249       return;
250     }
251
252   MDEBUG_PUSH_TIME ();
253
254   Mgd = msymbol ("gd");
255
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");
261
262   Mdisplay = msymbol ("display");
263   Mscreen = msymbol ("screen");
264   Mdrawable = msymbol ("drawable");
265   Mdepth = msymbol ("depth");
266   Mwidget = msymbol ("widget");
267
268   MDEBUG_PUSH_TIME ();
269   if (mfont__init () < 0)
270     goto err;
271   MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize font module."));
272   if (mfont__fontset_init () < 0)
273     goto err;
274   MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize fontset module."));
275   if (mface__init () < 0)
276     goto err;
277   MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize face module."));
278   if (mdraw__init () < 0)
279     goto err;
280   MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize draw module."));
281   if (minput__win_init () < 0)
282     goto err;
283   MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize input-win module."));
284   mframe_default = NULL;
285
286   register_device_library (Mx, "libm17n-X");
287   register_device_library (Mgd, "libm17n-gd");
288   return;
289
290  err:
291   MDEBUG_POP_TIME ();
292   MDEBUG_PRINT_TIME ("INIT", (stderr, " to initialize the m17n GUI module."));
293   MDEBUG_POP_TIME ();
294 }
295
296 void
297 m17n_fini_win (void)
298 {
299   int mdebug_mask = MDEBUG_FINI;
300   MPlist *plist;
301
302   if (m17n__gui_initialized == 0
303       || --m17n__gui_initialized > 0)
304     return;
305
306   MDEBUG_PUSH_TIME ();
307   MDEBUG_PUSH_TIME ();
308   MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize device modules."));
309   MPLIST_DO (plist, device_library_list)
310     {
311       MDeviceLibraryInterface *interface = MPLIST_VAL (plist);
312
313       if (interface->handle && interface->fini)
314         {
315           (*interface->fini) ();
316           dlclose (interface->handle);
317         }
318       free (interface->library);
319       free (interface);
320     }
321 #ifdef HAVE_FREETYPE
322   if (null_interface.handle)
323     (*null_interface.fini) ();
324 #endif  /* not HAVE_FREETYPE */
325   M17N_OBJECT_UNREF (device_library_list);
326   MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize input-gui module."));
327   minput__win_fini ();
328   MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize draw module."));
329   mdraw__fini ();
330   MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize face module."));
331   mface__fini ();
332   MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize fontset module."));
333   mfont__fontset_fini ();
334   MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize font module."));
335   mfont__fini ();
336   mframe_default = NULL;
337   MDEBUG_POP_TIME ();
338   MDEBUG_PRINT_TIME ("FINI", (stderr, " to finalize the gui modules."));
339   MDEBUG_POP_TIME ();
340   m17n_fini ();
341 }
342
343 /*** @} */ 
344 #endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
345
346 /*** @addtogroup m17nFrame */
347 /***en
348     @brief A @e frame is an object corresponding to the graphic device.
349
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.  */
353 /***ja
354     @brief @e ¥Õ¥ì¡¼¥à ¤È¤Ï¥°¥é¥Õ¥£¥Ã¥¯¥Ç¥Ð¥¤¥¹¤ËÂбþ¤¹¤ë¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ë.
355
356     @e ¥Õ¥ì¡¼¥à ¤È¤Ï #MFrame 
357     ·¿¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ê¡¢¸Ä¡¹¤Îɽ¼¨¡¿ÆþÎϥǥХ¤¥¹¤Î¾ðÊó¤ò³ÊǼ¤¹¤ë¤¿¤á¤ËÍѤ¤¤é¤ì¤ë¡£
358     ¤Û¤È¤ó¤É¤¹¤Ù¤Æ¤Î m17n GUI´Ø¿ô¤Ï¡¢°ú¿ô¤È¤·¤Æ¥Õ¥ì¡¼¥à¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÍ׵᤹¤ë¡£  */
359
360 /*** @{ */
361 /*=*/
362
363 /***en
364     @name Variables: Keys of frame parameter
365
366     These are the symbols to use in a parameter to create a frame.  See
367     the function mframe () for details.
368
369     #Mdevice, #Mdisplay, #Mscreen, #Mdrawable, #Mdepth, and #Mcolormap
370     are also keys of a frame property.  */
371
372 /***ja
373     @name ÊÑ¿ô¡§ ¥Õ¥ì¡¼¥à¥Ñ¥é¥á¡¼¥¿ÍÑ¥­¡¼
374
375     ¥Õ¥ì¡¼¥à¤òÀ¸À®¤¹¤ëºÝ¤Î¥Ñ¥é¥á¡¼¥¿¤ËÍѤ¤¤ë¥·¥ó¥Ü¥ë¡£¾Ü¤·¤¯¤Ï´Ø¿ô
376     mframe () ¤ÎÀâÌÀ»²¾È¡£
377
378     #Mdevice¡¢ #Mdisplay¡¢ #Mscreen¡¢ #Mdrawable¡¢ #Mdepth¡¢#Mcolormap
379     ¤Ï¥Õ¥ì¡¼¥à¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤Ç¤â¤¢¤ë¡£  */
380
381 /*=*/
382
383 MSymbol Mdevice, Mdisplay, Mscreen, Mdrawable, Mdepth, Mcolormap, Mwidget; 
384
385 MSymbol Mgd;
386
387 /*=*/
388
389 /***en
390     @name Variables: Keys of frame property
391
392     These are the symbols to use as an argument to the function
393     mframe_get_prop ().  */
394 /***ja
395     @name ÊÑ¿ô¡§ ¥Õ¥ì¡¼¥à¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼
396
397     ´Ø¿ô mframe_get_prop () ¤Î°ú¿ô¤ËÍѤ¤¤é¤ì¤ë¥·¥ó¥Ü¥ë¡£  */ 
398 /*** @{ */ 
399 /*=*/
400 MSymbol Mfont;
401 MSymbol Mfont_width;
402 MSymbol Mfont_ascent;
403 MSymbol Mfont_descent;
404
405 /*=*/
406
407 /*** @} */ 
408 /*=*/
409
410 /***en
411     @brief Create a new frame.
412
413     The mframe () function creates a new frame with parameters listed
414     in $PLIST which may be @c NULL.
415
416     The recognized keys in $PLIST are window system dependent.
417
418     The following key is always recognized.
419
420     <ul>
421
422     <li> #Mdevice, the value must be one of #Mx, #Mgd, and #Mnil.
423
424     If the value is #Mx, the frame is for X Window System.  The
425     argument #MDrawWindow specified together with the frame must be of
426     type @c Window.  The frame is both readable and writable, thus all
427     GUI functions can be used.
428
429     If the value is #Mgd, the frame is for an image object of GD
430     library.  The argument #MDrawWindow specified together with the
431     frame must be of type @c gdImagePtr.  The frame is writable
432     only, thus functions minput_XXX can't be used for the frame.
433
434     If the value is #Mnil, the frame is for a null device.  The frame
435     is not writable nor readable, thus functions mdraw_XXX that
436     require the argument #MDrawWindow and functions minput_XXX can't
437     be used for the frame.
438
439     <li> #Mface, the value must be a pointer to #MFace.
440
441     The value is used as the default face of the frame.
442
443     </ul>
444
445     In addition, if the value of the key #Mdevice is #Mx, the
446     following keys are recognized.  They are to specify the root
447     window and the depth of drawables that can be used with the frame.
448
449     <ul>
450
451     <li> #Mdrawable, the value type must be <tt>Drawable</tt>.
452
453     A parameter of key #Mdisplay must also be specified.  The
454     created frame can be used for drawables whose root window and
455     depth are the same as those of the specified drawable on the
456     specified display.
457
458     When this parameter is specified, the parameter of key #Mscreen
459     is ignored.
460
461     <li> #Mwidget, the value type must be <tt>Widget</tt>.
462
463     The created frame can be used for drawables whose root window and
464     depth are the same as those of the specified widget.
465
466     If a parameter of key #Mface is not specified, the default face
467     is created from the resources of the widget.
468
469     When this parameter is specified, the parameters of key #Mdisplay,
470     #Mscreen, #Mdrawable, #Mdepth are ignored.
471
472     <li> #Mdepth, the value type must be <tt>unsigned</tt>.
473
474     The created frame can be used for drawables of the specified
475     depth.
476
477     <li> #Mscreen, the value type must be <tt>(Screen *)</tt>.
478
479     The created frame can be used for drawables whose root window is
480     the same as the root window of the specified screen, and depth is
481     the same at the default depth of the screen.
482
483     When this parameter is specified, parameter of key #Mdisplay is
484     ignored.
485
486     <li> #Mdisplay, the value type must be <tt>(Display *)</tt>.
487
488     The created frame can be used for drawables whose root window is
489     the same as the root window for the default screen of the display,
490     and depth is the same as the default depth of the screen.
491
492     <li> #Mcolormap, the value type must be <tt>(Colormap)</tt>.
493
494     The created frame uses the specified colormap.
495
496     <li> #Mfont, the value must be #Mx, #Mfreetype, or #Mxft.
497
498     The created frame uses the specified font backend.  The value #Mx
499     instructs to use X core fonts, #Mfreetype to use local fonts
500     supported by FreeType fonts, and #Mxft to use local fonts via Xft
501     library.  You can specify this parameter more than once with
502     different values if you want to use multiple font backends.  This
503     is ignored if the specified font backend is not supported on the
504     device.
505     
506     When this parameter is not specified, all font backend supported
507     on the device are used.
508
509     </ul>
510
511     @return
512     If the operation was successful, mframe () returns a pointer to a
513     newly created frame.  Otherwise, it returns @c NULL.  */
514
515 /***ja
516     @brief ¿·¤·¤¤¥Õ¥ì¡¼¥à¤òºî¤ë.
517
518     ´Ø¿ô mframe () ¤Ï $PLIST Ãæ¤Î¥Ñ¥é¥á¡¼¥¿¤ò»ý¤Ä¿·¤·¤¤¥Õ¥ì¡¼¥à¤òºî¤ë¡£
519     $PLIST ¤Ï @c NULL ¤Ç¤âÎɤ¤¡£
520
521     $PLIST ¤Ë¸½¤ï¤ì¤ë¥­¡¼¤Î¤¦¤Á¤É¤ì¤¬Ç§¼±¤µ¤ì¤ë¤«¤Ï¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¤Ë°Í¸¤¹¤ë¡£
522
523     °Ê²¼¤Î¥­¡¼¤Ï¾ï¤Ëǧ¼±¤µ¤ì¤ë¡£
524
525     <ul>
526
527     <li> #Mdevice. ÃͤϠ#Mx, #Mgd, #Mnil ¤Î¤¤¤º¤ì¤«¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
528
529     Ãͤ¬ #Mx ¤Ê¤é¤Ð¡¢¿·¤·¤¤¥Õ¥ì¡¼¥à¤Ï X ¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥àÍѤǤ¢¤ë¡£
530     ¤³¤Î¥Õ¥ì¡¼¥à¤È¶¦¤Ë»ØÄꤵ¤ì¤¿°ú¿ô #MDrawWindow ¤Ï¡¢ @c Window
531     ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¥Õ¥ì¡¼¥à¤ÏÆɤ߽ñ¤­¤È¤â¤Ë²Äǽ¤Ç¤¢¤ê¡¢¤¹¤Ù¤Æ¤ÎGUI 
532     ´Ø¿ô¤¬»ÈÍѤǤ­¤ë¡£
533
534     Ãͤ¬ #Mgd ¤Ê¤é¤Ð¡¢¿·¤·¤¤¥Õ¥ì¡¼¥à¤Ï GD 
535     ¥é¥¤¥Ö¥é¥ê¤Î¥¤¥á¡¼¥¸¥ª¥Ö¥¸¥§¥¯¥ÈÍѤǤ¢¤ë¡£¤³¤Î¥Õ¥ì¡¼¥à¤È¶¦¤Ë»ØÄꤵ¤ì¤¿°ú¿ô
536     #MDrawWindow ¤Ï¡¢ @c gdImagePtr ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¥Õ¥ì¡¼¥à¤Ï½ñ¤­½Ð¤·ÀìÍѤǤ¢¤ê¡¢
537     minput_ ¤Ç»Ï¤Þ¤ë̾Á°¤Î´Ø¿ô¤Ï»ÈÍѤǤ­¤Ê¤¤¡£
538
539     Ãͤ¬ #Mnil ¤Ê¤é¤Ð¡¢¿·¤·¤¤¥Õ¥ì¡¼¥à¤Ï, null 
540     ¥Ç¥Ð¥¤¥¹ÍѤǤ¢¤ë¡£¤³¤Î¥Õ¥ì¡¼¥à¤ÏÆɤ߽ñ¤­¤Ç¤­¤Ê¤¤¤Î¤Ç¡¢°ú¿ô #MDrawWindow 
541     ¤òɬÍפȤ¹¤ëmdraw_ ¤Ç»Ï¤Þ¤ë̾Á°¤Î´Ø¿ô¤ä¡¢minput_ ¤Ç»Ï¤Þ¤ë̾Á°¤Î´Ø¿ô¤Ï»ÈÍѤǤ­¤Ê¤¤¡£
542
543     <li> #Mface. ÃͤϠ#MFace ¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
544
545     ¤³¤ÎÃͤϥե졼¥à¤Î¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥§¡¼¥¹¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
546
547     </ul>
548
549     ¤³¤ì¤é¤Î¥­¡¼¤Ë²Ã¤¨¡¢#Mdevice ¤Î¥­¡¼¤¬ #Mx 
550     ¤Ç¤¢¤ë¾ì¹ç¤Ë¸Â¤ê°Ê²¼¤Î¥­¡¼¤âǧ¼±¤µ¤ì¤ë¡£°Ê²¼¤Î¥­¡¼¤Ï¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤È¡¢¥Õ¥ì¡¼¥à¤ÇÍøÍѤǤ­¤ë 
551     drawable ¤Î¿¼¤µ¤ò»ØÄꤹ¤ë¡£
552
553     <ul>
554
555     <li> #Mdrawable. ÃͤϠ<tt>Drawable</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
556
557     ¥­¡¼ #Mdisplay ¤ò»ý¤Ä¥Ñ¥é¥á¡¼¥¿¤â»ØÄꤵ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ë¡£
558     À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤵ¤ì¤¿¥Ç¥£¥¹¥×¥ì¥¤¾å¤Î»ØÄꤵ¤ì¤¿ drawable 
559     ¤ÈƱ¤¸¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤È¿¼¤µ¤ò»ý¤Ä drawable ¤ËÍѤ¤¤é¤ì¤ë¡£
560
561     ¤³¤Î¥Ñ¥é¥á¡¼¥¿¤¬¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢#Mscreen ¤ò¥­¡¼¤È¤¹¤ë¥Ñ¥é¥á¡¼¥¿¤Ï̵»ë¤µ¤ì¤ë¡£
562
563     <li> #Mwidget. ÃͤϠ<tt>Widget</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
564
565     À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¥¦¥£¥¸¥§¥Ã¥È¤ÈƱ¤¸¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤È¿¼¤µ¤ò»ý¤Ä
566     drawable ¤ËÍѤ¤¤é¤ì¤ë¡£
567
568     ¥­¡¼ #Mface ¤ò»ý¤Ä¥Ñ¥é¥á¡¼¥¿¤¬¤Ê¤±¤ì¤Ð¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥§¡¼¥¹¤Ï¤³¤Î
569     ¥¦¥£¥¸¥§¥Ã¥È¤Î¥ê¥½¡¼¥¹¤«¤éºî¤é¤ì¤ë¡£
570
571     ¤³¤Î¥Ñ¥é¥á¡¼¥¿¤¬¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢#Mdisplay, #Mscreen, #Mdrawable,
572     #Mdepth ¤ò¥­¡¼¤È¤¹¤ë¥Ñ¥é¥á¡¼¥¿¤Ï̵»ë¤µ¤ì¤ë¡£
573
574     <li> #Mdepth. ÃͤϠ<tt>unsigned</tt>  ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
575
576     À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¿¼¤µ¤Î drawable ¤ËÍѤ¤¤é¤ì¤ë¡£
577
578     <li> #Mscreen. ÃͤϠ<tt>(Screen *)</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
579
580     À¸À®¤·¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¥¹¥¯¥ê¡¼¥ó¤ÈƱ¤¸¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤ò»ý¤Á¡¢¥¹¥¯¥ê¡¼¥ó¤Î¥Ç¥Õ¥©¥ë¥È¤Î¿¼¤µ¤ÈƱ¤¸¿¼¤µ¤ò»ý¤Ä drawable ¤ËÍѤ¤¤é¤ì¤ë¡£
581
582     ¤³¤Î¥Ñ¥é¥á¡¼¥¿¤¬¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢#Mdisplay ¤ò¥­¡¼¤È¤¹¤ë¥Ñ¥é¥á¡¼¥¿¤Ï̵»ë¤µ¤ì¤ë¡£
583
584     <li> #Mdisplay. ÃͤϠ<tt>(Display *)</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
585
586     À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¥Ç¥£¥¹¥×¥ì¥¤¤Î¥Ç¥Õ¥©¥ë¥È¥¹¥¯¥ê¡¼¥ó¤ÈƱ¤¸¥ë¡¼¥È¥¦¥£¥ó¥É¥¦¤ÈƱ¤¸¿¼¤µ¤ò»ý¤Ädrawables ¤ËÍѤ¤¤é¤ì¤ë¡£
587
588     <li> #Mcolormap. ÃͤϠ<tt>(Colormap)</tt> ·¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
589
590     À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï¡¢»ØÄꤷ¤¿¥«¥é¡¼¥Þ¥Ã¥×¤ò»ÈÍѤ¹¤ë¡£
591
592     <li> #Mfont. Ãͤϡ¢#Mx, #Mfreetype, #Mxft ¤Î¤¤¤º¤ì¤«¡£
593
594     À¸À®¤µ¤ì¤¿¥Õ¥ì¡¼¥à¤Ï»ØÄꤷ¤¿¥Õ¥©¥ó¥È¥Ð¥Ã¥¯¥¨¥ó¥É¤ò»ÈÍѤ¹¤ë¡£Ãͤ¬ 
595     #Mx ¤Ç¤¢¤ì¤Ð X ¤Î¥³¥¢¥Õ¥©¥ó¥È¡¢#Mfreetype ¤Ç¤¢¤ì¤Ð FreeType 
596     ¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¥í¡¼¥«¥ë¥Õ¥©¥ó¥È¡¢#Mxft ¤Ç¤¢¤ì¤Ð Xft 
597     ¥é¥¤¥Ö¥é¥ê·Ðͳ¤ÇÍѤ¤¤ë¥í¡¼¥«¥ë¥Õ¥©¥ó¥È¤ò»ÈÍѤ¹¤ë¡£
598     Ê£¿ô¤Î¥Õ¥©¥ó¥È¥Ð¥Ã¥¯¥¨¥ó¥É¤ò»ÈÍѤ·¤¿¤¤¾ì¹ç¤Ë¤Ï¡¢¤³¤Î¥Ñ¥é¥á¡¼¥¿¤òÊ£¿ô²ó¡¢°Û¤Ê¤ëÃͤǻØÄꤹ¤ë¤³¤È¤¬¤Ç¤­¤ë¡£
599     »ØÄꤷ¤¿¥Ð¥Ã¥¯¥¨¥ó¥É¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Ê¤¤¥Ç¥Ð¥¤¥¹¤Ç¤Ï¡¢¤³¤Î¥Ñ¥é¥á¡¼¥¿¤Ï̵»ë¤µ¤ì¤ë¡£
600
601     ¤³¤Î¥Ñ¥é¥á¡¼¥¿¤¬Ìµ¤¤¾ì¹ç¤Ë¤Ï¡¢¥Ç¥Ð¥¤¥¹¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¤¹¤Ù¤Æ¤Î¥Õ¥©¥ó¥È¥Ð¥Ã¥¯¥¨¥ó¥É¤òÍøÍѤ¹¤ë¡£
602
603     </ul>
604
605     @return
606     À®¸ù¤¹¤ì¤Ð mframe() ¤Ï¿·¤·¤¤¥Õ¥ì¡¼¥à¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð
607     @c NULL ¤òÊÖ¤¹¡£  */
608
609 MFrame *
610 mframe (MPlist *plist)
611 {
612   MFrame *frame;
613   int plist_created = 0;
614   MPlist *pl;
615   MSymbol device;
616   MDeviceLibraryInterface *interface;
617
618   if (plist)
619     {
620       pl = mplist_find_by_key (plist, Mdevice);
621       if (pl)
622         device = MPLIST_VAL (pl);
623       else
624         device = Mx;
625     }
626   else
627     {
628       plist = mplist ();
629       plist_created = 1;
630       device = Mx;
631     }
632
633   if (device == Mnil)
634     {
635 #ifdef HAVE_FREETYPE
636       interface = &null_interface;
637       if (! interface->handle)
638         {
639           (*interface->init) ();
640           interface->handle = (void *) 1;
641         }
642 #else  /* not HAVE_FREETYPE */
643       MERROR (MERROR_WIN, NULL);
644 #endif  /* not HAVE_FREETYPE */
645     }
646   else
647     {
648       interface = mplist_get (device_library_list, device);
649       if (! interface)
650         MERROR (MERROR_WIN, NULL);
651       if (! interface->handle)
652         {
653           if (! (interface->handle = dlopen (interface->library, RTLD_NOW))
654               || ! (interface->init
655                     = (int (*) ()) dlsym (interface->handle, "device_init"))
656               || ! (interface->open
657                     = (int (*) (MFrame *, MPlist *)) dlsym (interface->handle,
658                                                             "device_open"))
659               || ! (interface->fini
660                     = (int (*) ()) dlsym (interface->handle, "device_fini"))
661               || (*interface->init) () < 0)
662             {
663               fprintf (stderr, "%s\n", (char *) dlerror ());
664               if (interface->handle)
665                 dlclose (interface->handle);
666               MERROR (MERROR_WIN, NULL);
667             }
668         }
669     }
670
671   M17N_OBJECT (frame, free_frame, MERROR_FRAME);
672   if ((*interface->open) (frame, plist) < 0)
673     {
674       free (frame);
675       MERROR (MERROR_WIN, NULL);
676     }
677
678   if (! mframe_default)
679     mframe_default = frame;
680
681   frame->face = mface ();
682   MPLIST_DO (pl, plist)
683     if (MPLIST_KEY (pl) == Mface)
684       mface_merge (frame->face, (MFace *) MPLIST_VAL (pl));
685   mface__update_frame_face (frame);
686   frame->font = frame->rface->rfont ? frame->rface->rfont->font : NULL;
687
688   if (plist_created)
689     M17N_OBJECT_UNREF (plist);
690   return frame;
691 }
692
693 /*=*/
694
695 /***en
696     @brief Return property value of frame.
697
698     The mframe_get_prop () function returns a value of property $KEY
699     of frame $FRAME.  The valid keys and the corresponding return
700     values are as follows.
701
702 @verbatim
703
704         key             type of value   meaning of value
705         ---             -------------   ----------------
706         Mface           MFace *         The default face.
707
708         Mfont           MFont *         The default font.
709
710         Mfont_width     int             Width of the default font.
711
712         Mfont_ascent    int             Ascent of the default font.
713
714         Mfont_descent   int             Descent of the default font.
715
716 @endverbatim
717
718     In the m17n-X library, the followings are also accepted.
719
720 @verbatim
721
722         key             type of value   meaning of value
723         ---             -------------   ----------------
724         Mdisplay        Display *       Display associated with the frame.
725
726         Mscreen         int             Screen number of a screen associated
727                                         with the frame.
728
729         Mcolormap       Colormap        Colormap of the frame.
730
731         Mdepth          unsigned        Depth of the frame.
732 @endverbatim
733 */
734
735 /***ja
736     @brief ¥Õ¥ì¡¼¥à¤Î¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÊÖ¤¹.
737
738     ´Ø¿ô mframe_get_prop () ¤Ï¥Õ¥ì¡¼¥à $FRAME ¤Î¥­¡¼ $KEY 
739     ¤ò»ý¤Ä¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÊÖ¤¹¡£Í­¸ú¤Ê¥­¡¼¤È¤½¤ÎÃͤϰʲ¼¤ÎÄ̤ꡣ
740
741 @verbatim
742
743         ¥­¡¼            Ãͤη¿          ÃͤΰÕÌ£
744         ---             -------------   ----------------
745         Mface           MFace *         ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥§¡¼¥¹
746
747         Mfont           MFont *         ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥©¥ó¥È
748
749         Mfont_width     int             ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥©¥ó¥È¤ÎÉý
750
751         Mfont_ascent    int             ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥©¥ó¥È¤Î ascent
752
753         Mfont_descent   int             ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥©¥ó¥È¤Î descent
754
755 @endverbatim
756
757      m17n-X ¥é¥¤¥Ö¥é¥ê¤Ç¤Ï¡¢°Ê²¼¤Î¥­¡¼¤â»ÈÍѤǤ­¤ë¡£
758
759 @verbatim
760
761         ¥­¡¼            Ãͤη¿          ÃͤΰÕÌ£
762         ---             -------------   ----------------
763         Mdisplay        Display *       ¥Õ¥ì¡¼¥à¤È´ØÏ¢ÉÕ¤±¤é¤ì¤¿¥Ç¥£¥¹¥×¥ì¥¤
764
765         Mscreen         int             ¥Õ¥ì¡¼¥à¤È´ØÏ¢ÉÕ¤±¤é¤ì¤¿¥¹¥¯¥ê¡¼¥ó
766                                         ¤Î¥¹¥¯¥ê¡¼¥ó¥Ê¥ó¥Ð
767
768         Mcolormap       Colormap        ¥Õ¥ì¡¼¥à¤Î¥«¥é¡¼¥Þ¥Ã¥×
769
770         Mdepth          unsigned        ¥Õ¥ì¡¼¥à¤Î¿¼¤µ
771 @endverbatim
772
773 */
774
775 void *
776 mframe_get_prop (MFrame *frame, MSymbol key)
777 {
778   if (key == Mface)
779     return frame->face;
780   if (key == Mfont)
781     return (frame->rface->rfont ? frame->rface->rfont->font : NULL);
782   if (key == Mfont_width)
783     return (void *) (frame->space_width);
784   if (key == Mfont_ascent)
785     return (void *) (frame->ascent);
786   if (key == Mfont_descent)
787     return (void *) (frame->descent);
788   return (*frame->driver->get_prop) (frame, key);
789 }
790
791 /*=*/
792
793 /***en
794     @brief The default frame.
795
796     The external variable #mframe_default contains a pointer to the
797     default frame that is created by the first call of mframe ().  */
798
799 /***ja
800     @brief ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥ì¡¼¥à.
801
802     ³°ÉôÊÑ¿ô #mframe_default ¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥ì¡¼¥à¤Ø¤Î¥Ý¥¤¥ó¥¿¤ò»ý¤Ä¡£
803     ¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥ì¡¼¥à¤Ï¡¢ºÇ½é¤Ë mframe () ¤¬¸Æ¤Ó½Ð¤µ¤ì¤¿¤È¤­¤Ëºî¤é¤ì¤ë¡£  */
804
805 MFrame *mframe_default;
806
807 /*** @} */
808
809 /*
810   Local Variables:
811   coding: euc-japan
812   End:
813 */