From 877036598ea68dedbf684e0ab76f50016af847cb Mon Sep 17 00:00:00 2001 From: Choe Hwanjin Date: Sun, 13 Dec 2009 23:36:15 +0900 Subject: [PATCH] Update Setup dialog * Add hanja key configuration ui * Migrate to GtkBuilder: use intltool, change ui filename * Update po files * Issue #689 http://code.google.com/p/ibus/issues/detail?id=689 https://bugzilla.redhat.com/show_bug.cgi?id=493509 --- autogen.sh | 1 + configure.ac | 3 +- po/POTFILES.in | 3 +- po/ko.po | 69 ++++++--- po/zh_CN.po | 63 +++++--- setup/Makefile.am | 7 +- setup/keycapturedialog.py | 42 ++++++ setup/main.py | 96 +++++++++++-- setup/setup.ui | 356 ++++++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 589 insertions(+), 51 deletions(-) create mode 100644 setup/keycapturedialog.py create mode 100644 setup/setup.ui diff --git a/autogen.sh b/autogen.sh index 704a524..d9c98bc 100755 --- a/autogen.sh +++ b/autogen.sh @@ -5,6 +5,7 @@ set -x touch ChangeLog autopoint libtoolize --automake --copy +intltoolize --copy --force aclocal -I m4 autoheader automake --add-missing --copy diff --git a/configure.ac b/configure.ac index 4550ca0..91a1480 100644 --- a/configure.ac +++ b/configure.ac @@ -48,6 +48,7 @@ AC_PROG_CXX AC_ISC_POSIX AC_HEADER_STDC AM_PROG_LIBTOOL +IT_PROG_INTLTOOL([0.35.0]) # check ibus PKG_CHECK_MODULES(IBUS, [ @@ -72,7 +73,7 @@ AC_SUBST(GETTEXT_PACKAGE) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE", [Define to the read-only architecture-independent data directory.]) AM_GNU_GETTEXT([external]) -AM_GNU_GETTEXT_VERSION(0.16.1) +AM_GNU_GETTEXT_VERSION([0.17]) # OUTPUT files diff --git a/po/POTFILES.in b/po/POTFILES.in index 2c97c14..1d9b7d9 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -1,4 +1,5 @@ +setup/keycapturedialog.py setup/main.py -setup/setup.glade +[type: gettext/glade]setup/setup.ui src/engine.c src/main.c diff --git a/po/ko.po b/po/ko.po index f28865e..a8d265b 100644 --- a/po/ko.po +++ b/po/ko.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: ibus-hangul\n" -"Report-Msgid-Bugs-To: http://code.google.com/p/ibus/issues/entry\n" -"POT-Creation-Date: 2009-10-31 16:11+0900\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-12-13 20:54+0900\n" "PO-Revision-Date: 2009-02-18 23:32+0900\n" "Last-Translator: Choe Hwanjin \n" "Language-Team: korean \n" @@ -15,62 +15,93 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: setup/main.py:44 +#: ../setup/main.py:46 ../setup/setup.ui.h:4 +msgid "Hangul" +msgstr "한글" + +#: ../setup/main.py:51 msgid "Dubeolsik" msgstr "두벌식" -#: setup/main.py:45 +#: ../setup/main.py:52 msgid "Sebeolsik Final" msgstr "세벌식 최종" -#: setup/main.py:46 +#: ../setup/main.py:53 msgid "Sebeolsik 390" msgstr "세벌식 390" -#: setup/main.py:47 +#: ../setup/main.py:54 msgid "Sebeolsik No-shift" msgstr "세벌식 순아래" -#: setup/main.py:48 +#: ../setup/main.py:55 msgid "Sebeolsik 2 set" msgstr "세벌식 두벌배열" -#: setup/main.py:49 +#: ../setup/main.py:56 msgid "Romaja" msgstr "로마자" -#: setup/setup.glade:8 -msgid "IBusHangul Setup" -msgstr "IBus 한글 설정" +#: ../setup/main.py:142 +msgid "Select Hanja key" +msgstr "한자키를 선택하시오" + +#: ../setup/keycapturedialog.py:15 +msgid "" +"Press any key which you want to use as hanja key. The key you pressed is " +"displayed below.\n" +"If you want to use it, click \"Ok\" or click \"Cancel\"" +msgstr "" +"한자키로 사용하고자 하는 키를 입력하십시오. 그러면 그 키가 아래에 표시될 것입" +"니다.\n" +"그 키를 사용하시려면 \"확인\"을 누르시고, 사용하지 않으시려면 \"취소\"를누르" +"십시오." -#: setup/setup.glade:34 +#: ../setup/setup.ui.h:1 +msgid "Hanja key" +msgstr "한자키" + +#: ../setup/setup.ui.h:2 msgid "Keyboard Layout" msgstr "자판 설정" -#: setup/setup.glade:58 +#: ../setup/setup.ui.h:3 +msgid "Advanced" +msgstr "고급" + +#: ../setup/setup.ui.h:5 +msgid "Hanja" +msgstr "한자" + +#: ../setup/setup.ui.h:6 +msgid "IBusHangul Setup" +msgstr "IBus 한글 설정" + +#: ../setup/setup.ui.h:7 msgid "_Hangul keyboard:" msgstr "한글 자판(_H)" -#: src/engine.c:216 +#: ../src/engine.c:248 msgid "Hanja lock" msgstr "한자 전용" -#: src/engine.c:217 +#: ../src/engine.c:249 msgid "Enable/Disable Hanja mode" msgstr "한자 전용 모드 선택합니다" -#: src/engine.c:229 +#: ../src/engine.c:261 msgid "Setup" msgstr "설정" -#: src/engine.c:230 +#: ../src/engine.c:262 msgid "Configure hangul engine" msgstr "한글 입력기를 설정합니다" -#: src/main.c:52 +#: ../src/main.c:52 msgid "Hangul input method" msgstr "한글 입력기" -#: src/main.c:61 src/main.c:62 +#: ../src/main.c:61 ../src/main.c:62 msgid "Hangul Input Method" msgstr "한글 입력기" diff --git a/po/zh_CN.po b/po/zh_CN.po index 18baeeb..bcf176c 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: http://code.google.com/p/ibus/issues/entry\n" -"POT-Creation-Date: 2009-10-31 16:11+0900\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-12-13 20:54+0900\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,62 +16,89 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: setup/main.py:44 +#: ../setup/main.py:46 ../setup/setup.ui.h:4 +msgid "Hangul" +msgstr "" + +#: ../setup/main.py:51 msgid "Dubeolsik" msgstr "" -#: setup/main.py:45 +#: ../setup/main.py:52 msgid "Sebeolsik Final" msgstr "" -#: setup/main.py:46 +#: ../setup/main.py:53 msgid "Sebeolsik 390" msgstr "" -#: setup/main.py:47 +#: ../setup/main.py:54 msgid "Sebeolsik No-shift" msgstr "" -#: setup/main.py:48 +#: ../setup/main.py:55 msgid "Sebeolsik 2 set" msgstr "" -#: setup/main.py:49 +#: ../setup/main.py:56 msgid "Romaja" msgstr "" -#: setup/setup.glade:8 -msgid "IBusHangul Setup" +#: ../setup/main.py:142 +msgid "Select Hanja key" +msgstr "" + +#: ../setup/keycapturedialog.py:15 +msgid "" +"Press any key which you want to use as hanja key. The key you pressed is " +"displayed below.\n" +"If you want to use it, click \"Ok\" or click \"Cancel\"" +msgstr "" + +#: ../setup/setup.ui.h:1 +msgid "Hanja key" msgstr "" -#: setup/setup.glade:34 +#: ../setup/setup.ui.h:2 msgid "Keyboard Layout" msgstr "" -#: setup/setup.glade:58 +#: ../setup/setup.ui.h:3 +msgid "Advanced" +msgstr "" + +#: ../setup/setup.ui.h:5 +msgid "Hanja" +msgstr "" + +#: ../setup/setup.ui.h:6 +msgid "IBusHangul Setup" +msgstr "" + +#: ../setup/setup.ui.h:7 msgid "_Hangul keyboard:" msgstr "" -#: src/engine.c:216 +#: ../src/engine.c:248 msgid "Hanja lock" msgstr "" -#: src/engine.c:217 +#: ../src/engine.c:249 msgid "Enable/Disable Hanja mode" msgstr "" -#: src/engine.c:229 +#: ../src/engine.c:261 msgid "Setup" msgstr "" -#: src/engine.c:230 +#: ../src/engine.c:262 msgid "Configure hangul engine" msgstr "" -#: src/main.c:52 +#: ../src/main.c:52 msgid "Hangul input method" msgstr "" -#: src/main.c:61 src/main.c:62 +#: ../src/main.c:61 ../src/main.c:62 msgid "Hangul Input Method" msgstr "" diff --git a/setup/Makefile.am b/setup/Makefile.am index 37edd3d..02111ec 100644 --- a/setup/Makefile.am +++ b/setup/Makefile.am @@ -20,7 +20,7 @@ setup_hangul_PYTHON = \ main.py \ - setup.glade \ + setup.ui \ $(NULL) nodist_setup_hangul_PYTHON = config.py @@ -39,7 +39,6 @@ EXTRA_DIST = \ test: $(ENV) DBUS_DEBUG=true \ - LANG=en_US \ - PYTHONPATH=$(abs_top_srcdir):$(pyexecdir) \ - $(PYTHON) $(srcdir)/main.py + PYTHONPATH=$(abs_top_srcdir):$(pyexecdir) \ + $(PYTHON) $(srcdir)/main.py diff --git a/setup/keycapturedialog.py b/setup/keycapturedialog.py new file mode 100644 index 0000000..a6c9cff --- /dev/null +++ b/setup/keycapturedialog.py @@ -0,0 +1,42 @@ +import gtk +import gtk.gdk as gdk +import gettext + +_ = lambda a : gettext.dgettext("ibus-hangul", a) + +class KeyCaptureDialog (): + def __init__ (self, title, parent): + self.__key_str = '' + self.__dialog = gtk.MessageDialog(parent, + gtk.DIALOG_MODAL, + gtk.MESSAGE_INFO, + gtk.BUTTONS_OK_CANCEL, + "") + self.__dialog.set_markup(_("Press any key which you want to use as hanja key. " + "The key you pressed is displayed below.\n" + "If you want to use it, click \"Ok\" or click \"Cancel\"")) + + self.__dialog.format_secondary_markup(" ") + self.__dialog.connect("key-press-event", self.on_keypress, None) + + def destroy(self): + self.__dialog.destroy() + + def run(self): + return self.__dialog.run() + + def get_key_string(self): + return self.__key_str + + def on_keypress(self, widget, event, data = None): + self.__key_str = "" + if event.state & gdk.CONTROL_MASK : + self.__key_str += "Control+" + if event.state & gdk.MOD1_MASK : + self.__key_str += "Alt+" + if event.state & gdk.SHIFT_MASK : + self.__key_str += "Shift+" + + self.__key_str += gdk.keyval_name(event.keyval) + + self.__dialog.format_secondary_markup('%s' % self.__key_str) diff --git a/setup/main.py b/setup/main.py index 574ef82..62284eb 100644 --- a/setup/main.py +++ b/setup/main.py @@ -22,24 +22,30 @@ import sys import os import gobject import gtk -import gtk.glade as glade import ibus +import locale import gettext import config +from keycapturedialog import KeyCaptureDialog _ = lambda a : gettext.dgettext("ibus-hangul", a) class Setup (): def __init__ (self): + locale.bindtextdomain("ibus-hangul", config.localedir) + locale.bind_textdomain_codeset("ibus-hangul", "UTF-8") + self.__bus = ibus.Bus() self.__config = self.__bus.get_config() self.__config.connect("value-changed", self.on_value_changed, None) - glade.bindtextdomain("ibus-hangul", config.localedir) - glade_file = os.path.join(os.path.dirname(__file__), "setup.glade") - self.__xml = glade.XML(glade_file, domain="ibus-hangul") + ui_file = os.path.join(os.path.dirname(__file__), "setup.ui") + self.__builder = gtk.Builder() + self.__builder.set_translation_domain("ibus-hangul") + self.__builder.add_from_file(ui_file) - self.__hangul_keyboard = self.__xml.get_widget("HangulKeyboard") + # Hangul tab + self.__hangul_keyboard = self.__builder.get_object("HangulKeyboard") model = gtk.ListStore(str, str, int) model.append([_("Dubeolsik"), "2", 0]) model.append([_("Sebeolsik Final"), "3f", 1]) @@ -47,7 +53,11 @@ class Setup (): model.append([_("Sebeolsik No-shift"), "3s", 3]) model.append([_("Sebeolsik 2 set"), "32", 4]) model.append([_("Romaja"), "ro", 5]) + self.__hangul_keyboard.set_model(model) + renderer = gtk.CellRendererText() + self.__hangul_keyboard.pack_start(renderer) + self.__hangul_keyboard.add_attribute(renderer, "text", 0) current = self.__read("HangulKeyboard", "2") for i in model: @@ -55,13 +65,43 @@ class Setup (): self.__hangul_keyboard.set_active(i[2]) break - self.__window = self.__xml.get_widget("dialog") + + # hanja tab + button = self.__builder.get_object("HanjaKeyListAddButton") + button.connect("clicked", self.on_hanja_key_add, None) + + button = self.__builder.get_object("HanjaKeyListRemoveButton") + button.connect("clicked", self.on_hanja_key_remove, None) + + model = gtk.ListStore(str) + + keylist_str = self.__read("HanjaKeys", "Hangul_Hanja,F9") + self.__hanja_key_list_str = keylist_str.split(',') + for i in self.__hanja_key_list_str: + model.append([i]) + + self.__hanja_key_list = self.__builder.get_object("HanjaKeyList") + self.__hanja_key_list.set_model(model) + column = gtk.TreeViewColumn() + column.set_title("key") + renderer = gtk.CellRendererText() + column.pack_start(renderer) + column.add_attribute(renderer, "text", 0) + self.__hanja_key_list.append_column(column) + + + # advanced tab + notebook = self.__builder.get_object("SetupNotebook") + notebook.remove_page(2) + + # setup dialog + self.__window = self.__builder.get_object("SetupDialog") icon_file = os.path.join(config.datadir, "ibus-hangul", "icons", "ibus-hangul.svg") self.__window.set_icon_from_file(icon_file) self.__window.connect("response", self.on_response, None) self.__window.show() - ok_button = self.__xml.get_widget("button_ok") + ok_button = self.__builder.get_object("button_cancel") ok_button.grab_focus() def run(self): @@ -75,14 +115,52 @@ class Setup (): i = self.__hangul_keyboard.get_active() self.__write("HangulKeyboard", model[i][1]) + model = self.__hanja_key_list.get_model() + str = "" + iter = model.get_iter_first() + while iter: + if len(str) > 0: + str += "," + str += model.get_value(iter, 0) + else: + str += model.get_value(iter, 0) + iter = model.iter_next(iter) + self.__write("HanjaKeys", str) + def on_response(self, widget, id, data = None): - if (id == gtk.RESPONSE_APPLY): + if id == gtk.RESPONSE_APPLY: self.apply() widget.emit_stop_by_name("response") + if id == gtk.RESPONSE_NONE: + widget.emit_stop_by_name("response") def on_ok(self): self.apply() + def on_hanja_key_add(self, widget, data = None): + dialog = KeyCaptureDialog(_("Select Hanja key"), self.__window) + res = dialog.run() + if res == gtk.RESPONSE_OK: + key_str = dialog.get_key_string() + if len(key_str) > 0: + model = self.__hanja_key_list.get_model() + iter = model.get_iter_first() + while iter: + str = model.get_value(iter, 0) + if str == key_str: + model.remove(iter) + break + iter = model.iter_next(iter) + + model.append([key_str]) + dialog.destroy() + + def on_hanja_key_remove(self, widget, data = None): + selection = self.__hanja_key_list.get_selection() + (model, iter) = selection.get_selected() + if model and iter: + model.remove(iter) + def on_value_changed(self, config, section, name, value, data): if section == "engine/Hangul": if name == "HangulKeyboard": @@ -91,6 +169,8 @@ class Setup (): if i[1] == value: self.__hangul_keyboard.set_active(i[2]) break + elif name == "HanjaKeys": + self.__hanja_key_list_str = value.split(',') def __read(self, name, v): return self.__config.get_value("engine/Hangul", name, v) diff --git a/setup/setup.ui b/setup/setup.ui new file mode 100644 index 0000000..f36acf1 --- /dev/null +++ b/setup/setup.ui @@ -0,0 +1,356 @@ + + + + + + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 5 + IBusHangul Setup + center-on-parent + dialog + False + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + vertical + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 4 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 6 + vertical + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + vertical + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 6 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + <b>Keyboard Layout</b> + True + 0 + + + False + 0 + + + + + + + + False + 0 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + _Hangul keyboard: + True + HangulKeyboard + + + False + False + 12 + 0 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + 1 + + + + + False + 1 + + + + + False + 0 + + + + + + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Hangul + + + False + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 6 + vertical + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + vertical + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 6 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + <b>Hanja key</b> + True + word-char + + + False + 0 + + + + + + + + False + 0 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + + False + False + 0 + + + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + automatic + automatic + in + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + False + False + + + + + 1 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 6 + vertical + 6 + start + + + gtk-add + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + True + + + False + False + 0 + + + + + gtk-remove + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + True + + + False + False + 1 + + + + + False + 2 + + + + + 1 + + + + + 0 + + + + + 1 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Hanja + + + 1 + False + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + <b>Not implemented</b> + True + + + 2 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Advanced + + + 2 + False + + + + + 1 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + True + end + + + gtk-apply + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + True + + + False + False + 0 + + + + + gtk-cancel + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + True + + + False + False + 1 + + + + + gtk-ok + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + True + + + False + False + 2 + + + + + False + end + 1 + + + + + + button_apply + button_cancel + button_ok + + + -- 2.7.4