diff options
author | fujiwarat <takao.fujiwara1@gmail.com> | 2014-01-30 17:33:33 +0900 |
---|---|---|
committer | fujiwarat <takao.fujiwara1@gmail.com> | 2014-01-30 17:33:33 +0900 |
commit | 2e8e2bef7a7943ed351278c2f6c601339abd4d54 (patch) | |
tree | 702155a2687952da2b18d029e5154ea829643877 /setup | |
parent | 85330465240ba6a028c92290d74ef05dcb5d7cb9 (diff) | |
download | ibus-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.am | 104 | ||||
l--------- | setup/_config.py.in | 1 | ||||
-rw-r--r-- | setup/python2/Makefile.am | 116 | ||||
l--------- | setup/python2/_config.py.in | 1 | ||||
-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.am | 116 | ||||
l--------- | setup/python3/_config.py.in | 1 | ||||
-rw-r--r-- | setup/python3/anthyprefs.py.in | 1329 | ||||
-rw-r--r-- | setup/python3/ibus-setup-anthy.desktop.in.in | 8 | ||||
-rw-r--r-- | setup/python3/ibus-setup-anthy.in | 28 | ||||
-rw-r--r-- | setup/python3/main.py | 1729 | ||||
-rw-r--r-- | setup/python3/prefs.py | 273 | ||||
-rw-r--r-- | setup/python3/setup.ui | 2813 |
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">「」/</col> + </row> + <row> + <col id="0">「」・</col> + </row> + <row> + <col id="0">[]/</col> + </row> + <row> + <col id="0">[]・</col> + </row> + </data> + </object> + <object class="GtkListStore" id="model6"> + <columns> + <column type="gchararray"/> + </columns> + <data> + <row> + <col id="0">、。</col> + </row> + <row> + <col id="0">,.</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"><b>Initial Setting</b></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"><b>Menu Visibility on Status Icon</b></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"><b>Behavior</b></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"><b>Other</b></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"><b>Romaji</b></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"><b>Kana</b></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"><b>Keyboard layout</b></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">'~', '『', '¢', '£' 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"><b>Thumb Shift Layout</b></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"><b>Default Dictionary Configuration</b></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"><b>Extended Dictionaries</b></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 <takao.fujiwara1@gmail.com></property> + <property name="translator-credits" translatable="yes">translator_credits</property> + <property name="logo-icon-name"/> + <property name="wrap-license">True</property> + </object> +</interface> |