diff --git a/configure.ac b/configure.ac
index a285324..b7d7f3b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -106,12 +106,16 @@ PKG_CHECK_MODULES(ANTHY,[anthy >= $ANTHY_VERSION])
 
 # Check gtk2
 PKG_CHECK_MODULES(GTK2, [gtk+-2.0 >= 2.8.0],
-                        [HAS_GTK=yes],
-                        [HAS_GTK=no])
+                        [HAS_GTK2=yes],
+                        [HAS_GTK2=no])
 
-AM_CONDITIONAL(SCIM_BUILD_HELPER, [test "$HAS_GTK" = "yes"])
+PKG_CHECK_MODULES(GTK3, [gtk+-3.0 >= 3.0.0],
+                        [HAS_GTK3=yes],
+                        [HAS_GTK3=no])
 
-if test "$HAS_GTK" = "yes"; then
+AM_CONDITIONAL(SCIM_BUILD_HELPER, [test "$HAS_GTK2" = "yes" -o "$HAS_GTK3" = "yes"])
+
+if test "$HAS_GTK2" = "yes" -o "$HAS_GTK3" = "yes"; then
   SCIM_BUILD_HELPER=1
 else
   SCIM_BUILD_HELPER=0
@@ -133,6 +137,61 @@ AC_ARG_ENABLE(debug,
 	       *) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;;
        	      esac],[debug=no])
 
+#AC_ARG_WITH([gtk-version],
+#    [AS_HELP_STRING([--with-gtk-version=2 or 3],
+#        [Select gtk version if both gtk2 and gtk3 are available (default is 3)]),
+#	[WANT_GTK_VERSION=$withval],
+#    [WANT_GTK_VERSION=3])
+
+AC_ARG_WITH([gtk-version],
+    [--with-gtk-version=2 or 3		Select gtk version if both gtk2 and gtk3 are available (default is 3)],
+	[WANT_GTK_VERSION=$withval],
+    [WANT_GTK_VERSION=3])
+
+if test "$HAS_GTK3" = "yes" -a "$HAS_GTK2" = "yes"; then
+  if test "$WANT_GTK_VERSION" = "2"; then
+    USE_GTK_VERSION="2"
+  else
+    USE_GTK_VERSION="3"
+  fi
+elif test "$HAS_GTK3" = "yes"; then
+  USE_GTK_VERSION="3"
+elif test "$HAS_GTK2" = "yes"; then
+  USE_GTK_VERSION="2"
+fi
+
+if test "$USE_GTK_VERSION" = "3"; then
+  HAS_GTK=yes
+  GTK_LIBDIR=$GTK3_LIBDIR
+  GTK_VERSION=$GTK3_VERSION
+  GTK_MAJOR_VERSION=3
+  GTK_BINARY_VERSION=$GTK3_BINARY_VERSION
+  GTK_CFLAGS=$GTK3_CFLAGS
+  GTK_LIBS=$GTK3_LIBS
+  AC_SUBST(GTK_LIBDIR)
+  AC_SUBST(GTK_VERSION)
+  AC_SUBST(GTK_MAJOR_VERSION)
+  AC_SUBST(GTK_BINARY_VERSION)
+  AC_SUBST(GTK_CFLAGS)
+  AC_SUBST(GTK_LIBS)
+elif test "$USE_GTK_VERSION" = "2"; then
+  HAS_GTK=yes
+  GTK_LIBDIR=$GTK2_LIBDIR
+  GTK_VERSION=$GTK2_VERSION
+  GTK_MAJOR_VERSION=2
+  GTK_BINARY_VERSION=$GTK2_BINARY_VERSION
+  GTK_CFLAGS=$GTK2_CFLAGS
+  GTK_LIBS=$GTK2_LIBS
+  AC_SUBST(GTK_LIBDIR)
+  AC_SUBST(GTK_VERSION)
+  AC_SUBST(GTK_MAJOR_VERSION)
+  AC_SUBST(GTK_BINARY_VERSION)
+  AC_SUBST(GTK_CFLAGS)
+  AC_SUBST(GTK_LIBS)
+else
+  HAS_GTK=no
+fi
+
 if test "x$debug" = "xyes"; then
   test "$cflags_set" = set || CFLAGS="$CFLAGS -g"
   test "$cppflags_set" = set || CPPFLAGS="$CXXFLAGS -g"
diff --git a/po/de.po b/po/de.po
index 4607462..ef07d27 100644
--- a/po/de.po
+++ b/po/de.po
@@ -8,10 +8,11 @@ msgid ""
 msgstr ""
 "Project-Id-Version: de\n"
 "Report-Msgid-Bugs-To: ashie@homa.ne.jp\n"
-"POT-Creation-Date: 2008-03-28 21:54+0900\n"
+"POT-Creation-Date: 2012-07-01 19:38+0800\n"
 "PO-Revision-Date: 2007-07-03 20:23+0200\n"
 "Last-Translator: Gerrit Sangel <z0idberg@gmx.de>\n"
 "Language-Team: German <de@li.org>\n"
+"Language: de\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -28,23 +29,23 @@ msgid "Input mode"
 msgstr "Eingabemodus"
 
 #: src/scim_anthy_imengine.cpp:613 src/scim_anthy_imengine.cpp:802
-#: src/scim_anthy_setup.cpp:204
+#: src/scim_anthy_setup.cpp:207
 msgid "Hiragana"
 msgstr "Hiragana"
 
 #: src/scim_anthy_imengine.cpp:617 src/scim_anthy_imengine.cpp:806
-#: src/scim_anthy_setup.cpp:205
+#: src/scim_anthy_setup.cpp:208
 msgid "Katakana"
 msgstr "Katakana"
 
 #: src/scim_anthy_imengine.cpp:621 src/scim_anthy_imengine.cpp:622
 #: src/scim_anthy_imengine.cpp:810 src/scim_anthy_imengine.cpp:811
-#: src/scim_anthy_setup.cpp:206
+#: src/scim_anthy_setup.cpp:209
 msgid "Half width katakana"
 msgstr "Halbbreite Katakana"
 
 #: src/scim_anthy_imengine.cpp:626 src/scim_anthy_imengine.cpp:815
-#: src/scim_anthy_setup.cpp:207
+#: src/scim_anthy_setup.cpp:210
 msgid "Latin"
 msgstr "Latein"
 
@@ -53,7 +54,7 @@ msgid "Direct input"
 msgstr "Direkteingabe"
 
 #: src/scim_anthy_imengine.cpp:630 src/scim_anthy_imengine.cpp:819
-#: src/scim_anthy_setup.cpp:208
+#: src/scim_anthy_setup.cpp:211
 msgid "Wide latin"
 msgstr "Breites Latein"
 
@@ -80,25 +81,25 @@ msgstr "Konvertierungsmethode"
 
 #: src/scim_anthy_imengine.cpp:659 src/scim_anthy_imengine.cpp:660
 #: src/scim_anthy_imengine.cpp:846 src/scim_anthy_imengine.cpp:847
-#: src/scim_anthy_setup.cpp:222
+#: src/scim_anthy_setup.cpp:225
 msgid "Multi segment"
 msgstr "Mehrfachsegment"
 
 #: src/scim_anthy_imengine.cpp:664 src/scim_anthy_imengine.cpp:665
 #: src/scim_anthy_imengine.cpp:851 src/scim_anthy_imengine.cpp:852
-#: src/scim_anthy_setup.cpp:223
+#: src/scim_anthy_setup.cpp:226
 msgid "Single segment"
 msgstr "Einzelsegment"
 
 #: src/scim_anthy_imengine.cpp:669 src/scim_anthy_imengine.cpp:671
 #: src/scim_anthy_imengine.cpp:856 src/scim_anthy_imengine.cpp:858
-#: src/scim_anthy_setup.cpp:224
+#: src/scim_anthy_setup.cpp:227
 msgid "Convert as you type (Multi segment)"
 msgstr "Beim Tippen konvertieren (Mehrfachsegment)"
 
 #: src/scim_anthy_imengine.cpp:675 src/scim_anthy_imengine.cpp:677
 #: src/scim_anthy_imengine.cpp:862 src/scim_anthy_imengine.cpp:864
-#: src/scim_anthy_setup.cpp:225
+#: src/scim_anthy_setup.cpp:228
 msgid "Convert as you type (Single segment)"
 msgstr "Beim Tippen konvertieren (Einzelsegment)"
 
@@ -135,7 +136,7 @@ msgstr "Wort hinzufügen"
 msgid "Add a word to the dictionary."
 msgstr "Ein Wort dem Wörterbuch hinzufügen."
 
-#: src/scim_anthy_imengine.cpp:941 src/scim_anthy_setup.cpp:1447
+#: src/scim_anthy_imengine.cpp:941 src/scim_anthy_setup.cpp:1657
 msgid "Dictionary"
 msgstr "Wörterbuch"
 
@@ -297,185 +298,185 @@ msgstr "Anthy"
 msgid "An Anthy IMEngine Module."
 msgstr "Ein Anthy-IMEngine-Modul"
 
-#: src/scim_anthy_setup.cpp:184
+#: src/scim_anthy_setup.cpp:187
 msgid "Mode keys"
 msgstr "Modustasten"
 
-#: src/scim_anthy_setup.cpp:185
+#: src/scim_anthy_setup.cpp:188
 #, fuzzy
 msgid "Edit keys"
 msgstr "Bearbeitungstasten"
 
-#: src/scim_anthy_setup.cpp:186
+#: src/scim_anthy_setup.cpp:189
 msgid "Caret keys"
 msgstr ""
 
-#: src/scim_anthy_setup.cpp:187
+#: src/scim_anthy_setup.cpp:190
 #, fuzzy
 msgid "Segments keys"
 msgstr "Segmenttasten"
 
-#: src/scim_anthy_setup.cpp:188
+#: src/scim_anthy_setup.cpp:191
 msgid "Candidates keys"
 msgstr "Kandidatentasten"
 
-#: src/scim_anthy_setup.cpp:189
+#: src/scim_anthy_setup.cpp:192
 msgid "Direct select keys"
 msgstr "Direktauswahltasten"
 
-#: src/scim_anthy_setup.cpp:190
+#: src/scim_anthy_setup.cpp:193
 msgid "Convert keys"
 msgstr "Konvertierungsteasten"
 
-#: src/scim_anthy_setup.cpp:191
+#: src/scim_anthy_setup.cpp:194
 msgid "Dictionary keys"
 msgstr "Wörterbuchtasten"
 
-#: src/scim_anthy_setup.cpp:214
+#: src/scim_anthy_setup.cpp:217
 msgid "Romaji typing method"
 msgstr "Romaji-Schreibmethode"
 
-#: src/scim_anthy_setup.cpp:215
+#: src/scim_anthy_setup.cpp:218
 msgid "Kana typing method"
 msgstr "Kana-Schreibmethode"
 
-#: src/scim_anthy_setup.cpp:216
+#: src/scim_anthy_setup.cpp:219
 msgid "Thumb shift typing method"
 msgstr ""
 
-#: src/scim_anthy_setup.cpp:249 src/scim_anthy_setup.cpp:257
+#: src/scim_anthy_setup.cpp:252 src/scim_anthy_setup.cpp:260
 #, fuzzy
 msgid "Follow input mode"
 msgstr "Eingabemodus folgen"
 
-#: src/scim_anthy_setup.cpp:250 src/scim_anthy_setup.cpp:258
+#: src/scim_anthy_setup.cpp:253 src/scim_anthy_setup.cpp:261
 msgid "Wide"
 msgstr "Breit"
 
-#: src/scim_anthy_setup.cpp:251 src/scim_anthy_setup.cpp:259
+#: src/scim_anthy_setup.cpp:254 src/scim_anthy_setup.cpp:262
 msgid "Half"
 msgstr "Halb"
 
-#: src/scim_anthy_setup.cpp:265 src/scim_anthy_prefs.cpp:777
+#: src/scim_anthy_setup.cpp:268 src/scim_anthy_prefs.cpp:777
 msgid "Do nothing"
 msgstr "Nichts tun"
 
-#: src/scim_anthy_setup.cpp:266
+#: src/scim_anthy_setup.cpp:269
 msgid "Start conversion"
 msgstr "Konvertierung starten"
 
-#: src/scim_anthy_setup.cpp:267 src/scim_anthy_setup.cpp:274
+#: src/scim_anthy_setup.cpp:270 src/scim_anthy_setup.cpp:277
 #: src/scim_anthy_prefs.cpp:717
 msgid "Commit"
 msgstr "Übergabe"
 
-#: src/scim_anthy_setup.cpp:275
+#: src/scim_anthy_setup.cpp:278
 #, fuzzy
 msgid "Clear"
 msgstr "Löschen"
 
-#: src/scim_anthy_setup.cpp:282
+#: src/scim_anthy_setup.cpp:285
+msgid "UTF-8"
+msgstr "UTF-8"
+
+#: src/scim_anthy_setup.cpp:286
 msgid "EUC-JP"
 msgstr "EUC-JP"
 
-#: src/scim_anthy_setup.cpp:283
+#: src/scim_anthy_setup.cpp:287
 msgid "EUC-JP-MS"
 msgstr "EUC-JP-MS"
 
-#: src/scim_anthy_setup.cpp:284
-msgid "UTF-8"
-msgstr "UTF-8"
-
-#: src/scim_anthy_setup.cpp:290
+#: src/scim_anthy_setup.cpp:293
 #, fuzzy
 msgid "No decoration"
 msgstr "Keine Hervorhebung"
 
-#: src/scim_anthy_setup.cpp:291
+#: src/scim_anthy_setup.cpp:294
 msgid "Underline"
 msgstr "Unterstreichen"
 
-#: src/scim_anthy_setup.cpp:292
+#: src/scim_anthy_setup.cpp:295
 #, fuzzy
 msgid "Reverse"
 msgstr "Umkehren"
 
-#: src/scim_anthy_setup.cpp:293
+#: src/scim_anthy_setup.cpp:296
 msgid "Highlight"
 msgstr "Hervorheben"
 
-#: src/scim_anthy_setup.cpp:294
+#: src/scim_anthy_setup.cpp:297
 msgid "String color"
 msgstr "Farbe der Zeichenkette"
 
-#: src/scim_anthy_setup.cpp:295
+#: src/scim_anthy_setup.cpp:298
 msgid "BG color"
 msgstr "Hintergrundfarbe"
 
-#: src/scim_anthy_setup.cpp:296
+#: src/scim_anthy_setup.cpp:299
 msgid "Both color"
 msgstr ""
 
-#: src/scim_anthy_setup.cpp:811
+#: src/scim_anthy_setup.cpp:923
 msgid "<b>Default Modes</b>"
 msgstr "<b>Standardmodi</b>"
 
-#: src/scim_anthy_setup.cpp:849
+#: src/scim_anthy_setup.cpp:961
 msgid "<b>Input Prediction</b>"
 msgstr "<b>Eingabevorhersage</b>"
 
-#: src/scim_anthy_setup.cpp:920
+#: src/scim_anthy_setup.cpp:1044
 msgid "_Group:"
 msgstr "_Gruppe:"
 
-#: src/scim_anthy_setup.cpp:935
+#: src/scim_anthy_setup.cpp:1058 src/scim_anthy_setup.cpp:1081
 #, fuzzy
 msgid "All"
 msgstr "Alles"
 
-#: src/scim_anthy_setup.cpp:945
+#: src/scim_anthy_setup.cpp:1068 src/scim_anthy_setup.cpp:1091
 msgid "Search by key"
 msgstr "Nach Taste suchen"
 
-#: src/scim_anthy_setup.cpp:971
+#: src/scim_anthy_setup.cpp:1122
 msgid "_Key bindings:"
 msgstr "_Tastenkürzel:"
 
-#: src/scim_anthy_setup.cpp:1001
+#: src/scim_anthy_setup.cpp:1152
 msgid "Feature"
 msgstr "Funktion"
 
-#: src/scim_anthy_setup.cpp:1010 src/scim_anthy_setup.cpp:1423
+#: src/scim_anthy_setup.cpp:1161 src/scim_anthy_setup.cpp:1633
 msgid "Key Bindings"
 msgstr "Tastenkürzel"
 
-#: src/scim_anthy_setup.cpp:1018
+#: src/scim_anthy_setup.cpp:1169
 msgid "Description"
 msgstr "Beschreibung"
 
-#: src/scim_anthy_setup.cpp:1042
+#: src/scim_anthy_setup.cpp:1197
 msgid "Key bindings _theme:"
 msgstr "Tastenkürzel-_Vorlage"
 
-#: src/scim_anthy_setup.cpp:1056
+#: src/scim_anthy_setup.cpp:1215
 msgid "_Choose keys..."
 msgstr "Tasten _auswählen..."
 
-#: src/scim_anthy_setup.cpp:1083
+#: src/scim_anthy_setup.cpp:1246
 #, fuzzy
 msgid "<b>Enable/Disable Learning</b>"
 msgstr "<b>Lernen an-/ausschalten</b>"
 
-#: src/scim_anthy_setup.cpp:1107
+#: src/scim_anthy_setup.cpp:1270
 #, fuzzy
 msgid "<b>Key Preferences to Commit with Reversing Learning Preference</b>"
 msgstr "<b>Tastenpräferenzen zur Übergabe bei umgekehrten Lernpräferenzen</b>"
 
-#: src/scim_anthy_setup.cpp:1153 src/scim_anthy_setup.cpp:1168
+#: src/scim_anthy_setup.cpp:1316 src/scim_anthy_setup.cpp:1331
 msgid "_Launch"
 msgstr "_Starten"
 
-#: src/scim_anthy_setup.cpp:1375
+#: src/scim_anthy_setup.cpp:1585
 #, c-format
 msgid ""
 "<span size=\"20000\">%s-%s</span>\n"
@@ -498,122 +499,126 @@ msgstr ""
 "<span size=\"12000\">Copyright 2005-2006, Takuro Ashie &lt;ashie@homa.ne."
 "jp&gt;</span>"
 
-#: src/scim_anthy_setup.cpp:1411
+#: src/scim_anthy_setup.cpp:1621
 msgid "Common"
 msgstr "Gemeinsam"
 
-#: src/scim_anthy_setup.cpp:1417
+#: src/scim_anthy_setup.cpp:1627
 msgid "Symbols"
 msgstr "Symbole"
 
-#: src/scim_anthy_setup.cpp:1429
+#: src/scim_anthy_setup.cpp:1639
 #, fuzzy
 msgid "Romaji Typing"
 msgstr "Romaji tippen"
 
