diff -Nurw gcin-1.6.4~pre19.orig/eve.cpp gcin-1.6.4~pre19/eve.cpp
--- gcin-1.6.4~pre19.orig/eve.cpp	2011-06-04 02:30:22.000000000 +0800
+++ gcin-1.6.4~pre19/eve.cpp	2011-08-23 09:21:21.190773136 +0800
@@ -3,6 +3,11 @@
 #if UNIX
 #include <signal.h>
 #include <X11/extensions/XTest.h>
+#if !GTK_CHECK_VERSION(2,16,0)
+#include <X11/XKBlib.h>
+#include <gdk/gdkx.h>
+#define gdk_keymap_get_caps_lock_state(x) get_caps_lock_state()
+#endif
 #endif
 #include "gst.h"
 #include "pho.h"
@@ -1054,6 +1059,19 @@
 void create_win_sym(), win_kbm_disp_caplock();
 int gcin_switch_keys_lookup(int key);
 
+#if !GTK_CHECK_VERSION(2,16,0)
+gboolean get_caps_lock_state()
+{
+	XkbStateRec states;
+	
+	if (XkbGetState(GDK_DISPLAY_XDISPLAY(gdk_display_get_default()), XkbUseCoreKbd, &states) == Success)
+	{   
+		if (states.locked_mods & LockMask) return TRUE;
+	}
+	return FALSE;
+}
+#endif
+
 void disp_win_kbm_capslock()
 {
   if (!b_show_win_kbm)
