Update copyright years
[m17n/m17n-lib.git] / src / input-gui.c
index b9a32f9..2984381 100644 (file)
@@ -1,5 +1,5 @@
 /* input-gui.c -- gui-based input method module.
-   Copyright (C) 2003, 2004
+   Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
      National Institute of Advanced Industrial Science and Technology (AIST)
      Registration Number H15PRO112
 
@@ -17,7 +17,7 @@
 
    You should have received a copy of the GNU Lesser General Public
    License along with the m17n library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
    02111-1307, USA.  */
 
 /***en
     The input driver @c minput_gui_driver is provided for internal
     input methods that is useful on window systems.  It displays
     preedit text and status text at the inputting spot.  See the
-    documentation of @c minput_gui_driver for more detail.
+    documentation of @c minput_gui_driver for more details.
 
     In the m17n-X library, the foreign input method of name @c Mxim is
     provided.  It uses XIM (X Input Method) as a background input
     engine.  The symbol @c Mxim has a property @c Minput_driver whose
     value is a pointer to the input driver @c minput_xim_driver.  See
-    the documentation of @c minput_xim_driver for more detail.  */
+    the documentation of @c minput_xim_driver for more details.  */
 
 /***ja
     @addtogroup m17nInputMethodWin
-    @brief ¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¾å¤ÎÆþÎϥ᥽¥Ã¥É¤Î¥µ¥Ý¡¼¥È
+    @brief ¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¾å¤ÎÆþÎϥ᥽¥Ã¥É¤Î¥µ¥Ý¡¼¥È.
 
-    ÆþÎϥɥ饤¥Ð @c minput_gui_driver ¤Ï¡¢¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¾å¤ÇÊØÍø¤Ë
-    ÍѤ¤¤é¤ì¤ëÆâÉôÆþÎϥ᥽¥Ã¥É¤Î¤¿¤á¤Î¤â¤Î¤Ç¤¢¤ë¡£¤³¤Î¥É¥é¥¤¥Ð¤ÏÆþÎÏ¥¹
-    ¥Ý¥Ã¥È¤Ë preedit ¥Æ¥­¥¹¥È¤È status ¥Æ¥­¥¹¥È¤òɽ¼¨¤¹¤ë¡£¾ÜºÙ¤Ë¤Ä¤¤
-    ¤Æ¤Ï @c minput_gui_driver ¤Î¥É¥­¥å¥á¥ó¥È¤ò»²¾È¤Î¤³¤È¡£
+    ÆþÎϥɥ饤¥Ð @c minput_gui_driver ¤Ï¡¢
+    ¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¾å¤ÇÍѤ¤¤é¤ì¤ëÆâÉôÆþÎϥ᥽¥Ã¥ÉÍѤΥɥ饤¥Ð¤Ç¤¢¤ë¡£
+    ¤³¤Î¥É¥é¥¤¥Ð¤ÏÆþÎÏ¥¹¥Ý¥Ã¥È¤Ë preedit ¥Æ¥­¥¹¥È¤È status 
+    ¥Æ¥­¥¹¥È¤òɽ¼¨¤¹¤ë¡£¾ÜºÙ¤Ë¤Ä¤¤¤Æ¤Ï @c minput_gui_driver ¤ÎÀâÌÀ¤ò»²¾È¤Î¤³¤È¡£
 
-    m17n-X ¥é¥¤¥Ö¥é¥ê¤Ï¡¢@c Mxim ¤È¸À¤¦Ì¾Á°¤ò»ý¤Ä³°ÉôÆþÎϥ᥽¥Ã¥É¤òÄó
-    ¶¡¤·¤Æ¤¤¤ë¡£¤³¤ì¤Ï XIM (X Input Method) ¤ò¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¤ÎÆþÎÏ¥¨
-    ¥ó¥¸¥ó¤È¤·¤ÆÍøÍѤ¹¤ë¡£¥·¥ó¥Ü¥ë @c Mxim ¤Ï @c Minput_driver ¤È¤¤¤¦
-    ¥×¥í¥Ñ¥Æ¥£¤ò»ý¤Ã¤Æ¤ª¤ê¡¢¤½¤ÎÃͤÏÆþÎϥɥ饤¥Ð @c minput_xim_driver 
-    ¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£ ¾ÜºÙ¤Ë¤Ä¤¤¤Æ¤Ï @c minput_xim_driver ¤Î¥É¥­¥å
-    ¥á¥ó¥È¤ò»²¾È¤Î¤³¤È¡£  */
+    m17n-X ¥é¥¤¥Ö¥é¥ê¤Ï¡¢@c Mxim ¤È¸À¤¦Ì¾Á°¤ò»ý¤Ä³°ÉôÆþÎϥ᥽¥Ã¥É¤òÄ󶡤·¤Æ¤¤¤ë¡£¤³¤ì¤Ï 
+    XIM (X Input Method) ¤ò¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¤ÎÆþÎÏ¥¨¥ó¥¸¥ó¤È¤·¤ÆÍøÍѤ¹¤ë¡£¥·¥ó¥Ü¥ë
+    @c Mxim ¤Ï @c Minput_driver ¤È¤¤¤¦¥×¥í¥Ñ¥Æ¥£¤ò»ý¤Ã¤Æ¤ª¤ê¡¢¤½¤ÎÃͤÏÆþÎϥɥ饤¥Ð 
+    @c minput_xim_driver ¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£ ¾ÜºÙ¤Ë¤Ä¤¤¤Æ¤Ï 
+    @c minput_xim_driver ¤ÎÀâÌÀ¤ò»²¾È¤Î¤³¤È¡£  */
 
 /*=*/
 