-#: src/scim_anthy_setup.cpp:1435
+#: src/scim_anthy_setup.cpp:1645
 msgid "Kana Typing"
 msgstr "Kana tippen"
 
-#: src/scim_anthy_setup.cpp:1441
+#: src/scim_anthy_setup.cpp:1651
 #, fuzzy
 msgid "Learning"
 msgstr "Lernen"
 
-#: src/scim_anthy_setup.cpp:1453
+#: src/scim_anthy_setup.cpp:1663
 msgid "Candidates Window"
 msgstr "Kandidatenfenster"
 
-#: src/scim_anthy_setup.cpp:1459
+#: src/scim_anthy_setup.cpp:1669
 msgid "Toolbar"
 msgstr "Werkzeugleiste"
 
-#: src/scim_anthy_setup.cpp:1465
+#: src/scim_anthy_setup.cpp:1675
 msgid "Colors"
 msgstr "Farben"
 
-#: src/scim_anthy_setup.cpp:1471
+#: src/scim_anthy_setup.cpp:1681
 msgid "About"
 msgstr "Über"
 
-#: src/scim_anthy_setup.cpp:1533 src/scim_anthy_setup_romaji.cpp:258
-#: src/scim_anthy_setup_kana.cpp:422 src/scim_anthy_setup_kana.cpp:489
+#: src/scim_anthy_setup.cpp:1758 src/scim_anthy_setup.cpp:1799
+#: src/scim_anthy_setup_romaji.cpp:290 src/scim_anthy_setup_romaji.cpp:330
+#: src/scim_anthy_setup_kana.cpp:487 src/scim_anthy_setup_kana.cpp:527
+#: src/scim_anthy_setup_kana.cpp:590 src/scim_anthy_setup_kana.cpp:630
 msgid "User defined"
 msgstr "Benutzerdefiniert"
 
-#: src/scim_anthy_setup.cpp:1536 src/scim_anthy_setup_romaji.cpp:261
-#: src/scim_anthy_setup_kana.cpp:425 src/scim_anthy_setup_kana.cpp:492
+#: src/scim_anthy_setup.cpp:1759 src/scim_anthy_setup.cpp:1802
+#: src/scim_anthy_setup_romaji.cpp:291 src/scim_anthy_setup_romaji.cpp:333
+#: src/scim_anthy_setup_kana.cpp:488 src/scim_anthy_setup_kana.cpp:530
+#: src/scim_anthy_setup_kana.cpp:591 src/scim_anthy_setup_kana.cpp:633
 #, fuzzy
 msgid "Default"
 msgstr "Standard"
 
-#: src/scim_anthy_setup.cpp:2136
+#: src/scim_anthy_setup.cpp:2440
 msgid "Set key filter"
 msgstr "Tastenfilter setzen"
 
-#: src/scim_anthy_setup_romaji.cpp:127 src/scim_anthy_setup_romaji.cpp:198
+#: src/scim_anthy_setup_romaji.cpp:135 src/scim_anthy_setup_romaji.cpp:226
 msgid "Romaji _table:"
 msgstr "Romaji-_Tabelle"
 
-#: src/scim_anthy_setup_romaji.cpp:140 src/scim_anthy_setup_kana.cpp:147
-#: src/scim_anthy_setup_kana.cpp:198
+#: src/scim_anthy_setup_romaji.cpp:152 src/scim_anthy_setup_kana.cpp:159
+#: src/scim_anthy_setup_kana.cpp:218
 msgid "_Customize..."
 msgstr "_Bearbeiten..."
 
-#: src/scim_anthy_setup_romaji.cpp:180
+#: src/scim_anthy_setup_romaji.cpp:192
 msgid "Sequence"
 msgstr "Sequenz"
 
-#: src/scim_anthy_setup_romaji.cpp:181 src/scim_anthy_setup_kana.cpp:272
+#: src/scim_anthy_setup_romaji.cpp:193 src/scim_anthy_setup_kana.cpp:296
 msgid "Result"
 msgstr "Ergebnis"
 
-#: src/scim_anthy_setup_romaji.cpp:188
+#: src/scim_anthy_setup_romaji.cpp:200
 msgid "Customize Romaji Table"
 msgstr "Romaji-Tabelle bearbeiten"
 
-#: src/scim_anthy_setup_kana.cpp:115
+#: src/scim_anthy_setup_kana.cpp:119
 msgid "<b>JIS Kana Layout</b>"
 msgstr "<b>JIS Kana-Anordnung</b>"
 
-#: src/scim_anthy_setup_kana.cpp:127 src/scim_anthy_setup_kana.cpp:178
+#: src/scim_anthy_setup_kana.cpp:131 src/scim_anthy_setup_kana.cpp:190
 msgid "La_yout:"
 msgstr "_Anordnung:"
 
-#: src/scim_anthy_setup_kana.cpp:166
+#: src/scim_anthy_setup_kana.cpp:178
 msgid "<b>Thumb Shift Layout</b>"
 msgstr ""
 
-#: src/scim_anthy_setup_kana.cpp:271 src/scim_anthy_setup_kana.cpp:341
+#: src/scim_anthy_setup_kana.cpp:295 src/scim_anthy_setup_kana.cpp:388
 msgid "Key"
 msgstr "Taste"
 
-#: src/scim_anthy_setup_kana.cpp:279
+#: src/scim_anthy_setup_kana.cpp:303
 msgid "Customize Kana Layout Table"
 msgstr "Kana-Anordnungstabelle bearbeiten"
 
-#: src/scim_anthy_setup_kana.cpp:289 src/scim_anthy_setup_kana.cpp:361
+#: src/scim_anthy_setup_kana.cpp:326 src/scim_anthy_setup_kana.cpp:421
 msgid "Layout _table:"
 msgstr "Anordnungs_tabelle"
 
-#: src/scim_anthy_setup_kana.cpp:342
+#: src/scim_anthy_setup_kana.cpp:389
 #, fuzzy
 msgid "Single press"
 msgstr "Einzelklick"
 
-#: src/scim_anthy_setup_kana.cpp:343
+#: src/scim_anthy_setup_kana.cpp:390
 msgid "Left thumb shift"
 msgstr ""
 
-#: src/scim_anthy_setup_kana.cpp:344
+#: src/scim_anthy_setup_kana.cpp:391
 msgid "Right thumb shift"
 msgstr ""
 
-#: src/scim_anthy_setup_kana.cpp:351
+#: src/scim_anthy_setup_kana.cpp:398
 msgid "Customize Thumb Shift Layout Table"
 msgstr ""
 
-#: src/scim_anthy_table_editor.cpp:140
+#: src/scim_anthy_table_editor.cpp:150
 msgid "Table _entries:"
 msgstr "Tabellen_einträge"
 
@@ -1162,7 +1167,7 @@ msgid "Select reconvert keys"
 msgstr "Tasten zum zurückkonvertieren wählen"
 
 #: src/scim_anthy_prefs.cpp:769
-msgid "The key events to reconvert the commited string in selection. "
+msgid "The key events to reconvert the committed string in selection. "
 msgstr ""
 "Die Tastatureignisse, die die übergebene Zeichenkette wieder in eine Auswahl "
 "zurückkonvertieren"
@@ -1668,10 +1673,10 @@ msgstr "Die Farbe des ausgewählten Segments"
 msgid "The color of selected segment text in the conversion text"
 msgstr "Die Farbe des ausgewählten Segments im konvertierten Text"
 
-#: src/scim_anthy_color_button.cpp:320
+#: src/scim_anthy_color_button.cpp:428
 msgid "Foreground color"
 msgstr "Vordergrundfarbe"
 
-#: src/scim_anthy_color_button.cpp:320
+#: src/scim_anthy_color_button.cpp:428
 msgid "Background color"
 msgstr "Hintergrundfarbe"
diff --git a/po/ja.po b/po/ja.po
index 9b168e8..e685d31 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -5,10 +5,11 @@ msgid ""
 msgstr ""
 "Project-Id-Version: anthy\n"
 "Report-Msgid-Bugs-To: ashie@homa.ne.jp\n"
-"POT-Creation-Date: 2008-03-28 21:54+0900\n"
+"POT-Creation-Date: 2012-07-01 19:38+0800\n"
 "PO-Revision-Date: 2006-11-23 11:26+0900\n"
 "Last-Translator: Takuro Ashie <ashie@homa.ne.jp>\n"
 "Language-Team: Japanese <ja@li.org>\n"
+"Language: ja\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -23,23 +24,23 @@ msgid "Input mode"
 msgstr "入力モード"
 
 #: src/scim_anthy_imengine.cpp:613 src/scim_anthy_imengine.cpp:802
-#: src/scim_anthy_setup.cpp:204
+#: src/scim_anthy_setup.cpp:207
 msgid "Hiragana"
 msgstr "ひらがな"
 
 #: src/scim_anthy_imengine.cpp:617 src/scim_anthy_imengine.cpp:806
-#: src/scim_anthy_setup.cpp:205
+#: src/scim_anthy_setup.cpp:208
 msgid "Katakana"
 msgstr "カタカナ"
 
 #: src/scim_anthy_imengine.cpp:621 src/scim_anthy_imengine.cpp:622
 #: src/scim_anthy_imengine.cpp:810 src/scim_anthy_imengine.cpp:811
-#: src/scim_anthy_setup.cpp:206
+#: src/scim_anthy_setup.cpp:209
 msgid "Half width katakana"
 msgstr "半角カタカナ"
 
 #: src/scim_anthy_imengine.cpp:626 src/scim_anthy_imengine.cpp:815
-#: src/scim_anthy_setup.cpp:207
+#: src/scim_anthy_setup.cpp:210
 msgid "Latin"
 msgstr "英数"
 
@@ -48,7 +49,7 @@ msgid "Direct input"
 msgstr "直接入力"
 
 #: src/scim_anthy_imengine.cpp:630 src/scim_anthy_imengine.cpp:819
-#: src/scim_anthy_setup.cpp:208
+#: src/scim_anthy_setup.cpp:211
 msgid "Wide latin"
 msgstr "全角英数"
 
@@ -75,25 +76,25 @@ msgstr "変換方式"
 
 #: src/scim_anthy_imengine.cpp:659 src/scim_anthy_imengine.cpp:660
 #: src/scim_anthy_imengine.cpp:846 src/scim_anthy_imengine.cpp:847
-#: src/scim_anthy_setup.cpp:222
+#: src/scim_anthy_setup.cpp:225
 msgid "Multi segment"
 msgstr "連文節"
 
 #: src/scim_anthy_imengine.cpp:664 src/scim_anthy_imengine.cpp:665
 #: src/scim_anthy_imengine.cpp:851 src/scim_anthy_imengine.cpp:852
-#: src/scim_anthy_setup.cpp:223
+#: src/scim_anthy_setup.cpp:226
 msgid "Single segment"
 msgstr "単文節"
 
 #: src/scim_anthy_imengine.cpp:669 src/scim_anthy_imengine.cpp:671
 #: src/scim_anthy_imengine.cpp:856 src/scim_anthy_imengine.cpp:858
-#: src/scim_anthy_setup.cpp:224
+#: src/scim_anthy_setup.cpp:227
 msgid "Convert as you type (Multi segment)"
 msgstr "逐次変換(連文節)"
 
 #: src/scim_anthy_imengine.cpp:675 src/scim_anthy_imengine.cpp:677
 #: src/scim_anthy_imengine.cpp:862 src/scim_anthy_imengine.cpp:864
-#: src/scim_anthy_setup.cpp:225
+#: src/scim_anthy_setup.cpp:228
 msgid "Convert as you type (Single segment)"
 msgstr "逐次変換(単文節)"
 
@@ -128,7 +129,7 @@ msgstr "単語を追加"
 msgid "Add a word to the dictionary."
 msgstr "単語を辞書に追加"
 
-#: src/scim_anthy_imengine.cpp:941 src/scim_anthy_setup.cpp:1447
+#: src/scim_anthy_imengine.cpp:941 src/scim_anthy_setup.cpp:1657
 msgid "Dictionary"
 msgstr "辞書"
 
@@ -282,176 +283,176 @@ msgstr "Anthy"
 msgid "An Anthy IMEngine Module."
 msgstr "Anthy IMEngineモジュール"
 
-#: src/scim_anthy_setup.cpp:184
+#: src/scim_anthy_setup.cpp:187
 msgid "Mode keys"
 msgstr "モードキー"
 
-#: src/scim_anthy_setup.cpp:185
+#: src/scim_anthy_setup.cpp:188
 msgid "Edit keys"
 msgstr "編集キー"
 
-#: src/scim_anthy_setup.cpp:186
+#: src/scim_anthy_setup.cpp:189
 msgid "Caret keys"
 msgstr "キャレットキー"
 
-#: src/scim_anthy_setup.cpp:187
+#: src/scim_anthy_setup.cpp:190
 msgid "Segments keys"
 msgstr "文節キー"
 
-#: src/scim_anthy_setup.cpp:188
+#: src/scim_anthy_setup.cpp:191
 msgid "Candidates keys"
 msgstr "候補選択キー"
 
-#: src/scim_anthy_setup.cpp:189
+#: src/scim_anthy_setup.cpp:192
 msgid "Direct select keys"
 msgstr "直接選択キー"
 
-#: src/scim_anthy_setup.cpp:190
+#: src/scim_anthy_setup.cpp:193
 msgid "Convert keys"
 msgstr "変換キー"
 
-#: src/scim_anthy_setup.cpp:191
+#: src/scim_anthy_setup.cpp:194
 msgid "Dictionary keys"
 msgstr "辞書関連キー"
 
-#: src/scim_anthy_setup.cpp:214
+#: src/scim_anthy_setup.cpp:217
 msgid "Romaji typing method"
 msgstr "ローマ字入力方式"
 
-#: src/scim_anthy_setup.cpp:215
+#: src/scim_anthy_setup.cpp:218
 msgid "Kana typing method"
 msgstr "かな入力方式"
 
-#: src/scim_anthy_setup.cpp:216
+#: src/scim_anthy_setup.cpp:219
 msgid "Thumb shift typing method"
 msgstr "親指シフト入力方式"
 
-#: src/scim_anthy_setup.cpp:249 src/scim_anthy_setup.cpp:257
+#: src/scim_anthy_setup.cpp:252 src/scim_anthy_setup.cpp:260
 msgid "Follow input mode"
 msgstr "入力モードに従う"
 
-#: src/scim_anthy_setup.cpp:250 src/scim_anthy_setup.cpp:258
+#: src/scim_anthy_setup.cpp:253 src/scim_anthy_setup.cpp:261
 msgid "Wide"
 msgstr "全角"
 
-#: src/scim_anthy_setup.cpp:251 src/scim_anthy_setup.cpp:259
+#: src/scim_anthy_setup.cpp:254 src/scim_anthy_setup.cpp:262
 msgid "Half"
 msgstr "半角"
 
-#: src/scim_anthy_setup.cpp:265 src/scim_anthy_prefs.cpp:777
+#: src/scim_anthy_setup.cpp:268 src/scim_anthy_prefs.cpp:777
 msgid "Do nothing"
 msgstr "なにもしない"
 
-#: src/scim_anthy_setup.cpp:266
+#: src/scim_anthy_setup.cpp:269
 msgid "Start conversion"
 msgstr "変換を開始する"
 
-#: src/scim_anthy_setup.cpp:267 src/scim_anthy_setup.cpp:274
+#: src/scim_anthy_setup.cpp:270 src/scim_anthy_setup.cpp:277
 #: src/scim_anthy_prefs.cpp:717
 msgid "Commit"
 msgstr "確定"
 
-#: src/scim_anthy_setup.cpp:275
+#: src/scim_anthy_setup.cpp:278
 msgid "Clear"
 msgstr "クリア"
 
-#: src/scim_anthy_setup.cpp:282
+#: src/scim_anthy_setup.cpp:285
+msgid "UTF-8"
+msgstr "UTF-8"
+
+#: src/scim_anthy_setup.cpp:286
 msgid "EUC-JP"
 msgstr "EUC-JP"
 
-#: src/scim_anthy_setup.cpp:283
+#: src/scim_anthy_setup.cpp:287
 msgid "EUC-JP-MS"
 msgstr "EUC-JP-MS"
 
-#: src/scim_anthy_setup.cpp:284
-msgid "UTF-8"
-msgstr "UTF-8"
-
-#: src/scim_anthy_setup.cpp:290
+#: src/scim_anthy_setup.cpp:293
 msgid "No decoration"
 msgstr "装飾無し"
 
-#: src/scim_anthy_setup.cpp:291
+#: src/scim_anthy_setup.cpp:294
 msgid "Underline"
 msgstr "下線"
 
-#: src/scim_anthy_setup.cpp:292
+#: src/scim_anthy_setup.cpp:295
 msgid "Reverse"
 msgstr "反転"
 
-#: src/scim_anthy_setup.cpp:293
+#: src/scim_anthy_setup.cpp:296
 msgid "Highlight"
 msgstr "強調"
 
-#: src/scim_anthy_setup.cpp:294
+#: src/scim_anthy_setup.cpp:297
 msgid "String color"
 msgstr "文字色"
 
-#: src/scim_anthy_setup.cpp:295
+#: src/scim_anthy_setup.cpp:298
 msgid "BG color"
 msgstr "背景色"
 
-#: src/scim_anthy_setup.cpp:296
+#: src/scim_anthy_setup.cpp:299
 msgid "Both color"
 msgstr "文字色/背景色"
 
-#: src/scim_anthy_setup.cpp:811
+#: src/scim_anthy_setup.cpp:923
 msgid "<b>Default Modes</b>"
 msgstr "<b>初期モード</b>"
 
-#: src/scim_anthy_setup.cpp:849
+#: src/scim_anthy_setup.cpp:961
 msgid "<b>Input Prediction</b>"
 msgstr "<b>入力予測</b>"
 
-#: src/scim_anthy_setup.cpp:920
+#: src/scim_anthy_setup.cpp:1044
 msgid "_Group:"
 msgstr "グループ(_G):"
 
-#: src/scim_anthy_setup.cpp:935
+#: src/scim_anthy_setup.cpp:1058 src/scim_anthy_setup.cpp:1081
 msgid "All"
 msgstr "全て"
 
-#: src/scim_anthy_setup.cpp:945
+#: src/scim_anthy_setup.cpp:1068 src/scim_anthy_setup.cpp:1091
 msgid "Search by key"
 msgstr "キーで検索"
 
-#: src/scim_anthy_setup.cpp:971
+#: src/scim_anthy_setup.cpp:1122
 msgid "_Key bindings:"
 msgstr "キーバインド(_K):"
 
