├── ChangeLog ├── m4 ├── .gitignore ├── Makefile.am └── as-version.m4 ├── po ├── LINGUAS ├── POTFILES.in ├── .gitignore ├── zh_CN.po ├── Makevars └── ko.po ├── tests ├── meta.test.in ├── runtest ├── Makefile.am └── ibus-hangul.c ├── AUTHORS ├── icons ├── ibus-hangul.png ├── Makefile.am ├── ibus-hangul.svg └── ibus-hangul.inkscape.svg ├── setup ├── ibus-setup-hangul.png ├── ibus-setup-hangul.desktop.in ├── ibus-setup-hangul.in ├── config.py.in ├── keycapturedialog.py ├── Makefile.am ├── main.py ├── ibus-setup-hangul.svg ├── ibus-setup-hangul.inkscape.svg └── setup.ui ├── NEWS ├── README ├── data ├── org.freedesktop.ibus.engine.hangul.metainfo.xml.in ├── Makefile.am ├── org.freedesktop.ibus.engine.hangul.gschema.xml └── symbol.txt ├── .gitignore ├── src ├── hangul.xml.in.in ├── i18n.h ├── engine.h ├── ustring.h ├── test-ustring.c ├── Makefile.am ├── ustring.c └── main.c ├── autogen.sh ├── ibus-hangul.spec.in ├── Makefile.am ├── configure.ac └── COPYING /ChangeLog: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /m4/.gitignore: -------------------------------------------------------------------------------- 1 | *.m4 2 | -------------------------------------------------------------------------------- /po/LINGUAS: -------------------------------------------------------------------------------- 1 | ko 2 | zh_CN 3 | -------------------------------------------------------------------------------- /tests/meta.test.in: -------------------------------------------------------------------------------- 1 | [Test] 2 | Type=session 3 | Exec=@TEST_EXEC@ --tap 4 | Output=TAP 5 | -------------------------------------------------------------------------------- /AUTHORS: -------------------------------------------------------------------------------- 1 | Huang Peng 2 | Choe Hwanjin 3 | -------------------------------------------------------------------------------- /icons/ibus-hangul.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/libhangul/ibus-hangul/HEAD/icons/ibus-hangul.png -------------------------------------------------------------------------------- /setup/ibus-setup-hangul.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/libhangul/ibus-hangul/HEAD/setup/ibus-setup-hangul.png -------------------------------------------------------------------------------- /po/POTFILES.in: -------------------------------------------------------------------------------- 1 | data/org.freedesktop.ibus.engine.hangul.metainfo.xml.in 2 | setup/keycapturedialog.py 3 | setup/main.py 4 | setup/ibus-setup-hangul.desktop.in 5 | setup/setup.ui 6 | src/engine.c 7 | src/main.c 8 | -------------------------------------------------------------------------------- /po/.gitignore: -------------------------------------------------------------------------------- 1 | Makefile 2 | Makefile.in 3 | Makefile.in.in 4 | Makevars.template 5 | POTFILES 6 | Rules-quot 7 | boldquot.sed 8 | en@boldquot.header 9 | en@quot.header 10 | insert-header.sin 11 | quot.sed 12 | remove-potcdate.sed 13 | remove-potcdate.sin 14 | -------------------------------------------------------------------------------- /setup/ibus-setup-hangul.desktop.in: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Name=IBus Hangul Preferences 3 | Comment=Set IBus Hangul Preferences 4 | Exec=ibus-setup-hangul 5 | Icon=ibus-setup-hangul 6 | NoDisplay=true 7 | Terminal=false 8 | Type=Application 9 | StartupNotify=true 10 | Categories=Settings; 11 | -------------------------------------------------------------------------------- /tests/runtest: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | : ${top_builddir:=../..} 4 | : ${top_srcdir:=../..} 5 | : ${builddir:=.} 6 | : ${srcdir:=.} 7 | : ${DISABLE_GUI_TESTS:=''} 8 | 9 | ibus-daemon --xim --panel disable --config disable & 10 | sleep 30 11 | 12 | tst=$1 13 | 14 | for t in $DISABLE_GUI_TESTS; do 15 | if test $t = `basename $tst`; then 16 | exit 77 17 | fi 18 | done 19 | 20 | $builddir/$tst 21 | retval=$? 22 | 23 | ibus exit 24 | 25 | exit $retval 26 | -------------------------------------------------------------------------------- /NEWS: -------------------------------------------------------------------------------- 1 | 1.4.2 2 | * Use Gobject Introspection 3 | * GNOME Control Center integration 4 | * Miscellaneous bug fixes 5 | 6 | 1.4.1 7 | * Handle exceptions properly in ibus-setup-hangul 8 | https://github.com/choehwanjin/ibus-hangul/pull/5 9 | * Update icon files 10 | * Support ibus icon symbol feature 11 | 12 | 1.4.0 13 | * Require ibus 1.4 14 | * Add desktop menu for ibus-setup-hangul 15 | * Add an option for automatic reordering 16 | * Add an option for a word preedit text 17 | * Update MS IME compatible symbol table 18 | * Use surrounding text feature on converting to hanja 19 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | ibus-hangul 2 | ----------- 3 | 4 | ibus-hangul is a Korean input method engine for IBus. 5 | 6 | The official web site is: 7 | 8 | ibus: https://github.com/ibus/ibus/wiki 9 | ibus-hangul: https://github.com/libhangul/ibus-hangul/wiki 10 | 11 | 12 | Installation 13 | ------------ 14 | 15 | ibus-hangul requires ibus. 16 | 17 | Install procedure: 18 | $ ./configure 19 | $ make 20 | $ make install 21 | 22 | 23 | Bug report 24 | ---------- 25 | 26 | https://github.com/libhangul/ibus-hangul/issues 27 | 28 | 29 | Download 30 | -------- 31 | 32 | https://github.com/libhangul/ibus-hangul/releases 33 | -------------------------------------------------------------------------------- /data/org.freedesktop.ibus.engine.hangul.metainfo.xml.in: -------------------------------------------------------------------------------- 1 | 2 | 3 | org.freedesktop.ibus.engine.hangul 4 | ibus-hangul 5 | CC0-1.0 6 | GPL-2 7 | Hangul engine for IBus 8 | 9 |

IBus-Hangul is a Korean input method engine for IBus.