@@ -60,6 +59,7 @@
 #include <string.h>
 #include <ctype.h>
 
+#include "config.h"
 #include "m17n-gui.h"
 #include "m17n-misc.h"
 #include "internal.h"
@@ -105,26 +105,26 @@ win_create_ic (MInputContext *ic)
   win_ic_info->ic_info = (MInputContextInfo *) ic->info;
   win_ic_info->frame = frame;
   win_ic_info->client.win = win_info->client;
-  mwin__window_geometry (frame, win_info->client, win_info->client,
+  (*frame->driver->window_geometry) (frame, win_info->client, win_info->client,
                         &win_ic_info->client.geometry);
   win_ic_info->focus.win = win_info->focus;
-  mwin__window_geometry (frame, win_info->focus, win_info->client,
+  (*frame->driver->window_geometry) (frame, win_info->focus, win_info->client,
                         &win_ic_info->focus.geometry);
 
-  win_ic_info->preedit.win = mwin__create_window (frame, win_info->client);
+  win_ic_info->preedit.win = (*frame->driver->create_window) (frame, win_info->client);
   win_ic_info->preedit.control.two_dimensional = 1;
-  win_ic_info->preedit.control.as_image = 1;
+  win_ic_info->preedit.control.as_image = 0;
   win_ic_info->preedit.control.with_cursor = 1;
   win_ic_info->preedit.control.cursor_width = 1;
   win_ic_info->preedit.control.enable_bidi = 1;
   win_ic_info->preedit.geometry.x = -1;
   win_ic_info->preedit.geometry.y = -1;
 
-  win_ic_info->status.win = mwin__create_window (frame, win_info->client);
+  win_ic_info->status.win = (*frame->driver->create_window) (frame, win_info->client);
   win_ic_info->status.control.as_image = 1;
   win_ic_info->status.control.enable_bidi = 1;
 
-  win_ic_info->candidates.win = mwin__create_window (frame, win_info->client);
+  win_ic_info->candidates.win = (*frame->driver->create_window) (frame, win_info->client);
   win_ic_info->candidates.control.as_image = 1;
 
   ic->info = win_ic_info;
@@ -137,10 +137,11 @@ win_destroy_ic (MInputContext *ic)
 {
   MInputGUIContextInfo *win_ic_info = (MInputGUIContextInfo *) ic->info;
   MInputContextInfo *ic_info = (MInputContextInfo *) win_ic_info->ic_info;
+  MFrame *frame = win_ic_info->frame;
 
-  mwin__destroy_window (win_ic_info->frame, win_ic_info->preedit.win);
-  mwin__destroy_window (win_ic_info->frame, win_ic_info->status.win);
-  mwin__destroy_window (win_ic_info->frame, win_ic_info->candidates.win);
+  (*frame->driver->destroy_window) (frame, win_ic_info->preedit.win);
+  (*frame->driver->destroy_window) (frame, win_ic_info->status.win);
+  (*frame->driver->destroy_window) (frame, win_ic_info->candidates.win);
   ic->info = ic_info;
   (*minput_default_driver.destroy_ic) (ic);
   free (win_ic_info);
@@ -157,10 +158,8 @@ win_filter (MInputContext *ic, MSymbol key, void *arg)
       || ! ic->active)
     return 0;
 
-  if (key == Mnil)
+  if (key == Mnil && arg)
     {
-      if (! arg)
-       return 0;
       key = minput_event_to_key (win_ic_info->frame, arg);
       if (key == Mnil)
        return 1;
@@ -281,7 +280,7 @@ adjust_window_and_draw (MFrame *frame, MInputContext *ic, MText *mt, int type)
        }
     }
 
-  mwin__adjust_window (frame, win, geometry, &physical);
+  (*frame->driver->adjust_window) (frame, win, geometry, &physical);
   mdraw_text_with_control (frame, win, -x0, -y0, mt, 0, len, control);
 }
 