-#: src/scim_anthy_setup.cpp:1001
+#: src/scim_anthy_setup.cpp:1152
 msgid "Feature"
 msgstr "機能"
 
-#: src/scim_anthy_setup.cpp:1010 src/scim_anthy_setup.cpp:1423
+#: src/scim_anthy_setup.cpp:1161 src/scim_anthy_setup.cpp:1633
 msgid "Key Bindings"
 msgstr "キーバインド"
 
-#: src/scim_anthy_setup.cpp:1018
+#: src/scim_anthy_setup.cpp:1169
 msgid "Description"
 msgstr "説明"
 
-#: src/scim_anthy_setup.cpp:1042
+#: src/scim_anthy_setup.cpp:1197
 msgid "Key bindings _theme:"
 msgstr "キーバインドテーマ(_T):"
 
-#: src/scim_anthy_setup.cpp:1056
+#: src/scim_anthy_setup.cpp:1215
 msgid "_Choose keys..."
 msgstr "キーを設定...(_C)"
 
-#: src/scim_anthy_setup.cpp:1083
+#: src/scim_anthy_setup.cpp:1246
 msgid "<b>Enable/Disable Learning</b>"
 msgstr "<b>学習の有効/無効</b>"
 
-#: src/scim_anthy_setup.cpp:1107
+#: src/scim_anthy_setup.cpp:1270
 msgid "<b>Key Preferences to Commit with Reversing Learning Preference</b>"
 msgstr "<b>学習設定とは逆の方法で確定するキーの設定</b>"
 
-#: src/scim_anthy_setup.cpp:1153 src/scim_anthy_setup.cpp:1168
+#: src/scim_anthy_setup.cpp:1316 src/scim_anthy_setup.cpp:1331
 msgid "_Launch"
 msgstr "起動(_L)"
 
-#: src/scim_anthy_setup.cpp:1375
+#: src/scim_anthy_setup.cpp:1585
 #, c-format
 msgid ""
 "<span size=\"20000\">%s-%s</span>\n"
@@ -474,118 +475,122 @@ msgstr ""
 "<span size=\"12000\">Copyright 2005-2006, Takuro Ashie &lt;ashie@homa.ne."
 "jp&gt;</span>"
 
-#: src/scim_anthy_setup.cpp:1411
+#: src/scim_anthy_setup.cpp:1621
 msgid "Common"
 msgstr "一般"
 
-#: src/scim_anthy_setup.cpp:1417
+#: src/scim_anthy_setup.cpp:1627
 msgid "Symbols"
 msgstr "記号等"
 
-#: src/scim_anthy_setup.cpp:1429
+#: src/scim_anthy_setup.cpp:1639
 msgid "Romaji Typing"
 msgstr "ローマ字入力"
 
-#: src/scim_anthy_setup.cpp:1435
+#: src/scim_anthy_setup.cpp:1645
 msgid "Kana Typing"
 msgstr "かな入力"
 
-#: src/scim_anthy_setup.cpp:1441
+#: src/scim_anthy_setup.cpp:1651
 msgid "Learning"
 msgstr "学習"
 
-#: src/scim_anthy_setup.cpp:1453
+#: src/scim_anthy_setup.cpp:1663
 msgid "Candidates Window"
 msgstr "候補ウィンドウ"
 
-#: src/scim_anthy_setup.cpp:1459
+#: src/scim_anthy_setup.cpp:1669
 msgid "Toolbar"
 msgstr "ツールバー"
 
-#: src/scim_anthy_setup.cpp:1465
+#: src/scim_anthy_setup.cpp:1675
 msgid "Colors"
 msgstr "配色"
 
-#: src/scim_anthy_setup.cpp:1471
+#: src/scim_anthy_setup.cpp:1681
 msgid "About"
 msgstr "情報"
 
-#: src/scim_anthy_setup.cpp:1533 src/scim_anthy_setup_romaji.cpp:258
-#: src/scim_anthy_setup_kana.cpp:422 src/scim_anthy_setup_kana.cpp:489
+#: src/scim_anthy_setup.cpp:1758 src/scim_anthy_setup.cpp:1799
+#: src/scim_anthy_setup_romaji.cpp:290 src/scim_anthy_setup_romaji.cpp:330
+#: src/scim_anthy_setup_kana.cpp:487 src/scim_anthy_setup_kana.cpp:527
+#: src/scim_anthy_setup_kana.cpp:590 src/scim_anthy_setup_kana.cpp:630
 msgid "User defined"
 msgstr "ユーザー定義"
 
-#: src/scim_anthy_setup.cpp:1536 src/scim_anthy_setup_romaji.cpp:261
-#: src/scim_anthy_setup_kana.cpp:425 src/scim_anthy_setup_kana.cpp:492
+#: src/scim_anthy_setup.cpp:1759 src/scim_anthy_setup.cpp:1802
+#: src/scim_anthy_setup_romaji.cpp:291 src/scim_anthy_setup_romaji.cpp:333
+#: src/scim_anthy_setup_kana.cpp:488 src/scim_anthy_setup_kana.cpp:530
+#: src/scim_anthy_setup_kana.cpp:591 src/scim_anthy_setup_kana.cpp:633
 msgid "Default"
 msgstr "標準設定"
 
-#: src/scim_anthy_setup.cpp:2136
+#: src/scim_anthy_setup.cpp:2440
 msgid "Set key filter"
 msgstr "キ-フィルタ-をセット"
 
-#: src/scim_anthy_setup_romaji.cpp:127 src/scim_anthy_setup_romaji.cpp:198
+#: src/scim_anthy_setup_romaji.cpp:135 src/scim_anthy_setup_romaji.cpp:226
 msgid "Romaji _table:"
 msgstr "ローマ字テーブル(_T):"
 
-#: src/scim_anthy_setup_romaji.cpp:140 src/scim_anthy_setup_kana.cpp:147
-#: src/scim_anthy_setup_kana.cpp:198
+#: src/scim_anthy_setup_romaji.cpp:152 src/scim_anthy_setup_kana.cpp:159
+#: src/scim_anthy_setup_kana.cpp:218
 msgid "_Customize..."
 msgstr "カスタマイズ...(_C)"
 
-#: src/scim_anthy_setup_romaji.cpp:180
+#: src/scim_anthy_setup_romaji.cpp:192
 msgid "Sequence"
 msgstr "入力文字列"
 
-#: src/scim_anthy_setup_romaji.cpp:181 src/scim_anthy_setup_kana.cpp:272
+#: src/scim_anthy_setup_romaji.cpp:193 src/scim_anthy_setup_kana.cpp:296
 msgid "Result"
 msgstr "出力文字列"
 
-#: src/scim_anthy_setup_romaji.cpp:188
+#: src/scim_anthy_setup_romaji.cpp:200
 msgid "Customize Romaji Table"
 msgstr "ローマ字テーブルのカスタマイズ"
 
-#: src/scim_anthy_setup_kana.cpp:115
+#: src/scim_anthy_setup_kana.cpp:119
 msgid "<b>JIS Kana Layout</b>"
 msgstr "<b>JISかな配列</b>"
 
-#: src/scim_anthy_setup_kana.cpp:127 src/scim_anthy_setup_kana.cpp:178
+#: src/scim_anthy_setup_kana.cpp:131 src/scim_anthy_setup_kana.cpp:190
 msgid "La_yout:"
 msgstr "レイアウト(_Y):"
 
-#: src/scim_anthy_setup_kana.cpp:166
+#: src/scim_anthy_setup_kana.cpp:178
 msgid "<b>Thumb Shift Layout</b>"
 msgstr "<b>親指シフト配列</b>"
 
-#: src/scim_anthy_setup_kana.cpp:271 src/scim_anthy_setup_kana.cpp:341
+#: src/scim_anthy_setup_kana.cpp:295 src/scim_anthy_setup_kana.cpp:388
 msgid "Key"
 msgstr "キー"
 
-#: src/scim_anthy_setup_kana.cpp:279
+#: src/scim_anthy_setup_kana.cpp:303
 msgid "Customize Kana Layout Table"
 msgstr "かなレイアウトテーブルのカスタマイズ"
 
-#: src/scim_anthy_setup_kana.cpp:289 src/scim_anthy_setup_kana.cpp:361
+#: src/scim_anthy_setup_kana.cpp:326 src/scim_anthy_setup_kana.cpp:421
 msgid "Layout _table:"
 msgstr "レイアウトテーブル(_T):"
 
-#: src/scim_anthy_setup_kana.cpp:342
+#: src/scim_anthy_setup_kana.cpp:389
 msgid "Single press"
 msgstr "単独打鍵"
 
-#: src/scim_anthy_setup_kana.cpp:343
+#: src/scim_anthy_setup_kana.cpp:390
 msgid "Left thumb shift"
 msgstr "左親指シフト"
 
-#: src/scim_anthy_setup_kana.cpp:344
+#: src/scim_anthy_setup_kana.cpp:391
 msgid "Right thumb shift"
 msgstr "右親指シフト"
 
-#: src/scim_anthy_setup_kana.cpp:351
+#: src/scim_anthy_setup_kana.cpp:398
 msgid "Customize Thumb Shift Layout Table"
 msgstr "親指シフトレイアウトテーブルのカスタマイズ"
 
-#: src/scim_anthy_table_editor.cpp:140
+#: src/scim_anthy_table_editor.cpp:150
 msgid "Table _entries:"
 msgstr "テーブルエントリ(_E):"
 
@@ -1114,7 +1119,7 @@ msgid "Select reconvert keys"
 msgstr "再変換キーの設定"
 
 #: src/scim_anthy_prefs.cpp:769
-msgid "The key events to reconvert the commited string in selection. "
+msgid "The key events to reconvert the committed string in selection. "
 msgstr "セレクション内の確定済み文字列を再変換するキーイベント"
 
 #: src/scim_anthy_prefs.cpp:778
@@ -1594,11 +1599,11 @@ msgstr "選択文節の色"
 msgid "The color of selected segment text in the conversion text"
 msgstr "変換文字列内の選択文節の色"
 
-#: src/scim_anthy_color_button.cpp:320
+#: src/scim_anthy_color_button.cpp:428
 msgid "Foreground color"
 msgstr "前景色"
 
-#: src/scim_anthy_color_button.cpp:320
+#: src/scim_anthy_color_button.cpp:428
 msgid "Background color"
 msgstr "背景色"
 
diff --git a/src/Makefile.am b/src/Makefile.am
index c2ce196..50bd79f 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -138,17 +138,16 @@ else
 anthy_imengine_helper_la_SOURCES  = scim_anthy_helper.cpp
 endif
 
-anthy_imengine_helper_la_CFLAGS   = @GTK2_CFLAGS@ \
+anthy_imengine_helper_la_CFLAGS   = @GTK_CFLAGS@ \
 				    @SCIM_CFLAGS@ \
 				    @SCIM_DEBUG_FLAGS@
-anthy_imengine_helper_la_CXXFLAGS = @GTK2_CFLAGS@ \
+anthy_imengine_helper_la_CXXFLAGS = @GTK_CFLAGS@ \
 				    @SCIM_CFLAGS@ \
 				    @SCIM_DEBUG_FLAGS@
 anthy_imengine_helper_la_LDFLAGS  = -avoid-version \
                                     -rpath $(setupmoduledir) \
                                     -module \
 				    @LIBTOOL_EXPORT_OPTIONS@ \
-				    @GTK2_LIBS@ \
 				    @INTLLIBS@ \
 				    @SCIM_LIBS@ \
 				    @SCIM_GTKUTILS_LIBS@
diff --git a/src/scim_anthy_color_button.cpp b/src/scim_anthy_color_button.cpp
index 841c9aa..7606523 100644
--- a/src/scim_anthy_color_button.cpp
+++ b/src/scim_anthy_color_button.cpp
@@ -58,9 +58,14 @@ typedef enum
 static void     scim_anthy_color_button_class_init     (ScimAnthyColorButtonClass *klass);
 static void     scim_anthy_color_button_init           (ScimAnthyColorButton      *object);
 
+#if GTK_CHECK_VERSION(3, 0, 0)
+static void     scim_anthy_color_button_destroy (GtkWidget *object);
+static gboolean scim_anthy_color_button_draw (GtkWidget *widget, cairo_t *cr);
+#else
 static void     scim_anthy_color_button_destroy        (GtkObject      *object);
 static gboolean scim_anthy_color_button_expose         (GtkWidget      *widget,
 							GdkEventExpose *eevent);
+#endif
 static gboolean scim_anthy_color_button_button_press   (GtkWidget      *widget,
 							GdkEventButton *bevent);
 static gboolean scim_anthy_color_button_button_release (GtkWidget      *widget,
@@ -100,7 +105,6 @@ scim_anthy_color_button_get_type (void)
 static void
 scim_anthy_color_button_class_init (ScimAnthyColorButtonClass *klass)
 {
-    GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS (klass);
     GtkWidgetClass *widget_class     = GTK_WIDGET_CLASS (klass);
   
     parent_class = (GtkDrawingAreaClass *) g_type_class_peek_parent (klass);
@@ -114,9 +118,15 @@ scim_anthy_color_button_class_init (ScimAnthyColorButtonClass *klass)
   		  g_cclosure_marshal_VOID__VOID,
   		  G_TYPE_NONE, 0);
   
+#if GTK_CHECK_VERSION(3, 0, 0)
+    widget_class->destroy = scim_anthy_color_button_destroy;
+    widget_class->draw = scim_anthy_color_button_draw;
+#else
+    GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS (klass);
     gtk_object_class->destroy          = scim_anthy_color_button_destroy;
-  
     widget_class->expose_event         = scim_anthy_color_button_expose;
+#endif
+  
     widget_class->button_press_event   = scim_anthy_color_button_button_press;
     widget_class->button_release_event = scim_anthy_color_button_button_release;
 }
@@ -125,8 +135,13 @@ static void
 scim_anthy_color_button_init (ScimAnthyColorButton *object)
 {
     /*set default color */ 
+#if GTK_CHECK_VERSION(3, 0, 0)
+    gdk_rgba_parse (&object->fg_color, "#000000");
+    gdk_rgba_parse (&object->bg_color, "#ffffff");
+#else
     gdk_color_parse ("#000000", &object->fg_color);
     gdk_color_parse ("#ffffff", &object->bg_color);
+#endif
 
     gtk_widget_add_events (GTK_WIDGET (object),
                     GDK_BUTTON_PRESS_MASK |
@@ -135,7 +150,11 @@ scim_anthy_color_button_init (ScimAnthyColorButton *object)
 
 
 static void
+#if GTK_CHECK_VERSION(3, 0, 0)
+scim_anthy_color_button_destroy (GtkWidget *object)
+#else
 scim_anthy_color_button_destroy (GtkObject *object)
+#endif
 {
     ScimAnthyColorButton *button = SCIM_ANTHY_COLOR_BUTTON (object);
 
@@ -150,19 +169,38 @@ scim_anthy_color_button_destroy (GtkObject *object)
         button->swap_icon = NULL;
     }
 
+#if GTK_CHECK_VERSION(3, 0, 0)
+    GTK_WIDGET_CLASS (parent_class)->destroy (object);
+#else
     GTK_OBJECT_CLASS (parent_class)->destroy (object);
+#endif
 }
 
 static void
 scim_anthy_color_button_draw_rect (ScimAnthyColorButton *button,
+#if GTK_CHECK_VERSION(3, 0, 0)
+                             GdkWindow      *drawable,
+                             cairo_t        *cr,
+#else
                              GdkDrawable    *drawable,
                              GdkGC          *gc,
+#endif
                              gint            x,
                              gint            y,
                              gint            width,
                              gint            height,
-                             GdkColor        *color)
+#if GTK_CHECK_VERSION(3, 0, 0)
+                             GdkRGBA         *color
+#else
+                             GdkColor        *color
+#endif
+                             )
 {
+#if GTK_CHECK_VERSION(3, 0, 0)
+    gdk_cairo_set_source_rgba (cr, color);
+    cairo_rectangle (cr, x, y, width, height);
+    cairo_fill (cr);
+#else
     gint    rowstride;
     guchar  r, g, b;
     gint    xx, yy;
@@ -201,23 +239,38 @@ scim_anthy_color_button_draw_rect (ScimAnthyColorButton *button,
                         GDK_RGB_DITHER_MAX,
                         button->render_buf,
                         rowstride);
+#endif
 }
 
 static gboolean
+#if GTK_CHECK_VERSION(3, 0, 0)
+scim_anthy_color_button_draw (GtkWidget      *widget,
+                          cairo_t *cr)
+#else
 scim_anthy_color_button_expose (GtkWidget      *widget,
                           GdkEventExpose *eevent)
