diff -uNr vte-0.16.13.orig/src/vte.c vte-0.16.13/src/vte.c
--- vte-0.16.13.orig/src/vte.c	2008-02-09 03:46:11.000000000 +0800
+++ vte-0.16.13/src/vte.c	2008-03-13 16:08:18.000000000 +0800
@@ -4250,6 +4250,19 @@
 
 		/* We steal many keypad keys here. */
 		if (!terminal->pvt->im_preedit_active) {
+
+			/* FIX: Many input methods, like gcin, xcin, and oxim, */
+			/*      uses GDK_MOD1 as function key,                 */
+			/*      libvte should not steal GDK_MOD1 here.         */
+			/* Let the input method at this one first.             */
+			if (GTK_WIDGET_REALIZED(terminal) &&
+			    gtk_im_context_filter_keypress(terminal->pvt->im_context,
+							   event)) {
+				_vte_debug_print(VTE_DEBUG_EVENTS,
+						 "Keypress taken by IM.\n");
+				return TRUE;
+			}
+
 			switch (keyval) {
 			case GDK_KP_Add:
 			case GDK_KP_Subtract:
@@ -4294,17 +4307,6 @@
 		}
 	}
 
-	/* Let the input method at this one first. */
-	if (!steal) {
-		if (GTK_WIDGET_REALIZED(terminal) &&
-		    gtk_im_context_filter_keypress(terminal->pvt->im_context,
-						   event)) {
-			_vte_debug_print(VTE_DEBUG_EVENTS,
-					"Keypress taken by IM.\n");
-			return TRUE;
-		}
-	}
-
 	/* Now figure out what to send to the child. */
 	if ((event->type == GDK_KEY_PRESS) && !modifier) {
 		handled = FALSE;