@@ -298,7 +297,7 @@ win_callback (MInputContext *ic, MSymbol command)
 
       if (! win_ic_info->preedit.mapped)
        {
-         mwin__map_window (frame, win_ic_info->preedit.win);
+         (*frame->driver->map_window) (frame, win_ic_info->preedit.win);
          win_ic_info->preedit.mapped = 1;
        }
       win_ic_info->preedit.control.cursor_pos = ic->cursor_pos;
@@ -311,7 +310,7 @@ win_callback (MInputContext *ic, MSymbol command)
       if (ic->im->language != Mnil)
        mtext_put_prop (ic->preedit, 0, mtext_nchars (ic->preedit), Mlanguage,
                        ic->im->language);
-      if (ic->candidate_list)
+      if (ic->candidate_list && ic->candidate_show)
        mtext_push_prop (ic->preedit, ic->candidate_from, ic->candidate_to,
                         Mface, mface_reverse_video);
       if (mtext_nchars (ic->produced) == 0)
@@ -352,7 +351,7 @@ win_callback (MInputContext *ic, MSymbol command)
        {
          if (win_ic_info->candidates.mapped)
            {
-             mwin__unmap_window (frame, win_ic_info->candidates.win);
+             (*frame->driver->unmap_window) (frame, win_ic_info->candidates.win);
              win_ic_info->candidates.mapped = 0;
            }
          return;
@@ -360,7 +359,7 @@ win_callback (MInputContext *ic, MSymbol command)
 
       if (! win_ic_info->candidates.mapped)
        {
-         mwin__map_window (frame, win_ic_info->candidates.win);
+         (*frame->driver->map_window) (frame, win_ic_info->candidates.win);
          win_ic_info->candidates.mapped = 1;
        }
 
@@ -420,23 +419,23 @@ win_callback (MInputContext *ic, MSymbol command)
     }
   else if (command == Minput_set_spot)
     {
-      minput__callback (ic, Minput_preedit_draw);
-      minput__callback (ic, Minput_status_draw);
-      minput__callback (ic, Minput_candidates_draw);
+      minput_callback (ic, Minput_preedit_draw);
+      minput_callback (ic, Minput_status_draw);
+      minput_callback (ic, Minput_candidates_draw);
     }
   else if (command == Minput_toggle)
     {
       if (ic->active)
        {
-         minput__callback (ic, Minput_preedit_done);
-         minput__callback (ic, Minput_status_done);
-         minput__callback (ic, Minput_candidates_done);
+         minput_callback (ic, Minput_preedit_done);
+         minput_callback (ic, Minput_status_done);
+         minput_callback (ic, Minput_candidates_done);
        }
       else
        {
-         minput__callback (ic, Minput_preedit_start);
-         minput__callback (ic, Minput_status_start);
-         minput__callback (ic, Minput_candidates_start);
+         minput_callback (ic, Minput_preedit_start);
+         minput_callback (ic, Minput_status_start);
+         minput_callback (ic, Minput_candidates_start);
        }
     }
   else if (command == Minput_preedit_start)
@@ -446,7 +445,7 @@ win_callback (MInputContext *ic, MSymbol command)
     {
       if (win_ic_info->preedit.mapped)
        {
-         mwin__unmap_window (frame, win_ic_info->preedit.win);
+         (*frame->driver->unmap_window) (frame, win_ic_info->preedit.win);
          win_ic_info->preedit.mapped = 0;
        }
     }
@@ -454,7 +453,7 @@ win_callback (MInputContext *ic, MSymbol command)
     {
       if (! win_ic_info->status.mapped)
        {
-         mwin__map_window (frame, win_ic_info->status.win);
+         (*frame->driver->map_window) (frame, win_ic_info->status.win);
          win_ic_info->status.mapped = 1;
        }
     }
@@ -462,7 +461,7 @@ win_callback (MInputContext *ic, MSymbol command)
     {
       if (win_ic_info->status.mapped)
        {
-         mwin__unmap_window (frame, win_ic_info->status.win);
+         (*frame->driver->unmap_window) (frame, win_ic_info->status.win);
          win_ic_info->status.mapped = 0;
        }
     }
@@ -470,7 +469,7 @@ win_callback (MInputContext *ic, MSymbol command)
     {
       if (! win_ic_info->candidates.mapped)
        {
-         mwin__map_window (frame, win_ic_info->candidates.win);
+         (*frame->driver->map_window) (frame, win_ic_info->candidates.win);
          win_ic_info->candidates.mapped = 1;
        }
     }
@@ -478,10 +477,32 @@ win_callback (MInputContext *ic, MSymbol command)
     {
       if (win_ic_info->candidates.mapped)
        {
-         mwin__unmap_window (frame, win_ic_info->candidates.win);
+         (*frame->driver->unmap_window) (frame, win_ic_info->candidates.win);
          win_ic_info->candidates.mapped = 0;
        }
     }