+#endif
 {
     ScimAnthyColorButton *button = SCIM_ANTHY_COLOR_BUTTON (widget);
     gint            width, height;
     gint            swap_w = 0, swap_h = 0;
     gint            rect_w, rect_h;
   
+#if GTK_CHECK_VERSION(2, 18, 0)
+      if (!gtk_widget_is_drawable (widget))
+#else
     if (!GTK_WIDGET_DRAWABLE (widget))
+#endif
         return FALSE;
-  
+
+#if GTK_CHECK_VERSION(3, 0, 0)
+    width = gdk_window_get_width(gtk_widget_get_window (widget));
+    height = gdk_window_get_height(gtk_widget_get_window (widget));
+#else
     width  = widget->allocation.width;
     height = widget->allocation.height;
-  
+#endif
+
     /*  draw the swap colors pixbuf  */
     if (!button->swap_icon) {
         button->swap_icon
@@ -231,9 +284,14 @@ scim_anthy_color_button_expose (GtkWidget      *widget,
     }  
 
     if (swap_w < width / 2 && swap_h < height / 2) {
+#if GTK_CHECK_VERSION(3, 0, 0)
+        gdk_cairo_set_source_pixbuf (cr, button->swap_icon, width - swap_w, 0);
+        cairo_paint (cr);
+#else
         gdk_draw_pixbuf (widget->window, NULL, button->swap_icon,
                          0, 0, width - swap_w, 0, swap_w, swap_h,
                          GDK_RGB_DITHER_NORMAL, 0, 0);
+#endif
     } else {
         swap_w = swap_h = 0;
     }
@@ -249,37 +307,78 @@ scim_anthy_color_button_expose (GtkWidget      *widget,
     button->rect_width  = rect_w;
     button->rect_height = rect_h;
   
-  
     /*  draw the background area  */
     scim_anthy_color_button_draw_rect (button,
+#if GTK_CHECK_VERSION(2, 14, 0)
+                                 gtk_widget_get_window (widget),
+#else
                                  widget->window,
+#endif
+#if GTK_CHECK_VERSION(3, 0, 0)
+                                 cr,
+#else
                                  widget->style->fg_gc[0],
+#endif
                                  (width - rect_w),
                                  (height - rect_h),
                                  rect_w, rect_h,
                                  &button->bg_color);
   
-    gtk_paint_shadow (widget->style, widget->window, GTK_STATE_NORMAL,
+#if GTK_CHECK_VERSION(3, 0, 0)
+    GtkStyleContext *style = gtk_widget_get_style_context(widget);
+    gtk_style_context_save (style);
+    gtk_style_context_set_state (style, GTK_STATE_FLAG_NORMAL);
+    gtk_render_frame (style, cr, width - rect_w, height - rect_h, rect_w, rect_h);
+#else
+    gtk_paint_shadow (widget->style,
+#if GTK_CHECK_VERSION(2, 14, 0)
+                      gtk_widget_get_window (widget),
+#else
+                      widget->window,
+#endif
+                      GTK_STATE_NORMAL,
                       GTK_SHADOW_IN,
                       NULL, widget, NULL,
                       (width - rect_w),
                       (height - rect_h),
                       rect_w, rect_h);
-  
+#endif 
   
     /*  draw the foreground area  */
     scim_anthy_color_button_draw_rect (button,
+#if GTK_CHECK_VERSION(2, 14, 0)
+                                 gtk_widget_get_window (widget),
+#else
                                  widget->window,
+#endif
+#if GTK_CHECK_VERSION(3, 0, 0)
+                                 cr,
+#else
                                  widget->style->fg_gc[0],
+#endif
                                  0, 0,
                                  rect_w, rect_h,
                                  &button->fg_color);
     
-    gtk_paint_shadow (widget->style, widget->window, GTK_STATE_NORMAL,
-                      GTK_SHADOW_IN,
-                      NULL, widget, NULL,
-                      0, 0,
-                      rect_w, rect_h);
+#if GTK_CHECK_VERSION(3, 0, 0)
+    style = gtk_widget_get_style_context(widget);
+    gtk_style_context_save (style);
+    gtk_style_context_set_state (style, GTK_STATE_FLAG_NORMAL);
+    gtk_render_frame (style, cr, 0, 0, rect_w, rect_h);
+#else
+    gtk_paint_shadow (
+        widget->style, 
+#if GTK_CHECK_VERSION(2, 14, 0)
+        gtk_widget_get_window (widget),
+#else
+        widget->window,
+#endif
+        GTK_STATE_NORMAL,
+        GTK_SHADOW_IN,
+        NULL, widget, NULL,
+        0, 0,
+        rect_w, rect_h);
+#endif
   
     return TRUE;
 }
@@ -289,11 +388,16 @@ scim_anthy_color_button_target (ScimAnthyColorButton *button,
                           gint            x,
                           gint            y)
 {
+#if GTK_CHECK_VERSION(3, 0, 0)
+    gint width = gdk_window_get_width(gtk_widget_get_window (GTK_WIDGET(button)));
+    gint height = gdk_window_get_height(gtk_widget_get_window (GTK_WIDGET(button)));
+#else
     gint width  = GTK_WIDGET (button)->allocation.width;
     gint height = GTK_WIDGET (button)->allocation.height;
+#endif
     gint rect_w = button->rect_width;
     gint rect_h = button->rect_height;
-  
+
     if (x > 0 && x < rect_w && y > 0 && y < rect_h)
         return FOREGROUND_AREA;
     else if (x > (width - rect_w)  && x < width  &&
@@ -314,7 +418,11 @@ scim_anthy_color_button_open_color_dialog (ScimAnthyColorButton *button, gboolea
 {
     GtkWidget *dialog;
     const gchar *title;
+#if GTK_CHECK_VERSION(3, 0, 0)
+    GdkRGBA *color;
+#else
     GdkColor *color;
+#endif
     gint result;
   
     title = fg ? _("Foreground color") : _("Background color");
@@ -322,16 +430,38 @@ scim_anthy_color_button_open_color_dialog (ScimAnthyColorButton *button, gboolea
     
     dialog = gtk_color_selection_dialog_new (title);
 
-    gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (dialog)->colorsel),
-                                           color);
+#if GTK_CHECK_VERSION(3, 0, 0)
+    gtk_color_selection_set_current_rgba (
+        GTK_COLOR_SELECTION (gtk_color_selection_dialog_get_color_selection (GTK_COLOR_SELECTION_DIALOG (dialog))),
+        color);
+#else
+    gtk_color_selection_set_current_color (
+#if GTK_CHECK_VERSION(2, 14, 0)
+        GTK_COLOR_SELECTION (gtk_color_selection_dialog_get_color_selection (GTK_COLOR_SELECTION_DIALOG (dialog))),
+#else
+        GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (dialog)->colorsel),
+#endif
+        color);
+#endif
     gtk_widget_show (dialog);
 
     result = gtk_dialog_run (GTK_DIALOG (dialog));
 
     switch (result) {
         case GTK_RESPONSE_OK:
-            gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (dialog)->colorsel),
-                                                   color);
+#if GTK_CHECK_VERSION(3, 0, 0)
+            gtk_color_selection_get_current_rgba (
+                GTK_COLOR_SELECTION (gtk_color_selection_dialog_get_color_selection (GTK_COLOR_SELECTION_DIALOG (dialog))),
+                color);
+#else
+            gtk_color_selection_get_current_color (
+#if GTK_CHECK_VERSION(2, 14, 0)
+                GTK_COLOR_SELECTION (gtk_color_selection_dialog_get_color_selection (GTK_COLOR_SELECTION_DIALOG (dialog))),
+#else
+                GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (dialog)->colorsel),
+#endif
+                color);
+#endif
             g_signal_emit (button, button_signals[COLOR_CHANGED], 0);
             break;
         default:
@@ -345,6 +475,11 @@ scim_anthy_color_button_open_color_dialog (ScimAnthyColorButton *button, gboolea
 static void
 scim_anthy_color_button_swap_color (ScimAnthyColorButton *button)
 {
+#if GTK_CHECK_VERSION(3, 0, 0)
+    GdkRGBA tmp = button->fg_color;
+    button->fg_color = button->bg_color;
+    button->bg_color = tmp;
+#else
     GdkColor tmp;
     tmp.red   = button->fg_color.red;
     tmp.green = button->fg_color.green;
@@ -357,6 +492,7 @@ scim_anthy_color_button_swap_color (ScimAnthyColorButton *button)
     button->bg_color.red   = tmp.red;
     button->bg_color.green = tmp.green;
     button->bg_color.blue  = tmp.blue;
+#endif
     g_signal_emit (button, button_signals[COLOR_CHANGED], 0);
 }
 
@@ -447,14 +583,29 @@ scim_anthy_color_button_get_colors (ScimAnthyColorButton *button,
 
     g_snprintf (fg_color_str, G_N_ELEMENTS (fg_color_str),
                 "#%02X%02X%02X", 
+#if GTK_CHECK_VERSION(3, 0, 0)
+                static_cast<unsigned int>(255*button->fg_color.red),
+                static_cast<unsigned int>(255*button->fg_color.green),
+                static_cast<unsigned int>(255*button->fg_color.blue)
+#else
                 ((button->fg_color.red)>>8),
                 ((button->fg_color.green)>>8),
-                ((button->fg_color.blue)>>8));
+                ((button->fg_color.blue)>>8)
+#endif
+                );
     g_snprintf (bg_color_str, G_N_ELEMENTS (bg_color_str),
                 "#%02X%02X%02X", 
+#if GTK_CHECK_VERSION(3, 0, 0)
+                static_cast<unsigned int>(255*button->bg_color.red),
+                static_cast<unsigned int>(255*button->bg_color.green),
+                static_cast<unsigned int>(255*button->bg_color.blue)
+#else
                 ((button->bg_color.red)>>8),
                 ((button->bg_color.green)>>8),
-                ((button->bg_color.blue)>>8));
+                ((button->bg_color.blue)>>8)
+#endif
+                );
+
     *fg_value = String (fg_color_str); 
     *bg_value = String (bg_color_str); 
 
@@ -466,6 +617,10 @@ scim_anthy_color_button_set_colors (ScimAnthyColorButton *button,
 				    const String &fg_value,
 				    const String &bg_value)
 {
+#if GTK_CHECK_VERSION(3, 0, 0)
+    gdk_rgba_parse (&button->fg_color, fg_value.c_str()); 
+    gdk_rgba_parse (&button->bg_color, bg_value.c_str()); 
+#else
     GdkColor fg_color, bg_color;
     gdk_color_parse (fg_value.c_str (), &fg_color);
     gdk_color_parse (bg_value.c_str (), &bg_color);
@@ -476,6 +631,7 @@ scim_anthy_color_button_set_colors (ScimAnthyColorButton *button,
     button->bg_color.red   = bg_color.red;
     button->bg_color.green = bg_color.green;
     button->bg_color.blue  = bg_color.blue;
+#endif
 
     return TRUE;
 }
diff --git a/src/scim_anthy_color_button.h b/src/scim_anthy_color_button.h
index f55083a..8d96ae7 100644
--- a/src/scim_anthy_color_button.h
+++ b/src/scim_anthy_color_button.h
@@ -53,8 +53,13 @@ struct _ScimAnthyColorButton
   gint             rect_height;
   gint             click_target;
 
+#if GTK_CHECK_VERSION(3, 0, 0)
+  GdkRGBA          fg_color;
+  GdkRGBA          bg_color;
+#else
   GdkColor         fg_color;
-  GdkColor	   bg_color;
+  GdkColor	       bg_color;
+#endif
 };
 
 struct _ScimAnthyColorButtonClass
diff --git a/src/scim_anthy_helper.cpp b/src/scim_anthy_helper.cpp
index 11955d8..196c542 100644
--- a/src/scim_anthy_helper.cpp
+++ b/src/scim_anthy_helper.cpp
@@ -218,9 +218,9 @@ slot_imengine_event (const HelperAgent *agent, int ic,
         if (!reader.get_data (id) || !reader.get_data (time_msec))
             break;
         TimeoutContext *ctx = new TimeoutContext (ic, uuid, id);
-        guint timeout_id = gtk_timeout_add_full (time_msec,
+        guint timeout_id = g_timeout_add_full (G_PRIORITY_DEFAULT,
+												 time_msec,
                                                  timeout_func,
-                                                 NULL,
                                                  (gpointer) ctx,
                                                  timeout_ctx_destroy_func);
         timeout_ids[ic][id] = timeout_id;
@@ -234,7 +234,7 @@ slot_imengine_event (const HelperAgent *agent, int ic,
             timeout_ids[ic].find (id) != timeout_ids[ic].end ())
         {
             guint tid = timeout_ids[ic][id];
-            gtk_timeout_remove (tid);
+            g_source_remove (tid);
         }
         break;
     }
@@ -406,8 +406,8 @@ run (const String &display, const ConfigPointer &config)
     char **argv = new char * [4];
     int    argc = 3;
 
-    argv [0] = "anthy-imengine-helper";
-    argv [1] = "--display";
+    argv [0] = const_cast<char*> ("anthy-imengine-helper");
+    argv [1] = const_cast<char*> ("--display");
     argv [2] = const_cast<char *> (display.c_str ());
     argv [3] = 0;
  
@@ -622,11 +622,17 @@ AnthyHelper::init (const ConfigPointer &config, const char *dsp)
     if (m_helper_window == NULL)
         return;
     gtk_window_set_default_size (GTK_WINDOW (m_helper_window), 100, 20);
+	/*
     gtk_window_set_policy (GTK_WINDOW (m_helper_window),
                            TRUE, TRUE, FALSE);
+	*/
     gtk_window_set_resizable (GTK_WINDOW (m_helper_window), FALSE);
 
+#if GTK_CHECK_VERSION(3, 0, 0)
+    m_helper_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+#else
     m_helper_vbox = gtk_vbox_new (FALSE, 0);
+#endif
     if (m_helper_vbox == NULL)
         return;
     gtk_container_add (GTK_CONTAINER (m_helper_window),
@@ -652,7 +658,11 @@ AnthyHelper::init (const ConfigPointer &config, const char *dsp)
 
     // lookup table
     m_lookup_table_visible = false;
+#if GTK_CHECK_VERSION(3, 0, 0)
+    m_lookup_table_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+#else
     m_lookup_table_vbox = gtk_vbox_new (TRUE, 0);
+#endif
     if (m_lookup_table_vbox == NULL)
         return;
     gtk_box_pack_end (GTK_BOX(m_helper_vbox),
@@ -666,8 +676,10 @@ AnthyHelper::init (const ConfigPointer &config, const char *dsp)
     if (m_note_window == NULL)
         return;
     gtk_window_set_default_size (GTK_WINDOW (m_note_window), 100, 20);
+	/*
     gtk_window_set_policy (GTK_WINDOW (m_note_window),
                            TRUE, TRUE, FALSE);
+	*/
     gtk_window_set_resizable (GTK_WINDOW (m_note_window), FALSE);
 
     m_note_event_box = gtk_event_box_new ();
@@ -1027,7 +1039,11 @@ AnthyHelper::hide_note ()
 
     m_note_visible = false;
 
+#if GTK_CHECK_VERSION(2, 24, 0)
+    gtk_widget_hide (m_note_window);
+#else
     gtk_widget_hide_all (m_note_window);
+#endif
 }
 
 void
diff --git a/src/scim_anthy_prefs.cpp b/src/scim_anthy_prefs.cpp
index 91aa8c0..49765e8 100644
--- a/src/scim_anthy_prefs.cpp
+++ b/src/scim_anthy_prefs.cpp
@@ -766,7 +766,7 @@ StringConfigData config_keyboards_edit [] =
         SCIM_ANTHY_CONFIG_RECONVERT_KEY_DEFAULT,
         N_("Reconvert"),
         N_("Select reconvert keys"),
-        N_("The key events to reconvert the commited string in selection. "),
+        N_("The key events to reconvert the committed string in selection. "),
         NULL,
         false,
     },
diff --git a/src/scim_anthy_setup.cpp b/src/scim_anthy_setup.cpp
index 26ee41e..d202d15 100644
--- a/src/scim_anthy_setup.cpp
+++ b/src/scim_anthy_setup.cpp
@@ -174,7 +174,10 @@ static GtkWidget   * __widget_key_filter_button     = NULL;
 static GtkWidget   * __widget_key_theme_menu        = NULL;
 static GtkWidget   * __widget_key_list_view         = NULL;
 static GtkWidget   * __widget_choose_keys_button    = NULL;
+#if GTK_CHECK_VERSION(3, 0, 0)
+#else
 static GtkTooltips * __widget_tooltips              = NULL;
+#endif
 
 static String __config_key_theme      = SCIM_ANTHY_CONFIG_KEY_THEME_DEFAULT;
 static String __config_key_theme_file = SCIM_ANTHY_CONFIG_KEY_THEME_FILE_DEFAULT;
@@ -298,7 +301,7 @@ static ComboConfigCandidate preedit_style[] =
 };
 
 
-static void     setup_key_theme_menu              (GtkOptionMenu *omenu);
+static void     setup_key_theme_menu              (GtkWidget *omenu);
 static void     setup_widget_value                (void);
 
 static void     on_default_editable_changed       (GtkEditable      *editable,
@@ -311,15 +314,15 @@ static void     on_default_key_selection_clicked  (GtkButton        *button,
                                                    gpointer          user_data);
 static void     on_default_combo_changed          (GtkEditable      *editable,
                                                    gpointer          user_data);
-static void     on_default_option_menu_changed    (GtkOptionMenu    *omenu,
+static void     on_default_option_menu_changed    (GtkWidget        *omenu,
                                                    gpointer          user_data);
-static void     on_preedit_style_menu_changed     (GtkOptionMenu    *omenu,
+static void     on_preedit_style_menu_changed     (GtkWidget        *omenu,
                                                    gpointer          user_data);
 static void     on_key_filter_selection_clicked   (GtkButton        *button,
                                                    gpointer          user_data);
 static void     on_dict_menu_label_toggled        (GtkToggleButton  *togglebutton,
                                                    gpointer          user_data);
-static void     on_key_category_menu_changed      (GtkOptionMenu    *omenu,
+static void     on_key_category_menu_changed      (GtkWidget        *omenu,
                                                    gpointer          user_data);
 static gboolean on_key_list_view_key_press        (GtkWidget        *widget,
                                                    GdkEventKey      *event,
@@ -327,7 +330,7 @@ static gboolean on_key_list_view_key_press        (GtkWidget        *widget,
 static gboolean on_key_list_view_button_press     (GtkWidget        *widget,
                                                    GdkEventButton   *event,
                                                    gpointer          user_data);
-static void     on_key_theme_menu_changed         (GtkOptionMenu    *omenu,
+static void     on_key_theme_menu_changed         (GtkWidget        *omenu,
                                                    gpointer          user_data);
 static void     on_key_list_selection_changed     (GtkTreeSelection *selection,
                                                    gpointer          data);
@@ -359,7 +362,11 @@ find_key_config_entry (const char *config_key)
 GtkWidget *
 create_subgroup_label (const char *text, GtkTable *table, gint idx)
 {
+#if GTK_CHECK_VERSION(3, 0, 0)
+    GtkWidget *hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+#else
     GtkWidget *hbox = gtk_hbox_new (FALSE, 0);
+#endif
     gtk_container_set_border_width (GTK_CONTAINER (hbox), 4);
     gtk_table_attach (GTK_TABLE (table), hbox,
                       0, 4, idx, idx + 1,
@@ -402,11 +409,18 @@ create_check_button (const char *config_key, GtkTable *table, int idx)
     g_object_set_data (G_OBJECT (entry->widget), "alignment-widget",
                        (gpointer) alignment);
 
+#if GTK_CHECK_VERSION(3, 0, 0)
+#else
     if (!__widget_tooltips)
         __widget_tooltips = gtk_tooltips_new();
+#endif
     if (entry->tooltip)
+#if GTK_CHECK_VERSION(3, 0, 0)
+        gtk_widget_set_tooltip_text (GTK_WIDGET (entry->widget), _(entry->tooltip));
+#else
         gtk_tooltips_set_tip (__widget_tooltips, GTK_WIDGET (entry->widget),
                               _(entry->tooltip), NULL);
+#endif
 
     return GTK_WIDGET (entry->widget);
 }
@@ -430,7 +444,11 @@ create_spin_button (const char *config_key, GtkTable *table, int idx)
     gtk_container_add (GTK_CONTAINER (alignment), label);
     gtk_widget_show (GTK_WIDGET (label));
 
+#if GTK_CHECK_VERSION(3, 0, 0)
+    GtkWidget *hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+#else
     GtkWidget *hbox = gtk_hbox_new (FALSE, 0);
+#endif
     gtk_table_attach (GTK_TABLE (table), GTK_WIDGET (hbox),
                       1, 2, idx, idx + 1,
                       (GtkAttachOptions) GTK_FILL,
@@ -463,11 +481,18 @@ create_spin_button (const char *config_key, GtkTable *table, int idx)
         gtk_widget_show (GTK_WIDGET (label));
     }
 
+#if GTK_CHECK_VERSION(3, 0, 0)
+#else
     if (!__widget_tooltips)
         __widget_tooltips = gtk_tooltips_new();
+#endif
     if (entry->tooltip)
+#if GTK_CHECK_VERSION(3, 0, 0)
+        gtk_widget_set_tooltip_text (GTK_WIDGET (entry->widget), _(entry->tooltip));
+#else
         gtk_tooltips_set_tip (__widget_tooltips, GTK_WIDGET (entry->widget),
                               _(entry->tooltip), NULL);
+#endif
 
     return GTK_WIDGET (entry->widget);
 }
@@ -508,11 +533,18 @@ create_entry (const char *config_key, GtkTable *table, int idx)
     g_object_set_data (G_OBJECT (entry->widget), "label-widget",
                        (gpointer) label);
 
+#if GTK_CHECK_VERSION(3, 0, 0)
+#else
     if (!__widget_tooltips)
         __widget_tooltips = gtk_tooltips_new();
+#endif
     if (entry->tooltip)
+#if GTK_CHECK_VERSION(3, 0, 0)
+        gtk_widget_set_tooltip_text (GTK_WIDGET (entry->widget), _(entry->tooltip));
+#else
         gtk_tooltips_set_tip (__widget_tooltips, GTK_WIDGET (entry->widget),
                               _(entry->tooltip), NULL);
+#endif
 
     return GTK_WIDGET (entry->widget);
 }
@@ -547,12 +579,31 @@ create_combo (const char *config_key, gpointer candidates_p,
     gtk_container_add (GTK_CONTAINER (alignment), label);
     gtk_widget_show (label);
 
+#if GTK_CHECK_VERSION(2, 4, 0)
+    entry->widget = gtk_combo_box_text_new_with_entry ();
+    GtkWidget *combo_box_entry = gtk_bin_get_child (GTK_BIN (entry->widget));
+    gtk_label_set_mnemonic_widget (GTK_LABEL (label), combo_box_entry);
+    gtk_editable_set_editable (GTK_EDITABLE (combo_box_entry), FALSE);
+
+    gtk_widget_show (GTK_WIDGET (entry->widget));
+    gtk_table_attach (GTK_TABLE (table), GTK_WIDGET (entry->widget),
+                      1, 2, idx, idx + 1,
+                      (GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
+                      (GtkAttachOptions) (GTK_FILL), 4, 4);
+    g_object_set_data (G_OBJECT (combo_box_entry),
+                       DATA_POINTER_KEY,
+                       (gpointer) candidates_p);
+
+    g_signal_connect (G_OBJECT (combo_box_entry), "changed",
+                      G_CALLBACK (on_default_combo_changed),
+                      entry);
+#else
     entry->widget = gtk_combo_new ();
     gtk_label_set_mnemonic_widget (GTK_LABEL (label),
                                    GTK_COMBO (entry->widget)->entry);
     gtk_combo_set_value_in_list (GTK_COMBO (entry->widget), TRUE, FALSE);
     gtk_combo_set_case_sensitive (GTK_COMBO (entry->widget), TRUE);
-    gtk_entry_set_editable (GTK_ENTRY (GTK_COMBO (entry->widget)->entry),
+    gtk_editable_set_editable (GTK_EDITABLE (GTK_COMBO (entry->widget)->entry),
                             FALSE);
     gtk_widget_show (GTK_WIDGET (entry->widget));
     gtk_table_attach (GTK_TABLE (table), GTK_WIDGET (entry->widget),
@@ -566,18 +617,27 @@ create_combo (const char *config_key, gpointer candidates_p,
     g_signal_connect ((gpointer) GTK_COMBO (entry->widget)->entry, "changed",
                       G_CALLBACK (on_default_combo_changed),
                       entry);
+#endif
 
     g_object_set_data (G_OBJECT (entry->widget), "alignment-widget",
                        (gpointer) alignment);
     g_object_set_data (G_OBJECT (entry->widget), "label-widget",
                        (gpointer) label);
 
+#if GTK_CHECK_VERSION(3, 0, 0)
+#else
     if (!__widget_tooltips)
         __widget_tooltips = gtk_tooltips_new();
+#endif
     if (entry->tooltip)
+#if GTK_CHECK_VERSION(3, 0, 0)
+        gtk_widget_set_tooltip_text (
+            gtk_bin_get_child (GTK_BIN (entry->widget)), _(entry->tooltip));
+#else
         gtk_tooltips_set_tip (__widget_tooltips,
                               GTK_WIDGET (GTK_COMBO (entry->widget)->entry),
                               _(entry->tooltip), NULL);
+#endif
 
     return GTK_WIDGET (entry->widget);
 }
@@ -604,6 +664,29 @@ create_option_menu (const char *config_key, gpointer candidates_p,
     gtk_container_add (GTK_CONTAINER (alignment), label);
     gtk_widget_show (label);
 
+#if GTK_CHECK_VERSION(2, 4, 0)
+    entry->widget = gtk_combo_box_text_new ();
+    gtk_label_set_mnemonic_widget (GTK_LABEL (label),
+                                   GTK_WIDGET (entry->widget));
+    gtk_widget_show (GTK_WIDGET (entry->widget));
+    gtk_table_attach (GTK_TABLE (table), GTK_WIDGET (entry->widget),
+                      1, 2, idx, idx + 1,
+                      (GtkAttachOptions) (GTK_FILL),
+                      (GtkAttachOptions) (GTK_FILL), 4, 4);
+    g_object_set_data (G_OBJECT (entry->widget),
+                       DATA_POINTER_KEY,
+                       (gpointer) candidates_p);
+
+    for (unsigned int i = 0; data[i].label; i++) {
+        gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (entry->widget), _(data[i].label));
+    }
+
+    gtk_combo_box_set_active (GTK_COMBO_BOX (entry->widget), 0);
+
+    g_signal_connect (G_OBJECT (entry->widget), "changed",
+                      G_CALLBACK (on_default_option_menu_changed),
+                      entry);
+#else
     entry->widget = gtk_option_menu_new ();
     gtk_label_set_mnemonic_widget (GTK_LABEL (label),
                                    GTK_WIDGET (entry->widget));
@@ -631,17 +714,25 @@ create_option_menu (const char *config_key, gpointer candidates_p,
     g_signal_connect ((gpointer) GTK_OPTION_MENU (entry->widget), "changed",
                       G_CALLBACK (on_default_option_menu_changed),
                       entry);
+#endif
 
     g_object_set_data (G_OBJECT (entry->widget), "alignment-widget",
                        (gpointer) alignment);
     g_object_set_data (G_OBJECT (entry->widget), "label-widget",
                        (gpointer) label);
 
+#if GTK_CHECK_VERSION(3, 0, 0)
+#else
     if (!__widget_tooltips)
         __widget_tooltips = gtk_tooltips_new();
+#endif
     if (entry->tooltip)
+#if GTK_CHECK_VERSION(3, 0, 0)
+        gtk_widget_set_tooltip_text (GTK_WIDGET (entry->widget), _(entry->tooltip));
+#else
         gtk_tooltips_set_tip (__widget_tooltips, GTK_WIDGET (entry->widget),
                               _(entry->tooltip), NULL);
+#endif
 
     return GTK_WIDGET (entry->widget);
 }
@@ -671,7 +762,11 @@ create_color_button (const char *config_key)
     if (!entry)
         return NULL;
 
+#if GTK_CHECK_VERSION(3, 0, 0)
+    GtkWidget *hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+#else
     GtkWidget *hbox = gtk_hbox_new (FALSE, 0);
+#endif
     gtk_container_set_border_width (GTK_CONTAINER (hbox), 4);
     gtk_widget_show (hbox);
 
@@ -695,11 +790,18 @@ create_color_button (const char *config_key)
         gtk_label_set_mnemonic_widget (GTK_LABEL (label),
                                        GTK_WIDGET (entry->widget));
 
+#if GTK_CHECK_VERSION(3, 0, 0)
+#else
     if (!__widget_tooltips)
         __widget_tooltips = gtk_tooltips_new();
+#endif
     if (entry->tooltip)
+#if GTK_CHECK_VERSION(3, 0, 0)
+        gtk_widget_set_tooltip_text (GTK_WIDGET (entry->widget), _(entry->tooltip));
+#else
         gtk_tooltips_set_tip (__widget_tooltips, GTK_WIDGET (entry->widget),
                               _(entry->tooltip), NULL);
+#endif
 
     return hbox;
 }
@@ -782,9 +884,15 @@ key_list_view_popup_key_selection (GtkTreeView *treeview)
                 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
                                     COLUMN_VALUE, data->value.c_str(),
                                     -1);
+#if GTK_CHECK_VERSION(2, 4, 0)
+                gtk_combo_box_set_active(
+                    GTK_COMBO_BOX (__widget_key_theme_menu),
+                    KEY_THEME_INDEX_USER_DEFINED);
+#else
                 gtk_option_menu_set_history (
                     GTK_OPTION_MENU (__widget_key_theme_menu),
                     KEY_THEME_INDEX_USER_DEFINED);
+#endif
                 data->changed = true;
                 __config_changed = true;
             }
@@ -799,7 +907,11 @@ create_common_page (void)
 {
     GtkWidget *vbox, *table, *widget, *label;
 
+#if GTK_CHECK_VERSION(3, 0, 0)
+    vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+#else
     vbox = gtk_vbox_new (FALSE, 0);
+#endif
     gtk_container_set_border_width (GTK_CONTAINER(vbox), 8);
     gtk_widget_show (vbox);
 
@@ -866,7 +978,11 @@ create_symbols_page (void)
 {
     GtkWidget *vbox, *table, *widget;
 
+#if GTK_CHECK_VERSION(3, 0, 0)
+    vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+#else
     vbox = gtk_vbox_new (FALSE, 0);
+#endif
     gtk_container_set_border_width (GTK_CONTAINER(vbox), 8);
     gtk_widget_show (vbox);
 
@@ -907,11 +1023,19 @@ create_keyboard_page (void)
 {
     GtkWidget *vbox, *hbox;
 
+#if GTK_CHECK_VERSION(3, 0, 0)
+    vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+#else
     vbox = gtk_vbox_new (FALSE, 0);
+#endif
     gtk_container_set_border_width (GTK_CONTAINER(vbox), 8);
     gtk_widget_show (vbox);
 
+#if GTK_CHECK_VERSION(3, 0, 0)
+    hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+#else
     hbox = gtk_hbox_new (FALSE, 0);
+#endif
     gtk_container_set_border_width (GTK_CONTAINER (hbox), 4);
     gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
     gtk_widget_show(hbox);
@@ -921,6 +1045,28 @@ create_keyboard_page (void)
     gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 2);
     gtk_widget_show (label);
 
+#if GTK_CHECK_VERSION(2, 4, 0)
+    GtkWidget *omenu = gtk_combo_box_text_new ();
+    __widget_key_categories_menu = omenu;
+    gtk_box_pack_start (GTK_BOX (hbox), omenu, FALSE, FALSE, 2);
+    gtk_widget_show (omenu);
+
+    gtk_label_set_mnemonic_widget (GTK_LABEL (label), omenu);
+
+    gtk_combo_box_text_append_text
+        (GTK_COMBO_BOX_TEXT (omenu),
+        _("All"));
+
+    for (unsigned int i = 0; i < __key_conf_pages_num; i++) {
+        gtk_combo_box_text_append_text
+            (GTK_COMBO_BOX_TEXT (omenu),
+            _(__key_conf_pages[i].label));
+    }
+
+    gtk_combo_box_text_append_text
+        (GTK_COMBO_BOX_TEXT (omenu),
+        _("Search by key"));
+#else
     GtkWidget *omenu = gtk_option_menu_new ();
     __widget_key_categories_menu = omenu;
     gtk_box_pack_start (GTK_BOX (hbox), omenu, FALSE, FALSE, 2);
@@ -948,10 +1094,11 @@ create_keyboard_page (void)
 
     gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu);
     gtk_widget_show (menu);
+#endif
 
     GtkWidget *entry = gtk_entry_new ();
     __widget_key_filter = entry;
-    gtk_entry_set_editable (GTK_ENTRY (entry), FALSE);
+    gtk_editable_set_editable (GTK_EDITABLE (entry), FALSE);
     gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 2);
     gtk_widget_show(entry);
 
@@ -963,7 +1110,11 @@ create_keyboard_page (void)
     gtk_widget_show (button);
 
     // key bindings label
+#if GTK_CHECK_VERSION(3, 0, 0)
+    hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+#else
     hbox = gtk_hbox_new (FALSE, 0);
+#endif
     gtk_container_set_border_width (GTK_CONTAINER (hbox), 4);
     gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
     gtk_widget_show(hbox);
@@ -1033,7 +1184,11 @@ create_keyboard_page (void)
     g_signal_connect (G_OBJECT (selection), "changed",
                       G_CALLBACK (on_key_list_selection_changed), treeview);
 
+#if GTK_CHECK_VERSION(3, 0, 0)
+    hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+#else
     hbox = gtk_hbox_new (FALSE, 0);
+#endif
     gtk_container_set_border_width (GTK_CONTAINER (hbox), 4);
     gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
     gtk_widget_show(hbox);
@@ -1043,7 +1198,11 @@ create_keyboard_page (void)
     gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 2);
     gtk_widget_show (label);
 
+#if GTK_CHECK_VERSION(2, 4, 0)
+    omenu = gtk_combo_box_text_new ();
+#else
     omenu = gtk_option_menu_new ();
+#endif
     __widget_key_theme_menu = omenu;
     g_signal_connect (G_OBJECT (omenu), "changed",
                       G_CALLBACK (on_key_theme_menu_changed), NULL);
@@ -1072,7 +1231,11 @@ create_learning_page ()
 {
     GtkWidget *vbox, *table, *widget, *label;
 
+#if GTK_CHECK_VERSION(3, 0, 0)
+    vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+#else
     vbox = gtk_vbox_new (FALSE, 0);
+#endif
     gtk_container_set_border_width (GTK_CONTAINER(vbox), 8);
     gtk_widget_show (vbox);
 
@@ -1123,7 +1286,7 @@ create_learning_page ()
         StringConfigData *entry = entries[i];
         widget = create_entry (entry->key, GTK_TABLE (table), i + 5);
         set_left_padding (widget, 20);
-        gtk_entry_set_editable (GTK_ENTRY (widget), FALSE);
+        gtk_editable_set_editable (GTK_EDITABLE (widget), FALSE);
         create_key_select_button (entry->key, GTK_TABLE (table), i + 5);
     }
 
@@ -1187,7 +1350,11 @@ create_candidates_window_page (void)
 {
     GtkWidget *vbox, *widget, *widget2, *table;
 
+#if GTK_CHECK_VERSION(3, 0, 0)
+    vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+#else
     vbox = gtk_vbox_new (FALSE, 0);
+#endif
     gtk_container_set_border_width (GTK_CONTAINER(vbox), 8);
     gtk_widget_show (vbox);
 
@@ -1235,7 +1402,11 @@ create_toolbar_page (void)
 {
     GtkWidget *vbox, *table, /* *hbox, *label,*/ *widget;
 
+#if GTK_CHECK_VERSION(3, 0, 0)
+    vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+#else
     vbox = gtk_vbox_new (FALSE, 0);
+#endif
     gtk_container_set_border_width (GTK_CONTAINER(vbox), 8);
     gtk_widget_show (vbox);
 
@@ -1273,7 +1444,11 @@ create_toolbar_page (void)
                       NULL);
 
 #if 0
+#if GTK_CHECK_VERSION(3, 0, 0)
+    hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+#else
     hbox = gtk_hbox_new (FALSE, 0);
+#endif
     gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
     gtk_widget_show (hbox);
     label = gtk_label_new ("    ");
@@ -1299,7 +1474,11 @@ create_colors_page (void)
 {
     GtkWidget *vbox, *table, *omenu, *widget, *hbox; 
 
+#if GTK_CHECK_VERSION(3, 0, 0)
+    vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+#else
     vbox = gtk_vbox_new (FALSE, 0);
+#endif
     gtk_container_set_border_width (GTK_CONTAINER(vbox), 8);
     gtk_widget_show (vbox);
 
@@ -1312,7 +1491,11 @@ create_colors_page (void)
                                 &preedit_style, GTK_TABLE (table), 0);
 
     /* preedit color */
+#if GTK_CHECK_VERSION(3, 0, 0)
+    hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+#else
     hbox = gtk_hbox_new (FALSE, 0);
+#endif
     gtk_widget_show (hbox);
     widget = create_color_button (SCIM_ANTHY_CONFIG_PREEDIT_FG_COLOR);
     gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
@@ -1321,15 +1504,24 @@ create_colors_page (void)
                       (GtkAttachOptions) (GTK_FILL), 4, 4);
     gtk_widget_set_sensitive (hbox, FALSE);
 
+#if GTK_CHECK_VERSION(2, 4, 0)
+    g_signal_connect (G_OBJECT (omenu), "changed",
+                      G_CALLBACK (on_preedit_style_menu_changed), hbox);
+#else
     g_signal_connect ((gpointer) GTK_OPTION_MENU (omenu), "changed",
                       G_CALLBACK (on_preedit_style_menu_changed), hbox);
+#endif
 
     /* conversion style */
     omenu = create_option_menu (SCIM_ANTHY_CONFIG_CONVERSION_STYLE,
                                 &preedit_style, GTK_TABLE (table), 1);
 
     /* conversion color */
+#if GTK_CHECK_VERSION(3, 0, 0)
+    hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+#else
     hbox = gtk_hbox_new (FALSE, 0);
+#endif
     gtk_widget_show (hbox);
     widget = create_color_button (SCIM_ANTHY_CONFIG_CONVERSION_FG_COLOR);
     gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
@@ -1338,15 +1530,24 @@ create_colors_page (void)
                       (GtkAttachOptions) (GTK_FILL), 4, 4);
     gtk_widget_set_sensitive (hbox, FALSE);
 
+#if GTK_CHECK_VERSION(2, 4, 0)
+    g_signal_connect (G_OBJECT (omenu), "changed",
+                      G_CALLBACK (on_preedit_style_menu_changed), hbox);
+#else
     g_signal_connect ((gpointer) GTK_OPTION_MENU (omenu), "changed",
                       G_CALLBACK (on_preedit_style_menu_changed), hbox);
+#endif
 
     /* selected segment style */
     omenu = create_option_menu (SCIM_ANTHY_CONFIG_SELECTED_SEGMENT_STYLE,
                                 &preedit_style, GTK_TABLE (table), 2);
 
     /* selected segment color */
+#if GTK_CHECK_VERSION(3, 0, 0)
+    hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+#else
     hbox = gtk_hbox_new (FALSE, 0);
+#endif
     gtk_widget_show (hbox);
     widget = create_color_button (SCIM_ANTHY_CONFIG_SELECTED_SEGMENT_FG_COLOR);
     gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
@@ -1355,8 +1556,13 @@ create_colors_page (void)
                       (GtkAttachOptions) (GTK_FILL), 4, 4);
     gtk_widget_set_sensitive (hbox, FALSE);
 
+#if GTK_CHECK_VERSION(2, 4, 0)
+    g_signal_connect (G_OBJECT (omenu), "changed",
+                      G_CALLBACK (on_preedit_style_menu_changed), hbox);
+#else
     g_signal_connect ((gpointer) GTK_OPTION_MENU (omenu), "changed",
                       G_CALLBACK (on_preedit_style_menu_changed), hbox);
+#endif
 
     return vbox;
 }
@@ -1367,7 +1573,11 @@ create_about_page ()
     GtkWidget *vbox, *label;
     gchar str[256];
 
+#if GTK_CHECK_VERSION(3, 0, 0)
+    vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+#else
     vbox = gtk_vbox_new (FALSE, 0);
+#endif
     gtk_widget_show (vbox);
 
     g_snprintf (
@@ -1483,8 +1693,23 @@ create_setup_window (void)
 }
 
 static void
-setup_combo_value (GtkCombo *combo, const String & str)
+setup_combo_value (GtkWidget *combo, const String & str)
 {
+#if GTK_CHECK_VERSION(2, 4, 0)
+    ComboConfigCandidate *data
+        = static_cast<ComboConfigCandidate*>
+        (g_object_get_data (G_OBJECT (gtk_bin_get_child (GTK_BIN (combo))),
+                            DATA_POINTER_KEY));
+
+    gint default_index = -1;
+    for (unsigned int i = 0; data[i].label; i++) {
+        gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), _(data[i].label));
+        if (!strcmp (data[i].data, str.c_str ()))
+            default_index = i;
+    }
+    if (default_index != -1)
+        gtk_combo_box_set_active (GTK_COMBO_BOX (combo), default_index);
+#else
     GList *list = NULL;
     const char *defval = NULL;
 
@@ -1504,10 +1729,11 @@ setup_combo_value (GtkCombo *combo, const String & str)
 
     if (defval)
         gtk_entry_set_text (GTK_ENTRY (combo->entry), defval);
+#endif
 }
 
 static void
-setup_option_menu_value (GtkOptionMenu *omenu, const String & str)
+setup_option_menu_value (GtkWidget *omenu, const String & str)
 {
     ComboConfigCandidate *data
         = static_cast<ComboConfigCandidate*>
@@ -1515,15 +1741,55 @@ setup_option_menu_value (GtkOptionMenu *omenu, const String & str)
 
     for (unsigned int i = 0; data[i].label; i++) {
         if (!strcmp (data[i].data, str.c_str ())) {
+#if GTK_CHECK_VERSION(2, 4, 0)
+            gtk_combo_box_set_active (GTK_COMBO_BOX (omenu), i);
+#else
             gtk_option_menu_set_history (omenu, i);
+#endif
             return;
         }
     }
 }
 
 static void
-setup_key_theme_menu (GtkOptionMenu *omenu)
+setup_key_theme_menu (GtkWidget *omenu)
 {
+#if GTK_CHECK_VERSION(2, 4, 0)
+    gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (omenu), _("User defined"));
+    gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (omenu), _("Default"));
+
+    gint active_index = KEY_THEME_INDEX_DEFAULT;
+    bool check_list = false;
+    if (__config_key_theme_file == __user_style_file.get_file_name () ||
+        __config_key_theme      == __user_style_file.get_title ()) {
+        active_index = KEY_THEME_INDEX_USER_DEFINED;
+    } else {
+        check_list = true;
+    }
+
+    StyleFiles::iterator it;
+    gint i;
+    for (i = 0, it = __style_list.begin ();
+         it != __style_list.end ();
+         i++, it++)
+    {
+        const char *section_name = "KeyBindings";
+        StyleLines section;
+        if (!it->get_entry_list (section, section_name))
+            continue;
+
+        gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (omenu), _(it->get_title().c_str()));
+
+        if (check_list) {
+            if (it->get_file_name () == __config_key_theme_file) {
+                active_index = i + 2; // 2: user-define + default
+                check_list = false;
+            }
+        }
+    }
+
+    gtk_combo_box_set_active (GTK_COMBO_BOX (omenu), active_index);
+#else
     GtkWidget *menu = gtk_menu_new ();
     gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu),
                               menu);