10 |
11 | IBus 12 | https://github.com/libhangul/ibus-hangul 13 | https://github.com/libhangul/ibus-hangul/issues 14 | ibus-hangul 15 |
16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | *.la 3 | *.lo 4 | *.loT 5 | *.o 6 | *.so 7 | *~ 8 | tags 9 | out 10 | Makefile.qmake 11 | Makefile 12 | Makefile.in 13 | .deps 14 | .libs 15 | ABOUT-NLS 16 | INSTALL 17 | aclocal.m4 18 | autom4te.cache 19 | compile 20 | config.guess 21 | config.h 22 | config.h.in 23 | config.log 24 | config.rpath 25 | config.status 26 | config.sub 27 | configure 28 | depcomp 29 | gtk-doc.make 30 | install-sh 31 | libtool 32 | ltmain.sh 33 | missing 34 | stamp-h1 35 | py-compile 36 | ibus-hangul*.tar.* 37 | ibus-hangul.spec 38 | 39 | # vim temp backup file 40 | .*.swp 41 | 42 | # files for data 43 | data/org.freedesktop.ibus.engine.hangul.metainfo.xml 44 | data/org.freedesktop.ibus.engine.hangul.metainfo.xml.h 45 | 46 | # files for po 47 | po/*.gmo 48 | po/*.pot 49 | po/stamp-po 50 | po/stamp-it 51 | 52 | # files for setup 53 | setup/config.py 54 | setup/ibus-setup-hangul 55 | 56 | # files for engine 57 | src/test.sh 58 | src/hangul.xml 59 | src/hangul.xml.in 60 | src/ibus-engine-hangul 61 | -------------------------------------------------------------------------------- /setup/ibus-setup-hangul.in: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # vim:set noet ts=4: 3 | # 4 | # ibus-hangul - The Hangul Engine For IBus 5 | # 6 | # Copyright (c) 2009-2011 Choe Hwanjin 7 | # 8 | # This program is free software; you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation; either version 2 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # This program is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License along 19 | # with this program; if not, write to the Free Software Foundation, Inc., 20 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 21 | 22 | exec @PYTHON@ @SETUP_PKGDATADIR@/setup/main.py $@ 23 | 24 | -------------------------------------------------------------------------------- /src/hangul.xml.in.in: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | org.freedesktop.IBus.Hangul 5 | Korean Component 6 | ${libexecdir}/ibus-engine-hangul --ibus 7 | @VERSION@ 8 | Peng Huang <shawn.p.huang@gmail.com> 9 | GPL 10 | https://github.com/libhangul/ibus-hangul 11 | ibus-hangul 12 | 13 | 14 | 15 | hangul 16 | ko 17 | GPL 18 | Peng Huang <shawn.p.huang@gmail.com> 19 | ibus-hangul 20 | kr 21 | kr104 22 | Hangul 23 | Korean Input Method 24 | 99 25 | 26 | ${libexecdir}/ibus-setup-hangul 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /setup/config.py.in: -------------------------------------------------------------------------------- 1 | # vim:set et sts=4 sw=4: 2 | # 3 | # ibus-hangul - The Hangul Engine For IBus 4 | # 5 | # Copyright (c) 2009-2011 Choe Hwanjin 6 | # 7 | # This program is free software; you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation; either version 2 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # This program is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License along 18 | # with this program; if not, write to the Free Software Foundation, Inc., 19 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 20 | 21 | gettext_package = '@SETUP_GETTEXT_PACKAGE@' 22 | localedir = '@SETUP_LOCALEDIR@' 23 | pkgdatadir = '@SETUP_PKGDATADIR@' 24 | setupdatadir = pkgdatadir + '/setup' 25 | -------------------------------------------------------------------------------- /m4/Makefile.am: -------------------------------------------------------------------------------- 1 | # vim:set noet ts=4: 2 | # 3 | # ibus-tmpl - The Input Bus template project 4 | # 5 | # Copyright (c) 2007-2008 Huang Peng 6 | # 7 | # This program is free software; you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation; either version 2, or (at your option) 10 | # any later version. 11 | # 12 | # This program is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with this program; if not, write to the Free Software 19 | # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 | 21 | EXTRA_DIST = \ 22 | as-version.m4 \ 23 | gettext.m4 \ 24 | iconv.m4 \ 25 | lib-ld.m4 \ 26 | lib-link.m4 \ 27 | lib-prefix.m4 \ 28 | nls.m4 \ 29 | po.m4 \ 30 | progtest.m4 \ 31 | $(NULL) 32 | -------------------------------------------------------------------------------- /src/i18n.h: -------------------------------------------------------------------------------- 1 | /* vim:set et sts=4: */ 2 | /* ibus-hangul - The Hangul Engine For IBus 3 | * Copyright (C) 2008-2009 Peng Huang 4 | * Copyright (C) 2009-2011 Choe Hwanjin 5 | * 6 | * This program is free software; you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation; either version 2 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * This program is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License along 17 | * with this program; if not, write to the Free Software Foundation, Inc., 18 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 19 | */ 20 | 21 | #ifndef ibus_hangul_i18n_h 22 | #define ibus_hangul_i18n_h 23 | 24 | #include 25 | 26 | #define _(str) gettext(str) 27 | #define N_(str) (str) 28 | 29 | #endif /* ibus_hangul_i18n_h */ 30 | -------------------------------------------------------------------------------- /autogen.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # Run this to generate all the initial makefiles, etc. 3 | test -n "$srcdir" || srcdir=$(dirname "$0") 4 | test -n "$srcdir" || srcdir=. 5 | 6 | olddir=$(pwd) 7 | 8 | cd "$srcdir" 9 | 10 | (test -f configure.ac) || { 11 | echo -n "**Error**: Directory "\`$srcdir\'" does not look like the" 12 | echo " top-level $PKG_NAME directory" 13 | exit 1 14 | } 15 | 16 | # shellcheck disable=SC2016 17 | PKG_NAME=$(autoconf --trace 'AC_INIT:$1' configure.ac) 18 | 19 | if [ "$#" = 0 -a "x$NOCONFIGURE" = "x" ]; then 20 | echo "*** WARNING: I am going to run 'configure' with no arguments." >&2 21 | echo "*** If you wish to pass any to it, please specify them on the" >&2 22 | echo "*** '$0' command line." >&2 23 | echo "" >&2 24 | fi 25 | 26 | aclocal --install || exit 1 27 | autoreconf --verbose --force --install || exit 1 28 | 29 | cd "$olddir" 30 | if [ "$NOCONFIGURE" = "" ]; then 31 | $srcdir/configure "$@" || exit 1 32 | 33 | if [ "$1" = "--help" ]; then 34 | exit 0 35 | else 36 | echo "Now type 'make' to compile $PKG_NAME" || exit 1 37 | fi 38 | else 39 | echo "Skipping configure process." 40 | fi 41 | -------------------------------------------------------------------------------- /src/engine.h: -------------------------------------------------------------------------------- 1 | /* vim:set et sts=4: */ 2 | /* ibus-hangul - The Hangul Engine For IBus 3 | * Copyright (C) 2008-2009 Peng Huang 4 | * Copyright (C) 2009-2011 Choe Hwanjin 5 | * 6 | * This program is free software; you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation; either version 2 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * This program is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License along 17 | * with this program; if not, write to the Free Software Foundation, Inc., 18 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 19 | */ 20 | 21 | #ifndef __ENGINE_H__ 22 | #define __ENGINE_H__ 23 | 24 | #include 25 | 26 | #define IBUS_TYPE_HANGUL_ENGINE \ 27 | (ibus_hangul_engine_get_type ()) 28 | 29 | GType ibus_hangul_engine_get_type (void); 30 | 31 | void ibus_hangul_init (IBusBus *bus); 32 | void ibus_hangul_exit (void); 33 | 34 | #endif 35 | -------------------------------------------------------------------------------- /icons/Makefile.am: -------------------------------------------------------------------------------- 1 | # vim:set noet ts=4: 2 | # 3 | # ibus-hangul - The Hangul engine for IBus 4 | # 5 | # Copyright (c) 2007-2008 Huang Peng 6 | # 7 | # This library is free software; you can redistribute it and/or 8 | # modify it under the terms of the GNU Lesser General Public 9 | # License as published by the Free Software Foundation; either 10 | # version 2 of the License, or (at your option) any later version. 11 | # 12 | # This library is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU Lesser General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU Lesser General Public 18 | # License along with this program; if not, write to the 19 | # Free Software Foundation, Inc., 59 Temple Place, Suite 330, 20 | # Boston, MA 02111-1307 USA 21 | 22 | icons_DATA = \ 23 | ibus-hangul.png \ 24 | ibus-hangul.svg \ 25 | $(NULL) 26 | iconsdir = $(pkgdatadir)/icons 27 | 28 | hicolor_icon_64_DATA = ibus-hangul.png 29 | hicolor_icon_64dir = $(datadir)/icons/hicolor/64x64/apps 30 | 31 | hicolor_icon_scalable_DATA = ibus-hangul.svg 32 | hicolor_icon_scalabledir = $(datadir)/icons/hicolor/scalable/apps 33 | 34 | EXTRA_DIST = \ 35 | $(icons_DATA) \ 36 | $(NULL) 37 | -------------------------------------------------------------------------------- /setup/keycapturedialog.py: -------------------------------------------------------------------------------- 1 | from gi.repository import Gtk 2 | from gi.repository import Gdk 3 | import gettext 4 | 5 | _ = lambda a : gettext.dgettext("ibus-hangul", a) 6 | 7 | class KeyCaptureDialog (): 8 | def __init__ (self, title, parent): 9 | self.__key_str = '' 10 | self.__dialog = Gtk.MessageDialog(parent, 11 | Gtk.DialogFlags.MODAL, 12 | Gtk.MessageType.INFO, 13 | Gtk.ButtonsType.OK_CANCEL, 14 | "") 15 | self.__dialog.set_markup(" ") 16 | self.__dialog.format_secondary_markup(" ") 17 | self.__dialog.connect("key-press-event", self.on_keypress, None) 18 | 19 | def destroy(self): 20 | self.__dialog.destroy() 21 | 22 | def run(self): 23 | return self.__dialog.run() 24 | 25 | def set_markup(self, text): 26 | self.__dialog.set_markup(text) 27 | 28 | def get_key_string(self): 29 | return self.__key_str 30 | 31 | def on_keypress(self, widget, event, data = None): 32 | self.__key_str = "" 33 | if event.state & Gdk.ModifierType.CONTROL_MASK : 34 | self.__key_str += "Control+" 35 | if event.state & Gdk.ModifierType.MOD1_MASK : 36 | self.__key_str += "Alt+" 37 | if event.state & Gdk.ModifierType.SHIFT_MASK : 38 | self.__key_str += "Shift+" 39 | 40 | self.__key_str += Gdk.keyval_name(event.keyval) 41 | 42 | self.__dialog.format_secondary_markup('%s' % self.__key_str) 43 | -------------------------------------------------------------------------------- /ibus-hangul.spec.in: -------------------------------------------------------------------------------- 1 | %define mod_path ibus-@PACKAGE_VERSION_MAJOR@.@PACKAGE_VERSION_MINOR@ 2 | Name: @PACKAGE_NAME@ 3 | Version: @PACKAGE_VERSION@ 4 | Release: 1%{?dist} 5 | Summary: The Hangul engine for IBus input platform 6 | License: GPLv2+ 7 | Group: System Environment/Libraries 8 | URL: https://github.com/libhangul/ibus-hangul 9 | Source0: https://github.com/libhangul/ibus-hangul/releases/download/%{version}/%{name}-%{version}.tar.gz 10 | 11 | BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) 12 | 13 | BuildRequires: ibus-devel 14 | BuildRequires: gettext-devel 15 | BuildRequires: libtool 16 | BuildRequires: libhangul-devel 17 | BuildRequires: pkgconfig 18 | 19 | Requires: ibus 20 | 21 | %description 22 | The Hangul engine for IBus platform. It provides Korean input method from 23 | libhangul. 24 | 25 | %prep 26 | %setup -q 27 | 28 | %build 29 | %configure --disable-static 30 | # make -C po update-gmo 31 | make %{?_smp_mflags} 32 | 33 | %install 34 | rm -rf $RPM_BUILD_ROOT 35 | make DESTDIR=${RPM_BUILD_ROOT} install 36 | 37 | %find_lang %{name} 38 | 39 | %check 40 | make check DISABLE_GUI_TESTS=ibus-hangul 41 | 42 | %clean 43 | rm -rf $RPM_BUILD_ROOT 44 | 45 | %files -f %{name}.lang 46 | %defattr(-,root,root,-) 47 | %doc AUTHORS COPYING README 48 | %{_bindir}/ibus-setup-hangul 49 | %{_libexecdir}/ibus-engine-hangul 50 | %{_libexecdir}/ibus-setup-hangul 51 | %{_datadir}/applications 52 | %{_datadir}/@PACKAGE@ 53 | %{_datadir}/ibus/component/* 54 | %{_datadir}/icons 55 | 56 | %changelog 57 | * Fri Aug 08 2008 Huang Peng - @VERSION@-1 58 | - The first version. 59 | -------------------------------------------------------------------------------- /src/ustring.h: -------------------------------------------------------------------------------- 1 | /* ibus-hangul - korean input method engine for IBus 2 | * This file is from Korean XIM Nabi. 3 | */ 4 | 5 | /* Nabi - X Input Method server for hangul 6 | * Copyright (C) 2008 Choe Hwanjin 7 | * 8 | * This program is free software; you can redistribute it and/or modify 9 | * it under the terms of the GNU General Public License as published by 10 | * the Free Software Foundation; either version 2 of the License, or 11 | * (at your option) any later version. 12 | * 13 | * This program is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | * GNU General Public License for more details. 17 | * 18 | * You should have received a copy of the GNU General Public License 19 | * along with this program; if not, write to the Free Software 20 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA 21 | */ 22 | 23 | #ifndef nabi_ustring_h 24 | #define nabi_ustring_h 25 | 26 | #include 27 | #include 28 | 29 | typedef GArray UString; 30 | 31 | UString* ustring_new(); 32 | UString* ustring_dup(const UString* str); 33 | void ustring_delete(UString* str); 34 | 35 | void ustring_clear(UString* str); 36 | UString* ustring_erase(UString* str, guint pos, guint len); 37 | 38 | ucschar* ustring_begin(UString* str); 39 | ucschar* ustring_end(UString* str); 40 | guint ustring_length(const UString* str); 41 | 42 | UString* ustring_append(UString* str, const UString* s); 43 | UString* ustring_append_ucs4(UString* str, const ucschar* s, gint len); 44 | UString* ustring_append_utf8(UString* str, const char* utf8); 45 | 46 | gchar* ustring_to_utf8(const UString* str, guint len); 47 | 48 | int ustring_compare(const UString* str, const UString* other); 49 | 50 | #endif // nabi_ustring_h 51 | -------------------------------------------------------------------------------- /src/test-ustring.c: -------------------------------------------------------------------------------- 1 | /* vim: set et sts=4: */ 2 | /* ibus-hangul - The Hangul Engine For IBus 3 | * Copyright (C) 2018 Choe Hwanjin 4 | * 5 | * This program is free software; you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation; either version 2 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License along 16 | * with this program; if not, write to the Free Software Foundation, Inc., 17 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 18 | */ 19 | 20 | #include "ustring.h" 21 | 22 | #include 23 | 24 | 25 | static void 26 | test_ustring_compare(void) 27 | { 28 | UString* s1 = ustring_new(); 29 | UString* s2 = ustring_new(); 30 | 31 | ustring_append_utf8(s1, "abc"); 32 | ustring_append_utf8(s2, "abd"); 33 | g_assert_cmpint(ustring_compare(s1, s2), <, 0); 34 | 35 | ustring_clear(s1); 36 | ustring_clear(s2); 37 | 38 | ustring_append_utf8(s1, "abc"); 39 | ustring_append_utf8(s2, "abb"); 40 | g_assert_cmpint(ustring_compare(s1, s2), >, 0); 41 | 42 | ustring_clear(s1); 43 | ustring_clear(s2); 44 | 45 | ustring_append_utf8(s1, "abc"); 46 | ustring_append_utf8(s2, "abc"); 47 | g_assert_cmpint(ustring_compare(s1, s2), ==, 0); 48 | 49 | ustring_delete(s1); 50 | ustring_delete(s2); 51 | } 52 | 53 | int 54 | main(int argc, char* argv[]) 55 | { 56 | g_test_init(&argc, &argv, NULL); 57 | 58 | g_test_add_func("/ibus-hangul/ustring/compare", test_ustring_compare); 59 | 60 | int result = g_test_run(); 61 | return result; 62 | } 63 | -------------------------------------------------------------------------------- /Makefile.am: -------------------------------------------------------------------------------- 1 | # vim:set noet ts=4: 2 | # 3 | # ibus-hangul - The Hangul engine for IBus 4 | # 5 | # Copyright (c) 2007-2008 Huang Peng 6 | # 7 | # This program is free software; you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation; either version 2 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # This program is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License along 18 | # with this program; if not, write to the Free Software Foundation, Inc., 19 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 20 | 21 | SUBDIRS = \ 22 | src \ 23 | tests \ 24 | setup \ 25 | icons \ 26 | data \ 27 | m4 \ 28 | po \ 29 | $(NULL) 30 | 31 | ACLOCAL_AMFLAGS = -I m4 32 | 33 | EXTRA_DIST = \ 34 | autogen.sh \ 35 | ibus-hangul.spec.in \ 36 | $(NULL) 37 | 38 | noinst_DIST = \ 39 | $(NULL) 40 | 41 | 42 | DISTCLEANFILES = \ 43 | po/stamp-it \ 44 | $(NULL) 45 | 46 | rpm: dist @PACKAGE_NAME@.spec 47 | rpmbuild -bb \ 48 | --define "_sourcedir `pwd`" \ 49 | --define "_builddir `pwd`" \ 50 | --define "_srcrpmdir `pwd`" \ 51 | --define "_rpmdir `pwd`" \ 52 | --define "_specdir `pwd`" \ 53 | @PACKAGE_NAME@.spec 54 | 55 | srpm: dist @PACKAGE_NAME@.spec 56 | rpmbuild -bs \ 57 | --define "_sourcedir `pwd`" \ 58 | --define "_builddir `pwd`" \ 59 | --define "_srcrpmdir `pwd`" \ 60 | --define "_rpmdir `pwd`" \ 61 | --define "_specdir `pwd`" \ 62 | @PACKAGE_NAME@.spec 63 | 64 | clean-rpm: 65 | $(RM) -r "`uname -i`" 66 | 67 | clean-local: clean-rpm 68 | 69 | dist-hook: 70 | if test -d $(top_srcdir)/.git ; then \ 71 | git -C $(top_srcdir) log --name-status --date=iso > $(distdir)/ChangeLog ; \ 72 | fi 73 | -------------------------------------------------------------------------------- /data/Makefile.am: -------------------------------------------------------------------------------- 1 | # vim:set noet ts=4: 2 | # 3 | # ibus-hangul - The Hangul engine for IBus 4 | # 5 | # Copyright (c) 2009 Choe Hwanjin 6 | # 7 | # This library is free software; you can redistribute it and/or 8 | # modify it under the terms of the GNU Lesser General Public 9 | # License as published by the Free Software Foundation; either 10 | # version 2 of the License, or (at your option) any later version. 11 | # 12 | # This library is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU Lesser General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU Lesser General Public 18 | # License along with this program; if not, write to the 19 | # Free Software Foundation, Inc., 59 Temple Place, Suite 330, 20 | # Boston, MA 02111-1307 USA 21 | 22 | schemas_DATA = \ 23 | org.freedesktop.ibus.engine.hangul.gschema.xml 24 | $(NULL) 25 | 26 | schemasdir = $(datadir)/glib-2.0/schemas 27 | 28 | symboltable_DATA = \ 29 | symbol.txt \ 30 | $(NULL) 31 | 32 | symboltabledir = $(datadir)/ibus-hangul/data 33 | 34 | appstream_in_files = org.freedesktop.ibus.engine.hangul.metainfo.xml.in 35 | appstream_files = $(appstream_in_files:.xml.in=.xml) 36 | appstream_DATA = $(appstream_files) 37 | appstreamdir=$(datadir)/metainfo 38 | 39 | $(appstream_files): $(appstream_in_files) Makefile 40 | $(AM_V_GEN)$(MSGFMT) --xml --template $< -d $(top_srcdir)/po -o $@ 41 | 42 | install-data-hook: 43 | if test -z "$(DESTDIR)"; then \ 44 | glib-compile-schemas $(schemasdir); \ 45 | fi 46 | 47 | uninstall-hook: 48 | SCHEMAS_FILES=`ls $(schemasdir)/*.gschema.xml` || true; \ 49 | if test -z "$$SCHEMAS_FILES" && \ 50 | test -f $(schemasdir)/gschemas.compiled; then \ 51 | rm $(schemasdir)/gschemas.compiled; \ 52 | fi 53 | 54 | EXTRA_DIST = \ 55 | $(schemas_DATA) \ 56 | $(symboltable_DATA) \ 57 | $(appstream_in_files) \ 58 | $(NULL) 59 | 60 | CLEANFILES = \ 61 | $(appstream_DATA) \ 62 | $(NULL) 63 | -------------------------------------------------------------------------------- /m4/as-version.m4: -------------------------------------------------------------------------------- 1 | dnl as-version.m4 0.2.0 2 | 3 | dnl autostars m4 macro for versioning 4 | 5 | dnl Thomas Vander Stichele 6 | 7 | dnl $Id: as-version.m4,v 1.4 2004/06/01 09:40:05 thomasvs Exp $ 8 | 9 | dnl AS_VERSION 10 | 11 | dnl example 12 | dnl AS_VERSION 13 | 14 | dnl this macro 15 | dnl - AC_SUBST's PACKAGE_VERSION_MAJOR, _MINOR, _MICRO 16 | dnl - AC_SUBST's PACKAGE_VERSION_RELEASE, 17 | dnl which can be used for rpm release fields 18 | dnl - doesn't call AM_INIT_AUTOMAKE anymore because it prevents 19 | dnl maintainer mode from running correctly 20 | dnl 21 | dnl don't forget to put #undef PACKAGE_VERSION_RELEASE in acconfig.h 22 | dnl if you use acconfig.h 23 | 24 | AC_DEFUN([AS_VERSION], 25 | [ 26 | PACKAGE_VERSION_MAJOR=$(echo AC_PACKAGE_VERSION | cut -d'.' -f1) 27 | PACKAGE_VERSION_MINOR=$(echo AC_PACKAGE_VERSION | cut -d'.' -f2) 28 | PACKAGE_VERSION_MICRO=$(echo AC_PACKAGE_VERSION | cut -d'.' -f3) 29 | 30 | AC_SUBST(PACKAGE_VERSION_MAJOR) 31 | AC_SUBST(PACKAGE_VERSION_MINOR) 32 | AC_SUBST(PACKAGE_VERSION_MICRO) 33 | ]) 34 | 35 | dnl AS_NANO(ACTION-IF-NO-NANO, [ACTION-IF-NANO]) 36 | 37 | dnl requires AC_INIT to be called before 38 | dnl For projects using a fourth or nano number in your versioning to indicate 39 | dnl development or prerelease snapshots, this macro allows the build to be 40 | dnl set up differently accordingly. 41 | 42 | dnl this macro: 43 | dnl - parses AC_PACKAGE_VERSION, set by AC_INIT, and extracts the nano number 44 | dnl - sets the variable PACKAGE_VERSION_NANO 45 | dnl - sets the variable PACKAGE_VERSION_RELEASE, which can be used 46 | dnl for rpm release fields 47 | dnl - executes ACTION-IF-NO-NANO or ACTION-IF-NANO 48 | 49 | dnl example: 50 | dnl AS_NANO(RELEASE="yes", RELEASE="no") 51 | 52 | AC_DEFUN([AS_NANO], 53 | [ 54 | AC_MSG_CHECKING(nano version) 55 | 56 | NANO=$(echo AC_PACKAGE_VERSION | cut -d'.' -f4) 57 | 58 | if test x"$NANO" = x || test "x$NANO" = "x0" ; then 59 | AC_MSG_RESULT([0 (release)]) 60 | NANO=0 61 | PACKAGE_VERSION_RELEASE=1 62 | ifelse([$1], , :, [$1]) 63 | else 64 | AC_MSG_RESULT($NANO) 65 | PACKAGE_VERSION_RELEASE=0.`date +%Y%m%d.%H%M%S` 66 | ifelse([$2], , :, [$2]) 67 | fi 68 | PACKAGE_VERSION_NANO=$NANO 69 | AC_SUBST(PACKAGE_VERSION_NANO) 70 | AC_SUBST(PACKAGE_VERSION_RELEASE) 71 | ]) 72 | -------------------------------------------------------------------------------- /data/org.freedesktop.ibus.engine.hangul.gschema.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | '2' 7 | Hangul keyboard 8 | 9 | 10 | 11 | 'latin' 12 | Initial input mode 13 | 14 | 15 | 16 | false 17 | Word commit 18 | 19 | 20 | 21 | true 22 | Auto reorder 23 | 24 | 25 | 26 | 'Hangul,Shift+space' 27 | Switch keys 28 | 29 | 30 | 31 | 'Hangul_Hanja,F9' 32 | Hanja keys 33 | 34 | 35 | 36 | '' 37 | On keys 38 | 39 | 40 | 41 | 'Escape' 42 | Off keys 43 | 44 | 45 | 46 | false 47 | Disable Latin mode 48 | 49 | 50 | 51 | true 52 | Enable event forwarding workaround 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 'syllable' 62 | Preedit mode 63 | 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /tests/Makefile.am: -------------------------------------------------------------------------------- 1 | # vim:set noet ts=4: 2 | # 3 | # ibus-hangul - The Hangul engine for IBus 4 | # 5 | # Copyright (c) 2019 Peng Wu 6 | # 7 | # This program is free software; you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation; either version 2 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # This program is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License along 18 | # with this program; if not, write to the Free Software Foundation, Inc., 19 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 20 | 21 | TESTS = \ 22 | ibus-hangul \ 23 | $(NULL) 24 | 25 | CLEANFILES = $(test_metas) 26 | 27 | EXTRA_DIST = $(test_metas_in) runtest 28 | 29 | noinst_PROGRAMS = $(TESTS) 30 | 31 | TESTS_ENVIRONMENT = \ 32 | top_builddir=$(top_builddir) \ 33 | top_srcdir=$(top_srcdir) \ 34 | builddir=$(builddir) \ 35 | srcdir=$(srcdir) \ 36 | LD_LIBRARY_PATH="$(top_builddir)/src/.libs:$(top_builddir)/src" \ 37 | DISABLE_GUI_TESTS="$(DISABLE_GUI_TESTS)" \ 38 | $(NULL) 39 | 40 | LOG_COMPILER = $(srcdir)/runtest 41 | test_metas_in = meta.test.in 42 | 43 | if ENABLE_INSTALLED_TESTS 44 | test_execs = ibus-hangul 45 | test_metas = $(addsuffix .test, $(test_execs)) 46 | test_sources_DATA = $(test_metas) 47 | test_sourcesdir = $(datadir)/installed-tests/ibus-hangul 48 | test_execs_PROGRAMS = $(TESTS) 49 | test_execsdir = $(libexecdir)/installed-tests/ibus-hangul 50 | endif 51 | 52 | ibus_hangul_SOURCES = ibus-hangul.c 53 | ibus_hangul_CFLAGS = \ 54 | @IBUS_CFLAGS@ \ 55 | @HANGUL_CFLAGS@ \ 56 | @GTK_CFLAGS@ \ 57 | -I$(top_srcdir)/src \ 58 | -I$(top_builddir)/src \ 59 | -DPKGDATADIR=\"$(pkgdatadir)\" \ 60 | -DLOCALEDIR=\"$(localedir)\" \ 61 | -DLIBEXECDIR=\"$(libexecdir)\" \ 62 | -DIBUSHANGUL_DATADIR=\"$(datadir)/ibus-hangul\" \ 63 | $(NULL) 64 | 65 | ibus_hangul_LDADD = \ 66 | ../src/libinternal.a \ 67 | @IBUS_LIBS@ \ 68 | @HANGUL_LIBS@ \ 69 | @GTK_LIBS@ \ 70 | $(NULL) 71 | 72 | $(test_metas): $(test_metas_in) $(test_programs) 73 | f=`echo $@ | sed -e 's/\.test//'`; \ 74 | TEST_EXEC=$(test_execsdir)/$$f; \ 75 | sed -e "s|@TEST_EXEC[@]|$$TEST_EXEC|g" $(test_metas_in) > $@.tmp; \ 76 | mv $@.tmp $@; \ 77 | $(NULL) 78 | -------------------------------------------------------------------------------- /src/Makefile.am: -------------------------------------------------------------------------------- 1 | # vim:set noet ts=4: 2 | # 3 | # ibus-hangul - The Hangul engine for IBus 4 | # 5 | # Copyright (c) 2007-2008 Huang Peng 6 | # 7 | # This program is free software; you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation; either version 2 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # This program is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License along 18 | # with this program; if not, write to the Free Software Foundation, Inc., 19 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 20 | 21 | AM_CFLAGS = \ 22 | @IBUS_CFLAGS@ \ 23 | @HANGUL_CFLAGS@ \ 24 | -DPKGDATADIR=\"$(pkgdatadir)\" \ 25 | $(NULL) 26 | AM_LDFLAGS = \ 27 | @IBUS_LIBS@ \ 28 | @HANGUL_LIBS@ \ 29 | $(NULL) 30 | 31 | noinst_LIBRARIES = \ 32 | libinternal.a 33 | $(NULL) 34 | 35 | libinternal_a_SOURCES = \ 36 | engine.c \ 37 | engine.h \ 38 | ustring.c \ 39 | ustring.h \ 40 | i18n.h \ 41 | $(NULL) 42 | 43 | libinternal_a_CFLAGS = \ 44 | @IBUS_CFLAGS@ \ 45 | @HANGUL_CFLAGS@ \ 46 | -DPKGDATADIR=\"$(pkgdatadir)\" \ 47 | -DLOCALEDIR=\"$(localedir)\" \ 48 | -DLIBEXECDIR=\"$(libexecdir)\" \ 49 | -DIBUSHANGUL_DATADIR=\"$(datadir)/ibus-hangul\" \ 50 | $(NULL) 51 | 52 | check_PROGRAMS = \ 53 | test-ustring 54 | $(NULL) 55 | 56 | TESTS = \ 57 | $(check_PROGRAMS) \ 58 | $(NULL) 59 | 60 | libexec_PROGRAMS = ibus-engine-hangul 61 | 62 | ibus_engine_hangul_SOURCES = \ 63 | main.c \ 64 | $(NULL) 65 | 66 | ibus_engine_hangul_CFLAGS = \ 67 | @IBUS_CFLAGS@ \ 68 | @HANGUL_CFLAGS@ \ 69 | -DPKGDATADIR=\"$(pkgdatadir)\" \ 70 | -DLOCALEDIR=\"$(localedir)\" \ 71 | -DLIBEXECDIR=\"$(libexecdir)\" \ 72 | -DIBUSHANGUL_DATADIR=\"$(datadir)/ibus-hangul\" \ 73 | $(NULL) 74 | 75 | ibus_engine_hangul_LDADD = \ 76 | libinternal.a \ 77 | @IBUS_LIBS@ \ 78 | @HANGUL_LIBS@ \ 79 | $(NULL) 80 | 81 | component_DATA = \ 82 | hangul.xml \ 83 | $(NULL) 84 | componentdir = @datadir@/ibus/component 85 | 86 | EXTRA_DIST = \ 87 | $(NULL) 88 | 89 | CLEANFILES = \ 90 | hangul.xml \ 91 | $(NULL) 92 | 93 | hangul.xml: hangul.xml.in 94 | ( \ 95 | libexecdir=${libexecdir}; \ 96 | pkgdatadir=${pkgdatadir}; \ 97 | s=`cat $<`; \ 98 | eval "echo \"$${s}\""; \ 99 | ) > $@ 100 | 101 | test: ibus-engine-hangul 102 | $(builddir)/ibus-engine-hangul 103 | 104 | test_ustring_CFLAGS = $(IBUS_CFLAGS) $(HANGUL_CFLAGS) 105 | test_ustring_LDADD = $(IBUS_LIBS) 106 | test_ustring_SOURCES = test-ustring.c ustring.c ustring.h 107 | 108 | check-local: 109 | $(builddir)/test-ustring 110 | -------------------------------------------------------------------------------- /setup/Makefile.am: -------------------------------------------------------------------------------- 1 | # vim:set noet ts=4: 2 | # 3 | # ibus-hangul - The Hangul Engine For IBus 4 | # 5 | # Copyright (c) 2009 Choe Hwanjin 6 | # 7 | # This program is free software; you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation; either version 2 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # This program is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License along 18 | # with this program; if not, write to the Free Software Foundation, Inc., 19 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 20 | 21 | setup_hangul_PYTHON = \ 22 | main.py \ 23 | keycapturedialog.py \ 24 | setup.ui \ 25 | $(NULL) 26 | 27 | nodist_setup_hangul_PYTHON = config.py 28 | 29 | setup_hanguldir = $(pkgdatadir)/setup 30 | 31 | libexec_SCRIPTS = ibus-setup-hangul 32 | 33 | desktop_in_files = ibus-setup-hangul.desktop.in 34 | desktop_files = $(desktop_in_files:.desktop.in=.desktop) 35 | desktop_DATA = $(desktop_files) 36 | desktopdir = $(datadir)/applications 37 | 38 | $(desktop_files): $(desktop_in_files) Makefile 39 | $(AM_V_GEN)$(MSGFMT) --desktop --template $< -d $(top_srcdir)/po -o $@ 40 | 41 | hicolor_icon_64_DATA = ibus-setup-hangul.png 42 | hicolor_icon_64dir = $(datadir)/icons/hicolor/64x64/apps 43 | 44 | hicolor_icon_scalable_DATA = ibus-setup-hangul.svg 45 | hicolor_icon_scalabledir = $(datadir)/icons/hicolor/scalable/apps 46 | 47 | CLEANFILES = \ 48 | ibus-setup-hangul \ 49 | config.py \ 50 | *.pyc \ 51 | ibus-setup-hangul.desktop \ 52 | $(NULL) 53 | 54 | EXTRA_DIST = \ 55 | config.py.in \ 56 | ibus-setup-hangul.in \ 57 | ibus-setup-hangul.desktop.in \ 58 | $(hicolor_icon_64_DATA) \ 59 | $(hicolor_icon_scalable_DATA) \ 60 | $(NULL) 61 | 62 | test: 63 | $(ENV_PROG) DBUS_DEBUG=true \ 64 | PYTHONPATH=$(abs_builddir):$(pyexecdir) \ 65 | $(PYTHON) $(srcdir)/main.py 66 | 67 | config.py: config.py.in Makefile 68 | sed -e 's&@SETUP_GETTEXT_PACKAGE@&$(GETTEXT_PACKAGE)&g' \ 69 | -e 's&@SETUP_LOCALEDIR@&$(localedir)&g' \ 70 | -e 's&@SETUP_PKGDATADIR@&$(pkgdatadir)&g' $< > $@ 71 | 72 | ibus-setup-hangul: ibus-setup-hangul.in config.py Makefile 73 | sed -e 's&@SETUP_PKGDATADIR@&$(pkgdatadir)&g' \ 74 | -e 's&\@PYTHON\@&$(PYTHON)&g' $< > $@ 75 | 76 | install-exec-hook: 77 | $(MKDIR_P) $(DESTDIR)$(bindir) 78 | cd $(DESTDIR)$(bindir) && \ 79 | rm -f ibus-setup-hangul && \ 80 | a="$(bindir)"; b="$(libexecdir)"; updir=""; downdir=""; \ 81 | while test "$$a" != "$$b"; do \ 82 | bbase=`basename $$b`; \ 83 | updir="../$$updir"; \ 84 | downdir="$$bbase/$$downdir"; \ 85 | a=`dirname $$a`; b=`dirname $$b`; \ 86 | done; \ 87 | $(LN_S) $$updir$${downdir}ibus-setup-hangul ibus-setup-hangul 88 | 89 | uninstall-hook: 90 | cd "$(DESTDIR)$(bindir)" && rm -f ibus-setup-hangul 91 | -------------------------------------------------------------------------------- /po/zh_CN.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR Huang Peng 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | #, fuzzy 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: PACKAGE VERSION\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2014-08-15 18:52+0900\n" 12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 13 | "Last-Translator: FULL NAME \n" 14 | "Language-Team: LANGUAGE \n" 15 | "Language: \n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | 20 | #: ../setup/keycapturedialog.py:15 21 | msgid "" 22 | "Press any key which you want to use as hanja key. The key you pressed is " 23 | "displayed below.\n" 24 | "If you want to use it, click \"Ok\" or click \"Cancel\"" 25 | msgstr "" 26 | 27 | #: ../setup/main.py:204 28 | msgid "Select Hangul toggle key" 29 | msgstr "" 30 | 31 | #: ../setup/main.py:228 32 | msgid "Select Hanja key" 33 | msgstr "" 34 | 35 | #: ../setup/main.py:281 36 | msgid "" 37 | "IBus daemon is not running.\n" 38 | "Hangul engine settings cannot be saved." 39 | msgstr "" 40 | 41 | #: ../setup/ibus-setup-hangul.desktop.in.h:1 42 | msgid "IBus Hangul Preferences" 43 | msgstr "" 44 | 45 | #: ../setup/ibus-setup-hangul.desktop.in.h:2 46 | msgid "Set IBus Hangul Preferences" 47 | msgstr "" 48 | 49 | #: ../setup/setup.ui.h:1 50 | msgid "IBusHangul Setup" 51 | msgstr "" 52 | 53 | #: ../setup/setup.ui.h:2 54 | msgid "Keyboard Layout" 55 | msgstr "" 56 | 57 | #: ../setup/setup.ui.h:3 58 | msgid "Hangul _keyboard:" 59 | msgstr "" 60 | 61 | #: ../setup/setup.ui.h:4 62 | msgid "Etc" 63 | msgstr "" 64 | 65 | #: ../setup/setup.ui.h:5 66 | msgid "Start in _hangul mode" 67 | msgstr "" 68 | 69 | #: ../setup/setup.ui.h:6 70 | msgid "Commit in _word unit" 71 | msgstr "" 72 | 73 | #: ../setup/setup.ui.h:7 74 | msgid "Automatic _reordering" 75 | msgstr "" 76 | 77 | #: ../setup/setup.ui.h:8 78 | msgid "Hangul toggle key" 79 | msgstr "" 80 | 81 | #: ../setup/setup.ui.h:9 82 | msgid "Hangul" 83 | msgstr "" 84 | 85 | #: ../setup/setup.ui.h:10 86 | msgid "Hanja key" 87 | msgstr "" 88 | 89 | #: ../setup/setup.ui.h:11 90 | msgid "Hanja" 91 | msgstr "" 92 | 93 | #: ../setup/setup.ui.h:12 94 | msgid "Advanced" 95 | msgstr "" 96 | 97 | #: ../src/engine.c:425 98 | msgid "Hangul mode" 99 | msgstr "" 100 | 101 | #: ../src/engine.c:426 102 | msgid "Enable/Disable Hangul mode" 103 | msgstr "" 104 | 105 | #: ../src/engine.c:440 106 | msgid "Hanja lock" 107 | msgstr "" 108 | 109 | #: ../src/engine.c:441 110 | msgid "Enable/Disable Hanja mode" 111 | msgstr "" 112 | 113 | #: ../src/engine.c:452 114 | msgid "Setup" 115 | msgstr "" 116 | 117 | #: ../src/engine.c:453 118 | msgid "Configure hangul engine" 119 | msgstr "" 120 | 121 | #: ../src/main.c:71 122 | msgid "Korean input method" 123 | msgstr "" 124 | 125 | #: ../src/main.c:80 ../src/main.c:81 126 | msgid "Korean Input Method" 127 | msgstr "" 128 | -------------------------------------------------------------------------------- /src/ustring.c: -------------------------------------------------------------------------------- 1 | /* ibus-hangul - korean input method engine for IBus 2 | * This file is from Korean XIM Nabi. 3 | */ 4 | 5 | /* Nabi - X Input Method server for hangul 6 | * Copyright (C) 2008 Choe Hwanjin 7 | * 8 | * This program is free software; you can redistribute it and/or modify 9 | * it under the terms of the GNU General Public License as published by 10 | * the Free Software Foundation; either version 2 of the License, or 11 | * (at your option) any later version. 12 | * 13 | * This program is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | * GNU General Public License for more details. 17 | * 18 | * You should have received a copy of the GNU General Public License 19 | * along with this program; if not, write to the Free Software 20 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA 21 | */ 22 | 23 | #include "ustring.h" 24 | 25 | UString* 26 | ustring_new() 27 | { 28 | return g_array_new(TRUE, TRUE, sizeof(ucschar)); 29 | } 30 | 31 | UString* 32 | ustring_dup(const UString* str) 33 | { 34 | UString* dup; 35 | dup = ustring_new(); 36 | ustring_append(dup, str); 37 | return dup; 38 | } 39 | 40 | void 41 | ustring_delete(UString* str) 42 | { 43 | g_array_free(str, TRUE); 44 | } 45 | 46 | void 47 | ustring_clear(UString* str) 48 | { 49 | if (str->len > 0) 50 | g_array_remove_range(str, 0, str->len); 51 | } 52 | 53 | UString* 54 | ustring_erase(UString* str, guint pos, guint len) 55 | { 56 | if (len > 0) 57 | return g_array_remove_range(str, pos, len); 58 | else 59 | return str; 60 | } 61 | 62 | ucschar* 63 | ustring_begin(UString* str) 64 | { 65 | return (ucschar*)str->data; 66 | } 67 | 68 | ucschar* 69 | ustring_end(UString* str) 70 | { 71 | return &g_array_index(str, ucschar, str->len); 72 | } 73 | 74 | guint 75 | ustring_length(const UString* str) 76 | { 77 | return str->len; 78 | } 79 | 80 | UString* 81 | ustring_append(UString* str, const UString* s) 82 | { 83 | return g_array_append_vals(str, s->data, s->len); 84 | } 85 | 86 | UString* 87 | ustring_append_ucs4(UString* str, const ucschar* s, gint len) 88 | { 89 | if (len < 0) { 90 | const ucschar*p = s; 91 | while (*p != 0) 92 | p++; 93 | len = p - s; 94 | } 95 | 96 | return g_array_append_vals(str, s, len); 97 | } 98 | 99 | UString* 100 | ustring_append_utf8(UString* str, const char* utf8) 101 | { 102 | while (*utf8 != '\0') { 103 | ucschar c = g_utf8_get_char(utf8); 104 | g_array_append_vals(str, &c, 1); 105 | utf8 = g_utf8_next_char(utf8); 106 | } 107 | return str; 108 | } 109 | 110 | gchar* 111 | ustring_to_utf8(const UString* str, guint len) 112 | { 113 | if (len < 0) 114 | len = str->len; 115 | return g_ucs4_to_utf8((const gunichar*)str->data, len, NULL, NULL, NULL); 116 | } 117 | 118 | int 119 | ustring_compare(const UString* str, const UString* other) 120 | { 121 | const ucschar* p1 = (const ucschar*)str->data; 122 | const ucschar* p2 = (const ucschar*)other->data; 123 | 124 | while (*p1 != 0 && *p2 != 0) { 125 | if (*p1 != *p2) 126 | break; 127 | ++p1; 128 | ++p2; 129 | } 130 | 131 | return *p1 - *p2; 132 | } 133 | -------------------------------------------------------------------------------- /configure.ac: -------------------------------------------------------------------------------- 1 | # vim:set et ts=4: 2 | # 3 | # ibus-hangul - The Hangul engine for IBus 4 | # 5 | # Copyright (c) 2007-2008 Huang Peng 6 | # 7 | # This program is free software; you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation; either version 2 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # This program is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License along 18 | # with this program; if not, write to the Free Software Foundation, Inc., 19 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 20 | 21 | # if not 1, append datestamp to the version number. 22 | m4_define([ibus_released], [1]) 23 | m4_define([ibus_major_version], [1]) 24 | m4_define([ibus_minor_version], [5]) 25 | m4_define([ibus_micro_version], [5]) 26 | m4_define(ibus_maybe_datestamp, 27 | m4_esyscmd([if test x]ibus_released[ != x1; then date +.%Y%m%d | tr -d '\n\r'; fi])) 28 | 29 | m4_define([ibus_version], 30 | ibus_major_version.ibus_minor_version.ibus_micro_version[]ibus_maybe_datestamp) 31 | 32 | AC_INIT([ibus-hangul], [ibus_version], [https://github.com/libhangul/ibus-hangul/issues],[ibus-hangul]) 33 | AM_INIT_AUTOMAKE([1.10 no-dist-gzip dist-xz]) 34 | AC_GNU_SOURCE 35 | 36 | AC_CONFIG_HEADERS([config.h]) 37 | AC_CONFIG_MACRO_DIR([m4]) 38 | 39 | # define PACKAGE_VERSION_* variables 40 | AS_VERSION 41 | AS_NANO 42 | AM_SANITY_CHECK 43 | AM_MAINTAINER_MODE 44 | AM_DISABLE_STATIC 45 | AC_PROG_CC 46 | AM_PROG_CC_C_O 47 | AC_PROG_CXX 48 | AC_PROG_LN_S 49 | AC_PROG_MKDIR_P 50 | AC_ISC_POSIX 51 | AC_HEADER_STDC 52 | AM_PROG_LIBTOOL 53 | 54 | AM_GNU_GETTEXT_VERSION([0.19.8]) 55 | AM_GNU_GETTEXT([external]) 56 | 57 | # check ibus 58 | PKG_CHECK_MODULES(IBUS, [ 59 | ibus-1.0 >= 1.5.4 60 | ]) 61 | 62 | # check libhangul 63 | PKG_CHECK_MODULES(HANGUL, [ 64 | libhangul >= 0.1.0 65 | ]) 66 | 67 | # check gtk 68 | PKG_CHECK_MODULES(GTK, [ 69 | gtk+-3.0 >= 3.0.0 70 | ]) 71 | 72 | # check env 73 | AC_PATH_PROG(ENV_PROG, env) 74 | AC_SUBST(ENV_PROG) 75 | 76 | # Define python version 77 | AC_ARG_WITH(python, 78 | AS_HELP_STRING([--with-python[=PATH]], 79 | [Select python2 or python3]), 80 | [PYTHON=$with_python], [] 81 | ) 82 | AM_PATH_PYTHON([2.5]) 83 | 84 | # define GETTEXT_* variables 85 | GETTEXT_PACKAGE=AC_PACKAGE_NAME 86 | AC_SUBST(GETTEXT_PACKAGE) 87 | AC_DEFINE_UNQUOTED( 88 | GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", 89 | [Define to the read-only architecture-independent data directory.] 90 | ) 91 | 92 | # --enable-installed-tests 93 | AC_ARG_ENABLE(installed-tests, 94 | AS_HELP_STRING([--enable-installed-tests], 95 | [Enable to installed tests]), 96 | [enable_installed_tests=$enableval], 97 | [enable_installed_tests=no] 98 | ) 99 | AM_CONDITIONAL([ENABLE_INSTALLED_TESTS], [test x"$enable_installed_tests" = x"yes"]) 100 | if test x"$enable_installed_tests" = x"no"; then 101 | enable_installed_tests="no (disabled, use --enable-installed-tests to enable)" 102 | fi 103 | 104 | # OUTPUT files 105 | AC_CONFIG_FILES([ 106 | po/Makefile.in 107 | Makefile 108 | ibus-hangul.spec 109 | src/Makefile 110 | src/hangul.xml.in 111 | tests/Makefile 112 | setup/Makefile 113 | icons/Makefile 114 | data/Makefile 115 | m4/Makefile 116 | ]) 117 | 118 | AC_OUTPUT 119 | -------------------------------------------------------------------------------- /po/Makevars: -------------------------------------------------------------------------------- 1 | # Makefile variables for PO directory in any package using GNU gettext. 2 | 3 | # Usually the message domain is the same as the package name. 4 | DOMAIN = $(PACKAGE) 5 | 6 | # These two variables depend on the location of this directory. 7 | subdir = po 8 | top_builddir = .. 9 | 10 | # These options get passed to xgettext. 11 | XGETTEXT_OPTIONS = --from-code=UTF-8 --keyword=_ --keyword=N_ --keyword=C_:1c,2 --keyword=NC_:1c,2 --keyword=g_dngettext:2,3 --add-comments 12 | 13 | # This is the copyright holder that gets inserted into the header of the 14 | # $(DOMAIN).pot file. Set this to the copyright holder of the surrounding 15 | # package. (Note that the msgstr strings, extracted from the package's 16 | # sources, belong to the copyright holder of the package.) Translators are 17 | # expected to transfer the copyright for their translations to this person 18 | # or entity, or to disclaim their copyright. The empty string stands for 19 | # the public domain; in this case the translators are expected to disclaim 20 | # their copyright. 21 | COPYRIGHT_HOLDER = Huang Peng 22 | 23 | # This tells whether or not to prepend "GNU " prefix to the package 24 | # name that gets inserted into the header of the $(DOMAIN).pot file. 25 | # Possible values are "yes", "no", or empty. If it is empty, try to 26 | # detect it automatically by scanning the files in $(top_srcdir) for 27 | # "GNU packagename" string. 28 | PACKAGE_GNU = no 29 | 30 | # This is the email address or URL to which the translators shall report 31 | # bugs in the untranslated strings: 32 | # - Strings which are not entire sentences, see the maintainer guidelines 33 | # in the GNU gettext documentation, section 'Preparing Strings'. 34 | # - Strings which use unclear terms or require additional context to be 35 | # understood. 36 | # - Strings which make invalid assumptions about notation of date, time or 37 | # money. 38 | # - Pluralisation problems. 39 | # - Incorrect English spelling. 40 | # - Incorrect formatting. 41 | # It can be your email address, or a mailing list address where translators 42 | # can write to without being subscribed, or the URL of a web page through 43 | # which the translators can contact you. 44 | MSGID_BUGS_ADDRESS = $(PACKAGE_BUGREPORT) 45 | 46 | # This is the list of locale categories, beyond LC_MESSAGES, for which the 47 | # message catalogs shall be used. It is usually empty. 48 | EXTRA_LOCALE_CATEGORIES = 49 | 50 | # This tells whether the $(DOMAIN).pot file contains messages with an 'msgctxt' 51 | # context. Possible values are "yes" and "no". Set this to yes if the 52 | # package uses functions taking also a message context, like pgettext(), or 53 | # if in $(XGETTEXT_OPTIONS) you define keywords with a context argument. 54 | USE_MSGCTXT = yes 55 | 56 | # These options get passed to msgmerge. 57 | # Useful options are in particular: 58 | # --previous to keep previous msgids of translated messages, 59 | # --quiet to reduce the verbosity. 60 | MSGMERGE_OPTIONS = 61 | 62 | # These options get passed to msginit. 63 | # If you want to disable line wrapping when writing PO files, add 64 | # --no-wrap to MSGMERGE_OPTIONS, XGETTEXT_OPTIONS, and 65 | # MSGINIT_OPTIONS. 66 | MSGINIT_OPTIONS = 67 | 68 | # This tells whether or not to regenerate a PO file when $(DOMAIN).pot 69 | # has changed. Possible values are "yes" and "no". Set this to no if 70 | # the POT file is checked in the repository and the version control 71 | # program ignores timestamps. 72 | PO_DEPENDS_ON_POT = no 73 | 74 | # This tells whether or not to forcibly update $(DOMAIN).pot and 75 | # regenerate PO files on "make dist". Possible values are "yes" and 76 | # "no". Set this to no if the POT file and PO files are maintained 77 | # externally. 78 | DIST_DEPENDS_ON_UPDATE_PO = no 79 | -------------------------------------------------------------------------------- /po/ko.po: -------------------------------------------------------------------------------- 1 | # ibus-hangul Korean Translation 2 | # Copyright (C) 2009 Huang Peng 3 | # This file is distributed under the same license as the ibus-hangul package. 4 | # Choe Hwanjin , 2009. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: ibus-hangul\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2014-08-15 18:52+0900\n" 11 | "PO-Revision-Date: 2009-02-18 23:32+0900\n" 12 | "Last-Translator: Choe Hwanjin \n" 13 | "Language-Team: Choe Hwanjin \n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: ../setup/main.py:220 20 | msgid "Select Hangul toggle key" 21 | msgstr "한영전환키를 선택하시오" 22 | 23 | #: ../setup/main.py:221 24 | msgid "" 25 | "Press any key which you want to use as hangul toggle key. The key you " 26 | "pressed is displayed below.\n" 27 | "If you want to use it, click \"Ok\" or click \"Cancel\"" 28 | msgstr "" 29 | "한글키로 사용하고자 하는 키를 입력하십시오. 그러면 그 키가 아래에 표시됩니다.\n" 30 | "그 키를 사용하시려면 \"확인\"을 누르시고, 사용하지 않으시려면 \"취소\"를 누르십시오." 31 | 32 | #: ../setup/main.py:228 33 | msgid "Select Hanja key" 34 | msgstr "한자키를 선택하시오" 35 | 36 | #: ../setup/main.py:248 37 | msgid "" 38 | "Press any key which you want to use as hanja key. The key you pressed is " 39 | "displayed below.\n" 40 | "If you want to use it, click \"Ok\" or click \"Cancel\"" 41 | msgstr "" 42 | "한자키로 사용하고자 하는 키를 입력하십시오. 그러면 그 키가 아래에 표시됩니다.\n" 43 | "그 키를 사용하시려면 \"확인\"을 누르시고, 사용하지 않으시려면 \"취소\"를 누르십시오." 44 | 45 | #: ../setup/main.py:303 46 | msgid "" 47 | "IBus daemon is not running.\n" 48 | "Hangul engine settings cannot be saved." 49 | msgstr "" 50 | "IBus 데몬이 실행중이지 않습니다.\n" 51 | "한글 엔진 설정을 저장할 수 없습니다." 52 | 53 | #: ../setup/ibus-setup-hangul.desktop.in.h:1 54 | msgid "IBus Hangul Preferences" 55 | msgstr "IBus 한글 설정" 56 | 57 | #: ../setup/ibus-setup-hangul.desktop.in.h:2 58 | msgid "Set IBus Hangul Preferences" 59 | msgstr "IBus 한글 엔진을 설정합니다" 60 | 61 | #: ../setup/setup.ui.h:1 62 | msgid "IBusHangul Setup" 63 | msgstr "IBus 한글 설정" 64 | 65 | #: ../setup/setup.ui.h:2 66 | msgid "Keyboard Layout" 67 | msgstr "자판 설정" 68 | 69 | #: ../setup/setup.ui.h:3 70 | msgid "Hangul _keyboard:" 71 | msgstr "한글 자판(_K):" 72 | 73 | #: ../setup/setup.ui.h:4 74 | msgid "Etc" 75 | msgstr "기타" 76 | 77 | #: ../setup/setup.ui.h:5 78 | msgid "Start in _Hangul mode" 79 | msgstr "한글 모드로 시작(_H)" 80 | 81 | #: ../setup/setup.ui.h:6 82 | msgid "Commit in _word unit" 83 | msgstr "단어 단위로 입력(_W)" 84 | 85 | #: ../setup/setup.ui.h:7 86 | msgid "Automatic _reordering" 87 | msgstr "자동 순서 교정(_R)" 88 | 89 | #: ../setup/setup.ui.h:8 90 | msgid "Hangul Toggle Key" 91 | msgstr "한영전환키" 92 | 93 | #: ../setup/setup.ui.h:9 94 | msgid "Hangul" 95 | msgstr "한글" 96 | 97 | #: ../setup/setup.ui.h:10 98 | msgid "Hanja Key" 99 | msgstr "한자키" 100 | 101 | #: ../setup/setup.ui.h:11 102 | msgid "Hanja" 103 | msgstr "한자" 104 | 105 | #: ../setup/setup.ui.h:12 106 | msgid "Advanced" 107 | msgstr "고급" 108 | 109 | #: ../src/engine.c:425 110 | msgid "Hangul mode" 111 | msgstr "한글 상태" 112 | 113 | #: ../src/engine.c:426 114 | msgid "Enable/Disable Hangul mode" 115 | msgstr "한글 입력 모드를 선택합니다" 116 | 117 | #: ../src/engine.c:440 118 | msgid "Hanja lock" 119 | msgstr "한자 전용" 120 | 121 | #: ../src/engine.c:441 122 | msgid "Enable/Disable Hanja mode" 123 | msgstr "한자 전용 모드 선택합니다" 124 | 125 | #: ../src/engine.c:452 126 | msgid "Setup" 127 | msgstr "설정" 128 | 129 | #: ../src/engine.c:453 130 | msgid "Configure hangul engine" 131 | msgstr "한글 입력기를 설정합니다" 132 | 133 | #: ../src/main.c:71 134 | msgid "Korean input method" 135 | msgstr "한글 입력기" 136 | 137 | #: ../src/main.c:80 ../src/main.c:81 138 | msgid "Korean Input Method" 139 | msgstr "한글 입력기" 140 | 141 | #~ msgid "IBus daemon is not running" 142 | #~ msgstr "IBus 데몬이 실행중이지 않습니다" 143 | 144 | #~ msgid "Dubeolsik" 145 | #~ msgstr "두벌식" 146 | 147 | #~ msgid "Sebeolsik Final" 148 | #~ msgstr "세벌식 최종" 149 | 150 | #~ msgid "Sebeolsik 390" 151 | #~ msgstr "세벌식 390" 152 | 153 | #~ msgid "Sebeolsik No-shift" 154 | #~ msgstr "세벌식 순아래" 155 | 156 | #~ msgid "Sebeolsik 2 set" 157 | #~ msgstr "세벌식 두벌배열" 158 | 159 | #~ msgid "Romaja" 160 | #~ msgstr "로마자" 161 | -------------------------------------------------------------------------------- /src/main.c: -------------------------------------------------------------------------------- 1 | /* vim:set et sts=4: */ 2 | /* ibus-hangul - The Hangul Engine For IBus 3 | * Copyright (C) 2008-2009 Peng Huang 4 | * Copyright (C) 2009-2011 Choe Hwanjin 5 | * 6 | * This program is free software; you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation; either version 2 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * This program is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License along 17 | * with this program; if not, write to the Free Software Foundation, Inc., 18 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 19 | */ 20 | 21 | #ifdef HAVE_CONFIG_H 22 | #include 23 | #endif 24 | 25 | #include 26 | #include 27 | #include 28 | #include 29 | 30 | #include "i18n.h" 31 | #include "engine.h" 32 | 33 | 34 | static IBusBus *bus = NULL; 35 | static IBusFactory *factory = NULL; 36 | 37 | /* options */ 38 | static gboolean ibus = FALSE; 39 | static gboolean verbose = FALSE; 40 | 41 | static const GOptionEntry entries[] = 42 | { 43 | { "ibus", 'i', 0, G_OPTION_ARG_NONE, &ibus, "component is executed by ibus", NULL }, 44 | { "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose, "verbose", NULL }, 45 | { NULL }, 46 | }; 47 | 48 | 49 | static void 50 | ibus_disconnected_cb (IBusBus *bus, 51 | gpointer user_data) 52 | { 53 | g_debug ("bus disconnected"); 54 | ibus_quit (); 55 | } 56 | 57 | 58 | static void 59 | start_component (void) 60 | { 61 | IBusComponent *component; 62 | IBusConfig* config; 63 | gboolean res; 64 | 65 | ibus_init (); 66 | 67 | bus = ibus_bus_new (); 68 | 69 | res = ibus_bus_is_connected (bus); 70 | if (!res) { 71 | g_warning ("Unable to connect to IBus"); 72 | exit (2); 73 | } 74 | 75 | config = ibus_bus_get_config (bus); 76 | if (config == NULL) { 77 | g_warning ("Unable to connect to IBus config component"); 78 | exit (3); 79 | } 80 | 81 | g_signal_connect (bus, "disconnected", G_CALLBACK (ibus_disconnected_cb), NULL); 82 | 83 | ibus_hangul_init (bus); 84 | 85 | component = ibus_component_new ("org.freedesktop.IBus.Hangul", 86 | N_("Korean input method"), 87 | "0.1.0", 88 | "GPL", 89 | "Peng Huang ", 90 | "https://github.com/libhangul/ibus-hangul", 91 | "", 92 | "ibus-hangul"); 93 | ibus_component_add_engine (component, 94 | ibus_engine_desc_new ("hangul", 95 | N_("Korean Input Method"), 96 | N_("Korean Input Method"), 97 | "ko", 98 | "GPL", 99 | "Peng Huang ", 100 | PKGDATADIR"/icon/ibus-hangul.svg", 101 | "us")); 102 | 103 | factory = ibus_factory_new (ibus_bus_get_connection (bus)); 104 | 105 | ibus_factory_add_engine (factory, "hangul", IBUS_TYPE_HANGUL_ENGINE); 106 | 107 | if (ibus) { 108 | ibus_bus_request_name (bus, "org.freedesktop.IBus.Hangul", 0); 109 | } 110 | else { 111 | ibus_bus_register_component (bus, component); 112 | } 113 | 114 | g_object_unref (component); 115 | 116 | ibus_main (); 117 | 118 | ibus_hangul_exit (); 119 | } 120 | 121 | int 122 | main (gint argc, gchar **argv) 123 | { 124 | GError *error = NULL; 125 | GOptionContext *context; 126 | 127 | setlocale (LC_ALL, ""); 128 | 129 | bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR); 130 | bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); 131 | textdomain(GETTEXT_PACKAGE); 132 | 133 | context = g_option_context_new ("- ibus hangul engine component"); 134 | 135 | g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE); 136 | 137 | if (!g_option_context_parse (context, &argc, &argv, &error)) { 138 | g_print ("Option parsing failed: %s\n", error->message); 139 | exit (-1); 140 | } 141 | 142 | if (verbose) { 143 | const gchar* value = g_getenv ("G_MESSAGES_DEBUG"); 144 | if (value == NULL) { 145 | g_setenv ("G_MESSAGES_DEBUG", "all", TRUE); 146 | } 147 | } 148 | 149 | start_component (); 150 | 151 | return 0; 152 | } 153 | -------------------------------------------------------------------------------- /icons/ibus-hangul.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 15 | 17 | 19 | 23 | 27 | 28 | 30 | 34 | 38 | 39 | 41 | 45 | 49 | 50 | 56 | 59 | 60 | 69 | 78 | 87 | 88 | 90 | 91 | 93 | image/svg+xml 94 | 96 | 97 | 98 | 99 | 101 | 103 | 111 | 119 | 123 | 127 | 131 | 132 | 133 | 134 | -------------------------------------------------------------------------------- /icons/ibus-hangul.inkscape.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | 26 | 28 | 32 | 36 | 37 | 39 | 43 | 47 | 48 | 50 | 54 | 58 | 59 | 66 | 70 | 71 | 81 | 91 | 101 | 102 | 126 | 129 | 130 | 132 | 133 | 135 | image/svg+xml 136 | 138 | 139 | 140 | 141 | 145 | 147 | 157 | 167 | 173 | 179 | 184 | 185 | 186 | 187 | -------------------------------------------------------------------------------- /tests/ibus-hangul.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include "ibus.h" 4 | #include "engine.h" 5 | 6 | #define GREEN "\033[0;32m" 7 | #define RED "\033[0;31m" 8 | #define NC "\033[0m" 9 | 10 | typedef struct { 11 | const gchar * input; 12 | const gchar * output; 13 | }TestCase; 14 | 15 | IBusBus *m_bus; 16 | IBusEngine *m_engine; 17 | gchar *m_srcdir; 18 | 19 | IBusKeymap *keymap = NULL; 20 | 21 | const guint m_switch_hangul[3] = {IBUS_Hangul, 122, 0}; 22 | 23 | const TestCase m_test_cases[] = 24 | { 25 | {"rk ", "가"} 26 | }; 27 | 28 | static gboolean window_focus_in_event_cb (GtkWidget *entry, 29 | GdkEventFocus *event, 30 | gpointer data); 31 | 32 | static guint16 guess_keycode (IBusKeymap *keymap, 33 | guint keyval, 34 | guint32 modifiers) 35 | { 36 | /* The IBusKeymap only have 256 entries here, 37 | Use Brute Force method to get keycode from keyval. */ 38 | guint16 keycode = 0; 39 | for (; keycode < 256; ++keycode) { 40 | if (keyval == ibus_keymap_lookup_keysym (keymap, keycode, modifiers)) 41 | return keycode; 42 | } 43 | return 0; 44 | } 45 | 46 | static IBusEngine * 47 | create_engine_cb (IBusFactory *factory, 48 | const gchar *name, 49 | gpointer data) 50 | { 51 | static int i = 1; 52 | gchar *engine_path = 53 | g_strdup_printf ("/org/freedesktop/IBus/engine/hangultest/%d", 54 | i++); 55 | 56 | m_engine = ibus_engine_new_with_type (IBUS_TYPE_HANGUL_ENGINE, 57 | name, 58 | engine_path, 59 | ibus_bus_get_connection (m_bus)); 60 | g_free (engine_path); 61 | 62 | return m_engine; 63 | } 64 | 65 | static gboolean 66 | register_ibus_engine () 67 | { 68 | IBusFactory *factory; 69 | IBusComponent *component; 70 | IBusEngineDesc *desc; 71 | 72 | m_bus = ibus_bus_new (); 73 | if (!ibus_bus_is_connected (m_bus)) { 74 | g_critical ("ibus-daemon is not running."); 75 | return FALSE; 76 | } 77 | factory = ibus_factory_new (ibus_bus_get_connection (m_bus)); 78 | g_signal_connect (factory, "create-engine", 79 | G_CALLBACK (create_engine_cb), NULL); 80 | 81 | component = ibus_component_new ( 82 | "org.freedesktop.IBus.HangulTest", 83 | "Hangul Engine Test", 84 | "1.5.1", 85 | "GPL", 86 | "Peng Huang ", 87 | "https://github.com/ibus/ibus/wiki", 88 | "", 89 | "ibus-hangul"); 90 | desc = ibus_engine_desc_new ( 91 | "hangultest", 92 | "Hangul Test", 93 | "Hangul Test", 94 | "en", 95 | "GPL", 96 | "Peng Huang ", 97 | "ibus-hangul", 98 | "us"); 99 | ibus_component_add_engine (component, desc); 100 | ibus_bus_register_component (m_bus, component); 101 | 102 | return TRUE; 103 | } 104 | 105 | static gboolean 106 | finit (gpointer data) 107 | { 108 | g_test_incomplete ("time out"); 109 | gtk_main_quit (); 110 | return FALSE; 111 | } 112 | 113 | static void 114 | set_engine_cb (GObject *object, GAsyncResult *res, gpointer data) 115 | { 116 | IBusBus *bus = IBUS_BUS (object); 117 | GtkWidget *entry = GTK_WIDGET (data); 118 | GError *error = NULL; 119 | gint i; 120 | const gchar *p = NULL; 121 | 122 | if (!ibus_bus_set_global_engine_async_finish (bus, res, &error)) { 123 | gchar *msg = g_strdup_printf ("set engine failed: %s", error->message); 124 | g_test_incomplete (msg); 125 | g_free (msg); 126 | g_error_free (error); 127 | return; 128 | } 129 | 130 | { 131 | /* Switch hangul mode. */ 132 | guint keyval = m_switch_hangul[0]; 133 | guint keycode = m_switch_hangul[1]; 134 | guint modifiers = m_switch_hangul[2]; 135 | gboolean retval; 136 | 137 | if (keyval == 0) { 138 | g_test_incomplete ("ibus-hangul switch key is not set correctly."); 139 | return; 140 | } 141 | g_signal_emit_by_name (m_engine, "process-key-event", 142 | keyval, keycode, modifiers, &retval); 143 | modifiers |= IBUS_RELEASE_MASK; 144 | sleep(1); 145 | g_signal_emit_by_name (m_engine, "process-key-event", 146 | keyval, keycode, modifiers, &retval); 147 | } 148 | 149 | { 150 | /* Run test cases */ 151 | for (i = 0; 152 | i < G_N_ELEMENTS(m_test_cases); 153 | i++) { 154 | for (p = m_test_cases[i].input; *p; p++) { 155 | gboolean retval; 156 | guint keyval = *p; 157 | guint modifiers = 0; 158 | guint keycode = guess_keycode (keymap, keyval, modifiers); 159 | 160 | if (keyval == 0) 161 | break; 162 | g_signal_emit_by_name (m_engine, "process-key-event", 163 | keyval, keycode, modifiers, &retval); 164 | modifiers |= IBUS_RELEASE_MASK; 165 | sleep(1); 166 | g_signal_emit_by_name (m_engine, "process-key-event", 167 | keyval, keycode, modifiers, &retval); 168 | } 169 | } 170 | } 171 | 172 | g_signal_handlers_disconnect_by_func (entry, 173 | G_CALLBACK (window_focus_in_event_cb), 174 | NULL); 175 | g_timeout_add_seconds (10, finit, NULL); 176 | } 177 | 178 | static gboolean 179 | window_focus_in_event_cb (GtkWidget *entry, GdkEventFocus *event, gpointer data) 180 | { 181 | g_assert (m_bus != NULL); 182 | ibus_bus_set_global_engine_async (m_bus, 183 | "hangultest", 184 | -1, 185 | NULL, 186 | set_engine_cb, 187 | entry); 188 | return FALSE; 189 | } 190 | 191 | static void 192 | window_inserted_text_cb (GtkEntryBuffer *buffer, 193 | guint position, 194 | const gchar *chars, 195 | guint nchars, 196 | gpointer data) 197 | { 198 | /* https://gitlab.gnome.org/GNOME/gtk/commit/9981f46e0b 199 | * The latest GTK does not emit "inserted-text" when the text is "". 200 | */ 201 | #if !GTK_CHECK_VERSION (3, 22, 16) 202 | static int n_loop = 0; 203 | #endif 204 | static guint index = 0; 205 | gunichar code = g_utf8_get_char (chars); 206 | const gchar *test; 207 | GtkEntry *entry = GTK_ENTRY (data); 208 | 209 | (void)code; 210 | 211 | #if !GTK_CHECK_VERSION (3, 22, 16) 212 | if (n_loop % 2 == 1) { 213 | n_loop = 0; 214 | return; 215 | } 216 | #endif 217 | 218 | { 219 | /* Run test case */ 220 | const gchar *p = chars; 221 | const gchar *output = m_test_cases[index].output; 222 | gboolean valid_output = TRUE; 223 | 224 | if (0 != g_strcmp0 (p, output)) 225 | valid_output = FALSE; 226 | index++; 227 | 228 | if (valid_output) { 229 | test = GREEN "PASS" NC; 230 | } else { 231 | test = RED "FAIL" NC; 232 | g_test_fail (); 233 | } 234 | g_print ("%05d %s expected: %s typed: %s\n", 235 | index, test, output, p); 236 | } 237 | 238 | if (index == G_N_ELEMENTS(m_test_cases)) { 239 | gtk_main_quit (); 240 | return; 241 | } 242 | 243 | #if !GTK_CHECK_VERSION (3, 22, 16) 244 | n_loop++; 245 | #endif 246 | gtk_entry_set_text (entry, ""); 247 | } 248 | 249 | static void 250 | create_window () 251 | { 252 | GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); 253 | GtkWidget *entry = gtk_entry_new (); 254 | GtkEntryBuffer *buffer; 255 | 256 | g_signal_connect (window, "destroy", 257 | G_CALLBACK (gtk_main_quit), NULL); 258 | g_signal_connect (entry, "focus-in-event", 259 | G_CALLBACK (window_focus_in_event_cb), NULL); 260 | buffer = gtk_entry_get_buffer (GTK_ENTRY (entry)); 261 | g_signal_connect (buffer, "inserted-text", 262 | G_CALLBACK (window_inserted_text_cb), entry); 263 | gtk_container_add (GTK_CONTAINER (window), entry); 264 | gtk_widget_show_all (window); 265 | } 266 | 267 | static void 268 | test_hangul (void) 269 | { 270 | GLogLevelFlags flags; 271 | if (!register_ibus_engine ()) { 272 | g_test_fail (); 273 | return; 274 | } 275 | 276 | ibus_hangul_init (m_bus); 277 | 278 | create_window (); 279 | /* FIXME: 280 | * IBusIMContext opens GtkIMContextSimple as the slave and 281 | * GtkIMContextSimple opens the compose table on el_GR.UTF-8, and the 282 | * multiple outputs in el_GR's compose causes a warning in gtkcomposetable 283 | * and the warning always causes a fatal in GTest: 284 | " "GTK+ supports to output one char only: " 285 | */ 286 | flags = g_log_set_always_fatal (G_LOG_LEVEL_CRITICAL); 287 | gtk_main (); 288 | g_log_set_always_fatal (flags); 289 | } 290 | 291 | int 292 | main (int argc, char *argv[]) 293 | { 294 | const gchar *test_name; 295 | gchar *test_path; 296 | 297 | /* Run test cases with X Window. */ 298 | g_setenv ("GDK_BACKEND", "x11", TRUE); 299 | 300 | ibus_init (); 301 | /* Avoid a warning of "AT-SPI: Could not obtain desktop path or name" 302 | * with gtk_main(). 303 | */ 304 | g_setenv ("NO_AT_BRIDGE", "1", TRUE); 305 | g_test_init (&argc, &argv, NULL); 306 | gtk_init (&argc, &argv); 307 | 308 | m_srcdir = argc > 1 ? g_strdup (argv[1]) : g_strdup ("."); 309 | 310 | #if GLIB_CHECK_VERSION (2, 58, 0) 311 | test_name = g_get_language_names_with_category ("LC_CTYPE")[0]; 312 | #else 313 | test_name = g_getenv ("LANG"); 314 | #endif 315 | 316 | test_path = g_build_filename ("/ibus-hangul", test_name, NULL); 317 | g_test_add_func (test_path, test_hangul); 318 | g_free (test_path); 319 | 320 | keymap = ibus_keymap_get("us"); 321 | 322 | return g_test_run (); 323 | } 324 | -------------------------------------------------------------------------------- /data/symbol.txt: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2005,2006 Choe Hwanjin 2 | # All rights reserved. 3 | # 4 | # Redistribution and use in source and binary forms, with or without 5 | # modification, are permitted provided that the following conditions are met: 6 | # 7 | # 1. Redistributions of source code must retain the above copyright notice, 8 | # this list of conditions and the following disclaimer. 9 | # 2. Redistributions in binary form must reproduce the above copyright notice, 10 | # this list of conditions and the following disclaimer in the documentation 11 | # and/or other materials provided with the distribution. 12 | # 3. Neither the name of the author nor the names of its contributors 13 | # may be used to endorse or promote products derived from this software 14 | # without specific prior written permission. 15 | # 16 | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 | # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 | # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 | # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 20 | # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 | # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 | # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 | # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 | # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 | # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 | # POSSIBILITY OF SUCH DAMAGE. 27 | 28 | ㄱ: : 29 | ㄱ:!: 30 | ㄱ:': 31 | ㄱ:,: 32 | ㄱ:.: 33 | ㄱ:/: 34 | ㄱ::: 35 | ㄱ:;: 36 | ㄱ:?: 37 | ㄱ:^: 38 | ㄱ:_: 39 | ㄱ:`: 40 | ㄱ:|: 41 | ㄱ: ̄: 42 | ㄱ:、: 43 | ㄱ:。: 44 | ㄱ:·: 45 | ㄱ:‥: 46 | ㄱ:…: 47 | ㄱ:¨: 48 | ㄱ:〃: 49 | ㄱ:­: 50 | ㄱ:―: 51 | ㄱ:∥: 52 | ㄱ:\: 53 | ㄱ:∼: 54 | ㄱ:´: 55 | ㄱ:~: 56 | ㄱ:ˇ: 57 | ㄱ:˘: 58 | ㄱ:˝: 59 | ㄱ:˚: 60 | ㄱ:˙: 61 | ㄱ:¸: 62 | ㄱ:˛: 63 | ㄱ:¡: 64 | ㄱ:¿: 65 | ㄱ:ː: 66 | ㄲ:Æ: 67 | ㄲ:Ð: 68 | ㄲ:Ħ: 69 | ㄲ:IJ: 70 | ㄲ:Ŀ: 71 | ㄲ:Ł: 72 | ㄲ:Ø: 73 | ㄲ:Œ: 74 | ㄲ:Þ: 75 | ㄲ:Ŧ: 76 | ㄲ:Ŋ: 77 | ㄲ:æ: 78 | ㄲ:đ: 79 | ㄲ:ð: 80 | ㄲ:ħ: 81 | ㄲ:ı: 82 | ㄲ:ij: 83 | ㄲ:ĸ: 84 | ㄲ:ŀ: 85 | ㄲ:ł: 86 | ㄲ:ø: 87 | ㄲ:œ: 88 | ㄲ:ß: 89 | ㄲ:þ: 90 | ㄲ:ŧ: 91 | ㄲ:ŋ: 92 | ㄲ:ʼn: 93 | ㄴ:": 94 | ㄴ:(: 95 | ㄴ:): 96 | ㄴ:[: 97 | ㄴ:]: 98 | ㄴ:{: 99 | ㄴ:}: 100 | ㄴ:‘: 101 | ㄴ:’: 102 | ㄴ:“: 103 | ㄴ:”: 104 | ㄴ:〔: 105 | ㄴ:〕: 106 | ㄴ:〈: 107 | ㄴ:〉: 108 | ㄴ:《: 109 | ㄴ:》: 110 | ㄴ:「: 111 | ㄴ:」: 112 | ㄴ:『: 113 | ㄴ:』: 114 | ㄴ:【: 115 | ㄴ:】: 116 | ㄷ:+: 117 | ㄷ:-: 118 | ㄷ:<: 119 | ㄷ:=: 120 | ㄷ:>: 121 | ㄷ:±: 122 | ㄷ:×: 123 | ㄷ:÷: 124 | ㄷ:≠: 125 | ㄷ:≤: 126 | ㄷ:≥: 127 | ㄷ:∞: 128 | ㄷ:∴: 129 | ㄷ:♂: 130 | ㄷ:♀: 131 | ㄷ:∠: 132 | ㄷ:⊥: 133 | ㄷ:⌒: 134 | ㄷ:∂: 135 | ㄷ:∇: 136 | ㄷ:≡: 137 | ㄷ:≒: 138 | ㄷ:≪: 139 | ㄷ:≫: 140 | ㄷ:√: 141 | ㄷ:∽: 142 | ㄷ:∝: 143 | ㄷ:∵: 144 | ㄷ:∫: 145 | ㄷ:∬: 146 | ㄷ:∈: 147 | ㄷ:∋: 148 | ㄷ:⊆: 149 | ㄷ:⊇: 150 | ㄷ:⊂: 151 | ㄷ:⊃: 152 | ㄷ:∪: 153 | ㄷ:∩: 154 | ㄷ:∧: 155 | ㄷ:∨: 156 | ㄷ:¬: 157 | ㄷ:⇒: 158 | ㄷ:⇔: 159 | ㄷ:∀: 160 | ㄷ:∃: 161 | ㄷ:∮: 162 | ㄷ:∑: 163 | ㄷ:∏: 164 | ㄸ:ぁ: 165 | ㄸ:あ: 166 | ㄸ:ぃ: 167 | ㄸ:い: 168 | ㄸ:ぅ: 169 | ㄸ:う: 170 | ㄸ:ぇ: 171 | ㄸ:え: 172 | ㄸ:ぉ: 173 | ㄸ:お: 174 | ㄸ:か: 175 | ㄸ:が: 176 | ㄸ:き: 177 | ㄸ:ぎ: 178 | ㄸ:く: 179 | ㄸ:ぐ: 180 | ㄸ:け: 181 | ㄸ:げ: 182 | ㄸ:こ: 183 | ㄸ:ご: 184 | ㄸ:さ: 185 | ㄸ:ざ: 186 | ㄸ:し: 187 | ㄸ:じ: 188 | ㄸ:す: 189 | ㄸ:ず: 190 | ㄸ:せ: 191 | ㄸ:ぜ: 192 | ㄸ:そ: 193 | ㄸ:ぞ: 194 | ㄸ:た: 195 | ㄸ:だ: 196 | ㄸ:ち: 197 | ㄸ:ぢ: 198 | ㄸ:っ: 199 | ㄸ:つ: 200 | ㄸ:づ: 201 | ㄸ:て: 202 | ㄸ:で: 203 | ㄸ:と: 204 | ㄸ:ど: 205 | ㄸ:な: 206 | ㄸ:に: 207 | ㄸ:ぬ: 208 | ㄸ:ね: 209 | ㄸ:の: 210 | ㄸ:は: 211 | ㄸ:ば: 212 | ㄸ:ぱ: 213 | ㄸ:ひ: 214 | ㄸ:び: 215 | ㄸ:ぴ: 216 | ㄸ:ふ: 217 | ㄸ:ぶ: 218 | ㄸ:ぷ: 219 | ㄸ:へ: 220 | ㄸ:べ: 221 | ㄸ:ぺ: 222 | ㄸ:ほ: 223 | ㄸ:ぼ: 224 | ㄸ:ぽ: 225 | ㄸ:ま: 226 | ㄸ:み: 227 | ㄸ:む: 228 | ㄸ:め: 229 | ㄸ:も: 230 | ㄸ:ゃ: 231 | ㄸ:や: 232 | ㄸ:ゅ: 233 | ㄸ:ゆ: 234 | ㄸ:ょ: 235 | ㄸ:よ: 236 | ㄸ:ら: 237 | ㄸ:り: 238 | ㄸ:る: 239 | ㄸ:れ: 240 | ㄸ:ろ: 241 | ㄸ:ゎ: 242 | ㄸ:わ: 243 | ㄸ:ゐ: 244 | ㄸ:ゑ: 245 | ㄸ:を: 246 | ㄸ:ん: 247 | ㄹ:$: 248 | ㄹ:%: 249 | ㄹ:₩: 250 | ㄹ:F: 251 | ㄹ:′: 252 | ㄹ:″: 253 | ㄹ:℃: 254 | ㄹ:Å: 255 | ㄹ:¢: 256 | ㄹ:£: 257 | ㄹ:¥: 258 | ㄹ:¤: 259 | ㄹ:℉: 260 | ㄹ:‰: 261 | ㄹ:€: 262 | ㄹ:㎕: 263 | ㄹ:㎖: 264 | ㄹ:㎗: 265 | ㄹ:ℓ: 266 | ㄹ:㎘: 267 | ㄹ:㏄: 268 | ㄹ:㎣: 269 | ㄹ:㎤: 270 | ㄹ:㎥: 271 | ㄹ:㎦: 272 | ㄹ:㎙: 273 | ㄹ:㎚: 274 | ㄹ:㎛: 275 | ㄹ:㎜: 276 | ㄹ:㎝: 277 | ㄹ:㎞: 278 | ㄹ:㎟: 279 | ㄹ:㎠: 280 | ㄹ:㎡: 281 | ㄹ:㎢: 282 | ㄹ:㏊: 283 | ㄹ:㎍: 284 | ㄹ:㎎: 285 | ㄹ:㎏: 286 | ㄹ:㏏: 287 | ㄹ:㎈: 288 | ㄹ:㎉: 289 | ㄹ:㏈: 290 | ㄹ:㎧: 291 | ㄹ:㎨: 292 | ㄹ:㎰: 293 | ㄹ:㎱: 294 | ㄹ:㎲: 295 | ㄹ:㎳: 296 | ㄹ:㎴: 297 | ㄹ:㎵: 298 | ㄹ:㎶: 299 | ㄹ:㎷: 300 | ㄹ:㎸: 301 | ㄹ:㎹: 302 | ㄹ:㎀: 303 | ㄹ:㎁: 304 | ㄹ:㎂: 305 | ㄹ:㎃: 306 | ㄹ:㎄: 307 | ㄹ:㎺: 308 | ㄹ:㎻: 309 | ㄹ:㎼: 310 | ㄹ:㎽: 311 | ㄹ:㎾: 312 | ㄹ:㎿: 313 | ㄹ:㎐: 314 | ㄹ:㎑: 315 | ㄹ:㎒: 316 | ㄹ:㎓: 317 | ㄹ:㎔: 318 | ㄹ:Ω: 319 | ㄹ:㏀: 320 | ㄹ:㏁: 321 | ㄹ:㎊: 322 | ㄹ:㎋: 323 | ㄹ:㎌: 324 | ㄹ:㏖: 325 | ㄹ:㏅: 326 | ㄹ:㎭: 327 | ㄹ:㎮: 328 | ㄹ:㎯: 329 | ㄹ:㏛: 330 | ㄹ:㎩: 331 | ㄹ:㎪: 332 | ㄹ:㎫: 333 | ㄹ:㎬: 334 | ㄹ:㏝: 335 | ㄹ:㏐: 336 | ㄹ:㏓: 337 | ㄹ:㏃: 338 | ㄹ:㏉: 339 | ㄹ:㏜: 340 | ㄹ:㏆: 341 | ㅁ:#: 342 | ㅁ:&: 343 | ㅁ:*: 344 | ㅁ:@: 345 | ㅁ:§: 346 | ㅁ:※: 347 | ㅁ:☆: 348 | ㅁ:★: 349 | ㅁ:○: 350 | ㅁ:●: 351 | ㅁ:◎: 352 | ㅁ:◇: 353 | ㅁ:◆: 354 | ㅁ:□: 355 | ㅁ:■: 356 | ㅁ:△: 357 | ㅁ:▲: 358 | ㅁ:▽: 359 | ㅁ:▼: 360 | ㅁ:→: 361 | ㅁ:←: 362 | ㅁ:↑: 363 | ㅁ:↓: 364 | ㅁ:↔: 365 | ㅁ:〓: 366 | ㅁ:◁: 367 | ㅁ:◀: 368 | ㅁ:▷: 369 | ㅁ:▶: 370 | ㅁ:♤: 371 | ㅁ:♠: 372 | ㅁ:♡: 373 | ㅁ:♥: 374 | ㅁ:♧: 375 | ㅁ:♣: 376 | ㅁ:⊙: 377 | ㅁ:◈: 378 | ㅁ:▣: 379 | ㅁ:◐: 380 | ㅁ:◑: 381 | ㅁ:▒: 382 | ㅁ:▤: 383 | ㅁ:▥: 384 | ㅁ:▨: 385 | ㅁ:▧: 386 | ㅁ:▦: 387 | ㅁ:▩: 388 | ㅁ:♨: 389 | ㅁ:☏: 390 | ㅁ:☎: 391 | ㅁ:☜: 392 | ㅁ:☞: 393 | ㅁ:¶: 394 | ㅁ:†: 395 | ㅁ:‡: 396 | ㅁ:↕: 397 | ㅁ:↗: 398 | ㅁ:↙: 399 | ㅁ:↖: 400 | ㅁ:↘: 401 | ㅁ:♭: 402 | ㅁ:♩: 403 | ㅁ:♪: 404 | ㅁ:♬: 405 | ㅁ:㉿: 406 | ㅁ:㈜: 407 | ㅁ:№: 408 | ㅁ:㏇: 409 | ㅁ:™: 410 | ㅁ:㏂: 411 | ㅁ:㏘: 412 | ㅁ:℡: 413 | ㅁ:®: 414 | ㅁ:ª: 415 | ㅁ:º: 416 | ㅂ:─: 417 | ㅂ:│: 418 | ㅂ:┌: 419 | ㅂ:┐: 420 | ㅂ:┘: 421 | ㅂ:└: 422 | ㅂ:├: 423 | ㅂ:┬: 424 | ㅂ:┤: 425 | ㅂ:┴: 426 | ㅂ:┼: 427 | ㅂ:━: 428 | ㅂ:┃: 429 | ㅂ:┏: 430 | ㅂ:┓: 431 | ㅂ:┛: 432 | ㅂ:┗: 433 | ㅂ:┣: 434 | ㅂ:┳: 435 | ㅂ:┫: 436 | ㅂ:┻: 437 | ㅂ:╋: 438 | ㅂ:┠: 439 | ㅂ:┯: 440 | ㅂ:┨: 441 | ㅂ:┷: 442 | ㅂ:┿: 443 | ㅂ:┝: 444 | ㅂ:┰: 445 | ㅂ:┥: 446 | ㅂ:┸: 447 | ㅂ:╂: 448 | ㅂ:┒: 449 | ㅂ:┑: 450 | ㅂ:┚: 451 | ㅂ:┙: 452 | ㅂ:┖: 453 | ㅂ:┕: 454 | ㅂ:┎: 455 | ㅂ:┍: 456 | ㅂ:┞: 457 | ㅂ:┟: 458 | ㅂ:┡: 459 | ㅂ:┢: 460 | ㅂ:┦: 461 | ㅂ:┧: 462 | ㅂ:┩: 463 | ㅂ:┪: 464 | ㅂ:┭: 465 | ㅂ:┮: 466 | ㅂ:┱: 467 | ㅂ:┲: 468 | ㅂ:┵: 469 | ㅂ:┶: 470 | ㅂ:┹: 471 | ㅂ:┺: 472 | ㅂ:┽: 473 | ㅂ:┾: 474 | ㅂ:╀: 475 | ㅂ:╁: 476 | ㅂ:╃: 477 | ㅂ:╄: 478 | ㅂ:╅: 479 | ㅂ:╆: 480 | ㅂ:╇: 481 | ㅂ:╈: 482 | ㅂ:╉: 483 | ㅂ:╊: 484 | ㅃ:ァ: 485 | ㅃ:ア: 486 | ㅃ:ィ: 487 | ㅃ:イ: 488 | ㅃ:ゥ: 489 | ㅃ:ウ: 490 | ㅃ:ェ: 491 | ㅃ:エ: 492 | ㅃ:ォ: 493 | ㅃ:オ: 494 | ㅃ:カ: 495 | ㅃ:ガ: 496 | ㅃ:キ: 497 | ㅃ:ギ: 498 | ㅃ:ク: 499 | ㅃ:グ: 500 | ㅃ:ケ: 501 | ㅃ:ゲ: 502 | ㅃ:コ: 503 | ㅃ:ゴ: 504 | ㅃ:サ: 505 | ㅃ:ザ: 506 | ㅃ:シ: 507 | ㅃ:ジ: 508 | ㅃ:ス: 509 | ㅃ:ズ: 510 | ㅃ:セ: 511 | ㅃ:ゼ: 512 | ㅃ:ソ: 513 | ㅃ:ゾ: 514 | ㅃ:タ: 515 | ㅃ:ダ: 516 | ㅃ:チ: 517 | ㅃ:ヂ: 518 | ㅃ:ッ: 519 | ㅃ:ツ: 520 | ㅃ:ヅ: 521 | ㅃ:テ: 522 | ㅃ:デ: 523 | ㅃ:ト: 524 | ㅃ:ド: 525 | ㅃ:ナ: 526 | ㅃ:ニ: 527 | ㅃ:ヌ: 528 | ㅃ:ネ: 529 | ㅃ:ノ: 530 | ㅃ:ハ: 531 | ㅃ:バ: 532 | ㅃ:パ: 533 | ㅃ:ヒ: 534 | ㅃ:ビ: 535 | ㅃ:ピ: 536 | ㅃ:フ: 537 | ㅃ:ブ: 538 | ㅃ:プ: 539 | ㅃ:ヘ: 540 | ㅃ:ベ: 541 | ㅃ:ペ: 542 | ㅃ:ホ: 543 | ㅃ:ボ: 544 | ㅃ:ポ: 545 | ㅃ:マ: 546 | ㅃ:ミ: 547 | ㅃ:ム: 548 | ㅃ:メ: 549 | ㅃ:モ: 550 | ㅃ:ャ: 551 | ㅃ:ヤ: 552 | ㅃ:ュ: 553 | ㅃ:ユ: 554 | ㅃ:ョ: 555 | ㅃ:ヨ: 556 | ㅃ:ラ: 557 | ㅃ:リ: 558 | ㅃ:ル: 559 | ㅃ:レ: 560 | ㅃ:ロ: 561 | ㅃ:ヮ: 562 | ㅃ:ワ: 563 | ㅃ:ヰ: 564 | ㅃ:ヱ: 565 | ㅃ:ヲ: 566 | ㅃ:ン: 567 | ㅃ:ヴ: 568 | ㅃ:ヵ: 569 | ㅃ:ヶ: 570 | ㅅ:㉠: 571 | ㅅ:㉡: 572 | ㅅ:㉢: 573 | ㅅ:㉣: 574 | ㅅ:㉤: 575 | ㅅ:㉥: 576 | ㅅ:㉦: 577 | ㅅ:㉧: 578 | ㅅ:㉨: 579 | ㅅ:㉩: 580 | ㅅ:㉪: 581 | ㅅ:㉫: 582 | ㅅ:㉬: 583 | ㅅ:㉭: 584 | ㅅ:㉮: 585 | ㅅ:㉯: 586 | ㅅ:㉰: 587 | ㅅ:㉱: 588 | ㅅ:㉲: 589 | ㅅ:㉳: 590 | ㅅ:㉴: 591 | ㅅ:㉵: 592 | ㅅ:㉶: 593 | ㅅ:㉷: 594 | ㅅ:㉸: 595 | ㅅ:㉹: 596 | ㅅ:㉺: 597 | ㅅ:㉻: 598 | ㅅ:㈀: 599 | ㅅ:㈁: 600 | ㅅ:㈂: 601 | ㅅ:㈃: 602 | ㅅ:㈄: 603 | ㅅ:㈅: 604 | ㅅ:㈆: 605 | ㅅ:㈇: 606 | ㅅ:㈈: 607 | ㅅ:㈉: 608 | ㅅ:㈊: 609 | ㅅ:㈋: 610 | ㅅ:㈌: 611 | ㅅ:㈍: 612 | ㅅ:㈎: 613 | ㅅ:㈏: 614 | ㅅ:㈐: 615 | ㅅ:㈑: 616 | ㅅ:㈒: 617 | ㅅ:㈓: 618 | ㅅ:㈔: 619 | ㅅ:㈕: 620 | ㅅ:㈖: 621 | ㅅ:㈗: 622 | ㅅ:㈘: 623 | ㅅ:㈙: 624 | ㅅ:㈚: 625 | ㅅ:㈛: 626 | ㅆ:А: 627 | ㅆ:Б: 628 | ㅆ:В: 629 | ㅆ:Г: 630 | ㅆ:Д: 631 | ㅆ:Е: 632 | ㅆ:Ё: 633 | ㅆ:Ж: 634 | ㅆ:З: 635 | ㅆ:И: 636 | ㅆ:Й: 637 | ㅆ:К: 638 | ㅆ:Л: 639 | ㅆ:М: 640 | ㅆ:Н: 641 | ㅆ:О: 642 | ㅆ:П: 643 | ㅆ:Р: 644 | ㅆ:С: 645 | ㅆ:Т: 646 | ㅆ:У: 647 | ㅆ:Ф: 648 | ㅆ:Х: 649 | ㅆ:Ц: 650 | ㅆ:Ч: 651 | ㅆ:Ш: 652 | ㅆ:Щ: 653 | ㅆ:Ъ: 654 | ㅆ:Ы: 655 | ㅆ:Ь: 656 | ㅆ:Э: 657 | ㅆ:Ю: 658 | ㅆ:Я: 659 | ㅆ:а: 660 | ㅆ:б: 661 | ㅆ:в: 662 | ㅆ:г: 663 | ㅆ:д: 664 | ㅆ:е: 665 | ㅆ:ё: 666 | ㅆ:ж: 667 | ㅆ:з: 668 | ㅆ:и: 669 | ㅆ:й: 670 | ㅆ:к: 671 | ㅆ:л: 672 | ㅆ:м: 673 | ㅆ:н: 674 | ㅆ:о: 675 | ㅆ:п: 676 | ㅆ:р: 677 | ㅆ:с: 678 | ㅆ:т: 679 | ㅆ:у: 680 | ㅆ:ф: 681 | ㅆ:х: 682 | ㅆ:ц: 683 | ㅆ:ч: 684 | ㅆ:ш: 685 | ㅆ:щ: 686 | ㅆ:ъ: 687 | ㅆ:ы: 688 | ㅆ:ь: 689 | ㅆ:э: 690 | ㅆ:ю: 691 | ㅆ:я: 692 | ㅇ:ⓐ: 693 | ㅇ:ⓑ: 694 | ㅇ:ⓒ: 695 | ㅇ:ⓓ: 696 | ㅇ:ⓔ: 697 | ㅇ:ⓕ: 698 | ㅇ:ⓖ: 699 | ㅇ:ⓗ: 700 | ㅇ:ⓘ: 701 | ㅇ:ⓙ: 702 | ㅇ:ⓚ: 703 | ㅇ:ⓛ: 704 | ㅇ:ⓜ: 705 | ㅇ:ⓝ: 706 | ㅇ:ⓞ: 707 | ㅇ:ⓟ: 708 | ㅇ:ⓠ: 709 | ㅇ:ⓡ: 710 | ㅇ:ⓢ: 711 | ㅇ:ⓣ: 712 | ㅇ:ⓤ: 713 | ㅇ:ⓥ: 714 | ㅇ:ⓦ: 715 | ㅇ:ⓧ: 716 | ㅇ:ⓨ: 717 | ㅇ:ⓩ: 718 | ㅇ:①: 719 | ㅇ:②: 720 | ㅇ:③: 721 | ㅇ:④: 722 | ㅇ:⑤: 723 | ㅇ:⑥: 724 | ㅇ:⑦: 725 | ㅇ:⑧: 726 | ㅇ:⑨: 727 | ㅇ:⑩: 728 | ㅇ:⑪: 729 | ㅇ:⑫: 730 | ㅇ:⑬: 731 | ㅇ:⑭: 732 | ㅇ:⑮: 733 | ㅇ:⒜: 734 | ㅇ:⒝: 735 | ㅇ:⒞: 736 | ㅇ:⒟: 737 | ㅇ:⒠: 738 | ㅇ:⒡: 739 | ㅇ:⒢: 740 | ㅇ:⒣: 741 | ㅇ:⒤: 742 | ㅇ:⒥: 743 | ㅇ:⒦: 744 | ㅇ:⒧: 745 | ㅇ:⒨: 746 | ㅇ:⒩: 747 | ㅇ:⒪: 748 | ㅇ:⒫: 749 | ㅇ:⒬: 750 | ㅇ:⒭: 751 | ㅇ:⒮: 752 | ㅇ:⒯: 753 | ㅇ:⒰: 754 | ㅇ:⒱: 755 | ㅇ:⒲: 756 | ㅇ:⒳: 757 | ㅇ:⒴: 758 | ㅇ:⒵: 759 | ㅇ:⑴: 760 | ㅇ:⑵: 761 | ㅇ:⑶: 762 | ㅇ:⑷: 763 | ㅇ:⑸: 764 | ㅇ:⑹: 765 | ㅇ:⑺: 766 | ㅇ:⑻: 767 | ㅇ:⑼: 768 | ㅇ:⑽: 769 | ㅇ:⑾: 770 | ㅇ:⑿: 771 | ㅇ:⒀: 772 | ㅇ:⒁: 773 | ㅇ:⒂: 774 | ㅈ:0: 775 | ㅈ:1: 776 | ㅈ:2: 777 | ㅈ:3: 778 | ㅈ:4: 779 | ㅈ:5: 780 | ㅈ:6: 781 | ㅈ:7: 782 | ㅈ:8: 783 | ㅈ:9: 784 | ㅈ:ⅰ: 785 | ㅈ:ⅱ: 786 | ㅈ:ⅲ: 787 | ㅈ:ⅳ: 788 | ㅈ:ⅴ: 789 | ㅈ:ⅵ: 790 | ㅈ:ⅶ: 791 | ㅈ:ⅷ: 792 | ㅈ:ⅸ: 793 | ㅈ:ⅹ: 794 | ㅈ:Ⅰ: 795 | ㅈ:Ⅱ: 796 | ㅈ:Ⅲ: 797 | ㅈ:Ⅳ: 798 | ㅈ:Ⅴ: 799 | ㅈ:Ⅵ: 800 | ㅈ:Ⅶ: 801 | ㅈ:Ⅷ: 802 | ㅈ:Ⅸ: 803 | ㅈ:Ⅹ: 804 | ㅊ:½: 805 | ㅊ:⅓: 806 | ㅊ:⅔: 807 | ㅊ:¼: 808 | ㅊ:¾: 809 | ㅊ:⅛: 810 | ㅊ:⅜: 811 | ㅊ:⅝: 812 | ㅊ:⅞: 813 | ㅊ:¹: 814 | ㅊ:²: 815 | ㅊ:³: 816 | ㅊ:⁴: 817 | ㅊ:ⁿ: 818 | ㅊ:₁: 819 | ㅊ:₂: 820 | ㅊ:₃: 821 | ㅊ:₄: 822 | ㅋ:ㄱ: 823 | ㅋ:ㄲ: 824 | ㅋ:ㄳ: 825 | ㅋ:ㄴ: 826 | ㅋ:ㄵ: 827 | ㅋ:ㄶ: 828 | ㅋ:ㄷ: 829 | ㅋ:ㄸ: 830 | ㅋ:ㄹ: 831 | ㅋ:ㄺ: 832 | ㅋ:ㄻ: 833 | ㅋ:ㄼ: 834 | ㅋ:ㄽ: 835 | ㅋ:ㄾ: 836 | ㅋ:ㄿ: 837 | ㅋ:ㅀ: 838 | ㅋ:ㅁ: 839 | ㅋ:ㅂ: 840 | ㅋ:ㅃ: 841 | ㅋ:ㅄ: 842 | ㅋ:ㅅ: 843 | ㅋ:ㅆ: 844 | ㅋ:ㅇ: 845 | ㅋ:ㅈ: 846 | ㅋ:ㅉ: 847 | ㅋ:ㅊ: 848 | ㅋ:ㅋ: 849 | ㅋ:ㅌ: 850 | ㅋ:ㅍ: 851 | ㅋ:ㅎ: 852 | ㅋ:ㅏ: 853 | ㅋ:ㅐ: 854 | ㅋ:ㅑ: 855 | ㅋ:ㅒ: 856 | ㅋ:ㅓ: 857 | ㅋ:ㅔ: 858 | ㅋ:ㅕ: 859 | ㅋ:ㅖ: 860 | ㅋ:ㅗ: 861 | ㅋ:ㅘ: 862 | ㅋ:ㅙ: 863 | ㅋ:ㅚ: 864 | ㅋ:ㅛ: 865 | ㅋ:ㅜ: 866 | ㅋ:ㅝ: 867 | ㅋ:ㅞ: 868 | ㅋ:ㅟ: 869 | ㅋ:ㅠ: 870 | ㅋ:ㅡ: 871 | ㅋ:ㅢ: 872 | ㅋ:ㅣ: 873 | ㅌ:ㅥ: 874 | ㅌ:ㅦ: 875 | ㅌ:ㅧ: 876 | ㅌ:ㅨ: 877 | ㅌ:ㅩ: 878 | ㅌ:ㅪ: 879 | ㅌ:ㅫ: 880 | ㅌ:ㅬ: 881 | ㅌ:ㅭ: 882 | ㅌ:ㅮ: 883 | ㅌ:ㅯ: 884 | ㅌ:ㅰ: 885 | ㅌ:ㅱ: 886 | ㅌ:ㅲ: 887 | ㅌ:ㅳ: 888 | ㅌ:ㅴ: 889 | ㅌ:ㅵ: 890 | ㅌ:ㅶ: 891 | ㅌ:ㅷ: 892 | ㅌ:ㅸ: 893 | ㅌ:ㅹ: 894 | ㅌ:ㅺ: 895 | ㅌ:ㅻ: 896 | ㅌ:ㅼ: 897 | ㅌ:ㅽ: 898 | ㅌ:ㅾ: 899 | ㅌ:ㅿ: 900 | ㅌ:ㆀ: 901 | ㅌ:ㆁ: 902 | ㅌ:ㆂ: 903 | ㅌ:ㆃ: 904 | ㅌ:ㆄ: 905 | ㅌ:ㆅ: 906 | ㅌ:ㆆ: 907 | ㅌ:ㆇ: 908 | ㅌ:ㆈ: 909 | ㅌ:ㆉ: 910 | ㅌ:ㆊ: 911 | ㅌ:ㆋ: 912 | ㅌ:ㆌ: 913 | ㅌ:ㆍ: 914 | ㅌ:ㆎ: 915 | ㅍ:A: 916 | ㅍ:B: 917 | ㅍ:C: 918 | ㅍ:D: 919 | ㅍ:E: 920 | ㅍ:F: 921 | ㅍ:G: 922 | ㅍ:H: 923 | ㅍ:I: 924 | ㅍ:J: 925 | ㅍ:K: 926 | ㅍ:L: 927 | ㅍ:M: 928 | ㅍ:N: 929 | ㅍ:O: 930 | ㅍ:P: 931 | ㅍ:Q: 932 | ㅍ:R: 933 | ㅍ:S: 934 | ㅍ:T: 935 | ㅍ:U: 936 | ㅍ:V: 937 | ㅍ:W: 938 | ㅍ:X: 939 | ㅍ:Y: 940 | ㅍ:Z: 941 | ㅍ:a: 942 | ㅍ:b: 943 | ㅍ:c: 944 | ㅍ:d: 945 | ㅍ:e: 946 | ㅍ:f: 947 | ㅍ:g: 948 | ㅍ:h: 949 | ㅍ:i: 950 | ㅍ:j: 951 | ㅍ:k: 952 | ㅍ:l: 953 | ㅍ:m: 954 | ㅍ:n: 955 | ㅍ:o: 956 | ㅍ:p: 957 | ㅍ:q: 958 | ㅍ:r: 959 | ㅍ:s: 960 | ㅍ:t: 961 | ㅍ:u: 962 | ㅍ:v: 963 | ㅍ:w: 964 | ㅍ:x: 965 | ㅍ:y: 966 | ㅍ:z: 967 | ㅎ:Α: 968 | ㅎ:Β: 969 | ㅎ:Γ: 970 | ㅎ:Δ: 971 | ㅎ:Ε: 972 | ㅎ:Ζ: 973 | ㅎ:Η: 974 | ㅎ:Θ: 975 | ㅎ:Ι: 976 | ㅎ:Κ: 977 | ㅎ:Λ: 978 | ㅎ:Μ: 979 | ㅎ:Ν: 980 | ㅎ:Ξ: 981 | ㅎ:Ο: 982 | ㅎ:Π: 983 | ㅎ:Ρ: 984 | ㅎ:Σ: 985 | ㅎ:Τ: 986 | ㅎ:Υ: 987 | ㅎ:Φ: 988 | ㅎ:Χ: 989 | ㅎ:Ψ: 990 | ㅎ:Ω: 991 | ㅎ:α: 992 | ㅎ:β: 993 | ㅎ:γ: 994 | ㅎ:δ: 995 | ㅎ:ε: 996 | ㅎ:ζ: 997 | ㅎ:η: 998 | ㅎ:θ: 999 | ㅎ:ι: 1000 | ㅎ:κ: 1001 | ㅎ:λ: 1002 | ㅎ:μ: 1003 | ㅎ:ν: 1004 | ㅎ:ξ: 1005 | ㅎ:ο: 1006 | ㅎ:π: 1007 | ㅎ:ρ: 1008 | ㅎ:σ: 1009 | ㅎ:τ: 1010 | ㅎ:υ: 1011 | ㅎ:φ: 1012 | ㅎ:χ: 1013 | ㅎ:ψ: 1014 | ㅎ:ω: 1015 | -------------------------------------------------------------------------------- /setup/main.py: -------------------------------------------------------------------------------- 1 | # vim:set et sts=4 sw=4: 2 | # 3 | # ibus-hangul - The Hangul Engine For IBus 4 | # 5 | # Copyright (c) 2009-2011 Choe Hwanjin 6 | # 7 | # This program is free software; you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation; either version 2 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # This program is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License along 18 | # with this program; if not, write to the Free Software Foundation, Inc., 19 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 20 | 21 | import sys 22 | import os 23 | import gi 24 | from gi.repository import Gio 25 | from gi.repository import GLib 26 | gi.require_version('Gtk', '3.0') 27 | from gi.repository import Gtk 28 | gi.require_version('IBus', '1.0') 29 | from gi.repository import IBus 30 | import locale 31 | import gettext 32 | import config 33 | from keycapturedialog import KeyCaptureDialog 34 | 35 | _ = lambda a : gettext.dgettext(config.gettext_package, a) 36 | 37 | 38 | def get_hangul_keyboard_list(): 39 | from ctypes import CDLL, c_int, c_char_p 40 | libhangul = CDLL('libhangul.so.1') 41 | libhangul.hangul_ic_get_n_keyboards.argtypes = [] 42 | libhangul.hangul_ic_get_n_keyboards.restype = c_int 43 | libhangul.hangul_ic_get_keyboard_id.argtypes = [c_int] 44 | libhangul.hangul_ic_get_keyboard_id.restype = c_char_p 45 | libhangul.hangul_ic_get_keyboard_name.argtypes = [c_int] 46 | libhangul.hangul_ic_get_keyboard_name.restype = c_char_p 47 | 48 | n = libhangul.hangul_ic_get_n_keyboards() 49 | list = [] 50 | for i in range(n): 51 | id = libhangul.hangul_ic_get_keyboard_id(i).decode('UTF-8') 52 | name = libhangul.hangul_ic_get_keyboard_name(i).decode('UTF-8') 53 | list.append((id, name)) 54 | return list 55 | 56 | 57 | class Setup (): 58 | def __init__ (self, bus): 59 | self.__bus = bus 60 | self.__settings = Gio.Settings(schema="org.freedesktop.ibus.engine.hangul") 61 | self.__settings.connect("changed", self.on_value_changed) 62 | 63 | ui_file = os.path.join(os.path.dirname(__file__), "setup.ui") 64 | self.__builder = Gtk.Builder() 65 | self.__builder.set_translation_domain(config.gettext_package) 66 | self.__builder.add_from_file(ui_file) 67 | 68 | # Hangul tab 69 | list = get_hangul_keyboard_list() 70 | 71 | self.__hangul_keyboard = self.__builder.get_object("HangulKeyboard") 72 | model = Gtk.ListStore(str, str, int) 73 | i = 0 74 | for (id, name) in list: 75 | model.append([name, id, i]) 76 | i+=1 77 | 78 | self.__hangul_keyboard.set_model(model) 79 | renderer = Gtk.CellRendererText() 80 | self.__hangul_keyboard.pack_start(renderer, True) 81 | self.__hangul_keyboard.add_attribute(renderer, "text", 0) 82 | 83 | current = self.__read("hangul-keyboard").get_string() 84 | for i in model: 85 | if i[1] == current: 86 | self.__hangul_keyboard.set_active(i[2]) 87 | break 88 | 89 | self.__start_in_hangul_mode = self.__builder.get_object("StartInHangulMode") 90 | initial_input_mode = self.__read("initial-input-mode").get_string() 91 | self.__start_in_hangul_mode.set_active(initial_input_mode == "hangul") 92 | 93 | self.__word_commit = self.__builder.get_object("WordCommit") 94 | word_commit = self.__read("word-commit").get_boolean() 95 | self.__word_commit.set_active(word_commit) 96 | 97 | self.__auto_reorder = self.__builder.get_object("AutoReorder") 98 | auto_reorder = self.__read("auto-reorder").get_boolean() 99 | self.__auto_reorder.set_active(auto_reorder) 100 | 101 | button = self.__builder.get_object("HangulKeyListAddButton") 102 | button.connect("clicked", self.on_hangul_key_add, None) 103 | 104 | button = self.__builder.get_object("HangulKeyListRemoveButton") 105 | button.connect("clicked", self.on_hangul_key_remove, None) 106 | 107 | model = Gtk.ListStore(str) 108 | 109 | keylist_str = self.__read("switch-keys").get_string() 110 | self.__hangul_key_list_str = keylist_str.split(',') 111 | for i in self.__hangul_key_list_str: 112 | model.append([i]) 113 | 114 | self.__hangul_key_list = self.__builder.get_object("HangulKeyList") 115 | self.__hangul_key_list.set_model(model) 116 | column = Gtk.TreeViewColumn() 117 | column.set_title("key") 118 | renderer = Gtk.CellRendererText() 119 | column.pack_start(renderer, True) 120 | column.add_attribute(renderer, "text", 0) 121 | self.__hangul_key_list.append_column(column) 122 | 123 | # hanja tab 124 | button = self.__builder.get_object("HanjaKeyListAddButton") 125 | button.connect("clicked", self.on_hanja_key_add, None) 126 | 127 | button = self.__builder.get_object("HanjaKeyListRemoveButton") 128 | button.connect("clicked", self.on_hanja_key_remove, None) 129 | 130 | model = Gtk.ListStore(str) 131 | 132 | keylist_str = self.__read("hanja-keys").get_string() 133 | self.__hanja_key_list_str = keylist_str.split(',') 134 | for i in self.__hanja_key_list_str: 135 | model.append([i]) 136 | 137 | self.__hanja_key_list = self.__builder.get_object("HanjaKeyList") 138 | self.__hanja_key_list.set_model(model) 139 | column = Gtk.TreeViewColumn() 140 | column.set_title("key") 141 | renderer = Gtk.CellRendererText() 142 | column.pack_start(renderer, True) 143 | column.add_attribute(renderer, "text", 0) 144 | self.__hanja_key_list.append_column(column) 145 | 146 | # advanced tab 147 | notebook = self.__builder.get_object("SetupNotebook") 148 | notebook.remove_page(2) 149 | 150 | # setup dialog 151 | self.__window = self.__builder.get_object("SetupDialog") 152 | icon_file = os.path.join(config.pkgdatadir, "icons", "ibus-hangul.svg") 153 | self.__window.set_icon_from_file(icon_file) 154 | self.__window.connect("destroy", Gtk.main_quit) 155 | self.__window.show() 156 | 157 | button = self.__builder.get_object("button_apply") 158 | button.connect("clicked", self.on_apply, None) 159 | 160 | button = self.__builder.get_object("button_cancel") 161 | button.connect("clicked", self.on_cancel, None) 162 | #button.grap_focus() 163 | 164 | button = self.__builder.get_object("button_ok") 165 | button.connect("clicked", self.on_ok, None) 166 | 167 | def run(self): 168 | Gtk.main() 169 | 170 | def apply(self): 171 | model = self.__hangul_keyboard.get_model() 172 | i = self.__hangul_keyboard.get_active() 173 | self.__write("hangul-keyboard", GLib.Variant.new_string(model[i][1])) 174 | 175 | start_in_hangul_mode = self.__start_in_hangul_mode.get_active() 176 | if start_in_hangul_mode: 177 | self.__write("initial-input-mode", GLib.Variant.new_string("hangul")) 178 | else: 179 | self.__write("initial-input-mode", GLib.Variant.new_string("latin")) 180 | 181 | word_commit = self.__word_commit.get_active() 182 | self.__write("word-commit", GLib.Variant.new_boolean(word_commit)) 183 | 184 | auto_reorder = self.__auto_reorder.get_active() 185 | self.__write("auto-reorder", GLib.Variant.new_boolean(auto_reorder)) 186 | 187 | model = self.__hangul_key_list.get_model() 188 | str = "" 189 | iter = model.get_iter_first() 190 | while iter: 191 | if len(str) > 0: 192 | str += "," 193 | str += model.get_value(iter, 0) 194 | else: 195 | str += model.get_value(iter, 0) 196 | iter = model.iter_next(iter) 197 | self.__write("switch-keys", GLib.Variant.new_string(str)) 198 | 199 | model = self.__hanja_key_list.get_model() 200 | str = "" 201 | iter = model.get_iter_first() 202 | while iter: 203 | if len(str) > 0: 204 | str += "," 205 | str += model.get_value(iter, 0) 206 | else: 207 | str += model.get_value(iter, 0) 208 | iter = model.iter_next(iter) 209 | self.__write("hanja-keys", GLib.Variant.new_string(str)) 210 | 211 | def on_apply(self, widget, data): 212 | self.apply() 213 | 214 | def on_cancel(self, widget, data): 215 | self.__window.destroy() 216 | Gtk.main_quit() 217 | 218 | def on_ok(self, widget, data): 219 | self.apply() 220 | self.__window.destroy() 221 | Gtk.main_quit() 222 | 223 | def on_hangul_key_add(self, widget, data = None): 224 | dialog = KeyCaptureDialog(_("Select Hangul toggle key"), self.__window) 225 | dialog.set_markup(_("Press any key which you want to use as hangul toggle key. " 226 | "The key you pressed is displayed below.\n" 227 | "If you want to use it, click \"Ok\" or click \"Cancel\"")) 228 | res = dialog.run() 229 | if res == Gtk.ResponseType.OK: 230 | key_str = dialog.get_key_string() 231 | if len(key_str) > 0: 232 | model = self.__hangul_key_list.get_model() 233 | iter = model.get_iter_first() 234 | while iter: 235 | str = model.get_value(iter, 0) 236 | if str == key_str: 237 | model.remove(iter) 238 | break 239 | iter = model.iter_next(iter) 240 | 241 | model.append([key_str]) 242 | dialog.destroy() 243 | 244 | def on_hangul_key_remove(self, widget, data = None): 245 | selection = self.__hangul_key_list.get_selection() 246 | (model, iter) = selection.get_selected() 247 | if model and iter: 248 | model.remove(iter) 249 | 250 | def on_hanja_key_add(self, widget, data = None): 251 | dialog = KeyCaptureDialog(_("Select Hanja key"), self.__window) 252 | dialog.set_markup(_("Press any key which you want to use as hanja key. " 253 | "The key you pressed is displayed below.\n" 254 | "If you want to use it, click \"Ok\" or click \"Cancel\"")) 255 | res = dialog.run() 256 | if res == Gtk.ResponseType.OK: 257 | key_str = dialog.get_key_string() 258 | if len(key_str) > 0: 259 | model = self.__hanja_key_list.get_model() 260 | iter = model.get_iter_first() 261 | while iter: 262 | str = model.get_value(iter, 0) 263 | if str == key_str: 264 | model.remove(iter) 265 | break 266 | iter = model.iter_next(iter) 267 | 268 | model.append([key_str]) 269 | dialog.destroy() 270 | 271 | def on_hanja_key_remove(self, widget, data = None): 272 | selection = self.__hanja_key_list.get_selection() 273 | (model, iter) = selection.get_selected() 274 | if model and iter: 275 | model.remove(iter) 276 | 277 | def on_value_changed(self, settings, key): 278 | value = settings.get_value(key) 279 | if key == "hangul-keyboard": 280 | model = self.__hangul_keyboard.get_model() 281 | for i in model: 282 | if i[1] == value.get_string(): 283 | self.__hangul_keyboard.set_active(i[2]) 284 | break 285 | elif key == "switch-keys": 286 | self.__hangul_key_list_str = value.get_string().split(',') 287 | elif key == "hanja-keys": 288 | self.__hanja_key_list_str = value.get_string().split(',') 289 | 290 | def __read(self, key): 291 | return self.__settings.get_value(key) 292 | 293 | def __write(self, key, v): 294 | self.__settings.set_value(key, v) 295 | 296 | if __name__ == "__main__": 297 | locale.bindtextdomain(config.gettext_package, config.localedir) 298 | 299 | GLib.set_prgname("ibus-setup-hangul") 300 | GLib.set_application_name(_("IBusHangul Setup")) 301 | 302 | bus = IBus.Bus() 303 | if bus.is_connected(): 304 | Setup(bus).run() 305 | else: 306 | message = _("IBus daemon is not running.\nHangul engine settings cannot be saved.") 307 | dialog = Gtk.MessageDialog(type = Gtk.MessageType.ERROR, 308 | buttons = Gtk.ButtonsType.CLOSE, 309 | message_format = message) 310 | dialog.run() 311 | sys.exit(1) 312 | -------------------------------------------------------------------------------- /setup/ibus-setup-hangul.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 15 | 17 | 19 | 23 | 27 | 28 | 38 | 47 | 49 | 53 | 57 | 58 | 65 | 68 | 69 | 71 | 75 | 79 | 80 | 82 | 86 | 90 | 91 | 93 | 97 | 101 | 102 | 111 | 120 | 129 | 130 | 132 | 133 | 135 | image/svg+xml 136 | 138 | System Applications 139 | 140 | 141 | Jakub Steiner 142 | 143 | 144 | http://jimmac.musichall.cz/ 145 | 146 | 147 | system 148 | applications 149 | group 150 | category 151 | admin 152 | root 153 | 154 | 155 | 157 | 158 | 160 | 162 | 164 | 166 | 167 | 168 | 169 | 171 | 179 | 180 | 182 | 186 | 190 | 197 | 201 | 205 | 209 | 211 | 219 | 227 | 231 | 235 | 239 | 240 | 241 | 242 | -------------------------------------------------------------------------------- /COPYING: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 2, June 1991 3 | 4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | Preamble 10 | 11 | The licenses for most software are designed to take away your 12 | freedom to share and change it. By contrast, the GNU General Public 13 | License is intended to guarantee your freedom to share and change free 14 | software--to make sure the software is free for all its users. This 15 | General Public License applies to most of the Free Software 16 | Foundation's software and to any other program whose authors commit to 17 | using it. (Some other Free Software Foundation software is covered by 18 | the GNU Lesser General Public License instead.) You can apply it to 19 | your programs, too. 20 | 21 | When we speak of free software, we are referring to freedom, not 22 | price. Our General Public Licenses are designed to make sure that you 23 | have the freedom to distribute copies of free software (and charge for 24 | this service if you wish), that you receive source code or can get it 25 | if you want it, that you can change the software or use pieces of it 26 | in new free programs; and that you know you can do these things. 27 | 28 | To protect your rights, we need to make restrictions that forbid 29 | anyone to deny you these rights or to ask you to surrender the rights. 30 | These restrictions translate to certain responsibilities for you if you 31 | distribute copies of the software, or if you modify it. 32 | 33 | For example, if you distribute copies of such a program, whether 34 | gratis or for a fee, you must give the recipients all the rights that 35 | you have. You must make sure that they, too, receive or can get the 36 | source code. And you must show them these terms so they know their 37 | rights. 38 | 39 | We protect your rights with two steps: (1) copyright the software, and 40 | (2) offer you this license which gives you legal permission to copy, 41 | distribute and/or modify the software. 42 | 43 | Also, for each author's protection and ours, we want to make certain 44 | that everyone understands that there is no warranty for this free 45 | software. If the software is modified by someone else and passed on, we 46 | want its recipients to know that what they have is not the original, so 47 | that any problems introduced by others will not reflect on the original 48 | authors' reputations. 49 | 50 | Finally, any free program is threatened constantly by software 51 | patents. We wish to avoid the danger that redistributors of a free 52 | program will individually obtain patent licenses, in effect making the 53 | program proprietary. To prevent this, we have made it clear that any 54 | patent must be licensed for everyone's free use or not licensed at all. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | GNU GENERAL PUBLIC LICENSE 60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 61 | 62 | 0. This License applies to any program or other work which contains 63 | a notice placed by the copyright holder saying it may be distributed 64 | under the terms of this General Public License. The "Program", below, 65 | refers to any such program or work, and a "work based on the Program" 66 | means either the Program or any derivative work under copyright law: 67 | that is to say, a work containing the Program or a portion of it, 68 | either verbatim or with modifications and/or translated into another 69 | language. (Hereinafter, translation is included without limitation in 70 | the term "modification".) Each licensee is addressed as "you". 71 | 72 | Activities other than copying, distribution and modification are not 73 | covered by this License; they are outside its scope. The act of 74 | running the Program is not restricted, and the output from the Program 75 | is covered only if its contents constitute a work based on the 76 | Program (independent of having been made by running the Program). 77 | Whether that is true depends on what the Program does. 78 | 79 | 1. You may copy and distribute verbatim copies of the Program's 80 | source code as you receive it, in any medium, provided that you 81 | conspicuously and appropriately publish on each copy an appropriate 82 | copyright notice and disclaimer of warranty; keep intact all the 83 | notices that refer to this License and to the absence of any warranty; 84 | and give any other recipients of the Program a copy of this License 85 | along with the Program. 86 | 87 | You may charge a fee for the physical act of transferring a copy, and 88 | you may at your option offer warranty protection in exchange for a fee. 89 | 90 | 2. You may modify your copy or copies of the Program or any portion 91 | of it, thus forming a work based on the Program, and copy and 92 | distribute such modifications or work under the terms of Section 1 93 | above, provided that you also meet all of these conditions: 94 | 95 | a) You must cause the modified files to carry prominent notices 96 | stating that you changed the files and the date of any change. 97 | 98 | b) You must cause any work that you distribute or publish, that in 99 | whole or in part contains or is derived from the Program or any 100 | part thereof, to be licensed as a whole at no charge to all third 101 | parties under the terms of this License. 102 | 103 | c) If the modified program normally reads commands interactively 104 | when run, you must cause it, when started running for such 105 | interactive use in the most ordinary way, to print or display an 106 | announcement including an appropriate copyright notice and a 107 | notice that there is no warranty (or else, saying that you provide 108 | a warranty) and that users may redistribute the program under 109 | these conditions, and telling the user how to view a copy of this 110 | License. (Exception: if the Program itself is interactive but 111 | does not normally print such an announcement, your work based on 112 | the Program is not required to print an announcement.) 113 | 114 | These requirements apply to the modified work as a whole. If 115 | identifiable sections of that work are not derived from the Program, 116 | and can be reasonably considered independent and separate works in 117 | themselves, then this License, and its terms, do not apply to those 118 | sections when you distribute them as separate works. But when you 119 | distribute the same sections as part of a whole which is a work based 120 | on the Program, the distribution of the whole must be on the terms of 121 | this License, whose permissions for other licensees extend to the 122 | entire whole, and thus to each and every part regardless of who wrote it. 123 | 124 | Thus, it is not the intent of this section to claim rights or contest 125 | your rights to work written entirely by you; rather, the intent is to 126 | exercise the right to control the distribution of derivative or 127 | collective works based on the Program. 128 | 129 | In addition, mere aggregation of another work not based on the Program 130 | with the Program (or with a work based on the Program) on a volume of 131 | a storage or distribution medium does not bring the other work under 132 | the scope of this License. 133 | 134 | 3. You may copy and distribute the Program (or a work based on it, 135 | under Section 2) in object code or executable form under the terms of 136 | Sections 1 and 2 above provided that you also do one of the following: 137 | 138 | a) Accompany it with the complete corresponding machine-readable 139 | source code, which must be distributed under the terms of Sections 140 | 1 and 2 above on a medium customarily used for software interchange; or, 141 | 142 | b) Accompany it with a written offer, valid for at least three 143 | years, to give any third party, for a charge no more than your 144 | cost of physically performing source distribution, a complete 145 | machine-readable copy of the corresponding source code, to be 146 | distributed under the terms of Sections 1 and 2 above on a medium 147 | customarily used for software interchange; or, 148 | 149 | c) Accompany it with the information you received as to the offer 150 | to distribute corresponding source code. (This alternative is 151 | allowed only for noncommercial distribution and only if you 152 | received the program in object code or executable form with such 153 | an offer, in accord with Subsection b above.) 154 | 155 | The source code for a work means the preferred form of the work for 156 | making modifications to it. For an executable work, complete source 157 | code means all the source code for all modules it contains, plus any 158 | associated interface definition files, plus the scripts used to 159 | control compilation and installation of the executable. However, as a 160 | special exception, the source code distributed need not include 161 | anything that is normally distributed (in either source or binary 162 | form) with the major components (compiler, kernel, and so on) of the 163 | operating system on which the executable runs, unless that component 164 | itself accompanies the executable. 165 | 166 | If distribution of executable or object code is made by offering 167 | access to copy from a designated place, then offering equivalent 168 | access to copy the source code from the same place counts as 169 | distribution of the source code, even though third parties are not 170 | compelled to copy the source along with the object code. 171 | 172 | 4. You may not copy, modify, sublicense, or distribute the Program 173 | except as expressly provided under this License. Any attempt 174 | otherwise to copy, modify, sublicense or distribute the Program is 175 | void, and will automatically terminate your rights under this License. 176 | However, parties who have received copies, or rights, from you under 177 | this License will not have their licenses terminated so long as such 178 | parties remain in full compliance. 179 | 180 | 5. You are not required to accept this License, since you have not 181 | signed it. However, nothing else grants you permission to modify or 182 | distribute the Program or its derivative works. These actions are 183 | prohibited by law if you do not accept this License. Therefore, by 184 | modifying or distributing the Program (or any work based on the 185 | Program), you indicate your acceptance of this License to do so, and 186 | all its terms and conditions for copying, distributing or modifying 187 | the Program or works based on it. 188 | 189 | 6. Each time you redistribute the Program (or any work based on the 190 | Program), the recipient automatically receives a license from the 191 | original licensor to copy, distribute or modify the Program subject to 192 | these terms and conditions. You may not impose any further 193 | restrictions on the recipients' exercise of the rights granted herein. 194 | You are not responsible for enforcing compliance by third parties to 195 | this License. 196 | 197 | 7. If, as a consequence of a court judgment or allegation of patent 198 | infringement or for any other reason (not limited to patent issues), 199 | conditions are imposed on you (whether by court order, agreement or 200 | otherwise) that contradict the conditions of this License, they do not 201 | excuse you from the conditions of this License. If you cannot 202 | distribute so as to satisfy simultaneously your obligations under this 203 | License and any other pertinent obligations, then as a consequence you 204 | may not distribute the Program at all. For example, if a patent 205 | license would not permit royalty-free redistribution of the Program by 206 | all those who receive copies directly or indirectly through you, then 207 | the only way you could satisfy both it and this License would be to 208 | refrain entirely from distribution of the Program. 209 | 210 | If any portion of this section is held invalid or unenforceable under 211 | any particular circumstance, the balance of the section is intended to 212 | apply and the section as a whole is intended to apply in other 213 | circumstances. 214 | 215 | It is not the purpose of this section to induce you to infringe any 216 | patents or other property right claims or to contest validity of any 217 | such claims; this section has the sole purpose of protecting the 218 | integrity of the free software distribution system, which is 219 | implemented by public license practices. Many people have made 220 | generous contributions to the wide range of software distributed 221 | through that system in reliance on consistent application of that 222 | system; it is up to the author/donor to decide if he or she is willing 223 | to distribute software through any other system and a licensee cannot 224 | impose that choice. 225 | 226 | This section is intended to make thoroughly clear what is believed to 227 | be a consequence of the rest of this License. 228 | 229 | 8. If the distribution and/or use of the Program is restricted in 230 | certain countries either by patents or by copyrighted interfaces, the 231 | original copyright holder who places the Program under this License 232 | may add an explicit geographical distribution limitation excluding 233 | those countries, so that distribution is permitted only in or among 234 | countries not thus excluded. In such case, this License incorporates 235 | the limitation as if written in the body of this License. 236 | 237 | 9. The Free Software Foundation may publish revised and/or new versions 238 | of the General Public License from time to time. Such new versions will 239 | be similar in spirit to the present version, but may differ in detail to 240 | address new problems or concerns. 241 | 242 | Each version is given a distinguishing version number. If the Program 243 | specifies a version number of this License which applies to it and "any 244 | later version", you have the option of following the terms and conditions 245 | either of that version or of any later version published by the Free 246 | Software Foundation. If the Program does not specify a version number of 247 | this License, you may choose any version ever published by the Free Software 248 | Foundation. 249 | 250 | 10. If you wish to incorporate parts of the Program into other free 251 | programs whose distribution conditions are different, write to the author 252 | to ask for permission. For software which is copyrighted by the Free 253 | Software Foundation, write to the Free Software Foundation; we sometimes 254 | make exceptions for this. Our decision will be guided by the two goals 255 | of preserving the free status of all derivatives of our free software and 256 | of promoting the sharing and reuse of software generally. 257 | 258 | NO WARRANTY 259 | 260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 268 | REPAIR OR CORRECTION. 269 | 270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 278 | POSSIBILITY OF SUCH DAMAGES. 279 | 280 | END OF TERMS AND CONDITIONS 281 | 282 | How to Apply These Terms to Your New Programs 283 | 284 | If you develop a new program, and you want it to be of the greatest 285 | possible use to the public, the best way to achieve this is to make it 286 | free software which everyone can redistribute and change under these terms. 287 | 288 | To do so, attach the following notices to the program. It is safest 289 | to attach them to the start of each source file to most effectively 290 | convey the exclusion of warranty; and each file should have at least 291 | the "copyright" line and a pointer to where the full notice is found. 292 | 293 | 294 | Copyright (C) 295 | 296 | This program is free software; you can redistribute it and/or modify 297 | it under the terms of the GNU General Public License as published by 298 | the Free Software Foundation; either version 2 of the License, or 299 | (at your option) any later version. 300 | 301 | This program is distributed in the hope that it will be useful, 302 | but WITHOUT ANY WARRANTY; without even the implied warranty of 303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 304 | GNU General Public License for more details. 305 | 306 | You should have received a copy of the GNU General Public License along 307 | with this program; if not, write to the Free Software Foundation, Inc., 308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 309 | 310 | Also add information on how to contact you by electronic and paper mail. 311 | 312 | If the program is interactive, make it output a short notice like this 313 | when it starts in an interactive mode: 314 | 315 | Gnomovision version 69, Copyright (C) year name of author 316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 317 | This is free software, and you are welcome to redistribute it 318 | under certain conditions; type `show c' for details. 319 | 320 | The hypothetical commands `show w' and `show c' should show the appropriate 321 | parts of the General Public License. Of course, the commands you use may 322 | be called something other than `show w' and `show c'; they could even be 323 | mouse-clicks or menu items--whatever suits your program. 324 | 325 | You should also get your employer (if you work as a programmer) or your 326 | school, if any, to sign a "copyright disclaimer" for the program, if 327 | necessary. Here is a sample; alter the names: 328 | 329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 330 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 331 | 332 | , 1 April 1989 333 | Ty Coon, President of Vice 334 | 335 | This General Public License does not permit incorporating your program into 336 | proprietary programs. If your program is a subroutine library, you may 337 | consider it more useful to permit linking proprietary applications with the 338 | library. If this is what you want to do, use the GNU Lesser General 339 | Public License instead of this License. 340 | -------------------------------------------------------------------------------- /setup/ibus-setup-hangul.inkscape.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | 26 | 28 | 32 | 36 | 37 | 48 | 58 | 60 | 64 | 68 | 69 | 77 | 81 | 82 | 84 | 88 | 92 | 93 | 95 | 99 | 103 | 104 | 106 | 110 | 114 | 115 | 125 | 135 | 145 | 146 | 168 | 170 | 171 | 173 | image/svg+xml 174 | 176 | System Applications 177 | 178 | 179 | Jakub Steiner 180 | 181 | 182 | http://jimmac.musichall.cz/ 183 | 184 | 185 | system 186 | applications 187 | group 188 | category 189 | admin 190 | root 191 | 192 | 193 | 195 | 196 | 198 | 200 | 202 | 204 | 205 | 206 | 207 | 211 | 221 | 222 | 226 | 233 | 239 | 251 | 258 | 265 | 271 | 273 | 283 | 293 | 299 | 305 | 310 | 311 | 312 | 313 | -------------------------------------------------------------------------------- /setup/setup.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | False 7 | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 8 | 5 9 | IBusHangul Setup 10 | center-on-parent 11 | dialog 12 | 13 | 14 | True 15 | False 16 | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 17 | 6 18 | vertical 19 | 8 20 | 21 | 22 | True 23 | True 24 | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 25 | 26 | 27 | True 28 | False 29 | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 30 | 12 31 | vertical 32 | 18 33 | 34 | 35 | True 36 | False 37 | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 38 | vertical 39 | 6 40 | 41 | 42 | True 43 | False 44 | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 45 | 46 | 47 | True 48 | False 49 | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 50 | <b>Keyboard Layout</b> 51 | True 52 | 0 53 | 54 | 55 | False 56 | True 57 | 0 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | False 66 | True 67 | 0 68 | 69 | 70 | 71 | 72 | True 73 | False 74 | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 75 | 12 76 | 12 77 | 78 | 79 | True 80 | False 81 | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 82 | Hangul _keyboard: 83 | True 84 | HangulKeyboard 85 | 86 | 87 | False 88 | False 89 | 0 90 | 91 | 92 | 93 | 94 | True 95 | False 96 | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 97 | 98 | 99 | True 100 | True 101 | 1 102 | 103 | 104 | 105 | 106 | False 107 | True 108 | 1 109 | 110 | 111 | 112 | 113 | False 114 | True 115 | 0 116 | 117 | 118 | 119 | 120 | True 121 | False 122 | vertical 123 | 124 | 125 | True 126 | False 127 | vertical 128 | 6 129 | 130 | 131 | True 132 | False 133 | 134 | 135 | True 136 | False 137 | <b>Etc</b> 138 | True 139 | 140 | 141 | False 142 | True 143 | 0 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | True 152 | True 153 | 0 154 | 155 | 156 | 157 | 158 | True 159 | False 160 | 161 | 162 | Start in _Hangul mode 163 | True 164 | True 165 | False 166 | True 167 | 0 168 | True 169 | 170 | 171 | False 172 | True 173 | 12 174 | 0 175 | 176 | 177 | 178 | 179 | False 180 | True 181 | 1 182 | 183 | 184 | 185 | 186 | True 187 | False 188 | 189 | 190 | Commit in _word unit 191 | True 192 | True 193 | False 194 | True 195 | 0.5 196 | True 197 | 198 | 199 | True 200 | True 201 | 12 202 | 0 203 | 204 | 205 | 206 | 207 | True 208 | True 209 | 2 210 | 211 | 212 | 213 | 214 | True 215 | False 216 | 217 | 218 | Automatic _reordering 219 | True 220 | True 221 | False 222 | True 223 | 0.5 224 | True 225 | True 226 | 227 | 228 | True 229 | True 230 | 12 231 | 0 232 | 233 | 234 | 235 | 236 | True 237 | True 238 | 3 239 | 240 | 241 | 242 | 243 | False 244 | True 245 | 0 246 | 247 | 248 | 249 | 250 | False 251 | True 252 | 1 253 | 254 | 255 | 256 | 257 | True 258 | False 259 | vertical 260 | 6 261 | 262 | 263 | True 264 | False 265 | start 266 | <b>Hangul Toggle Key</b> 267 | True 268 | 269 | 270 | False 271 | True 272 | 0 273 | 274 | 275 | 276 | 277 | True 278 | False 279 | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 280 | 12 281 | 12 282 | 283 | 284 | True 285 | True 286 | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 287 | in 288 | 289 | 290 | True 291 | True 292 | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 293 | False 294 | False 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | True 303 | True 304 | 0 305 | 306 | 307 | 308 | 309 | True 310 | False 311 | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 312 | 6 313 | 6 314 | start 315 | 316 | 317 | gtk-add 318 | True 319 | True 320 | True 321 | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 322 | True 323 | 324 | 325 | False 326 | False 327 | 0 328 | 329 | 330 | 331 | 332 | gtk-remove 333 | True 334 | True 335 | True 336 | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 337 | True 338 | 339 | 340 | False 341 | False 342 | 1 343 | 344 | 345 | 346 | 347 | False 348 | True 349 | 1 350 | 351 | 352 | 353 | 354 | True 355 | True 356 | 1 357 | 358 | 359 | 360 | 361 | True 362 | True 363 | 2 364 | 365 | 366 | 367 | 368 | 369 | 370 | True 371 | False 372 | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 373 | Hangul 374 | 375 | 376 | False 377 | 378 | 379 | 380 | 381 | True 382 | False 383 | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 384 | 6 385 | vertical 386 | 12 387 | 388 | 389 | True 390 | False 391 | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 392 | vertical 393 | 6 394 | 395 | 396 | True 397 | False 398 | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 399 | 400 | 401 | True 402 | False 403 | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 404 | <b>Hanja Key</b> 405 | True 406 | word-char 407 | 408 | 409 | False 410 | True 411 | 0 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | False 420 | True 421 | 0 422 | 423 | 424 | 425 | 426 | True 427 | False 428 | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 429 | 12 430 | 12 431 | 432 | 433 | True 434 | True 435 | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 436 | in 437 | 438 | 439 | True 440 | True 441 | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 442 | False 443 | False 444 | False 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | True 453 | True 454 | 0 455 | 456 | 457 | 458 | 459 | True 460 | False 461 | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 462 | 6 463 | 6 464 | start 465 | 466 | 467 | gtk-add 468 | True 469 | True 470 | True 471 | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 472 | True 473 | 474 | 475 | False 476 | False 477 | 0 478 | 479 | 480 | 481 | 482 | gtk-remove 483 | True 484 | True 485 | True 486 | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 487 | True 488 | 489 | 490 | False 491 | False 492 | 1 493 | 494 | 495 | 496 | 497 | False 498 | True 499 | 1 500 | 501 | 502 | 503 | 504 | True 505 | True 506 | 1 507 | 508 | 509 | 510 | 511 | True 512 | True 513 | 0 514 | 515 | 516 | 517 | 518 | 1 519 | 520 | 521 | 522 | 523 | True 524 | False 525 | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 526 | Hanja 527 | 528 | 529 | 1 530 | False 531 | 532 | 533 | 534 | 535 | True 536 | False 537 | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 538 | <b>Not implemented</b> 539 | True 540 | 541 | 542 | 2 543 | 544 | 545 | 546 | 547 | True 548 | False 549 | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 550 | Advanced 551 | 552 | 553 | 2 554 | False 555 | 556 | 557 | 558 | 559 | True 560 | True 561 | 1 562 | 563 | 564 | 565 | 566 | True 567 | False 568 | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 569 | 4 570 | True 571 | end 572 | 573 | 574 | gtk-apply 575 | True 576 | True 577 | True 578 | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 579 | True 580 | 581 | 582 | False 583 | False 584 | 0 585 | 586 | 587 | 588 | 589 | gtk-cancel 590 | True 591 | True 592 | True 593 | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 594 | True 595 | 596 | 597 | False 598 | False 599 | 1 600 | 601 | 602 | 603 | 604 | gtk-ok 605 | True 606 | True 607 | True 608 | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 609 | True 610 | 611 | 612 | False 613 | False 614 | 2 615 | 616 | 617 | 618 | 619 | False 620 | True 621 | end 622 | 1 623 | 624 | 625 | 626 | 627 | 628 | 629 | --------------------------------------------------------------------------------