+  else if (command == Minput_reset)
+    {
+      MInputCallbackFunc func;
+
+      if (minput_default_driver.callback_list
+         && (func = ((MInputCallbackFunc)
+                     mplist_get_func (minput_default_driver.callback_list,
+                                      Minput_reset))))
+       {
+         MInputContextInfo *ic_info
+           = (MInputContextInfo *) win_ic_info->ic_info;
+         ic->info = ic_info;
+         (func) (ic, Minput_reset);
+         ic->info = win_ic_info;
+       }
+      if (ic->preedit_changed)
+       minput_callback (ic, Minput_preedit_draw);
+      if (ic->status_changed)
+       minput_callback (ic, Minput_status_draw);
+      if (ic->candidates_changed)
+       minput_callback (ic, Minput_candidates_draw);
+    }
 }
 
 static int
@@ -512,19 +533,23 @@ minput__win_init ()
     MPlist *plist = mplist ();
 
     minput_gui_driver.callback_list = plist;
-    plist = mplist_add (plist, Minput_preedit_start, (void *) win_callback);
-    plist = mplist_add (plist, Minput_preedit_draw, (void *) win_callback);
-    plist = mplist_add (plist, Minput_preedit_done, (void *) win_callback);
-    plist = mplist_add (plist, Minput_status_start, (void *) win_callback);
-    plist = mplist_add (plist, Minput_status_draw, (void *) win_callback);
-    plist = mplist_add (plist, Minput_status_done, (void *) win_callback);
-    plist = mplist_add (plist, Minput_candidates_start, (void *) win_callback);
-    plist = mplist_add (plist, Minput_candidates_draw, (void *) win_callback);
-    plist = mplist_add (plist, Minput_candidates_done, (void *) win_callback);
-    plist = mplist_add (plist, Minput_set_spot, (void *) win_callback);
-    plist = mplist_add (plist, Minput_toggle, (void *) win_callback);
+    mplist_put_func (plist, Minput_preedit_start, M17N_FUNC (win_callback));
+    mplist_put_func (plist, Minput_preedit_draw, M17N_FUNC (win_callback));
+    mplist_put_func (plist, Minput_preedit_done, M17N_FUNC (win_callback));
+    mplist_put_func (plist, Minput_status_start, M17N_FUNC (win_callback));
+    mplist_put_func (plist, Minput_status_draw, M17N_FUNC (win_callback));
+    mplist_put_func (plist, Minput_status_done, M17N_FUNC (win_callback));
+    mplist_put_func (plist, Minput_candidates_start, M17N_FUNC (win_callback));
+    mplist_put_func (plist, Minput_candidates_draw, M17N_FUNC (win_callback));
+    mplist_put_func (plist, Minput_candidates_done, M17N_FUNC (win_callback));
+    mplist_put_func (plist, Minput_set_spot, M17N_FUNC (win_callback));
+    mplist_put_func (plist, Minput_toggle, M17N_FUNC (win_callback));
+    mplist_put_func (plist, Minput_reset, M17N_FUNC (win_callback));
   }
+#if 0
+  /* This will make the caller of minput_method_open() pazzled.  */
   minput_driver = &minput_gui_driver;
+#endif
 
   face_box_prop.width = 1;
   face_box_prop.color_top = face_box_prop.color_left
@@ -569,9 +594,8 @@ minput__win_fini ()
     displays them at the input spot set by the function
     minput_set_spot ().
 
-    The function m17n_initialize_win () set the variable @c
-    minput_driver to the pointer to this driver so that all internal
-    input methods use it.
+    The macro M17N_INIT () set the variable @c minput_driver to the
+    pointer to this driver so that all internal input methods use it.
 
     Therefore, unless @c minput_driver is changed from the default,
     the driver dependent arguments to the functions whose name begin
@@ -581,44 +605,42 @@ minput__win_fini ()
 
     The argument $ARG of the function minput_create_ic () must be a
     pointer to the structure @c MInputGUIArgIC.  See the documentation
-    of @c MInputGUIArgIC for more detail.
+    of @c MInputGUIArgIC for more details.
 