@@ -1587,6 +1853,7 @@ setup_key_theme_menu (GtkOptionMenu *omenu)
     g_signal_handlers_unblock_by_func (G_OBJECT (omenu),
                                        (gpointer) (on_key_theme_menu_changed),
                                        NULL);
+#endif
 }
 
 static void
@@ -1608,11 +1875,19 @@ setup_widget_value (void)
 
     for (unsigned int i = 0; config_string_common[i].key; i++) {
         StringConfigData &entry = config_string_common[i];
+#if GTK_CHECK_VERSION(2, 4, 0)
+        if (entry.widget && GTK_IS_COMBO_BOX (entry.widget)) {
+#else
         if (entry.widget && GTK_IS_OPTION_MENU (entry.widget)) {
-            setup_option_menu_value (GTK_OPTION_MENU (entry.widget),
-                                     entry.value);
+#endif
+            setup_option_menu_value (GTK_WIDGET (entry.widget), entry.value);
+
+#if GTK_CHECK_VERSION(2, 4, 0)
+        } else if (entry.widget && GTK_IS_COMBO_BOX (entry.widget)) {
+#else
         } else if (entry.widget && GTK_IS_COMBO (entry.widget)) {
-            setup_combo_value (GTK_COMBO (entry.widget), entry.value);
+#endif
+            setup_combo_value (GTK_WIDGET (entry.widget), entry.value);
         } else if (entry.widget && GTK_IS_ENTRY (entry.widget)) {
             gtk_entry_set_text (GTK_ENTRY (entry.widget),
                                 entry.value.c_str ());
@@ -1637,9 +1912,15 @@ setup_widget_value (void)
         }
     }
 
+#if GTK_CHECK_VERSION(2, 4, 0)
+    gtk_combo_box_set_active
+        (GTK_COMBO_BOX (__widget_key_categories_menu),
+         KEY_CATEGORY_INDEX_ALL);
+#else
     gtk_option_menu_set_history
         (GTK_OPTION_MENU (__widget_key_categories_menu),
          KEY_CATEGORY_INDEX_ALL);
+#endif
     GtkTreeView *treeview = GTK_TREE_VIEW (__widget_key_list_view);
     GtkListStore *store = GTK_LIST_STORE (gtk_tree_view_get_model (treeview));
     gtk_list_store_clear (store);
@@ -1649,7 +1930,7 @@ setup_widget_value (void)
     gtk_widget_set_sensitive (__widget_key_filter_button, FALSE);
 
     // setup option menu
-    setup_key_theme_menu (GTK_OPTION_MENU (__widget_key_theme_menu));
+    setup_key_theme_menu (__widget_key_theme_menu);
 }
 
 bool operator < (const StyleFile &left, const StyleFile &right)
