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 detail.
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 detail. */
39 @addtogroup m17nInputMethodWin
40 @brief ¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¾å¤ÎÆþÎϥ᥽¥Ã¥É¤Î¥µ¥Ý¡¼¥È
42 ÆþÎϥɥ饤¥Ð @c minput_gui_driver ¤Ï¡¢¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¾å¤ÇÍѤ¤¤é
43 ¤ì¤ëÆâÉôÆþÎϥ᥽¥Ã¥ÉÍѤǤ¢¤ë¡£¤³¤Î¥É¥é¥¤¥Ð¤ÏÆþÎÏ¥¹¥Ý¥Ã¥È¤Ë preedit
44 ¥Æ¥¥¹¥È¤È status ¥Æ¥¥¹¥È¤òɽ¼¨¤¹¤ë¡£¾ÜºÙ¤Ë¤Ä¤¤¤Æ¤Ï @c
45 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 ¤ÎÀâÌÀ¤ò
56 #if !defined (FOR_DOXYGEN) || defined (DOXYGEN_INTERNAL_MODULE)
57 /*** @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 mwin__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 mwin__window_geometry (frame, win_info->focus, win_info->client,
112 &win_ic_info->focus.geometry);
114 win_ic_info->preedit.win = mwin__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 = mwin__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 = mwin__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;
141 mwin__destroy_window (win_ic_info->frame, win_ic_info->preedit.win);
142 mwin__destroy_window (win_ic_info->frame, win_ic_info->status.win);
143 mwin__destroy_window (win_ic_info->frame, win_ic_info->candidates.win);
145 (*minput_default_driver.destroy_ic) (ic);
150 win_filter (MInputContext *ic, MSymbol key, void *arg)
152 MInputGUIContextInfo *win_ic_info = (MInputGUIContextInfo *) ic->info;
153 MInputContextInfo *ic_info = (MInputContextInfo *) win_ic_info->ic_info;
164 key = minput_event_to_key (win_ic_info->frame, arg);
169 ret = (*minput_default_driver.filter) (ic, key, arg);
170 ic->info = win_ic_info;
175 adjust_window_and_draw (MFrame *frame, MInputContext *ic, MText *mt, int type)
177 MInputGUIContextInfo *win_ic_info = (MInputGUIContextInfo *) ic->info;
178 MDrawControl *control;
180 MDrawMetric *geometry, physical, logical;
181 int xoff = win_ic_info->focus.geometry.x;
182 int yoff = win_ic_info->focus.geometry.y;
184 int len = mtext_nchars (mt);
188 win = win_ic_info->preedit.win;
189 control = &win_ic_info->preedit.control;
190 geometry = &win_ic_info->preedit.geometry;
195 win = win_ic_info->status.win;
196 control = &win_ic_info->status.control;
197 geometry = &win_ic_info->status.geometry;
201 win = win_ic_info->candidates.win;
202 control = &win_ic_info->candidates.control;
203 geometry = &win_ic_info->candidates.geometry;
206 mdraw_text_extents (frame, mt, 0, len, control, &physical, &logical, NULL);
207 x0 = physical.x, x1 = x0 + physical.width;
208 y0 = physical.y, y1 = y0 + physical.height;
211 if (x1 < logical.x + logical.width)
212 x1 = logical.x + logical.width;
215 if (y1 < logical.y + logical.height)
216 y1 = logical.y + logical.height;
217 physical.width = x1 - x0;
218 physical.height = y1 - y0;
219 physical.x = xoff + ic->spot.x;
220 if (physical.x + physical.width > win_ic_info->client.geometry.width)
221 physical.x = win_ic_info->client.geometry.width - physical.width;
226 physical.height = physical.width = 1;
227 physical.x = physical.y = -1;
231 if (y0 > - ic->spot.ascent)
233 physical.height += y0 + ic->spot.ascent;
234 y0 = - ic->spot.ascent;
236 if (y1 < ic->spot.descent)
238 physical.height += ic->spot.descent - y1;
240 physical.y = yoff + ic->spot.y + y0;
245 physical.y = yoff + ic->spot.y + ic->spot.descent + 2;
246 if (physical.y + physical.height > win_ic_info->client.geometry.height
247 && yoff + ic->spot.y - ic->spot.ascent - 2 - physical.height >= 0)
248 physical.y = yoff + ic->spot.y - ic->spot.ascent - 2 - physical.height;
252 if (win_ic_info->status.mapped)
254 /* We assume that status is already drawn. */
255 if (win_ic_info->status.geometry.y < yoff + ic->spot.y)
256 /* As there was no lower room for status, candidates must also
258 physical.y = win_ic_info->status.geometry.y - 1 - physical.height;
261 /* There was a lower room for status. */
262 physical.y = (win_ic_info->status.geometry.y
263 + win_ic_info->status.geometry.height
265 if (physical.y + physical.height
266 > win_ic_info->client.geometry.height)
267 /* But not for candidates. */
268 physical.y = (yoff + ic->spot.y - ic->spot.ascent - 1
274 physical.y = yoff + ic->spot.y + ic->spot.descent + 2;
275 if ((physical.y + physical.height
276 > win_ic_info->client.geometry.height)
277 && (yoff + ic->spot.y - ic->spot.ascent - 2 - physical.height
279 physical.y = (yoff + ic->spot.y - ic->spot.ascent - 2
284 mwin__adjust_window (frame, win, geometry, &physical);
285 mdraw_text_with_control (frame, win, -x0, -y0, mt, 0, len, control);
289 win_callback (MInputContext *ic, MSymbol command)
291 MInputGUIContextInfo *win_ic_info = (MInputGUIContextInfo *) ic->info;
292 MFrame *frame = win_ic_info->frame;
294 if (command == Minput_preedit_draw)
297 MFace *face = mface ();
299 if (! win_ic_info->preedit.mapped)
301 mwin__map_window (frame, win_ic_info->preedit.win);
302 win_ic_info->preedit.mapped = 1;
304 win_ic_info->preedit.control.cursor_pos = ic->cursor_pos;
305 if (ic->spot.fontsize)
306 mface_put_prop (face, Msize, (void *) ic->spot.fontsize);
307 mface_merge (face, mface_underline);
308 mtext_push_prop (ic->preedit, 0, mtext_nchars (ic->preedit),
310 M17N_OBJECT_UNREF (face);
311 if (ic->im->language != Mnil)
312 mtext_put_prop (ic->preedit, 0, mtext_nchars (ic->preedit), Mlanguage,
314 if (ic->candidate_list)
315 mtext_push_prop (ic->preedit, ic->candidate_from, ic->candidate_to,
316 Mface, mface_reverse_video);
317 if (mtext_nchars (ic->produced) == 0)
321 mt = mtext_dup (ic->produced);
322 mtext_cat (mt, ic->preedit);
323 win_ic_info->preedit.control.cursor_pos
324 += mtext_nchars (ic->produced);
326 adjust_window_and_draw (frame, ic, mt, 0);
327 if (ic->candidate_list)
328 mtext_pop_prop (ic->preedit, 0, mtext_nchars (ic->preedit), Mface);
329 mtext_pop_prop (ic->preedit, 0, mtext_nchars (ic->preedit), Mface);
330 if (mtext_nchars (ic->produced) != 0)
331 M17N_OBJECT_UNREF (mt);
333 else if (command == Minput_status_draw)
335 if (! win_ic_info->client.win)
337 mtext_put_prop (ic->status, 0, mtext_nchars (ic->status), Mface,
339 if (ic->im->language != Mnil)
340 mtext_put_prop (ic->status, 0, mtext_nchars (ic->status), Mlanguage,
342 adjust_window_and_draw (frame, ic, ic->status, 1);
344 else if (command == Minput_candidates_draw)
351 if (! ic->candidate_list || ! ic->candidate_show)
353 if (win_ic_info->candidates.mapped)
355 mwin__unmap_window (frame, win_ic_info->candidates.win);
356 win_ic_info->candidates.mapped = 0;
361 if (! win_ic_info->candidates.mapped)
363 mwin__map_window (frame, win_ic_info->candidates.win);
364 win_ic_info->candidates.mapped = 1;
368 group = ic->candidate_list;
371 if (mplist_key (group) == Mtext)
372 len = mtext_len (mplist_value (group));
374 len = mplist_length (mplist_value (group));
375 if (i + len > ic->candidate_index)
378 group = mplist_next (group);
382 if (mplist_key (group) == Mtext)
384 MText *candidates = (MText *) mplist_value (group);
386 from = (ic->candidate_index - i) * 2 + 1;
388 for (i = 0; i < len; i++)
390 mtext_cat_char (mt, ' ');
391 mtext_cat_char (mt, mtext_ref_char (candidates, i));
398 for (pl = (MPlist *) mplist_value (group);
399 i < ic->candidate_index && mplist_key (pl) != Mnil;
400 i++, pl = mplist_next (pl))
402 mtext_cat_char (mt, ' ');
403 mtext_cat (mt, (MText *) mplist_value (pl));
405 from = mtext_nchars (mt) + 1;
406 to = from + mtext_nchars ((MText *) mplist_value (pl));
407 for (; mplist_key (pl) != Mnil; pl = mplist_next (pl))
409 mtext_cat_char (mt, ' ');
410 mtext_cat (mt, (MText *) mplist_value (pl));
413 mtext_cat_char (mt, ' ');
414 mtext_push_prop (mt, 0, mtext_nchars (mt), Mface, status_face);
415 mtext_push_prop (mt, from, to, Mface, mface_reverse_video);
416 if (ic->im->language != Mnil)
417 mtext_put_prop (mt, 0, mtext_nchars (mt), Mlanguage, ic->im->language);
418 adjust_window_and_draw (frame, ic, mt, 2);
419 M17N_OBJECT_UNREF (mt);
421 else if (command == Minput_set_spot)
423 minput__callback (ic, Minput_preedit_draw);
424 minput__callback (ic, Minput_status_draw);
425 minput__callback (ic, Minput_candidates_draw);
427 else if (command == Minput_toggle)
431 minput__callback (ic, Minput_preedit_done);
432 minput__callback (ic, Minput_status_done);
433 minput__callback (ic, Minput_candidates_done);
437 minput__callback (ic, Minput_preedit_start);
438 minput__callback (ic, Minput_status_start);
439 minput__callback (ic, Minput_candidates_start);
442 else if (command == Minput_preedit_start)
445 else if (command == Minput_preedit_done)
447 if (win_ic_info->preedit.mapped)
449 mwin__unmap_window (frame, win_ic_info->preedit.win);
450 win_ic_info->preedit.mapped = 0;
453 else if (command == Minput_status_start)
455 if (! win_ic_info->status.mapped)
457 mwin__map_window (frame, win_ic_info->status.win);
458 win_ic_info->status.mapped = 1;
461 else if (command == Minput_status_done)
463 if (win_ic_info->status.mapped)
465 mwin__unmap_window (frame, win_ic_info->status.win);
466 win_ic_info->status.mapped = 0;
469 else if (command == Minput_candidates_start)
471 if (! win_ic_info->candidates.mapped)
473 mwin__map_window (frame, win_ic_info->candidates.win);
474 win_ic_info->candidates.mapped = 1;
477 else if (command == Minput_candidates_done)
479 if (win_ic_info->candidates.mapped)
481 mwin__unmap_window (frame, win_ic_info->candidates.win);
482 win_ic_info->candidates.mapped = 0;
488 win_lookup (MInputContext *ic, MSymbol key, void *arg, MText *mt)
490 MInputGUIContextInfo *win_ic_info = (MInputGUIContextInfo *) ic->info;
491 MInputContextInfo *ic_info = (MInputContextInfo *) win_ic_info->ic_info;
495 ret = (*minput_default_driver.lookup) (ic, key, arg, mt);
496 ic->info = win_ic_info;
505 minput_gui_driver = minput_default_driver;
507 minput_gui_driver.create_ic = win_create_ic;
508 minput_gui_driver.destroy_ic = win_destroy_ic;
509 minput_gui_driver.filter = win_filter;
510 minput_gui_driver.lookup = win_lookup;
512 MPlist *plist = mplist ();
514 minput_gui_driver.callback_list = plist;
515 plist = mplist_add (plist, Minput_preedit_start, (void *) win_callback);
516 plist = mplist_add (plist, Minput_preedit_draw, (void *) win_callback);
517 plist = mplist_add (plist, Minput_preedit_done, (void *) win_callback);
518 plist = mplist_add (plist, Minput_status_start, (void *) win_callback);
519 plist = mplist_add (plist, Minput_status_draw, (void *) win_callback);
520 plist = mplist_add (plist, Minput_status_done, (void *) win_callback);
521 plist = mplist_add (plist, Minput_candidates_start, (void *) win_callback);
522 plist = mplist_add (plist, Minput_candidates_draw, (void *) win_callback);
523 plist = mplist_add (plist, Minput_candidates_done, (void *) win_callback);
524 plist = mplist_add (plist, Minput_set_spot, (void *) win_callback);
525 plist = mplist_add (plist, Minput_toggle, (void *) win_callback);
527 minput_driver = &minput_gui_driver;
529 face_box_prop.width = 1;
530 face_box_prop.color_top = face_box_prop.color_left
531 = face_box_prop.color_bottom = face_box_prop.color_right
533 face_box_prop.inner_hmargin = face_box_prop.inner_vmargin = 2;
534 face_box_prop.outer_hmargin = face_box_prop.outer_vmargin = 1;
535 status_face = mface ();
536 mface_put_prop (status_face, Mbox, &face_box_prop);
544 M17N_OBJECT_UNREF (status_face);
545 if (minput_gui_driver.callback_list)
547 M17N_OBJECT_UNREF (minput_gui_driver.callback_list);
548 minput_gui_driver.callback_list = NULL;
553 #endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
558 /*** @addtogroup m17nInputMethodWin */
563 @brief Input driver for internal input methods on window systems.
565 The input driver @c minput_gui_driver is for internal input
566 methods to be used on window systems.
568 It creates sub-windows for a preedit text and a status text, and
569 displays them at the input spot set by the function
572 The function m17n_initialize_win () set the variable @c
573 minput_driver to the pointer to this driver so that all internal
574 input methods use it.
576 Therefore, unless @c minput_driver is changed from the default,
577 the driver dependent arguments to the functions whose name begin
578 with minput_ must are treated as follows.
580 The argument $ARG of the function minput_open_im () is ignored.
582 The argument $ARG of the function minput_create_ic () must be a
583 pointer to the structure @c MInputGUIArgIC. See the documentation
584 of @c MInputGUIArgIC for more detail.
586 If the argument $KEY is @c Mnil, the argument $ARG of the
587 function minput_filter () must be a pointer to the object of type
588 @c XEvent. In that case, $KEY is generated from $ARG.
590 The argument $ARG of the function minput_lookup () must be the
591 same one as that of the function minput_filter (). */
594 @brief ¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¤ÎÆâÉôÆþÎϥ᥽¥Ã¥ÉÍÑÆþÎϥɥ饤¥Ð.
596 ÆþÎϥɥ饤¥Ð @c minput_gui_driver ¤Ï¡¢¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¾å¤ÇÍѤ¤¤é
597 ¤ì¤ëÆþÎϥ᥽¥Ã¥ÉÍѤǤ¢¤ë¡£
599 ¤³¤Î¥É¥é¥¤¥Ð¤Ï¡¢´Ø¿ô minput_set_spot () ¤Ë¤è¤Ã¤ÆÀßÄꤵ¤ì¤¿ÆþÎÏ¥¹¥Ý¥Ã
600 ¥È¤Ë preedit ¥Æ¥¥¹¥ÈÍѤΥµ¥Ö¥¦¥£¥ó¥É¥¦¤È status ¥Æ¥¥¹¥ÈÍѤΥµ¥Ö
601 ¥¦¥£¥ó¥É¥¦¤òºî¤ê¡¢¤½¤ì¤¾¤ì¤òɽ¼¨¤¹¤ë¡£
603 ´Ø¿ô m17n_initialize_win () ¤ÏÊÑ¿ô @c minput_driver ¤ò¤³¤Î¥É¥é¥¤¥Ð
604 ¤Ø¤Î¥Ý¥¤¥ó¥¿¤ËÀßÄꤷ¡¢Á´¤Æ¤ÎÆâÉôÆþÎϥ᥽¥Ã¥É¤¬¤³¤Î¥É¥é¥¤¥Ð¤ò»È¤¦¤è
607 ¤·¤¿¤¬¤Ã¤Æ¡¢@c minput_driver ¤¬¥Ç¥Õ¥©¥ë¥ÈÃͤΤޤޤǤ¢¤ì¤Ð¡¢minput_
608 ¤Ç»Ï¤Þ¤ë̾Á°¤ò»ý¤Ä´Ø¿ô¤Î°ú¿ô¤Î¤¦¤Á¥É¥é¥¤¥Ð°Í¸¤Î¤â¤Î¤Ï°Ê²¼¤Î¤è¤¦¤Ë
611 ´Ø¿ô minput_open_im () ¤Î°ú¿ô $ARG ¤Ï̵»ë¤µ¤ì¤ë¡£
613 ´Ø¿ô minput_create_ic () ¤Î°ú¿ô $ARG ¤Ï¹½Â¤ÂÎ @c MInputGUIArgIC ¤Ø
614 ¤Î¥Ý¥¤¥ó¥¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¾ÜºÙ¤Ë¤Ä¤¤¤Æ¤Ï @c MInputGUIArgIC ¤Î
617 ´Ø¿ô minput_filter () ¤Î°ú¿ô $ARG ¤¬ @c Mnil ¤Î¾ì¹ç¡¢ $ARG ¤Ï @c
618 XEvent ·¿¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¤³¤Î¾ì¹ç
619 $KEY ¤Ï $ARG ¤«¤éÀ¸À®¤µ¤ì¤ë¡£
621 ´Ø¿ô minput_lookup () ¤Î°ú¿ô $ARG ¤Ï´Ø¿ô minput_filter () ¤Î°ú¿ô
622 $ARG ¤ÈƱ¤¸¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£ */
624 MInputDriver minput_gui_driver;
629 @brief Convert an event to an input key.
631 The minput_event_to_key () function returns the input key
632 corresponding to event $EVENT on $FRAME by a window system
635 In the m17n-X library, $EVENT must be a pointer to the structure
636 @c XKeyEvent, and it is handled as below.
638 At first, the keysym name of $EVENT is acquired by the function @c
639 XKeysymToString. Then, the name is modified as below.
641 If the name is one of "a" .. "z" and $EVENT has a Shift modifier,
642 the name is converted to "A" .. "Z" respectively, and the Shift
645 If the name is one byte length and $EVENT has a Control modifier,
646 the byte is bitwise anded by 0x1F and the Control modifier is
649 If $EVENT still has Shift, Control, Meta, Alt, Super, and/or Hyper
650 modifiers, the name is preceded by "S-", "C-", "M-", "A-", "s-",
651 and/or "H-" respectively in this order.
653 For instance, if the keysym name is "a" and the event has Shift,
654 Meta, and Hyper modifiers, the resulting name is "H-M-A".
656 At last, a symbol who has the name is returned. */
659 @brief ¥¤¥Ù¥ó¥È¤òÆþÎÏ¥¡¼¤ËÊÑ´¹¤¹¤ë
661 ´Ø¿ô minput_name_to_key () ¤Ï¡¢$FRAME ¤Î¥¤¥Ù¥ó¥È $EVENT ¤ËÂбþ¤¹¤ë
662 ÆþÎÏ¥¡¼¤òÊÖ¤¹¡£¤³¤³¤Ç¤Î¡ÖÂбþ¡×¤Ï¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à°Í¸¤Ç¤¢¤ë¡£
664 m17n-X ¥é¥¤¥Ö¥é¥ê¤Î¾ì¹ç¤Ë¤Ï¡¢$EVENT ¤Ï ¹½Â¤ÂÎ @c XKeyEvent ¤Ø¤Î¥Ý
665 ¥¤¥ó¥¿¤Ç¤¢¤ê¡¢¼¡¤Î¤è¤¦¤Ë½èÍý¤µ¤ì¤ë¡£
667 ¤Þ¤º¡¢´Ø¿ô @c XKeysymToString ¤Ë¤è¤Ã¤Æ¡¢$EVENT ¤Î keysym ̾¤ò¼èÆÀ
668 ¤·¡¢¼¡¤¤¤Ç°Ê²¼¤ÎÊѹ¹¤ò²Ã¤¨¤ë¡£
670 ̾Á°¤¬ "a" .. "z" ¤Î¤¤¤º¤ì¤«¤Ç¤¢¤Ã¤Æ $EVENT ¤Ë Shift ¥â¥Ç¥£¥Õ¥¡¥¤
671 ¥¢¤¬¤¢¤ì¤Ð¡¢Ì¾Á°¤Ï¤½¤ì¤¾¤ì "A" .. "Z" ¤ËÊÑ´¹¤µ¤ì¡¢Shift ¥â¥Ç¥£¥Õ¥¡
674 ̾Á°¤¬£±¥Ð¥¤¥ÈĹ¤Ç $EVENT ¤Ë Control ¥â¥Ç¥£¥Õ¥¡¥¤¥¢¤¬¤¢¤ì¤Ð¡¢Ì¾Á°
675 ¤È 0x1F ¤ò¥Ó¥Ã¥Èñ°Ì and ±é»»¤¹¤ë¡£Control ¥â¥Ç¥£¥Õ¥¡¥¤¥¢¤Ï¼è¤ê½ü
678 $EVENT ¤Ë¤Þ¤À Shift, Control, Meta, Alt, Super, Hyper ¤Ê¤É¤Î¥â¥Ç¥£
679 ¥Õ¥¡¥¤¥¢¤¬¤¢¤ì¤Ð¡¢Ì¾Á°¤ÎÁ°¤Ë¤½¤ì¤¾¤ì"S-", "C-", "M-", "A-", "s-",
682 ¤¿¤È¤¨¤Ð¡¢keysym ̾¤¬ "a" ¤Ç¥¤¥Ù¥ó¥È¤¬ Shift, Meta, and Hyper ¥â¥Ç¥£
683 ¥Õ¥¡¥¤¥¢¤ò»ý¤Æ¤Ð¡¢ÆÀ¤é¤ì¤ë̾Á°¤Ï "H-M-A" ¤Ç¤¢¤ë¡£
685 ºÇ¸å¤Ë¤½¤Î̾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤òÊÖ¤¹¡£*/
689 minput_event_to_key (MFrame *frame, void *event)
692 MSymbol key = mwin__parse_event (frame, event, &modifiers);
698 name = msymbol_name (key);
699 str = alloca (strlen (name) + 2 * 6 + 1);
701 if (modifiers & MINPUT_KEY_SHIFT_MODIFIER)
703 if (modifiers & MINPUT_KEY_CONTROL_MODIFIER)
705 if (modifiers & MINPUT_KEY_META_MODIFIER)
707 if (modifiers & MINPUT_KEY_ALT_MODIFIER)
709 if (modifiers & MINPUT_KEY_SUPER_MODIFIER)
711 if (modifiers & MINPUT_KEY_HYPER_MODIFIER)
715 return msymbol (str);