-    If the argument $KEY is @c Mnil, the argument $ARG of the
-    function minput_filter () must be a pointer to the object of type
-    @c XEvent.  In that case, $KEY is generated from $ARG.
+    If the argument $KEY of function minput_filter () is @c Mnil, the
+    argument $ARG must be a pointer to the object of type @c XEvent.
+    In that case, $KEY is generated from $ARG.
 
     The argument $ARG of the function minput_lookup () must be the
     same one as that of the function minput_filter (). */
 
 /***ja
-    @brief ¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¤ÎÆâÉôÆþÎϥ᥽¥Ã¥ÉÍÑÆþÎϥɥ饤¥Ð
+    @brief ¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¤ÎÆâÉôÆþÎϥ᥽¥Ã¥ÉÍÑÆþÎϥɥ饤¥Ð.
 
-    ÆþÎϥɥ饤¥Ð @c minput_gui_driver ¤Ï¡¢¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¾å¤ÇÍѤ¤¤é
-    ¤ì¤ëÆþÎϥ᥽¥Ã¥ÉÍѤΤâ¤Î¤Ç¤¢¤ë¡£
+    ÆþÎϥɥ饤¥Ð @c minput_gui_driver
+    ¤Ï¡¢¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¾å¤ÇÍѤ¤¤é¤ì¤ëÆþÎϥ᥽¥Ã¥ÉÍѥɥ饤¥Ð¤Ç¤¢¤ë¡£
 
-    ¤³¤Î¥É¥é¥¤¥Ð¤Ï¡¢´Ø¿ô minput_set_spot () ¤Ë¤è¤Ã¤ÆÀßÄꤵ¤ì¤¿ÆþÎÏ¥¹¥Ý¥Ã
-    ¥È¤Ë preedit ¥Æ¥­¥¹¥ÈÍѤΥµ¥Ö¥¦¥£¥ó¥É¥¦¤È status ¥Æ¥­¥¹¥ÈÍѤΥµ¥Ö
-    ¥¦¥£¥ó¥É¥¦¤òºî¤ê¡¢¤½¤ì¤¾¤ì¤òɽ¼¨¤¹¤ë¡£
+    ¤³¤Î¥É¥é¥¤¥Ð¤Ï¡¢´Ø¿ô minput_set_spot () ¤Ë¤è¤Ã¤ÆÀßÄꤵ¤ì¤¿ÆþÎÏ¥¹¥Ý¥Ã¥È¤Ë
+    preedit ¥Æ¥­¥¹¥ÈÍѤΥµ¥Ö¥¦¥£¥ó¥É¥¦¤È status 
+    ¥Æ¥­¥¹¥ÈÍѤΥµ¥Ö¥¦¥£¥ó¥É¥¦¤òºî¤ê¡¢¤½¤ì¤¾¤ì¤òɽ¼¨¤¹¤ë¡£
 
-    ´Ø¿ô m17n_initialize_win () ¤ÏÊÑ¿ô @c minput_driver ¤ò¤³¤Î¥É¥é¥¤¥Ð
-    ¤Ø¤Î¥Ý¥¤¥ó¥¿¤ËÀßÄꤷ¡¢Á´¤Æ¤ÎÆâÉôÆþÎϥ᥽¥Ã¥É¤¬¤³¤Î¥É¥é¥¤¥Ð¤ò»È¤¦¤è
-    ¤¦¤Ë¤¹¤ë¡£
+    ¥Þ¥¯¥í M17N_INIT () ¤ÏÊÑ¿ô @c minput_driver 
+    ¤ò¤³¤Î¥É¥é¥¤¥Ð¤Ø¤Î¥Ý¥¤¥ó¥¿¤ËÀßÄꤷ¡¢Á´¤Æ¤ÎÆâÉôÆþÎϥ᥽¥Ã¥É¤¬¤³¤Î¥É¥é¥¤¥Ð¤ò»È¤¦¤è¤¦¤Ë¤¹¤ë¡£
 
     ¤·¤¿¤¬¤Ã¤Æ¡¢@c minput_driver ¤¬¥Ç¥Õ¥©¥ë¥ÈÃͤΤޤޤǤ¢¤ì¤Ð¡¢minput_ 
-    ¤Ç»Ï¤Þ¤ë̾Á°¤ò»ý¤Ä°Ê²¼¤Î´Ø¿ô·²¤Î¥É¥é¥¤¥Ð¤Ë°Í¸¤¹¤ë°ú¿ô¤Ï¼¡¤Î¤è¤¦¤Ë
-    ¤Ê¤ë¡£
+    ¤Ç»Ï¤Þ¤ë̾Á°¤ò»ý¤Ä´Ø¿ô¤Î°ú¿ô¤Î¤¦¤Á¥É¥é¥¤¥Ð°Í¸¤Î¤â¤Î¤Ï°Ê²¼¤Î¤è¤¦¤Ë¤Ê¤ë¡£
 
     ´Ø¿ô minput_open_im () ¤Î°ú¿ô $ARG ¤Ï̵»ë¤µ¤ì¤ë¡£
 
-    ´Ø¿ô minput_create_ic () ¤Î°ú¿ô $ARG ¤Ï¹½Â¤ÂΠ@c MInputGUIArgIC ¤Ø
-    ¤Î¥Ý¥¤¥ó¥¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¾ÜºÙ¤Ë¤Ä¤¤¤Æ¤Ï @c MInputGUIArgIC ¤Î
-    ¥É¥­¥å¥á¥ó¥È¤ò»²¾È¤Î¤³¤È¡£
+    ´Ø¿ô minput_create_ic () ¤Î°ú¿ô $ARG ¤Ï¹½Â¤ÂΠ@c MInputGUIArgIC 
+    ¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¾ÜºÙ¤Ë¤Ä¤¤¤Æ¤Ï @c MInputGUIArgIC 
+    ¤ÎÀâÌÀ¤ò»²¾È¤Î¤³¤È¡£
 
-    ´Ø¿ô minput_filter () ¤Î°ú¿ô $ARG ¤¬ @c Mnil ¤Î¾ì¹ç¡¢ $ARG ¤Ï 
-    XEvent ·¿¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¤³¤Î¾ì¹ç $KEY 
-    ¤Ï $ARG ¤«¤éÀ¸À®¤µ¤ì¤ë¡£
+    ´Ø¿ô minput_filter () ¤Î°ú¿ô $ARG ¤¬ @c Mnil ¤Î¾ì¹ç¡¢ $ARG ¤Ï @c
+    XEvent ·¿¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¤³¤Î¾ì¹ç 
+    $KEY ¤Ï $ARG ¤«¤éÀ¸À®¤µ¤ì¤ë¡£
 
-    ´Ø¿ô minput_lookup () ¤Î°ú¿ô $ARG ¤Ï´Ø¿ô minput_filter () °ú¿ô 
+    ´Ø¿ô minput_lookup () ¤Î°ú¿ô $ARG ¤Ï´Ø¿ô minput_filter () ¤Î°ú¿ô 
     $ARG ¤ÈƱ¤¸¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£ */
 
 MInputDriver minput_gui_driver;