@@ -1950,7 +2231,7 @@ on_default_combo_changed (GtkEditable *editable,
 }
 
 static void
-on_default_option_menu_changed (GtkOptionMenu *omenu, gpointer user_data)
+on_default_option_menu_changed (GtkWidget *omenu, gpointer user_data)
 {
     StringConfigData *entry = static_cast<StringConfigData*> (user_data);
     ComboConfigCandidate *data = static_cast<ComboConfigCandidate*>
@@ -1961,7 +2242,11 @@ on_default_option_menu_changed (GtkOptionMenu *omenu, gpointer user_data)
     if (!data) return;
 
     for (int i = 0; data[i].label; i++) {
-        if (i == gtk_option_menu_get_history (omenu)) {
+#if GTK_CHECK_VERSION(2, 4, 0)
+        if (i == gtk_combo_box_get_active (GTK_COMBO_BOX (omenu))) {
+#else
+        if (i == gtk_option_menu_get_history (GTK_OPTION_MENU (omenu))) {
+#endif
             entry->value     = data[i].data;
             entry->changed   = true;
             __config_changed = true;
@@ -1971,11 +2256,15 @@ on_default_option_menu_changed (GtkOptionMenu *omenu, gpointer user_data)
 }
 
 static void
-on_preedit_style_menu_changed (GtkOptionMenu *omenu, gpointer user_data)
+on_preedit_style_menu_changed (GtkWidget *omenu, gpointer user_data)
 {
     GtkWidget *widget = GTK_WIDGET (user_data);
 
-    gint idx = gtk_option_menu_get_history (omenu);
+#if GTK_CHECK_VERSION(2, 4, 0)
+    gint idx = gtk_combo_box_get_active (GTK_COMBO_BOX (omenu));
+#else
+    gint idx = gtk_option_menu_get_history (GTK_OPTION_MENU (omenu));
+#endif
 
     for (int i = 0; preedit_style[i].data && i <= idx; i++) {
         if (i == idx &&
@@ -2007,14 +2296,18 @@ on_dict_menu_label_toggled (GtkToggleButton *togglebutton,
 }
 
 static void
-on_key_category_menu_changed (GtkOptionMenu *omenu, gpointer user_data)
+on_key_category_menu_changed (GtkWidget *omenu, gpointer user_data)
 {
     GtkTreeView *treeview = GTK_TREE_VIEW (user_data);
     GtkListStore *store = GTK_LIST_STORE (gtk_tree_view_get_model (treeview));
 
     gtk_list_store_clear (store);
 
-    gint idx = gtk_option_menu_get_history (omenu);
+#if GTK_CHECK_VERSION(2, 4, 0)
+    gint idx = gtk_combo_box_get_active (GTK_COMBO_BOX (omenu));
+#else
+    gint idx = gtk_option_menu_get_history (GTK_OPTION_MENU (omenu));
+#endif
 
     bool use_filter = false;
 
@@ -2041,9 +2334,13 @@ on_key_category_menu_changed (GtkOptionMenu *omenu, gpointer user_data)
 }
 
 static void
-on_key_theme_menu_changed (GtkOptionMenu *omenu, gpointer user_data)
+on_key_theme_menu_changed (GtkWidget *omenu, gpointer user_data)
 {
-    gint idx = gtk_option_menu_get_history (omenu);
+#if GTK_CHECK_VERSION(2, 4, 0)
+    gint idx = gtk_combo_box_get_active (GTK_COMBO_BOX (omenu));
+    gint theme_idx = idx - 2; // user definad and default
+#else
+    gint idx = gtk_option_menu_get_history (GTK_OPTION_MENU (omenu));
     GtkWidget *menu = gtk_option_menu_get_menu (omenu);
     GList *list = gtk_container_get_children (GTK_CONTAINER (menu));
     GtkWidget *menuitem = GTK_WIDGET (g_list_nth_data (list, idx));
@@ -2053,6 +2350,7 @@ on_key_theme_menu_changed (GtkOptionMenu *omenu, gpointer user_data)
 
     gint theme_idx = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (menuitem),
                                                          INDEX_KEY));
+#endif
 
     // clear all key bindings
     if (idx != 0) {
@@ -2104,9 +2402,15 @@ on_key_theme_menu_changed (GtkOptionMenu *omenu, gpointer user_data)
 
     // sync widgets
     if (idx != KEY_THEME_INDEX_USER_DEFINED) {
+#if GTK_CHECK_VERSION(2, 4, 0)
+        gtk_combo_box_set_active
+            (GTK_COMBO_BOX (__widget_key_categories_menu),
+             KEY_CATEGORY_INDEX_ALL);
+#else
         gtk_option_menu_set_history
             (GTK_OPTION_MENU (__widget_key_categories_menu),
              KEY_CATEGORY_INDEX_ALL);
+#endif
         gtk_widget_set_sensitive (__widget_key_filter, FALSE);
         gtk_widget_set_sensitive (__widget_key_filter_button, FALSE);
         GtkTreeModel *model;
@@ -2171,8 +2475,13 @@ on_key_list_view_key_press (GtkWidget *widget, GdkEventKey *event,
     GtkTreeView *treeview = GTK_TREE_VIEW (widget);
 
     switch (event->keyval) {
+#if GTK_CHECK_VERSION(3, 0, 0)
+    case GDK_KEY_Return:
+    case GDK_KEY_KP_Enter:
+#else
     case GDK_Return:
     case GDK_KP_Enter:
+#endif
         key_list_view_popup_key_selection (treeview);
         break;
     }
diff --git a/src/scim_anthy_setup_kana.cpp b/src/scim_anthy_setup_kana.cpp
index 0b71746..a0f8a13 100644
--- a/src/scim_anthy_setup_kana.cpp
+++ b/src/scim_anthy_setup_kana.cpp
@@ -65,15 +65,15 @@ static GtkWidget *create_kana_window                 (GtkWindow            *pare
 static GtkWidget *create_nicola_window               (GtkWindow            *parent);
 
 static void     setup_kana_page                      (void);
-static void     setup_kana_layout_menu               (GtkOptionMenu        *omenu);
-static void     setup_nicola_layout_menu             (GtkOptionMenu        *omenu);
+static void     setup_kana_layout_menu               (GtkWidget *omenu);
+static void     setup_nicola_layout_menu             (GtkWidget *omenu);
 static void     setup_kana_window_value              (ScimAnthyTableEditor *editor);
 static void     setup_nicola_window_value            (ScimAnthyTableEditor *editor);
 
 static bool     load_kana_layout                     (void);
 static bool     load_nicola_layout                   (void);
 
-static void     on_kana_layout_menu_changed          (GtkOptionMenu        *omenu,
+static void     on_kana_layout_menu_changed          (GtkWidget *omenu,
                                                       gpointer              user_data);
 static void     on_kana_customize_button_clicked     (GtkWidget            *button,
                                                       gpointer              data);
@@ -85,7 +85,7 @@ static void     on_kana_table_editor_remove_entry    (ScimAnthyTableEditor *edit
                                                       gpointer              data);
 static void     on_kana_table_editor_removed_entry   (ScimAnthyTableEditor *editor,
                                                       gpointer              data);
-static void     on_nicola_layout_menu_changed        (GtkOptionMenu        *omenu,
+static void     on_nicola_layout_menu_changed        (GtkWidget *omenu,
                                                       gpointer              user_data);
 static void     on_nicola_customize_button_clicked   (GtkWidget            *button,
                                                       gpointer              data);
@@ -103,7 +103,11 @@ kana_page_create_ui (void)
 {
     GtkWidget *vbox, *hbox, *label;
 
+#if GTK_CHECK_VERSION(3, 0, 0)
+    vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+#else
     vbox = gtk_vbox_new (FALSE, 0);
+#endif
     gtk_container_set_border_width (GTK_CONTAINER(vbox), 8);
     gtk_widget_show (vbox);
 
@@ -130,12 +134,20 @@ kana_page_create_ui (void)
     gtk_container_add (GTK_CONTAINER (alignment), label);
     gtk_widget_show (label);
 
+#if GTK_CHECK_VERSION(3, 0, 0)
+    hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+#else
     hbox = gtk_hbox_new (FALSE, 0);
+#endif
     gtk_container_set_border_width (GTK_CONTAINER (hbox), 4);
     gtk_table_attach_defaults (GTK_TABLE (table), hbox, 1, 4, 1, 2);
     gtk_widget_show(hbox);
 
+#if GTK_CHECK_VERSION(2, 4, 0)
+    GtkWidget *omenu = gtk_combo_box_text_new ();
+#else
     GtkWidget *omenu = gtk_option_menu_new ();
+#endif
     __widget_kana_layout_menu = omenu;
     g_signal_connect (G_OBJECT (omenu), "changed",
                       G_CALLBACK (on_kana_layout_menu_changed), NULL);
@@ -181,12 +193,20 @@ kana_page_create_ui (void)
     gtk_container_add (GTK_CONTAINER (alignment), label);
     gtk_widget_show (label);
 
+#if GTK_CHECK_VERSION(3, 0, 0)
+    hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+#else
     hbox = gtk_hbox_new (FALSE, 0);
+#endif
     gtk_container_set_border_width (GTK_CONTAINER (hbox), 4);
     gtk_table_attach_defaults (GTK_TABLE (table), hbox, 1, 4, 4, 5);
     gtk_widget_show(hbox);
 
+#if GTK_CHECK_VERSION(2, 4, 0)
+    omenu = gtk_combo_box_text_new ();
+#else
     omenu = gtk_option_menu_new ();
+#endif
     __widget_nicola_layout_menu = omenu;
     g_signal_connect (G_OBJECT (omenu), "changed",
                       G_CALLBACK (on_nicola_layout_menu_changed), NULL);
@@ -202,7 +222,11 @@ kana_page_create_ui (void)
     gtk_widget_show (button);
 
     /* thumb shift keys */
+#if GTK_CHECK_VERSION(3, 0, 0)
+    hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+#else
     hbox = gtk_hbox_new (FALSE, 0);
+#endif
     gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
     gtk_widget_show (hbox);
 
@@ -210,7 +234,7 @@ kana_page_create_ui (void)
     GtkWidget *widget = create_entry (SCIM_ANTHY_CONFIG_LEFT_THUMB_SHIFT_KEY,
                                       GTK_TABLE (table), 5);
     set_left_padding (widget, 20);
-    gtk_entry_set_editable (GTK_ENTRY (widget), FALSE);
+    gtk_editable_set_editable (GTK_EDITABLE (widget), FALSE);
     widget = create_key_select_button (SCIM_ANTHY_CONFIG_LEFT_THUMB_SHIFT_KEY,
                                        GTK_TABLE (table), 5);
 
@@ -218,7 +242,7 @@ kana_page_create_ui (void)
     widget = create_entry (SCIM_ANTHY_CONFIG_RIGHT_THUMB_SHIFT_KEY,
                            GTK_TABLE (table), 6);
     set_left_padding (widget, 20);
-    gtk_entry_set_editable (GTK_ENTRY (widget), FALSE);
+    gtk_editable_set_editable (GTK_EDITABLE (widget), FALSE);
     widget = create_key_select_button (SCIM_ANTHY_CONFIG_RIGHT_THUMB_SHIFT_KEY,
                                        GTK_TABLE (table), 6);
 
@@ -279,27 +303,50 @@ create_kana_window (GtkWindow *parent)
                           _("Customize Kana Layout Table"));
 
     // option menu area
+#if GTK_CHECK_VERSION(3, 0, 0)
+    GtkWidget *hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+#else
     GtkWidget *hbox = gtk_hbox_new (FALSE, 0);
+#endif
     gtk_container_set_border_width (GTK_CONTAINER (hbox), 4);
+#if GTK_CHECK_VERSION(3, 0, 0)
+    gtk_box_pack_start
+		(GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))),
+		 hbox, FALSE, FALSE, 0);
+    gtk_box_reorder_child 
+		(GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))),
+		 hbox, 0);
+#else
     gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox,
                         FALSE, FALSE, 0);
     gtk_box_reorder_child (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox, 0);
+#endif
     gtk_widget_show(hbox);
 
     GtkWidget *label = gtk_label_new_with_mnemonic (_("Layout _table:"));
     gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 2);
     gtk_widget_show (label);
 
+#if GTK_CHECK_VERSION(2, 4, 0)
+    GtkWidget *omenu = gtk_combo_box_text_new ();
+#else
     GtkWidget *omenu = gtk_option_menu_new ();
+#endif
     __widget_kana_layout_menu2 = omenu;
     g_object_add_weak_pointer (G_OBJECT (omenu),
                                (gpointer*) &__widget_kana_layout_menu2);
     gtk_box_pack_start (GTK_BOX (hbox), omenu, FALSE, FALSE, 2);
-    setup_kana_layout_menu (GTK_OPTION_MENU (omenu));
+    setup_kana_layout_menu (omenu);
+#if GTK_CHECK_VERSION(2, 4, 0)
+    gtk_combo_box_set_active (
+		GTK_COMBO_BOX (omenu),
+		gtk_combo_box_get_active (GTK_COMBO_BOX (__widget_kana_layout_menu)));
+#else
     gtk_option_menu_set_history
         (GTK_OPTION_MENU (omenu),
          gtk_option_menu_get_history (
              GTK_OPTION_MENU (__widget_kana_layout_menu)));
+#endif
     gtk_widget_show (omenu);
 
     gtk_label_set_mnemonic_widget (GTK_LABEL(label), omenu);
@@ -351,27 +398,50 @@ create_nicola_window (GtkWindow *parent)
                           _("Customize Thumb Shift Layout Table"));
 
     // option menu area
+#if GTK_CHECK_VERSION(3, 0, 0)
+    GtkWidget *hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+#else
     GtkWidget *hbox = gtk_hbox_new (FALSE, 0);
+#endif
     gtk_container_set_border_width (GTK_CONTAINER (hbox), 4);
+#if GTK_CHECK_VERSION(3, 0, 0)
+    gtk_box_pack_start
+		(GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))),
+		 hbox, FALSE, FALSE, 0);
+    gtk_box_reorder_child 
+		(GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))),
+		 hbox, 0);
+#else
     gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox,
                         FALSE, FALSE, 0);
     gtk_box_reorder_child (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox, 0);
