1 /* input-gui.c -- gui-based input method module.
2 Copyright (C) 2003, 2004
3 National Institute of Advanced Industrial Science and Technology (AIST)
4 Registration Number H15PRO112
6 This file is part of the m17n library.
8 The m17n library is free software; you can redistribute it and/or
9 modify it under the terms of the GNU Lesser General Public License
10 as published by the Free Software Foundation; either version 2.1 of
11 the License, or (at your option) any later version.
13 The m17n library is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public
19 License along with the m17n library; if not, write to the Free
20 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
24 @addtogroup m17nInputMethodWin
25 @brief Input method support on window systems.
27 The input driver @c minput_gui_driver is provided for internal
28 input methods that is useful on window systems. It displays
29 preedit text and status text at the inputting spot. See the
30 documentation of @c minput_gui_driver for more details.
32 In the m17n-X library, the foreign input method of name @c Mxim is
33 provided. It uses XIM (X Input Method) as a background input
34 engine. The symbol @c Mxim has a property @c Minput_driver whose
35 value is a pointer to the input driver @c minput_xim_driver. See
36 the documentation of @c minput_xim_driver for more details. */
39 @addtogroup m17nInputMethodWin
40 @brief ¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¾å¤ÎÆþÎϥ᥽¥Ã¥É¤Î¥µ¥Ý¡¼¥È.
42 ÆþÎϥɥ饤¥Ð @c minput_gui_driver ¤Ï¡¢
43 ¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¾å¤ÇÍѤ¤¤é¤ì¤ëÆâÉôÆþÎϥ᥽¥Ã¥ÉÍѤΥɥ饤¥Ð¤Ç¤¢¤ë¡£
44 ¤³¤Î¥É¥é¥¤¥Ð¤ÏÆþÎÏ¥¹¥Ý¥Ã¥È¤Ë preedit ¥Æ¥¥¹¥È¤È status
45 ¥Æ¥¥¹¥È¤òɽ¼¨¤¹¤ë¡£¾ÜºÙ¤Ë¤Ä¤¤¤Æ¤Ï @c minput_gui_driver ¤ÎÀâÌÀ¤ò»²¾È¤Î¤³¤È¡£
47 m17n-X ¥é¥¤¥Ö¥é¥ê¤Ï¡¢@c Mxim ¤È¸À¤¦Ì¾Á°¤ò»ý¤Ä³°ÉôÆþÎϥ᥽¥Ã¥É¤òÄ󶡤·¤Æ¤¤¤ë¡£¤³¤ì¤Ï
48 XIM (X Input Method) ¤ò¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¤ÎÆþÎÏ¥¨¥ó¥¸¥ó¤È¤·¤ÆÍøÍѤ¹¤ë¡£¥·¥ó¥Ü¥ë
49 @c Mxim ¤Ï @c Minput_driver ¤È¤¤¤¦¥×¥í¥Ñ¥Æ¥£¤ò»ý¤Ã¤Æ¤ª¤ê¡¢¤½¤ÎÃͤÏÆþÎϥɥ饤¥Ð
50 @c minput_xim_driver ¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£ ¾ÜºÙ¤Ë¤Ä¤¤¤Æ¤Ï
51 @c minput_xim_driver ¤ÎÀâÌÀ¤ò»²¾È¤Î¤³¤È¡£ */
55 #if !defined (FOR_DOXYGEN) || defined (DOXYGEN_INTERNAL_MODULE)
56 /*** @addtogroup m17nInternal
64 #include "m17n-misc.h"
66 #include "internal-gui.h"
79 MInputContextInfo *ic_info;
82 /* <geometry>.x and <geometry>.y are not used. */
83 MInputGUIWinInfo client;
84 /* In the following members, <geometry> is relative to <client>. */
85 MInputGUIWinInfo focus;
86 MInputGUIWinInfo preedit;
87 MInputGUIWinInfo status;
88 MInputGUIWinInfo candidates;
89 } MInputGUIContextInfo;
91 static MFace *status_face;
92 static MFaceBoxProp face_box_prop;
95 win_create_ic (MInputContext *ic)
97 MInputGUIContextInfo *win_ic_info;
98 MInputGUIArgIC *win_info = (MInputGUIArgIC *) ic->arg;
99 MFrame *frame = win_info->frame;
101 if ((*minput_default_driver.create_ic) (ic) < 0)
104 MSTRUCT_CALLOC (win_ic_info, MERROR_IM);
105 win_ic_info->ic_info = (MInputContextInfo *) ic->info;
106 win_ic_info->frame = frame;
107 win_ic_info->client.win = win_info->client;
108 (*frame->driver->window_geometry) (frame, win_info->client, win_info->client,
109 &win_ic_info->client.geometry);
110 win_ic_info->focus.win = win_info->focus;
111 (*frame->driver->window_geometry) (frame, win_info->focus, win_info->client,
112 &win_ic_info->focus.geometry);
114 win_ic_info->preedit.win = (*frame->driver->create_window) (frame, win_info->client);
115 win_ic_info->preedit.control.two_dimensional = 1;
116 win_ic_info->preedit.control.as_image = 0;
117 win_ic_info->preedit.control.with_cursor = 1;
118 win_ic_info->preedit.control.cursor_width = 1;
119 win_ic_info->preedit.control.enable_bidi = 1;
120 win_ic_info->preedit.geometry.x = -1;
121 win_ic_info->preedit.geometry.y = -1;
123 win_ic_info->status.win = (*frame->driver->create_window) (frame, win_info->client);
124 win_ic_info->status.control.as_image = 1;
125 win_ic_info->status.control.enable_bidi = 1;
127 win_ic_info->candidates.win = (*frame->driver->create_window) (frame, win_info->client);
128 win_ic_info->candidates.control.as_image = 1;
130 ic->info = win_ic_info;
136 win_destroy_ic (MInputContext *ic)
138 MInputGUIContextInfo *win_ic_info = (MInputGUIContextInfo *) ic->info;
139 MInputContextInfo *ic_info = (MInputContextInfo *) win_ic_info->ic_info;
140 MFrame *frame = win_ic_info->frame;
142 (*frame->driver->destroy_window) (frame, win_ic_info->preedit.win);
143 (*frame->driver->destroy_window) (frame, win_ic_info->status.win);
144 (*frame->driver->destroy_window) (frame, win_ic_info->candidates.win);
146 (*minput_default_driver.destroy_ic) (ic);
151 win_filter (MInputContext *ic, MSymbol key, void *arg)
153 MInputGUIContextInfo *win_ic_info = (MInputGUIContextInfo *) ic->info;
154 MInputContextInfo *ic_info = (MInputContextInfo *) win_ic_info->ic_info;
165 key = minput_event_to_key (win_ic_info->frame, arg);
170 ret = (*minput_default_driver.filter) (ic, key, arg);
171 ic->info = win_ic_info;
176 adjust_window_and_draw (MFrame *frame, MInputContext *ic, MText *mt, int type)
178 MInputGUIContextInfo *win_ic_info = (MInputGUIContextInfo *) ic->info;
179 MDrawControl *control;
181 MDrawMetric *geometry, physical, logical;
182 int xoff = win_ic_info->focus.geometry.x;
183 int yoff = win_ic_info->focus.geometry.y;
185 int len = mtext_nchars (mt);
189 win = win_ic_info->preedit.win;
190 control = &win_ic_info->preedit.control;
191 geometry = &win_ic_info->preedit.geometry;
196 win = win_ic_info->status.win;
197 control = &win_ic_info->status.control;
198 geometry = &win_ic_info->status.geometry;
202 win = win_ic_info->candidates.win;
203 control = &win_ic_info->candidates.control;
204 geometry = &win_ic_info->candidates.geometry;
207 mdraw_text_extents (frame, mt, 0, len, control, &physical, &logical, NULL);
208 x0 = physical.x, x1 = x0 + physical.width;
209 y0 = physical.y, y1 = y0 + physical.height;
212 if (x1 < logical.x + logical.width)
213 x1 = logical.x + logical.width;
216 if (y1 < logical.y + logical.height)
217 y1 = logical.y + logical.height;
218 physical.width = x1 - x0;
219 physical.height = y1 - y0;
220 physical.x = xoff + ic->spot.x;
221 if (physical.x + physical.width > win_ic_info->client.geometry.width)
222 physical.x = win_ic_info->client.geometry.width - physical.width;
227 physical.height = physical.width = 1;
228 physical.x = physical.y = -1;
232 if (y0 > - ic->spot.ascent)
234 physical.height += y0 + ic->spot.ascent;
235 y0 = - ic->spot.ascent;
237 if (y1 < ic->spot.descent)
239 physical.height += ic->spot.descent - y1;
241 physical.y = yoff + ic->spot.y + y0;
246 physical.y = yoff + ic->spot.y + ic->spot.descent + 2;
247 if (physical.y + physical.height > win_ic_info->client.geometry.height
248 && yoff + ic->spot.y - ic->spot.ascent - 2 - physical.height >= 0)
249 physical.y = yoff + ic->spot.y - ic->spot.ascent - 2 - physical.height;
253 if (win_ic_info->status.mapped)
255 /* We assume that status is already drawn. */
256 if (win_ic_info->status.geometry.y < yoff + ic->spot.y)
257 /* As there was no lower room for status, candidates must also
259 physical.y = win_ic_info->status.geometry.y - 1 - physical.height;
262 /* There was a lower room for status. */
263 physical.y = (win_ic_info->status.geometry.y
264 + win_ic_info->status.geometry.height
266 if (physical.y + physical.height
267 > win_ic_info->client.geometry.height)
268 /* But not for candidates. */
269 physical.y = (yoff + ic->spot.y - ic->spot.ascent - 1
275 physical.y = yoff + ic->spot.y + ic->spot.descent + 2;
276 if ((physical.y + physical.height
277 > win_ic_info->client.geometry.height)
278 && (yoff + ic->spot.y - ic->spot.ascent - 2 - physical.height
280 physical.y = (yoff + ic->spot.y - ic->spot.ascent - 2
285 (*frame->driver->adjust_window) (frame, win, geometry, &physical);
286 mdraw_text_with_control (frame, win, -x0, -y0, mt, 0, len, control);
290 win_callback (MInputContext *ic, MSymbol command)
292 MInputGUIContextInfo *win_ic_info = (MInputGUIContextInfo *) ic->info;
293 MFrame *frame = win_ic_info->frame;
295 if (command == Minput_preedit_draw)
298 MFace *face = mface ();
300 if (! win_ic_info->preedit.mapped)
302 (*frame->driver->map_window) (frame, win_ic_info->preedit.win);
303 win_ic_info->preedit.mapped = 1;
305 win_ic_info->preedit.control.cursor_pos = ic->cursor_pos;
306 if (ic->spot.fontsize)
307 mface_put_prop (face, Msize, (void *) ic->spot.fontsize);
308 mface_merge (face, mface_underline);
309 mtext_push_prop (ic->preedit, 0, mtext_nchars (ic->preedit),
311 M17N_OBJECT_UNREF (face);
312 if (ic->im->language != Mnil)
313 mtext_put_prop (ic->preedit, 0, mtext_nchars (ic->preedit), Mlanguage,
315 if (ic->candidate_list)
316 mtext_push_prop (ic->preedit, ic->candidate_from, ic->candidate_to,
317 Mface, mface_reverse_video);
318 if (mtext_nchars (ic->produced) == 0)
322 mt = mtext_dup (ic->produced);
323 mtext_cat (mt, ic->preedit);
324 win_ic_info->preedit.control.cursor_pos
325 += mtext_nchars (ic->produced);
327 adjust_window_and_draw (frame, ic, mt, 0);
328 if (ic->candidate_list)
329 mtext_pop_prop (ic->preedit, 0, mtext_nchars (ic->preedit), Mface);
330 mtext_pop_prop (ic->preedit, 0, mtext_nchars (ic->preedit), Mface);
331 if (mtext_nchars (ic->produced) != 0)
332 M17N_OBJECT_UNREF (mt);
334 else if (command == Minput_status_draw)
336 if (! win_ic_info->client.win)
338 mtext_put_prop (ic->status, 0, mtext_nchars (ic->status), Mface,
340 if (ic->im->language != Mnil)
341 mtext_put_prop (ic->status, 0, mtext_nchars (ic->status), Mlanguage,
343 adjust_window_and_draw (frame, ic, ic->status, 1);
345 else if (command == Minput_candidates_draw)
352 if (! ic->candidate_list || ! ic->candidate_show)
354 if (win_ic_info->candidates.mapped)
356 (*frame->driver->unmap_window) (frame, win_ic_info->candidates.win);
357 win_ic_info->candidates.mapped = 0;
362 if (! win_ic_info->candidates.mapped)
364 (*frame->driver->map_window) (frame, win_ic_info->candidates.win);
365 win_ic_info->candidates.mapped = 1;
369 group = ic->candidate_list;
372 if (mplist_key (group) == Mtext)
373 len = mtext_len (mplist_value (group));
375 len = mplist_length (mplist_value (group));
376 if (i + len > ic->candidate_index)
379 group = mplist_next (group);
383 if (mplist_key (group) == Mtext)
385 MText *candidates = (MText *) mplist_value (group);
387 from = (ic->candidate_index - i) * 2 + 1;
389 for (i = 0; i < len; i++)
391 mtext_cat_char (mt, ' ');
392 mtext_cat_char (mt, mtext_ref_char (candidates, i));
399 for (pl = (MPlist *) mplist_value (group);
400 i < ic->candidate_index && mplist_key (pl) != Mnil;
401 i++, pl = mplist_next (pl))
403 mtext_cat_char (mt, ' ');
404 mtext_cat (mt, (MText *) mplist_value (pl));
406 from = mtext_nchars (mt) + 1;
407 to = from + mtext_nchars ((MText *) mplist_value (pl));
408 for (; mplist_key (pl) != Mnil; pl = mplist_next (pl))
410 mtext_cat_char (mt, ' ');
411 mtext_cat (mt, (MText *) mplist_value (pl));
414 mtext_cat_char (mt, ' ');
415 mtext_push_prop (mt, 0, mtext_nchars (mt), Mface, status_face);
416 mtext_push_prop (mt, from, to, Mface, mface_reverse_video);
417 if (ic->im->language != Mnil)
418 mtext_put_prop (mt, 0, mtext_nchars (mt), Mlanguage, ic->im->language);
419 adjust_window_and_draw (frame, ic, mt, 2);
420 M17N_OBJECT_UNREF (mt);
422 else if (command == Minput_set_spot)
424 minput__callback (ic, Minput_preedit_draw);
425 minput__callback (ic, Minput_status_draw);
426 minput__callback (ic, Minput_candidates_draw);
428 else if (command == Minput_toggle)
432 minput__callback (ic, Minput_preedit_done);
433 minput__callback (ic, Minput_status_done);
434 minput__callback (ic, Minput_candidates_done);
438 minput__callback (ic, Minput_preedit_start);
439 minput__callback (ic, Minput_status_start);
440 minput__callback (ic, Minput_candidates_start);
443 else if (command == Minput_preedit_start)
446 else if (command == Minput_preedit_done)
448 if (win_ic_info->preedit.mapped)
450 (*frame->driver->unmap_window) (frame, win_ic_info->preedit.win);
451 win_ic_info->preedit.mapped = 0;
454 else if (command == Minput_status_start)
456 if (! win_ic_info->status.mapped)
458 (*frame->driver->map_window) (frame, win_ic_info->status.win);
459 win_ic_info->status.mapped = 1;
462 else if (command == Minput_status_done)
464 if (win_ic_info->status.mapped)
466 (*frame->driver->unmap_window) (frame, win_ic_info->status.win);
467 win_ic_info->status.mapped = 0;
470 else if (command == Minput_candidates_start)
472 if (! win_ic_info->candidates.mapped)
474 (*frame->driver->map_window) (frame, win_ic_info->candidates.win);
475 win_ic_info->candidates.mapped = 1;
478 else if (command == Minput_candidates_done)
480 if (win_ic_info->candidates.mapped)
482 (*frame->driver->unmap_window) (frame, win_ic_info->candidates.win);
483 win_ic_info->candidates.mapped = 0;
486 else if (command == Minput_reset)
488 MInputCallbackFunc func;
490 if (minput_default_driver.callback_list
491 && (func = ((MInputCallbackFunc)
492 mplist_get (minput_default_driver.callback_list,
495 MInputContextInfo *ic_info
496 = (MInputContextInfo *) win_ic_info->ic_info;
498 (func) (ic, Minput_reset);
499 ic->info = win_ic_info;
501 if (ic->preedit_changed)
502 minput__callback (ic, Minput_preedit_draw);
503 if (ic->status_changed)
504 minput__callback (ic, Minput_status_draw);
505 if (ic->candidates_changed)
506 minput__callback (ic, Minput_candidates_draw);
511 win_lookup (MInputContext *ic, MSymbol key, void *arg, MText *mt)
513 MInputGUIContextInfo *win_ic_info = (MInputGUIContextInfo *) ic->info;
514 MInputContextInfo *ic_info = (MInputContextInfo *) win_ic_info->ic_info;
518 ret = (*minput_default_driver.lookup) (ic, key, arg, mt);
519 ic->info = win_ic_info;
528 minput_gui_driver = minput_default_driver;
530 minput_gui_driver.create_ic = win_create_ic;
531 minput_gui_driver.destroy_ic = win_destroy_ic;
532 minput_gui_driver.filter = win_filter;
533 minput_gui_driver.lookup = win_lookup;
535 MPlist *plist = mplist ();
537 minput_gui_driver.callback_list = plist;
538 plist = mplist_add (plist, Minput_preedit_start, (void *) win_callback);
539 plist = mplist_add (plist, Minput_preedit_draw, (void *) win_callback);
540 plist = mplist_add (plist, Minput_preedit_done, (void *) win_callback);
541 plist = mplist_add (plist, Minput_status_start, (void *) win_callback);
542 plist = mplist_add (plist, Minput_status_draw, (void *) win_callback);
543 plist = mplist_add (plist, Minput_status_done, (void *) win_callback);
544 plist = mplist_add (plist, Minput_candidates_start, (void *) win_callback);
545 plist = mplist_add (plist, Minput_candidates_draw, (void *) win_callback);
546 plist = mplist_add (plist, Minput_candidates_done, (void *) win_callback);
547 plist = mplist_add (plist, Minput_set_spot, (void *) win_callback);
548 plist = mplist_add (plist, Minput_toggle, (void *) win_callback);
549 plist = mplist_add (plist, Minput_reset, (void *) win_callback);
552 /* This will make a caller of minput_method_open() pazzled. */
553 minput_driver = &minput_gui_driver;
556 face_box_prop.width = 1;
557 face_box_prop.color_top = face_box_prop.color_left
558 = face_box_prop.color_bottom = face_box_prop.color_right
560 face_box_prop.inner_hmargin = face_box_prop.inner_vmargin = 2;
561 face_box_prop.outer_hmargin = face_box_prop.outer_vmargin = 1;
562 status_face = mface ();
563 mface_put_prop (status_face, Mbox, &face_box_prop);
571 M17N_OBJECT_UNREF (status_face);
572 if (minput_gui_driver.callback_list)
574 M17N_OBJECT_UNREF (minput_gui_driver.callback_list);
575 minput_gui_driver.callback_list = NULL;
580 #endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
585 /*** @addtogroup m17nInputMethodWin */
590 @brief Input driver for internal input methods on window systems.
592 The input driver @c minput_gui_driver is for internal input
593 methods to be used on window systems.
595 It creates sub-windows for a preedit text and a status text, and
596 displays them at the input spot set by the function
599 The macro M17N_INIT () set the variable @c minput_driver to the
600 pointer to this driver so that all internal input methods use it.
602 Therefore, unless @c minput_driver is changed from the default,
603 the driver dependent arguments to the functions whose name begin
604 with minput_ must are treated as follows.
606 The argument $ARG of the function minput_open_im () is ignored.
608 The argument $ARG of the function minput_create_ic () must be a
609 pointer to the structure @c MInputGUIArgIC. See the documentation
610 of @c MInputGUIArgIC for more details.
612 If the argument $KEY of function minput_filter () is @c Mnil, the
613 argument $ARG must be a pointer to the object of type @c XEvent.
614 In that case, $KEY is generated from $ARG.
616 The argument $ARG of the function minput_lookup () must be the
617 same one as that of the function minput_filter (). */
620 @brief ¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¤ÎÆâÉôÆþÎϥ᥽¥Ã¥ÉÍÑÆþÎϥɥ饤¥Ð.
622 ÆþÎϥɥ饤¥Ð @c minput_gui_driver
623 ¤Ï¡¢¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¾å¤ÇÍѤ¤¤é¤ì¤ëÆþÎϥ᥽¥Ã¥ÉÍѥɥ饤¥Ð¤Ç¤¢¤ë¡£
625 ¤³¤Î¥É¥é¥¤¥Ð¤Ï¡¢´Ø¿ô minput_set_spot () ¤Ë¤è¤Ã¤ÆÀßÄꤵ¤ì¤¿ÆþÎÏ¥¹¥Ý¥Ã¥È¤Ë
626 preedit ¥Æ¥¥¹¥ÈÍѤΥµ¥Ö¥¦¥£¥ó¥É¥¦¤È status
627 ¥Æ¥¥¹¥ÈÍѤΥµ¥Ö¥¦¥£¥ó¥É¥¦¤òºî¤ê¡¢¤½¤ì¤¾¤ì¤òɽ¼¨¤¹¤ë¡£
629 ¥Þ¥¯¥í M17N_INIT () ¤ÏÊÑ¿ô @c minput_driver
630 ¤ò¤³¤Î¥É¥é¥¤¥Ð¤Ø¤Î¥Ý¥¤¥ó¥¿¤ËÀßÄꤷ¡¢Á´¤Æ¤ÎÆâÉôÆþÎϥ᥽¥Ã¥É¤¬¤³¤Î¥É¥é¥¤¥Ð¤ò»È¤¦¤è¤¦¤Ë¤¹¤ë¡£
632 ¤·¤¿¤¬¤Ã¤Æ¡¢@c minput_driver ¤¬¥Ç¥Õ¥©¥ë¥ÈÃͤΤޤޤǤ¢¤ì¤Ð¡¢minput_
633 ¤Ç»Ï¤Þ¤ë̾Á°¤ò»ý¤Ä´Ø¿ô¤Î°ú¿ô¤Î¤¦¤Á¥É¥é¥¤¥Ð°Í¸¤Î¤â¤Î¤Ï°Ê²¼¤Î¤è¤¦¤Ë¤Ê¤ë¡£
635 ´Ø¿ô minput_open_im () ¤Î°ú¿ô $ARG ¤Ï̵»ë¤µ¤ì¤ë¡£
637 ´Ø¿ô minput_create_ic () ¤Î°ú¿ô $ARG ¤Ï¹½Â¤ÂÎ @c MInputGUIArgIC
638 ¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¾ÜºÙ¤Ë¤Ä¤¤¤Æ¤Ï @c MInputGUIArgIC
641 ´Ø¿ô minput_filter () ¤Î°ú¿ô $ARG ¤¬ @c Mnil ¤Î¾ì¹ç¡¢ $ARG ¤Ï @c
642 XEvent ·¿¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¤³¤Î¾ì¹ç
643 $KEY ¤Ï $ARG ¤«¤éÀ¸À®¤µ¤ì¤ë¡£
645 ´Ø¿ô minput_lookup () ¤Î°ú¿ô $ARG ¤Ï´Ø¿ô minput_filter () ¤Î°ú¿ô
646 $ARG ¤ÈƱ¤¸¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£ */
648 MInputDriver minput_gui_driver;
653 @brief Symbol of the name "xim".
655 The variable Mxim is a symbol of name "xim". It is a name of the
656 input method driver #minput_xim_driver. */
658 @brief "xim"¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë .
660 ÊÑ¿ô Mxim ¤Ï"xim"¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£"xim"
661 ¤ÏÆþÎϥ᥽¥Ã¥É¥É¥é¥¤¥Ð #minput_xim_driver ¤Î̾Á°¤Ç¤¢¤ë¡£ */
668 @brief Convert an event to an input key.
670 The minput_event_to_key () function returns the input key
671 corresponding to event $EVENT on $FRAME by a window system
674 In the m17n-X library, $EVENT must be a pointer to the structure
675 @c XKeyEvent, and it is handled as below.
677 At first, the keysym name of $EVENT is acquired by the function @c
678 XKeysymToString. Then, the name is modified as below.
680 If the name is one of "a" .. "z" and $EVENT has a Shift modifier,
681 the name is converted to "A" .. "Z" respectively, and the Shift
684 If the name is one byte length and $EVENT has a Control modifier,
685 the byte is bitwise anded by 0x1F and the Control modifier is
688 If $EVENT still has modifiers, the name is preceded by "H-"
689 (Hyper), "s-" (Super), "A-" (Alt), "M-" (Meta), "C-" (Control),
690 and/or "S-" (Shift) in this order.
692 For instance, if the keysym name is "a" and the event has Shift,
693 Meta, and Hyper modifiers, the resulting name is "H-M-A".
695 At last, a symbol who has the name is returned. */
698 @brief ¥¤¥Ù¥ó¥È¤òÆþÎÏ¥¡¼¤ËÊÑ´¹¤¹¤ë.
700 ´Ø¿ô minput_event_to_key () ¤Ï¡¢$FRAME ¤Î¥¤¥Ù¥ó¥È $EVENT
701 ¤ËÂбþ¤¹¤ëÆþÎÏ¥¡¼¤òÊÖ¤¹¡£¤³¤³¤Ç¤Î¡ÖÂбþ¡×¤Ï¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¤Ë°Í¸¤¹¤ë¡£
703 m17n-X ¥é¥¤¥Ö¥é¥ê¤Î¾ì¹ç¤Ë¤Ï¡¢$EVENT ¤Ï ¹½Â¤ÂÎ @c XKeyEvent
704 ¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢¤ê¡¢¼¡¤Î¤è¤¦¤Ë½èÍý¤µ¤ì¤ë¡£
706 ¤Þ¤º¡¢´Ø¿ô @c XKeysymToString ¤Ë¤è¤Ã¤Æ¡¢$EVENT ¤Î keysym
707 ̾¤ò¼èÆÀ¤·¡¢¼¡¤¤¤Ç°Ê²¼¤ÎÊѹ¹¤ò²Ã¤¨¤ë¡£
709 ̾Á°¤¬ "a" .. "z" ¤Î¤¤¤º¤ì¤«¤Ç¤¢¤Ã¤Æ $EVENT ¤Ë Shift
710 ¥â¥Ç¥£¥Õ¥¡¥¤¥¢¤¬¤¢¤ì¤Ð¡¢Ì¾Á°¤Ï¤½¤ì¤¾¤ì "A" .. "Z" ¤ËÊÑ´¹¤µ¤ì¡¢Shift
711 ¥â¥Ç¥£¥Õ¥¡¥¤¥¢¤Ï¼è¤ê½ü¤«¤ì¤ë¡£
713 ̾Á°¤¬£±¥Ð¥¤¥ÈĹ¤Ç $EVENT ¤Ë Control ¥â¥Ç¥£¥Õ¥¡¥¤¥¢¤¬¤¢¤ì¤Ð¡¢Ì¾Á°¤È
714 0x1F ¤È¤ò¥Ó¥Ã¥Èñ°Ì¤Ç and ±é»»¤·¡¢Control ¥â¥Ç¥£¥Õ¥¡¥¤¥¢¤Ï¼è¤ê½ü¤«¤ì¤ë¡£
716 ¤½¤ì¤Ç¤â $EVENT ¤Ë¤Þ¤À¥â¥Ç¥£¥Õ¥¡¥¤¥¢¤¬¤¢¤ì¤Ð¡¢Ì¾Á°¤ÎÁ°¤Ë¤½¤ì¤¾¤ì
717 "H-" (Hyper), "s-" (Super), "A-" (Alt), "M-" (Meta), "C-"
718 (Control), "S-" (Shift) ¤¬¤³¤Î½çÈÖ¤ÇÉÕ¤¯¡£
720 ¤¿¤È¤¨¤Ð¡¢keysym ̾¤¬ "a" ¤Ç¥¤¥Ù¥ó¥È¤¬ Shift, Meta, and Hyper
721 ¥â¥Ç¥£¥Õ¥¡¥¤¥¢¤ò»ý¤Æ¤Ð¡¢ÆÀ¤é¤ì¤ë̾Á°¤Ï "H-M-A" ¤Ç¤¢¤ë¡£
723 ºÇ¸å¤Ë¤½¤Î̾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤òÊÖ¤¹¡£*/
727 minput_event_to_key (MFrame *frame, void *event)
733 M_CHECK_READABLE (frame, MERROR_IM, Mnil);
734 key = (*frame->driver->parse_event) (frame, event, &modifiers);
738 name = msymbol_name (key);
739 str = alloca (strlen (name) + 2 * 6 + 1);
741 if (modifiers & MINPUT_KEY_SHIFT_MODIFIER)
743 if (modifiers & MINPUT_KEY_CONTROL_MODIFIER)
745 if (modifiers & MINPUT_KEY_META_MODIFIER)
747 if (modifiers & MINPUT_KEY_ALT_MODIFIER)
749 if (modifiers & MINPUT_KEY_SUPER_MODIFIER)
751 if (modifiers & MINPUT_KEY_HYPER_MODIFIER)
755 return msymbol (str);