@@ -626,19 +648,32 @@ MInputDriver minput_gui_driver;
 /*=*/
 
 /***en
+    @brief Symbol of the name "xim".
+
+    The variable Mxim is a symbol of name "xim".  It is a name of the
+    input method driver #minput_xim_driver.  */ 
+/***ja
+    @brief "xim"¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë .
+
+    ÊÑ¿ô Mxim ¤Ï"xim"¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£"xim" 
+    ¤ÏÆþÎϥ᥽¥Ã¥É¥É¥é¥¤¥Ð #minput_xim_driver ¤Î̾Á°¤Ç¤¢¤ë¡£  */ 
+
+MSymbol Mxim;
+
+/*=*/
+
+/***en
     @brief Convert an event to an input key.
 
     The minput_event_to_key () function returns the input key
     corresponding to event $EVENT on $FRAME by a window system
     dependent manner.
 
-    In the m17n-X library, $EVENT must be a pointer to the struct @c
-    XKeyEvent, and it is handled as below.
+    In the m17n-X library, $EVENT must be a pointer to the structure
+    @c XKeyEvent, and it is handled as below.
 
     At first, the keysym name of $EVENT is acquired by the function @c
-    XKeysymToString.
-
-    Then, the name is modified as below.
+    XKeysymToString.  Then, the name is modified as below.
 
     If the name is one of "a" .. "z" and $EVENT has a Shift modifier,
     the name is converted to "A" .. "Z" respectively, and the Shift
@@ -648,70 +683,58 @@ MInputDriver minput_gui_driver;
     the byte is bitwise anded by 0x1F and the Control modifier is
     cleared.
 
-    If $EVENT still has Shift, Control, Meta, Alt, Super, and/or Hyper
-    modifiers, the name is prepended by "S-", "C-", "M-", "A-", "s-",
-    and/or "H-" respectively in this order.
+    If $EVENT still has modifiers, the name is preceded by "S-"
+    (Shift), "C-" (Control), "M-" (Meta), "A-" (Alt), "G-" (AltGr),
+    "s-" (Super), and "H-" (Hyper) in this order.
 
     For instance, if the keysym name is "a" and the event has Shift,
-    Meta, and Hyper modifiers, the resulting name is "H-M-A".
+    Meta, and Hyper modifiers, the resulting name is "M-H-A".
 
     At last, a symbol who has the name is returned.  */
 
 /***ja
-    @brief ¥­¡¼Ì¾¾Î¤òÆþÎÏ¥­¡¼¤ËÊÑ´¹¤¹¤ë
-
-    ´Ø¿ô minput_name_to_key () ¤Ï¡¢Ì¾Á° $NAME ¤ËÂбþ¤¹¤ëÆþÎÏ¥­¡¼¤òÊÖ¤¹¡£
-
-    $NAME ¤Ï¼¡¤Î·Á¤ò¤È¤ë¡£
-
-       [ MODIFIER-MNEMONIC '-' ] * KEY-NAME
-
-    ¤³¤³¤Ç MODIFIER-MNEMONIC ¤Ï 'S', 'C', 'M', 'A', 's', 'H' ¤Î¤¤¤º¤ì
-    ¤«¤Ç¤¢¤ê¡¢¤½¤ì¤¾¤ì Shift, Control, Meta, Alt, Super, Hyper ¤Î³Æ¥â
-    ¥Ç¥£¥Õ¥¡¥¤¥¢¤ò¼¨¤¹¡£KEY-NAME ¤ÏÆþÎÏ¥­¡¼¤Î¥·¥ó¥Ü¥ê¥Ã¥¯¤Ê̾Á°¤òɽ¤¹Ê¸»úÎó¡£
-
-    ÆþÎÏ¥­¡¼¤Î²¼ 16 ¥Ó¥Ã¥È¤Ï "keysym bits" ¤È¤è¤Ð¤ì¡¢KEY-NAME ¤ËÂбþ¤¹
-    ¤ë¥³¡¼¥É¤òɽ¤¹¡£¾å7 bits (¤Ä¤Þ¤ê 17 ¥Ó¥Ã¥ÈÌܤ«¤é 23 ¥Ó¥Ã¥ÈÌܤޤÇ) 
-    ¤Ï"modifier bits" ¤È¸Æ¤Ð¤ì¡¢MODIFIER-MNEMONIC ¤òɽ¸½¤·¤Æ¤¤¤ë¡£
+    @brief ¥¤¥Ù¥ó¥È¤òÆþÎÏ¥­¡¼¤ËÊÑ´¹¤¹¤ë.
 
-    KEY-NAME ¤¬ 1 ¥Ð¥¤¥ÈŤǤ¢¤ë¾ì¹ç¡¢ÆþÎÏ¥­¡¼¤Ï¼¡¤Î¤è¤¦¤Ë¹½À®¤µ¤ì¤ë¡£
+    ´Ø¿ô minput_event_to_key () ¤Ï¡¢$FRAME ¤Î¥¤¥Ù¥ó¥È $EVENT 
+    ¤ËÂбþ¤¹¤ëÆþÎÏ¥­¡¼¤òÊÖ¤¹¡£¤³¤³¤Ç¤Î¡ÖÂбþ¡×¤Ï¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¤Ë°Í¸¤¹¤ë¡£
 
-    ¤Þ¤º¡¢keysym bits ¤Ë¤Ï¤½¤Î¥Ð¥¤¥È¥³¡¼¥É¤½¤Î¤â¤Î¤¬ÀßÄꤵ¤ì¤ë¡£
+    m17n-X ¥é¥¤¥Ö¥é¥ê¤Î¾ì¹ç¤Ë¤Ï¡¢$EVENT ¤Ï ¹½Â¤ÂΠ@c XKeyEvent 
+    ¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢¤ê¡¢¼¡¤Î¤è¤¦¤Ë½èÍý¤µ¤ì¤ë¡£
 
-    ¼¡¤¤¤Ç¡¢Shift, Control, Meta ¤Î³Æ¥â¥Ç¥£¥Õ¥¡¥¤¥¢¤Ï°Ê²¼¤Î¼ê³¤­¤Ç
-    keysym bits ¤ËÈ¿±Ç¤µ¤ì¤ë¡£
+    ¤Þ¤º¡¢´Ø¿ô @c XKeysymToString ¤Ë¤è¤Ã¤Æ¡¢$EVENT ¤Î keysym 
+    Ì¾¤ò¼èÆÀ¤·¡¢¼¡¤¤¤Ç°Ê²¼¤ÎÊѹ¹¤ò²Ã¤¨¤ë¡£
 
-    (1) Shift ¥â¥Ç¥£¥Õ¥¡¥¤¥¢¤¬¤¢¤ê¡¢keysym bits ¤¬¾®Ê¸»ú¤Ç¤¢¤ì¤Ð(¤Ä¤Þ
-    ¤ê 'a' ¤«¤é 'z' ¤Ç¤¢¤ì¤Ð), Âçʸ»ú (¤Ä¤Þ¤ê 'A' through 'Z') ¤ËÊÑ´¹
-    ¤µ¤ì¤ë¡£Shift ¥â¥Ç¥£¥Õ¥¡¥¤¥¢¤Ï modifier bits ¤«¤é¼è¤ê½ü¤«¤ì¤ë¡£
+    Ì¾Á°¤¬ "a" .. "z" ¤Î¤¤¤º¤ì¤«¤Ç¤¢¤Ã¤Æ $EVENT ¤Ë Shift 
+    ¥â¥Ç¥£¥Õ¥¡¥¤¥¢¤¬¤¢¤ì¤Ð¡¢Ì¾Á°¤Ï¤½¤ì¤¾¤ì "A" .. "Z" ¤ËÊÑ´¹¤µ¤ì¡¢Shift 
+    ¥â¥Ç¥£¥Õ¥¡¥¤¥¢¤Ï¼è¤ê½ü¤«¤ì¤ë¡£
 
-    (2) Control ¥â¥Ç¥£¥Õ¥¡¥¤¥¢¤¬¤¢¤ì¤Ð, keysym bits ¤Ï¥Ó¥Ã¥Èñ°Ì¤Ç 
-    0x1F ¤È and ±é»»¤ò¹Ô¤¦¡£Control ¥â¥Ç¥£¥Õ¥¡¥¤¥¢¤Ï modifier bits 
-    ¤«¤é¼è¤ê½ü¤«¤ì¤ë¡£
+    Ì¾Á°¤¬£±¥Ð¥¤¥ÈŤǠ$EVENT ¤Ë Control ¥â¥Ç¥£¥Õ¥¡¥¤¥¢¤¬¤¢¤ì¤Ð¡¢Ì¾Á°¤È
+    0x1F ¤È¤ò¥Ó¥Ã¥Èñ°Ì¤Ç and ±é»»¤·¡¢Control ¥â¥Ç¥£¥Õ¥¡¥¤¥¢¤Ï¼è¤ê½ü¤«¤ì¤ë¡£
 
-    (3) Meta ¥â¥Ç¥£¥Õ¥¡¥¤¥¢¤¬¤¢¤ì¤Ð, keysym bits ¤Ï¥Ó¥Ã¥Èñ°Ì¤Ç 0x80 
-    ¤È or ±é»»¤ò¹Ô¤¦¡£ Meta ¥â¥Ç¥£¥Õ¥¡¥¤¥¢¤Ï modifier bits ¤«¤é¼è¤ê½ü
-    ¤«¤ì¤ë¡£
+    ¤½¤ì¤Ç¤â $EVENT ¤Ë¤Þ¤À¥â¥Ç¥£¥Õ¥¡¥¤¥¢¤¬¤¢¤ì¤Ð¡¢Ì¾Á°¤ÎÁ°¤Ë¤½¤ì¤¾¤ì
+    "S-" (Shift), "C-" (Control), "M-" (Meta), "A-" (Alt), , "G-" (AltGr),
+    "s-" (Super), "H-" (Hyper)¤¬¤³¤Î½çÈÖ¤ÇÉÕ¤¯¡£
+    
+    ¤¿¤È¤¨¤Ð¡¢keysym Ì¾¤¬ "a" ¤Ç¥¤¥Ù¥ó¥È¤¬ Shift, Meta, and Hyper 
+    ¥â¥Ç¥£¥Õ¥¡¥¤¥¢¤ò»ý¤Æ¤Ð¡¢ÆÀ¤é¤ì¤ë̾Á°¤Ï "M-H-A" ¤Ç¤¢¤ë¡£
 
-    ¤¿¤È¤¨¤Ð¡¢"S-a" ¤È "A" ¤Ï¤É¤Á¤é¤â 65 ¤ò¡¢"C-a" ¤È "C-A" ¤Ï¤É¤Á¤é¤â
-    1 ¤òÊÖ¤·¡¢"M-a" ¤Ï 225 ¤ò, "C-M-a" ¤Ï 129 ¤òÊÖ¤¹¡£
+    ºÇ¸å¤Ë¤½¤Î̾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤òÊÖ¤¹¡£*/
 