+#endif
     gtk_widget_show(hbox);
 
     GtkWidget *label = gtk_label_new_with_mnemonic (_("Layout _table:"));
     gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 2);
     gtk_widget_show (label);
 
+#if GTK_CHECK_VERSION(2, 4, 0)
+    GtkWidget *omenu = gtk_combo_box_text_new ();
+#else
     GtkWidget *omenu = gtk_option_menu_new ();
+#endif
     __widget_nicola_layout_menu2 = omenu;
     g_object_add_weak_pointer (G_OBJECT (omenu),
                                (gpointer*) &__widget_nicola_layout_menu2);
     gtk_box_pack_start (GTK_BOX (hbox), omenu, FALSE, FALSE, 2);
-    setup_nicola_layout_menu (GTK_OPTION_MENU (omenu));
+    setup_nicola_layout_menu (omenu);
+#if GTK_CHECK_VERSION(2, 4, 0)
+    gtk_combo_box_set_active (
+		GTK_COMBO_BOX (omenu),
+		gtk_combo_box_get_active (GTK_COMBO_BOX (__widget_nicola_layout_menu)));
+#else
     gtk_option_menu_set_history
         (GTK_OPTION_MENU (omenu),
          gtk_option_menu_get_history (
              GTK_OPTION_MENU (__widget_nicola_layout_menu)));
+#endif
     gtk_widget_show (omenu);
 
     gtk_label_set_mnemonic_widget (GTK_LABEL(label), omenu);
@@ -406,13 +476,48 @@ create_nicola_window (GtkWindow *parent)
 static void
 setup_kana_page (void)
 {
-    setup_kana_layout_menu (GTK_OPTION_MENU (__widget_kana_layout_menu));
-    setup_nicola_layout_menu (GTK_OPTION_MENU (__widget_nicola_layout_menu));
+    setup_kana_layout_menu (__widget_kana_layout_menu);
+    setup_nicola_layout_menu (__widget_nicola_layout_menu);
 }
 
 static void
-setup_kana_layout_menu (GtkOptionMenu *omenu)
+setup_kana_layout_menu (GtkWidget *omenu)
 {
+#if GTK_CHECK_VERSION(2, 4, 0)
+    gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (omenu), _("User defined"));
+    gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (omenu), _("Default"));
+
+    gint active_index = KANA_LAYOUT_INDEX_DEFAULT;
+    bool check_list = false;
+    if (__config_kana_layout_file == __user_style_file.get_file_name ()) {
+        active_index = KANA_LAYOUT_INDEX_USER_DEFINED;
+    } else {
+        check_list = true;
+    }
+
+    StyleFiles::iterator it;
+    gint i;
+    for (i = 0, it = __style_list.begin ();
+         it != __style_list.end ();
+         i++, it++)
+    {
+        StyleLines section;
+        if (!it->get_entry_list (section, __kana_fund_table))
+            continue;
+
+		gtk_combo_box_text_append_text 
+			(GTK_COMBO_BOX_TEXT (omenu), _(it->get_title().c_str()));
+
+        if (check_list) {
+            if (it->get_file_name () == __config_kana_layout_file) {
+                active_index = i + 2; // 2: user-define + default
+                check_list = false;
+            }
+        }
+    }
+
+    gtk_combo_box_set_active (GTK_COMBO_BOX (omenu), active_index);
+#else
     GtkWidget *menu = gtk_menu_new ();
     gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu),
                               menu);
@@ -475,11 +580,47 @@ setup_kana_layout_menu (GtkOptionMenu *omenu)
         G_OBJECT (omenu),
         (gpointer) (on_kana_layout_menu_changed),
         NULL);
+#endif
 }
 
 static void
-setup_nicola_layout_menu (GtkOptionMenu *omenu)
+setup_nicola_layout_menu (GtkWidget *omenu)
 {
+#if GTK_CHECK_VERSION(2, 4, 0)
+	gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (omenu), _("User defined"));
+	gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (omenu), _("Default"));
+
+    gint active_index = NICOLA_LAYOUT_INDEX_DEFAULT;
+    bool check_list = false;
+    if (__config_nicola_layout_file == __user_style_file.get_file_name ()) {
+        active_index = NICOLA_LAYOUT_INDEX_USER_DEFINED;
+    } else {
+        check_list = true;
+    }
+
+    StyleFiles::iterator it;
+    gint i;
+    for (i = 0, it = __style_list.begin ();
+         it != __style_list.end ();
+         i++, it++)
+    {
+        StyleLines section;
+        if (!it->get_entry_list (section, __nicola_fund_table))
+            continue;
+
+		gtk_combo_box_text_append_text (
+			GTK_COMBO_BOX_TEXT (omenu), _(it->get_title().c_str()));
+
+        if (check_list) {
+            if (it->get_file_name () == __config_nicola_layout_file) {
+                active_index = i + 2; // 2: user-define + default
+                check_list = false;
+            }
+        }
+    }
+
+    gtk_combo_box_set_active (GTK_COMBO_BOX (omenu), active_index);
+#else
     GtkWidget *menu = gtk_menu_new ();
     gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu),
                               menu);
@@ -542,6 +683,7 @@ setup_nicola_layout_menu (GtkOptionMenu *omenu)
         G_OBJECT (omenu),
         (gpointer) (on_nicola_layout_menu_changed),
         NULL);
+#endif
 }
 
 static void
@@ -656,6 +798,10 @@ setup_default_nicola_table (void)
 static bool
 load_kana_layout (void)
 {
+#if GTK_CHECK_VERSION(2, 4, 0)
+    gint idx = gtk_combo_box_get_active (GTK_COMBO_BOX (__widget_kana_layout_menu));
+    gint theme_idx = idx - 2; // user definad and default
+#else
     GtkOptionMenu *omenu = GTK_OPTION_MENU (__widget_kana_layout_menu);
     gint idx = gtk_option_menu_get_history (omenu);
     GtkWidget *menu = gtk_option_menu_get_menu (omenu);
@@ -667,6 +813,7 @@ load_kana_layout (void)
 
     gint theme_idx = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (menuitem),
                                                          INDEX_KEY));
+#endif
 
     // set new kana table
     if (idx == KANA_LAYOUT_INDEX_USER_DEFINED) {
@@ -716,6 +863,10 @@ load_kana_layout (void)
 static bool
 load_nicola_layout (void)
 {
+#if GTK_CHECK_VERSION(2, 4, 0)
+    gint idx = gtk_combo_box_get_active (GTK_COMBO_BOX (__widget_nicola_layout_menu));
+    gint theme_idx = idx - 2; // user definad and default
+#else
     GtkOptionMenu *omenu = GTK_OPTION_MENU (__widget_nicola_layout_menu);
     gint idx = gtk_option_menu_get_history (omenu);
     GtkWidget *menu = gtk_option_menu_get_menu (omenu);
@@ -727,6 +878,7 @@ load_nicola_layout (void)
 
     gint theme_idx = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (menuitem),
                                                          INDEX_KEY));
+#endif
 
     // set new NICOLA table
     if (idx == NICOLA_LAYOUT_INDEX_USER_DEFINED) {
@@ -794,7 +946,7 @@ has_voiced_consonant (String str)
 }
 
 static void
-on_kana_layout_menu_changed (GtkOptionMenu *omenu, gpointer user_data)
+on_kana_layout_menu_changed (GtkWidget *omenu, gpointer user_data)
 {
     bool success;
 
@@ -803,9 +955,15 @@ on_kana_layout_menu_changed (GtkOptionMenu *omenu, gpointer user_data)
             G_OBJECT (__widget_kana_layout_menu),
             (gpointer) (on_kana_layout_menu_changed),
             NULL);
+#if GTK_CHECK_VERSION(2, 4, 0)
+        gtk_combo_box_set_active (
+            GTK_COMBO_BOX (__widget_kana_layout_menu),
+            gtk_combo_box_get_active (GTK_COMBO_BOX (omenu)));
+#else
         gtk_option_menu_set_history (
             GTK_OPTION_MENU (__widget_kana_layout_menu),
-            gtk_option_menu_get_history (omenu));
+            gtk_option_menu_get_history (GTK_OPTION_MENU (omenu)));
+#endif
         g_signal_handlers_unblock_by_func (
             G_OBJECT (__widget_kana_layout_menu),
             (gpointer) (on_kana_layout_menu_changed),
@@ -853,9 +1011,15 @@ static void
 on_kana_table_editor_added_entry (ScimAnthyTableEditor *editor, gpointer data)
 {
     // change menu item to "User defined"
+#if GTK_CHECK_VERSION(2, 4, 0)
+    gtk_combo_box_set_active (
+        GTK_COMBO_BOX (__widget_kana_layout_menu2),
+        KANA_LAYOUT_INDEX_USER_DEFINED);
+#else
     gtk_option_menu_set_history (
         GTK_OPTION_MENU (__widget_kana_layout_menu2),
         KANA_LAYOUT_INDEX_USER_DEFINED);
+#endif
 
     __style_changed = true;
 }
@@ -874,15 +1038,21 @@ static void
 on_kana_table_editor_removed_entry (ScimAnthyTableEditor *editor, gpointer data)
 {
     // change menu item to "User deined"
+#if GTK_CHECK_VERSION(2, 4, 0)
+    gtk_combo_box_set_active (
+        GTK_COMBO_BOX (__widget_kana_layout_menu2),
+        KANA_LAYOUT_INDEX_USER_DEFINED);
+#else
     gtk_option_menu_set_history (
         GTK_OPTION_MENU (__widget_kana_layout_menu2),
         KANA_LAYOUT_INDEX_USER_DEFINED);
+#endif
 
     __style_changed = true;
 }
 
 static void
-on_nicola_layout_menu_changed (GtkOptionMenu *omenu, gpointer user_data)
+on_nicola_layout_menu_changed (GtkWidget *omenu, gpointer user_data)
 {
     bool success;
 
@@ -891,9 +1061,15 @@ on_nicola_layout_menu_changed (GtkOptionMenu *omenu, gpointer user_data)
             G_OBJECT (__widget_nicola_layout_menu),
             (gpointer) (on_nicola_layout_menu_changed),
             NULL);
+#if GTK_CHECK_VERSION(2, 4, 0)
+        gtk_combo_box_set_active (
+            GTK_COMBO_BOX (__widget_nicola_layout_menu),
+            gtk_combo_box_get_active (GTK_COMBO_BOX (omenu)));
+#else
         gtk_option_menu_set_history (
             GTK_OPTION_MENU (__widget_nicola_layout_menu),
-            gtk_option_menu_get_history (omenu));
+            gtk_option_menu_get_history (GTK_OPTION_MENU (omenu)));
+#endif 
         g_signal_handlers_unblock_by_func (
             G_OBJECT (__widget_nicola_layout_menu),
             (gpointer) (on_nicola_layout_menu_changed),
@@ -937,9 +1113,15 @@ static void
 on_nicola_table_editor_added_entry (ScimAnthyTableEditor *editor, gpointer data)
 {
     // change menu item to "User defined"
+#if GTK_CHECK_VERSION(2, 4, 0)
+    gtk_combo_box_set_active (
+        GTK_COMBO_BOX (__widget_nicola_layout_menu2),
+        NICOLA_LAYOUT_INDEX_USER_DEFINED);
+#else
     gtk_option_menu_set_history (
         GTK_OPTION_MENU (__widget_nicola_layout_menu2),
         NICOLA_LAYOUT_INDEX_USER_DEFINED);
+#endif
 
     __style_changed = true;
 }
@@ -958,9 +1140,15 @@ static void
 on_nicola_table_editor_removed_entry (ScimAnthyTableEditor *editor, gpointer data)
 {
     // change menu item to "User deined"
+#if GTK_CHECK_VERSION(2, 4, 0)
+    gtk_combo_box_set_active (
+        GTK_COMBO_BOX (__widget_nicola_layout_menu2),
+        NICOLA_LAYOUT_INDEX_USER_DEFINED);
+#else
     gtk_option_menu_set_history (
         GTK_OPTION_MENU (__widget_nicola_layout_menu2),
         NICOLA_LAYOUT_INDEX_USER_DEFINED);
+#endif
 
     __style_changed = true;
 }
diff --git a/src/scim_anthy_setup_romaji.cpp b/src/scim_anthy_setup_romaji.cpp
index 9041736..d5a84a5 100644
--- a/src/scim_anthy_setup_romaji.cpp
+++ b/src/scim_anthy_setup_romaji.cpp
@@ -55,14 +55,14 @@ static String __config_romaji_theme_file = SCIM_ANTHY_CONFIG_ROMAJI_THEME_FILE_D
 static GtkWidget *create_romaji_window            (GtkWindow            *parent);
 
 static void     setup_romaji_page                 (void);
-static void     setup_romaji_theme_menu           (GtkOptionMenu        *omenu);
+static void     setup_romaji_theme_menu           (GtkWidget *omenu);
 static void     setup_romaji_window_value         (ScimAnthyTableEditor *editor);
 
 static bool     load_romaji_theme                 (void);
 
 static void     on_romaji_pseudo_ascii_mode_toggled(GtkToggleButton *togglebutton,
                                                     gpointer         user_data);
-static void     on_romaji_theme_menu_changed       (GtkOptionMenu        *omenu,
+static void     on_romaji_theme_menu_changed       (GtkWidget *omenu,
                                                     gpointer              user_data);
 static void     on_romaji_customize_button_clicked (GtkWidget            *button,
                                                     gpointer              data);
@@ -80,7 +80,11 @@ romaji_page_create_ui (void)
 {
     GtkWidget *vbox, *hbox, *table, *widget, *label;
 
+#if GTK_CHECK_VERSION(3, 0, 0)
+    vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+#else
     vbox = gtk_vbox_new (FALSE, 0);
+#endif
     gtk_container_set_border_width (GTK_CONTAINER(vbox), 8);
     gtk_widget_show (vbox);
 
@@ -115,7 +119,11 @@ romaji_page_create_ui (void)
     on_romaji_pseudo_ascii_mode_toggled (GTK_TOGGLE_BUTTON (widget), NULL);
 
     /* romaji table */
+#if GTK_CHECK_VERSION(3, 0, 0)
+    hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+#else
     hbox = gtk_hbox_new (FALSE, 0);
+#endif
     gtk_container_set_border_width (GTK_CONTAINER (hbox), 4);
     gtk_table_attach (GTK_TABLE (table), hbox,
                       0, 4, 5, 6,
@@ -128,7 +136,11 @@ romaji_page_create_ui (void)
     gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 2);
     gtk_widget_show (label);
 
+#if GTK_CHECK_VERSION(2, 4, 0)
+    GtkWidget *omenu = gtk_combo_box_text_new ();
+#else
     GtkWidget *omenu = gtk_option_menu_new ();
+#endif
     __widget_romaji_theme_menu = omenu;
     g_signal_connect (G_OBJECT (omenu), "changed",
                       G_CALLBACK (on_romaji_theme_menu_changed), NULL);
@@ -188,27 +200,52 @@ create_romaji_window (GtkWindow *parent)
                           _("Customize Romaji Table"));
 
     // option menu area
+#if GTK_CHECK_VERSION(3, 0, 0)
+    GtkWidget *hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+#else
     GtkWidget *hbox = gtk_hbox_new (FALSE, 0);
+#endif
+
     gtk_container_set_border_width (GTK_CONTAINER (hbox), 4);
+
+#if GTK_CHECK_VERSION(3, 0, 0)
+    gtk_box_pack_start
+		(GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))),
+		 hbox, FALSE, FALSE, 0);
+    gtk_box_reorder_child 
+		(GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))),
+		 hbox, 0);
+#else
     gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox,
                         FALSE, FALSE, 0);
     gtk_box_reorder_child (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox, 0);
