summaryrefslogtreecommitdiff
path: root/setup
diff options
context:
space:
mode:
authorfujiwarat <takao.fujiwara1@gmail.com>2014-01-30 17:33:33 +0900
committerfujiwarat <takao.fujiwara1@gmail.com>2014-01-30 17:33:33 +0900
commit2e8e2bef7a7943ed351278c2f6c601339abd4d54 (patch)
tree702155a2687952da2b18d029e5154ea829643877 /setup
parent85330465240ba6a028c92290d74ef05dcb5d7cb9 (diff)
downloadibus-anthy-2e8e2bef7a7943ed351278c2f6c601339abd4d54.tar.gz
Added python3.
The default is to use 'python' and --with-python option can change it. ./configure --with-python=python3
Diffstat (limited to 'setup')
-rw-r--r--setup/Makefile.am104
l---------setup/_config.py.in1
-rw-r--r--setup/python2/Makefile.am116
l---------setup/python2/_config.py.in1
-rw-r--r--setup/python2/anthyprefs.py.in (renamed from setup/anthyprefs.py.in)0
-rw-r--r--setup/python2/ibus-setup-anthy.desktop.in.in (renamed from setup/ibus-setup-anthy.desktop.in.in)0
-rw-r--r--setup/python2/ibus-setup-anthy.in (renamed from setup/ibus-setup-anthy.in)0
-rw-r--r--setup/python2/main.py (renamed from setup/main.py)0
-rw-r--r--setup/python2/prefs.py (renamed from setup/prefs.py)0
-rw-r--r--setup/python2/setup.ui (renamed from setup/setup.ui)0
-rw-r--r--setup/python3/Makefile.am116
l---------setup/python3/_config.py.in1
-rw-r--r--setup/python3/anthyprefs.py.in1329
-rw-r--r--setup/python3/ibus-setup-anthy.desktop.in.in8
-rw-r--r--setup/python3/ibus-setup-anthy.in28
-rw-r--r--setup/python3/main.py1729
-rw-r--r--setup/python3/prefs.py273
-rw-r--r--setup/python3/setup.ui2813
18 files changed, 6423 insertions, 96 deletions
diff --git a/setup/Makefile.am b/setup/Makefile.am
index f1a8e8d..3c64425 100644
--- a/setup/Makefile.am
+++ b/setup/Makefile.am
@@ -2,10 +2,8 @@
#
# ibus-anthy - The Anthy engine for IBus
#
-# Copyright (c) 2007-2008 Peng Huang <shawn.p.huang@gmail.com>
-# Copyright (c) 2009 Hideaki ABE <abe.sendai@gmail.com>
-# Copyright (c) 2010-2013 Takao Fujiwara <takao.fujiwara1@gmail.com>
-# Copyright (c) 2007-2013 Red Hat, Inc.
+# Copyright (c) 2014 Takao Fujiwara <takao.fujiwara1@gmail.com>
+# Copyright (c) 2014 Red Hat, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -21,96 +19,12 @@
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-desktop_in_in_files = ibus-setup-anthy.desktop.in.in
-desktop_in_files = $(desktop_in_in_files:.in.in=.in)
+SUBDIRS =
-$(desktop_in_files): %.desktop.in: %.desktop.in.in Makefile
- $(AM_V_GEN) sed \
- -e "s|\@libexecdir\@|$(libexecdir)|" \
- -e "s|\@pkgdatadir\@|$(pkgdatadir)|" \
- $< > $@.tmp && mv $@.tmp $@
-
-desktopdir=$(datadir)/applications
-desktop_DATA = $(desktop_in_files:.desktop.in=.desktop)
-
-@INTLTOOL_DESKTOP_RULE@
-
-BUILT_SOURCES = \
- _config.py \
- anthyprefs.py \
- $(NULL)
-
-libexec_SCRIPTS = ibus-setup-anthy
-
-setup_anthy_PYTHON = \
- _config.py \
- anthyprefs.py \
- main.py \
- prefs.py \
- setup.ui \
- $(NULL)
-
-setup_anthy_built_files = \
- $(BUILT_SOURCES) \
- $(libexec_SCRIPTS) \
- $(NULL)
-
-setup_anthy_built_in_files = $(addsuffix .in, $(setup_anthy_built_files))
-
-setup_anthydir = $(datadir)/ibus-anthy/setup
-
-CONFIG_CLEAN_FILES = \
- $(BUILT_SOURCES) \
- $(libexec_SCRIPTS) \
- $(NULL)
-
-CLEANFILES = \
- $(BUILT_SOURCES) \
- $(desktop_DATA) \
- $(desktop_in_files) \
- *.pyc \
- $(NULL)
-
-EXTRA_DIST = \
- $(desktop_in_in_files) \
- $(setup_anthy_built_in_files) \
- $(NULL)
-
-anthyprefs.py: anthyprefs.py.in
- sed -e "s|\@ANTHY_ZIPCODE_FILE\@|$(ANTHY_ZIPCODE_FILE)|g" \
- -e "s|\@KASUMI_EXEC_FILE\@|$(KASUMI_EXEC_FILE)|g" \
- -e "s|\@KASUMI_ICON_FILE\@|$(KASUMI_ICON_FILE)|g" \
- -e "s|\@ON_OFF_KEYS\@|$(ON_OFF_KEYS)|g" \
- -e "s|\@VERSION\@|$(VERSION)|g" \
- -e "s|\@pkgdatadir\@|$(pkgdatadir)|g" \
- $< > $@
-
-_config.py: _config.py.in
- ( \
- PKGDATADIR=$(pkgdatadir); \
- LIBEXECDIR=$(libexecdir); \
- DATADIR=$(datadir); \
- LAYOUT=$(LAYOUT); \
- SYMBOL_CHAR_INT=$(SYMBOL_CHAR_INT); \
- ICON_PREFERENCE=$(ICON_PREFERENCE); \
- s=`cat $<`; \
- eval "echo \"$${s}\""; \
- ) > $@
-
-# Need a time lag between .py and .py.in files to build .py files
-# because *_PYTHON valuables are installed in the tarball.
-dist-hook:
- @sleep 1; \
- for in_file in $(setup_anthy_built_in_files) ; do \
- if [ -f $(distdir)/$(srcdir)/$$in_file ] ; then \
- touch $(distdir)/$(srcdir)/$$in_file; \
- fi; \
- done;
-
-test:
- $(ENV_IBUS_TEST) DBUS_DEBUG=true \
- LANG=en_US \
- PYTHONPATH=$(abs_top_srcdir):$(pyexecdir) \
- IBUS_LOCALEDIR=@localedir@ \
- $(PYTHON) $(srcdir)/main.py
+if ENABLE_PYTHON2
+SUBDIRS += python2
+endif
+if ENABLE_PYTHON3
+SUBDIRS += python3
+endif
diff --git a/setup/_config.py.in b/setup/_config.py.in
deleted file mode 120000
index d646d61..0000000
--- a/setup/_config.py.in
+++ /dev/null
@@ -1 +0,0 @@
-../engine/_config.py.in \ No newline at end of file
diff --git a/setup/python2/Makefile.am b/setup/python2/Makefile.am
new file mode 100644
index 0000000..f1a8e8d
--- /dev/null
+++ b/setup/python2/Makefile.am
@@ -0,0 +1,116 @@
+# vim:set noet ts=4:
+#
+# ibus-anthy - The Anthy engine for IBus
+#
+# Copyright (c) 2007-2008 Peng Huang <shawn.p.huang@gmail.com>
+# Copyright (c) 2009 Hideaki ABE <abe.sendai@gmail.com>
+# Copyright (c) 2010-2013 Takao Fujiwara <takao.fujiwara1@gmail.com>
+# Copyright (c) 2007-2013 Red Hat, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+desktop_in_in_files = ibus-setup-anthy.desktop.in.in
+desktop_in_files = $(desktop_in_in_files:.in.in=.in)
+
+$(desktop_in_files): %.desktop.in: %.desktop.in.in Makefile
+ $(AM_V_GEN) sed \
+ -e "s|\@libexecdir\@|$(libexecdir)|" \
+ -e "s|\@pkgdatadir\@|$(pkgdatadir)|" \
+ $< > $@.tmp && mv $@.tmp $@
+
+desktopdir=$(datadir)/applications
+desktop_DATA = $(desktop_in_files:.desktop.in=.desktop)
+
+@INTLTOOL_DESKTOP_RULE@
+
+BUILT_SOURCES = \
+ _config.py \
+ anthyprefs.py \
+ $(NULL)
+
+libexec_SCRIPTS = ibus-setup-anthy
+
+setup_anthy_PYTHON = \
+ _config.py \
+ anthyprefs.py \
+ main.py \
+ prefs.py \
+ setup.ui \
+ $(NULL)
+
+setup_anthy_built_files = \
+ $(BUILT_SOURCES) \
+ $(libexec_SCRIPTS) \
+ $(NULL)
+
+setup_anthy_built_in_files = $(addsuffix .in, $(setup_anthy_built_files))
+
+setup_anthydir = $(datadir)/ibus-anthy/setup
+
+CONFIG_CLEAN_FILES = \
+ $(BUILT_SOURCES) \
+ $(libexec_SCRIPTS) \
+ $(NULL)
+
+CLEANFILES = \
+ $(BUILT_SOURCES) \
+ $(desktop_DATA) \
+ $(desktop_in_files) \
+ *.pyc \
+ $(NULL)
+
+EXTRA_DIST = \
+ $(desktop_in_in_files) \
+ $(setup_anthy_built_in_files) \
+ $(NULL)
+
+anthyprefs.py: anthyprefs.py.in
+ sed -e "s|\@ANTHY_ZIPCODE_FILE\@|$(ANTHY_ZIPCODE_FILE)|g" \
+ -e "s|\@KASUMI_EXEC_FILE\@|$(KASUMI_EXEC_FILE)|g" \
+ -e "s|\@KASUMI_ICON_FILE\@|$(KASUMI_ICON_FILE)|g" \
+ -e "s|\@ON_OFF_KEYS\@|$(ON_OFF_KEYS)|g" \
+ -e "s|\@VERSION\@|$(VERSION)|g" \
+ -e "s|\@pkgdatadir\@|$(pkgdatadir)|g" \
+ $< > $@
+
+_config.py: _config.py.in
+ ( \
+ PKGDATADIR=$(pkgdatadir); \
+ LIBEXECDIR=$(libexecdir); \
+ DATADIR=$(datadir); \
+ LAYOUT=$(LAYOUT); \
+ SYMBOL_CHAR_INT=$(SYMBOL_CHAR_INT); \
+ ICON_PREFERENCE=$(ICON_PREFERENCE); \
+ s=`cat $<`; \
+ eval "echo \"$${s}\""; \
+ ) > $@
+
+# Need a time lag between .py and .py.in files to build .py files
+# because *_PYTHON valuables are installed in the tarball.
+dist-hook:
+ @sleep 1; \
+ for in_file in $(setup_anthy_built_in_files) ; do \
+ if [ -f $(distdir)/$(srcdir)/$$in_file ] ; then \
+ touch $(distdir)/$(srcdir)/$$in_file; \
+ fi; \
+ done;
+
+test:
+ $(ENV_IBUS_TEST) DBUS_DEBUG=true \
+ LANG=en_US \
+ PYTHONPATH=$(abs_top_srcdir):$(pyexecdir) \
+ IBUS_LOCALEDIR=@localedir@ \
+ $(PYTHON) $(srcdir)/main.py
+
diff --git a/setup/python2/_config.py.in b/setup/python2/_config.py.in
new file mode 120000
index 0000000..a064604
--- /dev/null
+++ b/setup/python2/_config.py.in
@@ -0,0 +1 @@
+../../engine/python2/_config.py.in \ No newline at end of file
diff --git a/setup/anthyprefs.py.in b/setup/python2/anthyprefs.py.in
index a685da1..a685da1 100644
--- a/setup/anthyprefs.py.in
+++ b/setup/python2/anthyprefs.py.in
diff --git a/setup/ibus-setup-anthy.desktop.in.in b/setup/python2/ibus-setup-anthy.desktop.in.in
index 1dd35f9..1dd35f9 100644
--- a/setup/ibus-setup-anthy.desktop.in.in
+++ b/setup/python2/ibus-setup-anthy.desktop.in.in
diff --git a/setup/ibus-setup-anthy.in b/setup/python2/ibus-setup-anthy.in
index f8832fd..f8832fd 100644
--- a/setup/ibus-setup-anthy.in
+++ b/setup/python2/ibus-setup-anthy.in
diff --git a/setup/main.py b/setup/python2/main.py
index 98486ad..98486ad 100644
--- a/setup/main.py
+++ b/setup/python2/main.py
diff --git a/setup/prefs.py b/setup/python2/prefs.py
index 1b88908..1b88908 100644
--- a/setup/prefs.py
+++ b/setup/python2/prefs.py
diff --git a/setup/setup.ui b/setup/python2/setup.ui
index d9ec626..d9ec626 100644
--- a/setup/setup.ui
+++ b/setup/python2/setup.ui
diff --git a/setup/python3/Makefile.am b/setup/python3/Makefile.am
new file mode 100644
index 0000000..f1a8e8d
--- /dev/null
+++ b/setup/python3/Makefile.am
@@ -0,0 +1,116 @@
+# vim:set noet ts=4:
+#
+# ibus-anthy - The Anthy engine for IBus
+#
+# Copyright (c) 2007-2008 Peng Huang <shawn.p.huang@gmail.com>
+# Copyright (c) 2009 Hideaki ABE <abe.sendai@gmail.com>
+# Copyright (c) 2010-2013 Takao Fujiwara <takao.fujiwara1@gmail.com>
+# Copyright (c) 2007-2013 Red Hat, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+desktop_in_in_files = ibus-setup-anthy.desktop.in.in
+desktop_in_files = $(desktop_in_in_files:.in.in=.in)
+
+$(desktop_in_files): %.desktop.in: %.desktop.in.in Makefile
+ $(AM_V_GEN) sed \
+ -e "s|\@libexecdir\@|$(libexecdir)|" \
+ -e "s|\@pkgdatadir\@|$(pkgdatadir)|" \
+ $< > $@.tmp && mv $@.tmp $@
+
+desktopdir=$(datadir)/applications
+desktop_DATA = $(desktop_in_files:.desktop.in=.desktop)
+
+@INTLTOOL_DESKTOP_RULE@
+
+BUILT_SOURCES = \
+ _config.py \
+ anthyprefs.py \
+ $(NULL)
+
+libexec_SCRIPTS = ibus-setup-anthy
+
+setup_anthy_PYTHON = \
+ _config.py \
+ anthyprefs.py \
+ main.py \
+ prefs.py \
+ setup.ui \
+ $(NULL)
+
+setup_anthy_built_files = \
+ $(BUILT_SOURCES) \
+ $(libexec_SCRIPTS) \
+ $(NULL)
+
+setup_anthy_built_in_files = $(addsuffix .in, $(setup_anthy_built_files))
+
+setup_anthydir = $(datadir)/ibus-anthy/setup
+
+CONFIG_CLEAN_FILES = \
+ $(BUILT_SOURCES) \
+ $(libexec_SCRIPTS) \
+ $(NULL)
+
+CLEANFILES = \
+ $(BUILT_SOURCES) \
+ $(desktop_DATA) \
+ $(desktop_in_files) \
+ *.pyc \
+ $(NULL)
+
+EXTRA_DIST = \
+ $(desktop_in_in_files) \
+ $(setup_anthy_built_in_files) \
+ $(NULL)
+
+anthyprefs.py: anthyprefs.py.in
+ sed -e "s|\@ANTHY_ZIPCODE_FILE\@|$(ANTHY_ZIPCODE_FILE)|g" \
+ -e "s|\@KASUMI_EXEC_FILE\@|$(KASUMI_EXEC_FILE)|g" \
+ -e "s|\@KASUMI_ICON_FILE\@|$(KASUMI_ICON_FILE)|g" \
+ -e "s|\@ON_OFF_KEYS\@|$(ON_OFF_KEYS)|g" \
+ -e "s|\@VERSION\@|$(VERSION)|g" \
+ -e "s|\@pkgdatadir\@|$(pkgdatadir)|g" \
+ $< > $@
+
+_config.py: _config.py.in
+ ( \
+ PKGDATADIR=$(pkgdatadir); \
+ LIBEXECDIR=$(libexecdir); \
+ DATADIR=$(datadir); \
+ LAYOUT=$(LAYOUT); \
+ SYMBOL_CHAR_INT=$(SYMBOL_CHAR_INT); \
+ ICON_PREFERENCE=$(ICON_PREFERENCE); \
+ s=`cat $<`; \
+ eval "echo \"$${s}\""; \
+ ) > $@
+
+# Need a time lag between .py and .py.in files to build .py files
+# because *_PYTHON valuables are installed in the tarball.
+dist-hook:
+ @sleep 1; \
+ for in_file in $(setup_anthy_built_in_files) ; do \
+ if [ -f $(distdir)/$(srcdir)/$$in_file ] ; then \
+ touch $(distdir)/$(srcdir)/$$in_file; \
+ fi; \
+ done;
+
+test:
+ $(ENV_IBUS_TEST) DBUS_DEBUG=true \
+ LANG=en_US \
+ PYTHONPATH=$(abs_top_srcdir):$(pyexecdir) \
+ IBUS_LOCALEDIR=@localedir@ \
+ $(PYTHON) $(srcdir)/main.py
+
diff --git a/setup/python3/_config.py.in b/setup/python3/_config.py.in
new file mode 120000
index 0000000..5f5764f
--- /dev/null
+++ b/setup/python3/_config.py.in
@@ -0,0 +1 @@
+../../engine/python3/_config.py.in \ No newline at end of file
diff --git a/setup/python3/anthyprefs.py.in b/setup/python3/anthyprefs.py.in
new file mode 100644
index 0000000..53c9d1d
--- /dev/null
+++ b/setup/python3/anthyprefs.py.in
@@ -0,0 +1,1329 @@
+# -*- coding: utf-8 -*-
+# vim:set noet ts=4:
+#
+# ibus-anthy - The Anthy engine for IBus
+#
+# Copyright (c) 2007-2008 Peng Huang <shawn.p.huang@gmail.com>
+# Copyright (c) 2009 Hideaki ABE <abe.sendai@gmail.com>
+# Copyright (c) 2010-2014 Takao Fujiwara <takao.fujiwara1@gmail.com>
+# Copyright (c) 2007-2014 Red Hat, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+import sys
+
+from prefs import Prefs
+
+N_ = lambda a : a
+
+__all__ = ['AnthyPrefs']
+
+
+class AnthyPrefs(Prefs):
+ _prefix = 'engine/anthy'
+ _char_to_config_key = None
+
+ def __init__(self, bus=None, config=None):
+ super(AnthyPrefs, self).__init__(bus, config)
+ if _config != None:
+ self.default = _config
+ self.set_no_key_warning(True)
+ self.fetch_all()
+ self.set_no_key_warning(False)
+
+ def __update_key (self, section, old_key, new_key):
+ file = __file__
+ if __file__.find('/') >= 0:
+ file = __file__[__file__.rindex('/') + 1:]
+ warning_message = \
+ '(' + file + ') ibus-anthy-WARNING **: ' \
+ 'The key (' + old_key + ') will be removed in the future. ' \
+ 'Currently the key (' + new_key + ') is used instead. ' \
+ 'The ibus keys are defined in ' + \
+ '/'.join(['/desktop/ibus', self._prefix, section]) + ' .'
+
+ if not self.fetch_item(section, old_key, True):
+ return
+ print(warning_message, file=sys.stderr)
+ if self.fetch_item(section, new_key, True):
+ return
+
+ self.fetch_item(section, old_key)
+ value = self.get_value(section, old_key)
+ self.set_value(section, new_key, value)
+ self.commit_item(section, new_key)
+ self.undo_item(section, new_key)
+
+ def keys(self, section):
+ if section.startswith('shortcut/'):
+ return _cmd_keys
+ return list(self.default[section].keys())
+
+ def get_japanese_ordered_list(self):
+ return _japanese_ordered_list
+
+ def get_version(self):
+ return '@VERSION@'
+
+ # Convert typing sequences to gsettings key.
+ # E.g. 'largea-bracketleft' to 'A['
+ def typing_from_config_key(self, gkeys):
+ retval = ''
+ for key in gkeys.split('-'):
+ if key in _supported_gsettings_key_chars:
+ retval += key
+ continue
+ try:
+ ch = _config_key_to_char[key]
+ except KeyError:
+ print('Not supported key in gsettings', gkeys, file=sys.stderr)
+ retval = ''
+ break
+ retval += ch
+ return retval
+
+ # Convert typing sequences to gsettings key.
+ # E.g. 'A[' to 'largea-bracketleft'
+ def typing_to_config_key(self, typing):
+ retval = ''
+ if self._char_to_config_key == None:
+ self._char_to_config_key = {}
+ for _key, _ch in list(_config_key_to_char.items()):
+ self._char_to_config_key[_ch] = _key
+ for ch in typing:
+ if ch in _supported_gsettings_key_chars:
+ if retval != '':
+ retval += '-'
+ retval += ch
+ continue
+ try:
+ key = self._char_to_config_key[ch]
+ except KeyError:
+ print('Not supported key in gsettings', typing, file=sys.stderr)
+ retval = ''
+ break
+ if retval != '':
+ retval += '-'
+ retval += key
+ return retval
+
+# Sad! dict.keys() doesn't return the saved order.
+# locale.strcoll() also just returns the Unicode code point.
+# Unicode order is wrong in Japanese large 'a' and small 'a'.
+# The workaround is to save the order here...
+_japanese_ordered_list = [
+ 'あ', 'い', 'う', 'え', 'お',
+ 'ぁ', 'ぃ', 'ぅ', 'ぇ', 'ぉ',
+ 'いぇ',
+ 'うぁ', 'うぃ', 'うぅ', 'うぇ', 'うぉ',
+ 'うゃ', 'うゅ', 'うょ',
+ 'か', 'き', 'く', 'け', 'こ',
+ 'ゕ', 'ゖ', 'ヵ', 'ヶ',
+ 'が', 'ぎ', 'ぐ', 'げ', 'ご',
+ 'きゃ', 'きぃ', 'きゅ', 'きぇ', 'きょ',
+ 'くぁ', 'くぃ', 'くぅ', 'くぇ', 'くぉ',
+ 'ぎゃ', 'ぎぃ', 'ぎゅ', 'ぎぇ', 'ぎょ',
+ 'ぐぁ', 'ぐぃ', 'ぐぅ', 'ぐぇ', 'ぐぉ',
+ 'さ', 'し', 'す', 'せ', 'そ',
+ 'ざ', 'じ', 'ず', 'ぜ', 'ぞ',
+ 'しゃ', 'しぃ', 'しゅ', 'しぇ', 'しょ',
+ 'じゃ', 'じぃ', 'じゅ', 'じぇ', 'じょ',
+ 'すぅぃ', 'すぇ',
+ 'ずぇ',
+ 'た', 'ち', 'つ', 'て', 'と',
+ 'だ', 'ぢ', 'づ', 'で', 'ど',
+ 'っ',
+ 'ちゃ', 'ちぃ', 'ちゅ', 'ちぇ', 'ちょ',
+ 'ぢぃ', 'ぢぇ',
+ 'ぢゃ', 'ぢゅ', 'ぢょ',
+ 'つぁ', 'つぃ', 'つぇ', 'つぉ',
+ 'つゃ', 'つぃぇ', 'つゅ', 'つょ',
+ 'づぁ', 'づぃ', 'づぇ', 'づぉ',
+ 'づゃ', 'づぃぇ', 'づゅ', 'づょ',
+ 'てぃ', 'てぇ',
+ 'てゃ', 'てゅ', 'てょ',
+ 'とぅ',
+ 'でぃ', 'でぇ',
+ 'でゃ', 'でゅ', 'でょ',
+ 'どぅ',
+ 'な', 'に', 'ぬ', 'ね', 'の',
+ 'にぃ', 'にぇ',
+ 'にゃ', 'にゅ', 'にょ',
+ 'は', 'ひ', 'ふ', 'へ', 'ほ',
+ 'ば', 'び', 'ぶ', 'べ', 'ぼ',
+ 'ぱ', 'ぴ', 'ぷ', 'ぺ', 'ぽ',
+ 'ひぃ', 'ひぇ',
+ 'ひゃ', 'ひゅ', 'ひょ',
+ 'びぃ', 'びぇ',
+ 'びゃ', 'びゅ', 'びょ',
+ 'ぴぃ', 'ぴぇ',
+ 'ぴゃ', 'ぴゅ', 'ぴょ',
+ 'ふぁ', 'ふぃ', 'ふぇ', 'ふぉ',
+ 'ふゃ', 'ふゅ', 'ふょ',
+ 'ぶぁ', 'ぶぇ', 'ぶぉ',
+ 'ぷぁ', 'ぷぇ', 'ぷぉ',
+ 'ま', 'み', 'む', 'め', 'も',
+ 'みぃ', 'みぇ',
+ 'みゃ', 'みゅ', 'みょ',
+ 'や', 'ゆ', 'よ',
+ 'ゃ', 'ゅ', 'ょ',
+ 'ら', 'り', 'る', 'れ', 'ろ',
+ 'りぃ', 'りぇ',
+ 'りゃ', 'りゅ', 'りょ',
+ 'わ', 'を', 'ん',
+ 'ゎ',
+ 'ゐ', 'ゑ',
+ 'ー',
+ 'ヴぁ', 'ヴぃ', 'ヴ', 'ヴぇ', 'ヴぉ',
+ 'ヴゃ', 'ヴぃぇ', 'ヴゅ', 'ヴょ',
+]
+
+# http://git.gnome.org/browse/glib/tree/gio/glib-compile-schemas.c#n765
+# gsettings supports keys named by "abcdefghijklmnopqrstuvwxyz0123456789-"
+# and ibus-anthy uses '-' as the delimiter.
+_supported_gsettings_key_chars = "abcdefghijklmnopqrstuvwxyz0123456789"
+
+_config_key_to_char = {
+ # no modifiers keys
+ 'minus' : '-',
+ 'asciicircum' : '^',
+ 'at' : '@',
+ 'bracketleft' : '[',
+ 'semicolon' : ';',
+ 'colon' : ':',
+ 'bracketright' : ']',
+ 'comma' : ',',
+ 'period' : '.',
+ 'slash' : '/',
+ 'backslash' : '\\',
+
+ # shift modifiered keys
+ 'exclam' : '!',
+ 'quotedbl' : '"',
+ 'numbersign' : '#',
+ 'dollar' : '$',
+ 'percent' : '%',
+ 'ampersand' : '&',
+ 'apostrophe' : '\'',
+ 'parenleft' : '(',
+ 'parenright' : ')',
+ 'asciitilde' : '~',
+ 'equal' : '=',
+ 'bar' : '|',
+
+ 'largeq' : 'Q',
+ 'largew' : 'W',
+ 'largee' : 'E',
+ 'larger' : 'R',
+ 'larget' : 'T',
+ 'largey' : 'Y',
+ 'largeu' : 'U',
+ 'largei' : 'I',
+ 'largeo' : 'O',
+ 'largep' : 'P',
+ 'grave' : '`',
+
+ 'braceleft' : '{',
+
+ 'largea' : 'A',
+ 'larges' : 'S',
+ 'larged' : 'D',
+ 'largef' : 'F',
+ 'largeg' : 'G',
+ 'largeh' : 'H',
+ 'largej' : 'J',
+ 'largek' : 'K',
+ 'largel' : 'L',
+ 'plus' : '+',
+ 'asterisk' : '*',
+
+ 'braceright' : '}',
+
+ 'largez' : 'Z',
+ 'largex' : 'X',
+ 'largec' : 'C',
+ 'largev' : 'V',
+ 'largeb' : 'B',
+ 'largen' : 'N',
+ 'largem' : 'M',
+ 'less' : '<',
+ 'greater' : '>',
+
+ 'question' : '?',
+ 'underscore' : '_',
+
+ 'yen' : '¥',
+}
+
+_cmd_keys = [
+ 'on_off',
+ 'circle_input_mode',
+ 'circle_kana_mode',
+ 'circle_typing_method',
+ 'circle_dict_method',
+ 'latin_mode',
+ 'wide_latin_mode',
+ 'hiragana_mode',
+ 'katakana_mode',
+ 'half_katakana_mode',
+# 'cancel_pseudo_ascii_mode_key',
+
+ 'hiragana_for_latin_with_shift',
+
+ 'insert_space',
+ 'insert_alternate_space',
+ 'insert_half_space',
+ 'insert_wide_space',
+ 'backspace',
+ 'delete',
+ 'commit',
+ 'convert',
+ 'predict',
+ 'cancel',
+ 'cancel_all',
+ 'reconvert',
+# 'do_nothing',
+
+ 'select_first_candidate',
+ 'select_last_candidate',
+ 'select_next_candidate',
+ 'select_prev_candidate',
+ 'candidates_page_up',
+ 'candidates_page_down',
+
+ 'move_caret_first',
+ 'move_caret_last',
+ 'move_caret_forward',
+ 'move_caret_backward',
+
+ 'select_first_segment',
+ 'select_last_segment',
+ 'select_next_segment',
+ 'select_prev_segment',
+ 'shrink_segment',
+ 'expand_segment',
+ 'commit_first_segment',
+ 'commit_selected_segment',
+
+ 'select_candidates_1',
+ 'select_candidates_2',
+ 'select_candidates_3',
+ 'select_candidates_4',
+ 'select_candidates_5',
+ 'select_candidates_6',
+ 'select_candidates_7',
+ 'select_candidates_8',
+ 'select_candidates_9',
+ 'select_candidates_0',
+
+ 'convert_to_char_type_forward',
+ 'convert_to_char_type_backward',
+ 'convert_to_hiragana',
+ 'convert_to_katakana',
+ 'convert_to_half',
+ 'convert_to_half_katakana',
+ 'convert_to_wide_latin',
+ 'convert_to_latin',
+
+ 'dict_admin',
+ 'add_word',
+
+ 'start_setup',
+]
+
+_config = {
+ 'common': {
+ 'input_mode': 0,
+ 'typing_method': 0,
+ 'conversion_segment_mode': 0,
+
+ 'show-input-mode': True,
+ 'show-typing-method': False,
+ 'show-segment-mode': False,
+ 'show-dict-mode': True,
+ 'show-dict-config': False,
+ 'show-preferences': True,
+
+ 'period_style': 0,
+ 'symbol_style': 1,
+ 'ten_key_mode': 1,
+ 'behavior_on_focus_out': 0,
+ 'behavior_on_period': 0,
+
+ 'page_size': 10,
+ 'half_width_symbol': False,
+ 'half_width_number': False,
+ 'half_width_space': False,
+ 'latin_with_shift': True,
+
+ 'shortcut_type': 'default',
+
+ 'dict_admin_command': ['@KASUMI_EXEC_FILE@', 'kasumi'],
+ 'add_word_command': ['@KASUMI_EXEC_FILE@', 'kasumi', '-a'],
+ 'dict_config_icon': '@KASUMI_ICON_FILE@',
+ 'keyboard_layouts': [
+ 'default', 'jp', 'us',
+ # XKB options requires ibus 1.5.
+ 'jp[ctrl:swapcaps]', 'us[ctrl:swapcaps]',
+ 'jp[ctrl:swapcaps,compose:rctrl]',
+ 'us[ctrl:swapcaps,compose:rctrl]',
+ 'jp[japan:kana_lock]',
+ 'jp[japan:nicola_f_bs]',
+ 'jp[japan:nicola_f_bs,ctrl:swapcaps]',
+ 'jp[japan:hztg_escape]',
+ 'jp[japan:hztg_escape,ctrl:swapcaps]',
+ ],
+ },
+
+ 'romaji_typing_rule': {
+ 'method': 'default',
+ # The newkeys list is saved for every romaji_typing_rule/$method
+ # so that prefs.get_value_direct() is not used.
+ # prefs.fetch_section() doesn't get the keys if they exist
+ # in gconf only.
+ 'newkeys': [],
+ },
+
+ ##0 MS-IME
+ # http://www.filibeto.org/sun/lib/solaris10-docs/E19253-01/819-7844/appe-1-4/index.html
+ ##1 ATOK
+ # http://www.filibeto.org/sun/lib/solaris10-docs/E19253-01/819-7844/appe-1-3/index.html
+ ##2 Gairaigo http://ja.wikipedia.org/wiki/%E5%A4%96%E6%9D%A5%E8%AA%9E
+ ##3 ANSI/BSI Suggestions http://en.wikipedia.org/wiki/Katakana
+ ##4 Historical kana http://en.wikipedia.org/wiki/Romanization_of_Japanese
+ # Maybe we need a compatibility between MS-IME and ibus-anthy.
+ 'romaji_typing_rule/default': {
+ 'minus' : 'ー',
+ 'a' : 'あ',
+ 'i' : 'い',
+ 'u' : 'う',
+ 'e' : 'え',
+ 'o' : 'お',
+ 'x-a' : 'ぁ',
+ 'x-i' : 'ぃ',
+ 'x-u' : 'ぅ',
+ 'x-e' : 'ぇ',
+ 'x-o' : 'ぉ',
+ 'l-a' : 'ぁ',
+ 'l-i' : 'ぃ',
+ 'l-u' : 'ぅ',
+ 'l-e' : 'ぇ',
+ 'l-o' : 'ぉ',
+ 'w-h-a' : 'うぁ',
+ 'w-h-i' : 'うぃ',
+ 'w-h-e' : 'うぇ',
+ 'w-h-o' : 'うぉ',
+ 'w-y-a' : 'うゃ', ##2
+ 'w-y-u' : 'うゅ', ##2
+ 'w-y-o' : 'うょ', ##2
+ 'v-a' : 'ヴぁ',
+ 'v-i' : 'ヴぃ',
+ 'v-u' : 'ヴ',
+ 'v-e' : 'ヴぇ',
+ 'v-o' : 'ヴぉ',
+ 'v-y-a' : 'ヴゃ', ##2
+ 'v-y-u' : 'ヴゅ', ##2
+ 'v-y-e' : 'ヴぃぇ', ##2
+ 'v-y-o' : 'ヴょ', ##2
+ 'k-a' : 'か',
+ 'k-i' : 'き',
+ 'k-u' : 'く',
+ 'k-e' : 'け',
+ 'k-o' : 'こ',
+ 'l-k-a' : 'ヵ',
+ 'l-k-e' : 'ヶ',
+# 'x-k-a' : 'ゕ',
+ 'x-k-a' : 'ヵ',
+# 'x-k-e' : 'ゖ',
+ 'x-k-e' : 'ヶ',
+ 'g-a' : 'が',
+ 'g-i' : 'ぎ',
+ 'g-u' : 'ぐ',
+ 'g-e' : 'げ',
+ 'g-o' : 'ご',
+ 'k-y-a' : 'きゃ',
+ 'k-y-i' : 'きぃ',
+ 'k-y-u' : 'きゅ',
+ 'k-y-e' : 'きぇ',
+ 'k-y-o' : 'きょ',
+ 'k-w-a' : 'くぁ',
+ 'k-w-i' : 'くぃ', ##2
+ 'k-w-u' : 'くぅ', ##2
+ 'k-w-e' : 'くぇ', ##2
+ 'k-w-o' : 'くぉ', ##2
+ 'g-y-a' : 'ぎゃ',
+ 'g-y-i' : 'ぎぃ',
+ 'g-y-u' : 'ぎゅ',
+ 'g-y-e' : 'ぎぇ',
+ 'g-y-o' : 'ぎょ',
+ 'g-w-a' : 'ぐぁ',
+ 'g-w-i' : 'ぐぃ', ##2
+ 'g-w-u' : 'ぐぅ', ##2
+ 'g-w-e' : 'ぐぇ', ##2
+ 'g-w-o' : 'ぐぉ', ##2
+ 's-a' : 'さ',
+ 's-i' : 'し',
+ 's-u' : 'す',
+ 's-e' : 'せ',
+ 's-o' : 'そ',
+ 'z-a' : 'ざ',
+ 'z-i' : 'じ',
+ 'z-u' : 'ず',
+ 'z-e' : 'ぜ',
+ 'z-o' : 'ぞ',
+ 's-y-a' : 'しゃ',
+ 's-y-i' : 'しぃ',
+ 's-y-u' : 'しゅ',
+ 's-y-e' : 'しぇ',
+ 's-y-o' : 'しょ',
+ 's-h-a' : 'しゃ',
+ 's-h-i' : 'し',
+ 's-h-u' : 'しゅ',
+ 's-h-e' : 'しぇ',
+ 's-h-o' : 'しょ',
+ 'z-y-a' : 'じゃ',
+ 'z-y-i' : 'じぃ',
+ 'z-y-u' : 'じゅ',
+ 'z-y-e' : 'じぇ',
+ 'z-y-o' : 'じょ',
+ 'j-a' : 'じゃ',
+ 'j-y-a' : 'じゃ',
+ 'j-i' : 'じ',
+ 'j-y-i' : 'じぃ',
+ 'j-u' : 'じゅ',
+ 'j-y-u' : 'じゅ',
+ 'j-e' : 'じぇ',
+ 'j-y-e' : 'じぇ',
+ 'j-o' : 'じょ',
+ 'j-y-o' : 'じょ',
+ 's-w-i' : 'すぅぃ', ##2
+ 's-w-e' : 'すぇ', ##2
+ 'z-w-e' : 'ずぇ', ##2
+ 't-a' : 'た',
+ 't-i' : 'ち',
+ 't-u' : 'つ',
+ 't-s-u' : 'つ',
+ 't-e' : 'て',
+ 't-o' : 'と',
+ 'd-a' : 'だ',
+ 'd-i' : 'ぢ',
+ 'd-u' : 'づ',
+ 'd-e' : 'で',
+ 'd-o' : 'ど',
+ 'x-t-u' : 'っ',
+ 'x-t-s-u' : 'っ',
+ 'l-t-u' : 'っ',
+ 'l-t-s-u' : 'っ',
+ 't-y-a' : 'ちゃ',
+ 't-y-i' : 'ちぃ',
+ 't-y-u' : 'ちゅ',
+ 't-y-e' : 'ちぇ',
+ 't-y-o' : 'ちょ',
+ 'c-y-a' : 'ちゃ',
+ 'c-y-i' : 'ちぃ',
+ 'c-y-u' : 'ちゅ',
+ 'c-y-e' : 'ちぇ',
+ 'c-y-o' : 'ちょ',
+ 'c-h-a' : 'ちゃ',
+ 'c-h-i' : 'ち',
+ 'c-h-u' : 'ちゅ',
+ 'c-h-e' : 'ちぇ',
+ 'c-h-o' : 'ちょ',
+ 'd-y-a' : 'ぢゃ',
+ 'd-y-i' : 'ぢぃ',
+ 'd-y-u' : 'ぢゅ',
+ 'd-y-e' : 'ぢぇ',
+ 'd-y-o' : 'ぢょ',
+ 't-s-a' : 'つぁ',
+ 't-s-i' : 'つぃ',
+ 't-s-e' : 'つぇ',
+ 't-s-o' : 'つぉ',
+ 't-s-y-a' : 'つゃ', ##3
+ 't-s-y-u' : 'つゅ', ##3
+ 't-s-y-e' : 'つぃぇ', ##3
+ 't-s-y-o' : 'つょ', ##3
+ 'd-z-a' : 'づぁ', ##3
+ 'd-z-i' : 'づぃ', ##3
+ 'd-z-u' : 'づ', ##4
+ 'd-z-e' : 'づぇ', ##3
+ 'd-z-o' : 'づぉ', ##3
+ 'd-z-y-a' : 'づゃ', ##3
+ 'd-z-y-u' : 'づゅ', ##3
+ 'd-z-y-e' : 'づぃぇ', ##3
+ 'd-z-y-o' : 'づょ', ##3
+ 't-h-a' : 'てゃ',
+ 't-h-i' : 'てぃ',
+ 't-h-u' : 'てゅ',
+ 't-h-e' : 'てぇ',
+ 't-h-o' : 'てょ',
+ 't-w-u' : 'とぅ',
+ 'd-h-a' : 'でゃ',
+ 'd-h-i' : 'でぃ',
+ 'd-h-u' : 'でゅ',
+ 'd-h-e' : 'でぇ',
+ 'd-h-o' : 'でょ',
+ 'd-w-u' : 'どぅ',
+ 'n-a' : 'な',
+ 'n-i' : 'に',
+ 'n-u' : 'ぬ',
+ 'n-e' : 'ね',
+ 'n-o' : 'の',
+ 'n-y-a' : 'にゃ',
+ 'n-y-i' : 'にぃ',
+ 'n-y-u' : 'にゅ',
+ 'n-y-e' : 'にぇ',
+ 'n-y-o' : 'にょ',
+ 'h-a' : 'は',
+ 'h-i' : 'ひ',
+ 'h-u' : 'ふ',
+ 'h-e' : 'へ',
+ 'h-o' : 'ほ',
+ 'b-a' : 'ば',
+ 'b-i' : 'び',
+ 'b-u' : 'ぶ',
+ 'b-e' : 'べ',
+ 'b-o' : 'ぼ',
+ 'p-a' : 'ぱ',
+ 'p-i' : 'ぴ',
+ 'p-u' : 'ぷ',
+ 'p-e' : 'ぺ',
+ 'p-o' : 'ぽ',
+ 'h-y-a' : 'ひゃ',
+ 'h-y-i' : 'ひぃ',
+ 'h-y-u' : 'ひゅ',
+ 'h-y-e' : 'ひぇ',
+ 'h-y-o' : 'ひょ',
+ 'b-y-a' : 'びゃ',
+ 'b-y-i' : 'びぃ',
+ 'b-y-u' : 'びゅ',
+ 'b-y-e' : 'びぇ',
+ 'b-y-o' : 'びょ',
+ 'p-y-a' : 'ぴゃ',
+ 'p-y-i' : 'ぴぃ',
+ 'p-y-u' : 'ぴゅ',
+ 'p-y-e' : 'ぴぇ',
+ 'p-y-o' : 'ぴょ',
+ 'f-a' : 'ふぁ',
+ 'f-i' : 'ふぃ',
+ 'f-u' : 'ふ',
+ 'f-e' : 'ふぇ',
+ 'f-o' : 'ふぉ',
+ 'f-y-a' : 'ふゃ',
+ 'f-y-i' : 'ふぃ',
+ 'f-y-u' : 'ふゅ',
+ 'f-y-e' : 'ふぇ',
+ 'f-y-o' : 'ふょ',
+ 'b-w-a' : 'ぶぁ', ##2
+ 'b-w-e' : 'ぶぇ', ##2
+ 'b-w-o' : 'ぶぉ', ##2
+ 'p-w-a' : 'ぷぁ', ##2
+ 'p-w-e' : 'ぷぇ', ##2
+ 'p-w-o' : 'ぷぉ', ##2
+ 'm-a' : 'ま',
+ 'm-i' : 'み',
+ 'm-u' : 'む',
+ 'm-e' : 'め',
+ 'm-o' : 'も',
+ 'm-y-a' : 'みゃ',
+ 'm-y-i' : 'みぃ',
+ 'm-y-u' : 'みゅ',
+ 'm-y-e' : 'みぇ',
+ 'm-y-o' : 'みょ',
+ 'y-a' : 'や',
+ 'y-i' : 'い',
+ 'y-u' : 'ゆ',
+ 'y-e' : 'いぇ',
+ 'y-o' : 'よ',
+ 'l-y-a' : 'ゃ',
+ 'l-y-i' : 'ぃ',
+ 'l-y-u' : 'ゅ',
+ 'l-y-e' : 'ぇ',
+ 'l-y-o' : 'ょ',
+ 'x-y-a' : 'ゃ',
+ 'x-y-i' : 'ぃ',
+ 'x-y-u' : 'ゅ',
+ 'x-y-e' : 'ぇ',
+ 'x-y-o' : 'ょ',
+ 'r-a' : 'ら',
+ 'r-i' : 'り',
+ 'r-u' : 'る',
+ 'r-e' : 'れ',
+ 'r-o' : 'ろ',
+ 'r-y-a' : 'りゃ',
+ 'r-y-i' : 'りぃ',
+ 'r-y-u' : 'りゅ',
+ 'r-y-e' : 'りぇ',
+ 'r-y-o' : 'りょ',
+ 'w-a' : 'わ',
+ 'w-i' : 'うぃ',
+ 'w-u' : 'う',
+ 'w-e' : 'うぇ',
+ 'w-o' : 'を',
+ 'l-w-a' : 'ゎ',
+ 'x-w-a' : 'ゎ',
+ 'n-apostrophe' : 'ん',
+ 'n-n' : 'ん',
+ 'w-y-i' : 'ゐ',
+ 'w-y-e' : 'ゑ',
+ },
+
+ 'kana_typing_rule': {
+ 'method': 'jp',
+ 'newkeys': [],
+ },
+
+ 'kana_typing_rule/jp': {
+ # no modifiers keys
+ '1' : 'ぬ',
+ '2' : 'ふ',
+ '3' : 'あ',
+ '4' : 'う',
+ '5' : 'え',
+ '6' : 'お',
+ '7' : 'や',
+ '8' : 'ゆ',
+ '9' : 'よ',
+ '0' : 'わ',
+ 'minus' : 'ほ',
+ 'asciicircum' : 'へ',
+
+ 'q' : 'た',
+ 'w' : 'て',
+ 'e' : 'い',
+ 'r' : 'す',
+ 't' : 'か',
+ 'y' : 'ん',
+ 'u' : 'な',
+ 'i' : 'に',
+ 'o' : 'ら',
+ 'p' : 'せ',
+ 'at' : '゛',
+ 'bracketleft' : '゜',
+
+ 'a' : 'ち',
+ 's' : 'と',
+ 'd' : 'し',
+ 'f' : 'は',
+ 'g' : 'き',
+ 'h' : 'く',
+ 'j' : 'ま',
+ 'k' : 'の',
+ 'l' : 'り',
+ 'semicolon' : 'れ',
+ 'colon' : 'け',
+ 'bracketright' : 'む',
+
+ 'z' : 'つ',
+ 'x' : 'さ',
+ 'c' : 'そ',
+ 'v' : 'ひ',
+ 'b' : 'こ',
+ 'n' : 'み',
+ 'm' : 'も',
+ 'comma' : 'ね',
+ 'period' : 'る',
+ 'slash' : 'め',
+ # 'backslash' : 'ー',
+ 'backslash' : 'ろ',
+
+ # shift modifiered keys
+ 'exclam' : 'ぬ',
+ 'quotedbl' : 'ふ',
+ 'numbersign' : 'ぁ',
+ 'dollar' : 'ぅ',
+ 'percent' : 'ぇ',
+ 'ampersand' : 'ぉ',
+ 'apostrophe' : 'ゃ',
+ 'parenleft' : 'ゅ',
+ 'parenright' : 'ょ',
+ 'asciitilde' : 'を',
+ 'equal' : 'ゑ',
+ 'bar' : 'ー',
+
+ 'largeq' : 'た',
+ 'largew' : 'て',
+ 'largee' : 'ぃ',
+ 'larger' : 'す',
+ 'larget' : 'ヵ',
+ 'largey' : 'ん',
+ 'largeu' : 'な',
+ 'largei' : 'に',
+ 'largeo' : 'ら',
+ 'largep' : 'せ',
+ 'grave' : '゛',
+
+ 'braceleft' : '「',
+
+ 'largea' : 'ち',
+ 'larges' : 'と',
+ 'larged' : 'し',
+ 'largef' : 'ゎ',
+ 'largeg' : 'き',
+ 'largeh' : 'く',
+ 'largej' : 'ま',
+ 'largek' : 'の',
+ 'largel' : 'り',
+ 'plus' : 'れ',
+ 'asterisk' : 'ヶ',
+
+ 'braceright' : '」',
+
+ 'largez' : 'っ',
+ 'largex' : 'さ',
+ 'largec' : 'そ',
+ 'largev' : 'ゐ',
+ 'largeb' : 'こ',
+ 'largen' : 'み',
+ 'largem' : 'も',
+ 'less' : '、',
+ 'greater' : '。',
+
+ 'question' : '・',
+ 'underscore' : 'ろ',
+
+ 'yen' : 'ー',
+ },
+
+ 'kana_typing_rule/us': {
+ # no modifiers keys
+ 'grave' : 'ろ',
+ '1' : 'ぬ',
+ '2' : 'ふ',
+ '3' : 'あ',
+ '4' : 'う',
+ '5' : 'え',
+ '6' : 'お',
+ '7' : 'や',
+ '8' : 'ゆ',
+ '9' : 'よ',
+ '0' : 'わ',
+ 'minus' : 'ほ',
+ 'equal' : 'へ',
+
+ 'q' : 'た',
+ 'w' : 'て',
+ 'e' : 'い',
+ 'r' : 'す',
+ 't' : 'か',
+ 'y' : 'ん',
+ 'u' : 'な',
+ 'i' : 'に',
+ 'o' : 'ら',
+ 'p' : 'せ',
+ 'bracketleft' : '゛',
+ 'bracketright' : '゜',
+ # 'backslash' : 'ー',
+ 'backslash' : 'む',
+
+ 'a' : 'ち',
+ 's' : 'と',
+ 'd' : 'し',
+ 'f' : 'は',
+ 'g' : 'き',
+ 'h' : 'く',
+ 'j' : 'ま',
+ 'k' : 'の',
+ 'l' : 'り',
+ 'semicolon' : 'れ',
+ 'apostrophe' : 'け',
+
+ 'z' : 'つ',
+ 'x' : 'さ',
+ 'c' : 'そ',
+ 'v' : 'ひ',
+ 'b' : 'こ',
+ 'n' : 'み',
+ 'm' : 'も',
+ 'comma' : 'ね',
+ 'period' : 'る',
+ 'slash' : 'め',
+
+ # shift modifiered keys
+ 'asciitilde' : 'ろ',
+ 'exclam' : 'ぬ',
+ 'at' : 'ふ',
+ 'numbersign' : 'ぁ',
+ 'dollar' : 'ぅ',
+ 'percent' : 'ぇ',
+ 'asciicircum' : 'ぉ',
+ 'ampersand' : 'ゃ',
+ 'asterisk' : 'ゅ',
+ 'parenleft' : 'ょ',
+ 'parenright' : 'を',
+ 'underscore' : 'ー',
+ 'plus' : 'ゑ',
+
+ 'largeq' : 'た',
+ 'largew' : 'て',
+ 'largee' : 'ぃ',
+ 'larger' : 'す',
+ 'larget' : 'ヵ',
+ 'largey' : 'ん',
+ 'largeu' : 'な',
+ 'largei' : 'に',
+ 'largeo' : 'ら',
+ 'largep' : 'せ',
+ 'braceleft' : '「',
+
+ 'braceright' : '」',
+
+ 'bar' : 'む',
+
+ 'largea' : 'ち',
+ 'larges' : 'と',
+ 'larged' : 'し',
+ 'largef' : 'ゎ',
+ 'largeg' : 'き',
+ 'largeh' : 'く',
+ 'largej' : 'ま',
+ 'largek' : 'の',
+ 'largel' : 'り',
+ 'colon' : 'れ',
+ 'quotedbl' : 'ヶ',
+
+ 'largez' : 'っ',
+ 'largex' : 'さ',
+ 'largec' : 'そ',
+ 'largev' : 'ゐ',
+ 'largeb' : 'こ',
+ 'largen' : 'み',
+ 'largem' : 'も',
+ 'less' : '、',
+ 'greater' : '。',
+
+ 'question' : '・',
+ },
+ 'thumb': {
+ 'keyboard_layout_mode': True,
+ 'keyboard_layout': 0,
+ 'fmv_extension': 2,
+ 'handakuten': False,
+ 'rs': 'Henkan',
+ 'ls': 'Muhenkan',
+ 't1': 100,
+ 't2': 75,
+ },
+
+ 'thumb_typing_rule': {
+ 'method': 'base',
+ 'newkeys': [],
+ 'nicola_j_table_newkeys': [],
+ 'nicola_a_table_newkeys': [],
+ 'nicola_f_table_newkeys': [],
+ 'kb231_j_fmv_table_newkeys': [],
+ 'kb231_a_fmv_table_newkeys': [],
+ 'kb231_f_fmv_table_newkeys': [],
+ 'kb611_j_fmv_table_newkeys': [],
+ 'kb611_a_fmv_table_newkeys': [],
+ 'kb611_f_fmv_table_newkeys': [],
+ },
+
+ 'thumb_typing_rule/base': {
+ 'q' : ['。', '', 'ぁ'],
+ 'w' : ['か', 'が', 'え'],
+ 'e' : ['た', 'だ', 'り'],
+ 'r' : ['こ', 'ご', 'ゃ'],
+ 't' : ['さ', 'ざ', 'れ'],
+
+ 'y' : ['ら', 'よ', 'ぱ'],
+ 'u' : ['ち', 'に', 'ぢ'],
+ 'i' : ['く', 'る', 'ぐ'],
+ 'o' : ['つ', 'ま', 'づ'],
+ 'p' : [',', 'ぇ', 'ぴ'],
+ 'at' : ['、', '', ''],
+ 'bracketleft' : ['゛', '゜', ''],
+
+ 'a' : ['う', '', 'を'],
+ 's' : ['し', 'じ', 'あ'],
+ 'd' : ['て', 'で', 'な'],
+ 'f' : ['け', 'げ', 'ゅ'],
+ 'g' : ['せ', 'ぜ', 'も'],
+
+ 'h' : ['は', 'み', 'ば'],
+ 'j' : ['と', 'お', 'ど'],
+ 'k' : ['き', 'の', 'ぎ'],
+ 'l' : ['い', 'ょ', 'ぽ'],
+ 'semicolon' : ['ん', 'っ', ''],
+
+ 'z' : ['.', '', 'ぅ'],
+ 'x' : ['ひ', 'び', 'ー'],
+ 'c' : ['す', 'ず', 'ろ'],
+ 'v' : ['ふ', 'ぶ', 'や'],
+ 'b' : ['へ', 'べ', 'ぃ'],
+
+ 'n' : ['め', 'ぬ', 'ぷ'],
+ 'm' : ['そ', 'ゆ', 'ぞ'],
+ 'comma' : ['ね', 'む', 'ぺ'],
+ 'period' : ['ほ', 'わ', 'ぼ'],
+ 'slash' : ['・', 'ぉ', ''],
+
+ '1' : ['1', '', '?'],
+ '2' : ['2', '', '/'],
+ '4' : ['4', '', '「'],
+ '5' : ['5', '', '」'],
+
+ '6' : ['6', '[', ''],
+ '7' : ['7', ']', ''],
+ '8' : ['8', '(', ''],
+ '9' : ['9', ')', ''],
+ 'backslash' : ['¥', '', ''],
+ },
+
+ 'thumb_typing_rule/nicola_j_table': {
+ 'colon' : [':', '', ''],
+ 'at' : ['、', '', ''],
+ 'bracketleft' : ['゛', '゜', ''],
+ 'bracketright' : ['」', '', ''],
+ '8' : ['8', '(', ''],
+ '9' : ['9', ')', ''],
+ '0' : ['0', '', ''],
+ },
+
+ 'thumb_typing_rule/nicola_a_table': {
+ 'colon' : [':', '', ''],
+ 'at' : ['@', '', ''],
+ 'bracketleft' : ['、', '', ''],
+ 'bracketright' : ['゛', '゜', ''],
+ '8' : ['8', '', ''],
+ '9' : ['9', '(', ''],
+ '0' : ['0', ')', ''],
+ },
+
+ 'thumb_typing_rule/nicola_f_table': {
+ 'colon' : ['、', '', ''],
+ 'at' : ['@', '', ''],
+ 'bracketleft' : ['゛', '゜', ''],
+ 'bracketright' : ['」', '', ''],
+ '8' : ['8', '(', ''],
+ '9' : ['9', ')', ''],
+ '0' : ['0', '', ''],
+ },
+
+ 'thumb_typing_rule/kb231_j_fmv_table': {
+ '3' : ['3', '', '~'],
+ '0' : ['0', '『', ''],
+ 'minus' : ['-', '』', ''],
+ 'equal' : ['=', '', ''],
+ },
+
+ 'thumb_typing_rule/kb231_a_fmv_table': {
+ '3' : ['3', '', '~'],
+ '0' : ['0', ')', ''],
+ 'minus' : ['-', '『', ''],
+ 'equal' : ['=', '』', ''],
+ },
+
+ 'thumb_typing_rule/kb231_f_fmv_table': {
+ '3' : ['3', '', '~'],
+ '0' : ['0', '『', ''],
+ 'minus' : ['-', '』', ''],
+ 'equal' : ['=', '', ''],
+ },
+
+ 'thumb_typing_rule/kb611_j_fmv_table': {
+ 'grave' : ['‘', '', ''],
+ 'asciicircum' : ['々', '£', ''],
+ 'colon' : [':', '', ''],
+ 'at' : ['、', '¢', ''],
+ 'bracketleft' : ['゛', '゜', ''],
+ # keysyms are same and keycodes depend on the platforms.
+ #'¥' : [u'¥', u'¬', u''],
+ 'backslash' : ['¥', '¦', ''],
+ },
+
+ 'thumb_typing_rule/kb611_a_fmv_table': {
+ 'grave' : ['々', '', '£'],
+ 'colon' : [':', '', ''],
+ 'at' : ['@', '', ''],
+ 'bracketleft' : ['、', '¢', ''],
+ #'¥' : [u'¥', u'¬', u''],
+ 'backslash' : ['¥', '¦', ''],
+ },
+
+ 'thumb_typing_rule/kb611_f_fmv_table': {
+ 'grave' : ['‘', '', ''],
+ 'asciicircum' : ['々', '£', ''],
+ 'colon' : ['、', '¢', ''],
+ 'at' : ['@', '', ''],
+ 'bracketleft' : ['゛', '゜', ''],
+ #'¥' : [u'¥', u'¬', u''],
+ 'backslash' : ['¥', '¦', ''],
+ },
+
+ 'dict': {
+ 'zipcode': ['@pkgdatadir@/dicts/zipcode.t'],
+ 'symbol': ['@pkgdatadir@/dicts/symbol.t'],
+ 'oldchar': ['@pkgdatadir@/dicts/oldchar.t'],
+ 'era': ['@pkgdatadir@/dicts/era.t'],
+ 'files': [
+ '@pkgdatadir@/dicts/zipcode.t',
+ '@pkgdatadir@/dicts/symbol.t',
+ '@pkgdatadir@/dicts/oldchar.t',
+ '@pkgdatadir@/dicts/era.t',
+ ],
+ },
+
+ 'dict/file/default': {
+ 'embed': False,
+ 'single': True,
+ 'icon': None,
+ 'short_label': None,
+ 'long_label': None,
+ 'preview_lines': 30,
+ 'reverse': False,
+ 'is_system': False,
+ 'encoding': 'utf-8',
+ },
+
+ 'dict/file/embedded': {
+ 'embed': True,
+ 'single': True,
+ 'icon': None,
+ 'short_label': '般',
+ 'long_label': N_("General"),
+ 'preview_lines': 0,
+ 'reverse': False,
+ 'is_system': True,
+ },
+
+ 'dict/file/zipcode': {
+ 'embed': False,
+ 'single': True,
+ 'icon': None,
+ 'short_label': '〒',
+ 'long_label': N_("Zip Code Conversion"),
+ 'preview_lines': 30,
+ 'reverse': False,
+ 'is_system': True,
+ },
+
+ 'dict/file/symbol': {
+ 'embed': True,
+ 'single': False,
+ 'icon': None,
+ 'short_label': '記',
+ 'long_label': N_("Symbol"),
+ 'preview_lines': -1,
+ 'reverse': False,
+ 'is_system': True,
+ },
+
+ 'dict/file/oldchar': {
+ 'embed': False,
+ 'single': True,
+ 'icon': None,
+ 'short_label': '旧',
+ 'long_label': N_("Old Character Style"),
+ 'preview_lines': -1,
+ 'reverse': False,
+ 'is_system': True,
+ },
+ 'dict/file/era': {
+ 'embed': False,
+ 'single': True,
+ 'icon': None,
+ 'short_label': '年',
+ 'long_label': N_("Era"),
+ 'preview_lines': -1,
+ 'reverse': False,
+ 'is_system': True,
+ },
+}
+
+_shortcut_default = {
+ 'on_off': [@ON_OFF_KEYS@],
+ 'circle_input_mode': ['Ctrl+comma', 'Ctrl+less'],
+ # Removed Hiragana_Katakana key in circle_kana_mode for latin_with_shift.
+ 'circle_kana_mode': ['Ctrl+period', 'Ctrl+greater'],
+# 'cancel_pseudo_ascii_mode_key': ['Escape'],
+ 'circle_typing_method': ['Alt+Romaji', 'Ctrl+slash'],
+ 'circle_dict_method': ['Alt+Henkan'],
+
+ 'insert_space': ['space'],
+ 'insert_alternate_space': ['Shift+space'],
+ 'backspace': ['BackSpace', 'Ctrl+H'],
+ 'delete': ['Delete', 'Ctrl+D'],
+ 'commit': ['Return', 'KP_Enter', 'Ctrl+J', 'Ctrl+M'],
+ 'convert': ['space', 'KP_Space', 'Henkan'],
+ 'predict': ['Tab', 'ISO_Left_Tab'],
+ 'cancel': ['Escape', 'Ctrl+G'],
+ 'reconvert': ['Shift+Henkan'],
+
+ 'move_caret_first': ['Ctrl+A', 'Home'],
+ 'move_caret_last': ['Ctrl+E', 'End'],
+ 'move_caret_forward': ['Right', 'Ctrl+F'],
+ 'move_caret_backward': ['Left', 'Ctrl+B'],
+
+ 'select_first_segment': ['Ctrl+A', 'Home'],
+ 'select_last_segment': ['Ctrl+E', 'End'],
+ 'select_next_segment': ['Right', 'Ctrl+F'],
+ 'select_prev_segment': ['Left', 'Ctrl+B'],
+ 'shrink_segment': ['Shift+Left', 'Ctrl+I'],
+ 'expand_segment': ['Shift+Right', 'Ctrl+O'],
+ 'commit_first_segment': ['Shift+Down'],
+ 'commit_selected_segment': ['Ctrl+Down'],
+
+ 'select_first_candidate': ['Home'],
+ 'select_last_candidate': ['End'],
+ 'select_next_candidate': ['space', 'KP_Space', 'Tab', 'ISO_Left_Tab', 'Henkan', 'Down', 'KP_Add', 'Ctrl+N'],
+ 'select_prev_candidate': ['Shift+Tab', 'Shift+ISO_Left_Tab', 'Up', 'KP_Subtract', 'Ctrl+P'],
+ 'candidates_page_up': ['Page_Up'],
+ 'candidates_page_down': ['Page_Down', 'KP_Tab'],
+
+ 'select_candidates_1': ['1'],
+ 'select_candidates_2': ['2'],
+ 'select_candidates_3': ['3'],
+ 'select_candidates_4': ['4'],
+ 'select_candidates_5': ['5'],
+ 'select_candidates_6': ['6'],
+ 'select_candidates_7': ['7'],
+ 'select_candidates_8': ['8'],
+ 'select_candidates_9': ['9'],
+ 'select_candidates_0': ['0'],
+
+ 'convert_to_char_type_forward': ['Muhenkan'],
+ 'convert_to_hiragana': ['F6'],
+ 'convert_to_katakana': ['F7'],
+ 'convert_to_half': ['F8'],
+ 'convert_to_half_katakana': ['Shift+F8'],
+ 'convert_to_wide_latin': ['F9'],
+ 'convert_to_latin': ['F10'],
+
+ 'dict_admin': ['F11'],
+ 'add_word': ['F12'],
+
+ 'hiragana_for_latin_with_shift': ['Hiragana_Katakana'],
+}
+
+_config['shortcut/default'] = dict.fromkeys(_cmd_keys, [])
+_config['shortcut/default'].update(_shortcut_default)
+
+_shortcut_atok = {
+ 'on_off': ['Henkan', 'Eisu_toggle', 'Zenkaku_Hankaku'],
+ 'circle_input_mode': ['F10'],
+ 'hiragana_mode': ['Hiragana_Katakana'],
+ 'katakana_mode': ['Shift+Hiragana_Katakana'],
+ 'circle_typing_method': ['Romaji', 'Alt+Romaji'],
+ 'circle_dict_method': ['Alt+Henkan'],
+ 'convert': ['space', 'Henkan', 'Shift+space', 'Shift+Henkan'],
+ 'predict': ['Tab'],
+ 'cancel': ['Escape', 'BackSpace', 'Ctrl+H', 'Ctrl+bracketleft'],
+ 'commit': ['Return', 'Ctrl+M'],
+ 'reconvert': ['Shift+Henkan'],
+
+ 'insert_space': ['space'],
+ 'insert_alternate_space': ['Shift+space'],
+ 'backspace': ['BackSpace', 'Ctrl+H'],
+ 'delete': ['Delete', 'Ctrl+G'],
+
+ 'move_caret_backward': ['Left', 'Ctrl+K'],
+ 'move_caret_forward': ['Right', 'Ctrl+L'],
+ 'move_caret_first': ['Ctrl+Left'],
+ 'move_caret_last': ['Ctrl+Right'],
+
+ 'select_prev_segment': ['Shift+Left'],
+ 'select_next_segment': ['Shift+Right'],
+ 'select_first_segment': ['Ctrl+Left'],
+ 'select_last_segment': ['Ctrl+Right'],
+ 'expand_segment': ['Right', 'Ctrl+L'],
+ 'shrink_segment': ['Left', 'Ctrl+K'],
+ 'commit_selected_segment': ['Down', 'Ctrl+N'],
+
+ 'candidates_page_up': ['Shift+Henkan', 'Page_Up'],
+ 'candidates_page_down': ['Henkan', 'Page_Down'],
+ 'select_next_candidate': ['space', 'Tab', 'Henkan', 'Shift+space', 'Shift+Henkan'],
+ 'select_prev_candidate': ['Up'],
+
+ 'select_candidates_1': ['1'],
+ 'select_candidates_2': ['2'],
+ 'select_candidates_3': ['3'],
+ 'select_candidates_4': ['4'],
+ 'select_candidates_5': ['5'],
+ 'select_candidates_6': ['6'],
+ 'select_candidates_7': ['7'],
+ 'select_candidates_8': ['8'],
+ 'select_candidates_9': ['9'],
+ 'select_candidates_0': ['0'],
+
+ 'convert_to_hiragana': ['F6', 'Ctrl+U'],
+ 'convert_to_katakana': ['F7', 'Ctrl+I'],
+ 'convert_to_half': ['F8', 'Ctrl+O'],
+ 'convert_to_half_katakana': ['Shift+F8'],
+ 'convert_to_wide_latin': ['F9', 'Ctrl+P'],
+ 'convert_to_latin': ['F10', 'Ctrl+at'],
+
+ 'dict_admin': ['F11'],
+ 'add_word': ['Ctrl+F7'],
+
+ 'hiragana_for_latin_with_shift': ['Ctrl+J'],
+}
+
+_config['shortcut/atok'] = dict.fromkeys(_cmd_keys, [])
+_config['shortcut/atok'].update(_shortcut_atok)
+
+_shortcut_wnn = {
+ 'on_off': ['Shift+space'],
+ 'convert': ['space'],
+ 'predict': ['Ctrl+Q'],
+ 'cancel': ['Escape', 'Ctrl+G', 'Alt+Down', 'Muhenkan'],
+ 'commit': ['Ctrl+L', 'Ctrl+M', 'Ctrl+J', 'Return'],
+ 'insert_space': ['space'],
+ 'backspace': ['Ctrl+H', 'BackSpace'],
+ 'delete': ['Ctrl+D', 'Delete'],
+ 'circle_dict_method': ['Alt+Henkan'],
+
+ 'move_caret_backward': ['Ctrl+B', 'Left'],
+ 'move_caret_forward': ['Ctrl+F', 'Right'],
+ 'move_caret_first': ['Ctrl+A', 'Alt+Left'],
+ 'move_caret_last': ['Ctrl+E', 'Alt+Right'],
+
+ 'select_prev_segment': ['Ctrl+B', 'Left'],
+ 'select_next_segment': ['Ctrl+F', 'Right'],
+ 'select_first_segment': ['Ctrl+A', 'Alt+Left'],
+ 'select_last_segment': ['Ctrl+E', 'Alt+Right'],
+ 'expand_segment': ['Ctrl+O', 'F14'],
+ 'shrink_segment': ['Ctrl+I', 'F13'],
+
+ 'candidates_page_up': ['Tab'],
+ 'candidates_page_down': ['Shift+Tab'],
+ 'select_next_candidate': ['space', 'Ctrl+Q', 'Ctrl+P', 'Down'],
+ 'select_prev_candidate': ['Ctrl+N', 'Up'],
+
+ 'select_candidates_1': ['1'],
+ 'select_candidates_2': ['2'],
+ 'select_candidates_3': ['3'],
+ 'select_candidates_4': ['4'],
+ 'select_candidates_5': ['5'],
+ 'select_candidates_6': ['6'],
+ 'select_candidates_7': ['7'],
+ 'select_candidates_8': ['8'],
+ 'select_candidates_9': ['9'],
+ 'select_candidates_0': ['0'],
+
+ 'convert_to_hiragana': ['F6'],
+ 'convert_to_katakana': ['F7'],
+ 'convert_to_half': ['F8'],
+ 'convert_to_wide_latin': ['F9'],
+ 'convert_to_latin': ['F10'],
+
+ 'dict_admin': ['F11'],
+ 'add_word': ['F12'],
+
+ 'hiragana_for_latin_with_shift': ['Hiragana_Katakana'],
+}
+
+_config['shortcut/wnn'] = dict.fromkeys(_cmd_keys, [])
+_config['shortcut/wnn'].update(_shortcut_wnn)
+
diff --git a/setup/python3/ibus-setup-anthy.desktop.in.in b/setup/python3/ibus-setup-anthy.desktop.in.in
new file mode 100644
index 0000000..1dd35f9
--- /dev/null
+++ b/setup/python3/ibus-setup-anthy.desktop.in.in
@@ -0,0 +1,8 @@
+[Desktop Entry]
+_Name=IBus Anthy Setup
+_Comment=Set up IBus Anthy engine
+Exec=@libexecdir@/ibus-setup-anthy
+Icon=ibus-anthy
+NoDisplay=true
+Type=Application
+StartupNotify=true
diff --git a/setup/python3/ibus-setup-anthy.in b/setup/python3/ibus-setup-anthy.in
new file mode 100644
index 0000000..f8832fd
--- /dev/null
+++ b/setup/python3/ibus-setup-anthy.in
@@ -0,0 +1,28 @@
+#!/bin/sh
+# vim:set noet ts=4:
+#
+# ibus-tmpl - The Input Bus template project
+#
+# Copyright (c) 2007-2008 Peng Huang <shawn.p.huang@gmail.com>
+# Copyright (c) 2010-2013 Takao Fujiwara <takao.fujiwara1@gmail.com>
+# Copyright (c) 2007-2013 Red Hat, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+prefix=@prefix@
+datarootdir=@datarootdir@
+export IBUS_LOCALEDIR=@localedir@
+exec @PYTHON@ @prefix@/share/ibus-anthy/setup/main.py $@
+
diff --git a/setup/python3/main.py b/setup/python3/main.py
new file mode 100644
index 0000000..fec03a6
--- /dev/null
+++ b/setup/python3/main.py
@@ -0,0 +1,1729 @@
+# vim:set noet ts=4:
+#
+# ibus-anthy - The Anthy engine for IBus
+#
+# Copyright (c) 2007-2008 Peng Huang <shawn.p.huang@gmail.com>
+# Copyright (c) 2009 Hideaki ABE <abe.sendai@gmail.com>
+# Copyright (c) 2010-2014 Takao Fujiwara <takao.fujiwara1@gmail.com>
+# Copyright (c) 2007-2014 Red Hat, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+from os import environ, getuid, path
+import binascii
+import codecs
+import functools
+import locale
+import os, sys
+import xml.dom.minidom
+import gettext
+from gettext import dgettext
+
+from gi.repository import GLib
+
+# set_prgname before importing other modules to show the name in warning
+# messages when import modules are failed. E.g. Gtk.
+GLib.set_prgname('ibus-setup-anthy')
+
+from gi.repository import Gtk
+from gi.repository import Gdk
+from gi.repository import GdkX11
+from gi.repository import Pango
+from gi.repository import IBus
+
+import _config as config
+from anthyprefs import AnthyPrefs
+
+DOMAINNAME = 'ibus-anthy'
+_ = lambda a : dgettext('ibus-anthy', a)
+
+def l_to_s(l):
+ return str(sorted([str(s) for s in l])).replace('\'', '')
+
+def s_to_l(s):
+ return [] if s == '[]' else s[1:-1].replace(' ', '').split(',')
+
+
+class AnthySetup(object):
+ def __init__(self):
+ # Python's locale module doesn't provide all methods on some
+ # operating systems like FreeBSD
+ try:
+ locale.bindtextdomain(DOMAINNAME, config.LOCALEDIR)
+ locale.bind_textdomain_codeset(DOMAINNAME, 'UTF-8')
+ except AttributeError:
+ pass
+ gettext.bindtextdomain(DOMAINNAME, config.LOCALEDIR)
+ gettext.bind_textdomain_codeset(DOMAINNAME, 'UTF-8')
+
+ # IBus.Bus() calls ibus_bus_new().
+ # Gtk.Builder().add_from_file() also calls ibus_bus_new_async()
+ # via ibus_im_context_new().
+ # Then if IBus.Bus() is called after Gtk.Builder().add_from_file(),
+ # the connection delay would be happened without an async
+ # finish function.
+ ibus_address = IBus.get_address()
+ bus = None
+ if ibus_address != None:
+ bus = IBus.Bus(connect_async='True')
+
+ builder_file = path.join(path.dirname(__file__), 'setup.ui')
+ self.__builder = builder = Gtk.Builder()
+ builder.set_translation_domain(DOMAINNAME)
+ builder.add_from_file(builder_file)
+
+ toplevel = builder.get_object('main')
+
+ try:
+ gnome_control_center_xid = int(environ['GNOME_CONTROL_CENTER_XID'])
+ except:
+ gnome_control_center_xid = 0
+
+ if gnome_control_center_xid != 0:
+ def set_transient(obj, pspec):
+ window = toplevel.get_window()
+ if window == None:
+ return
+ parent_window = GdkX11.X11Window.foreign_new_for_display(Gdk.Display.get_default(),
+ gnome_control_center_xid)
+ if parent_window != None:
+ window.set_transient_for(parent_window)
+ toplevel.set_wmclass('gnome-control-center', 'Gnome-control-center')
+ toplevel.set_modal(True)
+ toplevel.set_type_hint(Gdk.WindowTypeHint.DIALOG)
+ toplevel.connect('notify::window', set_transient)
+
+ toplevel.show()
+
+ if ibus_address == None:
+ builder.connect_signals(self)
+ # self.__run_message_dialog needs self.__builder.
+ self.__run_message_dialog(_("ibus is not running."),
+ Gtk.MessageType.ERROR)
+ return
+
+ if bus.is_connected():
+ self.__init_bus_connected(bus)
+ else:
+ bus.connect('connected', self.__init_bus_connected)
+
+ def __init_bus_connected(self, bus):
+ self.__config = bus.get_config()
+ builder = self.__builder
+
+ self.__thumb_kb_layout_mode = None
+ self.__thumb_kb_layout = None
+ self.__japanese_ordered_dict = {}
+ self.prefs = prefs = AnthyPrefs(None, self.__config)
+
+ # glade 'icon_name' property has a custom scaling and it seems
+ # to be difficult to show the complicated small icon in metacity.
+ # This can add the pixbuf without scaling.
+ anthydir = path.dirname(path.dirname(__file__))
+ if not anthydir:
+ anthydir = '/usr/share/ibus-anthy'
+ icon_path = path.join(anthydir, 'icons', 'ibus-anthy.png')
+ if path.exists(icon_path):
+ builder.get_object('main').set_icon_from_file(icon_path)
+ else:
+ icon_path = 'ibus-anthy'
+ builder.get_object('main').set_icon_name(icon_path)
+
+ for name in ['input_mode', 'typing_method', 'conversion_segment_mode',
+ 'period_style', 'symbol_style', 'ten_key_mode',
+ 'behavior_on_focus_out', 'behavior_on_period',
+ 'half_width_symbol', 'half_width_number', 'half_width_space',
+ 'latin_with_shift',
+ 'thumb:keyboard_layout_mode', 'thumb:keyboard_layout',
+ 'thumb:fmv_extension', 'thumb:handakuten']:
+ section, key = self.__get_section_key(name)
+ builder.get_object(name).set_active(prefs.get_value(section, key))
+
+ tv = builder.get_object('menu_visible:treeview')
+ ls = Gtk.ListStore(str, bool, str)
+ tv.set_model(ls)
+
+ column = Gtk.TreeViewColumn(' ')
+ renderer = Gtk.CellRendererToggle()
+ renderer.set_radio(False)
+ renderer.connect('toggled', self.__renderer_toggled_cb, ls)
+ column.pack_start(renderer, False)
+ column.set_cell_data_func(renderer,
+ self.__toggle_menu_visible_cell_cb,
+ 1)
+ tv.append_column(column)
+
+ column = Gtk.TreeViewColumn(_("Menu label"))
+ renderer = Gtk.CellRendererText()
+ column.pack_start(renderer, False)
+ column.set_cell_data_func(renderer,
+ self.__text_menu_visible_cell_cb,
+ 2)
+ tv.append_column(column)
+
+ self.__append_menus_in_model()
+
+ l = ['default', 'atok', 'wnn']
+ s_type = prefs.get_value('common', 'shortcut_type')
+ s_type = s_type if s_type in l else 'default'
+ builder.get_object('shortcut_type').set_active(l.index(s_type))
+
+ builder.get_object('page_size').set_value(prefs.get_value('common',
+ 'page_size'))
+
+ tv = builder.get_object('shortcut')
+ tv.append_column(Gtk.TreeViewColumn(_("Command"),
+ Gtk.CellRendererText(), text=0))
+ renderer = Gtk.CellRendererText()
+ renderer.set_property('ellipsize', Pango.EllipsizeMode.END)
+ tv.append_column(Gtk.TreeViewColumn(_("Shortcut"),
+ renderer, text=1))
+ tv.get_selection().connect_after('changed',
+ self.on_selection_changed, 0)
+ ls = Gtk.ListStore(str, str)
+ sec = 'shortcut/' + s_type
+ for k in self.prefs.keys(sec):
+ ls.append([k, l_to_s(self.prefs.get_value(sec, k))])
+ tv.set_model(ls)
+
+ self.__keymap = None
+ GLib.idle_add(self.__update_keymap_label,
+ priority = GLib.PRIORITY_LOW)
+
+ self.__thumb_kb_layout_mode = builder.get_object('thumb:keyboard_layout_mode')
+ self.__thumb_kb_layout = builder.get_object('thumb:keyboard_layout')
+ self.__set_thumb_kb_label()
+
+ for name in ['thumb:ls', 'thumb:rs']:
+ section, key = self.__get_section_key(name)
+ builder.get_object(name).set_text(prefs.get_value(section, key))
+
+ tv = builder.get_object('es:treeview')
+ tv.append_column(Gtk.TreeViewColumn('', Gtk.CellRendererText(), text=0))
+ tv.get_selection().connect_after('changed',
+ self.on_selection_changed, 1)
+ tv.set_model(Gtk.ListStore(str))
+
+ key = 'dict_admin_command'
+ cli = self.__get_dict_cli_from_list(prefs.get_value('common', key))
+ name = 'dict:entry_edit_dict_command'
+ builder.get_object(name).set_text(cli)
+ key = 'add_word_command'
+ cli = self.__get_dict_cli_from_list(prefs.get_value('common', key))
+ name = 'dict:entry_add_word_command'
+ builder.get_object(name).set_text(cli)
+
+ tv = builder.get_object('dict:view')
+
+ column = Gtk.TreeViewColumn(' ')
+ renderer = Gtk.CellRendererText()
+ column.pack_start(renderer, False)
+ column.set_cell_data_func(renderer, self.__text_cell_data_cb, 1)
+ tv.append_column(column)
+
+ column = Gtk.TreeViewColumn(_("Description"))
+ renderer = Gtk.CellRendererText()
+ column.pack_start(renderer, False)
+ column.set_cell_data_func(renderer, self.__text_cell_data_cb, 2)
+ column.set_expand(True)
+ tv.append_column(column)
+
+ # Translators: "Embd" is an abbreviation of "embedded".
+ column = Gtk.TreeViewColumn(_("Embd"))
+ renderer = Gtk.CellRendererToggle()
+ renderer.set_radio(False)
+ column.pack_start(renderer, False)
+ column.set_cell_data_func(renderer, self.__toggle_cell_data_cb, 3)
+ tv.append_column(column)
+
+ # Translators: "Sgl" is an abbreviation of "single".
+ column = Gtk.TreeViewColumn(_("Sgl"))
+ renderer = Gtk.CellRendererToggle()
+ renderer.set_radio(False)
+ column.pack_start(renderer, False)
+ column.set_cell_data_func(renderer, self.__toggle_cell_data_cb, 4)
+ tv.append_column(column)
+
+ '''
+ Unfortunately reverse conversion is too slow.
+ # Translators: "Rev" is an abbreviation of "reverse".
+ column = Gtk.TreeViewColumn(_("Rev"))
+ renderer = Gtk.CellRendererToggle()
+ renderer.set_radio(False)
+ column.pack_start(renderer, False)
+ column.set_cell_data_func(renderer, self.__toggle_cell_data_cb, 5)
+ tv.append_column(column)
+ '''
+
+ ls = Gtk.ListStore(str, str, str, bool, bool, bool)
+ tv.set_model(ls)
+ self.__append_dicts_in_model()
+
+ self.__init_japanese_sort()
+ self.__init_about_vbox(icon_path)
+
+ builder.connect_signals(self)
+
+ def __init_japanese_sort(self):
+ japanese_ordered_dict = {}
+ japanese_ordered_list = self.prefs.get_japanese_ordered_list()
+ for index, c in enumerate(japanese_ordered_list):
+ japanese_ordered_dict[c] = index
+ self.__japanese_ordered_dict = japanese_ordered_dict;
+
+ def __init_about_vbox(self, icon_path):
+ about_dialog = self.__builder.get_object('about_dialog')
+ about_vbox = self.__builder.get_object('about_vbox')
+ about_dialog.set_version(self.prefs.get_version())
+ if icon_path != None:
+ if icon_path[0] == '/':
+ image = Gtk.Image.new_from_file(icon_path)
+ about_dialog.set_logo(image.get_pixbuf())
+ else:
+ icon_theme = Gtk.IconTheme.get_default()
+ try:
+ pixbuf = icon_theme.load_icon(icon_path, 48, 0)
+ about_dialog.set_logo(pixbuf)
+ except Exception as err:
+ print('Not found icon', str(err), file=sys.stderr)
+ print('Need to run gtk-update-icon-cache', file=sys.stderr)
+ content_area = about_dialog.get_content_area()
+ list = content_area.get_children()
+ vbox = list[0]
+ for w in vbox.get_children():
+ old_parent = w.props.parent
+ w.unparent()
+ w.emit('parent-set', old_parent)
+ about_vbox.pack_start(w, False, False, 0)
+
+ def __get_userhome(self):
+ if 'HOME' not in environ:
+ import pwd
+ userhome = pwd.getpwuid(getuid()).pw_dir
+ else:
+ userhome = environ['HOME']
+ userhome = userhome.rstrip('/')
+ return userhome
+
+ def __get_section_key(self, name):
+ i = name.find(':')
+ if i > 0:
+ section = name[:i]
+ key = name[i + 1:]
+ else:
+ section = 'common'
+ key = name
+ return (section, key)
+
+ def __run_message_dialog(self, message, type=Gtk.MessageType.INFO):
+ dlg = Gtk.MessageDialog(parent=self.__builder.get_object('main'),
+ flags=Gtk.DialogFlags.MODAL,
+ message_type=type,
+ buttons=Gtk.ButtonsType.OK,
+ message_format=message)
+ dlg.run()
+ dlg.destroy()
+
+ def __japanese_tuple_sort(self, a, b):
+ if a[1] == b[1]:
+ # http://docs.python.org/3.0/whatsnew/3.0.html#ordering-comparisons
+ return (a[0] > b[0]) - (a[0] < b[0])
+ elif a[1] in self.__japanese_ordered_dict and \
+ b[1] in self.__japanese_ordered_dict:
+ return self.__japanese_ordered_dict[a[1]] - \
+ self.__japanese_ordered_dict[b[1]]
+ elif a[1] not in self.__japanese_ordered_dict and \
+ b[1] in self.__japanese_ordered_dict:
+ return 1
+ elif a[1] in self.__japanese_ordered_dict and \
+ b[1] not in self.__japanese_ordered_dict:
+ return -1
+ else:
+ return (a[1] > b[1]) - (a[1] < b[1])
+
+ def __japanese_thumb_sort(self, a, b):
+ # http://docs.python.org/3.0/whatsnew/3.0.html#ordering-comparisons
+ return (a[0] > b[0]) - (a[0] < b[0])
+
+ def __renderer_toggled_cb(self, renderer, path, model):
+ prefs = self.prefs
+ enabled = not model[path][1]
+ model[path][1] = enabled
+ key = model[path][0]
+ prefs.set_value('common', key, enabled)
+ self.__builder.get_object('btn_apply').set_sensitive(True)
+
+ def __toggle_menu_visible_cell_cb(self, column, renderer, model, iter, id):
+ l = self.__builder.get_object('menu_visible:treeview').get_model()
+ active = l.get_value(iter, id)
+ renderer.set_property('active', active)
+
+ def __text_menu_visible_cell_cb(self, column, renderer, model, iter, id):
+ l = self.__builder.get_object('menu_visible:treeview').get_model()
+ text = l.get_value(iter, id)
+ renderer.set_property('text', text)
+
+ def __append_menus_in_model(self):
+ prefs = self.prefs
+ l = self.__builder.get_object('menu_visible:treeview').get_model()
+ l.append(['show-input-mode',
+ prefs.get_value('common', 'show-input-mode'),
+ _("Input mode")])
+ l.append(['show-typing-method',
+ prefs.get_value('common', 'show-typing-method'),
+ _("Typing method")])
+ l.append(['show-segment-mode',
+ prefs.get_value('common', 'show-segment-mode'),
+ _("Segment mode")])
+ l.append(['show-dict-mode',
+ prefs.get_value('common', 'show-dict-mode'),
+ _("Dictionary mode")])
+ l.append(['show-dict-config',
+ prefs.get_value('common', 'show-dict-config'),
+ _("Dictionary - Anthy")])
+ l.append(['show-preferences',
+ prefs.get_value('common', 'show-preferences'),
+ _("Preferences - Anthy")])
+
+ def __get_romaji_treeview_custom_key_table(self, method):
+ prefs = self.prefs
+ rule = {}
+ ls = Gtk.ListStore(str, str, str)
+ tv = self.__builder.get_object('treeview_custom_key_table')
+ section_base = 'romaji_typing_rule'
+ section = section_base + '/' + prefs.str(method)
+ for key in prefs.keys(section):
+ key = prefs.str(key)
+ value = prefs.get_value(section, key)
+ ch = prefs.typing_from_config_key(key)
+ if ch == '':
+ continue
+ # config.set_value(key, None) is not supported.
+ if value != None and value != '':
+ rule[ch] = prefs.str(value)
+ for key in prefs.get_value(section_base, 'newkeys'):
+ key = prefs.str(key)
+ value = self.prefs.get_value_direct(section, key)
+ ch = prefs.typing_from_config_key(key)
+ if ch == '':
+ continue
+ # config.set_value(key, None) is not supported.
+ if value != None and value != '':
+ rule[ch] = prefs.str(value)
+ for key, value in sorted(list(rule.items()), \
+ key = functools.cmp_to_key(self.__japanese_tuple_sort)):
+ ls.append(['romaji', key, value])
+ tv.append_column(Gtk.TreeViewColumn(_(_("Input Chars")),
+ Gtk.CellRendererText(), text=1))
+ tv.append_column(Gtk.TreeViewColumn(_(_("Output Chars")),
+ Gtk.CellRendererText(), text=2))
+ tv.set_model(ls)
+ return tv
+
+ def __get_kana_treeview_custom_key_table(self, method):
+ prefs = self.prefs
+ rule = {}
+ ls = Gtk.ListStore(str, str, str)
+ tv = self.__builder.get_object('treeview_custom_key_table')
+ section_base = 'kana_typing_rule'
+ section = section_base + '/' + prefs.str(method)
+ for key in prefs.keys(section):
+ key = prefs.str(key)
+ value = prefs.get_value(section, key)
+ ch = prefs.typing_from_config_key(key)
+ if ch == '':
+ continue
+ # config.set_value(key, None) is not supported.
+ if value != None and value != '':
+ rule[ch] = prefs.str(value)
+ for key in prefs.get_value(section_base, 'newkeys'):
+ key = prefs.str(key)
+ value = self.prefs.get_value_direct(section, key)
+ ch = prefs.typing_from_config_key(key)
+ if ch == '':
+ continue
+ # config.set_value(key, None) is not supported.
+ if value != None and value != '':
+ rule[ch] = prefs.str(value)
+ for key, value in sorted(list(rule.items()), \
+ key = functools.cmp_to_key(self.__japanese_tuple_sort)):
+ ls.append(['kana', key, value])
+ tv.append_column(Gtk.TreeViewColumn(_(_("Input Chars")),
+ Gtk.CellRendererText(), text=1))
+ tv.append_column(Gtk.TreeViewColumn(_(_("Output Chars")),
+ Gtk.CellRendererText(), text=2))
+ tv.set_model(ls)
+ return tv
+
+ def __get_thumb_treeview_custom_key_table(self, method):
+ prefs = self.prefs
+ rule = {}
+ ls = Gtk.ListStore(str, str, str, str, str)
+ tv = self.__builder.get_object('treeview_custom_key_table')
+ section_base = 'thumb_typing_rule'
+ section = section_base + '/' + prefs.str(method)
+ for key in prefs.keys(section):
+ key = prefs.str(key)
+ value = prefs.get_value(section, key)
+ ch = prefs.typing_from_config_key(key)
+ if ch == '':
+ continue
+ # config.set_value(key, None) is not supported.
+ if value != None and len(value) == 3 and \
+ ((value[0] != None and value[0] != '') or \
+ (value[1] != None and value[1] != '') or \
+ (value[2] != None and value[2] != '')):
+ rule[ch] = {}
+ rule[ch][0] = prefs.str(value[0])
+ rule[ch][1] = prefs.str(value[1])
+ rule[ch][2] = prefs.str(value[2])
+ for key in prefs.get_value(section_base, 'newkeys'):
+ key = prefs.str(key)
+ value = self.prefs.get_value_direct(section, key)
+ ch = prefs.typing_from_config_key(key)
+ if ch == '':
+ continue
+ # config.set_value(key, None) is not supported.
+ if value != None and len(value) == 3 and \
+ ((value[0] != None and value[0] != '') or \
+ (value[1] != None and value[1] != '') or \
+ (value[2] != None and value[2] != '')):
+ rule[ch] = {}
+ rule[ch][0] = prefs.str(value[0])
+ rule[ch][1] = prefs.str(value[1])
+ rule[ch][2] = prefs.str(value[2])
+ for key, value in sorted(list(rule.items()), \
+ key = functools.cmp_to_key(self.__japanese_thumb_sort)):
+ ls.append(['thumb', key, value[0], value[2], value[1]])
+ tv.append_column(Gtk.TreeViewColumn(_(_("Input")),
+ Gtk.CellRendererText(), text=1))
+ tv.append_column(Gtk.TreeViewColumn(_(_("Single")),
+ Gtk.CellRendererText(), text=2))
+ tv.append_column(Gtk.TreeViewColumn(_(_("Left")),
+ Gtk.CellRendererText(), text=3))
+ tv.append_column(Gtk.TreeViewColumn(_(_("Right")),
+ Gtk.CellRendererText(), text=4))
+ tv.set_model(ls)
+ return tv
+
+ def __show_dialog_custom_key_table_extention(self, mode):
+ hbox_combo = self.__builder.get_object('hbox_for_combobox_custom_key_table')
+ label_left = self.__builder.get_object('label_left_thumb_shift_custom_key')
+ entry_left = self.__builder.get_object('entry_left_thumb_shift_custom_key')
+ label_right = self.__builder.get_object('label_right_thumb_shift_custom_key')
+ entry_right = self.__builder.get_object('entry_right_thumb_shift_custom_key')
+ if mode == 'thumb':
+ hbox_combo.show()
+ label_left.show()
+ entry_left.show()
+ label_right.show()
+ entry_right.show()
+ elif mode == 'kana':
+ hbox_combo.show()
+ label_left.hide()
+ entry_left.hide()
+ label_right.hide()
+ entry_right.hide()
+ else:
+ hbox_combo.hide()
+ label_left.hide()
+ entry_left.hide()
+ label_right.hide()
+ entry_right.hide()
+
+ def __connect_dialog_custom_key_table_buttons(self, mode):
+ tv = self.__builder.get_object('treeview_custom_key_table')
+ tv.get_selection().connect_after('changed',
+ self.on_selection_custom_key_table_changed, 0)
+ entry = self.__builder.get_object('entry_input_custom_key')
+ entry.connect('changed', self.on_entry_custom_key_changed, mode)
+ entry = self.__builder.get_object('entry_output_custom_key')
+ entry.connect('changed', self.on_entry_custom_key_changed, mode)
+ entry = self.__builder.get_object('entry_left_thumb_shift_custom_key')
+ entry.connect('changed', self.on_entry_custom_key_changed, mode)
+ entry = self.__builder.get_object('entry_right_thumb_shift_custom_key')
+ entry.connect('changed', self.on_entry_custom_key_changed, mode)
+ button = self.__builder.get_object('button_add_custom_key')
+ button.set_sensitive(False)
+ button.connect('clicked', self.on_btn_add_custom_key, mode)
+ button = self.__builder.get_object('button_remove_custom_key')
+ button.set_sensitive(False)
+ button.connect('clicked', self.on_btn_remove_custom_key, tv)
+
+ def __disconnect_dialog_custom_key_table_buttons(self):
+ tv = self.__builder.get_object('treeview_custom_key_table')
+ combobox = self.__builder.get_object('combobox_custom_key_table')
+ if tv != None:
+ for column in tv.get_columns():
+ tv.remove_column(column)
+ for child in tv.get_children():
+ tv.remove(child)
+ entry = self.__builder.get_object('entry_input_custom_key')
+ entry.disconnect_by_func(self.on_entry_custom_key_changed)
+ entry.set_text('')
+ entry = self.__builder.get_object('entry_output_custom_key')
+ entry.disconnect_by_func(self.on_entry_custom_key_changed)
+ entry.set_text('')
+ entry = self.__builder.get_object('entry_left_thumb_shift_custom_key')
+ entry.disconnect_by_func(self.on_entry_custom_key_changed)
+ entry = self.__builder.get_object('entry_right_thumb_shift_custom_key')
+ entry.disconnect_by_func(self.on_entry_custom_key_changed)
+ button = self.__builder.get_object('button_add_custom_key')
+ button.disconnect_by_func(self.on_btn_add_custom_key)
+ button = self.__builder.get_object('button_remove_custom_key')
+ button.disconnect_by_func(self.on_btn_remove_custom_key)
+ combobox.clear()
+ combobox.disconnect_by_func(self.on_cb_custom_key_table_changed)
+
+ def __run_dialog_custom_key_table(self, mode):
+ prefs = self.prefs
+ dlg = self.__builder.get_object('dialog_custom_key_table')
+ label = self.__builder.get_object('label_custom_key_table')
+ label_output = self.__builder.get_object('label_output_custom_key')
+ list_labels = []
+ if mode == 'romaji':
+ dlg.set_title(_("Customize Romaji Key Table"))
+ label.set_label(_("_Romaji Key Table:"))
+ label_output.set_label(_("_Output Chars"))
+ list_labels = [['default', _("Default")]]
+ self.__show_dialog_custom_key_table_extention(mode)
+ elif mode == 'kana':
+ dlg.set_title(_("Customize Kana Key Table"))
+ label.set_label(_("_Kana Key Table:"))
+ label_output.set_label(_("_Output Chars"))
+ list_labels = [['jp', _("Japanese Keyboard Layout")],
+ ['us', _("U.S. Keyboard Layout")]]
+ self.__show_dialog_custom_key_table_extention(mode)
+ elif mode == 'thumb':
+ dlg.set_title(_("Customize Thumb Shift Key Table"))
+ label.set_label(_("_Thumb Shift Key Table:"))
+ label_output.set_label(_("Single _Output Chars"))
+ list_labels = [['base', _("Base")],
+ ['nicola_j_table', _("NICOLA-J key extension")],
+ ['nicola_a_table', _("NICOLA-A key extension")],
+ ['nicola_f_table', _("NICOLA-F key extension")],
+ ['kb231_j_fmv_table', _("FMV KB231-J key extension")],
+ ['kb231_a_fmv_table', _("FMV KB231-A key extension")],
+ ['kb231_f_fmv_table', _("FMV KB231-F key extension")],
+ ['kb611_j_fmv_table', _("FMV KB611-J key extension")],
+ ['kb611_a_fmv_table', _("FMV KB611-A key extension")],
+ ['kb611_f_fmv_table', _("FMV KB611-F key extension")],
+ ]
+ self.__show_dialog_custom_key_table_extention(mode)
+ ls = Gtk.ListStore(str, str)
+ for s in list_labels:
+ ls.append([s[1], s[0]])
+ renderer = Gtk.CellRendererText()
+ combobox = self.__builder.get_object('combobox_custom_key_table')
+ combobox.pack_start(renderer, True)
+ combobox.add_attribute(renderer, 'text', 0)
+ combobox.set_model(ls)
+
+ tv = None
+ if mode == 'romaji':
+ method = prefs.get_value('romaji_typing_rule', 'method')
+ if method == None:
+ method = 'default'
+ tv = self.__get_romaji_treeview_custom_key_table(method)
+ if mode == 'kana':
+ method = prefs.get_value('kana_typing_rule', 'method')
+ if method == None:
+ method = 'jp'
+ tv = self.__get_kana_treeview_custom_key_table(method)
+ if mode == 'thumb':
+ method = prefs.get_value('thumb_typing_rule', 'method')
+ if method == None:
+ method = 'base'
+ tv = self.__get_thumb_treeview_custom_key_table(method)
+
+ self.__connect_dialog_custom_key_table_buttons(mode)
+
+ id = 0
+ # thumb uses all tables so the default is always 0.
+ if mode != 'thumb':
+ for index, labels in enumerate(list_labels):
+ if labels[0] == method:
+ id = index
+ break
+ combobox.set_active(id)
+ combobox.connect('changed', self.on_cb_custom_key_table_changed, mode)
+
+ id = dlg.run()
+ dlg.hide()
+
+ self.__disconnect_dialog_custom_key_table_buttons()
+
+ def __set_thumb_kb_label(self):
+ if self.__thumb_kb_layout_mode == None or \
+ self.__thumb_kb_layout == None:
+ return
+ section, key = self.__get_section_key(
+ Gtk.Buildable.get_name(self.__thumb_kb_layout_mode))
+ layout_mode = self.prefs.get_value(section, key)
+ if layout_mode:
+ self.__thumb_kb_layout.set_sensitive(False)
+ else:
+ self.__thumb_kb_layout.set_sensitive(True)
+
+ def __get_dict_cli_from_list(self, cli_list):
+ cli_str = cli_list[0]
+ if len(cli_list) <= 2:
+ return cli_str
+ cli_str = cli_str + ' ' + ' '.join(cli_list[2:])
+ return cli_str
+
+ def __get_quoted_id(self, file):
+ id = file
+ has_mbcs = False
+
+ for i in range(0, len(id)):
+ if ord(id[i]) >= 0x7f:
+ has_mbcs = True
+ break
+ if has_mbcs:
+ id = str(binascii.hexlify(id.encode()), 'ascii')
+
+ if id.find('/') >=0:
+ id = id[id.rindex('/') + 1:]
+ if id.find('.') >=0:
+ id = id[:id.rindex('.')]
+
+ if id.startswith('0x'):
+ id = str(binascii.hexlify(id.encode()), 'ascii')
+ has_mbcs = True
+ if has_mbcs:
+ id = '0x' + id
+ return id
+
+ def __get_dict_file_from_id(self, selected_id):
+ files = self.prefs.get_value('dict', 'files')
+ retval = None
+
+ for file in files:
+ id = self.__get_quoted_id(file)
+ # The selected_id is already quoted.
+ if selected_id == id:
+ retval = file
+ break
+ return retval
+
+ def __is_system_dict_file_from_id(self, selected_id):
+ prefs = self.prefs
+ section = 'dict/file/' + selected_id
+ key = 'is_system'
+
+ if key not in prefs.keys(section):
+ return False
+ return prefs.get_value(section, key)
+
+ def __append_dict_id_in_model(self, id, is_gettext):
+ prefs = self.prefs
+ section = 'dict/file/' + id
+ # user value is dbus.String
+ prefs.set_value(section, 'short_label',
+ prefs.str(prefs.get_value(section, 'short_label')))
+ prefs.set_value(section, 'long_label',
+ prefs.str(prefs.get_value(section, 'long_label')))
+ short_label = prefs.get_value(section, 'short_label')
+ long_label = prefs.get_value(section, 'long_label')
+ embed = prefs.get_value(section, 'embed')
+ single = prefs.get_value(section, 'single')
+ reverse = prefs.get_value(section, 'reverse')
+ if is_gettext:
+ long_label = _(long_label)
+ l = self.__builder.get_object('dict:view').get_model()
+ l.append([id, short_label, long_label, embed, single, reverse])
+
+ def __append_dicts_in_model(self):
+ prefs = self.prefs
+ for file in prefs.get_value('dict', 'files'):
+ if not path.exists(file):
+ continue
+ id = self.__get_quoted_id(file)
+ section = 'dict/file/' + id
+ if section not in prefs.sections():
+ self.__fetch_dict_values(section)
+ is_system_dict = self.__is_system_dict_file_from_id(id)
+ self.__append_dict_id_in_model(id, is_system_dict)
+
+ def __append_user_dict_from_dialog(self, file, id, new):
+ files = self.prefs.get_value('dict', 'files')
+
+ if new:
+ if file in files:
+ self.__run_message_dialog(_("Your choosed file has already been added: ") + file,
+ Gtk.MessageType.ERROR)
+ return
+ if not path.exists(file):
+ self.__run_message_dialog(_("The file you have chosen does not exist: ") + file,
+ Gtk.MessageType.ERROR)
+ return
+ if path.isdir(file):
+ self.__run_message_dialog(_("Your choosed file is a directory: " + file),
+ Gtk.MessageType.ERROR)
+ return
+ if file.startswith(self.__get_userhome() + '/.anthy'):
+ self.__run_message_dialog(_("You cannot add dictionaries in the anthy private directory: " + file),
+ Gtk.MessageType.ERROR)
+ return
+
+ if new:
+ id = self.__get_quoted_id(file)
+ if id == None or id == '':
+ self.__run_message_dialog(_("Your file path is not good: ") + file,
+ Gtk.MessageType.ERROR)
+ return
+
+ single = self.__builder.get_object('dict:single').get_active()
+ embed = self.__builder.get_object('dict:embed').get_active()
+ reverse = self.__builder.get_object('dict:reverse').get_active()
+ short_label = self.__builder.get_object('dict:short_entry').get_text()
+ if len(short_label) > 1:
+ short_label = short_label[0]
+ long_label = self.__builder.get_object('dict:long_entry').get_text()
+
+ if new:
+ files.append(file)
+ self.prefs.set_value('dict', 'files', files)
+
+ if short_label == None or short_label == '':
+ short_label = id[0]
+ if long_label == None or long_label == '':
+ long_label = id
+ self.__update_dict_values(new, id, short_label, long_label, embed, single, reverse)
+ self.__builder.get_object('btn_apply').set_sensitive(True)
+ files = []
+
+ def __init_dict_chooser_dialog(self):
+ self.__builder.get_object('dict:single').set_active(True)
+ self.__builder.get_object('dict:embed').set_active(False)
+ self.__builder.get_object('dict:reverse').set_active(False)
+ short_entry = self.__builder.get_object('dict:short_entry')
+ short_entry.set_text('')
+ short_entry.set_editable(True)
+ long_entry = self.__builder.get_object('dict:long_entry')
+ long_entry.set_text('')
+ long_entry.set_editable(True)
+
+ def __get_selected_dict_id(self):
+ l, it = self.__builder.get_object('dict:view').get_selection().get_selected()
+
+ if not it:
+ return None
+ return l.get_value(it, 0)
+
+ def __set_selected_dict_to_dialog(self):
+ selected_id = self.__get_selected_dict_id()
+ if selected_id == None:
+ return None
+
+ is_system_dict = self.__is_system_dict_file_from_id(selected_id)
+
+ prefs = self.prefs
+ section = 'dict/file/' + selected_id
+ short_label = prefs.get_value(section, 'short_label')
+ long_label = prefs.get_value(section, 'long_label')
+ embed = prefs.get_value(section, 'embed')
+ single = prefs.get_value(section, 'single')
+ reverse = prefs.get_value(section, 'reverse')
+
+ if len(short_label) > 1:
+ short_label = short_label[0]
+ self.__builder.get_object('dict:single').set_active(single)
+ self.__builder.get_object('dict:embed').set_active(embed)
+ self.__builder.get_object('dict:reverse').set_active(reverse)
+ short_entry = self.__builder.get_object('dict:short_entry')
+ short_entry.set_text(short_label)
+ long_entry = self.__builder.get_object('dict:long_entry')
+ if is_system_dict:
+ short_entry.set_editable(False)
+ long_entry.set_text(_(long_label))
+ long_entry.set_editable(False)
+ else:
+ short_entry.set_editable(True)
+ long_entry.set_text(long_label)
+ long_entry.set_editable(True)
+
+ return selected_id
+
+ def __fetch_dict_values(self, section):
+ prefs = self.prefs
+ prefs.set_new_section(section)
+ prefs.set_new_key(section, 'short_label')
+ prefs.fetch_item(section, 'short_label')
+ # user value is dbus.String
+ prefs.set_value(section, 'short_label',
+ prefs.str(prefs.get_value(section, 'short_label')))
+ prefs.set_new_key(section, 'long_label')
+ prefs.fetch_item(section, 'long_label')
+ prefs.set_value(section, 'long_label',
+ prefs.str(prefs.get_value(section, 'long_label')))
+ prefs.set_new_key(section, 'embed')
+ prefs.fetch_item(section, 'embed')
+ prefs.set_new_key(section, 'single')
+ prefs.fetch_item(section, 'single')
+ prefs.set_new_key(section, 'reverse')
+ prefs.fetch_item(section, 'reverse')
+
+ def __update_dict_values(self, new, id, short_label, long_label, embed, single, reverse):
+ prefs = self.prefs
+ section = 'dict/file/' + id
+ if section not in prefs.sections():
+ prefs.set_new_section(section)
+
+ is_system_dict = self.__is_system_dict_file_from_id(id)
+ if is_system_dict:
+ if 'short_label' in prefs.keys(section):
+ short_label = prefs.get_value(section, 'short_label')
+ if 'long_label' in prefs.keys(section):
+ long_label = prefs.get_value(section, 'long_label')
+
+ if new:
+ l = self.__builder.get_object('dict:view').get_model()
+ l.append([id, short_label, long_label, embed, single, reverse])
+ else:
+ l, i = self.__builder.get_object('dict:view').get_selection().get_selected()
+ if i :
+ l[i] = [id, short_label, long_label, embed, single, reverse]
+
+ key = 'short_label'
+ prefs.set_value(section, key, short_label)
+ key = 'long_label'
+ prefs.set_value(section, key, long_label)
+ key = 'embed'
+ prefs.set_value(section, key, embed)
+ key = 'single'
+ prefs.set_value(section, key, single)
+ key = 'reverse'
+ prefs.set_value(section, key, reverse)
+
+ def __text_cell_data_cb(self, column, renderer, model, iter, id):
+ l = self.__builder.get_object('dict:view').get_model()
+ text = l.get_value(iter, id)
+ renderer.set_property('text', text)
+
+ def __toggle_cell_data_cb(self, column, renderer, model, iter, id):
+ l = self.__builder.get_object('dict:view').get_model()
+ active = l.get_value(iter, id)
+ renderer.set_property('active', active)
+
+ def __resync_engine_file(self):
+ user_config = path.join(self.__get_userhome(), '.config',
+ 'ibus-anthy', 'engines.xml')
+ system_config = path.join(config.PKGDATADIR, 'engine', 'default.xml')
+ if not path.exists(user_config):
+ return
+ if not path.exists(system_config):
+ os.unlink(user_config)
+ return
+
+ # path.getmtime depends on the build time rather than install time.
+ def __get_engine_file_version(engine_file):
+ version_str = ''
+ dom = xml.dom.minidom.parse(engine_file)
+ elements = dom.getElementsByTagName('version')
+ nodes = []
+ if len(elements) > 0:
+ nodes = elements[0].childNodes
+ if len(nodes) > 0:
+ version_str = nodes[0].data
+ if version_str != '':
+ version_str = version_str.strip()
+ return version_str
+
+ user_config_version = __get_engine_file_version(user_config)
+ system_config_version = __get_engine_file_version(system_config)
+ if system_config_version > user_config_version:
+ import shutil
+ shutil.copyfile(system_config, user_config)
+
+ def __get_engine_file(self):
+ user_config = path.join(self.__get_userhome(), '.config',
+ 'ibus-anthy', 'engines.xml')
+ system_config = path.join(config.PKGDATADIR, 'engine', 'default.xml')
+ engine_file = None
+ for f in [user_config, system_config]:
+ if path.exists(f):
+ engine_file = f
+ break
+ if engine_file == None:
+ self.__run_message_dialog(_("The engine xml file does not exist: ") + system_config,
+ Gtk.MessageType.ERROR)
+ return None
+ return engine_file
+
+ def __get_keymap(self):
+ keymap = ''
+ layout = ''
+ variant = ''
+ option = ''
+ engine_file = self.__get_engine_file()
+ if engine_file == None:
+ return None
+
+ dom = xml.dom.minidom.parse(engine_file)
+ nodes = dom.getElementsByTagName('layout')[0].childNodes
+ if len(nodes) > 0:
+ layout = nodes[0].data
+ if layout != '':
+ keymap = layout.strip()
+ nodes = dom.getElementsByTagName('layout_variant')[0].childNodes
+ if len(nodes) > 0:
+ variant = nodes[0].data
+ if variant != '':
+ keymap += '(' + varaint.strip() + ')'
+ nodes = dom.getElementsByTagName('layout_option')[0].childNodes
+ if len(nodes) > 0:
+ option = nodes[0].data
+ if option != '':
+ keymap += '[' + option.strip() + ']'
+ return keymap
+
+ def __parse_keymap(self, keymap):
+ layout = None
+ variant = None
+ option = None
+
+ length = keymap.find('(')
+ if length >= 0:
+ if layout == None:
+ layout = keymap[0:length]
+ keymap = keymap[length + 1:]
+ length = keymap.find(')')
+ if length > 0:
+ variant = keymap[0:length]
+ keymap = keymap[length + 1:]
+ else:
+ print('Invalid keymap', keymap, file=sys.stderr)
+ return ('', '', '')
+ length = keymap.find('[')
+ if length >= 0:
+ if layout == None:
+ layout = keymap[0:length]
+ keymap = keymap[length + 1:]
+ length = keymap.find(']')
+ if length > 0:
+ option = keymap[0:length]
+ keymap = keymap[length + 1:]
+ else:
+ print('Invalid keymap', keymap, file=sys.stderr)
+ return ('', '', '')
+
+ if layout == None:
+ layout = keymap
+ if layout == None:
+ layout = ''
+ if variant == None:
+ variant = ''
+ if option == None:
+ option = ''
+ return (layout, variant, option)
+
+ def __save_keymap(self):
+ engine_file = self.__get_engine_file()
+ if engine_file == None:
+ return None
+
+ (layout, variant, option) = self.__parse_keymap(self.__keymap)
+
+ dom = xml.dom.minidom.parse(engine_file)
+ nodes = dom.getElementsByTagName('layout')[0].childNodes
+ if len(nodes) == 0:
+ nodes.append(dom.createTextNode(layout))
+ else:
+ nodes[0].data = layout
+ nodes = dom.getElementsByTagName('layout_variant')[0].childNodes
+ if len(nodes) == 0:
+ nodes.append(dom.createTextNode(variant))
+ else:
+ nodes[0].data = variant
+ nodes = dom.getElementsByTagName('layout_option')[0].childNodes
+ if len(nodes) == 0:
+ nodes.append(dom.createTextNode(option))
+ else:
+ nodes[0].data = option
+ nodes = dom.getElementsByTagName('symbol')[0].childNodes
+ user_config = path.join(self.__get_userhome(), '.config',
+ 'ibus-anthy', 'engines.xml')
+ dir = path.dirname(user_config)
+ if not path.exists(dir):
+ os.makedirs(dir, 0o700)
+ # io.open() causes TypeError for unicode.
+ f = codecs.open(user_config, 'w', 'utf-8')
+ dom.writexml(f, '', '', '', 'utf-8')
+ f.close()
+ os.chmod(user_config, 0o600)
+ self.__keymap = None
+ self.__run_message_dialog(_("Anthy keyboard layout is changed. "
+ "Please restart ibus to reload the layout."))
+
+ def __update_keymap_label(self):
+ self.__resync_engine_file()
+ prefs = self.prefs
+ keymap = self.__get_keymap()
+ if keymap == None:
+ return
+ if keymap == '':
+ keymap = 'default'
+ keymap_list = prefs.get_value('common', 'keyboard_layouts')
+ if keymap != None and not keymap in keymap_list:
+ keymap_list.append(keymap)
+ index = -1
+ if keymap != None:
+ index = keymap_list.index(keymap)
+ model = Gtk.ListStore(str)
+ for k in keymap_list:
+ if k == 'default':
+ k = _("Default")
+ model.append([k])
+ combobox = self.__builder.get_object('keymap:combobox_custom_table')
+ combobox.set_model(model)
+ combobox.set_active(0)
+ if index >= 0:
+ combobox.set_active(index)
+ combobox.connect_after('changed',
+ self.on_cb_keymap_changed,
+ 0)
+
+ def __save_preferences(self):
+ self.prefs.commit_all()
+ if self.__keymap != None:
+ self.__save_keymap()
+
+ def on_selection_changed(self, widget, id):
+ set_sensitive = lambda a, b: self.__builder.get_object(a).set_sensitive(b)
+ flg = True if widget.get_selected()[1] else False
+ for name in [['btn_default', 'btn_edit'], ['es:button_refresh', 'es:button_del']][id]:
+ set_sensitive(name, flg)
+
+ def on_selection_custom_key_table_changed(self, widget, id):
+ l, i = widget.get_selected()
+ # if 'combobox_custom_key_table' is changed,
+ # 'treeview_custom_key_table' also receives this signal
+ # but no selection.
+ if i == None:
+ return
+ button = self.__builder.get_object('button_remove_custom_key')
+ button.set_sensitive(True)
+
+ def on_main_delete(self, widget, event):
+ self.on_btn_cancel_clicked(widget)
+ return True
+
+ def on_btn_ok_clicked(self, widget):
+ if self.__builder.get_object('btn_apply').get_state() == \
+ Gtk.StateType.INSENSITIVE:
+ Gtk.main_quit()
+ return True
+ dlg = self.__builder.get_object('quit_check')
+ dlg.set_markup('<big><b>%s</b></big>' % _("Confirmation"))
+ dlg.format_secondary_text(
+ _("You are about to close the setup dialog, is that OK?"))
+ id = dlg.run()
+ dlg.hide()
+ if id == Gtk.ResponseType.YES:
+ self.__save_preferences()
+ Gtk.main_quit()
+ return True
+
+ def on_btn_cancel_clicked(self, widget):
+ if self.__builder.get_object('btn_apply').get_state() == \
+ Gtk.StateType.INSENSITIVE:
+ Gtk.main_quit()
+ return True
+ dlg = self.__builder.get_object('quit_check_without_save')
+ dlg.set_markup('<big><b>%s</b></big>' % _("Notice!"))
+ dlg.format_secondary_text(
+ _("You are about to close the setup dialog without saving your changes, is that OK?"))
+ id = dlg.run()
+ dlg.hide()
+ if id == Gtk.ResponseType.YES:
+ Gtk.main_quit()
+ return True
+
+ def on_btn_apply_clicked(self, widget):
+ self.__save_preferences()
+ widget.set_sensitive(False)
+
+ def on_cb_changed(self, widget):
+ section, key = self.__get_section_key(Gtk.Buildable.get_name(widget))
+ self.prefs.set_value(section, key, widget.get_active())
+ self.__builder.get_object('btn_apply').set_sensitive(True)
+
+ def on_cb_keymap_changed(self, widget, id):
+ it = widget.get_active()
+ model = widget.get_model()
+ keymap = model[it][0]
+ if keymap == _("Default"):
+ keymap = 'default'
+ if self.__keymap == keymap:
+ return
+ self.__keymap = keymap
+ self.__builder.get_object('btn_apply').set_sensitive(True)
+
+ def on_cb_custom_key_table_changed(self, widget, user_data):
+ prefs = self.prefs
+ tv = self.__builder.get_object('treeview_custom_key_table')
+ mode = user_data
+ id = widget.get_active()
+ model = widget.get_model()
+ method = model[id][1]
+ if tv != None:
+ for column in tv.get_columns():
+ tv.remove_column(column)
+ for child in tv.get_children():
+ tv.remove(child)
+ if mode == 'romaji':
+ tv = self.__get_romaji_treeview_custom_key_table(method)
+ elif mode == 'kana':
+ prefs.set_value('kana_typing_rule', 'method', method)
+ self.__builder.get_object('btn_apply').set_sensitive(True)
+ tv = self.__get_kana_treeview_custom_key_table(method)
+ elif mode == 'thumb':
+ # thumb uses all tables so do not save the method.
+ tv = self.__get_thumb_treeview_custom_key_table(method)
+
+ def on_sb_changed(self, widget):
+ section, key = self.__get_section_key(Gtk.Buildable.get_name(widget))
+ self.prefs.set_value(section, key, widget.get_value_as_int())
+ self.__builder.get_object('btn_apply').set_sensitive(True)
+
+ def on_ck_toggled(self, widget):
+ section, key = self.__get_section_key(Gtk.Buildable.get_name(widget))
+ self.prefs.set_value(section, key, widget.get_active())
+ self.__builder.get_object('btn_apply').set_sensitive(True)
+ if self.__thumb_kb_layout_mode and \
+ Gtk.Buildable.get_name(widget) == \
+ Gtk.Buildable.get_name(self.__thumb_kb_layout_mode):
+ self.__set_thumb_kb_label()
+
+ def on_btn_edit_clicked(self, widget):
+ ls, it = self.__builder.get_object('shortcut').get_selection().get_selected()
+ m = self.__builder.get_object('es:treeview').get_model()
+ m.clear()
+ for s in s_to_l(ls.get(it, 1)[0]):
+ m.append([s])
+ self.__builder.get_object('es:entry').set_text('')
+ for w in ['es:checkbutton_ctrl', 'es:checkbutton_alt', 'es:checkbutton_shift']:
+ self.__builder.get_object(w).set_active(False)
+ dlg = self.__builder.get_object('edit_shortcut')
+ id = dlg.run()
+ dlg.hide()
+ if id == Gtk.ResponseType.OK:
+ new = l_to_s([m[i][0] for i in range(len(m))])
+ if new != ls.get(it, 1)[0]:
+ sec = self._get_shortcut_sec()
+ self.prefs.set_value(sec, ls.get(it, 0)[0], s_to_l(new))
+ ls.set(it, 1, new)
+ self.__builder.get_object('btn_apply').set_sensitive(True)
+
+ def on_btn_default_clicked(self, widget):
+ ls, it = self.__builder.get_object('shortcut').get_selection().get_selected()
+ sec = self._get_shortcut_sec()
+ new = l_to_s(self.prefs.default[sec][ls.get(it, 0)[0]])
+ if new != ls.get(it, 1)[0]:
+ self.prefs.set_value(sec, ls.get(it, 0)[0], s_to_l(new))
+ ls.set(it, 1, new)
+ self.__builder.get_object('btn_apply').set_sensitive(True)
+
+ def on_btn_romaji_custom_table_clicked(self, widget):
+ self.__run_dialog_custom_key_table('romaji')
+
+ def on_btn_kana_custom_table_clicked(self, widget):
+ self.__run_dialog_custom_key_table('kana')
+
+ def on_btn_thumb_custom_table_clicked(self, widget):
+ self.__run_dialog_custom_key_table('thumb')
+
+ def on_btn_add_custom_key(self, widget, user_data):
+ prefs = self.prefs
+ input = self.__builder.get_object('entry_input_custom_key')
+ output = self.__builder.get_object('entry_output_custom_key')
+ left = self.__builder.get_object('entry_left_thumb_shift_custom_key')
+ right = self.__builder.get_object('entry_right_thumb_shift_custom_key')
+ model = self.__builder.get_object('treeview_custom_key_table').get_model()
+ combobox = self.__builder.get_object('combobox_custom_key_table')
+ id = combobox.get_active()
+ model_combobox = combobox.get_model()
+ method = model_combobox[id][1]
+ type = user_data
+ section_base = None
+ key = input.get_text()
+ value = output.get_text()
+ left_text = left.get_text()
+ right_text = right.get_text()
+
+ if key == None:
+ self.__run_message_dialog(_("Please specify Input Chars"))
+ return
+ elif value == None:
+ self.__run_message_dialog(_("Please specify Output Chars"))
+ return
+ elif type == 'thumb' and left_text == None:
+ self.__run_message_dialog(_("Please specify Left Thumb Shift Chars"))
+ return
+ elif type == 'thumb' and right_text == None:
+ self.__run_message_dialog(_("Please specify Right Thumb Shift Chars"))
+ return
+
+ if type == 'romaji':
+ section_base = 'romaji_typing_rule'
+ model.append([type, key, value])
+ elif type == 'kana':
+ section_base = 'kana_typing_rule'
+ model.append([type, key, value])
+ elif type == 'thumb':
+ section_base = 'thumb_typing_rule'
+ model.append([type, key, value, left_text, right_text])
+ if section_base == None:
+ self.__run_message_dialog(_("Your custom key is not assigned in any sections. Maybe a bug."))
+ return
+ gkey = prefs.typing_to_config_key(key)
+ if gkey == '':
+ return
+ key = gkey
+ section = section_base + '/' + method
+ if key not in prefs.keys(section):
+ # ibus does not support gconf_client_all_entries().
+ # prefs.fetch_section() doesn't get the keys if they exist
+ # in gconf only.
+ # Use newkeys for that way.
+ newkeys = prefs.get_value(section_base, 'newkeys')
+ if key not in newkeys:
+ newkeys.append(key)
+ prefs.set_value(section_base, 'newkeys', newkeys)
+ if type != 'thumb':
+ prefs.set_value(section, key, value)
+ else:
+ prefs.set_value(section, key, [value, right_text, left_text])
+ left.set_text('')
+ right.set_text('')
+ input.set_text('')
+ output.set_text('')
+ self.__builder.get_object('btn_apply').set_sensitive(True)
+
+ def on_btn_remove_custom_key(self, widget, user_data):
+ prefs = self.prefs
+ combobox = self.__builder.get_object('combobox_custom_key_table')
+ id = combobox.get_active()
+ model_combobox = combobox.get_model()
+ method = model_combobox[id][1]
+ tv = user_data
+ l, i = tv.get_selection().get_selected()
+ type = l[i][0]
+ key = l[i][1]
+ section_base = None
+ if type == 'romaji':
+ section_base = 'romaji_typing_rule'
+ elif type == 'kana':
+ section_base = 'kana_typing_rule'
+ elif type == 'thumb':
+ section_base = 'thumb_typing_rule'
+ if section_base == None:
+ self.__run_message_dialog(_("Your custom key is not assigned in any sections. Maybe a bug."))
+ return
+ section = section_base + '/' + method
+ newkeys = prefs.get_value(section_base, 'newkeys')
+ gkey = prefs.typing_to_config_key(key)
+ if gkey == '':
+ return
+ key = gkey
+ if key in newkeys:
+ newkeys.remove(key)
+ prefs.set_value(section_base, 'newkeys', newkeys)
+ # config.set_value(key, None) is not supported.
+ if type != 'thumb':
+ prefs.set_value(section, key, '')
+ else:
+ prefs.set_value(section, key, ['', '', ''])
+ l.remove(i)
+ widget.set_sensitive(False)
+ self.__builder.get_object('btn_apply').set_sensitive(True)
+
+ def on_btn_thumb_key_clicked(self, widget):
+ if Gtk.Buildable.get_name(widget) == 'thumb:button_ls':
+ entry = 'thumb:ls'
+ elif Gtk.Buildable.get_name(widget) == 'thumb:button_rs':
+ entry = 'thumb:rs'
+ else:
+ return
+ text = self.__builder.get_object(entry).get_text()
+ tv = self.__builder.get_object('es:treeview')
+ m = tv.get_model()
+ m.clear()
+ if text != None:
+ m.append([text])
+ i = m.get_iter_first()
+ tv.get_selection().select_iter(i)
+ self.__builder.get_object('es:entry').set_text('')
+ self.__builder.get_object('es:button_add').hide()
+ self.__builder.get_object('es:button_refresh').show()
+ self.__builder.get_object('es:button_del').hide()
+ for w in ['es:checkbutton_ctrl', 'es:checkbutton_alt', 'es:checkbutton_shift']:
+ self.__builder.get_object(w).set_active(False)
+ dlg = self.__builder.get_object('edit_shortcut')
+ id = dlg.run()
+ dlg.hide()
+ self.__builder.get_object('es:button_add').show()
+ self.__builder.get_object('es:button_refresh').hide()
+ self.__builder.get_object('es:button_del').show()
+ if id == Gtk.ResponseType.OK:
+ l, i = tv.get_selection().get_selected()
+ new = l[i][0]
+ if new != text:
+ section, key = self.__get_section_key(entry)
+ self.prefs.set_value(section, key, new)
+ self.__builder.get_object(entry).set_text(new)
+ self.__builder.get_object('btn_apply').set_sensitive(True)
+
+ def on_btn_dict_command_clicked(self, widget):
+ if Gtk.Buildable.get_name(widget) == 'dict:btn_edit_dict_command':
+ key = 'dict_admin_command'
+ elif Gtk.Buildable.get_name(widget) == 'dict:btn_add_word_command':
+ key = 'add_word_command'
+ else:
+ return
+ command = self.prefs.get_value('common', key)
+ if not path.exists(command[0]):
+ self.__run_message_dialog(_("Your file does not exist: ") + command[0],
+ Gtk.MessageType.ERROR)
+ return
+ os.spawnl(os.P_NOWAIT, *command)
+
+ def on_btn_dict_add_clicked(self, widget):
+ file = None
+ id = None
+
+ if Gtk.Buildable.get_name(widget) == 'dict:btn_add':
+ dlg = Gtk.FileChooserDialog(title=_("Open Dictionary File"),
+ parent=self.__builder.get_object('main'),
+ action=Gtk.FileChooserAction.OPEN,
+ buttons=(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
+ Gtk.STOCK_OPEN, Gtk.ResponseType.OK))
+ if Gtk.Buildable.get_name(widget) == 'dict:btn_edit':
+ dlg = Gtk.Dialog(title=_("Edit Dictionary File"),
+ parent=self.__builder.get_object('main'),
+ flags=Gtk.DialogFlags.MODAL,
+ buttons=(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
+ Gtk.STOCK_OK, Gtk.ResponseType.OK))
+
+ vbox = self.__builder.get_object('dict:add_extra_vbox')
+ if Gtk.Buildable.get_name(widget) == 'dict:btn_add':
+ # Need to init for the second time
+ self.__init_dict_chooser_dialog()
+ dlg.set_extra_widget(vbox)
+ if Gtk.Buildable.get_name(widget) == 'dict:btn_edit':
+ id = self.__set_selected_dict_to_dialog()
+ if id == None:
+ self.__run_message_dialog(_("Your choosed file is not correct."),
+ Gtk.MessageType.ERROR)
+ return
+ parent_vbox = dlg.vbox
+ parent_vbox.add(vbox)
+ vbox.show_all()
+
+ if dlg.run() == Gtk.ResponseType.OK:
+ if Gtk.Buildable.get_name(widget) == 'dict:btn_add':
+ file = dlg.get_filename()
+ if file[0] != '/':
+ dir = dlg.get_current_folder()
+ file = dir + '/' + file
+ self.__append_user_dict_from_dialog(file, None, True)
+ elif Gtk.Buildable.get_name(widget) == 'dict:btn_edit':
+ self.__append_user_dict_from_dialog(None, id, False)
+ dlg.hide()
+ vbox.unparent()
+
+ def on_btn_dict_delete_clicked(self, widget):
+ l, i = self.__builder.get_object('dict:view').get_selection().get_selected()
+
+ if not i:
+ return
+ selected_id = l.get_value(i, 0)
+
+ if selected_id == None:
+ return
+ if self.__is_system_dict_file_from_id(selected_id):
+ self.__run_message_dialog(_("You cannot delete the system dictionary."),
+ Gtk.MessageType.ERROR)
+ return
+
+ file = self.__get_dict_file_from_id(selected_id)
+ if file != None:
+ files = self.prefs.get_value('dict', 'files')
+ files.remove(file)
+ self.prefs.set_value('dict', 'files', files)
+ self.__builder.get_object('btn_apply').set_sensitive(True)
+ l.remove(i)
+ return
+
+ l.remove(i)
+
+ def on_btn_dict_view_clicked(self, widget):
+ dict_file = None
+ selected_id = self.__get_selected_dict_id()
+ if selected_id == None:
+ return
+
+ dict_file = self.__get_dict_file_from_id(selected_id)
+ if dict_file == None:
+ self.__run_message_dialog(_("Your file is not good."),
+ Gtk.MessageType.ERROR)
+ return
+ if not path.exists(dict_file):
+ self.__run_message_dialog(_("Your file does not exist: ") + dict_file,
+ Gtk.MessageType.ERROR)
+ return
+
+ if dict_file == None:
+ return
+
+ # The selected id is already quoted.
+ section = 'dict/file/' + selected_id
+ if 'preview_lines' not in self.prefs.keys(section):
+ section = 'dict/file/default'
+ nline = self.prefs.get_value(section, 'preview_lines')
+
+ section = 'dict/file/' + selected_id
+ if 'encoding' not in self.prefs.keys(section):
+ section = 'dict/file/default'
+ encoding = self.prefs.get_value(section, 'encoding')
+
+ lines = '';
+ for i, line in enumerate(list(codecs.open(dict_file, 'r', 'utf-8'))):
+ if nline >= 0 and i >= nline:
+ break;
+ lines = lines + line
+ if encoding != None and encoding != 'utf-8':
+ lines = str(lines, encoding)
+
+ dlg = Gtk.Dialog(title=_("View Dictionary File"),
+ parent=self.__builder.get_object('main'),
+ flags=Gtk.DialogFlags.MODAL,
+ buttons=(Gtk.STOCK_OK, Gtk.ResponseType.OK))
+ buffer = Gtk.TextBuffer()
+ buffer.set_text (lines)
+ text_view = Gtk.TextView.new_with_buffer(buffer)
+ text_view.set_editable(False)
+ sw = Gtk.ScrolledWindow()
+ sw.add(text_view)
+ sw.set_min_content_height(400)
+ parent_vbox = dlg.vbox
+ parent_vbox.add(sw)
+ sw.show_all()
+ dlg.set_default_size(500, 500)
+ dlg.run()
+ dlg.destroy()
+
+ def on_btn_dict_order_clicked(self, widget):
+ dict_file = None
+ l, it = self.__builder.get_object('dict:view').get_selection().get_selected()
+
+ if not it:
+ return
+ selected_path = l.get_path(it)
+ selected_id = l.get_value(it, 0)
+ index = selected_path.get_indices()[0]
+
+ if Gtk.Buildable.get_name(widget) == 'dict:btn_up':
+ if index <= 0:
+ return
+ next_path = (index - 1, )
+ elif Gtk.Buildable.get_name(widget) == 'dict:btn_down':
+ if index + 1 >= len(l):
+ return
+ next_path = (index + 1, )
+ next_it = l.get_iter(next_path)
+ if next_it:
+ l.swap(it, next_it)
+
+ dict_file = self.__get_dict_file_from_id(selected_id)
+ files = self.prefs.get_value('dict', 'files')
+
+ if dict_file == None:
+ return
+
+ i = files.index(dict_file)
+ if Gtk.Buildable.get_name(widget) == 'dict:btn_up':
+ if i <= 0:
+ return
+ next_i = i - 1
+ elif Gtk.Buildable.get_name(widget) == 'dict:btn_down':
+ if i + 1 >= len(dict_file):
+ return
+ next_i = i + 1
+ f = files[i]
+ files[i] = files[next_i]
+ files[next_i] = f
+ self.prefs.set_value('dict', 'files', files)
+ self.__builder.get_object('btn_apply').set_sensitive(True)
+
+ def _get_shortcut_sec(self):
+ l = ['default', 'atok', 'wnn']
+ iter = self.__builder.get_object('shortcut_type').get_active_iter()
+ model = self.__builder.get_object('shortcut_type').get_model()
+ s_type = model[iter][0].lower()
+ return 'shortcut/' + (s_type if s_type in l else 'default')
+
+ def on_shortcut_type_changed(self, widget):
+ ls = self.__builder.get_object('shortcut').get_model()
+ ls.clear()
+
+ sec = self._get_shortcut_sec()
+ for k in self.prefs.keys(sec):
+ ls.append([k, l_to_s(self.prefs.get_value(sec, k))])
+
+ section, key = self.__get_section_key(Gtk.Buildable.get_name(widget))
+ self.prefs.set_value(section, key, sec[len('shortcut/'):])
+ self.__builder.get_object('btn_apply').set_sensitive(True)
+
+ def on_shortcut_key_release_event(self, widget, event):
+ if event.hardware_keycode in [36, 65]:
+ self.on_btn_edit_clicked(None)
+
+ def on_shortcut_click_event(self, widget, event):
+ if event.type == Gdk.EventType._2BUTTON_PRESS:
+ widget.dc = True
+ elif event.type == Gdk.EventType.BUTTON_RELEASE:
+ if hasattr(widget, 'dc') and widget.dc:
+ self.on_btn_edit_clicked(None)
+ widget.dc = False
+
+ def on_key_input_dialog_key_press_event(self, widget, event):
+ widget.e = (event.keyval, event.get_state())
+ return True
+
+ def on_key_input_dialog_key_release_event(self, widget, event):
+ widget.response(Gtk.ResponseType.OK)
+ return True
+
+ def on_entry_custom_key_changed(self, widget, user_data):
+ mode = user_data
+ input = self.__builder.get_object('entry_input_custom_key')
+ output = self.__builder.get_object('entry_output_custom_key')
+ left = self.__builder.get_object('entry_left_thumb_shift_custom_key')
+ right = self.__builder.get_object('entry_right_thumb_shift_custom_key')
+ button = self.__builder.get_object('button_add_custom_key')
+ if mode != 'thumb':
+ if input.get_text() != '' and output.get_text() != '':
+ button.set_sensitive(True)
+ else:
+ button.set_sensitive(False)
+ else:
+ if input.get_text() != '' and output.get_text() != '' and \
+ left.get_text() != '' and right.get_text() != '':
+ button.set_sensitive(True)
+ else:
+ button.set_sensitive(False)
+
+ def on_entry_dict_command_changed(self, widget):
+ if not widget.get_text():
+ return
+ list = widget.get_text().split()
+ if list[0][0] == '/':
+ if len(list) == 1:
+ list.append(list[0][list[0].rfind('/') + 1:])
+ else:
+ list.insert(1, list[0][list[0].rfind('/') + 1:])
+ else:
+ if len(list) == 1:
+ list[0] = '/usr/bin/' + list[0]
+ else:
+ list.insert(0, '/usr/bin/' + list[0])
+ list[1] = list[1][list[1].rfind('/') + 1:]
+ if Gtk.Buildable.get_name(widget) == 'dict:entry_edit_dict_command':
+ key = 'dict_admin_command'
+ elif Gtk.Buildable.get_name(widget) == 'dict:entry_add_word_command':
+ key = 'add_word_command'
+ else:
+ return
+ self.prefs.set_value('common', key, list)
+ self.__builder.get_object('btn_apply').set_sensitive(True)
+
+ def on_es_entry_changed(self, widget):
+ if not widget.get_text():
+ self.__builder.get_object('es:button_add').set_sensitive(False)
+ else:
+ self.__builder.get_object('es:button_add').set_sensitive(True)
+
+ def on_es_button_run_input_clicked(self, widget):
+ dlg = self.__builder.get_object('key_input_dialog')
+ dlg.set_markup('<big><b>%s</b></big>' % _("Please press a key (or a key combination)"))
+ dlg.format_secondary_text(_("The dialog will be closed when the key is released"))
+ id = dlg.run()
+ dlg.hide()
+ if id == Gtk.ResponseType.OK:
+ key, state = dlg.e
+ if (state & (IBus.ModifierType.CONTROL_MASK | IBus.ModifierType.MOD1_MASK) and
+ ord('a') <= key <= ord('z')):
+ key = ord(chr(key).upper())
+ self.__builder.get_object('es:entry').set_text(IBus.keyval_name(key))
+
+ for w, i in [('es:checkbutton_ctrl', IBus.ModifierType.CONTROL_MASK),
+ ('es:checkbutton_alt', IBus.ModifierType.MOD1_MASK),
+ ('es:checkbutton_shift', IBus.ModifierType.SHIFT_MASK)]:
+ self.__builder.get_object(w).set_active(True if state & i else False)
+
+ def on_es_button_add_clicked(self, widget):
+ s = self.__builder.get_object('es:entry').get_text()
+ if not s or not IBus.keyval_from_name(s):
+ dlg = self.__builder.get_object('invalid_keysym')
+ dlg.set_markup('<big><b>%s</b></big>' % _("Invalid keysym"))
+ dlg.format_secondary_text(_("This keysym is not valid"))
+ dlg.run()
+ dlg.hide()
+ return True
+ for w, m in [('es:checkbutton_ctrl', 'Ctrl+'),
+ ('es:checkbutton_alt', 'Alt+'),
+ ('es:checkbutton_shift', 'Shift+')]:
+ if self.__builder.get_object(w).get_active():
+ s = m + s
+ l = self.__builder.get_object('es:treeview').get_model()
+ for i in range(len(l)):
+ if l[i][0] == s:
+ return True
+ l.append([s])
+
+ def on_es_button_refresh_clicked(self, widget):
+ s = self.__builder.get_object('es:entry').get_text()
+ if not s or not IBus.keyval_from_name(s):
+ dlg = self.__builder.get_object('invalid_keysym')
+ dlg.set_markup('<big><b>%s</b></big>' % _("Invalid keysym"))
+ dlg.format_secondary_text(_("This keysym is not valid"))
+ dlg.run()
+ dlg.hide()
+ return True
+ for w, m in [('es:checkbutton_ctrl', 'Ctrl+'),
+ ('es:checkbutton_alt', 'Alt+'),
+ ('es:checkbutton_shift', 'Shift+')]:
+ if self.__builder.get_object(w).get_active():
+ s = m + s
+ tv = self.__builder.get_object('es:treeview')
+ l, i = tv.get_selection().get_selected()
+ l[i][0] = s
+ return True
+
+ def on_es_button_del_clicked(self, widget):
+ tv = self.__builder.get_object('es:treeview')
+ l, i = tv.get_selection().get_selected()
+ if i:
+ l.remove(i)
+
+ def run(self):
+ Gtk.main()
+
+if __name__ == '__main__':
+ AnthySetup().run()
+
diff --git a/setup/python3/prefs.py b/setup/python3/prefs.py
new file mode 100644
index 0000000..a4af88d
--- /dev/null
+++ b/setup/python3/prefs.py
@@ -0,0 +1,273 @@
+# vim:set noet ts=4:
+#
+# ibus-anthy - The Anthy engine for IBus
+#
+# Copyright (c) 2007-2008 Peng Huang <shawn.p.huang@gmail.com>
+# Copyright (c) 2009 Hideaki ABE <abe.sendai@gmail.com>
+# Copyright (c) 2010-2014 Takao Fujiwara <takao.fujiwara1@gmail.com>
+# Copyright (c) 2007-2014 Red Hat, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+import sys
+
+from gi.repository import GLib
+from gi.repository import IBus
+
+class Prefs(object):
+ _prefix = 'engine/dummy'
+
+ def __init__(self, bus=None, config=None):
+ self.default = {}
+ self.modified = {}
+ self.new = {}
+ self.__no_key_warning = False
+
+ # self._config is used by AnthyPrefs .
+ self._config = config if config else \
+ bus.get_config() if bus else \
+ IBus.Bus().get_config()
+
+ # ibus_config_get_values enhances the performance.
+ self.__has_config_get_values = False
+
+ if self._config != None:
+ self.__has_config_get_values = hasattr(self._config, 'get_values')
+ else:
+ self.printerr(
+ 'ibus-config is not running or bus address is not correct.')
+
+ def __log_handler(self, domain, level, message, data):
+ if not data:
+ return
+ GLib.log_default_handler(domain, level, message, '')
+
+ def variant_to_value(self, variant):
+ if type(variant) != GLib.Variant:
+ return variant
+ type_string = variant.get_type_string()
+ if type_string == 's':
+ return variant.get_string()
+ elif type_string == 'i':
+ return variant.get_int32()
+ elif type_string == 'b':
+ return variant.get_boolean()
+ elif type_string == 'as':
+ # Use unpack() instead of dup_strv() in python.
+ # In the latest pygobject3 3.3.4 or later, g_variant_dup_strv
+ # returns the allocated strv but in the previous release,
+ # it returned the tuple of (strv, length)
+ return variant.unpack()
+ else:
+ self.printerr('Unknown variant type: %s' % type_string)
+ sys.abrt()
+ return variant
+
+ def set_no_key_warning(self, no_key_warning):
+ if no_key_warning and hasattr(IBus, 'unset_log_handler'):
+ self.__no_key_warning = True
+ else:
+ self.__no_key_warning = False
+
+ def keys(self, section):
+ return list(self.default[section].keys())
+
+ def sections(self):
+ return list(self.default.keys())
+
+ def set_new_section(self, section):
+ self.default.setdefault(section, {})
+
+ def set_new_key(self, section, key):
+ self.default[section].setdefault(key)
+
+ def get_value(self, section, key):
+ try:
+ return self.new[section][key]
+ except:
+ try:
+ return self.modified[section][key]
+ except:
+ return self.default[section][key]
+
+ def get_value_direct(self, section, key, default=None):
+ if self._config == None:
+ return default
+
+ s = section
+ section = '/'.join(
+ [s for s in '/'.join([self._prefix, section]).split('/') if s])
+ try:
+ if self.__no_key_warning:
+ IBus.set_log_handler(False)
+ variant = self._config.get_value(section, key)
+ if self.__no_key_warning:
+ IBus.unset_log_handler()
+ return self.variant_to_value(variant)
+ except:
+ return default
+
+ def set_value(self, section, key, value):
+ if section not in self.sections():
+ self.set_new_section(section)
+ if key not in self.keys(section):
+ self.set_new_key(section, key)
+ self.default[section][key]
+ self.new.setdefault(section, {})[key] = value
+
+ def fetch_all(self):
+ for s in self.sections():
+ self.fetch_section(s)
+
+ def fetch_section(self, section):
+ if self._config == None:
+ return
+
+ if not self.__has_config_get_values:
+ for k in self.keys(section):
+ self.fetch_item(section, k)
+ return
+
+ s = '/'.join(
+ [s for s in '/'.join([self._prefix, section]).split('/') if s])
+ variant = self._config.get_values(s)
+ for key in list(variant.keys()):
+ v = variant[key]
+ self.modified.setdefault(section, {})[key] = v if v != [''] else []
+ # FIXME: ibus-dconf converts the keys.
+ if section == 'common':
+ self.fetch_item(section, 'show-input-mode')
+ self.fetch_item(section, 'show-typing-method')
+ self.fetch_item(section, 'show-segment-mode')
+ self.fetch_item(section, 'show-dict-mode')
+ self.fetch_item(section, 'show-dict-config')
+ self.fetch_item(section, 'show-preferences')
+
+ def fetch_item(self, section, key, readonly=False):
+ if self._config == None:
+ return
+
+ s = '/'.join(
+ [s for s in '/'.join([self._prefix, section]).split('/') if s])
+ try:
+ v = None
+ # gobject-introspection has a bug.
+ # https://bugzilla.gnome.org/show_bug.cgi?id=670509
+ # GLib.log_set_handler("IBUS", GLib.LogLevelFlags.LEVEL_MASK,
+ # self.__log_handler, False)
+ if self.__no_key_warning:
+ IBus.set_log_handler(False)
+ variant = self._config.get_value(s, key)
+ if self.__no_key_warning:
+ IBus.unset_log_handler()
+ v = self.variant_to_value(variant)
+ except:
+ v = None
+ if readonly:
+ return v != None
+ if v != None:
+ self.modified.setdefault(section, {})[key] = v if v != [''] else []
+ return True
+
+ def commit_all(self):
+ for s in list(self.new.keys()):
+ self.commit_section(s)
+
+ def commit_section(self, section):
+ if section in self.new:
+ for k in list(self.new[section].keys()):
+ self.commit_item(section, k)
+
+ def commit_item(self, section, key):
+ if section in self.new and key in self.new[section]:
+ s = '/'.join(
+ [s for s in '/'.join([self._prefix, section]).split('/') if s])
+ v = self.new[section][key]
+ if v == []:
+ v = ['']
+ variant = None
+ if type(v) == str:
+ variant = GLib.Variant.new_string(v)
+ elif type(v) == int:
+ variant = GLib.Variant.new_int32(v)
+ elif type(v) == bool:
+ variant = GLib.Variant.new_boolean(v)
+ elif type(v) == list:
+ variant = GLib.Variant.new_strv(v)
+ if variant == None:
+ self.printerr('Unknown value type: %s' % type(v))
+ sys.abrt()
+ if self._config != None:
+ self._config.set_value(s, key, variant)
+ self.modified.setdefault(section, {})[key] = v
+ del(self.new[section][key])
+
+ def undo_all(self):
+ self.new.clear()
+
+ def undo_section(self, section):
+ try:
+ del(self.new[section])
+ except:
+ pass
+
+ def undo_item(self, section, key):
+ try:
+ del(self.new[section][key])
+ except:
+ pass
+
+ def set_default_all(self):
+ for s in self.sections():
+ self.set_default_section(s)
+
+ def set_default_section(self, section):
+ for k in self.keys(section):
+ self.set_default_item(section, k)
+
+ def set_default_item(self, section, key):
+ try:
+ if key in self.modified[section] or key in self.new[section]:
+ self.new[section][key] = self.default[section][key]
+ except:
+ pass
+
+ # Convert DBus.String to str
+ # sys.getdefaultencoding() == 'utf-8' with pygtk2 but
+ # sys.getdefaultencoding() == 'ascii' with gi gtk3
+ # so the simple str(unicode_string) causes an error and need to use
+ # unicode_string.encode('utf-8') instead.
+ def str(self, uni):
+ if uni == None:
+ return None
+ if type(uni) == str:
+ return uni
+ return str(uni)
+
+ # The simple unicode(string) causes an error and need to use
+ # unicode(string, 'utf-8') instead.
+ def unicode(self, string):
+ if string == None:
+ return None
+ return string
+
+ # If the parent process exited, the std io/out/error will be lost.
+ @staticmethod
+ def printerr(sentence):
+ try:
+ print(sentence, file=sys.stderr)
+ except IOError:
+ pass
+
diff --git a/setup/python3/setup.ui b/setup/python3/setup.ui
new file mode 100644
index 0000000..d9ec626
--- /dev/null
+++ b/setup/python3/setup.ui
@@ -0,0 +1,2813 @@
+<?xml version="1.0"?>
+<interface>
+ <object class="GtkAdjustment" id="adjustment1">
+ <property name="upper">10</property>
+ <property name="lower">0</property>
+ <property name="page_increment">0</property>
+ <property name="step_increment">1</property>
+ <property name="page_size">0</property>
+ <property name="value">10</property>
+ </object>
+ <object class="GtkListStore" id="model1">
+ <columns>
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">Hiragana</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Katakana</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Halfwidth Katakana</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Latin</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Wide Latin</col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkListStore" id="model51">
+ <columns>
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">NICOLA-J</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">NICOLA-A</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">NICOLA-F</col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkListStore" id="model11">
+ <columns>
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">None</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">FMV KB231 key extension</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">FMV KB611 key extension</col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkListStore" id="model2">
+ <columns>
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">Romaji</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Kana</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Thumb shift</col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkListStore" id="model3">
+ <columns>
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">Multiple segment</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Single segment</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Immediate conversion (multiple segment)</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Immediate conversion (single segment)</col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkListStore" id="model4">
+ <columns>
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">Keep numpad codes</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Convert characters</col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkListStore" id="model5">
+ <columns>
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0">&#x300C;&#x300D;&#xFF0F;</col>
+ </row>
+ <row>
+ <col id="0">&#x300C;&#x300D;&#x30FB;</col>
+ </row>
+ <row>
+ <col id="0">&#xFF3B;&#xFF3D;&#xFF0F;</col>
+ </row>
+ <row>
+ <col id="0">&#xFF3B;&#xFF3D;&#x30FB;</col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkListStore" id="model6">
+ <columns>
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0">&#x3001;&#x3002;</col>
+ </row>
+ <row>
+ <col id="0">&#xFF0C;&#xFF0E;</col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkListStore" id="model7">
+ <columns>
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">Do nothing</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Automatically convert</col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkListStore" id="model8">
+ <columns>
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">Clear</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Commit</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Hold</col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkListStore" id="model9">
+ <columns>
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">Default</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">ATOK</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Wnn</col>
+ </row>
+ </data>
+ </object>
+ <!-- interface-requires gtk+ 2.16 -->
+ <!-- interface-naming-policy toplevel-contextual -->
+ <object class="GtkDialog" id="main">
+ <property name="visible">False</property>
+ <property name="title" translatable="yes">Setup - IBus-Anthy</property>
+ <property name="type_hint">dialog</property>
+ <signal handler="on_main_delete" name="delete_event"/>
+ <child internal-child="vbox">
+ <object class="GtkVBox" id="dialog-vbox1">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkNotebook" id="notebook1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="border_width">6</property>
+ <child>
+ <object class="GtkVBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="border_width">8</property>
+ <child>
+ <object class="GtkFrame" id="frame11">
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment11">
+ <property name="visible">True</property>
+ <property name="top_padding">8</property>
+ <property name="bottom_padding">8</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkTable" id="table11">
+ <property name="visible">True</property>
+ <property name="n_rows">3</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">8</property>
+ <property name="row_spacing">4</property>
+ <child>
+ <object class="GtkLabel" id="label101">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Input Mode:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">input_mode</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="input_mode">
+ <property name="visible">True</property>
+ <signal handler="on_cb_changed" name="changed"/>
+ <property name="model">model1</property>
+ <child>
+ <object class="GtkCellRendererText" id="renderer1"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label102">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Typing Method:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">typing_method</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="typing_method">
+ <property name="visible">True</property>
+ <signal handler="on_cb_changed" name="changed"/>
+ <property name="model">model2</property>
+ <child>
+ <object class="GtkCellRendererText" id="renderer2"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label103">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Conversion _Mode:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">conversion_segment_mode</property>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="conversion_segment_mode">
+ <property name="visible">True</property>
+ <signal handler="on_cb_changed" name="changed"/>
+ <property name="model">model3</property>
+ <child>
+ <object class="GtkCellRendererText" id="renderer3"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label151">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Initial Setting&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame12">
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment12">
+ <property name="visible">True</property>
+ <property name="top_padding">8</property>
+ <property name="bottom_padding">8</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkVBox" id="vbox12">
+ <property name="visible">True</property>
+ <property name="border_width">4</property>
+ <property name="spacing">4</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow12">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="height_request">200</property>
+ <property name="hscrollbar_policy">automatic</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTreeView" id="menu_visible:treeview">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label152">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Menu Visibility on Status Icon&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">General</property>
+ <property name="mnemonic_widget">vbox1</property>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="vbox2">
+ <property name="visible">True</property>
+ <property name="border_width">8</property>
+ <child>
+ <object class="GtkFrame" id="frame21">
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment21">
+ <property name="visible">True</property>
+ <property name="top_padding">8</property>
+ <property name="bottom_padding">8</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkTable" id="table21">
+ <property name="visible">True</property>
+ <property name="n_rows">5</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">8</property>
+ <property name="row_spacing">4</property>
+ <child>
+ <object class="GtkLabel" id="label104">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Period Style:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">period_style</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label105">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Symbo_l Style:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">symbol_style</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label106">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Numpad _Key Type:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">ten_key_mode</property>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="ten_key_mode">
+ <property name="visible">True</property>
+ <signal handler="on_cb_changed" name="changed"/>
+ <property name="model">model4</property>
+ <child>
+ <object class="GtkCellRendererText" id="renderer4"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="symbol_style">
+ <property name="visible">True</property>
+ <signal handler="on_cb_changed" name="changed"/>
+ <property name="model">model5</property>
+ <child>
+ <object class="GtkCellRendererText" id="renderer5"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="period_style">
+ <property name="visible">True</property>
+ <signal handler="on_cb_changed" name="changed"/>
+ <property name="model">model6</property>
+ <child>
+ <object class="GtkCellRendererText" id="renderer6"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label107">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Behavior on Period:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">behavior_on_period</property>
+ </object>
+ <packing>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label108">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Behavior on _Focus Out:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">behavior_on_focus_out</property>
+ </object>
+ <packing>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="behavior_on_period">
+ <property name="visible">True</property>
+ <signal handler="on_cb_changed" name="changed"/>
+ <property name="model">model7</property>
+ <child>
+ <object class="GtkCellRendererText" id="renderer7"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="behavior_on_focus_out">
+ <property name="visible">True</property>
+ <signal handler="on_cb_changed" name="changed"/>
+ <property name="model">model8</property>
+ <child>
+ <object class="GtkCellRendererText" id="renderer8"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label201">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Behavior&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame22">
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment22">
+ <property name="visible">True</property>
+ <property name="top_padding">8</property>
+ <property name="bottom_padding">8</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkTable" id="table22">
+ <property name="visible">True</property>
+ <property name="n_rows">4</property>
+ <property name="column_spacing">8</property>
+ <property name="row_spacing">4</property>
+ <child>
+ <object class="GtkHBox" id="hbox4">
+ <property name="visible">True</property>
+ <property name="spacing">8</property>
+ <child>
+ <object class="GtkLabel" id="label109">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Candidate _Window Page Size:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">page_size</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="page_size">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="adjustment">adjustment1</property>
+ <property name="climb_rate">0.97999999999999998</property>
+ <signal handler="on_sb_changed" name="value_changed"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="half_width_symbol">
+ <property name="label" translatable="yes">Convert _symbols with the one column width</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <signal handler="on_ck_toggled" name="toggled"/>
+ <accelerator key="S" modifiers="GDK_MOD1_MASK" signal="grab_focus"/>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="half_width_number">
+ <property name="label" translatable="yes">Convert _numbers with the one column width</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <signal handler="on_ck_toggled" name="toggled"/>
+ <accelerator key="N" modifiers="GDK_MOD1_MASK" signal="grab_focus"/>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="half_width_space">
+ <property name="label" translatable="yes">Con_vert spaces with the one column width</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <signal handler="on_ck_toggled" name="toggled"/>
+ <accelerator key="v" modifiers="GDK_MOD1_MASK" signal="activate"/>
+ </object>
+ <packing>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="latin_with_shift">
+ <property name="label" translatable="yes">Swi_tch “Hiragana” and “Latin” with Shift key and Hiragana–Katakana key in preedit</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <signal handler="on_ck_toggled" name="toggled"/>
+ <accelerator key="t" modifiers="GDK_MOD1_MASK" signal="activate"/>
+ </object>
+ <packing>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label211">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Other&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Conversion</property>
+ <property name="mnemonic_widget">vbox2</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="vbox3">
+ <property name="visible">True</property>
+ <property name="border_width">4</property>
+ <property name="spacing">4</property>
+ <child>
+ <object class="GtkHBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="spacing">8</property>
+ <child>
+ <object class="GtkLabel" id="label21">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Shortcut Type:</property>
+ <property name="use_underline">True</property>
+ <property name="wrap_mode">word-char</property>
+ <property name="mnemonic_widget">shortcut_type</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">1</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="shortcut_type">
+ <property name="visible">True</property>
+ <signal handler="on_shortcut_type_changed" name="changed"/>
+ <property name="model">model9</property>
+ <child>
+ <object class="GtkCellRendererText" id="renderer9"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow31">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">automatic</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTreeView" id="shortcut">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <signal handler="on_shortcut_click_event" name="button_press_event"/>
+ <signal handler="on_shortcut_click_event" name="button_release_event"/>
+ <signal handler="on_shortcut_key_release_event" name="key_release_event"/>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHButtonBox" id="hbuttonbox31">
+ <property name="visible">True</property>
+ <property name="spacing">4</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="btn_default">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">False</property>
+ <signal handler="on_btn_default_clicked" name="clicked"/>
+ <child>
+ <object class="GtkAlignment" id="alignment31">
+ <property name="visible">True</property>
+ <property name="xscale">0</property>
+ <property name="yscale">0</property>
+ <child>
+ <object class="GtkHBox" id="hbox5">
+ <property name="visible">True</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="stock">gtk-undo</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label27">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">De_fault</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_edit">
+ <property name="label">gtk-edit</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_stock">True</property>
+ <signal handler="on_btn_edit_clicked" name="clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Key Binding</property>
+ <property name="mnemonic_widget">vbox3</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vbox4">
+ <property name="visible">True</property>
+ <property name="border_width">8</property>
+ <property name="spacing">4</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkFrame" id="frame41">
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment41">
+ <property name="visible">True</property>
+ <property name="top_padding">0</property>
+ <property name="bottom_padding">8</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkBox" id="vbox41">
+ <property name="visible">True</property>
+ <property name="border_width">4</property>
+ <property name="spacing">4</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkTable" id="table41">
+ <property name="visible">True</property>
+ <property name="n_rows">2</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">8</property>
+ <property name="row_spacing">4</property>
+ <child>
+ <object class="GtkLabel" id="label402">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Romaji Key Table:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">romaji:button_custom_table</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <!-- The fill need to be True so that
+ GtkTable do not have extra space
+ in y axis. -->
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="romaji:button_custom_table">
+ <property name="label">...</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <signal handler="on_btn_romaji_custom_table_clicked" name="clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label401">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Romaji&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <!-- The fill need to be True so that
+ GtkTable do not have extra space
+ in y axis. -->
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame42">
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment42">
+ <property name="visible">True</property>
+ <property name="top_padding">0</property>
+ <property name="bottom_padding">8</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkBox" id="vbox42">
+ <property name="visible">True</property>
+ <property name="border_width">4</property>
+ <property name="spacing">4</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkTable" id="table42">
+ <property name="visible">True</property>
+ <property name="n_rows">2</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">8</property>
+ <property name="row_spacing">4</property>
+ <child>
+ <object class="GtkLabel" id="label412">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Kana Key Table:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">kana:button_custom_table</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <!-- The fill need to be True so that
+ GtkTable do not have extra space
+ in y axis. -->
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="kana:button_custom_table">
+ <property name="label">...</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <signal handler="on_btn_kana_custom_table_clicked" name="clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label411">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Kana&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <!-- The fill need to be True so that
+ GtkTable do not have extra space
+ in y axis. -->
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame43">
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment43">
+ <property name="visible">True</property>
+ <property name="top_padding">0</property>
+ <property name="bottom_padding">8</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkBox" id="vbox43">
+ <property name="visible">True</property>
+ <property name="border_width">4</property>
+ <property name="spacing">4</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkTable" id="table43">
+ <property name="visible">True</property>
+ <property name="n_rows">2</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">8</property>
+ <property name="row_spacing">4</property>
+ <child>
+ <object class="GtkLabel" id="label422">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Keyboad _layout:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">keymap:combobox_custom_table</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <!-- The fill need to be True so that
+ GtkTable do not have extra space
+ in y axis. -->
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="keymap:combobox_custom_table">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkCellRendererText" id="renderer330"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label421">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Keyboard layout&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <!-- The fill need to be True so that
+ GtkTable do not have extra space
+ in y axis. -->
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Typing Method</property>
+ <property name="mnemonic_widget">vbox4</property>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vbox5">
+ <property name="visible">True</property>
+ <property name="border_width">8</property>
+ <property name="spacing">4</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkFrame" id="frame51">
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment5">
+ <property name="visible">True</property>
+ <property name="top_padding">8</property>
+ <property name="bottom_padding">8</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkBox" id="vbox51">
+ <property name="visible">True</property>
+ <property name="border_width">4</property>
+ <property name="spacing">4</property>
+ <property name="orientation">vertical</property>
+ <child>
+
+ <object class="GtkTable" id="table51">
+ <property name="visible">True</property>
+ <property name="n_rows">2</property>
+ <property name="n_columns">3</property>
+ <property name="column_spacing">8</property>
+ <property name="row_spacing">4</property>
+ <child>
+ <object class="GtkLabel" id="label28">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="use_underline">True</property>
+ <property name="label" translatable="yes">_Left Thumb Shift Key:</property>
+ <property name="mnemonic_widget">thumb:ls</property>
+ </object>
+ <packing>
+ <!-- The fill need to be True so that
+ GtkTable do not have extra space
+ in y axis. -->
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="thumb:ls">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="editable">False</property>
+ </object>
+ <packing>
+ <property name="y_options">GTK_FILL</property>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="thumb:button_ls">
+ <property name="label">...</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <signal handler="on_btn_thumb_key_clicked" name="clicked"/>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label29">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="use_underline">True</property>
+ <property name="label" translatable="yes">Right _Thumb Shift Key:</property>
+ <property name="mnemonic_widget">thumb:rs</property>
+ </object>
+ <packing>
+ <property name="y_options">GTK_FILL</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="thumb:rs">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="editable">False</property>
+ </object>
+ <packing>
+ <property name="y_options">GTK_FILL</property>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="thumb:button_rs">
+ <property name="label">...</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <signal handler="on_btn_thumb_key_clicked" name="clicked"/>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <!-- The fill need to be True so that
+ GtkTable do not have extra space
+ in y axis. -->
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="thumb:keyboard_layout_mode">
+ <property name="label" translatable="yes">Adjust _input method layout to system keyboard layout</property>
+ <property name="tooltip_text" translatable="yes">Adjust IM layout to XKB layout</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <signal handler="on_ck_toggled" name="toggled"/>
+ <accelerator key="I" modifiers="GDK_MOD1_MASK" signal="grab_focus"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox51">
+ <property name="visible">True</property>
+ <property name="spacing">8</property>
+ <child>
+ <object class="GtkLabel" id="label30">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="use_underline">True</property>
+ <property name="label" translatable="yes">Input _Method Layout:</property>
+ <property name="mnemonic_widget">thumb:keyboard_layout</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="thumb:keyboard_layout">
+ <property name="visible">True</property>
+ <signal handler="on_cb_changed" name="changed"/>
+ <property name="model">model51</property>
+ <child>
+ <object class="GtkCellRendererText" id="renderer10"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox52">
+ <property name="visible">True</property>
+ <property name="spacing">8</property>
+ <child>
+ <object class="GtkImage" id="image2">
+ <property name="visible">True</property>
+ <property name="stock">gtk-dialog-info</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label31">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="wrap">True</property>
+ <property name="label" translatable="yes">Restart IBus when you change the keyboard layout</property>
+ <property name="tooltip_text" translatable="yes">Restart IBus when you change XKB</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox11">
+ <property name="visible">True</property>
+ <property name="spacing">8</property>
+ <child>
+ <object class="GtkLabel" id="label33">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="use_underline">True</property>
+ <property name="label" translatable="yes">_Additional Key Arrangement:</property>
+ <property name="mnemonic_widget">thumb:fmv_extension</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="thumb:fmv_extension">
+ <property name="visible">True</property>
+ <property name="tooltip_text" translatable="yes">'&#xFF5E;', '&#x300E;', '&#xA2;', '&#xA3;' and so on can be output with Thumb Shift key</property>
+ <signal handler="on_cb_changed" name="changed"/>
+ <property name="model">model11</property>
+ <child>
+ <object class="GtkCellRendererText" id="renderer11"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox53">
+ <property name="visible">True</property>
+ <property name="spacing">8</property>
+ <child>
+ <object class="GtkImage" id="image4">
+ <property name="visible">True</property>
+ <property name="stock">gtk-dialog-info</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label34">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="wrap">True</property>
+ <property name="label" translatable="yes">You do not have to reconfigure the system keyboard layout for "Additional Key Arrangement" since this option changes input method layout only in case input method is turned on.</property>
+ <property name="tooltip_text" translatable="yes">You do not have to reconfigure XKB since this option changes IM layout only with IM on.</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="thumb:handakuten">
+ <property name="label" translatable="yes">_Enable semi-voiced sound mark with Shift key</property>
+ <property name="tooltip_text" translatable="yes">Seion + Shift can output Handakuon</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <signal handler="on_ck_toggled" name="toggled"/>
+ <accelerator key="E" modifiers="GDK_MOD1_MASK" signal="grab_focus"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">6</property>
+ </packing>
+
+ </child>
+ <child>
+ <object class="GtkTable" id="table52">
+ <property name="visible">True</property>
+ <property name="n_rows">2</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">8</property>
+ <property name="row_spacing">4</property>
+ <child>
+ <object class="GtkLabel" id="label35">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Thumb _Shift Key Table:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">thumb:button_custom_table</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <!-- The fill need to be True so that
+ GtkTable do not have extra space
+ in y axis. -->
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="thumb:button_custom_table">
+ <property name="label">...</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <signal handler="on_btn_thumb_custom_table_clicked" name="clicked"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <!-- The fill need to be True so that
+ GtkTable do not have extra space
+ in y axis. -->
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label36">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Thumb Shift Layout&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Thumb Shift</property>
+ <property name="mnemonic_widget">vbox5</property>
+ </object>
+ <packing>
+ <property name="position">4</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="vbox6">
+ <property name="visible">True</property>
+ <property name="border_width">8</property>
+ <property name="spacing">4</property>
+ <child>
+ <object class="GtkFrame" id="frame61">
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment61">
+ <property name="visible">True</property>
+ <property name="top_padding">4</property>
+ <property name="left_padding">0</property>
+ <child>
+ <object class="GtkVBox" id="vbox61">
+ <property name="visible">True</property>
+ <property name="border_width">4</property>
+ <property name="spacing">4</property>
+ <child>
+ <object class="GtkTable" id="table61">
+ <property name="visible">True</property>
+ <property name="n_rows">2</property>
+ <property name="n_columns">3</property>
+ <property name="column_spacing">8</property>
+ <property name="row_spacing">4</property>
+ <child>
+ <object class="GtkLabel" id="label601">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Edit Dictionary Command:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">dict:entry_edit_dict_command</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <!-- The fill need to be True so that
+ GtkTable do not have extra space
+ in y axis. -->
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="dict:entry_edit_dict_command">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="editable">True</property>
+ <signal handler="on_entry_dict_command_changed" name="changed"/>
+ </object>
+ <packing>
+ <!-- The fill need to be True so that
+ GtkTable do not have extra space
+ in y axis. -->
+ <property name="y_options">GTK_FILL</property>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="dict:btn_edit_dict_command">
+ <property name="label">...</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <signal handler="on_btn_dict_command_clicked" name="clicked"/>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <!-- The fill need to be True so that
+ GtkTable do not have extra space
+ in y axis. -->
+ <property name="y_options">GTK_FILL</property>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label602">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Add Word Command:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">dict:entry_add_word_command</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <!-- The fill need to be True so that
+ GtkTable do not have extra space
+ in y axis. -->
+ <property name="y_options">GTK_FILL</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="dict:entry_add_word_command">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="editable">True</property>
+ <signal handler="on_entry_dict_command_changed" name="changed"/>
+ </object>
+ <packing>
+ <!-- The fill need to be True so that
+ GtkTable do not have extra space
+ in y axis. -->
+ <property name="y_options">GTK_FILL</property>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="dict:btn_add_word_command">
+ <property name="label">...</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <signal handler="on_btn_dict_command_clicked" name="clicked"/>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <!-- The fill need to be True so that
+ GtkTable do not have extra space
+ in y axis. -->
+ <property name="y_options">GTK_FILL</property>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <!-- The fill need to be True so that
+ GtkTable do not have extra space
+ in y axis. -->
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label60">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Default Dictionary Configuration&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame71">
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment71">
+ <property name="visible">True</property>
+ <property name="top_padding">4</property>
+ <property name="left_padding">0</property>
+ <child>
+ <object class="GtkVBox" id="vbox71">
+ <property name="visible">True</property>
+ <property name="border_width">4</property>
+ <property name="spacing">4</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow71">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="height_request">220</property>
+ <property name="hscrollbar_policy">automatic</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTreeView" id="dict:view">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHButtonBox" id="hbuttonbox71">
+ <property name="visible">True</property>
+ <property name="spacing">4</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="dict:btn_view">
+ <property name="label" translatable="yes">_View</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <signal handler="on_btn_dict_view_clicked" name="clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="dict:btn_add">
+ <property name="label">gtk-add</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_stock">True</property>
+ <signal handler="on_btn_dict_add_clicked" name="clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="dict:btn_edit">
+ <property name="label">gtk-edit</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_stock">True</property>
+ <signal handler="on_btn_dict_add_clicked" name="clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="dict:btn_delete">
+ <property name="label">gtk-delete</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_stock">True</property>
+ <signal handler="on_btn_dict_delete_clicked" name="clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHButtonBox" id="hbuttonbox72">
+ <property name="visible">True</property>
+ <property name="spacing">4</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="dict:btn_up">
+ <property name="label">gtk-go-up</property>
+ <property name="tooltip_text" translatable="yes">You can change the order on language bar</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_stock">True</property>
+ <signal handler="on_btn_dict_order_clicked" name="clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="dict:btn_down">
+ <property name="label">gtk-go-down</property>
+ <property name="tooltip_text" translatable="yes">You can change the order on language bar</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_stock">True</property>
+ <signal handler="on_btn_dict_order_clicked" name="clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label71">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Extended Dictionaries&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Dictionary</property>
+ <property name="mnemonic_widget">vbox6</property>
+ </object>
+ <packing>
+ <property name="position">5</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="about_vbox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="border_width">10</property>
+ <property name="spacing">6</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label7">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">About</property>
+ <property name="mnemonic_widget">about_vbox</property>
+ </object>
+ <packing>
+ <property name="position">6</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child internal-child="action_area">
+ <object class="GtkHButtonBox" id="dialog-action_area1">
+ <property name="visible">True</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="btn_apply">
+ <property name="label">gtk-apply</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_stock">True</property>
+ <signal handler="on_btn_apply_clicked" name="clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_cancel">
+ <property name="label">gtk-cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_stock">True</property>
+ <signal handler="on_btn_cancel_clicked" name="clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="btn_ok">
+ <property name="label">gtk-ok</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_stock">True</property>
+ <signal handler="on_btn_ok_clicked" name="clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-10">btn_apply</action-widget>
+ <action-widget response="-6">btn_cancel</action-widget>
+ <action-widget response="-5">btn_ok</action-widget>
+ </action-widgets>
+ </object>
+ <object class="GtkDialog" id="edit_shortcut">
+ <property name="width_request">340</property>
+ <property name="height_request">300</property>
+ <property name="title" translatable="yes">Edit Shortcut</property>
+ <property name="modal">True</property>
+ <property name="type_hint">dialog</property>
+ <child internal-child="vbox">
+ <object class="GtkVBox" id="dialog-vbox2">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkVBox" id="vbox101">
+ <property name="visible">True</property>
+ <property name="border_width">5</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow101">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="border_width">1</property>
+ <property name="hscrollbar_policy">automatic</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTreeView" id="es:treeview">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="headers_visible">False</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox101">
+ <property name="visible">True</property>
+ <property name="spacing">8</property>
+ <child>
+ <object class="GtkLabel" id="label1001">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Key Code:</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="es:entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <signal handler="on_es_entry_changed" name="changed"/>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="es:button_run_input">
+ <property name="label">...</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <signal handler="on_es_button_run_input_clicked" name="clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox102">
+ <property name="visible">True</property>
+ <property name="spacing">8</property>
+ <child>
+ <object class="GtkLabel" id="label1002">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Modifier:</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox103">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkCheckButton" id="es:checkbutton_alt">
+ <property name="label" translatable="yes">A_lternate</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="es:checkbutton_ctrl">
+ <property name="label" translatable="yes">Co_ntrol</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="es:checkbutton_shift">
+ <property name="label" translatable="yes">_Shift</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHButtonBox" id="hbuttonbox101">
+ <property name="visible">True</property>
+ <property name="spacing">6</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="es:button_add">
+ <property name="label">gtk-add</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_stock">True</property>
+ <signal handler="on_es_button_add_clicked" name="clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="es:button_refresh">
+ <property name="label">gtk-refresh</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_stock">True</property>
+ <signal handler="on_es_button_refresh_clicked" name="clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="es:button_del">
+ <property name="label">gtk-delete</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_stock">True</property>
+ <signal handler="on_es_button_del_clicked" name="clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child internal-child="action_area">
+ <object class="GtkHButtonBox" id="dialog-action_area2">
+ <property name="visible">True</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="cancelbutton101">
+ <property name="label">gtk-cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_stock">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="okbutton101">
+ <property name="label">gtk-ok</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_stock">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">cancelbutton101</action-widget>
+ <action-widget response="-5">okbutton101</action-widget>
+ </action-widgets>
+ </object>
+ <object class="GtkDialog" id="dialog_custom_key_table">
+ <property name="width_request">400</property>
+ <property name="height_request">470</property>
+ <property name="title"/>
+ <property name="modal">True</property>
+ <property name="type_hint">dialog</property>
+ <child internal-child="vbox">
+ <object class="GtkVBox" id="dialog-vbox3">
+ <property name="visible">True</property>
+ <property name="border_width">5</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkHBox" id="hbox_for_combobox_custom_key_table">
+ <property name="visible">True</property>
+ <property name="border_width">5</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label_custom_key_table">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label"/>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">combobox_custom_key_table</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="combobox_custom_key_table">
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox301">
+ <property name="visible">True</property>
+ <property name="border_width">5</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow301">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="border_width">1</property>
+ <property name="hscrollbar_policy">automatic</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTreeView" id="treeview_custom_key_table">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVButtonBox" id="vbutton301">
+ <property name="visible">True</property>
+ <property name="layout_style">start</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label3001">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Input Characters</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">entry_input_custom_key</property>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="entry_input_custom_key">
+ <property name="visible">True</property>
+ <property name="width-chars">3</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_output_custom_key">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Output Characters</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">entry_output_custom_key</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="entry_output_custom_key">
+ <property name="visible">True</property>
+ <property name="width-chars">3</property>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_left_thumb_shift_custom_key">
+ <property name="visible">False</property>
+ <property name="label" translatable="yes">_Left Thumb Shift</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">entry_left_thumb_shift_custom_key</property>
+ </object>
+ <packing>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="entry_left_thumb_shift_custom_key">
+ <property name="visible">False</property>
+ <property name="width-chars">3</property>
+ </object>
+ <packing>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_right_thumb_shift_custom_key">
+ <property name="visible">False</property>
+ <property name="label" translatable="yes">_Right Thumb Shift</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">entry_right_thumb_shift_custom_key</property>
+ </object>
+ <packing>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="entry_right_thumb_shift_custom_key">
+ <property name="visible">False</property>
+ <property name="width-chars">3</property>
+ </object>
+ <packing>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_add_custom_key">
+ <property name="visible">True</property>
+ <property name="label">gtk-add</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_stock">True</property>
+ </object>
+ <packing>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_remove_custom_key">
+ <property name="visible">True</property>
+ <property name="label">gtk-remove</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_stock">True</property>
+ </object>
+ <packing>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child internal-child="action_area">
+ <object class="GtkHButtonBox" id="dialog-action_area3">
+ <property name="visible">True</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="closebutton301">
+ <property name="visible">True</property>
+ <property name="label">gtk-close</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="use_stock">True</property>
+ <property name="receives_default">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="0">closebutton301</action-widget>
+ </action-widgets>
+ </object>
+ <object class="GtkMessageDialog" id="quit_check">
+ <property name="border_width">5</property>
+ <property name="resizable">False</property>
+ <property name="modal">True</property>
+ <property name="window_position">center-on-parent</property>
+ <property name="type_hint">dialog</property>
+ <property name="skip_taskbar_hint">True</property>
+ <property name="message_type">question</property>
+ <property name="buttons">yes-no</property>
+ <property name="text">Confirmation</property>
+ <property name="secondary_text">You are about to close the setup dialog, is that OK?</property>
+ <child internal-child="vbox">
+ <object class="GtkVBox" id="dialog-vbox6">
+ <property name="visible">True</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkHButtonBox" id="dialog-action_area6">
+ <property name="visible">True</property>
+ <property name="layout_style">end</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMessageDialog" id="quit_check_without_save">
+ <property name="border_width">5</property>
+ <property name="resizable">False</property>
+ <property name="modal">True</property>
+ <property name="window_position">center-on-parent</property>
+ <property name="type_hint">dialog</property>
+ <property name="skip_taskbar_hint">True</property>
+ <property name="message_type">warning</property>
+ <property name="buttons">yes-no</property>
+ <property name="text">Notice!</property>
+ <property name="secondary_text">You are about to close the setup dialog without saving your changes, is that OK?</property>
+ <child internal-child="vbox">
+ <object class="GtkVBox" id="dialog-vbox7">
+ <property name="visible">True</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkHButtonBox" id="dialog-action_area7">
+ <property name="visible">True</property>
+ <property name="layout_style">end</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMessageDialog" id="key_input_dialog">
+ <property name="border_width">5</property>
+ <property name="resizable">False</property>
+ <property name="modal">True</property>
+ <property name="window_position">center-on-parent</property>
+ <property name="type_hint">dialog</property>
+ <property name="skip_taskbar_hint">True</property>
+ <property name="buttons">cancel</property>
+ <property name="text">Please press a key (or a key combination)</property>
+ <property name="secondary_text">The dialog will be closed when the key is released</property>
+ <signal handler="on_key_input_dialog_key_press_event" name="key_press_event"/>
+ <signal handler="on_key_input_dialog_key_release_event" name="key_release_event"/>
+ <child internal-child="vbox">
+ <object class="GtkVBox" id="dialog-vbox8">
+ <property name="visible">True</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkHButtonBox" id="dialog-action_area8">
+ <property name="visible">True</property>
+ <property name="layout_style">end</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMessageDialog" id="invalid_keysym">
+ <property name="border_width">5</property>
+ <property name="resizable">False</property>
+ <property name="modal">True</property>
+ <property name="window_position">center-on-parent</property>
+ <property name="type_hint">dialog</property>
+ <property name="skip_taskbar_hint">True</property>
+ <property name="message_type">warning</property>
+ <property name="buttons">ok</property>
+ <property name="text">Invalid keysym</property>
+ <property name="secondary_text">This keysym is not valid</property>
+ <child internal-child="vbox">
+ <object class="GtkVBox" id="dialog-vbox9">
+ <property name="visible">True</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkHButtonBox" id="dialog-action_area9">
+ <property name="visible">True</property>
+ <property name="layout_style">end</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <object class="GtkVBox" id="dict:add_extra_vbox">
+ <property name="visible">True</property>
+ <property name="no_show_all">True</property>
+ <property name="spacing">10</property>
+ <child>
+ <object class="GtkTable" id="table1000">
+ <property name="visible">True</property>
+ <property name="n_rows">2</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">8</property>
+ <property name="row_spacing">4</property>
+ <child>
+ <object class="GtkLabel" id="label10001">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Short Label:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">dict:short_entry</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="dict:short_entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="editable">True</property>
+ <property name="max-length">1</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label10002">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Description:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">dict:long_entry</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="dict:long_entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="editable">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="dict:single">
+ <property name="label" translatable="yes">_Use your dictionary alone with switching dictionaries</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="active">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="dict:embed">
+ <property name="label" translatable="yes">_Embed your dictionary in the system dictionary</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <!-- Unfortunatelly reverse conversion is too slow. -->
+ <object class="GtkCheckButton" id="dict:reverse">
+ <property name="label" translatable="yes">Enable the _reverse conversion</property>
+ <property name="visible">False</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <object class="GtkAboutDialog" id="about_dialog">
+ <property name="program-name">IBus-Anthy</property>
+ <property name="copyright">Copyright © 2007–2008 Peng Huang
+Copyright © 2009 Hideaki ABE
+Copyright © 2009–2013 Takao Fujiwara
+Copyright © 2007–2013 Red Hat, Inc.</property>
+ <property name="comments" translatable="yes">The Anthy engine for the IBus input platform</property>
+ <property name="license">GPL</property>
+ <property name="website">http://code.google.com/p/ibus/</property>
+ <property name="authors">Takao Fujiwara &lt;takao.fujiwara1@gmail.com&gt;</property>
+ <property name="translator-credits" translatable="yes">translator_credits</property>
+ <property name="logo-icon-name"/>
+ <property name="wrap-license">True</property>
+ </object>
+</interface>