-    KEY-NAME ¤¬ 2 ¥Ð¥¤¥È°Ê¾å¤Ç¤¢¤ë»þ¤Ë¤Ï¡¢Âбþ¤¹¤ëkeysym bits ¤Ï@c
-    m17n @c ¥é¥¤¥Ö¥é¥ê ÆâÉô¤Î¥Æ¡¼¥Ö¥ë¤Ë¤è¤Ã¤ÆÆÀ¤ë»ö¤¬¤Ç¤­¤ë¡£¤³¤Î¤È¤­
-    ¥Æ¡¼¥Ö¥ë¤Ë KEY-NAME ¤¬¤Ê¤±¤ì¤Ð¡¢¤³¤Î´Ø¿ô¤Ï -1 ¤òÊÖ¤¹¡£  */
 
 MSymbol
 minput_event_to_key (MFrame *frame, void *event)
 {
   int modifiers;
-  MSymbol key = mwin__parse_event (frame, event, &modifiers);
+  MSymbol key;
   char *name, *str;
 
+  M_CHECK_READABLE (frame, MERROR_IM, Mnil);
+  key = (*frame->driver->parse_event) (frame, event, &modifiers);
   if (! modifiers)
     return key;
 
   name = msymbol_name (key);
-  str = alloca (strlen (name) + 2 * 6 + 1);
+  str = alloca (strlen (name) + 2 * 8 + 1);
   str[0] = '\0';
   if (modifiers & MINPUT_KEY_SHIFT_MODIFIER)
     strcat (str, "S-");
@@ -721,6 +744,8 @@ minput_event_to_key (MFrame *frame, void *event)
     strcat (str, "M-");
   if (modifiers & MINPUT_KEY_ALT_MODIFIER)
     strcat (str, "A-");
+  if (modifiers & MINPUT_KEY_ALTGR_MODIFIER)
+    strcat (str, "G-");
   if (modifiers & MINPUT_KEY_SUPER_MODIFIER)
     strcat (str, "s-");
   if (modifiers & MINPUT_KEY_HYPER_MODIFIER)