+#endif
+
     gtk_widget_show(hbox);
 
     GtkWidget *label = gtk_label_new_with_mnemonic (_("Romaji _table:"));
     gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 2);
     gtk_widget_show (label);
 
+#if GTK_CHECK_VERSION(2, 4, 0)
+    GtkWidget *omenu = gtk_combo_box_text_new ();
+#else
     GtkWidget *omenu = gtk_option_menu_new ();
+#endif
     __widget_romaji_theme_menu2 = omenu;
     g_object_add_weak_pointer (G_OBJECT (omenu),
                                (gpointer*) &__widget_romaji_theme_menu2);
     gtk_box_pack_start (GTK_BOX (hbox), omenu, FALSE, FALSE, 2);
-    setup_romaji_theme_menu (GTK_OPTION_MENU (omenu));
+    setup_romaji_theme_menu (omenu);
+#if GTK_CHECK_VERSION(2, 4, 0)
+    gtk_combo_box_set_active (GTK_COMBO_BOX (omenu),
+         gtk_combo_box_get_active (GTK_COMBO_BOX (__widget_romaji_theme_menu)));
+#else
     gtk_option_menu_set_history
         (GTK_OPTION_MENU (omenu),
          gtk_option_menu_get_history (
              GTK_OPTION_MENU (__widget_romaji_theme_menu)));
+#endif
     gtk_widget_show (omenu);
 
     gtk_label_set_mnemonic_widget (GTK_LABEL(label), omenu);
@@ -243,12 +280,47 @@ create_romaji_window (GtkWindow *parent)
 static void
 setup_romaji_page (void)
 {
-    setup_romaji_theme_menu (GTK_OPTION_MENU (__widget_romaji_theme_menu));
+    setup_romaji_theme_menu (__widget_romaji_theme_menu);
 }
 
 static void
-setup_romaji_theme_menu (GtkOptionMenu *omenu)
+setup_romaji_theme_menu (GtkWidget *omenu)
 {
+#if GTK_CHECK_VERSION(2, 4, 0)
+	gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (omenu), _("User defined"));
+	gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (omenu), _("Default"));
+
+	gint active_index = ROMAJI_THEME_INDEX_DEFAULT;
+    bool check_list = false;
+    if (__config_romaji_theme_file == __user_style_file.get_file_name ()) {
+		active_index = ROMAJI_THEME_INDEX_USER_DEFINED;
+	} else {
+        check_list = true;
+	}
+
+    StyleFiles::iterator it;
+    unsigned int i;
+    for (i = 0, it = __style_list.begin ();
+         it != __style_list.end ();
+         i++, it++)
+    {
+        StyleLines section;
+        if (!it->get_entry_list (section, __romaji_fund_table))
+            continue;
+
+		gtk_combo_box_text_append_text 
+			(GTK_COMBO_BOX_TEXT (omenu), _(it->get_title().c_str()));
+
+        if (check_list) {
+            if (it->get_file_name () == __config_romaji_theme_file) {
+                active_index = i + 2; // 2: user-define + default
+                check_list = false;
+			}
+		}
+    }
+
+    gtk_combo_box_set_active (GTK_COMBO_BOX (omenu), active_index);
+#else
     GtkWidget *menu = gtk_menu_new ();
     gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu),
                               menu);
@@ -311,6 +383,7 @@ setup_romaji_theme_menu (GtkOptionMenu *omenu)
         G_OBJECT (omenu),
         (gpointer) (on_romaji_theme_menu_changed),
         NULL);
+#endif
 }
 
 static void
@@ -370,6 +443,11 @@ setup_default_romaji_table (void)
 static bool
 load_romaji_theme (void)
 {
+#if GTK_CHECK_VERSION(2, 4, 0)
+    GtkWidget *omenu = __widget_romaji_theme_menu;
+    gint idx = gtk_combo_box_get_active (GTK_COMBO_BOX (omenu));
+	gint theme_idx = idx - 2; // 2: user-defined + default
+#else
     GtkOptionMenu *omenu = GTK_OPTION_MENU (__widget_romaji_theme_menu);
     gint idx = gtk_option_menu_get_history (omenu);
     GtkWidget *menu = gtk_option_menu_get_menu (omenu);
@@ -381,6 +459,7 @@ load_romaji_theme (void)
 
     gint theme_idx = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (menuitem),
                                                          INDEX_KEY));
+#endif
 
     // set new romaji table
     if (idx == ROMAJI_THEME_INDEX_USER_DEFINED) {
@@ -440,7 +519,7 @@ on_romaji_pseudo_ascii_mode_toggled (GtkToggleButton *togglebutton,
 }
 
 static void
-on_romaji_theme_menu_changed (GtkOptionMenu *omenu, gpointer user_data)
+on_romaji_theme_menu_changed (GtkWidget *omenu, gpointer user_data)
 {
     bool success;
 
@@ -449,9 +528,15 @@ on_romaji_theme_menu_changed (GtkOptionMenu *omenu, gpointer user_data)
             G_OBJECT (__widget_romaji_theme_menu),
             (gpointer) (on_romaji_theme_menu_changed),
             NULL);
+#if GTK_CHECK_VERSION(2, 4, 0)
+        gtk_combo_box_set_active (
+            GTK_COMBO_BOX (__widget_romaji_theme_menu),
+            gtk_combo_box_get_active (GTK_COMBO_BOX (omenu)));
+#else
         gtk_option_menu_set_history (
             GTK_OPTION_MENU (__widget_romaji_theme_menu),
-            gtk_option_menu_get_history (omenu));
+            gtk_option_menu_get_history (GTK_OPTION_MENU (omenu)));
+#endif
         g_signal_handlers_unblock_by_func (
             G_OBJECT (__widget_romaji_theme_menu),
             (gpointer) (on_romaji_theme_menu_changed),
@@ -495,9 +580,15 @@ static void
 on_table_editor_added_entry (ScimAnthyTableEditor *editor, gpointer data)
 {
     // change menu item to "User defined"
+#if GTK_CHECK_VERSION(2, 4, 0)
+    gtk_combo_box_set_active (
+        GTK_COMBO_BOX (__widget_romaji_theme_menu2),
+        ROMAJI_THEME_INDEX_USER_DEFINED);
+#else
     gtk_option_menu_set_history (
         GTK_OPTION_MENU (__widget_romaji_theme_menu2),
         ROMAJI_THEME_INDEX_USER_DEFINED);
+#endif
 
     __style_changed = true;
 }
@@ -518,9 +609,15 @@ static void
 on_table_editor_removed_entry (ScimAnthyTableEditor *editor, gpointer data)
 {
     // change menu item to "User deined"
+#if GTK_CHECK_VERSION(2, 4, 0)
+    gtk_combo_box_set_active (
+        GTK_COMBO_BOX (__widget_romaji_theme_menu2),
+        ROMAJI_THEME_INDEX_USER_DEFINED);
+#else
     gtk_option_menu_set_history (
         GTK_OPTION_MENU (__widget_romaji_theme_menu2),
         ROMAJI_THEME_INDEX_USER_DEFINED);
+#endif
 
     __style_changed = true;
 }
diff --git a/src/scim_anthy_table_editor.cpp b/src/scim_anthy_table_editor.cpp
index fb3c040..7b25415 100644
--- a/src/scim_anthy_table_editor.cpp
+++ b/src/scim_anthy_table_editor.cpp
@@ -131,10 +131,20 @@ scim_anthy_table_editor_init (ScimAnthyTableEditor *editor)
     gtk_window_set_position (GTK_WINDOW (editor),
                              GTK_WIN_POS_CENTER_ON_PARENT);
 
+#if GTK_CHECK_VERSION(3, 0, 0)
+    GtkWidget *hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+#else
     GtkWidget *hbox = gtk_hbox_new (FALSE, 0);
+#endif
     gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
+#if GTK_CHECK_VERSION(3, 0, 0)
+    gtk_box_pack_start
+		(GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (editor))),
+		 hbox, TRUE, TRUE, 0);
+#else
     gtk_box_pack_start (GTK_BOX (GTK_DIALOG (editor)->vbox), hbox,
                         TRUE, TRUE, 0);
+#endif
     gtk_widget_show (hbox);
 
     GtkWidget *label = gtk_label_new_with_mnemonic (_("Table _entries:"));
@@ -142,10 +152,20 @@ scim_anthy_table_editor_init (ScimAnthyTableEditor *editor)
     gtk_widget_show (label);
 
     // edit area
+#if GTK_CHECK_VERSION(3, 0, 0)
+    hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+#else
     hbox = gtk_hbox_new (FALSE, 0);
+#endif
     gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
+#if GTK_CHECK_VERSION(3, 0, 0)
+    gtk_box_pack_start
+		(GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (editor))),
+		 hbox, TRUE, TRUE, 0);
+#else
     gtk_box_pack_start (GTK_BOX (GTK_DIALOG (editor)->vbox), hbox,
                         TRUE, TRUE, 0);
+#endif
     gtk_widget_show (hbox);
 
     // tree view area
@@ -174,7 +194,11 @@ scim_anthy_table_editor_init (ScimAnthyTableEditor *editor)
     gtk_tree_view_set_headers_clickable (GTK_TREE_VIEW (treeview), TRUE);
 
     // button area
+#if GTK_CHECK_VERSION(3, 0, 0)
+    GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+#else
     GtkWidget *vbox = gtk_vbox_new (FALSE, 0);
+#endif
     editor->button_area = vbox;
     gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 5);
     gtk_widget_show (vbox);
diff --git a/src/scim_anthy_tray.cpp b/src/scim_anthy_tray.cpp
index f8e277a..62a1890 100644
--- a/src/scim_anthy_tray.cpp
+++ b/src/scim_anthy_tray.cpp
@@ -60,8 +60,11 @@ AnthyTray::AnthyTray ()
       m_wide_latin_pixbuf  (NULL),
       m_direct_pixbuf      (NULL),
       m_input_mode_menu    (NULL),
-      m_general_menu       (NULL),
-      m_tooltips           (NULL)
+      m_general_menu       (NULL)
+#if GTK_CHECK_VERSION(2, 12, 0)
+#else
+      ,m_tooltips           (NULL)
+#endif
 {
 }
 
@@ -87,8 +90,15 @@ AnthyTray::~AnthyTray ()
 
         gtk_widget_destroy (m_input_mode_menu);
 
+#if GTK_CHECK_VERSION(2, 24, 0)
+        gtk_widget_destroy (GTK_WIDGET (m_tray));
+#else
         gtk_object_destroy (GTK_OBJECT (m_tray));
+#endif
+#if GTK_CHECK_VERSION(2, 12, 0)
+#else
         gtk_object_destroy (GTK_OBJECT (m_tooltips));
+#endif
     }
 }
 
@@ -260,11 +270,16 @@ AnthyTray::create_general_menu (PropertyList &props)
             gtk_misc_set_alignment (GTK_MISC (item_label),
                                     0.0, 0.5); // to left
 
+#if GTK_CHECK_VERSION(2, 12, 0)
+            gtk_widget_set_tooltip_text (item, tip.c_str());
+#else
             if (m_tooltips == NULL)
                 m_tooltips = gtk_tooltips_new ();
 
             gtk_tooltips_set_tip (m_tooltips, item,
                                   tip.c_str(), tip.c_str());
+#endif
+
             gtk_container_add (GTK_CONTAINER (item),
                                item_label);
             g_object_set_data (G_OBJECT (item),
@@ -289,11 +304,15 @@ AnthyTray::create_general_menu (PropertyList &props)
             gtk_misc_set_alignment (GTK_MISC (item_label),
                                     0.0, 0.5); // to left
 
+#if GTK_CHECK_VERSION(2, 12, 0)
+            gtk_widget_set_tooltip_text (item, tip.c_str ());
+#else
             if (m_tooltips == NULL)
                 m_tooltips = gtk_tooltips_new ();
 
             gtk_tooltips_set_tip (m_tooltips, item,
                                   tip.c_str (), tip.c_str ());
+#endif
             gtk_container_add (GTK_CONTAINER (item),
                                item_label);
             g_object_set_data (G_OBJECT (item),
@@ -332,8 +351,12 @@ AnthyTray::update_general_menu (Property &prop)
     GtkWidget *item = find_menu_item (m_general_menu, key);
     GtkWidget *item_label = gtk_bin_get_child (GTK_BIN (item));
 
+#if GTK_CHECK_VERSION(2, 12, 0)
+    gtk_widget_set_tooltip_text (item, tip.c_str ());
+#else
     gtk_tooltips_set_tip (m_tooltips, item,
                           tip.c_str (), tip.c_str ());
+#endif
     gtk_label_set_text (GTK_LABEL (item_label), label.c_str ());
 }
 
@@ -414,26 +437,60 @@ AnthyTray::destroy_general_menu (void)
 static gboolean
 transparent_expose_event (GtkWidget *widget, GdkEventExpose *event)
 {
-  gdk_window_clear_area (widget->window, event->area.x, event->area.y,
-                         event->area.width, event->area.height);
+#if GTK_CHECK_VERSION(3, 0, 0)
+  // FIXME
+#else
+  gdk_window_clear_area (
+#if GTK_CHECK_VERSION(2, 14, 0)
+	gtk_widget_get_window (widget),
+#else
+	widget->window,
+#endif
+	event->area.x, event->area.y,
+	event->area.width, event->area.height);
+#endif
   return FALSE;
 }
 
 static void
 make_transparent_again (GtkWidget *widget, GtkStyle *previous_style)
 {
-  gdk_window_set_back_pixmap (widget->window, NULL, TRUE);
+#if GTK_CHECK_VERSION(3, 0, 0)
+  // FIXME
+#else
+  gdk_window_set_back_pixmap (
+#if GTK_CHECK_VERSION(2, 14, 0)
+	gtk_widget_get_window (widget),
+#else
+	widget->window,
+#endif
+	NULL, TRUE);
+#endif
 }
 
 static void
 make_transparent (GtkWidget *widget)
 {
+#if GTK_CHECK_VERSION(2, 18, 0)
+  if (!gtk_widget_get_has_window (widget) || gtk_widget_get_app_paintable (widget))
+#else
   if (GTK_WIDGET_NO_WINDOW (widget) || GTK_WIDGET_APP_PAINTABLE (widget))
+#endif
     return;
 
   gtk_widget_set_app_paintable (widget, TRUE);
   gtk_widget_set_double_buffered (widget, FALSE);
-  gdk_window_set_back_pixmap (widget->window, NULL, TRUE);
+#if GTK_CHECK_VERSION(3, 0, 0)
+  // FIXME
+#else
+  gdk_window_set_back_pixmap (
+#if GTK_CHECK_VERSION(2, 14, 0)
+	gtk_widget_get_window (widget),
+#else
+	widget->window,
+#endif
+	NULL, TRUE);
+#endif
   g_signal_connect (widget, "expose_event",
                     G_CALLBACK (transparent_expose_event), NULL);
   g_signal_connect (widget, "style_set",
@@ -443,8 +500,11 @@ make_transparent (GtkWidget *widget)
 void
 AnthyTray::create_tray (void)
 {
+#if GTK_CHECK_VERSION(2, 12, 0)
+#else
     if (m_tooltips == NULL)
         m_tooltips = gtk_tooltips_new ();
+#endif
 
     // input mode menu
     m_input_mode_menu = gtk_menu_new ();
@@ -481,8 +541,12 @@ AnthyTray::create_tray (void)
         
         gtk_misc_set_alignment (GTK_MISC (item_label),
                                 0.0, 0.5); // to left
+#if GTK_CHECK_VERSION(2, 12, 0)
+        gtk_widget_set_tooltip_text (item, props[i].tips);
+#else
         gtk_tooltips_set_tip (m_tooltips, item,
                               props[i].tips, props[i].tips);
+#endif
         gtk_container_add (GTK_CONTAINER (item),
                            item_label);
         gtk_menu_shell_append (GTK_MENU_SHELL (m_input_mode_menu),
@@ -508,8 +572,12 @@ AnthyTray::create_tray (void)
     m_tray_button = gtk_button_new ();
     gtk_button_set_relief (GTK_BUTTON (m_tray_button),
                            GTK_RELIEF_NONE);
+#if GTK_CHECK_VERSION(2, 12, 0)
+    gtk_widget_set_tooltip_text (m_tray_button, _("Input mode"));
+#else
     gtk_tooltips_set_tip (m_tooltips, m_tray_button,
                           _("Input mode"), _("Input mode"));
+#endif
     g_signal_connect (G_OBJECT (m_tray_button), "button-release-event",
                       G_CALLBACK (popup), this);
     gtk_container_add (GTK_CONTAINER (m_tray), m_tray_button);
@@ -532,8 +600,12 @@ AnthyTray::create_tray (void)
     m_tray_event_box = gtk_event_box_new ();
     g_signal_connect (G_OBJECT (m_tray_event_box), "realize",
                       G_CALLBACK (make_transparent), NULL);
+#if GTK_CHECK_VERSION(2, 12, 0)
+    gtk_widget_set_tooltip_text(m_tray_event_box, _("Input mode"));
+#else
     gtk_tooltips_set_tip (m_tooltips, m_tray_event_box,
                           _("Input mode"), _("Input mode"));
+#endif
     g_signal_connect (G_OBJECT (m_tray_event_box), "button-release-event",
                       G_CALLBACK (popup), this);
     gtk_container_add (GTK_CONTAINER (m_tray), m_tray_event_box);
diff --git a/src/scim_anthy_tray.h b/src/scim_anthy_tray.h
index 6305fd0..7dd1ca5 100644
--- a/src/scim_anthy_tray.h
+++ b/src/scim_anthy_tray.h
@@ -96,7 +96,10 @@ private:
     GtkWidget                   *m_input_mode_menu;
     GtkWidget                   *m_general_menu;
 
+#if GTK_CHECK_VERSION(2, 12, 0)
+#else
     GtkTooltips                 *m_tooltips;
+#endif
 };
 
 #endif /* __SCIM_ANTHY_TRAY_H__ */
