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