diff -Nurw vte-0.22.2.orig/src/vte.c vte-0.22.2/src/vte.c
--- vte-0.22.2.orig/src/vte.c	2009-09-29 01:55:06.000000000 +0800
+++ vte-0.22.2/src/vte.c	2010-01-16 10:36:49.748279531 +0800
@@ -4757,6 +4757,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) &&
+			    (! terminal->pvt->alternate_screen_scroll) &&
+			    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:
@@ -4803,17 +4816,6 @@
 
 	modifiers = terminal->pvt->modifiers;
 
-	/* 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;
